diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 309ad34d..dc477e14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: "18" + node-version: "22" - name: Web deps working-directory: docker/web run: npm install diff --git a/.gitignore b/.gitignore index 10133154..9ec17829 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ npm-debug.log yarn-error.log deforumation/ design.zip + +# Legacy screenshot output (now docs/design/screenshots/) +/screenshots/ diff --git a/README.md b/README.md index 297ac0c7..419a0d72 100644 --- a/README.md +++ b/README.md @@ -15,60 +15,60 @@ Top-level tabs (web UI): **LIVE · PROMPTS · MOTION · MODULATION · AUDIO · S

LIVE

-Web UI Live Tab +Web UI Live Tab

The stage fills the right half; the left panel switches between Controls (animation engine, layer selector, preview source) and Deforum. Stage HUDs: pinned params, modulating-now, morph crossfader, recent-runs rail. Layer bar at bottom cycles WebGL / Deforum / WAN / AnimateLCM / Both / Input.

PROMPTS

-Web UI Prompts Tab +Web UI Prompts Tab

Sub-tabs PROMPTS / IMAGE / LORA / CONTROLNET / STORY. Style modifier, prompt morph enable, and plugin registry. A/B morph crossfader lives on the LIVE stage HUD — not duplicated here.

MOTION

-Web UI Motion Tab +Web UI Motion Tab

Preset pills above a full-view XY hero pad with accent puck glow. Fine-tune toggle reveals macro sliders. Animation sequencer timeline docks at the bottom; 3D path preview in advanced panel.

MODULATION

-Web UI Modulation Tab +Web UI Modulation Tab

Waveform-first LFO cards — compact meta when collapsed, full controls when selected. Sub-tabs LFO / Audio / Reactive / Beat / Mappings. Teal active, dim idle chrome.

AUDIO

-Web UI Audio Tab +Web UI Audio Tab

First-class reactive tab: quick-band pills (sub · bass · mid · …) above a tall spectrum hero. Frequency-to-parameter mapping cards with live meters.

SETTINGS — Runs

-Web UI Runs monitor +Web UI Runs monitor

Settings → Runs — active jobs, past runs, and frames rail. Kill queued batches, inspect JSON diff, re-run or continue from the detail pane.

MOTION — Sequencer

-Web UI Motion sequencer dock +Web UI Motion sequencer dock

Motion tab — animation sequencer timeline dock with playhead/duration/frame/FPS sync readout. Clips, keyframes, markers, and Apply-to-Deforum workflow (formerly the top-level GENERATE tab).

SETTINGS — Engine

-Web UI Settings Tab +Web UI Settings Tab

Checkpoint GlassPanel with CFG/steps/sampler summary. Advanced sampling, resolution, LCM, and seed in progressive disclosure panel.

SETTINGS — Output

-Web UI Stream Output +Web UI Stream Output

Stream preview, HLS/RTMP addresses, and active output destinations. Replaces the former top-level STREAM tab; HLS watch also available from the status strip on LIVE.

LIBRARY

-Web UI Library workspace +Web UI Library workspace

Fullscreen workspace from the header Library icon. Tabs: Projects, Videos, Audio, Files (VideoSwarm), plus Editor (FreeCut handoff). Cloud connect and Open in video editor from project cards.

@@ -83,12 +83,12 @@ Browser-based stage with real-time layer switching:

Web UI — Stage + Controls

-Web UI Live Tab +Web UI Live Tab

Animation engine picker, video layer selector (WebGL / Deforum / WAN Video / Both / Input), and preview source toggle. Status bar shows health, session ID, and live frame rate.

TUI — Terminal Control Center

-TUI Live Tab +TUI Live Tab

Full ncurses interface with ASCII frame preview and parameter sliders. F1–F7 to switch tabs, ←/→ to adjust values.

@@ -100,11 +100,11 @@ A/B prompt blending, style modifiers, and LoRA crossfader: @@ -116,11 +116,11 @@ XY performance pads, presets, and the animation timeline:
-Web UI Prompts +Web UI Prompts

Prompts tab: Forge-compatible style presets with preview toggle, and a Prompt Morphing section with enable/disable and an A→B crossfader slider.

-Web UI LoRA +Web UI LoRA

LoRA sub-tab: A-group / B-group palettes with a crossfader that can be driven manually or by any LFO slot for tempo-synced style morphing.

@@ -132,11 +132,11 @@ Six LFO slots routed to any parameter:
-Web UI Motion +Web UI Motion

Web UI: Move and Look XY pads with Static / Orbit / Tunnel / Handheld / Chaos presets. Animation Sequencer timeline docks below the pads with loop, prompt, and LoRA controls.

-TUI Motion +TUI Motion

TUI: Multi-lane Deforum schedule editor. Edit zoom, translation, and rotation curves from your terminal.

@@ -148,11 +148,11 @@ Checkpoint, sampler, and GPU pool configuration:
-Web UI Modulation +Web UI Modulation

Modulation Patch Bay: LFO / Audio / Reactive / Beat / Mappings tabs. Each slot shows waveform, BPM sync, speed, depth, and armed target. The Targets panel lists every active route.

-TUI Audio +TUI Audio

TUI: Beat-synced parameter automation and audio-reactive schedule generation.

@@ -352,8 +352,8 @@ Same pattern as Sparkki: rsync + remote Docker Compose via jumphost `pi@sparkki. GitHub Actions: [`.github/workflows/deploy-production.yml`](.github/workflows/deploy-production.yml) (after green CI on `main`, or manual dispatch). Requires secret `DEPLOY_SSH_PRIVATE_KEY`. See [`docs/deploy.md`](docs/deploy.md). ## Layout -- CLI/package code: `defora_cli/` -- Executable wrappers: `./forge_cli`, `./deforumation_request_dispatcher`, `./deforumation_runs_cli`, `./deforumation_cli_panel`, `./deforumation_dashboard`, `./defora_tui`, `./monitor_cli`, `./stream_helper`, `./audio_reactive_modulator` +- CLI/package code: [`tools/defora_cli/`](tools/defora_cli/) +- Executable wrappers: [`tools/bin/`](tools/bin/) (root stubs like `./forge_cli` delegate here) - Web UI & streaming stack: `docker-compose.yml`, `docker/web/` (Nginx+Node+Vue front-end, HLS, controls), `docker/bridge/` (mediator bridge) - Docs: `docs/` (workflows, server targeting, schema, streaming) - Tests: `tests/` (Python) and `docker/web/test` (web UI smoke tests) diff --git a/ROADMAP.md b/ROADMAP.md index a2be3a4e..e8d5d3ac 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -56,8 +56,8 @@ Design reference was `design.zip` + `UX-AUDIT.md` (triaged into this section; bo | G1–G3 | GENERATE tab + timeline dock | **Done** | GENERATE tab + dedicated dock under preview with sync readout | | St1–St3 | STREAM tab vs design | **Done** | STREAM removed from nav; legacy alias → SETTINGS → OUTPUT | | X1 | Emoji buttons | **Done** | Library folder/play, Deforum toolbar, nav icons via UiIcon | -| X2 | GlassPanel underused | **Partial** | Pinned + morph + modulating HUDs | -| X3–X4 | `--live` / `--accent` on active states | **Partial** | LFO cards, motion puck, generate dock sync readout | +| X2 | GlassPanel underused | **Done** | LIVE/Motion/Stream/Generate context panels use GlassPanel | +| X3–X4 | `--live` / `--accent` on active states | **Done** | Sub-pill active uses `--accent`; stream live pill uses `--live` tokens | | X5–X6 | framesync-panel / inline hex | **Done** | CN layout → CSS classes; tab accents via `:root` aliases | | X7 | Perf drawer duplicate | **Done** | Template removed | | X8 | SYSTEM label collision | **Done** | Renamed to RUNS; legacy SYSTEM alias preserved | @@ -66,7 +66,7 @@ Design reference was `design.zip` + `UX-AUDIT.md` (triaged into this section; bo 1. **Preview compositor Phase 3** — Done (forge LFO mix, run frame rail, WebGL deforum backdrop) 2. **Test plan** — GPU E2E (`npm run test:gpu-e2e`) and perf regression (`npm run test:perf-regression`) opt-in -3. **X2 / X3–X4** — Further GlassPanel / token polish on secondary panels as needed +3. **X2 / X3–X4** — Done (GlassPanel on secondary panels; sub-pill / stream status tokens) --- diff --git a/audio_reactive_modulator b/audio_reactive_modulator index 25289c30..3b486552 100755 --- a/audio_reactive_modulator +++ b/audio_reactive_modulator @@ -1,9 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for defora_cli.audio_reactive_modulator. -""" -from defora_cli import audio_reactive_modulator as _arm - - -if __name__ == "__main__": - _arm.main() +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/audio_reactive_modulator" "$@" diff --git a/defora_tui b/defora_tui index 5ae1a1a9..45e08327 100755 --- a/defora_tui +++ b/defora_tui @@ -1,9 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for the Defora TUI (ncurses). -""" -import curses -from defora_cli.defora_tui import main - -if __name__ == "__main__": - curses.wrapper(main) +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/defora_tui" "$@" diff --git a/deforumation_cli_panel b/deforumation_cli_panel index d7e0b861..d7594b0d 100755 --- a/deforumation_cli_panel +++ b/deforumation_cli_panel @@ -1,19 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for defora_cli.deforumation_cli_panel (curses UI). -""" -import argparse -import curses -from defora_cli import deforumation_cli_panel as _panel - - -def _main(): - parser = argparse.ArgumentParser(description="Deforumation terminal control panel") - parser.add_argument("--host", default=None, help="Mediator host (default: localhost)") - parser.add_argument("--port", default=None, help="Mediator port (default: 8766)") - args = parser.parse_args() - curses.wrapper(lambda stdscr: _panel.main(stdscr, args.host, args.port)) - - -if __name__ == "__main__": - _main() +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/deforumation_cli_panel" "$@" diff --git a/deforumation_dashboard b/deforumation_dashboard index 65f54486..47822b4a 100755 --- a/deforumation_dashboard +++ b/deforumation_dashboard @@ -1,9 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for defora_cli.deforumation_dashboard. -""" -from defora_cli import deforumation_dashboard as _dashboard - - -if __name__ == "__main__": - _dashboard.main() +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/deforumation_dashboard" "$@" diff --git a/deforumation_request_dispatcher b/deforumation_request_dispatcher index b39a5557..d0dd6d49 100755 --- a/deforumation_request_dispatcher +++ b/deforumation_request_dispatcher @@ -1,9 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for defora_cli.deforumation_request_dispatcher. -""" -from defora_cli import deforumation_request_dispatcher as _dispatcher - - -if __name__ == "__main__": - _dispatcher.main() +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/deforumation_request_dispatcher" "$@" diff --git a/deforumation_runs_cli b/deforumation_runs_cli index 26d9d4ec..d8b291a1 100755 --- a/deforumation_runs_cli +++ b/deforumation_runs_cli @@ -1,14 +1,3 @@ -#!/usr/bin/env python3 -""" -Wrapper entrypoint for defora_cli.deforumation_runs_cli (curses UI). -""" -import curses -from defora_cli import deforumation_runs_cli as _runs - - -def _main(): - curses.wrapper(_runs.main) - - -if __name__ == "__main__": - _main() +#!/usr/bin/env bash +set -euo pipefail +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/bin/deforumation_runs_cli" "$@" diff --git a/deploy.sh b/deploy.sh index 0dfc390f..982a2bbd 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -# Backwards-compatible wrapper — use scripts/production-deploy.sh -exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/production-deploy.sh" "$@" +# Backwards-compatible wrapper — use tools/scripts/production-deploy.sh +exec "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/scripts/production-deploy.sh" "$@" diff --git a/docker/sd-forge/Dockerfile b/docker/sd-forge/Dockerfile index b2246dd4..c8156ac8 100644 --- a/docker/sd-forge/Dockerfile +++ b/docker/sd-forge/Dockerfile @@ -11,7 +11,13 @@ RUN apt-get update && \ WORKDIR /stable-diffusion-webui RUN git clone --depth=1 https://github.com/lllyasviel/stable-diffusion-webui-forge.git . && \ - git clone --depth=1 https://github.com/Tok/sd-forge-deforum.git extensions/sd-forge-deforum + git clone --depth=1 https://github.com/Tok/sd-forge-deforum.git extensions/sd-forge-deforum && \ + git clone --depth=1 https://github.com/lllyasviel/forge-legacy-extensions.git /tmp/forge-legacy && \ + cp -r /tmp/forge-legacy/sd_forge_svd extensions/sd_forge_svd && \ + rm -rf /tmp/forge-legacy + +# SVD REST API for Defora (/svd_api/*) + sd_forge_svd UI tab. +COPY docker/sd-forge/svd-patches/svd_rest_api.py extensions/sd_forge_svd/scripts/svd_rest_api.py # Apply Deforumation patches: mediator protocol + animation/render hooks. COPY docker/sd-forge/deforumation-patches/ extensions/sd-forge-deforum/scripts/deforum_helpers/ diff --git a/docker/sd-forge/svd-patches/svd_rest_api.py b/docker/sd-forge/svd-patches/svd_rest_api.py new file mode 100644 index 00000000..6a82bc87 --- /dev/null +++ b/docker/sd-forge/svd-patches/svd_rest_api.py @@ -0,0 +1,190 @@ +# Defora REST wrapper for Forge sd_forge_svd (Stable Video Diffusion). +# Registers /svd_api/checkpoints and /svd_api/generate on the Forge FastAPI app. + +import base64 +import io +import logging +import os +import pathlib +import traceback +from typing import Any, Dict, Optional + +import gradio as gr +import numpy as np +import torch +from fastapi import FastAPI +from fastapi.responses import JSONResponse +from PIL import Image + +log = logging.getLogger(__name__) + +SVD_ROOT = None + + +def _svd_root(): + global SVD_ROOT + if SVD_ROOT is None: + from modules.paths import models_path + SVD_ROOT = os.path.join(models_path, "svd") + os.makedirs(SVD_ROOT, exist_ok=True) + return SVD_ROOT + + +def _list_checkpoints(): + from modules import shared + root = _svd_root() + return sorted( + pathlib.Path(x).name + for x in shared.walk_files(root, allowed_extensions=[".pt", ".ckpt", ".safetensors"]) + ) + + +def _decode_init_image(raw: Optional[str]): + if not raw: + return None + text = str(raw).strip() + if text.startswith("data:"): + text = text.split(",", 1)[-1] + data = base64.b64decode(text) + img = Image.open(io.BytesIO(data)).convert("RGB") + return np.array(img) + + +@torch.inference_mode() +@torch.no_grad() +def _predict_svd( + filename, + width, + height, + video_frames, + motion_bucket_id, + fps, + augmentation_level, + sampling_seed, + sampling_steps, + sampling_cfg, + sampling_sampler_name, + sampling_scheduler, + sampling_denoise, + guidance_min_cfg, + input_image, +): + from modules_forge.forge_util import numpy_to_pytorch, pytorch_to_numpy, write_images_to_mp4 + from ldm_patched.modules.sd import load_checkpoint_guess_config + from ldm_patched.contrib.external_video_model import VideoLinearCFGGuidance, SVD_img2vid_Conditioning + from ldm_patched.contrib.external import KSampler, VAEDecode + + op_video_linear = VideoLinearCFGGuidance() + op_svd_cond = SVD_img2vid_Conditioning() + op_ksampler = KSampler() + op_vae_decode = VAEDecode() + + path = os.path.join(_svd_root(), filename) + model_raw, _, vae, clip_vision = load_checkpoint_guess_config( + path, output_vae=True, output_clip=False, output_clipvision=True + ) + model = op_video_linear.patch(model_raw, guidance_min_cfg)[0] + init_image = numpy_to_pytorch(input_image) + positive, negative, latent_image = op_svd_cond.encode( + clip_vision, init_image, vae, width, height, video_frames, motion_bucket_id, fps, augmentation_level + ) + output_latent = op_ksampler.sample( + model, + sampling_seed, + sampling_steps, + sampling_cfg, + sampling_sampler_name, + sampling_scheduler, + positive, + negative, + latent_image, + sampling_denoise, + )[0] + output_pixels = op_vae_decode.decode(vae, output_latent)[0] + outputs = pytorch_to_numpy(output_pixels) + video_filename = write_images_to_mp4(outputs, fps=fps) + return outputs, video_filename + + +def _run_svd(payload: Dict[str, Any]): + checkpoint = str(payload.get("checkpoint") or "").strip() + if not checkpoint: + names = _list_checkpoints() + if not names: + raise ValueError("No SVD checkpoints in models/svd — add svd_xt_1_1.safetensors") + checkpoint = names[0] + + init_image = _decode_init_image(payload.get("init_image")) + if init_image is None: + raise ValueError("init_image required (base64 PNG/JPEG)") + + outputs, video_filename = _predict_svd( + checkpoint, + int(payload.get("width") or 1024), + int(payload.get("height") or 576), + int(payload.get("video_frames") or 25), + int(payload.get("motion_bucket_id") or 127), + int(payload.get("fps") or 6), + float(payload.get("augmentation_level") or 0), + int(payload.get("sampling_seed") or 12345), + int(payload.get("sampling_steps") or 25), + float(payload.get("sampling_cfg") or 2.5), + str(payload.get("sampling_sampler_name") or "euler"), + str(payload.get("sampling_scheduler") or "karras"), + float(payload.get("sampling_denoise") if payload.get("sampling_denoise") is not None else 1.0), + float(payload.get("guidance_min_cfg") or 1.0), + init_image, + ) + + first_frame_path = None + if outputs is not None and len(outputs) > 0: + try: + from modules.images import save_image + first_frame_path = save_image(outputs[0], "", "", -1, "", False, None) + except Exception: + first_frame_path = None + + return { + "ok": True, + "video_path": video_filename, + "path": first_frame_path, + "first_frame_path": first_frame_path, + "frame_count": len(outputs) if outputs is not None else 0, + "checkpoint": checkpoint, + } + + +def svd_rest_api(_: gr.Blocks, app: FastAPI): + @app.get("/svd_api/checkpoints") + async def svd_checkpoints(): + try: + names = _list_checkpoints() + xt11 = [ + n for n in names + if any(tag in n.lower() for tag in ("1_1", "xt-1.1", "xt_1_1", "img2vid-xt-1.1")) + ] + return JSONResponse(content={"checkpoints": names, "xt11_available": len(xt11) > 0, "xt11": xt11}) + except Exception as exc: + log.exception("svd checkpoints") + return JSONResponse(status_code=500, content={"error": str(exc)}) + + @app.post("/svd_api/generate") + async def svd_generate(request): + try: + body = await request.json() + if not isinstance(body, dict): + return JSONResponse(status_code=400, content={"error": "JSON body required"}) + result = _run_svd(body) + return JSONResponse(content=result) + except Exception as exc: + log.exception("svd generate") + traceback.print_exc() + return JSONResponse(status_code=500, content={"error": str(exc)}) + + +try: + import modules.script_callbacks as script_callbacks + + script_callbacks.on_app_started(svd_rest_api) +except Exception: + pass diff --git a/docker/web/data/prompt-styles-seed.json b/docker/web/data/prompt-styles-seed.json index d7240734..fa638ab9 100644 --- a/docker/web/data/prompt-styles-seed.json +++ b/docker/web/data/prompt-styles-seed.json @@ -1,1924 +1,2351 @@ { "version": 1, - "importedFrom": "http://192.168.2.104:7860/sdapi/v1/prompt-styles", + "updatedAt": "2026-06-03T09:03:32.580Z", "count": 213, "styles": [ { "id": "forge_kamph_default_negative_no", "name": "Kamph_Default_Negative (NO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "", "negative": "Watermark, Text, censored, deformed, bad anatomy, disfigured, poorly drawn face, mutated, extra limb, ugly, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, long neck, mutated hands and fingers, bad hands, missing fingers, cropped, worst quality, low quality, mutation, poorly drawn, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal eye proportion, Abnormal hands, abnormal legs, abnormal feet, abnormal fingers", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_default_negative_sfw_no", "name": "Kamph_Default_Negative (sfw) (NO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "", "negative": "NSFW, Cleavage, Pubic Hair, Nudity, Naked, Au naturel, Watermark, Text, censored, deformed, bad anatomy, disfigured, poorly drawn face, mutated, extra limb, ugly, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, long neck, mutated hands and fingers, bad hands, missing fingers, cropped, worst quality, low quality, mutation, poorly drawn, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal eye proportion, Abnormal hands, abnormal legs, abnormal feet, abnormal fingers", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_default_negative_low_token_no", "name": "Kamph_Default_Negative (Low Token) (NO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "", "negative": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_skin_enhancer_po", "name": "Kamph_Skin Enhancer (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "detailed skin texture, (blush:0.5), (goosebumps:0.5), subsurface scattering", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_skin_enhancer_clean_po", "name": "Kamph_Skin Enhancer (clean)(PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "detailed skin texture, (blush:0.2), (goosebumps:0.3), subsurface scattering", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_ghibli_po", "name": "Kamph_Ghibli (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "(Studio ghibli style, Art by Hayao Miyazaki:1.2), Anime Style, Manga Style, Hand drawn, cinematic, Sharp focus, humorous illustration, big depth of field, Masterpiece, concept art, trending on artstation, Vivid colors, Simplified style, trending on ArtStation, trending on CGSociety, Intricate, Vibrant colors, Soft Shading, Simplistic Features, Sharp Angles, Playful", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_vector_illustrations_po", "name": "Kamph_Vector Illustrations (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Vector art, Vivid colors, Clean lines, Sharp edges, Minimalist, Precise geometry, Simplistic, Smooth curves, Bold outlines, Crisp shapes, Flat colors, Illustration art piece, High contrast shadows, Technical illustration, Graphic design, Vector graphics, High contrast, Precision artwork, Linear compositions, Scalable artwork, Digital art", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_digital_painting_po", "name": "Kamph_Digital Painting (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "glow effects, godrays, Hand drawn, render, 8k, octane render, cinema 4d, blender, dark, atmospheric 4k ultra detailed, cinematic, Sharp focus, big depth of field, Masterpiece, colors, 3d octane render, 4k, concept art, trending on artstation, hyperrealistic, Vivid colors, extremely detailed CG unity 8k wallpaper, trending on CGSociety, Intricate, High Detail, dramatic", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_indie_game_po", "name": "Kamph_Indie Game (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Indie game art, Vector Art, Borderlands style, Arcane style, Cartoon style, Line art, Disctinct features, Hand drawn, Technical illustration, Graphic design, Vector graphics, High contrast, Precision artwork, Linear compositions, Scalable artwork, Digital art, cinematic sensual, Sharp focus, humorous illustration, big depth of field, Masterpiece, trending on artstation, Vivid colors, trending on ArtStation, trending on CGSociety, Intricate, Low Detail, dramatic", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_original_photo_style_po", "name": "Kamph_Original Photo Style (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Photorealistic, Hyperrealistic, Hyperdetailed, analog style, soft lighting, subsurface scattering, realistic, heavy shadow, masterpiece, best quality, ultra realistic, 8k, golden ratio, Intricate, High Detail, film photography, soft focus", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_black_and_white_film_noir_po", "name": "Kamph_Black and White Film Noir (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "(b&w, Monochromatic, Film Photography:1.3), Photorealistic, Hyperrealistic, Hyperdetailed, film noir, analog style, soft lighting, subsurface scattering, realistic, heavy shadow, masterpiece, best quality, ultra realistic, 8k, golden ratio, Intricate, High Detail, film photography, soft focus", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_isometric_rooms_po", "name": "Kamph_Isometric Rooms (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Tiny cute isometric in a cutaway box, soft smooth lighting, soft colors, 100mm lens, 3d blender render", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_space_hologram_po", "name": "Kamph_Space Hologram (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "hologram floating in space, a vibrant digital illustration, dribbble, quantum wavetracing, black background, behance hd", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_cute_creatures_po", "name": "Kamph_Cute Creatures (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "3d fluffy, closeup cute and adorable, cute big circular reflective eyes, long fuzzy fur, Pixar render, unreal engine cinematic smooth, intricate detail, cinematic", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_realistic_photo_portraits_po", "name": "Kamph_Realistic Photo Portraits (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "RAW candid cinema, 16mm, color graded portra 400 film, remarkable color, ultra realistic, textured skin, remarkable detailed pupils, realistic dull skin noise, visible skin detail, skin fuzz, dry skin, shot with cinematic camera", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_kamph_professional_scenic_photographs_po", "name": "Kamph_Professional Scenic Photographs (PO)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "long shot scenic professional photograph of {prompt}, perfect viewpoint, highly detailed, wide-angle lens, hyper realistic, with dramatic sky, polarizing filter, natural lighting, vivid colors, everything in sharp focus, HDR, UHD, 64K", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_cinematic_still", "name": "cinematic_still", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy", "negative": "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_3d_model", "name": "sai-3d-model", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting", "negative": "ugly, deformed, noisy, low poly, blurry, painting", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_analog_film", "name": "sai-analog film", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "analog film photo {prompt} . faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage", "negative": "painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_anime", "name": "sai-anime", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed", "negative": "photo, deformed, black and white, realism, disfigured, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_cinematic", "name": "sai-cinematic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic film still {prompt} . shallow depth of field, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy", "negative": "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_comic_book", "name": "sai-comic book", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "comic {prompt} . graphic illustration, comic art, graphic novel art, vibrant, highly detailed", "negative": "photograph, deformed, glitch, noisy, realistic, stock photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_craft_clay", "name": "sai-craft clay", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "play-doh style {prompt} . sculpture, clay art, centered composition, Claymation", "negative": "sloppy, messy, grainy, highly detailed, ultra textured, photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_digital_art", "name": "sai-digital art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed", "negative": "photo, photorealistic, realism, ugly", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_enhance", "name": "sai-enhance", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "breathtaking {prompt} . award-winning, professional, highly detailed", "negative": "ugly, deformed, noisy, blurry, distorted, grainy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_fantasy_art", "name": "sai-fantasy art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy", "negative": "photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_isometric", "name": "sai-isometric", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "isometric style {prompt} . vibrant, beautiful, crisp, detailed, ultra detailed, intricate", "negative": "deformed, mutated, ugly, disfigured, blur, blurry, noise, noisy, realistic, photographic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_line_art", "name": "sai-line art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "line art drawing {prompt} . professional, sleek, modern, minimalist, graphic, line art, vector graphics", "negative": "anime, photorealistic, 35mm film, deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_lowpoly", "name": "sai-lowpoly", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "low-poly style {prompt} . low-poly game art, polygon mesh, jagged, blocky, wireframe edges, centered composition", "negative": "noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_neonpunk", "name": "sai-neonpunk", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional", "negative": "painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_origami", "name": "sai-origami", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "origami style {prompt} . paper art, pleated paper, folded, origami art, pleats, cut and fold, centered composition", "negative": "noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_photographic", "name": "sai-photographic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed", "negative": "drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_pixel_art", "name": "sai-pixel art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics", "negative": "sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_sai_texture", "name": "sai-texture", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "texture {prompt} top down close-up", "negative": "ugly, deformed, noisy, blurry", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_advertising", "name": "ads-advertising", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Advertising poster style {prompt} . Professional, modern, product-focused, commercial, eye-catching, highly detailed", "negative": "noisy, blurry, amateurish, sloppy, unattractive", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_automotive", "name": "ads-automotive", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Automotive advertisement style {prompt} . Sleek, dynamic, professional, commercial, vehicle-focused, high-resolution, highly detailed", "negative": "noisy, blurry, unattractive, sloppy, unprofessional", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_corporate", "name": "ads-corporate", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Corporate branding style {prompt} . Professional, clean, modern, sleek, minimalist, business-oriented, highly detailed", "negative": "noisy, blurry, grungy, sloppy, cluttered, disorganized", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_fashion_editorial", "name": "ads-fashion editorial", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Fashion editorial style {prompt} . High fashion, trendy, stylish, editorial, magazine style, professional, highly detailed", "negative": "outdated, blurry, noisy, unattractive, sloppy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_food_photography", "name": "ads-food photography", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Food photography style {prompt} . Appetizing, professional, culinary, high-resolution, commercial, highly detailed", "negative": "unappetizing, sloppy, unprofessional, noisy, blurry", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_luxury", "name": "ads-luxury", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Luxury product style {prompt} . Elegant, sophisticated, high-end, luxurious, professional, highly detailed", "negative": "cheap, noisy, blurry, unattractive, amateurish", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_real_estate", "name": "ads-real estate", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Real estate photography style {prompt} . Professional, inviting, well-lit, high-resolution, property-focused, commercial, highly detailed", "negative": "dark, blurry, unappealing, noisy, unprofessional", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.574Z" }, { "id": "forge_ads_retail", "name": "ads-retail", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Retail packaging style {prompt} . Vibrant, enticing, commercial, product-focused, eye-catching, professional, highly detailed", "negative": "noisy, blurry, amateurish, sloppy, unattractive", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_abstract", "name": "artstyle-abstract", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "abstract style {prompt} . non-representational, colors and shapes, expression of feelings, imaginative, highly detailed", "negative": "realistic, photographic, figurative, concrete", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_abstract_expressionism", "name": "artstyle-abstract expressionism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "abstract expressionist painting {prompt} . energetic brushwork, bold colors, abstract forms, expressive, emotional", "negative": "realistic, photorealistic, low contrast, plain, simple, monochrome", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_art_deco", "name": "artstyle-art deco", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Art Deco style {prompt} . geometric shapes, bold colors, luxurious, elegant, decorative, symmetrical, ornate, detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_art_nouveau", "name": "artstyle-art nouveau", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Art Nouveau style {prompt} . elegant, decorative, curvilinear forms, nature-inspired, ornate, detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_constructivist", "name": "artstyle-constructivist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "constructivist style {prompt} . geometric shapes, bold colors, dynamic composition, propaganda art style", "negative": "realistic, photorealistic, low contrast, plain, simple, abstract expressionism", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_cubist", "name": "artstyle-cubist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cubist artwork {prompt} . geometric shapes, abstract, innovative, revolutionary", "negative": "anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_expressionist", "name": "artstyle-expressionist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "expressionist {prompt} . raw, emotional, dynamic, distortion for emotional effect, vibrant, use of unusual colors, detailed", "negative": "realism, symmetry, quiet, calm, photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_graffiti", "name": "artstyle-graffiti", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "graffiti style {prompt} . street art, vibrant, urban, detailed, tag, mural", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_hyperrealism", "name": "artstyle-hyperrealism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "hyperrealistic art {prompt} . extremely high-resolution details, photographic, realism pushed to extreme, fine texture, incredibly lifelike", "negative": "simplified, abstract, unrealistic, impressionistic, low resolution", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_impressionist", "name": "artstyle-impressionist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "impressionist painting {prompt} . loose brushwork, vibrant color, light and shadow play, captures feeling over form", "negative": "anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_pointillism", "name": "artstyle-pointillism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "pointillism style {prompt} . composed entirely of small, distinct dots of color, vibrant, highly detailed", "negative": "line drawing, smooth shading, large color fields, simplistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_pop_art", "name": "artstyle-pop art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Pop Art style {prompt} . bright colors, bold outlines, popular culture themes, ironic or kitsch", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, minimalist", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_psychedelic", "name": "artstyle-psychedelic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "psychedelic style {prompt} . vibrant colors, swirling patterns, abstract forms, surreal, trippy", "negative": "monochrome, black and white, low contrast, realistic, photorealistic, plain, simple", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_renaissance", "name": "artstyle-renaissance", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Renaissance style {prompt} . realistic, perspective, light and shadow, religious or mythological themes, highly detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, modernist, minimalist, abstract", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_steampunk", "name": "artstyle-steampunk", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "steampunk style {prompt} . antique, mechanical, brass and copper tones, gears, intricate, detailed", "negative": "deformed, glitch, noisy, low contrast, anime, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_surrealist", "name": "artstyle-surrealist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "surrealist art {prompt} . dreamlike, mysterious, provocative, symbolic, intricate, detailed", "negative": "anime, photorealistic, realistic, deformed, glitch, noisy, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_typography", "name": "artstyle-typography", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "typographic art {prompt} . stylized, intricate, detailed, artistic, text-based", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_artstyle_watercolor", "name": "artstyle-watercolor", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "watercolor painting {prompt} . vibrant, beautiful, painterly, detailed, textural, artistic", "negative": "anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_biomechanical", "name": "futuristic-biomechanical", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "biomechanical style {prompt} . blend of organic and mechanical elements, futuristic, cybernetic, detailed, intricate", "negative": "natural, rustic, primitive, organic, simplistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_biomechanical_cyberpunk", "name": "futuristic-biomechanical cyberpunk", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "biomechanical cyberpunk {prompt} . cybernetics, human-machine fusion, dystopian, organic meets artificial, dark, intricate, highly detailed", "negative": "natural, colorful, deformed, sketch, low contrast, watercolor", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_cybernetic", "name": "futuristic-cybernetic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cybernetic style {prompt} . futuristic, technological, cybernetic enhancements, robotics, artificial intelligence themes", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_cybernetic_robot", "name": "futuristic-cybernetic robot", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cybernetic robot {prompt} . android, AI, machine, metal, wires, tech, futuristic, highly detailed", "negative": "organic, natural, human, sketch, watercolor, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_cyberpunk_cityscape", "name": "futuristic-cyberpunk cityscape", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cyberpunk cityscape {prompt} . neon lights, dark alleys, skyscrapers, futuristic, vibrant colors, high contrast, highly detailed", "negative": "natural, rural, deformed, low contrast, black and white, sketch, watercolor", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_futuristic", "name": "futuristic-futuristic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "futuristic style {prompt} . sleek, modern, ultramodern, high tech, detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vintage, antique", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_retro_cyberpunk", "name": "futuristic-retro cyberpunk", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "retro cyberpunk {prompt} . 80's inspired, synthwave, neon, vibrant, detailed, retro futurism", "negative": "modern, desaturated, black and white, realism, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_retro_futurism", "name": "futuristic-retro futurism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "retro-futuristic {prompt} . vintage sci-fi, 50s and 60s style, atomic age, vibrant, highly detailed", "negative": "contemporary, realistic, rustic, primitive", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_sci_fi", "name": "futuristic-sci-fi", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "sci-fi style {prompt} . futuristic, technological, alien worlds, space themes, advanced civilizations", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futuristic_vaporwave", "name": "futuristic-vaporwave", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "vaporwave style {prompt} . retro aesthetic, cyberpunk, vibrant, neon colors, vintage 80s and 90s style, highly detailed", "negative": "monochrome, muted colors, realism, rustic, minimalist, dark", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_bubble_bobble", "name": "game-bubble bobble", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Bubble Bobble style {prompt} . 8-bit, cute, pixelated, fantasy, vibrant, reminiscent of Bubble Bobble game", "negative": "realistic, modern, photorealistic, violent, horror", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_cyberpunk_game", "name": "game-cyberpunk game", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cyberpunk game style {prompt} . neon, dystopian, futuristic, digital, vibrant, detailed, high contrast, reminiscent of cyberpunk genre video games", "negative": "historical, natural, rustic, low detailed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_fighting_game", "name": "game-fighting game", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "fighting game style {prompt} . dynamic, vibrant, action-packed, detailed character design, reminiscent of fighting video games", "negative": "peaceful, calm, minimalist, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_gta", "name": "game-gta", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "GTA-style artwork {prompt} . satirical, exaggerated, pop art style, vibrant colors, iconic characters, action-packed", "negative": "realistic, black and white, low contrast, impressionist, cubist, noisy, blurry, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_mario", "name": "game-mario", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Super Mario style {prompt} . vibrant, cute, cartoony, fantasy, playful, reminiscent of Super Mario series", "negative": "realistic, modern, horror, dystopian, violent", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_minecraft", "name": "game-minecraft", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Minecraft style {prompt} . blocky, pixelated, vibrant colors, recognizable characters and objects, game assets", "negative": "smooth, realistic, detailed, photorealistic, noise, blurry, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_pokemon", "name": "game-pokemon", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Pokémon style {prompt} . vibrant, cute, anime, fantasy, reminiscent of Pokémon series", "negative": "realistic, modern, horror, dystopian, violent", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_retro_arcade", "name": "game-retro arcade", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "retro arcade style {prompt} . 8-bit, pixelated, vibrant, classic video game, old school gaming, reminiscent of 80s and 90s arcade games", "negative": "modern, ultra-high resolution, photorealistic, 3D", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_retro_game", "name": "game-retro game", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "retro game art {prompt} . 16-bit, vibrant colors, pixelated, nostalgic, charming, fun", "negative": "realistic, photorealistic, 35mm film, deformed, glitch, low contrast, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_rpg_fantasy_game", "name": "game-rpg fantasy game", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "role-playing game (RPG) style fantasy {prompt} . detailed, vibrant, immersive, reminiscent of high fantasy RPG games", "negative": "sci-fi, modern, urban, futuristic, low detailed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_strategy_game", "name": "game-strategy game", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "strategy game style {prompt} . overhead view, detailed map, units, reminiscent of real-time strategy video games", "negative": "first-person view, modern, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_streetfighter", "name": "game-streetfighter", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Street Fighter style {prompt} . vibrant, dynamic, arcade, 2D fighting game, highly detailed, reminiscent of Street Fighter series", "negative": "3D, realistic, modern, photorealistic, turn-based strategy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_game_zelda", "name": "game-zelda", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Legend of Zelda style {prompt} . vibrant, fantasy, detailed, epic, heroic, reminiscent of The Legend of Zelda series", "negative": "sci-fi, modern, realistic, horror", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_architectural", "name": "misc-architectural", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "architectural style {prompt} . clean lines, geometric shapes, minimalist, modern, architectural drawing, highly detailed", "negative": "curved lines, ornate, baroque, abstract, grunge", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_disco", "name": "misc-disco", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "disco-themed {prompt} . vibrant, groovy, retro 70s style, shiny disco balls, neon lights, dance floor, highly detailed", "negative": "minimalist, rustic, monochrome, contemporary, simplistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_dreamscape", "name": "misc-dreamscape", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "dreamscape {prompt} . surreal, ethereal, dreamy, mysterious, fantasy, highly detailed", "negative": "realistic, concrete, ordinary, mundane", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_dystopian", "name": "misc-dystopian", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "dystopian style {prompt} . bleak, post-apocalyptic, somber, dramatic, highly detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, cheerful, optimistic, vibrant, colorful", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_fairy_tale", "name": "misc-fairy tale", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "fairy tale {prompt} . magical, fantastical, enchanting, storybook style, highly detailed", "negative": "realistic, modern, ordinary, mundane", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_gothic", "name": "misc-gothic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "gothic style {prompt} . dark, mysterious, haunting, dramatic, ornate, detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, cheerful, optimistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_grunge", "name": "misc-grunge", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "grunge style {prompt} . textured, distressed, vintage, edgy, punk rock vibe, dirty, noisy", "negative": "smooth, clean, minimalist, sleek, modern, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_horror", "name": "misc-horror", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "horror-themed {prompt} . eerie, unsettling, dark, spooky, suspenseful, grim, highly detailed", "negative": "cheerful, bright, vibrant, light-hearted, cute", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_kawaii", "name": "misc-kawaii", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "kawaii style {prompt} . cute, adorable, brightly colored, cheerful, anime influence, highly detailed", "negative": "dark, scary, realistic, monochrome, abstract", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_lovecraftian", "name": "misc-lovecraftian", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "lovecraftian horror {prompt} . eldritch, cosmic horror, unknown, mysterious, surreal, highly detailed", "negative": "light-hearted, mundane, familiar, simplistic, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_macabre", "name": "misc-macabre", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "macabre style {prompt} . dark, gothic, grim, haunting, highly detailed", "negative": "bright, cheerful, light-hearted, cartoonish, cute", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_manga", "name": "misc-manga", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "manga style {prompt} . vibrant, high-energy, detailed, iconic, Japanese comic style", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, Western comic style", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_metropolis", "name": "misc-metropolis", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "metropolis-themed {prompt} . urban, cityscape, skyscrapers, modern, futuristic, highly detailed", "negative": "rural, natural, rustic, historical, simple", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_minimalist", "name": "misc-minimalist", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "minimalist style {prompt} . simple, clean, uncluttered, modern, elegant", "negative": "ornate, complicated, highly detailed, cluttered, disordered, messy, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_monochrome", "name": "misc-monochrome", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "monochrome {prompt} . black and white, contrast, tone, texture, detailed", "negative": "colorful, vibrant, noisy, blurry, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_nautical", "name": "misc-nautical", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "nautical-themed {prompt} . sea, ocean, ships, maritime, beach, marine life, highly detailed", "negative": "landlocked, desert, mountains, urban, rustic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_space", "name": "misc-space", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "space-themed {prompt} . cosmic, celestial, stars, galaxies, nebulas, planets, science fiction, highly detailed", "negative": "earthly, mundane, ground-based, realism", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_stained_glass", "name": "misc-stained glass", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "stained glass style {prompt} . vibrant, beautiful, translucent, intricate, detailed", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_techwear_fashion", "name": "misc-techwear fashion", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "techwear fashion {prompt} . futuristic, cyberpunk, urban, tactical, sleek, dark, highly detailed", "negative": "vintage, rural, colorful, low contrast, realism, sketch, watercolor", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_tribal", "name": "misc-tribal", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "tribal style {prompt} . indigenous, ethnic, traditional patterns, bold, natural colors, highly detailed", "negative": "modern, futuristic, minimalist, pastel", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_misc_zentangle", "name": "misc-zentangle", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "zentangle {prompt} . intricate, abstract, monochrome, patterns, meditative, highly detailed", "negative": "colorful, representative, simplistic, large fields of color", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_collage", "name": "papercraft-collage", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "collage style {prompt} . mixed media, layered, textural, detailed, artistic", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_flat_papercut", "name": "papercraft-flat papercut", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "flat papercut style {prompt} . silhouette, clean cuts, paper, sharp edges, minimalist, color block", "negative": "3D, high detail, noise, grainy, blurry, painting, drawing, photo, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_kirigami", "name": "papercraft-kirigami", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "kirigami representation of {prompt} . 3D, paper folding, paper cutting, Japanese, intricate, symmetrical, precision, clean lines", "negative": "painting, drawing, 2D, noisy, blurry, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_paper_mache", "name": "papercraft-paper mache", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "paper mache representation of {prompt} . 3D, sculptural, textured, handmade, vibrant, fun", "negative": "2D, flat, photo, sketch, digital art, deformed, noisy, blurry", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_paper_quilling", "name": "papercraft-paper quilling", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "paper quilling art of {prompt} . intricate, delicate, curling, rolling, shaping, coiling, loops, 3D, dimensional, ornamental", "negative": "photo, painting, drawing, 2D, flat, deformed, noisy, blurry", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_papercut_collage", "name": "papercraft-papercut collage", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "papercut collage of {prompt} . mixed media, textured paper, overlapping, asymmetrical, abstract, vibrant", "negative": "photo, 3D, realistic, drawing, painting, high detail, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_papercut_shadow_box", "name": "papercraft-papercut shadow box", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "3D papercut shadow box of {prompt} . layered, dimensional, depth, silhouette, shadow, papercut, handmade, high contrast", "negative": "painting, drawing, photo, 2D, flat, high detail, blurry, noisy, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_stacked_papercut", "name": "papercraft-stacked papercut", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "stacked papercut art of {prompt} . 3D, layered, dimensional, depth, precision cut, stacked layers, papercut, high contrast", "negative": "2D, flat, noisy, blurry, painting, drawing, photo, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_papercraft_thick_layered_papercut", "name": "papercraft-thick layered papercut", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "thick layered papercut art of {prompt} . deep 3D, volumetric, dimensional, depth, thick paper, high stack, heavy texture, tangible layers", "negative": "2D, flat, thin paper, low stack, smooth texture, painting, drawing, photo, deformed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_alien", "name": "photo-alien", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "alien-themed {prompt} . extraterrestrial, cosmic, otherworldly, mysterious, sci-fi, highly detailed", "negative": "earthly, mundane, common, realistic, simple", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_film_noir", "name": "photo-film noir", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "film noir style {prompt} . monochrome, high contrast, dramatic shadows, 1940s style, mysterious, cinematic", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vibrant, colorful", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_hdr", "name": "photo-hdr", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "HDR photo of {prompt} . High dynamic range, vivid, rich details, clear shadows and highlights, realistic, intense, enhanced contrast, highly detailed", "negative": "flat, low contrast, oversaturated, underexposed, overexposed, blurred, noisy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_long_exposure", "name": "photo-long exposure", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "long exposure photo of {prompt} . Blurred motion, streaks of light, surreal, dreamy, ghosting effect, highly detailed", "negative": "static, noisy, deformed, shaky, abrupt, flat, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_neon_noir", "name": "photo-neon noir", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "neon noir {prompt} . cyberpunk, dark, rainy streets, neon signs, high contrast, low light, vibrant, highly detailed", "negative": "bright, sunny, daytime, low contrast, black and white, sketch, watercolor", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_silhouette", "name": "photo-silhouette", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "silhouette style {prompt} . high contrast, minimalistic, black and white, stark, dramatic", "negative": "ugly, deformed, noisy, blurry, low contrast, color, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_photo_tilt_shift", "name": "photo-tilt-shift", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "tilt-shift photo of {prompt} . Selective focus, miniature effect, blurred background, highly detailed, vibrant, perspective control", "negative": "blurry, noisy, deformed, flat, low contrast, unrealistic, oversaturated, underexposed", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_cinematic_diva", "name": "cinematic-diva", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "UHD, 8K, ultra detailed, a cinematic photograph of {prompt}, beautiful lighting, great composition", "negative": "ugly, deformed, noisy, blurry, NSFW", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_abstract_expressionism", "name": "Abstract Expressionism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Abstract Expressionism Art, {prompt}, High contrast, minimalistic, colorful, stark, dramatic, expressionism", "negative": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_academia", "name": "Academia", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Academia, {prompt}, preppy Ivy League style, stark, dramatic, chic boarding school, academia", "negative": "ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_action_figure", "name": "Action Figure", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Action Figure, {prompt}, plastic collectable action figure, collectable toy action figure", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_adorable_3d_character", "name": "Adorable 3D Character", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Adorable 3D Character, {prompt}, 3D render, adorable character, 3D art", "negative": "ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt, photograph, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_adorable_kawaii", "name": "Adorable Kawaii", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Adorable Kawaii, {prompt}, pretty, cute, adorable, kawaii", "negative": "ugly, deformed, noisy, blurry, low contrast, gothic, dark, moody, monochromatic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_art_deco", "name": "Art Deco", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Art Deco, {prompt}, sleek, geometric forms, art deco style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_art_nouveau", "name": "Art Nouveau", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Art Nouveau, beautiful art, {prompt}, sleek, organic forms, long, sinuous, art nouveau style", "negative": "ugly, deformed, noisy, blurry, low contrast, industrial, mechanical", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_astral_aura", "name": "Astral Aura", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Astral Aura, {prompt}, astral, colorful aura, vibrant energy", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_avant_garde", "name": "Avant-garde", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Avant-garde, {prompt}, unusual, experimental, avant-garde art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_baroque", "name": "Baroque", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Baroque, {prompt}, dramatic, exuberant, grandeur, baroque art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_bauhaus_style_poster", "name": "Bauhaus-Style Poster", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Bauhaus-Style Poster, {prompt}, simple geometric shapes, clean lines, primary colors, Bauhaus-Style Poster", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_blueprint_schematic_drawing", "name": "Blueprint Schematic Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Blueprint Schematic Drawing, {prompt}, technical drawing, blueprint, schematic", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_caricature", "name": "Caricature", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Caricature, {prompt}, exaggerated, comical, caricature", "negative": "ugly, deformed, noisy, blurry, low contrast, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_cel_shaded_art", "name": "Cel Shaded Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Cel Shaded Art, {prompt}, 2D, flat color, toon shading, cel shaded style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_character_design_sheet", "name": "Character Design Sheet", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Character Design Sheet, {prompt}, character reference sheet, character turn around", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_classicism_art", "name": "Classicism Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Classicism Art, {prompt}, inspired by Roman and Greek culture, clarity, harmonious, classicism art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_color_field_painting", "name": "Color Field Painting", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Color Field Painting, {prompt}, abstract, simple, geometic, color field painting style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_colored_pencil_art", "name": "Colored Pencil Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Colored Pencil Art, {prompt}, colored pencil strokes, light color, visible paper texture, colored pencil art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_conceptual_art", "name": "Conceptual Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Conceptual Art, {prompt}, concept art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_constructivism", "name": "Constructivism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Constructivism Art, {prompt}, minimalistic, geometric forms, constructivism art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_cubism", "name": "Cubism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Cubism Art, {prompt}, flat geometric forms, cubism art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_dadaism", "name": "Dadaism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Dadaism Art, {prompt}, satirical, nonsensical, dadaism art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_dark_fantasy", "name": "Dark Fantasy", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Dark Fantasy Art, {prompt}, dark, moody, dark fantasy style", "negative": "ugly, deformed, noisy, blurry, low contrast, bright, sunny", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_dark_moody_atmosphere", "name": "Dark Moody Atmosphere", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Dark Moody Atmosphere, {prompt}, dramatic, mysterious, dark moody atmosphere", "negative": "ugly, deformed, noisy, blurry, low contrast, vibrant, colorful, bright", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_dmt_art_style", "name": "DMT Art Style", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "DMT Art Style, {prompt}, bright colors, surreal visuals, swirling patterns, DMT art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_doodle_art", "name": "Doodle Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Doodle Art Style, {prompt}, drawing, freeform, swirling patterns, doodle art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_double_exposure", "name": "Double Exposure", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Double Exposure Style, {prompt}, double image ghost effect, image combination, double exposure style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_dripping_paint_splatter_art", "name": "Dripping Paint Splatter Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Dripping Paint Splatter Art, {prompt}, dramatic, paint drips, splatters, dripping paint", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_expressionism", "name": "Expressionism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Expressionism Art Style, {prompt}, movement, contrast, emotional, exaggerated forms, expressionism art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_faded_polaroid_photo", "name": "Faded Polaroid Photo", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Faded Polaroid Photo, {prompt}, analog, old faded photo, old polaroid", "negative": "ugly, deformed, noisy, blurry, low contrast, vibrant, colorful", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_fauvism", "name": "Fauvism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Fauvism Art, {prompt}, painterly, bold colors, textured brushwork, fauvism art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_flat_2d_art", "name": "Flat 2D Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Flat 2D Art, {prompt}, simple flat color, 2-dimensional, Flat 2D Art Style", "negative": "ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_fortnite_art_style", "name": "Fortnite Art Style", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Fortnite Art Style, {prompt}, 3D cartoon, colorful, Fortnite Art Style", "negative": "ugly, deformed, noisy, blurry, low contrast, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_futurism", "name": "Futurism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Futurism Art Style, {prompt}, dynamic, dramatic, Futurism Art Style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_glitchcore", "name": "Glitchcore", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Glitchcore Art Style, {prompt}, dynamic, dramatic, distorted, vibrant colors, glitchcore art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_glo_fi", "name": "Glo-fi", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Glo-fi Art Style, {prompt}, dynamic, dramatic, vibrant colors, glo-fi art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_googie_art_style", "name": "Googie Art Style", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Googie Art Style, {prompt}, dynamic, dramatic, 1950's futurism, bold boomerang angles, Googie art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_graffiti_art", "name": "Graffiti Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Graffiti Art Style, {prompt}, dynamic, dramatic, vibrant colors, graffiti art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_harlem_renaissance_art", "name": "Harlem Renaissance Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Harlem Renaissance Art Style, {prompt}, dynamic, dramatic, 1920s African American culture, Harlem Renaissance art style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_high_fashion", "name": "High Fashion", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "High Fashion, {prompt}, dynamic, dramatic, haute couture, elegant, ornate clothing, High Fashion", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_idyllic", "name": "Idyllic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Idyllic, {prompt}, peaceful, happy, pleasant, happy, harmonious, picturesque, charming", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_impressionism", "name": "Impressionism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Impressionism, {prompt}, painterly, small brushstrokes, visible brushstrokes, impressionistic style", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_infographic_drawing", "name": "Infographic Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Infographic Drawing, {prompt}, diagram, infographic", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_ink_dripping_drawing", "name": "Ink Dripping Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Ink Dripping Drawing, {prompt}, ink drawing, dripping ink", "negative": "ugly, deformed, noisy, blurry, low contrast, colorful, vibrant", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_japanese_ink_drawing", "name": "Japanese Ink Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Japanese Ink Drawing, {prompt}, ink drawing, inkwash, Japanese Ink Drawing", "negative": "ugly, deformed, noisy, blurry, low contrast, colorful, vibrant", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_knolling_photography", "name": "Knolling Photography", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Knolling Photography, {prompt}, flat lay photography, object arrangment, knolling photography", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_light_cheery_atmosphere", "name": "Light Cheery Atmosphere", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Light Cheery Atmosphere, {prompt}, happy, joyful, cheerful, carefree, gleeful, lighthearted, pleasant atmosphere", "negative": "ugly, deformed, noisy, blurry, low contrast, monochromatic, dark, moody", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_logo_design", "name": "Logo Design", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Logo Design, {prompt}, dynamic graphic art, vector art, minimalist, professional logo design", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_luxurious_elegance", "name": "Luxurious Elegance", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Luxurious Elegance, {prompt}, extravagant, ornate, designer, opulent, picturesque, lavish", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_macro_photography", "name": "Macro Photography", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Macro Photography, {prompt}, close-up, macro 100mm, macro photography", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_mandola_art", "name": "Mandola Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Mandola art style, {prompt}, complex, circular design, mandola", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_marker_drawing", "name": "Marker Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Marker Drawing, {prompt}, bold marker lines, visibile paper texture, marker drawing", "negative": "ugly, deformed, noisy, blurry, low contrast, photograph, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_medievalism", "name": "Medievalism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Medievalism, {prompt}, inspired by The Middle Ages, medieval art, elaborate patterns and decoration, Medievalism", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_minimalism", "name": "Minimalism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Minimalism, {prompt}, abstract, simple geometic shapes, hard edges, sleek contours, Minimalism", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neo_baroque", "name": "Neo-Baroque", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neo-Baroque, {prompt}, ornate and elaborate, dynaimc, Neo-Baroque", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neo_byzantine", "name": "Neo-Byzantine", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neo-Byzantine, {prompt}, grand decorative religious style, Orthodox Christian inspired, Neo-Byzantine", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neo_futurism", "name": "Neo-Futurism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neo-Futurism, {prompt}, high-tech, curves, spirals, flowing lines, idealistic future, Neo-Futurism", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neo_impressionism", "name": "Neo-Impressionism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neo-Impressionism, {prompt}, tiny dabs of color, Pointillism, painterly, Neo-Impressionism", "negative": "ugly, deformed, noisy, blurry, low contrast, photograph, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neo_rococo", "name": "Neo-Rococo", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neo-Rococo, {prompt}, curved forms, naturalistic ornamentation, elaborate, decorative, gaudy, Neo-Rococo", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.575Z" }, { "id": "forge_neoclassicism", "name": "Neoclassicism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Neoclassicism, {prompt}, ancient Rome and Greece inspired, idealic, sober colors, Neoclassicism", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_op_art", "name": "Op Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Op Art, {prompt}, optical illusion, abstract, geometric pattern, impression of movement, Op Art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_ornate_and_intricate", "name": "Ornate and Intricate", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Ornate and Intricate, {prompt}, decorative, highly detailed, elaborate, ornate, intricate", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_pencil_sketch_drawing", "name": "Pencil Sketch Drawing", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Pencil Sketch Drawing, {prompt}, black and white drawing, graphite drawing", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_pop_art_2", "name": "Pop Art 2", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Pop Art, {prompt}, vivid colors, flat color, 2D, strong lines, Pop Art", "negative": "ugly, deformed, noisy, blurry, low contrast, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_rococo", "name": "Rococo", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Rococo, {prompt}, flamboyant, pastel colors, curved lines, elaborate detail, Rococo", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_silhouette_art", "name": "Silhouette Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Silhouette Art, {prompt}, high contrast, well defined, Silhouette Art", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_simple_vector_art", "name": "Simple Vector Art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Simple Vector Art, {prompt}, 2D flat, simple shapes, minimalistic, professional graphic, flat color, high contrast, Simple Vector Art", "negative": "ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_sketchup", "name": "Sketchup", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Sketchup, {prompt}, CAD, professional design, Sketchup", "negative": "ugly, deformed, noisy, blurry, low contrast, photo, photograph", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_steampunk_2", "name": "Steampunk 2", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Steampunk, {prompt}, retrofuturistic science fantasy, steam-powered tech, vintage industry, gears, neo-victorian, steampunk", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_surrealism", "name": "Surrealism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Surrealism, {prompt}, expressive, dramatic, organic lines and forms, dreamlike and mysterious, Surrealism", "negative": "ugly, deformed, noisy, blurry, low contrast, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_suprematism", "name": "Suprematism", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Suprematism, {prompt}, abstract, limited color palette, geometric forms, Suprematism", "negative": "ugly, deformed, noisy, blurry, low contrast, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_terragen", "name": "Terragen", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Terragen, {prompt}, beautiful massive landscape, epic scenery, Terragen", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_tranquil_relaxing_atmosphere", "name": "Tranquil Relaxing Atmosphere", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Tranquil Relaxing Atmosphere, {prompt}, calming style, soothing colors, peaceful, idealic, Tranquil Relaxing Atmosphere", "negative": "ugly, deformed, noisy, blurry, low contrast, oversaturated", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_sticker_designs", "name": "Sticker Designs", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Vector Art Stickers, {prompt}, professional vector design, sticker designs, Sticker Sheet", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_vibrant_rim_light", "name": "Vibrant Rim Light", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Vibrant Rim Light, {prompt}, bright rim light, high contrast, bold edge light", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_volumetric_lighting", "name": "Volumetric Lighting", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Volumetric Lighting, {prompt}, light depth, dramatic atmospheric lighting, Volumetric Lighting", "negative": "ugly, deformed, noisy, blurry, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_watercolor_2", "name": "Watercolor 2", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Watercolor style painting, {prompt}, visible paper texture, colorwash, watercolor", "negative": "ugly, deformed, noisy, blurry, low contrast, photo, realistic", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_whimsical_and_playful", "name": "Whimsical and Playful", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "Whimsical and Playful, {prompt}, imaginative, fantastical, bight colors, stylized, happy, Whimsical and Playful", "negative": "ugly, deformed, noisy, blurry, low contrast, drab, boring, moody", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_3d_model", "name": "Kamph_3d-model", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "professional 3d model {prompt}, octane render, highly detailed, volumetric, dramatic lighting", "negative": "ugly, deformed, noisy, low poly, blurry, painting", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_analog_film", "name": "Kamph_Analog film", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "analog film photo {prompt}, faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage", "negative": "painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_anime", "name": "Kamph_Anime", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "anime artwork {prompt}, anime style, key visual, vibrant, studio anime, highly detailed", "negative": "photo, deformed, black and white, realism, disfigured, low contrast", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_cinematic", "name": "Kamph_Cinematic", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic film still {prompt}, shallow depth of field, vignette, highly detailed, high budget Hollywood film, bokeh, cinemascope, moody, epic, gorgeous, film grain", "negative": "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_comic_book", "name": "Kamph_Comic book", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "comic {prompt}, graphic illustration, comic art, graphic novel art, vibrant, highly detailed", "negative": "photograph, deformed, glitch, noisy, realistic, stock photo", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_digital_art", "name": "Kamph_Digital art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "concept art {prompt}, digital artwork, illustrative, painterly, matte painting, highly detailed", "negative": "photo, photorealistic, realism, ugly", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_fantasy_art", "name": "Kamph_Fantasy art", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "ethereal fantasy concept art of {prompt}, magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy", "negative": "photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_cyberpunk", "name": "Kamph_Cyberpunk", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "neonpunk style {prompt}, cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional", "negative": "painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_photo_with_bokeh", "name": "Kamph_Photo with Bokeh", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic photo {prompt}, 35mm photograph, film, bokeh, professional, 4k, highly detailed", "negative": "drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_photo_without_bokeh", "name": "Kamph_Photo without Bokeh", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "cinematic photo {prompt}, 35mm photograph, film, professional, 4k, highly detailed", "negative": "bokeh, drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_kamph_enhancer", "name": "Kamph_Enhancer", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "breathtaking {prompt}, masterpiece, award-winning, professional, highly detailed", "negative": "ugly, deformed, noisy, blurry, distorted, grainy", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_bens_red_dress_tutorial_prompt", "name": "Bens_Red Dress (Tutorial Prompt)", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "a fashion shoot of a european woman with blonde hair in a maxi silk red dress with slit at front of dress from thigh to floor, (legs exposed:1.8), Red Patent Pointed Stiletto Heel Court Shoes, plain background, RAW candid cinema, 35mm, color graded portra 400 film, remarkable color, ultra realistic, textured skin, remarkable detailed pupils, realistic dull skin noise, visible skin detail, skin fuzz, dry skin, shot with cinematic camera", "negative": "", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_bens_daguerreotype_photo_1920", "name": "Bens_Daguerreotype Photo 1920", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "daguerreotype photo, {prompt}, 1920s photography, historical photo, aged photo, black & white photography, damaged photo", "negative": "cartoon, illustration, painting, frame", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" }, { "id": "forge_bens_underwater_and_god_rays", "name": "Bens Underwater and god rays", + "description": "", + "previewPrompt": "bunny and cat in space", "positive": "deep underwater, {prompt} highly detailed, intricate lighting, god rays", "negative": "ugly, deformed, noisy, blurry, low contrast,", "source": "forge", "exampleImage": null, - "updatedAt": "2026-05-29T02:03:57.904Z" + "updatedAt": "2026-06-03T09:03:32.576Z" } - ] + ], + "importedFrom": "http://192.168.2.104:7860/sdapi/v1/prompt-styles" } \ No newline at end of file diff --git a/docker/web/docs/README.md b/docker/web/docs/README.md index e2cf0a86..6fe31b58 100644 --- a/docker/web/docs/README.md +++ b/docker/web/docs/README.md @@ -1,29 +1,13 @@ -# Web UI documentation +# Web UI docs (moved) -Docs for the Vue app in `docker/web/src/`. Use these when changing navigation, panel placement, or discoverability. +UI design and navigation documentation now lives in the repository docs tree: -| Document | Role | -|----------|------| -| [**UI-FEATURE-FLOW.md**](UI-FEATURE-FLOW.md) | **Canonical IA map** — Mermaid flow graphs of every feature by tab and shell region. Edit this first when restructuring; implement changes in `App.vue` and `*View.vue` to match. | -| [**UX-NAVIGATION-MAP.md**](UX-NAVIGATION-MAP.md) | Operational reference — z-index, collision rules, shortcuts, access paths, known duplicates. Update after layout changes land in code. | +- **[docs/design/](../../docs/design/)** — style guide, mockups, tab reference +- **[docs/design/web/](../../docs/design/web/)** — feature flow and navigation maps -## Restructuring workflow +Regenerate screenshots from `docker/web`: -1. Edit **UI-FEATURE-FLOW.md** (section 10 blank template or per-tab diagrams). -2. Open a PR with only doc changes, or doc + UI in the same PR — note “implements flow doc §X” in the description. -3. Change routing in `App.vue` (`tabs`, `switchTab`, `switchSubTab`, context panel `v-if` chain). -4. Move panels between `components/views/*` and `AnimationEnginePanel.vue` as needed. -5. Refresh **UX-NAVIGATION-MAP.md** tables if regions or shortcuts change. -6. Run `npm test` from `docker/web/`. - -## Shell regions (quick glossary) - -- **Top nav** — main tabs (LIVE, PROMPTS, MOTION, MODULATION, AUDIO, SETTINGS). -- **Status strip** — transport, health, GPU, MIDI, session. -- **Controls drawer** (left, `P`) — tab-specific context panel (`*View.vue`). -- **Engine drawer** (right, `E`) — `AnimationEnginePanel.vue` (layers + compositor). -- **Layers rail** (far right) — running layers, scenes, add source. -- **Stage** — video + WebGL; LIVE-only HUDs and MOTION bottom sequencer dock. -- **Library overlay** — full-screen; hides edge docks. - -Legacy tab IDs still redirect: `RUNS` → Settings → RUNS, `GENERATE` → MOTION + sequencer, `STREAM` → Settings → OUTPUT. +```bash +npm run capture-ui-shots # README tour PNGs → docs/design/screenshots/readme/ +npm run audit-screenshots # full audit → docs/design/screenshots/audit-/ +``` diff --git a/docker/web/modules/ci-offline.js b/docker/web/modules/ci-offline.js index 14c5733c..c333816d 100644 --- a/docker/web/modules/ci-offline.js +++ b/docker/web/modules/ci-offline.js @@ -38,6 +38,7 @@ function isForgeApiPath(pathname) { return ( path.startsWith("/sdapi/") || path.startsWith("/deforum_api/") + || path.startsWith("/svd_api/") || path.startsWith("/controlnet") ); } diff --git a/docker/web/modules/prompt-styles-store.js b/docker/web/modules/prompt-styles-store.js index 71142ece..6a6065dc 100644 --- a/docker/web/modules/prompt-styles-store.js +++ b/docker/web/modules/prompt-styles-store.js @@ -114,6 +114,20 @@ async function writeStyles(webRoot, styles) { return normalized; } +async function writeSeedStyles(webRoot, styles, { importedFrom = null } = {}) { + const normalized = dedupeStyleIds(styles).map((style) => normalizeStyleRecord(style)); + const seed = { + version: 1, + updatedAt: new Date().toISOString(), + count: normalized.length, + styles: normalized, + }; + if (importedFrom) seed.importedFrom = importedFrom; + await fsp.mkdir(path.dirname(seedFilePath(webRoot)), { recursive: true }); + await fsp.writeFile(seedFilePath(webRoot), JSON.stringify(seed, null, 2), "utf-8"); + return normalized; +} + function forgeStyleToRecord(entry, index = 0) { const name = String(entry?.name || "").trim(); if (!name || /^-{3,}/.test(name)) return null; @@ -133,9 +147,10 @@ function forgeStyleToRecord(entry, index = 0) { }); } -async function importFromForge(forgeUrl, webRoot, { merge = true } = {}) { +async function importFromForge(forgeUrl, webRoot, { merge = true, persistSeed = true } = {}) { const base = String(forgeUrl || "").replace(/\/$/, ""); if (!base) throw new Error("forgeUrl required"); + const importedFrom = `${base}/sdapi/v1/prompt-styles`; const res = await fetch(`${base}/sdapi/v1/prompt-styles`); if (!res.ok) { const text = await res.text(); @@ -149,7 +164,8 @@ async function importFromForge(forgeUrl, webRoot, { merge = true } = {}) { ); if (!merge) { await writeStyles(webRoot, imported); - return { count: imported.length, added: imported.length, updated: 0, total: imported.length }; + if (persistSeed) await writeSeedStyles(webRoot, imported, { importedFrom }); + return { count: imported.length, added: imported.length, updated: 0, total: imported.length, persistedSeed: persistSeed }; } const existing = await readStyles(webRoot); const byName = new Map(existing.map((style) => [style.name.toLowerCase(), style])); @@ -176,7 +192,8 @@ async function importFromForge(forgeUrl, webRoot, { merge = true } = {}) { } const merged = dedupeStyleIds([...byName.values()]); await writeStyles(webRoot, merged); - return { count: imported.length, added, updated, total: merged.length }; + if (persistSeed) await writeSeedStyles(webRoot, merged, { importedFrom }); + return { count: imported.length, added, updated, total: merged.length, persistedSeed: persistSeed }; } async function setStyleExampleFromPath(webRoot, id, sourcePath, uploadsDir) { @@ -258,6 +275,7 @@ module.exports = { ensurePromptStylesStore, readStyles, writeStyles, + writeSeedStyles, importFromForge, setStyleExampleFromPath, clearStyleExample, diff --git a/docker/web/modules/runs-job-log.js b/docker/web/modules/runs-job-log.js new file mode 100644 index 00000000..394b44c5 --- /dev/null +++ b/docker/web/modules/runs-job-log.js @@ -0,0 +1,70 @@ +const fs = require("fs"); +const fsp = fs.promises; +const path = require("path"); +const crypto = require("crypto"); + +const MAX_ENTRIES = 500; + +function runsLogDir(runsDir) { + return path.join(runsDir, "_logs"); +} + +function runsLogPath(runsDir) { + return path.join(runsLogDir(runsDir), "job-log.jsonl"); +} + +function normalizeEntry(raw) { + if (!raw || typeof raw !== "object") return null; + const message = String(raw.message || "").trim(); + if (!message && !raw.kind) return null; + return { + id: String(raw.id || `log-${crypto.randomUUID()}`), + ts: raw.ts || new Date().toISOString(), + level: raw.level || "info", + kind: raw.kind || null, + message: message || String(raw.kind || "log"), + clientRequest: raw.clientRequest && typeof raw.clientRequest === "object" ? raw.clientRequest : null, + ollamaRequest: raw.ollamaRequest && typeof raw.ollamaRequest === "object" ? raw.ollamaRequest : null, + promptStyles: raw.promptStyles && typeof raw.promptStyles === "object" ? raw.promptStyles : null, + }; +} + +function createRunsJobLog(runsDir) { + async function ensureDir() { + await fsp.mkdir(runsLogDir(runsDir), { recursive: true }); + } + + async function append(entry) { + const normalized = normalizeEntry(entry); + if (!normalized) return null; + await ensureDir(); + await fsp.appendFile(runsLogPath(runsDir), `${JSON.stringify(normalized)}\n`, "utf-8"); + return normalized; + } + + async function read(limit = 80) { + const file = runsLogPath(runsDir); + if (!fs.existsSync(file)) return []; + const text = await fsp.readFile(file, "utf-8"); + const lines = text.split("\n").map((line) => line.trim()).filter(Boolean); + const entries = []; + for (let i = lines.length - 1; i >= 0 && entries.length < limit; i -= 1) { + try { + const parsed = normalizeEntry(JSON.parse(lines[i])); + if (parsed) entries.unshift(parsed); + } catch (_e) { + /* skip corrupt line */ + } + } + return entries.slice(-Math.max(1, Math.min(limit, MAX_ENTRIES))); + } + + async function clear() { + await ensureDir(); + await fsp.writeFile(runsLogPath(runsDir), "", "utf-8"); + } + + return { append, read, clear, logPath: runsLogPath(runsDir) }; +} + +module.exports = { createRunsJobLog, runsLogPath }; diff --git a/docker/web/package.json b/docker/web/package.json index 64e4dd73..90206e57 100644 --- a/docker/web/package.json +++ b/docker/web/package.json @@ -24,6 +24,7 @@ "dev:server": "node scripts/dev-server.mjs", "install:freecut": "node scripts/install-freecut.mjs", "install:freecut:check": "node scripts/install-freecut.mjs --skip-if-present", + "test:video-editor-flow": "npm run build && node test/playwright-video-editor-flow.mjs", "test:playwright": "npm run build && node test/playwright-smoke.mjs && node test/playwright-startup-and-runs-storage.mjs && node test/playwright-runs-realtime.mjs && node test/playwright-clip-metadata.mjs && node test/playwright-recording-appears.mjs && node test/playwright-record-during-generation.mjs && node test/playwright-16frames-library-editor.mjs && node test/playwright-storage-browser.mjs && node test/playwright-browser-upload.mjs && node test/playwright-editor.mjs && node test/playwright-deforum-video-editor.mjs" }, "dependencies": { diff --git a/docker/web/public/assets/index.css b/docker/web/public/assets/index.css index 506aedc9..04247913 100644 --- a/docker/web/public/assets/index.css +++ b/docker/web/public/assets/index.css @@ -1 +1 @@ -:root{--bg-0: #08090d;--bg-1: #0c0d14;--bg-2: #11131c;--bg-3: #14161f;--border: #2a2d3a;--border-strong: #3a3d4c;--live: #1d9e75;--live-text: #9fe1cb;--accent: #7f77dd;--accent-text: #cecbf6;--a-group: #378add;--b-group: #e879b0;--a-group-text: #cce0f7;--b-group-text: #f6cede;--warn: #ef9f27;--error: #e24b4a;--warn-text: #ffdca8;--error-text: #ffd5d4;--cyan: #2de2ff;--band-low: #5cc8ff;--band-mid: var(--accent);--band-high: var(--success);--text-primary: #e6e8f0;--text-secondary: #9a9db0;--text-dim: #777b8f;--media-bg: #000000;--media-text: #ffffff;--radius: 11px;--radius-sm: 7px;--radius-pill: 5px;--mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;--success: #5af2a9;--library-accent: var(--success);--danger: var(--error);--app-header-height: 54px;--app-top-nav-height: 64px;--app-chrome-top: calc(var(--app-header-height) + var(--app-top-nav-height))}*{box-sizing:border-box}body{margin:0;font-family:Space Grotesk,Inter,"Segoe UI Emoji","Apple Color Emoji","Noto Color Emoji",Arial,sans-serif;background:radial-gradient(circle at 20% 20%,rgba(255,83,217,.12),transparent 25%),radial-gradient(circle at 80% 0%,rgba(45,226,255,.12),transparent 25%),var(--bg-0);color:var(--text-primary);min-height:100vh;display:flex;flex-direction:column;padding-bottom:0}#app{flex:1;display:flex;flex-direction:column;min-height:0;width:100%}.app-chrome{position:sticky;top:0;z-index:200;flex-shrink:0;display:flex;flex-direction:column;background:#08090dfa;border-bottom:.5px solid var(--border);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}header.app-header{padding:0 12px;background:transparent;border-bottom:.5px solid var(--border);display:flex;align-items:stretch;gap:12px;position:relative;z-index:1}.app-header__left{display:flex;align-items:stretch;min-width:0;flex:1}.header-transport{display:flex;align-items:center;gap:4px;padding:0 10px;border-left:.5px solid var(--border);flex-shrink:0}.header-transport__divider{width:1px;height:22px;margin:0 4px;background:var(--border);flex-shrink:0}.header-transport__btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);cursor:pointer;transition:color .12s,border-color .12s,box-shadow .12s,background .12s}.header-transport__btn:disabled{opacity:.38;cursor:default;pointer-events:none}.header-transport__icon{font-size:15px}.header-transport__btn--play{color:color-mix(in srgb,var(--live) 75%,var(--text-secondary));border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.header-transport__btn--play.header-transport__btn--active,.header-transport__btn--play:not(:disabled):hover{color:var(--live-text);border-color:var(--live);box-shadow:0 0 10px #1d9e7538}.header-transport__btn--pause{color:color-mix(in srgb,var(--live) 65%,var(--text-secondary));border-color:color-mix(in srgb,var(--live) 28%,var(--border))}.header-transport__btn--pause.header-transport__btn--active,.header-transport__btn--pause:not(:disabled):hover{color:var(--live-text);border-color:var(--live);background:color-mix(in srgb,var(--live) 12%,var(--bg-3));box-shadow:0 0 10px #1d9e7538}.header-transport__btn--record{color:color-mix(in srgb,var(--error) 70%,var(--text-secondary));border-color:color-mix(in srgb,var(--error) 35%,var(--border))}.header-transport__btn--record.header-transport__btn--active,.header-transport__btn--record:hover{color:#fff;border-color:var(--error);background:color-mix(in srgb,var(--error) 22%,var(--bg-3));box-shadow:0 0 10px #e24b4a47;animation:header-rec-pulse 1.5s ease-in-out infinite}@keyframes header-rec-pulse{0%,to{opacity:1}50%{opacity:.62}}.header-transport__btn--stream{color:color-mix(in srgb,var(--accent) 75%,var(--text-secondary));border-color:color-mix(in srgb,var(--accent) 35%,var(--border))}.header-transport__btn--stream.header-transport__btn--active,.header-transport__btn--stream:hover{color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--bg-3));box-shadow:0 0 10px #8f86ff3d}.header-transport__btn--stop{color:color-mix(in srgb,var(--warn) 80%,var(--text-secondary));border-color:color-mix(in srgb,var(--warn) 40%,var(--border))}.header-transport__btn--stop:hover{color:#1a1408;border-color:var(--warn);background:color-mix(in srgb,var(--warn) 88%,var(--bg-3));box-shadow:0 0 10px #ef9f2752}.header-transport__btn--preview{display:inline-flex;align-items:center;gap:5px;color:color-mix(in srgb,var(--accent) 78%,var(--text-secondary));border-color:color-mix(in srgb,var(--accent) 38%,var(--border))}.header-transport__btn--preview:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 16%,var(--bg-3));box-shadow:0 0 10px #8f86ff42}.header-transport__btn--preview.header-transport__btn--active{color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 22%,var(--bg-3));box-shadow:0 0 12px #8f86ff4d;cursor:wait}.stream-dashboard-shell{position:sticky;top:var(--app-chrome-top);z-index:95;border-bottom:.5px solid var(--border);background:#08090df7;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);max-height:min(52vh,520px);display:flex;flex-direction:column;overflow:hidden}.stream-dashboard-shell__bar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 14px;border-bottom:.5px solid var(--border);flex-shrink:0}.stream-dashboard-shell__title{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--text-secondary)}.stream-dashboard-shell__body{overflow:auto;padding:10px 14px 14px;min-height:0}.stream-dashboard-slide-enter-active,.stream-dashboard-slide-leave-active{transition:max-height .2s ease,opacity .18s ease}.stream-dashboard-slide-enter-from,.stream-dashboard-slide-leave-to{max-height:0;opacity:0}.app-header .status-strip{margin-left:auto;padding:6px 0;flex-shrink:0}.brand{display:none}.top-nav{position:relative;left:0;right:0;z-index:2;background:transparent;border-bottom:.5px solid var(--border);display:flex;align-items:stretch;flex-shrink:0}.top-nav__inner{display:flex;justify-content:center;align-items:stretch;gap:2px;flex:1;max-width:900px;margin:0 auto;padding:0 8px}.top-nav__actions{display:flex;align-items:center;gap:14px;padding:0 14px;border-left:.5px solid var(--border);flex-shrink:0}.top-nav__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:34px;height:34px;padding:0 10px;border-radius:var(--radius-pill);border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);cursor:pointer;transition:color .12s,border-color .12s,background .12s}.top-nav__icon-btn:hover{color:var(--text-secondary);border-color:var(--border-strong)}.top-nav__icon-btn--active{color:var(--library-accent);border-color:color-mix(in srgb,var(--library-accent) 45%,transparent);background:color-mix(in srgb,var(--library-accent) 10%,transparent)}.top-nav__action-label{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:inherit}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.tab{--tab-accent: #8f86ff;--tab-accent-soft: rgba(143, 134, 255, .14);position:relative;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;padding:10px 18px;min-height:64px;min-width:72px;flex:1;max-width:120px;border-radius:0;border:none;border-bottom:2px solid transparent;border-top:none;background:transparent;color:var(--text-dim);cursor:pointer;font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;transition:color .15s,border-color .15s,background .15s}.tab:before{display:none}.tab:after{display:none}.tab:hover{color:var(--text-secondary);background:#ffffff0a}.tab.active{color:color-mix(in srgb,var(--tab-accent) 90%,white 10%);border-bottom-color:var(--tab-accent);background:var(--tab-accent-soft)}.tab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;color:color-mix(in srgb,var(--tab-accent) 80%,white 20%);opacity:.7;transition:opacity .15s}.tab:hover .tab__icon-wrap,.tab.active .tab__icon-wrap{opacity:1}.tab__icon{font-size:20px}.tab__copy{display:flex;flex-direction:column;align-items:center;gap:0;min-width:0}.tab__label{font-size:10px;line-height:1;letter-spacing:.08em;color:inherit}.tab__hint{display:none}.tab--live{--tab-accent: #53d8ff;--tab-accent-soft: rgba(83, 216, 255, .1)}.tab--library,.tab--stream{--tab-accent: #6fe3a2;--tab-accent-soft: rgba(111, 227, 162, .1)}.tab--prompts{--tab-accent: #f689d3;--tab-accent-soft: rgba(246, 137, 211, .1)}.tab--motion{--tab-accent: #f2b153;--tab-accent-soft: rgba(242, 177, 83, .1)}.tab--modulation{--tab-accent: #7df2c3;--tab-accent-soft: rgba(125, 242, 195, .1)}.tab--settings{--tab-accent: #8f86ff;--tab-accent-soft: rgba(143, 134, 255, .1)}.tab--generate{--tab-accent: #ff7b8d;--tab-accent-soft: rgba(255, 123, 141, .1)}.pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-secondary);font-size:11px}.pill .dot{width:6px;height:6px;border-radius:50%;background:var(--live);box-shadow:0 0 5px var(--live);flex-shrink:0}.pill.danger .dot{background:var(--error);box-shadow:0 0 5px var(--error)}.btn{display:inline-flex;align-items:center;justify-content:center;background:#1d9e7538;color:var(--live-text);border:.5px solid var(--live);border-radius:var(--radius-sm);padding:6px 12px;font-weight:600;font-size:11px;font-family:inherit;cursor:pointer;letter-spacing:.04em;transition:background .15s,border-color .15s}.btn:hover:not(:disabled){background:#1d9e7552}.btn.ghost{background:var(--bg-2);color:var(--text-dim);border:.5px solid var(--border)}.btn.playing{background:var(--live);box-shadow:0 0 10px #1d9e7559}.btn.recording{background:var(--error);animation:btn-rec-pulse 1.5s ease-in-out infinite}@keyframes btn-rec-pulse{0%,to{opacity:1}50%{opacity:.6}}.layout{flex:1;display:grid;grid-template-columns:1fr;gap:10px;padding:10px;min-height:0}.layout--sidebar{min-height:calc(100vh - var(--app-chrome-top) - 20px);align-content:stretch}.layout--library-workspace .layout{pointer-events:none;-webkit-user-select:none;user-select:none;filter:brightness(.55)}.library-workspace{position:fixed;top:0;right:0;bottom:0;left:0;z-index:350;display:flex;flex-direction:column;background:var(--bg-0)}.library-workspace__chrome{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border);background:var(--bg-1);flex-shrink:0}.library-workspace__tabs{display:flex;gap:6px}.library-workspace__tab{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:var(--radius-pill);border:1px solid var(--border);background:var(--bg-2);color:var(--text-dim);font-size:11px;font-weight:600;cursor:pointer}.library-workspace__tab--active{color:var(--library-accent);border-color:color-mix(in srgb,var(--library-accent) 45%,transparent);background:color-mix(in srgb,var(--library-accent) 10%,transparent)}.library-workspace__body{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:12px}.library-workspace__pane{flex:1;min-height:0;overflow:auto}.library-workspace__pane--editor{display:flex;flex-direction:column}.library-workspace-slide-enter-active,.library-workspace-slide-leave-active{transition:transform .22s ease,opacity .22s ease}.library-workspace-slide-enter-from,.library-workspace-slide-leave-to{transform:translateY(12px);opacity:0}.layout--sidebar .preview{position:relative;width:100%;max-width:min(1200px,calc(100vw - 16px));margin:0 auto;min-height:0;display:flex;flex-direction:column}.preview{display:grid;grid-template-rows:1fr;align-content:stretch;gap:4px;width:100%;min-height:0;flex:1}.preview--motion-dock{grid-template-rows:minmax(0,1fr) minmax(0,40vh)}.preview--top-dock{grid-template-rows:auto minmax(0,1fr)}.preview--motion-dock.preview--top-dock{grid-template-rows:auto minmax(0,1fr) minmax(0,40vh)}.preview-bottom-dock{min-height:240px;flex:1 1 auto;display:flex;flex-direction:column}.preview-bottom-dock__pane{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto}.preview-bottom-dock__pane--sequencer .stage-sequencer-shell{margin-top:0}.video-wrap{position:relative;border-radius:8px;overflow:hidden;background:var(--media-bg);width:100%}.video-wrap__stage{position:relative;width:100%;min-height:0;flex:1 1 auto;overflow:hidden;background:var(--media-bg)}.video-layer-tabs--preview{border-radius:0 0 8px 8px;border-top:none}.layers-sidebar{position:absolute;top:0;right:0;bottom:0;z-index:30;width:32px;display:flex;flex-direction:column;align-items:stretch;background:#06080fe0;border-left:.5px solid var(--border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);transition:width .18s ease;overflow:hidden}.layers-sidebar--open{width:188px}.layers-sidebar__toggle{flex:none;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;padding:0;border-bottom:.5px solid var(--border);flex-shrink:0}.layers-sidebar__toggle:hover{color:var(--text-primary);background:#ffffff0a}.layers-sidebar__toggle svg{width:14px;height:14px;flex-shrink:0}.layers-sidebar__rail-head{flex-shrink:0;padding:4px 0 2px;overflow:hidden}.layers-sidebar--open .layers-sidebar__rail-head{padding:4px 10px 2px}.layers-sidebar__rail-title{font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);white-space:nowrap}.layers-sidebar__active-badge{display:flex;align-items:center;gap:6px;padding:8px 0;flex-shrink:0;overflow:hidden;min-width:0}.layers-sidebar--open .layers-sidebar__active-badge{padding:8px 10px 6px;border-bottom:.5px solid var(--border)}.layers-sidebar__active-dot{flex-shrink:0;margin:0 auto}.layers-sidebar--open .layers-sidebar__active-dot{margin:0}.layers-sidebar__active-name{font-size:10px;font-weight:700;letter-spacing:.04em;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);flex:1;min-height:0}.layers-sidebar--open .layers-sidebar__active-name{writing-mode:horizontal-tb;transform:none;flex:1;min-width:0}.layers-sidebar__list{flex:1;display:flex;flex-direction:column;gap:2px;padding:6px;overflow-y:auto;min-height:0}.layers-sidebar__item{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:var(--radius-sm);border:.5px solid transparent;background:transparent;color:var(--text-secondary);font-size:11px;cursor:pointer;text-align:left;width:100%;white-space:nowrap;overflow:hidden}.layers-sidebar__item:hover{background:#ffffff0d;color:var(--text-primary)}.layers-sidebar__item--active{border-color:#7f77dd80;background:#7f77dd1a;color:var(--accent-text)}.layers-sidebar__item-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layers-sidebar__add{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:var(--radius-sm);border:.5px dashed var(--border);background:transparent;color:var(--text-dim);font-size:11px;cursor:pointer;width:100%;text-align:left;margin-top:auto;white-space:nowrap;overflow:hidden}.layers-sidebar__add:hover{color:var(--text-secondary);border-color:var(--border-strong)}.layers-sidebar__add--active{border-color:#7f77dd8c;color:var(--accent-text)}.layers-sidebar__add-icon{flex-shrink:0;font-size:14px;line-height:1}.layers-sidebar__scenes{flex-shrink:0;border-top:.5px solid var(--border);padding:6px;display:flex;flex-direction:column;gap:3px;max-height:160px;overflow-y:auto}.layers-sidebar__scenes-header{display:flex;align-items:center;justify-content:space-between;padding:2px 2px 4px;gap:6px}.layers-sidebar__scenes-label{font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim)}.layers-sidebar__scenes-save{padding:3px 6px;font-size:9px}.layers-sidebar__scene-item{display:flex;align-items:center;gap:4px;padding:4px 6px;border-radius:var(--radius-sm);border:.5px solid transparent;background:transparent;color:var(--text-secondary);font-size:10px;cursor:pointer;text-align:left;width:100%;overflow:hidden}.layers-sidebar__scene-item:hover{background:#ffffff0a}.layers-sidebar__scene-item--default{border-color:#2de2ff59;color:var(--live-text)}.layers-sidebar__scene-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layers-sidebar__scene-delete{flex-shrink:0;border:none;background:transparent;color:var(--text-dim);font-size:13px;line-height:1;padding:0 2px;cursor:pointer}.layers-sidebar__scene-delete:hover{color:var(--error)}.layers-sidebar__scenes-empty{font-size:10px;color:var(--text-dim);padding:4px 2px;text-align:center}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__scenes{display:none}.video-wrap__default-animation{z-index:0;opacity:0;pointer-events:none;transition:opacity .55s ease}.video-wrap__default-animation--visible{opacity:1;pointer-events:auto}.video-layer-tabs{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px;border-bottom:.5px solid var(--border);background:#08090db8}.video-layer-tabs--engine{border-bottom:none;border-radius:10px;border:1px solid var(--border);background:#08090d8c}.video-layer-tabs__transport{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-right:6px}.control-btn--top{min-width:96px;padding:9px 14px;border-radius:10px;box-shadow:0 10px 24px #00000047}.control-btn--frame:not(.control-btn--loading){border-color:#7f77dd8c;background:#7f77dd29;color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd2e,0 10px 22px #7f77dd24}.control-btn--record:not(.recording){border-color:#e24b4a59;background:#e24b4a1a;color:#f5b4b3}.video-layer-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:var(--radius-sm, 7px);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none}.video-layer-tab.active{border-color:#7f77dd8c;color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd2e}.video-layer-tab--add{border-style:dashed}.video-layer-tab--size{margin-left:auto}.video-layer-tab__close{border:none;background:transparent;color:var(--text-dim);font-size:14px;line-height:1;padding:0 2px;cursor:pointer}.video-layer-tab__dot{width:8px;height:8px;border-radius:999px;display:inline-block;box-shadow:0 0 0 1px #ffffff1f}.video-layer-tab__dot--green{background:var(--live)}.video-layer-tab__dot--yellow{background:var(--warn)}.video-layer-tab__dot--red{background:var(--error)}.video-layer-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:grid;place-content:center;gap:8px;padding:24px;text-align:center;background:#08090db8}.video-layer-empty__title{font-size:14px;font-weight:700;color:var(--text-primary)}.video-layer-add{margin-top:8px;display:grid;gap:10px}.video-layer-add__actions{display:flex;flex-wrap:wrap;gap:8px}.video-wrap__stage:fullscreen{width:100vw;height:100vh;max-width:none;max-height:none;margin:0;border-radius:0}.video-wrap--frame-processing .video-feed--hls{filter:saturate(.92) brightness(.92)}.video-wrap--frame-processing .video-still-preview{filter:none;transform:none}video{width:100%;height:100%;display:block;background:var(--media-bg);object-fit:cover}.video-feed{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;object-fit:cover;opacity:0;pointer-events:none;transition:opacity .55s ease,mix-blend-mode .2s ease}.video-feed--visible{opacity:1;pointer-events:auto}.video-feed--hls.video-feed--forge-reveal.video-feed--visible{animation:video-feed-forge-reveal .8s ease forwards}@keyframes video-feed-forge-reveal{0%{opacity:0}to{opacity:1}}.video-feed--blended{mix-blend-mode:screen;pointer-events:auto}.video-feed:not(.video-feed--visible){visibility:hidden}.video-still-preview--over-webgl{pointer-events:none}.video-feed--standby-preview{z-index:2;object-fit:cover;background:var(--media-bg)}.video-feed--hls{z-index:3;object-fit:cover;background:var(--media-bg)}.video-wrap--hls-and-preview .video-feed--standby-preview{width:50%;left:0;right:auto}.video-wrap--hls-and-preview .video-feed--hls.video-feed--visible{width:50%;left:50%;right:0}.video-still-preview{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;width:100%;height:100%;display:block;background:var(--media-bg);object-fit:cover}.overlay{position:absolute;left:0;right:0;top:0;display:flex;justify-content:space-between;padding:10px 12px;background:linear-gradient(180deg,rgba(0,0,0,.7),transparent);font-size:13px;font-weight:600;color:var(--media-text)}.video-feed-frames{margin-top:4px;font-size:11px;font-weight:600;color:var(--accent-text);letter-spacing:.02em}.video-feed-status{margin-top:4px;display:inline-flex;align-items:center;justify-content:flex-end;padding:2px 8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);background:#08090d9e;color:var(--text-secondary);font-size:10px;letter-spacing:.04em;text-transform:uppercase}.video-feed-status--ready{color:var(--accent-text);border-color:#7f77dd8c}.video-feed-status--selected{box-shadow:0 0 0 1px #2de2ff2e}.preview-loading-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;padding:20px;background:radial-gradient(circle at center,#090b1233,#090b12ad 72%);pointer-events:none}.preview-loading-overlay__card{display:grid;gap:10px;justify-items:center;min-width:min(320px,100%);padding:16px 18px;border-radius:14px;border:1px solid rgba(255,255,255,.12);background:#090b12c2;box-shadow:0 20px 48px #00000061;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);text-align:center}.preview-loading-overlay__hint{font-size:11px;line-height:1.4;color:var(--text-secondary)}.timeline{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:8px}.thumbs{display:flex;gap:8px;overflow-x:auto;margin-bottom:6px;padding-bottom:4px}.thumb-card{position:relative;border-radius:10px;overflow:hidden;border:1px solid var(--border);background:var(--bg-1);box-shadow:0 8px 20px #00000059}.thumb{width:92px;height:54px;display:block;background:var(--bg-2);object-fit:cover}.thumb-label{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:11px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.7))}.frame-rail-overlay{position:absolute;left:10px;bottom:10px;z-index:24;display:flex;flex-direction:column-reverse;align-items:flex-start;gap:8px;max-width:calc(100% - 20px);pointer-events:none}.frame-rail-overlay>*{pointer-events:auto}.frame-rail-overlay__toggle{flex-shrink:0}.frame-rail-overlay__panel{width:min(100%,920px);max-height:min(42vh,228px);overflow:hidden;border-radius:var(--radius);box-shadow:0 16px 40px #00000073;animation:frame-rail-overlay-in .22s ease}@keyframes frame-rail-overlay-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.frame-rail-overlay .frame-rail{margin:0;max-height:min(42vh,228px);overflow:hidden;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);background:#0c0e16e0;border-color:#ffffff1a}.frame-rail-overlay .frame-rail__list{max-height:min(28vh,140px)}.runs-browser__frames-pane{min-height:0;overflow:hidden;display:flex;flex-direction:column}.runs-browser__frames-pane .frame-rail--embedded{flex:1 1 auto;min-height:0;max-height:min(52vh,420px);margin:0}.runs-browser__frames-pane .frame-rail--embedded .frame-rail__list{max-height:min(36vh,280px)}.frame-rail{display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-1)}.frame-rail__header{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.frame-rail__title-wrap{display:grid;gap:2px;min-width:0}.frame-rail__title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-primary)}.frame-rail__meta{font-size:10px;color:var(--text-dim)}.frame-rail__actions{display:flex;align-items:center;gap:8px;min-width:min(440px,100%);flex:1;justify-content:flex-end}.frame-rail__toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--border);border-radius:999px;background:var(--bg-2);color:var(--text-secondary);cursor:pointer;transition:color .18s ease,border-color .18s ease,transform .18s ease;flex-shrink:0}.frame-rail__toggle:hover{color:var(--text-primary);border-color:var(--accent);transform:translateY(-1px)}.frame-rail__toggle-icon{font-size:16px}.frame-rail__controls{display:flex;align-items:center;gap:8px;min-width:min(440px,100%);flex:1;justify-content:flex-end}.frame-rail__step{border:1px solid var(--border);border-radius:999px;background:var(--bg-2);color:var(--text-secondary);padding:4px 10px;font-size:10px;cursor:pointer}.frame-rail__step:disabled{opacity:.4;cursor:not-allowed}.frame-rail__scrubber{flex:1;min-width:120px;accent-color:var(--accent)}.frame-rail__list{display:flex;gap:8px;overflow-x:auto;overflow-y:hidden;padding-bottom:4px;flex-wrap:nowrap;scrollbar-width:thin}.frame-rail__item{position:relative;flex:0 0 auto;width:110px;padding:0;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--bg-2);cursor:pointer;box-shadow:0 8px 20px #00000047}.frame-rail__item--active{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent),0 10px 22px #00000052}.frame-rail__thumb-wrap{position:relative;width:110px;height:62px;background:var(--bg-2)}.frame-rail__thumb-wrap--pending{display:flex;align-items:center;justify-content:center;border:1px dashed color-mix(in srgb,var(--accent) 40%,var(--border));background:color-mix(in srgb,var(--accent) 8%,var(--bg-2))}.frame-rail__thumb{width:110px;height:62px;display:block;background:var(--bg-2);object-fit:cover}.frame-rail__item--loading .frame-rail__thumb{opacity:.55}.frame-rail__thumb-loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,#080c1426,#080c148c);pointer-events:none}.frame-rail__item--pending{cursor:default;border-style:dashed;border-color:color-mix(in srgb,var(--accent) 45%,var(--border));box-shadow:none}.frame-rail__live-tag{margin-left:6px;padding:1px 6px;border-radius:999px;font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--accent-text);background:color-mix(in srgb,var(--accent) 22%,transparent)}.lazy-loading-indicator--thumb{display:inline-flex;align-items:center;justify-content:center;gap:4px;color:var(--accent-text)}.video-still-preview--loading{opacity:.72;filter:saturate(.85)}.video-still-preview__loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:flex-start;justify-content:center;padding-top:12px;pointer-events:none}.frame-rail__label{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:10px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.76))}.library-frame-rail__projects{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.library-frame-rail__project{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border-radius:999px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary);cursor:pointer;font-size:11px;font-weight:600}.library-frame-rail__project:hover{border-color:#7f77dd73}.library-frame-rail__project--active{border-color:#7f77dd8c;box-shadow:inset 0 0 0 1px #7f77dd29;color:var(--accent-text)}.library-frame-rail__project-count{font-size:10px;font-weight:500;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.library-frame-rail__runs{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(100px,140px);gap:8px;overflow-x:auto;padding-bottom:8px;margin-bottom:8px}.library-frame-rail__run-empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.frame-rail__empty{min-height:62px;display:flex;align-items:center;justify-content:center;border:1px dashed var(--border);border-radius:10px;color:var(--text-dim);font-size:11px;text-align:center;padding:10px}.wave{height:40px;border-radius:8px;background:linear-gradient(90deg,#ff53d933,#2de2ff33);border:1px solid var(--border)}.spectral-preview{width:100%;max-height:140px;border-radius:8px;border:1px solid var(--border);display:block;object-fit:fill;background:var(--bg-0)}.rack{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:12px;box-shadow:0 10px 30px #00000040}.rack h3{margin:0 0 8px}.slider-row{display:grid;grid-template-columns:1.1fr 1fr;gap:8px;align-items:center;margin:8px 0;font-size:13px;color:var(--text-secondary)}.slider-row input[type=range]{width:100%;accent-color:var(--accent)}.source{display:inline-flex;gap:6px;font-size:12px;color:var(--text-secondary);align-items:center}.chips{display:flex;flex-wrap:wrap;gap:6px}.chip{padding:6px 12px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);cursor:pointer;font-size:11px;font-family:inherit;font-weight:600;transition:border-color .15s,color .15s,background .15s}.chip:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.chip.active{border-color:var(--accent);color:var(--accent-text);background:color-mix(in srgb,var(--accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 12%,transparent)}.chip.active--live{border-color:var(--live);color:var(--live-text);background:color-mix(in srgb,var(--live) 18%,transparent)}.framesync-icon-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;background:transparent;color:var(--error);cursor:pointer;border-radius:6px}.framesync-icon-button:hover{background:color-mix(in srgb,var(--error) 14%,transparent)}.framesync-icon-button .ui-icon{width:14px;height:14px}.sub-pills{display:flex;gap:4px;margin-bottom:10px;flex-wrap:wrap}.sub-pill{padding:5px 10px;border-radius:999px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);cursor:pointer;font-size:12px}.sub-pill.active{border-color:var(--b-group);color:var(--text-primary);background:#e879b01f}.live-view{display:flex;flex-direction:column;gap:8px;min-height:0}.live-view__scroll{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:8px}.live-view__summary-grid{display:grid;gap:8px;margin-top:4px}.live-view__summary-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px}.live-view__summary-value{font-size:12px;color:var(--text-primary)}.live-view__param-list{margin:10px 0 0;padding:0;list-style:none;display:grid;gap:6px}.live-view__param-list-item{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--text-secondary)}.live-view__param-list-meta{color:var(--text-dim);font-size:10px}.live-view__summary-empty{margin:8px 0 0}.live-view__shortcuts{padding:12px}.live-view__shortcuts-copy{margin:8px 0 10px}.live-view__shortcut-actions{display:flex;flex-wrap:wrap;gap:8px}.prompts-schedule-hint{padding:12px}.prompts-schedule-hint__copy{margin:0 0 10px}.animation-engine-panel__title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.animation-engine-panel__subtitle{margin:0;font-size:10px}.modulation-audio-panel--audio-tab{margin-bottom:10px}.modulation-audio-panel__sync-toggle{margin-top:12px}.deforum-settings-stack{display:grid;gap:12px}.live-parameters-panel{margin-bottom:4px}.live-engine-dock{flex-shrink:0;position:sticky;top:0;z-index:5;margin:0;padding:8px 10px 10px;border-radius:12px;background:#0c0e16eb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 10px 28px #00000052,inset 0 0 0 1px #ffffff14}.live-engine-dock__head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px}.live-engine-dock__tabs{flex-shrink:0}.live-engine-dock__body{max-height:min(44vh,400px);overflow-x:hidden;overflow-y:auto;padding-right:2px}.live-engine-dock__body .deforum-job-panel__head{margin-bottom:8px}.live-engine-dock__preload-hint{margin:8px 0 0;font-size:10px;color:var(--text-dim)}.animation-engine-panel__sources{margin-top:8px;display:flex;flex-direction:column;gap:8px}.live-view__tabs{position:sticky;top:0;z-index:2;background:var(--bg-1);padding:4px 0 8px}.live-view__tab-add{border-style:dashed}.deforum-job-panel__head{margin-bottom:0}.deforum-job-panel__summary{margin:8px 0 0}.deforum-job-panel__transport{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.deforum-job-panel__status{margin-top:8px;opacity:.9}.live-add-source__status{margin-top:8px}.live-add-source__library{margin-top:12px}.live-add-source__library-actions{margin-bottom:10px}.live-add-source__hint{margin-top:8px;opacity:.85}.live-animation-summary{margin-top:10px;display:grid;gap:8px}.lcm-engine-panel{margin-top:14px;padding:12px 14px;border-radius:10px;border:1px solid rgba(255,200,60,.22);background:#ffc83c0f;display:flex;flex-direction:column;gap:10px}.lcm-engine-panel__toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none}.lcm-engine-panel__toggle input{accent-color:rgb(255,200,60)}.lcm-engine-panel__fields{display:grid;grid-template-columns:120px 1fr;gap:10px;align-items:end}.lcm-engine-panel__lora .framesync-input{font-family:ui-monospace,monospace;font-size:12px}.lcm-engine-badge{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:2px 8px 2px 6px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#ffd250;background:#ffc83c24;border:1px solid rgba(255,200,60,.35);vertical-align:middle}.lcm-engine-badge__icon{width:14px;height:14px}.wan-engine-controls{margin-top:4px}.wan-engine-controls__hint{margin:4px 0 10px;font-size:12px;opacity:.85}.wan-engine-controls__hint code{font-size:11px}.wan-engine-controls__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 12px}.wan-engine-controls__toggle label{display:inline-flex;align-items:center;gap:8px;font-size:12px;cursor:pointer}.wan-engine-controls__field .framesync-subtitle{margin-bottom:4px}.wan-engine-controls__speed,.wan-engine-controls__motion,.wan-engine-controls__loras,.wan-engine-controls__init,.wan-engine-controls__download{margin-bottom:12px}.wan-engine-controls__init-drop{margin:8px 0;min-height:120px}.wan-engine-controls__init-actions{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.wan-engine-controls__init-i2v{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 12px}.wan-engine-controls__download-row{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 8px}.wan-engine-controls__download-status{margin-top:6px;color:var(--live-text);font-size:11px}.wan-engine-controls__advanced{margin-top:8px}.wan-engine-controls__advanced>summary{cursor:pointer;margin-bottom:8px}.animation-engine-card--wan.animation-engine-card--active{border-color:#78c8ff8c;box-shadow:0 0 0 1px #78c8ff40}.animation-engine-current{margin-top:10px;padding:12px 14px;border-radius:12px;border:1px solid rgba(127,119,221,.45);background:linear-gradient(135deg,#7f77dd29,#7f77dd0a),#08090d8c;box-shadow:inset 0 0 0 1px #7f77dd1f,0 10px 28px #7f77dd14}.animation-engine-current--compact{margin-bottom:4px}.animation-engine-current__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;border:1px solid rgba(127,119,221,.5);background:#7f77dd33;color:var(--accent-text);font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.animation-engine-current__body{display:flex;align-items:flex-start;gap:12px;margin-top:10px}.animation-engine-current__dot{width:12px;height:12px;margin-top:4px;border-radius:999px;flex-shrink:0;box-shadow:0 0 0 2px #ffffff14,0 0 12px currentColor}.animation-engine-current__dot--green{background:var(--live);color:var(--live)}.animation-engine-current__dot--yellow{background:var(--warn);color:var(--warn)}.animation-engine-current__dot--red{background:var(--error);color:var(--error)}.animation-engine-current__copy{display:grid;gap:4px;min-width:0}.animation-engine-current__title{font-size:16px;font-weight:700;color:var(--text-primary);letter-spacing:.02em}.animation-engine-current__meta{font-size:12px;color:var(--accent-text)}.animation-engine-current__status{font-size:11px;color:var(--text-secondary)}.animation-engine-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:8px;margin-top:8px}.animation-engine-picker--compact{grid-template-columns:repeat(auto-fill,minmax(88px,1fr))}.animation-engine-picker__toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.animation-engine-picker__size{display:inline-flex;align-items:center;gap:6px}.animation-engine-card{position:relative;display:grid;gap:6px;align-content:start;min-height:72px;padding:10px 12px;border-radius:10px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);text-align:left;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background .15s ease,transform .15s ease}.animation-engine-card:hover{border-color:#7f77dd59;transform:translateY(-1px)}.animation-engine-card--active{border-color:#7f77ddb3;background:linear-gradient(180deg,#7f77dd2e,#7f77dd0f),var(--bg-3);color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd38,0 0 0 1px #7f77dd1f,0 12px 24px #7f77dd1f}.animation-engine-card--compact{min-height:0;padding:8px 10px;grid-template-columns:auto 1fr;align-items:center;gap:8px}.animation-engine-card--compact .animation-engine-card__hint,.animation-engine-card--compact .animation-engine-card__active-tag{display:none}.animation-engine-card--add{border-style:dashed;min-height:72px;place-content:center}.animation-engine-card__dot{width:10px;height:10px;border-radius:999px;box-shadow:0 0 0 1px #ffffff1a}.animation-engine-card__dot--green{background:var(--live)}.animation-engine-card__dot--yellow{background:var(--warn)}.animation-engine-card__dot--red{background:var(--error)}.animation-engine-card--active .animation-engine-card__dot{box-shadow:0 0 0 2px #ffffff24,0 0 10px currentColor}.animation-engine-card__label{font-size:12px;font-weight:700;color:inherit}.animation-engine-card__hint{font-size:10px;line-height:1.35;color:var(--text-dim)}.animation-engine-card--active .animation-engine-card__hint{color:var(--text-secondary)}.animation-engine-card__active-tag{position:absolute;top:8px;right:8px;padding:2px 6px;border-radius:999px;background:#7f77dd47;color:var(--accent-text);font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.animation-engine-card__close{position:absolute;top:6px;right:6px;border:none;background:transparent;color:var(--text-dim);font-size:14px;line-height:1;cursor:pointer}.live-source-list{margin-top:14px;display:flex;flex-direction:column;gap:8px}.live-source-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--bg-2)}.live-source-row__meta{display:flex;flex-direction:column;gap:2px;min-width:0}.live-source-row__type{font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary)}.live-source-row__label{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:280px}.live-source-row__actions{display:flex;gap:6px;flex-shrink:0}.table{width:100%;border-collapse:collapse;font-size:13px;color:var(--text-primary)}.table th,.table td{padding:6px 8px;border-bottom:1px solid var(--border);text-align:left}.performance-deck .crossfade-deck-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}.crossfade-empty{font-size:11px;color:var(--text-secondary);padding:12px;text-align:center;border:1px dashed var(--border);border-radius:8px}.crossfade-slot-row{display:grid;grid-template-columns:1fr auto 1fr;gap:8px;align-items:start;padding:8px;margin-bottom:8px;background:var(--bg-1);border:1px solid var(--border);border-radius:8px}.crossfade-side{display:grid;gap:4px;min-width:0}.crossfade-side-label{font-size:10px;font-weight:700;color:var(--a-group)}.crossfade-side-b .crossfade-side-label{color:var(--b-group)}.crossfade-slot-meta{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:18px}.crossfade-type-pill{font-size:9px;padding:2px 6px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}.crossfade-morphed{grid-column:1 / -1;font-size:10px;color:var(--text-dim);display:flex;gap:6px;align-items:baseline}.crossfade-morphed-val{font-family:monospace;color:var(--text-secondary);word-break:break-all}.crossfade-center{padding:0 4px}.crossfade-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--text-secondary);margin-top:4px}.perf-mode-badge{font-size:10px;padding:3px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}.perf-mode-badge.mode-preview{border-color:var(--accent);color:var(--accent-text)}.perf-mode-badge.mode-animate{border-color:var(--live);color:var(--live-text)}.preview-frame-thumb{width:100%;max-height:160px;object-fit:contain;border-radius:8px;border:1px solid var(--border)}.live-hud-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;margin-top:8px}.live-hud-empty{font-size:10px;color:var(--text-dim);padding:4px 0}.top-drawer-shell{position:relative;z-index:36;width:100%;flex-shrink:0;min-height:0;pointer-events:none}.top-drawer-shell>*{pointer-events:auto}.top-drawer-shell:not(.top-drawer-shell--open) .top-drawer-panel{max-height:0;opacity:0;visibility:hidden;margin:0;padding:0;border:none}.top-drawer-fab{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(127,119,221,.42);background:linear-gradient(135deg,#08090df0,#171a27eb);color:var(--text-primary);cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,box-shadow .18s ease}.top-drawer-fab--stage{position:absolute;left:50%;top:12px;z-index:26;width:52px;min-height:34px;padding:4px 10px;transform:translate(-50%);border-radius:12px}.top-drawer-fab--stage:hover{border-color:var(--accent);color:var(--accent-text);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.preview--top-dock .top-drawer-fab--stage{top:10px}.top-drawer-fab--active{border-color:#7f77dda8;background:linear-gradient(135deg,#7f77dd47,#1e2233f5);color:var(--accent-text);box-shadow:0 14px 32px #00000070,0 0 0 1px #7f77dd3d}.top-drawer-fab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f}.top-drawer-fab__icon{width:20px;height:20px}.top-drawer-fab__icon path{stroke-width:2.4}.top-drawer-panel{width:100%;border-radius:0 0 14px 14px;border:1px solid rgba(255,255,255,.1);border-top:none;background:#11131ceb;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);overflow:hidden;max-height:0;opacity:0;visibility:hidden;transition:max-height .28s ease,opacity .22s ease,visibility .22s ease;box-shadow:0 14px 44px #00000073}.top-drawer-panel--open{max-height:min(340px,calc(100vh - var(--app-chrome-top) - 120px));opacity:1;visibility:visible;overflow-y:auto}.top-drawer-panel--open.top-drawer-panel--system,.top-drawer-panel--open.top-drawer-panel--crossfader{max-height:min(56vh,calc(100vh - var(--app-chrome-top) - 80px))}.bottom-drawer-panel--open.bottom-drawer-panel--system{max-height:min(72vh,calc(100vh - 96px))}.crossfader-panel{padding:0 10px 12px;display:flex;flex-direction:column;gap:12px}.crossfader-panel__header{flex-wrap:wrap;gap:8px;padding-top:4px}.crossfader-panel__generic{display:flex;flex-direction:column;gap:8px}.crossfader-panel__warn{margin-top:0;color:var(--warn)}.crossfader-panel__mixer{display:flex;flex-direction:column;gap:8px}.crossfader-panel__section{padding-top:4px;border-top:1px solid rgba(255,255,255,.08)}.crossfader-panel__section-title{margin:0;font-weight:600}.crossfader-panel__hint{margin:0 0 8px;font-size:10px;color:var(--text-dim);line-height:1.35}.crossfader-panel__slot-type{max-width:140px}.crossfader-panel__status{text-align:center;color:var(--success)}.crossfader-panel__footer{margin-top:0;padding-top:0}.live-bottom-drawer__tabs,.live-top-drawer__tabs{display:flex;gap:8px;padding:8px 10px;flex-wrap:wrap;background:#11131ce0;border:.5px solid rgba(255,255,255,.08);border-radius:14px 14px 0 0;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.edge-dock-host{position:fixed;inset:var(--app-chrome-top) 0 0 0;z-index:120;pointer-events:none}.edge-dock-host>*{pointer-events:auto}.edge-dock-tab{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:32px;min-height:72px;padding:8px 4px;border:1px solid rgba(255,255,255,.12);background:#0c0e16eb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);color:var(--text-secondary);cursor:pointer;font:inherit;box-shadow:0 8px 24px #00000059;transition:color .15s ease,border-color .15s ease,background .15s ease}.edge-dock-tab:hover{color:var(--text-primary);border-color:#7f77dd73;background:#161926f5}.edge-dock-tab__icon{width:18px;height:18px;flex-shrink:0}.edge-dock-tab__label{writing-mode:vertical-rl;text-orientation:mixed;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;line-height:1;max-height:72px;overflow:hidden}.edge-dock-tab--engine{position:absolute;right:0;top:36%;transform:translateY(-50%);z-index:56;border-radius:10px 0 0 10px;border-right:none}.engine-drawer-shell:not(.engine-drawer-shell--open) .edge-dock-tab--engine:not(.edge-dock-tab--inside){position:fixed;right:0;top:calc(var(--app-chrome-top) + 36%);transform:translateY(-50%)}.edge-dock-tab--engine.edge-dock-tab--inside{left:0;right:auto;transform:translate(-100%,-50%);border-radius:10px 0 0 10px;border-right:none;border-left:1px solid rgba(255,255,255,.12)}.engine-drawer-shell:not(.engine-drawer-shell--open) .edge-dock-tab--engine{pointer-events:auto}.engine-drawer-shell--open .edge-dock-tab--engine:not(.edge-dock-tab--inside){visibility:hidden;pointer-events:none}.engine-drawer-shell .edge-dock-tab--engine.edge-dock-tab--inside{visibility:visible;pointer-events:auto}.edge-dock-tab--context,.edge-dock-tab--engine,.edge-dock-tab--layers{z-index:55;pointer-events:auto}.edge-dock-tab--panel-open{color:var(--accent-text);border-color:color-mix(in srgb,var(--accent) 50%,rgba(255,255,255,.12));background:#161926fa}@media (min-width: 1360px){.layout:not(.layout--edge-overlay){--edge-left-reserve: 0px;--edge-right-reserve: 0px}.layout.layout--edge-layers-open:not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(188px, 18vw))}.layout.layout--edge-engine-open:not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(420px, 32vw))}.layout.layout--edge-context-open:not(.layout--edge-context-left):not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(420px, 32vw))}.layout.layout--edge-context-left:not(.layout--edge-overlay){--edge-left-reserve: calc(var(--edge-left-reserve, 0px) + min(420px, 32vw))}.layout:not(.layout--edge-overlay) .preview{margin-left:var(--edge-left-reserve, 0px);margin-right:var(--edge-right-reserve, 0px);transition:margin .32s cubic-bezier(.4,0,.2,1)}}.layout.layout--edge-overlay .edge-dock-host .engine-drawer-panel,.layout.layout--edge-overlay .edge-dock-host .live-right-column,.layout.layout--edge-overlay .edge-dock-host .layers-sidebar.layers-sidebar--open{background:#0a0c14ad;backdrop-filter:blur(18px) saturate(1.12);-webkit-backdrop-filter:blur(18px) saturate(1.12)}.live-right-column--overlay{background:#0a0c14ad!important;backdrop-filter:blur(18px) saturate(1.12);-webkit-backdrop-filter:blur(18px) saturate(1.12)}.preview-stage-row{position:relative;display:block;flex:1 1 auto;min-height:0;width:100%;overflow:hidden;isolation:isolate}.preview-stage-main{position:relative;z-index:1;width:100%;max-width:100%;min-width:0;display:flex;flex-direction:column;min-height:0;gap:0}.preview-stage-row--engine-dock .preview-stage-main{width:100%;max-width:100%}.preview-stage-video-stack{position:relative;flex:1 1 auto;min-height:0;min-width:0;display:flex;flex-direction:column}.preview-stage-video-stack>.video-wrap{flex:0 0 auto;min-height:0}.edge-dock-host .layers-sidebar{position:fixed;right:0;left:auto;top:var(--app-chrome-top);bottom:0;z-index:35;transform:none;display:flex;flex-direction:column;gap:8px;width:40px;padding:8px 4px;border-radius:0;border:1px solid rgba(255,255,255,.1);border-right:none;border-top:none;border-bottom:none;background:#08090de0;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:width .3s cubic-bezier(.4,0,.2,1),right .32s cubic-bezier(.4,0,.2,1);overflow:visible;pointer-events:auto}.layout.layout--edge-engine-open .edge-dock-host .layers-sidebar{right:var(--engine-drawer-width, min(420px, 36vw))}.layers-sidebar--open{width:min(188px,28vw);padding:10px 8px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__list{gap:6px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__item,.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__add{justify-content:center;padding:6px 4px;min-height:28px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__active-badge{display:flex;justify-content:center;padding:4px 0 6px;border-bottom:1px solid rgba(255,255,255,.08)}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__active-name{display:none}.edge-dock-host .layers-sidebar__toggle.edge-dock-tab--layers{flex:none;width:100%;min-height:72px;margin:0 auto;border-radius:10px 0 0 10px;border-right:none}.edge-dock-host .layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__toggle.edge-dock-tab--layers{position:fixed;right:0;left:auto;top:calc(var(--app-chrome-top) + 28%);transform:translateY(-50%);width:32px;z-index:56}.layout.layout--edge-engine-open .edge-dock-host .layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__toggle.edge-dock-tab--layers{right:var(--engine-drawer-width, min(420px, 36vw))}.edge-dock-host .layers-sidebar--open .layers-sidebar__toggle.edge-dock-tab--layers{position:relative;right:auto;top:auto;transform:none;width:100%;border-radius:8px;border:1px solid rgba(255,255,255,.12);border-right:none}.layers-sidebar__active-badge{display:none;align-items:center;gap:8px;padding:4px 2px 6px;border-bottom:1px solid rgba(255,255,255,.08)}.layers-sidebar--open .layers-sidebar__active-badge{display:flex}.layers-sidebar__active-name{font-size:12px;font-weight:700;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layers-sidebar__list{display:flex;flex-direction:column;gap:4px}.layers-sidebar__item,.layers-sidebar__add{display:inline-flex;align-items:center;gap:8px;width:100%;min-height:34px;padding:6px 8px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--text-secondary);cursor:pointer;font:inherit;text-align:left}.layers-sidebar__item-label{display:none;font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layers-sidebar--open .layers-sidebar__item-label{display:inline}.layers-sidebar__item--active{border-color:color-mix(in srgb,var(--accent) 45%,transparent);background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent-text)}.layers-sidebar__add-icon{font-size:18px;font-weight:700;line-height:1;width:20px;text-align:center}.engine-drawer-shell{--engine-drawer-width: min(420px, 36vw);position:fixed;top:var(--app-chrome-top);right:0;bottom:0;left:auto;flex:none;width:0;min-width:0;max-width:none;overflow:visible;z-index:45;pointer-events:none;transition:width .32s cubic-bezier(.4,0,.2,1)}.engine-drawer-shell--open{width:var(--engine-drawer-width);pointer-events:auto}.engine-drawer-panel{width:var(--engine-drawer-width);min-width:var(--engine-drawer-width);height:100%;max-height:100%;overflow-x:hidden;overflow-y:auto;border-radius:14px 0 0 14px;border:1px solid rgba(255,255,255,.1);border-right:none;background:#11131cf0;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:-12px 0 32px #00000073;transform:translate(100%);opacity:0;transition:transform .32s cubic-bezier(.4,0,.2,1),opacity .24s ease;will-change:transform}.engine-drawer-shell--open .engine-drawer-panel{transform:translate(0);opacity:1}.animation-engine-panel{display:flex;flex-direction:column;gap:8px;padding:8px 10px 12px;min-height:0}.animation-engine-panel__tabs{flex-shrink:0;display:grid;grid-template-columns:1fr 1fr;gap:0;margin-top:10px;padding:4px;border-radius:12px;border:1px solid var(--border);background:var(--bg-0)}.animation-engine-panel__tab{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:9px;padding:12px 14px;font-size:13px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary);background:transparent;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}.animation-engine-panel__tab:hover{color:var(--text-primary);background:color-mix(in srgb,var(--accent) 8%,transparent)}.animation-engine-panel__tab.active{color:var(--text-primary);background:color-mix(in srgb,var(--accent) 22%,var(--bg-1));box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.animation-engine-panel .rack{margin:0}.animation-engine-panel .live-engine-controls{margin-top:4px}.animation-engine-panel__controls{margin-top:8px;border-top:.5px solid var(--border);padding-top:8px}.animation-engine-panel__head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-shrink:0}.animation-engine-layer-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.animation-engine-layer-row{display:flex;flex-direction:column;gap:8px;padding:8px;border-radius:12px;border:1px solid rgba(255,255,255,.06);background:#08090d59}.animation-engine-layer-row--active{border-color:color-mix(in srgb,var(--accent) 35%,rgba(255,255,255,.06));background:color-mix(in srgb,var(--accent) 8%,rgba(8,9,13,.35))}.animation-engine-layer-row__top{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.animation-engine-layer-row--hidden .animation-engine-layer-row__select,.animation-engine-layer-row--hidden .animation-engine-layer-row__mix{opacity:.55}.animation-engine-layer-row__main{display:flex;flex-direction:column;gap:6px;min-width:0}.animation-engine-layer-row__select{display:flex;align-items:center;gap:10px;min-width:0;padding:10px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.1);background:#08090d8c;color:var(--text-primary);cursor:pointer;text-align:left;font:inherit}.animation-engine-layer-row__select--active,.animation-engine-layer-row--active .animation-engine-layer-row__select{border-color:color-mix(in srgb,var(--accent) 55%,rgba(255,255,255,.1));background:color-mix(in srgb,var(--accent) 14%,rgba(8,9,13,.55))}.animation-engine-layer-row__label{font-weight:700;font-size:15px;letter-spacing:.01em}.animation-engine-layer-row__status{margin-left:auto;font-size:12px;font-weight:600;color:var(--text-secondary);white-space:nowrap}.animation-engine-layer-row__visibility-toggle{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:56px;min-width:56px;padding:10px 6px;border-radius:12px;border:1px solid rgba(255,255,255,.12);background:#08090db8;color:var(--text-dim);cursor:pointer;font:inherit;transition:border-color .15s,background .15s,color .15s,box-shadow .15s}.animation-engine-layer-row__visibility-toggle:hover{border-color:#ffffff38;color:var(--text-secondary)}.animation-engine-layer-row__visibility-toggle--on{border-color:color-mix(in srgb,var(--live) 55%,rgba(255,255,255,.12));background:color-mix(in srgb,var(--live) 16%,rgba(8,9,13,.72));color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 28%,transparent)}.animation-engine-layer-row__visibility-icon{width:22px;height:22px}.animation-engine-layer-row__visibility-label{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.animation-engine-layer-row__mix{display:flex;flex-direction:column;gap:4px;padding:0 2px 2px}.animation-engine-layer-row__mix-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.animation-engine-layer-row__mix-label,.animation-engine-layer-row__opacity-value{font-size:11px;color:var(--text-dim);letter-spacing:.04em;text-transform:uppercase;font-weight:700}.animation-engine-layer-row__opacity-value{color:var(--text-secondary);font-variant-numeric:tabular-nums}.animation-engine-layer-row__opacity-slider{width:100%;margin:0}.animation-engine-layer-row__controls{border-radius:10px;border:1px solid rgba(255,255,255,.08);background:#0000002e;overflow:hidden}.animation-engine-layer-row__controls-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.animation-engine-layer-row__controls-summary::-webkit-details-marker{display:none}.animation-engine-layer-row__controls-summary:hover{color:var(--text-primary);background:#ffffff08}.animation-engine-layer-row__controls-chevron{width:16px;height:16px;flex-shrink:0;transition:transform .18s ease}.animation-engine-layer-row__controls[open] .animation-engine-layer-row__controls-chevron{transform:rotate(180deg)}.animation-engine-layer-row__controls-body{padding:0 10px 12px;border-top:1px solid rgba(255,255,255,.06)}.engine-layer-controls{margin-top:10px;min-width:0}.engine-layer-controls__hint{margin:0 0 10px;line-height:1.4}.engine-layer-controls .deforum-job-panel.rack{margin:0;padding:0;border:none;background:transparent;box-shadow:none}.engine-layer-controls .deforum-job-panel__head{margin-bottom:8px}.engine-layer-controls .deforum-settings-body{max-height:min(60vh,480px);overflow-y:auto;padding-right:2px}.engine-layer-controls .live-engine-controls{margin-top:0}.animation-engine-panel__compositor-section{margin-top:12px;border-radius:12px;border:1px solid rgba(255,255,255,.08);background:#08090d59;overflow:hidden}.animation-engine-panel__compositor-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.animation-engine-panel__compositor-summary::-webkit-details-marker{display:none}.animation-engine-panel__compositor-summary:hover{color:var(--text-primary);background:#ffffff08}.animation-engine-panel__compositor-chevron{width:16px;height:16px;flex-shrink:0;transition:transform .18s ease}.animation-engine-panel__compositor-section[open] .animation-engine-panel__compositor-chevron{transform:rotate(180deg)}.animation-engine-panel__compositor-body{padding:0 10px 12px;border-top:1px solid rgba(255,255,255,.06)}.compositor-panel{display:flex;flex-direction:column;gap:12px;min-height:0}.compositor-panel__head{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:12px;border:1px solid color-mix(in srgb,var(--accent) 28%,var(--border));background:linear-gradient(135deg,#7f77dd1a,#08090d8c)}.compositor-panel__icon{width:24px;height:24px;flex-shrink:0;color:var(--accent-text);margin-top:2px}.compositor-panel__title{margin:0;font-size:16px;font-weight:700;letter-spacing:.02em;color:var(--text-primary)}.compositor-panel__subtitle{margin:4px 0 0;font-size:12px;line-height:1.4;color:var(--text-secondary)}.compositor-panel__cards{display:flex;flex-direction:column;gap:10px}.compositor-card{padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.08);background:#08090d7a}.compositor-card__row{display:flex;align-items:center;justify-content:space-between;gap:12px}.compositor-card__copy{display:flex;flex-direction:column;gap:4px;min-width:0}.compositor-card__label{font-size:14px;font-weight:700;color:var(--text-primary)}.compositor-card__hint{font-size:12px;line-height:1.35;color:var(--text-secondary)}.compositor-card__hint--block{margin:6px 0 10px}.compositor-card__value{font-family:var(--mono);font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--accent-text)}.compositor-card--slider{display:flex;flex-direction:column;gap:10px}.compositor-card__slider-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.compositor-card__range{width:100%;margin:0}.compositor-card--action{padding:10px 14px}.compositor-panel__promote{width:100%;justify-content:center;font-size:14px;font-weight:700}.compositor-big-toggle{display:inline-flex;flex-direction:column;align-items:center;gap:6px;flex-shrink:0;padding:8px 10px;border:1px solid rgba(255,255,255,.12);border-radius:12px;background:#00000038;color:var(--text-dim);cursor:pointer;font:inherit;transition:border-color .15s,background .15s,color .15s}.compositor-big-toggle:hover{border-color:#ffffff38;color:var(--text-secondary)}.compositor-big-toggle--on{border-color:color-mix(in srgb,var(--live) 55%,rgba(255,255,255,.12));background:color-mix(in srgb,var(--live) 14%,rgba(0,0,0,.22));color:var(--live-text)}.compositor-big-toggle__track{position:relative;width:44px;height:24px;border-radius:999px;background:#ffffff1f;transition:background .15s}.compositor-big-toggle--on .compositor-big-toggle__track{background:color-mix(in srgb,var(--live) 70%,rgba(255,255,255,.12))}.compositor-big-toggle__thumb{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 4px #00000059;transition:transform .15s}.compositor-big-toggle--on .compositor-big-toggle__thumb{transform:translate(20px)}.compositor-big-toggle__label{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.compositor-lfo-grid{display:flex;flex-wrap:wrap;gap:8px}.compositor-lfo-chip{padding:10px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.1);background:#0003;color:var(--text-secondary);cursor:pointer;font:inherit;font-size:13px;font-weight:700;transition:border-color .15s,color .15s,background .15s}.compositor-lfo-chip:hover{border-color:#fff3;color:var(--text-primary)}.compositor-lfo-chip.active{border-color:color-mix(in srgb,var(--accent) 55%,rgba(255,255,255,.1));background:color-mix(in srgb,var(--accent) 20%,rgba(0,0,0,.2));color:var(--accent-text)}.animation-engine-panel__details{margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.08);display:flex;flex-direction:column;gap:10px;min-height:0}.animation-engine-panel__preload-hint{margin:4px 0 0;font-size:10px;color:var(--text-dim)}.engine-drawer-fab{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(127,119,221,.42);background:linear-gradient(135deg,#08090df0,#171a27eb);color:var(--text-primary);cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,box-shadow .18s ease}.engine-drawer-fab--stage{position:absolute;right:0;top:50%;z-index:35;width:40px;min-height:72px;padding:4px 6px;transform:translate(50%,-50%);border-radius:12px 0 0 12px;flex-shrink:0;transition:transform .32s cubic-bezier(.4,0,.2,1),border-radius .2s ease}.preview-stage-row--engine-dock .engine-drawer-fab--stage{transform:translateY(-50%);border-radius:12px 0 0 12px}.engine-drawer-fab--stage:hover{border-color:var(--accent);color:var(--accent-text);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.engine-drawer-fab--active{border-color:#7f77dda8;background:linear-gradient(135deg,#7f77dd47,#1e2233f5);color:var(--accent-text)}.engine-drawer-fab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f}.engine-drawer-fab__icon{width:20px;height:20px}.engine-drawer-fab__icon path{stroke-width:2.4}@media (prefers-reduced-motion: reduce){.preview-stage-main,.engine-drawer-shell,.engine-drawer-panel,.engine-drawer-fab--stage{transition-duration:.01ms!important}}.preview--engine-dock .video-wrap--anchored .video-wrap__stage{max-height:min(38vh,56.25vw)}.preview--engine-dock.preview--top-dock .video-wrap--anchored .video-wrap__stage{max-height:min(30vh,56.25vw)}.top-drawer-system.system-runs-tab{max-height:calc(72vh - 52px);min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:0 10px 10px}.top-drawer-system.system-runs-tab .runs-browser{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;gap:8px}.top-drawer-system.system-runs-tab .runs-browser__panel{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.top-drawer-system.system-runs-tab .runs-browser__table-wrap{flex:1;min-height:0;max-height:none}.top-drawer-system.system-runs-tab .runs-detail-card,.top-drawer-system.system-runs-tab .runs-compare-card{flex-shrink:0;max-height:min(32vh,280px);overflow-y:auto}.live-mod-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px}.live-mod-slot{border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#08090d8c;padding:10px;display:grid;gap:8px;min-width:0}.live-mod-slot__head{display:flex;align-items:center;gap:8px;min-width:0}.live-mod-slot__map{display:inline-flex;align-items:center;gap:4px;min-width:0;font-size:9px;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-mod-slot__actions{margin-left:auto;display:inline-flex;gap:6px;flex-shrink:0}.live-mod-slot__actions .framesync-button{width:30px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center}.live-mod-slider{border-radius:10px;border:1px solid rgba(255,255,255,.08);padding:8px;background:color-mix(in srgb,rgba(127,119,221,.2) var(--shade),rgba(29,158,117,.12))}.live-mod-slider__readout{margin-top:6px;font-size:10px;color:var(--text-secondary);font-variant-numeric:tabular-nums;text-align:right}.live-mod-pad{position:relative;height:86px;border-radius:12px;border:1px solid rgba(255,255,255,.1);background:radial-gradient(circle at 50% 35%,#7f77dd33,#08090d99);overflow:hidden;cursor:crosshair}.live-mod-pad__crosshair{position:absolute;left:50%;top:0;bottom:0;width:1px;background:#ffffff1a}.live-mod-pad__crosshair--y{left:0;right:0;top:50%;height:1px;width:auto}.live-mod-pad__puck{position:absolute;width:12px;height:12px;border-radius:999px;background:var(--accent-text);box-shadow:0 0 10px #7f77dd59;transform:translate(-50%,-50%)}.live-mod-pad__axes{display:flex;justify-content:space-between;font-variant-numeric:tabular-nums}.live-mod-knob__readout{margin-top:6px;font-size:10px;color:var(--text-secondary);text-align:right;font-variant-numeric:tabular-nums}.restore-session-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:grid;place-items:center;padding:18px;background:#0000008c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.restore-session-modal__dialog{width:min(520px,100%)}.live-active-mod-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:start}.live-active-mod-row__param{min-width:0}.live-active-mod-row__remove{width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.live-main-dock__panel--crossfader{display:grid;gap:10px}.live-main-crossfader__summary{display:grid;gap:6px}.live-main-crossfader__builder{margin-top:2px}.live-hud-pinned{min-width:0}.live-hud-morph__slots{display:grid;gap:4px;margin-bottom:8px}.live-hud-morph__slot{display:inline-flex;align-items:center;border:.5px solid var(--border);border-radius:999px;padding:3px 8px;font-size:9px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-hud-morph__slot--a{border-color:color-mix(in srgb,var(--a-group) 45%,var(--border));color:var(--a-group)}.live-hud-morph__slot--b{border-color:color-mix(in srgb,var(--b-group) 45%,var(--border));color:var(--b-group)}.param-drawer{padding:0;overflow:hidden}.param-drawer-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;background:var(--bg-1);border:none;border-bottom:1px solid var(--border);color:var(--text-primary);cursor:pointer;font-size:13px;font-weight:600}.param-drawer-label{display:inline-flex;align-items:center;gap:6px;min-width:0}.param-drawer-label-icon{font-size:14px;color:var(--warn)}.param-drawer-chevron{font-size:14px;color:var(--text-secondary)}.param-drawer-body{padding:12px}.model-source-pill{display:inline-flex;align-items:center;gap:5px;font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border);white-space:nowrap}.model-source-pill__dot{width:6px;height:6px;border-radius:50%;background:var(--border);flex-shrink:0}.model-source-pill--forge{color:var(--live-text);border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.model-source-pill--forge .model-source-pill__dot{background:var(--live)}.model-source-pill--cache{color:var(--warn-text);border-color:color-mix(in srgb,var(--warn) 35%,var(--border))}.model-source-pill--cache .model-source-pill__dot{background:var(--warn)}.model-source-pill--placeholder{color:var(--error-text);border-color:color-mix(in srgb,var(--error) 35%,var(--border))}.model-source-pill--placeholder .model-source-pill__dot{background:var(--error)}.modulation-audio-tab__intro{margin-top:8px;margin-bottom:4px;color:var(--text-secondary)}.param-lock-btn{border:none;background:transparent;cursor:pointer;font-size:10px;opacity:.55;padding:0 2px}.param-lock-btn.active{opacity:1;color:var(--warn)}.param-pin-btn{border:none;background:transparent;cursor:pointer;font-size:10px;opacity:.25;padding:0 2px;transition:opacity .15s}.param-pin-btn:hover{opacity:.65}.param-pin-btn.active{opacity:1}.param-group--pinned{border:.5px solid var(--border);border-radius:var(--radius-sm);padding:8px;background:#1d9e750a;margin-bottom:8px}.param-locked input[type=range]{opacity:.45}.gpu-pool-enable{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary);cursor:pointer;min-height:34px}.gpu-pool-healthy-count{font-size:13px;color:var(--live-text);padding:6px 0;min-height:34px;display:flex;align-items:center}.gpu-forge-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:140;display:grid;place-items:center;padding:24px;background:#06080cb8;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.gpu-forge-modal__dialog{width:min(860px,calc(100vw - 32px));max-height:min(88vh,900px);overflow:auto;padding:18px;border:1px solid var(--border-strong);border-radius:16px;background:radial-gradient(circle at top right,rgba(127,119,221,.16),transparent 28%),#0d1017f5;box-shadow:0 28px 60px #0000006b}.gpu-forge-modal__header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.gpu-forge-modal__subtitle{margin-top:4px}.gpu-pool-table{width:100%;border-collapse:collapse;font-size:11px}.gpu-pool-table th{text-align:left;padding:8px;color:var(--text-dim);border-bottom:1px solid var(--border)}.gpu-pool-table td{padding:8px;border-bottom:1px solid var(--border);vertical-align:top;color:var(--text-primary)}.gpu-pool-table-wrap{max-height:420px;overflow:auto;border:1px solid var(--border);border-radius:10px}.gpu-row-disabled{opacity:.85}.gpu-status-pill{font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border)}.gpu-status-pill.st-healthy{color:var(--live-text);border-color:var(--live)}.gpu-status-pill.st-unhealthy{color:var(--danger)}.gpu-status-pill.st-disabled,.gpu-status-pill.st-unknown{color:var(--text-dim)}.generate-story__story-result{margin-top:12px;border:1px solid var(--border);border-radius:12px;padding:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),#0d1017b8;box-shadow:0 8px 18px #0000002e}.generate-story__ollama-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}.generate-story__ollama-status{font-size:12px;font-weight:600;letter-spacing:.02em}.generate-story__ollama-status--ready{color:var(--ok, #5dffb0)}.generate-story__ollama-status--warn{color:var(--warn, #ffb347)}.generate-story__ollama-status--off{color:var(--text-dim, #8a9bb0)}.generate-story__config{display:grid;gap:12px;margin-top:12px}.generate-story__theme-input{min-height:44px;font-size:14px}.generate-story__controls-grid{margin-top:0}.generate-story__actions{margin-top:12px}.generate-story__section-title{margin:0}.generate-story__preview{margin-top:12px;border:1px solid var(--border);border-radius:12px;padding:12px;background:var(--bg-1)}.generate-story__image-wrap{margin-top:10px;border-radius:10px;overflow:hidden;border:1px solid var(--border);background:#0000003d}.generate-story__image{display:block;width:100%;height:auto}.generate-sequencer__hero-value--compact{font-size:16px;line-height:1.2;font-weight:700;word-break:break-word}.generate-story__story-text{margin:10px 0 0;padding:12px;border-radius:8px;background:var(--bg-1);border:1px solid rgba(255,255,255,.05);font-size:11px;line-height:1.55;color:var(--text-secondary);white-space:pre-wrap;max-height:320px;overflow:auto}.deforum-settings-drawer{margin-top:8px}.deforum-settings-hint{font-size:11px;color:var(--text-secondary);font-weight:400;flex:1;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px}.deforum-settings-body{max-height:min(70vh,520px);overflow-y:auto}.deforum-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:0;margin-bottom:10px;padding:4px;border-radius:12px;border:1px solid var(--border);background:var(--bg-0)}.deforum-mode-toggle__btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:9px;padding:14px 16px;font-size:15px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);background:transparent;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}.deforum-mode-toggle__btn:hover:not(:disabled){color:var(--text);background:color-mix(in srgb,var(--accent) 8%,transparent)}.deforum-mode-toggle__btn.active{color:var(--text);background:color-mix(in srgb,var(--accent) 22%,var(--bg-1));box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.deforum-mode-toggle__hint{margin:0 0 10px;font-size:12px;color:var(--text-secondary)}.sub-pill--disabled,.sub-pill:disabled{opacity:.45;cursor:not-allowed}.deforum-settings-tabs{margin-bottom:10px;flex-wrap:wrap}.deforum-settings-panel{margin-top:10px;padding:10px;background:var(--bg-1)}.deforum-settings-toolbar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:10px}.deforum-advanced-toggle{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-secondary);margin-left:auto}.deforum-json-editor{font-family:ui-monospace,Cascadia Code,monospace;font-size:11px;line-height:1.4;min-height:200px}.deforum-json-error{font-size:11px;color:var(--danger);margin:6px 0 0}.deforum-verify-results{margin:10px 0 0;padding:10px 12px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);font-size:11px}.deforum-verify-results--ok{color:var(--live-text);border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.deforum-verify-results__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.deforum-verify-results__counts{display:flex;gap:6px;flex-wrap:wrap}.deforum-verify-results__badge{font-size:10px;font-weight:600;padding:2px 8px;border-radius:999px;text-transform:uppercase;letter-spacing:.04em}.deforum-verify-results__badge--error{color:var(--danger);border:1px solid color-mix(in srgb,var(--danger) 40%,transparent);background:color-mix(in srgb,var(--danger) 12%,transparent)}.deforum-verify-results__badge--warn{color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 40%,transparent);background:color-mix(in srgb,var(--warn) 10%,transparent)}.deforum-verify-results__list{margin:0 0 8px;padding-left:18px;display:grid;gap:6px}.deforum-verify-results__list:last-child{margin-bottom:0}.deforum-verify-results__list--error{color:color-mix(in srgb,var(--danger) 85%,var(--text))}.deforum-verify-results__list--warn{color:color-mix(in srgb,var(--warn) 90%,var(--text))}.deforum-verify-results__hint{display:block;margin-top:2px;color:var(--text-dim);font-size:10px}.deforum-settings-group{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:#031b2d59}.deforum-settings-group-title{padding:8px 10px;font-size:12px;font-weight:600;color:var(--text-primary);cursor:pointer;list-style:none}.deforum-settings-group-title::-webkit-details-marker{display:none}.deforum-settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 12px}@media (max-width: 900px){.deforum-settings-grid{grid-template-columns:1fr}}.deforum-field{display:flex;flex-direction:column;gap:4px;min-width:0}.deforum-field.deforum-field-textarea{grid-column:1 / -1}.deforum-field-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.deforum-field-label{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em}.deforum-field-toggle{display:inline-flex;align-items:center;gap:6px;font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.04em}.deforum-field-toggle .chip--compact{padding:2px 8px;font-size:9px;min-height:20px}.deforum-field-slider{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:center}.deforum-field-slider__value{font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text-primary);min-width:3.25rem;text-align:right;flex-shrink:0}.deforum-field-number .framesync-input[type=number]{width:100%;max-width:8rem;font-variant-numeric:tabular-nums}.deforum-field-bool{margin-top:2px}.deforum-field--mode-locked .deforum-field-label:after{content:" · 3D only";font-size:10px;font-weight:500;opacity:.65}.deforum-field--disabled{opacity:.72}.morph-blend-bar{padding:0 2px}.morph-blend-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--text-secondary);margin-top:4px}.morph-slot-weights{display:flex;flex-direction:column;gap:12px}.morph-crossfader-panel{margin-top:14px;padding:10px;border:1px solid var(--border);border-radius:10px;background:#031b2d4d;--crossfade-a-weight: .5;--crossfade-b-weight: .5}.morph-crossfader-hero{display:grid;gap:10px;margin-bottom:14px;padding:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(90deg,color-mix(in srgb,var(--a-group) calc(var(--crossfade-a-weight) * 18%),transparent),transparent 42%,transparent 58%,color-mix(in srgb,var(--b-group) calc(var(--crossfade-b-weight) * 18%),transparent)),var(--bg-1);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 24px) color-mix(in srgb,var(--a-group) 16%,transparent),inset 0 0 calc(var(--crossfade-b-weight) * 24px) color-mix(in srgb,var(--b-group) 16%,transparent)}.morph-crossfader-hero__header{margin-bottom:0}.morph-crossfader-hero__readout{font-size:11px;color:var(--text-secondary)}.generate-dock-sync{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:10px;padding:8px 10px;border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-3)}.generate-dock-sync__metric{display:flex;flex-direction:column;gap:2px;min-width:0}.generate-dock-sync__label{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.generate-dock-sync__value{font-size:11px;color:var(--live-text)}.morph-crossfader-deck--split{grid-template-columns:1fr 1fr;margin-top:0}.morph-crossfader-deck__side{transition:border-color .08s linear,box-shadow .08s linear,background .08s linear,opacity .08s linear}.morph-crossfader-deck__side--a{opacity:calc(.55 + var(--crossfade-a-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 28px) color-mix(in srgb,var(--a-group) 28%,transparent),0 0 calc(var(--crossfade-a-weight) * 20px) color-mix(in srgb,var(--a-group) 22%,transparent)}.morph-crossfader-deck__side--b{opacity:calc(.55 + var(--crossfade-b-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-b-weight) * 28px) color-mix(in srgb,var(--b-group) 28%,transparent),0 0 calc(var(--crossfade-b-weight) * 20px) color-mix(in srgb,var(--b-group) 22%,transparent)}.morph-crossfader-deck__side--dominant{opacity:1}.morph-crossfader-deck__weight{font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}.morph-crossfader-deck__side--a .morph-crossfader-deck__weight{color:var(--a-group);text-shadow:0 0 calc(var(--crossfade-a-weight) * 12px) color-mix(in srgb,var(--a-group) 65%,transparent)}.morph-crossfader-deck__side--b .morph-crossfader-deck__weight{color:var(--b-group);text-shadow:0 0 calc(var(--crossfade-b-weight) * 12px) color-mix(in srgb,var(--b-group) 65%,transparent)}.morph-crossfader-mini{margin-top:12px;display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:10px;background:#031b2d2e}.morph-slot-weight-row{display:grid;gap:12px;padding:12px;border:1px solid rgba(58,61,76,.9);border-radius:14px;background:radial-gradient(circle at 0% 50%,rgba(55,138,221,.12),transparent 42%),radial-gradient(circle at 100% 50%,rgba(232,121,176,.14),transparent 42%),linear-gradient(180deg,#0c111cf2,#060b14eb);box-shadow:inset 0 0 0 1px #ffffff08,0 12px 28px #0000002e;position:relative;overflow:hidden}.morph-slot-weight-row:after{content:"";position:absolute;inset:auto 0 0 0;height:2px;background:linear-gradient(90deg,#378add8c,#7f77ddbf,#e879b08c);opacity:.28}.morph-slot-weight-row.inactive{opacity:.45}.morph-slot-weight-row--flowing{border-color:#7f77ddbf;box-shadow:inset 0 0 0 1px #7f77dd33,0 16px 32px #0003}.morph-slot-weight-row--waiting{border-style:dashed}.morph-slot-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.morph-slot-weight-name{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-primary);min-width:0}.morph-slot-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.morph-slot-chip{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 10px;border-radius:999px;border:1px solid rgba(58,61,76,.95);background:#0a101ce0;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.morph-slot-chip--range{border-color:#378add59;color:var(--a-group)}.morph-slot-chip--weight{border-color:#7f77dd59;color:var(--accent-text)}.morph-slot-chip--active{border-color:#1d9e7573;color:var(--live-text);box-shadow:0 0 14px #1d9e7524}.morph-slot-chip--idle{color:var(--text-dim)}.morph-slot-flow{display:grid;grid-template-columns:minmax(0,1fr) minmax(180px,240px) minmax(0,1fr);gap:12px;align-items:stretch}.morph-slot-lane{display:grid;gap:6px;min-width:0;padding:10px;border:1px solid rgba(58,61,76,.95);border-radius:12px;background:#080d17d1;box-shadow:inset 0 0 0 1px #ffffff05}.morph-slot-lane--a{border-color:#378add6b}.morph-slot-lane--b{border-color:#e879b06b}.morph-slot-editor__label{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.06em}.morph-slot-editor__input{min-width:0}.morph-slot-flow__bridge{display:grid;align-content:center;gap:10px;min-width:0}.morph-slot-flow__track{position:relative;height:10px;border-radius:999px;background:linear-gradient(90deg,#378add47,#7f77dd80 50%,#e879b047);border:1px solid rgba(58,61,76,.95);overflow:hidden}.morph-slot-flow__glow{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,#378add73,#7f77dde6,#e879b073);opacity:.55}.morph-slot-flow__marker{position:absolute;top:50%;left:var(--morph-flow-progress, 50%);width:18px;height:18px;border-radius:50%;border:2px solid rgba(230,232,240,.95);background:radial-gradient(circle,#fffffff2,#7f77ddf2 38%,#151928f2);box-shadow:0 0 18px #7f77dd73;transform:translate(-50%,-50%)}.morph-slot-flow__readout{display:grid;gap:6px;justify-items:center;text-align:center}.morph-slot-flow__mix{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-group)}.morph-slot-flow__mix--b{color:var(--b-group)}.morph-slot-flow__preview{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:6px 12px;border-radius:999px;border:1px solid rgba(127,119,221,.45);background:#7f77dd24;color:var(--accent-text);font-size:11px;font-weight:600;line-height:1.35;max-width:100%}.morph-slot-weight-slider{width:100%}.morph-crossfader-links{justify-content:flex-end}.morph-crossfader-status{display:block;margin-top:8px;color:var(--text-secondary)}.morph-crossfader-panel__summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:0}.morph-crossfader-deck{margin-top:8px}.prompt-ab-column__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.morph-crossfader__section{margin-bottom:14px}.morph-crossfader__section-label{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);margin-bottom:8px}.morph-crossfader__card{margin-bottom:8px}.morph-crossfader__card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:6px}.morph-crossfader__card-body{display:grid;gap:6px;margin-top:6px}.morph-crossfader__textarea{min-height:52px;resize:vertical}.morph-crossfader__remove{flex-shrink:0;padding:2px 6px;min-width:0}.morph-crossfader__morphed{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:10px}.morph-crossfader-center__add{display:flex;flex-wrap:wrap;gap:8px;margin-top:0;align-items:center}.morph-crossfader-center__add .framesync-select{flex:1;min-width:120px}.modulation-active-mods__list{display:grid;gap:8px;margin-top:12px}.modulation-audio-dropzone{margin-top:14px;padding:22px 16px;border-radius:12px;border:1.5px dashed rgba(127,119,221,.45);background:#090d188c;text-align:center;cursor:pointer;transition:border-color .15s,background .15s}.modulation-audio-dropzone:hover,.modulation-audio-dropzone--filled{border-color:#50fa7b8c;background:#0c1220bf}.modulation-audio-dropzone__input{display:none}.modulation-audio-dropzone__title{display:block;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--text)}.modulation-audio-dropzone__hint{display:block;margin-top:6px;font-size:11px;color:var(--text-dim)}.modulation-audio-sync-settings{margin-top:8px;padding-top:8px;border-top:.5px solid var(--border)}.modulation-audio-sync-settings__lead{display:flex;align-items:center;gap:10px;margin-top:10px}.modulation-audio-sync-settings__lead .framesync-input{max-width:120px}.modulation-mappings__toolbar{display:flex;justify-content:flex-end;margin-bottom:10px}.modulation-mappings__group-tabs{margin-bottom:12px;flex-wrap:wrap}.modulation-mappings__rows{display:grid;gap:10px}.modulation-mapping-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px 10px;padding:10px 12px;border-radius:10px;border:.5px solid var(--border);background:#080a12a6;opacity:.72}.modulation-mapping-row--mapped{opacity:1;border-color:#50fa7b59}.modulation-mapping-row__head{grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}.modulation-mapping-row__label{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-dim)}.modulation-mapping-row--mapped .modulation-mapping-row__label{color:var(--live)}.modulation-mapping-row__badges{display:flex;flex-wrap:wrap;gap:4px}.modulation-mapping-row__control{display:flex;align-items:center;gap:8px;min-width:0}.modulation-mapping-row__slider{flex:1;min-width:0}.modulation-mapping-row__value{font-size:10px;min-width:3.5em;text-align:right}.modulation-mapping-row__actions{display:flex;gap:6px;align-items:center}.modulation-map-picker{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:flex;align-items:center;justify-content:center;padding:16px;background:#04060cb8}.modulation-map-picker__dialog{width:min(420px,100%);max-height:min(80vh,520px);overflow:auto}.modulation-map-picker__slots{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}.modulation-map-picker__slot.active{border-color:#50fa7b99;color:var(--live)}.modulation-map-picker__lfo-list{display:grid;gap:8px;margin-top:12px}.modulation-map-picker__lfo{display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;padding:10px 12px;border-radius:10px;border:.5px solid var(--border);background:#080a12cc;cursor:pointer}.modulation-map-picker__lfo--on{border-color:#50fa7b66}.modulation-map-picker__lfo-title{font-size:12px;font-weight:600}.modulation-map-picker__lfo-meta{font-size:10px;color:var(--text-dim)}.morph-slot-preview{display:block;font-size:10px;color:var(--text-dim);white-space:normal;line-height:1.45;padding:8px 10px;border-radius:10px;border:1px dashed rgba(127,119,221,.3);background:#090d18b3}@media (max-width: 900px){.morph-slot-head{align-items:flex-start}.morph-slot-flow{grid-template-columns:1fr}.morph-slot-flow__bridge{order:3}}.model-status-pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--border)}.model-status-dot{width:8px;height:8px;border-radius:50%}.model-offline .model-status-dot{background:var(--danger);box-shadow:0 0 6px var(--danger)}.model-offline{color:var(--danger)}.model-loading .model-status-dot{background:var(--warn);box-shadow:0 0 6px var(--warn);animation:pulse-dot 1s ease infinite}.model-loading{color:var(--warn)}.model-ready .model-status-dot{background:var(--success);box-shadow:0 0 6px var(--success)}.model-ready{color:var(--success)}@keyframes pulse-dot{50%{opacity:.4}}.model-bar{display:grid;gap:6px;margin-bottom:14px}.model-loading{font-size:11px;color:var(--warn)}.model-last{font-size:10px;color:var(--text-secondary)}.param-group{margin-bottom:12px}.param-group-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.xy-pad{width:140px;height:140px;border-radius:12px;border:1px solid var(--border);background:var(--bg-1);position:relative;cursor:crosshair;-webkit-user-select:none;user-select:none}.xy-dot{position:absolute;width:12px;height:12px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent)}.lfo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.lfo-card{border:.5px solid var(--border);border-radius:var(--radius);padding:10px;background:var(--bg-2);box-shadow:0 8px 18px #00000047}.lfo-card-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.lfo-waveform{flex:1;min-width:0;border-radius:4px;background:var(--bg-1)}.lfo-card .meta{font-size:12px;color:var(--text-secondary);margin-bottom:4px}.lfo-card select,.lfo-card input[type=number]{width:100%;padding:6px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary)}.lfo-card .switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--text-secondary)}.lfo-target-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(62px,1fr));gap:4px;margin-top:4px}.audio-map-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px}.audio-map-card{border:1px solid var(--border);border-radius:10px;padding:10px;background:var(--bg-1)}.audio-map-card--live{border-color:var(--live);box-shadow:inset 0 0 0 1px #1d9e751f}.framesync-panel{background:var(--bg-0);border:1px solid var(--border);border-radius:10px;padding:10px;box-shadow:inset 0 0 0 1px #2a2d3a59}.framesync-header{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--text-primary);font-weight:600;letter-spacing:.6px}.framesync-title{font-size:18px;display:inline-flex;align-items:center;gap:8px}.framesync-title-icon{font-size:18px;color:var(--accent)}.framesync-accent{color:var(--accent)}.framesync-graph{margin-top:10px;background:var(--bg-0);border:1px solid var(--border);border-radius:8px;padding:6px 10px}.framesync-axis{display:grid;grid-template-columns:repeat(12,1fr);gap:0;margin-top:6px;font-size:10px;color:var(--text-dim)}.framesync-axis span{text-align:center}.framesync-row{display:grid;grid-template-columns:1.1fr 2fr 1.2fr 1.2fr;gap:12px;margin-top:12px}.framesync-stack{display:grid;gap:10px}.framesync-subtitle{font-size:12px;color:var(--text-secondary);margin-bottom:6px;letter-spacing:.3px}.framesync-checkbox{font-size:12px;color:var(--text-secondary);display:flex;align-items:center;gap:8px;cursor:pointer}.framesync-checkbox input[type=checkbox]{accent-color:var(--success)}.framesync-list{font-size:12px;color:var(--text-primary)}.framesync-list .item{padding:4px 0;border-bottom:1px solid var(--border)}.framesync-list .item:last-child{border-bottom:none}.framesync-select,.framesync-input{width:100%;padding:6px;background:var(--bg-0);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);font-size:12px}.framesync-input[type=range]{accent-color:var(--accent)}.framesync-gradient-bar{background:linear-gradient(90deg,var(--a-group),var(--b-group));height:24px;border-radius:6px}.xy-dot.framesync{background:var(--accent);box-shadow:0 0 10px var(--accent)}.framesync-buttons{display:grid;grid-template-columns:repeat(auto-fit,minmax(64px,1fr));gap:6px}.framesync-button{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);font-size:11px;padding:6px 12px;text-align:center;border-radius:var(--radius-sm, 7px);cursor:pointer;font-family:inherit;transition:border-color .15s ease,color .15s ease,background .15s ease}.framesync-button:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.framesync-button.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd1f}.framesync-button--live,.framesync-button.live{border-color:var(--live);color:var(--live-text);background:#1d9e7524}.framesync-button--accent{border-color:var(--accent);color:var(--accent-text);background:#7f77dd2e}.framesync-button--danger{border-color:var(--error);color:var(--error);background:#e24b4a1a}.framesync-button--compact{padding:4px 8px;font-size:10px}.framesync-button:disabled{opacity:.45;cursor:not-allowed}.framesync-metric{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:12px;color:var(--text-primary)}.framesync-metric span{display:block;color:var(--text-dim);font-size:10px}.framesync-wave-shapes{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:6px}.framesync-wave{background:var(--bg-0);border:1px solid var(--border);border-radius:6px;padding:6px;text-align:center;font-size:10px;color:var(--text-primary)}.framesync-wave svg{width:100%;height:40px;display:block;margin-bottom:4px}.framesync-footer{margin-top:10px;display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.img2img-panel{display:grid;gap:12px;margin-top:10px}.img2img-panel__summary,.img2img-panel__status,.img2img-panel__output{text-align:center}.img2img-dropgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.img2img-dropgrid__actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.img2img-dropzone{position:relative;min-height:240px;display:flex;align-items:center;justify-content:center;padding:14px;border:1px dashed rgba(127,119,221,.42);border-radius:16px;background:linear-gradient(180deg,#7f77dd14,#08090deb);cursor:pointer;overflow:hidden;text-align:center;transition:border-color .18s ease,transform .18s ease,box-shadow .18s ease}.img2img-dropzone:hover{border-color:#7f77ddb3;transform:translateY(-1px);box-shadow:0 14px 32px #00000047}.img2img-dropzone--mask{border-color:#2de2ff57;background:linear-gradient(180deg,#2de2ff14,#08090deb)}.img2img-dropzone--filled{border-style:solid}.img2img-dropzone__input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;cursor:pointer}.img2img-dropzone__preview,.img2img-dropzone__empty{width:100%;height:100%;display:grid;place-items:center}.img2img-dropzone__image{width:100%;height:100%;max-height:320px;object-fit:contain;border-radius:12px;background:#00000059}.img2img-dropzone__empty{gap:8px;align-content:center;color:var(--text-primary)}.img2img-dropzone__title{font-size:20px;font-weight:700;color:var(--text-primary)}.img2img-dropzone__hint{font-size:14px;color:var(--accent-text)}.img2img-dropzone__meta{font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.08em}.img2img-controls-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.img2img-control-card{display:grid;gap:10px;padding:14px;border:1px solid var(--border);border-radius:14px;background:var(--bg-1)}.img2img-control-card--primary{border-color:#7f77dd66;box-shadow:inset 0 0 0 1px #7f77dd1a}.img2img-control-card__value{font-size:28px;line-height:1;font-weight:700;color:var(--text-primary)}.img2img-control-card__slider{min-height:36px}.img2img-control-card__input{min-height:44px;font-size:18px;padding:10px 12px;border-radius:10px}.img2img-panel__actions .framesync-button{min-height:42px;font-size:13px;font-weight:700}.framesync-toggle{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-primary)}.framesync-dot{width:10px;height:10px;border-radius:50%;background:var(--warn);box-shadow:0 0 8px #ef9f2799}.compact-panel{background:var(--bg-1);border:1px solid var(--border);border-radius:12px;padding:10px;display:grid;gap:8px}.compact-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.mod-row{display:grid;grid-template-columns:24px 1.2fr 1fr 70px 70px 1fr 36px;gap:6px;align-items:center;font-size:12px}.mod-row .select,.mod-row input{width:100%}.mod-row .chip{padding:6px 8px;font-size:11px}.mod-row button{background:var(--bg-1);border:1px solid var(--border);color:var(--text-primary);border-radius:8px;padding:4px 6px;cursor:pointer}.mod-header{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary)}.mod-preview{grid-column:2 / span 5;background:var(--bg-1);border:1px solid var(--border);border-radius:8px;padding:6px}.mod-preview svg{width:100%;height:36px;display:block}.mod-subheader{font-size:12px;color:var(--text-secondary);margin-top:6px}.fs-card{background:var(--bg-1);border:1px solid var(--border);border-radius:12px;padding:10px;box-shadow:inset 0 0 0 1px #2a2d3a73}.fs-card h4{margin:0 0 8px;font-size:13px;color:var(--text-primary);letter-spacing:.3px}.fs-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:var(--text-secondary)}.fs-field{display:grid;grid-template-columns:1fr 1fr;gap:6px;align-items:center;font-size:12px;color:var(--text-primary)}.fs-input,.fs-select{width:100%;padding:6px;background:var(--bg-0);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:12px}.fs-button{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:6px 12px;font-size:11px;font-family:inherit;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s,background .15s}.fs-button:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-2)}.fs-button.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd40}.fs-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:8px}.fs-chip{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:4px 10px;font-size:10px;font-family:inherit;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s,background .15s}.fs-chip:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.fs-chip.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd38}.fs-row{display:grid;grid-template-columns:24px 1.2fr 1fr 70px 70px 1fr 36px;gap:6px;align-items:center;font-size:12px;color:var(--text-primary)}.fs-row input[type=number],.fs-row select{background:var(--bg-0);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);padding:4px 6px}.fs-row button{background:var(--bg-1);border:1px solid var(--border);color:var(--text-primary);border-radius:8px;padding:4px 6px;cursor:pointer}.preview-bar-container{margin-top:4px;background:var(--bg-0);border:1px solid var(--border);border-radius:6px;overflow:hidden}.preview-bar-header{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;background:var(--bg-1);border-bottom:1px solid var(--border)}.preview-bar-title{font-size:11px;color:var(--text-secondary);font-weight:600}.preview-bar-toggle{background:transparent;border:1px solid var(--border);color:var(--text-primary);border-radius:4px;padding:2px 6px;font-size:10px;cursor:pointer}.preview-bar-toggle:hover{border-color:var(--warn);color:var(--warn)}.preview-bar-toggle-icon{font-size:13px}.preview-bar{display:flex;gap:4px;overflow-x:auto;padding:6px;max-height:70px}.preview-bar.collapsed{display:none}.preview-bar::-webkit-scrollbar{height:4px}.preview-bar::-webkit-scrollbar-track{background:var(--bg-0)}.preview-bar::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.preview-bar::-webkit-scrollbar-thumb:hover{background:var(--warn)}.thumb-card{position:relative;border-radius:4px;overflow:hidden;border:1px solid var(--border);background:var(--bg-1);flex-shrink:0}.thumb{width:80px;height:45px;display:block;background:var(--bg-2);object-fit:cover}.thumb-label{position:absolute;left:0;right:0;bottom:0;padding:2px 4px;font-size:9px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.8))}.video-controls-panel{background:linear-gradient(135deg,var(--bg-1) 0%,var(--bg-0) 100%);border:1px solid var(--border);border-radius:8px;padding:8px 12px;margin-top:4px;box-shadow:0 4px 12px #0000004d}.video-controls{display:flex;gap:8px;align-items:center;justify-content:center}.control-btn{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:8px 14px;font-size:11px;font-family:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:border-color .15s,color .15s,background .15s;min-width:90px;justify-content:center;font-weight:600;letter-spacing:.03em}.control-btn:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-2)}.control-btn.playing,.control-btn--live{border-color:var(--live);background:#1d9e752e;color:var(--live-text)}.control-btn.recording{border-color:var(--error);background:#e24b4a26;color:#f5b4b3;animation:pulse 1.5s ease-in-out infinite}.control-btn--loading{border-color:var(--accent);background:#7f77dd29;color:var(--accent-text);box-shadow:0 0 0 1px #7f77dd3d,0 10px 24px #7f77dd2e}.control-btn__icon{font-size:14px}.lazy-loading-indicator{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-width:0}.lazy-loading-indicator--button{gap:7px;font-weight:600}.lazy-loading-indicator--inline{gap:8px;font-weight:600}.lazy-loading-indicator--subtle{gap:6px}.header-frame-processing{display:inline-flex;align-items:center;max-width:min(280px,32vw);padding:4px 10px;border-radius:999px;border:1px solid rgba(127,119,221,.45);background:#7f77dd1f;color:var(--accent-text);font-size:11px;font-weight:600;letter-spacing:.02em}.header-frame-processing__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-frame-processing-banner{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:8px;padding:8px 12px;border-radius:10px;border:1px solid rgba(127,119,221,.35);background:#7f77dd14;color:var(--accent-text);font-size:12px;font-weight:600}.live-frame-processing-banner__hint{font-size:11px;font-weight:500;color:var(--text-secondary);flex:1 1 12rem;min-width:0;line-height:1.35}.lazy-loading-indicator--overlay{font-size:14px;color:var(--media-text);text-shadow:0 1px 10px rgba(0,0,0,.35)}.lazy-loading-indicator__spinner{width:14px;height:14px;border-radius:999px;border:2px solid currentColor;border-right-color:transparent;flex:0 0 auto;animation:preview-spin .85s linear infinite}.lazy-loading-indicator--overlay .lazy-loading-indicator__spinner{width:18px;height:18px;border-width:2.5px}.lazy-loading-indicator__dots{display:inline-flex;align-items:flex-end;gap:3px;flex:0 0 auto}.lazy-loading-indicator__dots span{width:4px;height:4px;border-radius:999px;background:currentColor;opacity:.32;animation:preview-dots 1.2s ease-in-out infinite}.lazy-loading-indicator__dots span:nth-child(2){animation-delay:.16s}.lazy-loading-indicator__dots span:nth-child(3){animation-delay:.32s}.framesync-button--loading{border-color:var(--accent);color:var(--accent-text);background:#7f77dd24;box-shadow:0 0 0 1px #7f77dd33}@keyframes preview-spin{to{transform:rotate(360deg)}}@keyframes preview-dots{0%,80%,to{opacity:.28;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}.stream-link{background:var(--bg-0);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-size:10px;color:var(--text-primary);display:flex;align-items:center;gap:6px;margin-top:4px;justify-content:center}.stream-link a{color:var(--warn);text-decoration:none;display:inline-flex;align-items:center;gap:4px}.stream-link a:hover{text-decoration:underline}.stream-link-icon{font-size:12px}.thumb-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--bg-1) 0%,var(--bg-0) 100%)}.thumb-placeholder svg{width:30px;height:30px;opacity:.3}video::-webkit-media-controls{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.runs-row-selected{background:#2de2ff14!important}.status-chip{display:inline-block;padding:2px 8px;border-radius:4px;font-size:9px;font-weight:600;text-transform:uppercase}.status-completed{background:#1d9e7526;color:var(--live-text)}.status-failed{background:#e24b4a26;color:var(--error)}.status-running{background:#7f77dd26;color:var(--accent-text)}.status-queued{background:#ef9f2726;color:var(--warn)}.recent-runs-rail{margin-top:8px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);padding:8px;display:grid;gap:8px}.recent-runs-rail__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.recent-runs-rail__title{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.recent-runs-rail__link{border:1px solid var(--border);background:var(--bg-0);color:var(--text-primary);font-size:10px;border-radius:999px;padding:4px 10px;cursor:pointer}.recent-runs-rail__list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.recent-runs-rail__item{border:1px solid var(--border);background:var(--bg-0);border-radius:8px;padding:6px;display:grid;gap:6px;cursor:pointer;min-width:0}.recent-runs-rail__item:hover{border-color:var(--border-strong)}.recent-runs-rail__thumb{width:100%;aspect-ratio:16 / 9;border-radius:6px;object-fit:cover;background:var(--bg-2);border:1px solid var(--border)}.recent-runs-rail__thumb--empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.recent-runs-rail__meta{display:grid;gap:2px;min-width:0}.recent-runs-rail__id{font-size:10px;font-family:ui-monospace,Cascadia Code,monospace;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.recent-runs-rail__date{font-size:9px;color:var(--text-dim)}.recent-runs-rail__empty{font-size:11px;color:var(--text-dim)}.prompt-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prompt-input-row{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.prompt-input-row__input{min-height:46px;resize:vertical}.prompt-input-row__actions{display:flex;gap:6px;align-items:center;padding-top:2px}.prompt-input-row__actions .framesync-button{width:32px;height:28px;display:inline-flex;align-items:center;justify-content:center;padding:0}.prompt-history-panel{margin-top:10px;border:1px solid var(--border);background:var(--bg-1);border-radius:10px;padding:10px}.prompt-history-panel__header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.prompt-history-panel__empty{font-size:11px;color:var(--text-dim);padding:6px 0;text-align:center}.prompt-history-panel__list{display:grid;gap:6px;max-height:220px;overflow:auto}.prompt-history-panel__item{text-align:left;width:100%;border:1px solid var(--border);background:var(--bg-0);color:var(--text-primary);border-radius:8px;padding:8px;font-size:11px;line-height:1.25;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prompt-history-panel__item:hover{border-color:#ffffff2e}.lora-crossfader-shell{margin-top:12px}.lora-crossfader-shell--off{opacity:.72}.lora-crossfader-shell--off .prompt-ab-center--disabled,.lora-crossfader-links--disabled{opacity:.55;pointer-events:none}.lora-crossfader-inline{display:grid;gap:10px;margin-top:16px;padding:12px;border:1px solid var(--border);border-radius:12px;background:var(--bg-1)}.lora-crossfader-inline__header{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.lora-crossfader-summary__status{display:block;margin-top:0;color:var(--text-secondary)}.lora-crossfader-links{display:flex;flex-wrap:wrap;gap:8px}.lora-crossfader-panel{padding:10px;--crossfade-a-weight: .5;--crossfade-b-weight: .5}.lora-crossfader-panel__header{margin-bottom:8px}.lora-crossfader-panel__deck{margin-top:12px;grid-template-columns:1fr 1fr}.lora-crossfader-panel__side{transition:border-color .08s linear,box-shadow .08s linear,opacity .08s linear}.lora-crossfader-panel__side--a{opacity:calc(.55 + var(--crossfade-a-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 24px) color-mix(in srgb,var(--a-group) 24%,transparent),0 0 calc(var(--crossfade-a-weight) * 16px) color-mix(in srgb,var(--a-group) 18%,transparent)}.lora-crossfader-panel__side--b{opacity:calc(.55 + var(--crossfade-b-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-b-weight) * 24px) color-mix(in srgb,var(--b-group) 24%,transparent),0 0 calc(var(--crossfade-b-weight) * 16px) color-mix(in srgb,var(--b-group) 18%,transparent)}.lora-crossfader-panel__side--dominant{opacity:1}.lora-crossfader-panel__footer{margin-top:12px}.lora-crossfader-panel--off .lora-crossfader-panel__deck{opacity:.72}.prompt-ab-summary{margin-top:20px;display:grid;grid-template-columns:1fr 2fr 1fr;gap:16px;align-items:stretch}.prompt-ab-column{display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1)}.prompt-ab-column--a{border-color:var(--a-group)}.prompt-ab-column--b{border-color:var(--b-group)}.prompt-ab-column__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.prompt-ab-column__title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.lora-picker-panel--column{margin-bottom:10px;max-height:280px;overflow:auto}.prompt-ab-column--a .prompt-ab-column__title{color:var(--a-group)}.prompt-ab-column--b .prompt-ab-column__title{color:var(--b-group)}.prompt-ab-column__empty,.prompt-ab-column__more{font-size:10px;color:var(--text-dim);text-align:center;padding:6px 0}.prompt-ab-card{background:var(--bg-0);border:1px solid var(--border);border-radius:8px;padding:8px;display:grid;gap:4px}.prompt-ab-card__name{font-size:12px;color:var(--text-primary);font-weight:600}.prompt-ab-card__slider{margin-top:4px}.prompt-ab-card__value{font-size:10px;color:var(--text-dim)}.prompt-ab-center{padding:10px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1);align-content:start}.prompt-ab-center__labels{display:flex;justify-content:space-between;font-size:10px;margin-top:4px}.prompt-ab-center__label--a{color:var(--a-group)}.prompt-ab-center__label--b{color:var(--b-group)}.prompt-group-button--a{border-color:var(--a-group);color:var(--a-group)}.prompt-group-button--common{border-color:#7f77dda6;color:var(--accent-text)}.prompt-group-button--b{border-color:var(--b-group);color:var(--b-group)}.prompt-group-button--common.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd40;box-shadow:inset 0 0 0 1px #7f77dd24}.prompt-group-button--a.active{border-color:var(--a-group);color:var(--a-group-text);background:#378add33;box-shadow:inset 0 0 0 1px #378add24}.prompt-group-button--b.active{border-color:var(--b-group);color:var(--b-group-text);background:#e879b033;box-shadow:inset 0 0 0 1px #e879b024}.lora-family-pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 10px;border-radius:999px;border:1px solid rgba(127,119,221,.35);background:#7f77dd1f;color:var(--accent-text);font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700}.lora-browser-summary{display:block;margin-top:10px;color:var(--text-secondary)}.lora-picker-trigger{min-width:34px;padding:0 10px;font-size:18px;line-height:1}.lora-picker-panel{display:grid;gap:10px;margin-top:12px;padding:12px;border:1px solid rgba(127,119,221,.35);border-radius:12px;background:#080d17e6}.lora-picker-families{display:grid;gap:10px}.lora-picker-family{display:grid;gap:8px}.lora-picker-family__title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text)}.lora-picker-list{display:grid;gap:8px;max-height:320px;overflow-y:auto}.lora-picker-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;padding:10px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1)}.lora-picker-row__copy{min-width:0;display:grid;gap:4px}.lora-picker-row__name{font-size:12px;color:var(--text-primary);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-picker-row__path{font-size:10px;color:var(--text-dim);word-break:break-all}.lora-picker-row__actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.lora-picker-empty{font-size:11px;color:var(--text-dim);text-align:center;padding-top:6px}.lora-family-stack{display:grid;gap:10px;margin-top:12px}.lora-family-group{border:1px solid var(--border);border-radius:12px;background:#080d17d1;overflow:hidden}.lora-family-group--open{border-color:#7f77dd73;box-shadow:inset 0 0 0 1px #7f77dd1f}.lora-family-group__header{width:100%;display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:center;padding:12px;border:none;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.lora-family-group__label{font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.lora-family-group__meta,.lora-family-group__toggle{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.06em}.lora-family-group__empty{padding:0 12px 12px;font-size:11px;color:var(--text-dim)}.lora-browser-grid{margin:0;padding:0 12px 12px;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;max-height:400px;overflow-y:auto}.lora-card{background:var(--bg-2);border:1px solid var(--border);border-radius:11px;overflow:hidden;cursor:pointer;display:grid}.lora-card__media{position:relative;width:100%;height:180px;background:var(--bg-0)}.lora-card__thumb{width:100%;height:100%;object-fit:cover;display:block}.lora-card__placeholder{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-dim)}.lora-card__selected{position:absolute;top:8px;right:8px;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:700;background:var(--bg-0);border:1px solid var(--border)}.lora-card__selected--a{border-color:var(--a-group);color:var(--a-group)}.lora-card__selected--b{border-color:var(--b-group);color:var(--b-group)}.lora-card__body{padding:10px;display:grid;gap:8px}.lora-card__title{font-size:13px;color:var(--text-primary);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-card__path{font-size:10px;color:var(--text-dim);min-height:28px;word-break:break-all}.lora-card__strength{font-size:10px;color:var(--text-dim)}.lora-card__actions{display:grid;grid-template-columns:1fr 1fr auto;gap:6px;align-items:center}.lora-active-groups{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}.lora-active-group{display:grid;gap:8px}.lora-active-group--common{grid-column:1 / -1}.lora-active-group__title{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.lora-active-group--common .lora-active-group__title{color:var(--accent-text)}.lora-active-group--a .lora-active-group__title{color:var(--a-group)}.lora-active-group--b .lora-active-group__title{color:var(--b-group)}.lora-active-group__body{background:var(--bg-0);border:1px solid var(--border);border-radius:11px;padding:8px}.lora-active-group__row{display:grid;grid-template-columns:minmax(0,1fr) minmax(120px,180px) auto;align-items:center;gap:10px;padding:6px 0;border-bottom:1px solid var(--border)}.lora-active-group__row:last-child{border-bottom:none}.lora-active-group__copy{min-width:0;display:grid;gap:3px}.lora-active-group__name{font-size:12px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-active-group__value{font-size:10px;color:var(--text-dim)}.lora-active-group__slider{width:100%}.lora-active-group__remove{white-space:nowrap}.lora-active-group__empty{font-size:11px;color:var(--text-dim);padding:8px;text-align:center}.controlnet-model-summary{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px;font-size:11px;color:var(--text-secondary)}.controlnet-model-warning{margin-top:8px;font-size:11px;color:var(--warn)}.controlnet-weight-card{display:grid;gap:8px;padding:12px;border:1px solid rgba(127,119,221,.35);border-radius:12px;background:linear-gradient(180deg,#7f77dd1f,#7f77dd0a),var(--bg-1);box-shadow:inset 0 0 0 1px #7f77dd14}.controlnet-weight-card__hero{display:flex;justify-content:space-between;align-items:baseline;gap:10px}.controlnet-weight-card__value{font-size:22px;font-weight:800;color:var(--text-primary);line-height:1}.controlnet-weight-card__label{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent-text)}.controlnet-weight-card__bar{position:relative;height:12px;border-radius:999px;overflow:hidden;background:#ffffff0f;border:1px solid rgba(255,255,255,.08)}.controlnet-weight-card__fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,#58d1ff,#7f77dd 52%,#ff9a4d);box-shadow:0 0 18px #7f77dd47}.controlnet-weight-card__ticks{display:flex;justify-content:space-between;gap:10px;font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.controlnet-weight-card__slider{margin-top:8px}.controlnet-slot-strip{margin-top:12px;display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px}.controlnet-slot-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.controlnet-slot-row__select{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.controlnet-slot-row__state{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}.controlnet-slot-row__state--live{color:var(--live-text)}.controlnet-slot-row__toggle{min-width:54px;white-space:nowrap}.audio-reactive-panel__status{margin-top:10px;font-size:11px;color:var(--live-text)}.audio-start-button.active{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px var(--live) inset}.audio-map-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:8px}.audio-map-card__title-wrap{display:grid;gap:6px;flex:1;min-width:0}.audio-map-card__target{border-color:var(--live)}.audio-map-card__remove{min-width:auto}.audio-map-card__fields{display:grid;grid-template-columns:1fr 1fr;gap:4px;align-items:start}.audio-map-card__fields .audio-map-card__presets{grid-column:1 / -1}.audio-map-card__pair{display:grid;grid-template-columns:1fr 1fr;gap:6px}.audio-map-card__input{font-size:10px;padding:4px}.audio-map-card__presets,.audio-band-row__pills{display:flex;flex-wrap:wrap;gap:6px}.audio-map-card__presets-label{width:100%;font-size:10px;color:var(--live-text);text-transform:uppercase;letter-spacing:.08em}.audio-band-pill{border-color:var(--live);color:var(--live-text);font-size:10px;padding:4px 8px;min-width:auto}.audio-band-pill--ghost{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:999px;padding:4px 8px;font-size:10px;color:var(--text-secondary);background:var(--bg-1)}.audio-add-mapping{min-height:100%;border-style:dashed;border-color:var(--live);color:var(--live-text);background:var(--bg-1)}.audio-band-row{margin-top:12px;display:grid;gap:8px}.runs-browser__panel{display:grid;gap:0}.runs-browser__main-tabs{margin-top:8px}.runs-browser__tab-badge{margin-left:5px;padding:0 6px;border-radius:999px;background:#7f77dd33;color:var(--accent-text);font-size:9px;font-weight:700}.runs-browser__tab-badge--dim{background:#ffffff14;color:var(--text-dim)}.runs-activity-summary{margin-top:8px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px}.runs-activity-summary__label{font-weight:600;color:var(--text-primary)}.runs-browser__table-wrap--active{margin-top:8px}.runs-browser__worker,.runs-browser__live-frames,.runs-browser__eta{font-size:10px;white-space:nowrap}.runs-browser__worker{max-width:88px;overflow:hidden;text-overflow:ellipsis}.runs-browser__live-frames{font-variant-numeric:tabular-nums;color:var(--live-text)}.runs-browser__eta{color:var(--text-dim)}.system-runs-tab{max-height:calc(100vh - 200px);min-height:0;overflow:hidden;display:flex;flex-direction:column}.system-runs-tab .runs-browser{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;gap:8px}.system-runs-tab .runs-browser__panel{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.system-runs-tab .runs-browser__table-wrap{flex:1;min-height:0;max-height:none}.system-runs-tab .runs-detail-card,.system-runs-tab .runs-compare-card{flex-shrink:0;max-height:min(38vh,320px);overflow-y:auto}.runs-browser__filters--compact{margin-top:8px;grid-template-columns:2fr 1fr 1fr 1fr;gap:6px}.runs-browser__sortbar--compact{margin-top:6px}.runs-browser__hint{font-size:9px;color:var(--text-dim)}.runs-browser__table--compact th,.runs-browser__table--compact td{padding:4px 5px}.runs-browser__model{max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.runs-row-active{background:#7f77dd1a}.runs-active-jobs{margin:0 0 8px;padding:8px 10px;border:1px solid var(--border);border-radius:11px;background:#7f77dd0a;max-height:110px;overflow:auto}.runs-active-jobs__header{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}.runs-active-jobs__warn,.runs-active-jobs__status{font-size:10px;color:var(--text-dim)}.runs-active-jobs__warn{color:var(--warn)}.runs-active-jobs__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.runs-active-jobs__node{border:1px solid var(--border);border-radius:9px;background:var(--bg-1);padding:10px;display:grid;gap:8px}.runs-active-jobs__node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.runs-active-jobs__node-name{font-size:11px;font-weight:700;color:var(--text)}.runs-active-jobs__meta{font-size:10px;color:var(--text-dim);margin-left:auto}.runs-active-jobs__list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.runs-active-jobs__item{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:10px}.runs-active-jobs__detail{color:var(--text-dim);margin-left:auto}.runs-active-jobs__empty{font-size:10px;color:var(--text-dim)}.runs-detail-card__header-actions{display:flex;align-items:center;gap:8px}.runs-browser__meta{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.runs-browser__count{font-size:11px;color:var(--text-dim)}.runs-monitor__refreshed{font-size:10px;color:var(--text-dim)}.runs-monitor-bar{margin-top:6px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}.runs-monitor__auto{font-size:11px;color:var(--text-dim)}.runs-job-log{margin-top:6px;max-height:72px;overflow:auto;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#00000040;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px}.runs-job-log__line{display:flex;gap:8px;padding:2px 0;color:var(--text-dim)}.runs-job-log__line--success{color:var(--live-text)}.runs-job-log__line--error{color:var(--error)}.runs-job-log__line--info{color:var(--text-dim)}.runs-job-log__time{flex:0 0 auto;opacity:.7}.runs-job-log__msg{flex:1;word-break:break-word}.runs-browser__filters{margin-top:12px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:8px}.runs-browser__sortbar{margin-top:8px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}.runs-browser__sort-label{font-size:11px;color:var(--text-dim)}.runs-browser__sort-select{max-width:140px}.runs-browser__sort-order,.runs-browser__export{padding:4px 10px}.runs-browser__spacer{flex:1}.runs-browser__table-wrap{margin-top:8px;max-height:280px;overflow-y:auto;border:1px solid var(--border);border-radius:11px;background:var(--bg-1)}.runs-browser__table{width:100%;border-collapse:collapse;font-size:11px}.runs-browser__table thead{position:sticky;top:0;background:var(--bg-1);z-index:1}.runs-browser__table th{padding:8px;text-align:left;color:var(--text-dim);font-weight:600;border-bottom:1px solid var(--border)}.runs-browser__table td{padding:6px;border-bottom:1px solid var(--border);vertical-align:middle;color:var(--text-primary)}.runs-browser__thumb{width:32px;height:32px;object-fit:cover;border-radius:6px;border:1px solid var(--border);background:var(--bg-2)}.runs-browser__preview{width:40px}.runs-browser__progress{min-width:92px}.runs-browser__progress-label{font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-primary);white-space:nowrap}.runs-browser__progress-bar{margin-top:4px;height:4px;border-radius:999px;background:#ffffff14;overflow:hidden}.runs-browser__progress-fill{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#7f77ddd9,#1d9e75e6)}.runs-browser__thumb--empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.runs-browser__run-id,.runs-browser__seed{font-family:ui-monospace,Cascadia Code,monospace;font-size:10px}.runs-browser__date{font-size:10px;color:var(--text-dim)}.runs-browser__actions{display:flex;gap:4px;flex-wrap:wrap}.runs-browser__action{padding:2px 6px;font-size:9px;min-width:auto}.runs-browser__action--danger{border-color:var(--error);color:var(--error)}.runs-browser__empty{padding:20px;text-align:center;color:var(--text-dim);font-size:12px}.runs-status-pill{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;border:1px solid var(--border);font-size:9px;font-weight:700;text-transform:uppercase}.runs-status-pill--completed{border-color:var(--live);color:var(--live-text);background:#1d9e751f}.runs-status-pill--running{border-color:var(--accent);color:var(--accent-text);background:#7f77dd1f}.runs-status-pill--queued{border-color:var(--warn);color:var(--warn);background:#ef9f271f}.runs-status-pill--failed{border-color:var(--error);color:var(--error);background:#e24b4a1f}.runs-detail-card,.runs-compare-card{margin-top:8px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1);padding:10px 12px}.runs-detail-card__header,.runs-compare-card__header{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}.runs-detail-card__id{font-family:ui-monospace,Cascadia Code,monospace;font-size:12px}.runs-detail-card__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;font-size:10px}.runs-detail-card__grid--compact{margin-top:8px}.runs-detail-card__outputs{margin-top:8px;display:grid;gap:8px}.runs-detail-card__outputs--empty{display:flex;align-items:center;gap:8px}.runs-detail-card__no-output{font-size:10px;color:var(--text-dim)}.runs-detail-card__video-wrap{max-width:360px}.runs-detail-card__video{width:100%;max-height:160px;border-radius:8px;border:1px solid var(--border);background:#000}.runs-detail-card__output-links{display:flex;flex-wrap:wrap;gap:6px}.runs-detail-card__full{grid-column:1 / -1}.runs-detail-card__prompt{max-height:48px;overflow-y:auto;font-size:10px;color:var(--text-primary)}.runs-detail-card__notes{min-height:60px;font-size:10px}.runs-detail-card__save{margin-top:6px;padding:4px 12px}.runs-detail-card__frames{margin-top:12px}.runs-detail-card__frames-list{display:flex;flex-wrap:wrap;gap:4px;max-height:88px;overflow-y:auto}.runs-detail-card__frame-link{display:block;line-height:0}.runs-detail-card__frame{width:48px;height:48px;object-fit:cover;border-radius:4px;border:1px solid var(--border)}.runs-detail-card__tabs{margin-top:8px}.runs-detail-json{margin-top:8px;display:grid;gap:8px;min-height:0}.runs-detail-json__toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.runs-detail-json__filter{font-size:10px;color:var(--text-dim)}.runs-detail-json__diff-hint{font-size:10px;color:var(--warn)}.runs-detail-json__diff-badge{margin-left:4px;padding:0 5px;border-radius:999px;background:#ef9f272e;color:var(--warn);font-size:9px;font-weight:700}.runs-detail-json__table-wrap{max-height:220px;overflow:auto;border:1px solid var(--border);border-radius:8px;background:#0003}.runs-detail-json__table{width:100%;border-collapse:collapse;font-size:10px;font-family:ui-monospace,Cascadia Code,monospace}.runs-detail-json__table th,.runs-detail-json__table td{padding:4px 6px;border-bottom:1px solid var(--border);vertical-align:top;text-align:left}.runs-detail-json__table th{position:sticky;top:0;background:var(--bg-1);color:var(--text-dim);z-index:1}.runs-detail-json__key{color:var(--accent-text);white-space:nowrap}.runs-detail-json__value,.runs-detail-json__current{word-break:break-word;color:var(--text-primary)}.runs-detail-json__na{color:var(--text-dim)}.runs-detail-json__row--diff{background:#ef9f2714}.runs-detail-json__row--diff .runs-detail-json__value{color:var(--warn)}.runs-detail-json__changed{margin-left:4px;color:var(--warn);font-weight:700}.runs-detail-json__empty{padding:12px;text-align:center;color:var(--text-dim)}.runs-detail-json__raw{font-size:10px;color:var(--text-dim)}.runs-detail-json__raw summary{cursor:pointer;-webkit-user-select:none;user-select:none;margin-bottom:4px}.runs-detail-json__pre{margin:0;max-height:180px;overflow:auto;padding:8px;border:1px solid var(--border);border-radius:8px;background:#00000040;font-size:10px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.runs-compare-card__actions{display:flex;gap:6px;flex-wrap:wrap}.runs-compare-card__table-wrap{overflow-x:auto}.runs-compare-card__table{width:100%;border-collapse:collapse;font-size:10px}.runs-compare-card__table th,.runs-compare-card__table td{padding:6px;text-align:left;border-bottom:1px solid var(--border)}.runs-compare-card__table th{color:var(--text-dim)}.gpu-node-card{border:1px solid var(--border);border-radius:10px;background:var(--bg-1);overflow:hidden}.gpu-node-card__header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px}.gpu-node-card__identity{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-width:0}.gpu-node-card__stats{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.gpu-node-log{border-top:1px solid var(--border);background:var(--bg-0);max-height:200px;overflow-y:auto;font-size:10px;font-family:ui-monospace,Cascadia Code,monospace}.gpu-node-log__empty{padding:8px 10px;color:var(--text-dim)}.gpu-node-log__entry{display:flex;align-items:center;gap:6px;padding:3px 10px;border-bottom:1px solid rgba(42,45,58,.5)}.gpu-node-log__entry--error{background:#e24b4a0f}.gpu-node-log__badge{padding:1px 5px;border-radius:3px;font-size:9px;font-weight:700;text-transform:uppercase;flex-shrink:0}.gpu-node-log__badge--health{background:#1d9e7526;color:var(--live-text)}.gpu-node-log__badge--stats{background:#7f77dd26;color:var(--accent-text)}.gpu-node-log__badge--generate{background:#ef9f2726;color:var(--warn)}.gpu-node-log__badge--options{background:#378add26;color:var(--a-group)}.gpu-node-log__path{flex:1;min-width:0;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gpu-node-log__status{flex-shrink:0}.gpu-node-log__duration{color:var(--text-dim);flex-shrink:0}.gpu-node-log__error{color:var(--error);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gpu-node-log__time{color:var(--text-dim);flex-shrink:0}.settings-tab-shell .framesync-panel,.infra-panel{margin-bottom:12px}.settings-plugins-tab__intro{margin-top:8px}.settings-plugins-tab__list{margin-top:8px;font-size:11px;padding-left:16px}.settings-plugins-tab__empty{margin-top:8px;color:var(--text-dim)}.infra-section{margin-top:14px}.infra-section .framesync-subtitle{margin-bottom:8px}.infra-panel__empty,.infra-panel__hint{font-size:11px;color:var(--text-dim);margin:8px 0 0}.infra-panel__hint code{font-size:10px}.service-health-grid{margin-top:12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 900px){.service-health-grid{grid-template-columns:1fr}}.service-health-card{border:1px solid var(--border);border-radius:12px;background:#031b2d59;padding:10px;min-width:0}.service-health-card__head{display:flex;justify-content:space-between;align-items:center;gap:10px}.service-health-card__meta{margin-top:6px;font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.infra-mediator-list{display:grid;gap:10px;margin-top:8px}.infra-mediator-card{padding:12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);display:grid;gap:8px}.gpu-forge-modal__mediator{margin-top:4px;padding-top:4px;border-top:1px solid var(--border)}.infra-mediator-card__head{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.infra-mediator-card__head strong{font-size:13px}.infra-mediator-card__source{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.infra-mediator-card__meta{display:grid;gap:4px;font-size:11px;color:var(--text-secondary)}.infra-mediator-card__meta code{font-size:10px;color:var(--live-text)}.infra-address{display:block;font-size:10px;word-break:break-all}.infra-address-sub{display:block;font-size:10px;color:var(--text-dim);margin-top:2px}.infra-transcoder-table td{vertical-align:middle}[data-testid=gpu-pool-panel]{border-radius:11px}.settings-tab-shell .table,.settings-tab-shell table{font-size:11px}.settings-tab-shell kbd{background:var(--bg-2);border:1px solid var(--border-strong);border-radius:4px;padding:2px 6px;color:var(--text-primary)}.modulation-lfo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.modulation-lfo-card{border:.5px solid var(--border);border-radius:var(--radius);padding:10px;background:var(--bg-2);box-shadow:0 8px 18px #00000047;cursor:pointer;display:grid;gap:8px}.modulation-lfo-card--active{border-color:var(--live);background:color-mix(in srgb,var(--live) 8%,var(--bg-2))}.modulation-lfo-card--selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg-2))}.compositor-lfo-chip.active{border-color:var(--live);color:var(--live-text);background:color-mix(in srgb,var(--live) 16%,transparent)}.modulation-lfo-card--static{cursor:default}.modulation-lfo-card__control--wide{grid-column:1 / -1}.modulation-lfo-card__control--switch{display:inline-flex;align-items:center;gap:8px}.generate-sequencer__control-grid .modulation-lfo-card--static{opacity:1}.generate-sequencer__control-grid--edit{margin-top:12px}.generate-sequencer__control-span{grid-column:span 2}.generate-sequencer__marker-input{flex:1;min-width:120px}.generate-sequencer__load-select{min-width:140px;flex:1}.generate-sequencer__keyframe-list{display:grid;gap:6px}.generate-sequencer__keyframe-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:6px;align-items:center}.generate-sequencer__keyframe-easing{min-width:96px}.generate-sequencer__clip-hint{margin-top:4px;font-size:10px;color:var(--text-dim);line-height:1.4}.generate-sequencer__control-grid--edit .generate-sequencer__control-span{grid-column:1 / -1}.generate-story__status-line{margin-top:8px;font-size:11px;color:var(--text-secondary)}.modulation-lfo-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.modulation-lfo-card__switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--text-secondary)}.modulation-lfo-card__title{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary)}.modulation-lfo-card__dot{width:8px;height:8px;border-radius:50%;background:var(--border);flex-shrink:0}.modulation-lfo-card--active .modulation-lfo-card__dot{background:var(--live);box-shadow:0 0 6px var(--live)}.modulation-lfo-card__meta{font-size:11px;color:var(--text-dim)}.modulation-lfo-card__waveform{border-radius:4px;background:var(--bg-1)}.modulation-lfo-card__controls{display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-top:2px}.modulation-lfo-card__control{display:grid;gap:2px}.modulation-lfo-card__control .framesync-subtitle{font-size:9px}.modulation-lfo-card__control .framesync-select,.modulation-lfo-card__control .framesync-input{font-size:11px;padding:3px 5px;height:auto}.modulation-lfo-card__footer{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.modulation-route-pill{display:inline-flex;align-items:center;font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--live);color:var(--live-text);background:#1d9e7514}.modulation-route-pill--idle{border-color:var(--border);color:var(--text-dim);background:transparent}.modulation-lfo-card__route-button{margin-left:auto;font-size:10px}.modulation-target-board{margin-top:12px}.modulation-target-board__header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:8px}.modulation-target-board__hint{font-size:10px;color:var(--text-dim);margin-top:4px}.modulation-target-board__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:4px}.generate-sequencer__status{font-size:10px;padding:3px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim)}.generate-sequencer__status--live{border-color:var(--live);color:var(--live-text)}.generate-sequencer__hero-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:12px}.generate-sequencer__hero-card{display:grid;gap:6px;min-width:0;padding:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1);box-shadow:0 10px 22px #0000002e}.generate-sequencer__hero-value{font-size:22px;line-height:1;font-weight:800;color:var(--text-primary)}.generate-sequencer__hero-value--status{color:var(--live-text)}.generate-sequencer__hero-meta{font-size:11px;color:var(--text-secondary);line-height:1.35}.generate-sequencer__transport{display:flex;flex-wrap:wrap;gap:16px;align-items:flex-end;margin-top:12px}.generate-sequencer__transport--secondary{background:var(--bg-1);border:1px solid var(--border);border-radius:8px;padding:8px;margin-top:8px}.generate-sequencer__field{display:grid;gap:4px;min-width:80px;flex:1}.generate-sequencer__field--calc{align-content:end}.generate-sequencer__toggle{display:grid;gap:4px;min-width:130px}.generate-sequencer__timeline-tools{display:flex;gap:8px;align-items:flex-end;margin-top:12px}.generate-sequencer__playhead{flex:1;display:grid;gap:4px}.generate-sequencer__marker-tools{display:flex;gap:6px;align-items:flex-end}.generate-sequencer__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;align-items:flex-start}.generate-sequencer__track-builder{display:flex;flex-wrap:wrap;gap:6px;align-items:center;flex:1}.generate-sequencer__transport-actions{display:flex;gap:6px;flex-wrap:wrap}.generate-sequencer__track-list,.generate-sequencer__markers{margin-top:12px}.generate-sequencer__empty-markers{font-size:11px;color:var(--text-dim);padding:8px 0}.generate-sequencer__status-text{margin-top:8px;font-size:11px;color:var(--live-text)}.generate-dock-shell{margin-top:8px}.stage-sequencer-shell{margin-top:8px;position:relative;display:flex;align-items:stretch;gap:0;min-height:0;border:1px solid var(--border);border-radius:14px;padding:10px 10px 12px;background:linear-gradient(180deg,#ffffff0a,#ffffff03),var(--bg-1);box-shadow:0 10px 28px #00000047}.stage-sequencer-shell--side-open{padding-left:0}.stage-sequencer-main{flex:1 1 auto;min-width:0;display:grid;gap:8px;padding-left:2px}.stage-sequencer-side{flex:0 0 min(380px,42vw);width:min(380px,42vw);max-width:100%;display:grid;grid-template-rows:auto 1fr;gap:0;border-right:1px solid var(--border);background:#08090db8;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-radius:14px 0 0 14px;overflow:hidden;animation:stage-sequencer-side-in .22s ease}@keyframes stage-sequencer-side-in{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}.stage-sequencer-side__head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--border);background:#0c0e16e0}.stage-sequencer-side__title{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-primary)}.stage-sequencer-side__body{min-height:0;overflow:auto;padding:8px 10px 10px}.stage-sequencer-side-toggle{position:absolute;left:0;top:50%;z-index:3;transform:translate(-50%,-50%);display:inline-flex;align-items:center;justify-content:center;width:28px;height:52px;padding:0;border:1px solid var(--border);border-radius:0 10px 10px 0;background:#0c0e16f0;color:var(--text-secondary);cursor:pointer;box-shadow:4px 0 14px #00000047;transition:color .18s ease,border-color .18s ease,background .18s ease}.stage-sequencer-side-toggle:hover{color:var(--accent-text);border-color:#7f77dd8c}.stage-sequencer-side-toggle--open{left:min(380px,42vw);color:var(--accent-text);border-color:#7f77dd73;background:#7f77dd29}.sequencer-controls-panel--side-drawer{display:grid;gap:10px}.sequencer-controls-panel--side-drawer .generate-sequencer__control-grid--edit{margin-top:0}.sequencer-controls-panel--stage{display:grid;gap:10px}.stage-sequencer-bar{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:10px}.stage-sequencer-bar__left,.stage-sequencer-bar__right{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.stage-sequencer-bar__btn{width:34px;height:34px;border-radius:10px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.stage-sequencer-bar__btn--live{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 22%,transparent)}.stage-sequencer-bar__frame{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--text-primary);min-width:4.5em}.stage-sequencer-bar__frame--live{color:var(--live-text)}.stage-sequencer-bar__frame-total{font-weight:600;color:var(--text-dim)}.stage-sequencer-bar__scrub{min-width:0}.stage-sequencer-bar__scrub-input{width:100%;accent-color:var(--live)}.stage-sequencer-bar__meta{font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums}.stage-sequencer-bar__status{font-size:11px;color:var(--text-dim);max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stage-sequencer-bar__status--clip{color:var(--live-text)}.stage-sequencer-bar__loop{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-secondary);cursor:pointer}.stage-sequencer-bar__text-btn{border:1px solid var(--border);background:transparent;color:var(--text-secondary);border-radius:8px;padding:5px 10px;font-size:11px;font-weight:600;cursor:pointer}.stage-sequencer-bar__text-btn--active{border-color:color-mix(in srgb,var(--accent) 50%,var(--border));color:var(--text-primary)}.stage-sequencer-bar__text-btn--accent{border-color:color-mix(in srgb,var(--live) 45%,var(--border));color:var(--live-text)}.generate-story-strip{border-top:1px solid var(--border);padding-top:8px}.generate-story-strip__toggle{width:100%;display:flex;align-items:center;gap:8px;border:none;background:transparent;color:var(--text-secondary);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;padding:4px 0}.generate-story-strip__pill{font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-primary);text-transform:none;letter-spacing:0}.generate-story-strip__pill--dim{color:var(--text-dim)}.generate-story-strip__chevron{width:14px;height:14px;margin-left:auto}.generate-story-strip__body{margin-top:8px;display:grid;gap:6px}.generate-story-strip__line{font-size:11px;color:var(--text-secondary)}.generate-story-strip__text{margin:0;max-height:120px;overflow:auto;font-size:11px;line-height:1.45;color:var(--text-secondary);white-space:pre-wrap}.generate-dock{border-radius:14px}.generate-dock__header{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.generate-sequencer__transport--dock{margin-top:0}.generate-sequencer__details{margin-top:12px;display:grid;gap:12px}.generate-sequencer__dock-note{margin-top:8px;font-size:11px;color:var(--text-dim)}.generate-sequencer__frame-counter{font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-1)}.generate-sequencer__frame-counter--live{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 24%,transparent)}.generate-sequencer__frame-hero{display:grid;gap:6px;margin-bottom:12px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1)}.generate-sequencer__frame-hero--live{border-color:var(--live);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 20%,transparent)}.generate-sequencer__frame-hero-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.generate-sequencer__frame-hero-value{display:flex;align-items:baseline;gap:6px;font-variant-numeric:tabular-nums}.generate-sequencer__frame-hero-current{font-size:28px;line-height:1;font-weight:800;color:var(--text-primary)}.generate-sequencer__frame-hero--live .generate-sequencer__frame-hero-current{color:var(--live-text)}.generate-sequencer__frame-hero-sep,.generate-sequencer__frame-hero-total{font-size:16px;color:var(--text-secondary);font-weight:600}.generate-sequencer__frame-hero-meta{font-size:11px;color:var(--text-dim)}.generate-sequencer__frame-hero-bar{height:4px;border-radius:999px;background:#ffffff0f;overflow:hidden}.generate-sequencer__frame-hero-bar-fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--live),color-mix(in srgb,var(--accent) 70%,var(--live)));transition:width 80ms linear}.generate-sequencer__frame-hero--compact{margin-top:12px;margin-bottom:0}.generate-track-card{border:1px solid var(--border);border-radius:12px;padding:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1);box-shadow:0 8px 18px #0003}.generate-track-card--selected{border-color:#7f77dd85;box-shadow:0 10px 22px #0000003d,inset 0 0 0 1px #7f77dd24}.generate-track-card__header{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px}.generate-track-card__title.framesync-button{text-align:left;justify-content:flex-start;flex:1;min-width:0}.generate-track-card__title{border:0;background:transparent;padding:0;color:var(--text-primary);font-size:13px;font-weight:700;cursor:pointer;text-align:left}.generate-track-card__remove{flex-shrink:0}.generate-track-card__keyframes{display:grid;gap:8px}.generate-track-card__keyframe-row{display:grid;grid-template-columns:auto auto minmax(120px,1fr) auto;gap:8px;align-items:center;padding:8px 10px;border-radius:10px;background:#0000002e;border:1px solid rgba(255,255,255,.04)}.generate-track-card__keyframe-time,.generate-track-card__keyframe-value{font-size:11px;color:var(--text-secondary);white-space:nowrap}.generate-track-card__easing{min-width:0}.generate-track-card__delete{min-width:auto}.generate-track-card__empty{font-size:11px;color:var(--text-dim);padding:8px 0 2px}.generate-marker-row{display:grid;grid-template-columns:auto minmax(120px,160px) minmax(0,1fr) auto;gap:8px;align-items:center;padding:10px;border-radius:12px;border:1px solid var(--border);background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1)}.generate-marker-row__jump{justify-self:start}.generate-marker-row__hint{font-size:11px;color:var(--text-dim);min-width:0}.generate-marker-row__delete{justify-self:end;min-width:auto}.layout--live,.layout--stage,.layout--studio{grid-template-columns:1fr}.layout--sidebar .video-wrap--anchored{width:100%;max-width:none;margin:0;border-radius:10px;overflow:hidden;display:flex;flex-direction:column;flex:0 0 auto;min-height:0;background:var(--media-bg);border:1px solid var(--border);box-shadow:inset 0 0 0 1px #2a2d3a59}.video-wrap--anchored .video-wrap__stage{position:relative;width:100%;max-width:100%;margin:0;aspect-ratio:16 / 9;height:auto;min-height:0;flex:0 0 auto;overflow:hidden;border-radius:10px 10px 0 0;border:1px solid rgba(255,255,255,.08);border-bottom:none;background:var(--media-bg)}.preview--top-dock .video-wrap--anchored .video-wrap__stage{max-height:min(34vh,56.25vw)}.preview--top-dock.preview--stage-full .video-wrap--anchored .video-wrap__stage{max-height:min(38vh,56.25vw)}.preview--top-dock.preview--stage-full .video-wrap--anchored .video-wrap__stage--full{max-height:min(40vh,56.25vw)}.video-wrap--anchored .video-wrap__stage--preview{max-width:100%}.video-wrap--anchored .video-wrap__stage--full{max-width:100%;border-radius:0;border-left:none;border-right:none}.layout--stage-full{padding:0;gap:0;min-height:calc(100vh - var(--app-chrome-top))}.layout--sidebar .preview.preview--stage-full{max-width:none;margin:0;width:100%;flex:1;min-height:0;display:grid;grid-template-columns:1fr;grid-template-rows:1fr}.layout--sidebar .preview.preview--stage-full.preview--motion-dock{grid-template-rows:minmax(0,1fr) minmax(0,28vh)}.layout--sidebar .preview.preview--stage-full .preview-stage-row{grid-row:1;grid-column:1;min-height:0;height:100%}.layout--sidebar .preview.preview--stage-full .preview-bottom-dock{grid-row:2;grid-column:1;min-height:0}.layout--sidebar .preview.preview--stage-full .video-layer-tabs--preview{grid-row:1;grid-column:1;align-self:end;z-index:12;border-radius:0;border:none;border-top:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,transparent 0%,rgba(8,9,13,.72) 35%,rgba(8,9,13,.94) 100%);padding-top:24px}.layout--sidebar .preview.preview--stage-full .recent-runs-rail{display:none}.layout--sidebar .preview.preview--stage-full .video-layer-add{grid-row:1;grid-column:1;align-self:end;z-index:14;max-height:min(50vh,420px);overflow-y:auto;margin:0 12px 52px}.layout--sidebar .preview.preview--stage-full .preview-stage-video-stack{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;justify-content:center}.layout--sidebar .preview.preview--stage-full .video-wrap--anchored{border-radius:0;border-left:none;border-right:none;border-top:none;box-shadow:none;width:100%;flex:0 0 auto}.layout--sidebar .preview.preview--stage-full .video-wrap--anchored .video-wrap__stage,.layout--sidebar .preview.preview--stage-full .video-wrap--anchored .video-wrap__stage--full{width:100%;max-width:100%;aspect-ratio:16 / 9;height:auto;min-height:0;max-height:calc(100vh - var(--app-chrome-top) - 72px);border-radius:0;border:none}.video-wrap--anchored .video-wrap__stage video,.video-wrap--anchored .video-wrap__stage .video-still-preview,.video-wrap--anchored .video-wrap__stage .video-feed{object-fit:cover}.video-wrap--anchored .video-wrap__stage>.overlay{pointer-events:none}.video-wrap--anchored .video-wrap__stage>.live-hud-strip--pinned{position:absolute;top:8px;left:8px;right:auto;bottom:auto;max-width:min(360px,calc(100% - 16px));z-index:5;margin-top:0;grid-template-columns:minmax(0,320px)}.video-wrap--anchored .video-wrap__stage>.live-hud-dock{position:absolute;left:14px;right:14px;bottom:14px;z-index:10;display:flex;align-items:flex-end;justify-content:flex-end;gap:12px;pointer-events:none}.live-hud-dock__cell{pointer-events:auto;flex:0 1 auto;min-width:0}.live-hud-dock__cell--modulating{margin-right:auto;width:min(240px,calc(50% - 8px))}.live-hud-dock__cell--morph{width:min(280px,calc(50% - 8px))}.live-sequencer-dock{position:absolute;left:0;right:0;bottom:0;z-index:6;display:grid;gap:10px;padding:28px 12px 12px;background:linear-gradient(180deg,transparent 0%,rgba(8,10,16,.72) 28%,rgba(8,10,16,.94) 100%);border-top:1px solid rgba(255,255,255,.08);pointer-events:auto}.live-sequencer-dock__head{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px}.live-seq-time{font-variant-numeric:tabular-nums;font-size:18px;font-weight:600;letter-spacing:.02em}.live-seq-time__sep{color:var(--text-dim);margin:0 4px;font-weight:400}.live-seq-time__total{color:var(--text-secondary);font-weight:500}.live-seq-status{font-size:13px;font-weight:600;padding:6px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.live-seq-status--playing{border-color:var(--live);color:var(--live-text);background:#5af2a91f}.live-sequencer-dock__timeline{width:100%}.live-seq-scrub{display:grid;gap:6px}.live-seq-scrub__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}.live-seq-range{width:100%;min-height:44px;accent-color:var(--live);cursor:pointer}.live-seq-transport{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.live-seq-transport .framesync-button{flex:0 1 auto}.live-seq-load-select{width:auto;min-width:9rem;flex:1 1 8rem;max-width:14rem}.live-seq-builder{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.live-seq-builder .framesync-select{flex:1 1 10rem;min-width:8rem;width:auto}.live-seq-input--value{width:5.5rem;flex:0 0 auto}.live-seq-input--label{flex:1 1 10rem;min-width:8rem;width:auto}.live-seq-btn{min-height:44px;min-width:44px;padding:10px 16px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#ffffff14;color:var(--text);font-size:14px;font-weight:600;cursor:pointer;transition:background .15s ease,border-color .15s ease,transform .1s ease}.live-seq-btn:hover,.live-seq-btn:focus-visible{background:#ffffff24;border-color:#ffffff38;outline:none}.live-seq-btn:active{transform:scale(.98)}.live-seq-btn--primary{background:#5af2a938;border-color:var(--live);color:var(--live-text);padding-inline:22px}.live-seq-btn--ghost{margin-left:auto;background:transparent}.live-seq-btn--danger{border-color:color-mix(in srgb,var(--error) 45%,var(--border));color:var(--error-text)}.live-seq-select,.live-seq-input{min-height:44px;padding:8px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#00000059;color:var(--text);font-size:14px}.live-seq-select{min-width:140px;cursor:pointer}.live-seq-input--value{width:100px}.live-seq-input--label{flex:1;min-width:120px}.live-seq-details{display:grid;gap:12px;max-height:min(42vh,360px);overflow-y:auto;padding-top:4px}.live-seq-settings{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.live-seq-settings--bpm{padding:10px;border-radius:10px;background:#00000040;border:1px solid rgba(255,255,255,.08)}.live-seq-field{display:grid;gap:6px;min-width:100px;flex:1}.live-seq-field__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary)}.live-seq-check{display:flex;align-items:center;gap:10px;min-height:44px;padding:0 8px;font-size:14px;cursor:pointer}.live-seq-check input{width:20px;height:20px;accent-color:var(--live)}.live-seq-builder{display:flex;flex-wrap:wrap;gap:8px;align-items:stretch}.live-seq-calc{display:block;padding:10px 0;font-size:15px;color:var(--live-text)}.generate-sequencer__live-hint{margin:0 0 12px;font-size:13px;line-height:1.5;color:var(--text-secondary)}.generate-sequencer__live-link{border:none;background:none;padding:0;color:var(--live-text);font:inherit;font-weight:600;text-decoration:underline;cursor:pointer}.live-drawer-shell{--live-drawer-width: min(1200px, calc(100vw - 16px) );--live-drawer-handle-width: 44px;position:sticky;top:var(--app-chrome-top);z-index:190;display:flex;flex-direction:column;align-items:stretch;width:100%;max-width:var(--live-drawer-width);margin:0 auto;transition:max-height .28s ease;pointer-events:none}.live-drawer-shell--dock-top{transform:none;left:auto;right:auto;bottom:auto}.live-drawer-shell--dock-top:not(.live-drawer-shell--open) .live-right-column{max-height:0;opacity:0;visibility:hidden;overflow:hidden;padding-top:0;padding-bottom:0;border:none;box-shadow:none}.live-drawer-shell--dock-top.live-drawer-shell--open .live-right-column{max-height:min(52vh,calc(100vh - var(--app-chrome-top) - 96px));opacity:1;visibility:visible;overflow-y:auto}.live-drawer-shell>*{pointer-events:auto}.live-right-column{position:relative;width:100%;z-index:1;background:#11131ceb;backdrop-filter:blur(12px) saturate(1.08);-webkit-backdrop-filter:blur(12px) saturate(1.08);border:.5px solid rgba(255,255,255,.08);border-top:none;border-radius:0 0 14px 14px;padding:8px 10px 12px;box-shadow:0 14px 36px #00000061;transition:max-height .28s ease,opacity .22s ease,visibility .22s ease}.live-drawer-shell--dock-top .live-right-column .rack{background:#0c0e168c}.live-drawer-shell--dock-top .live-right-column .framesync-panel{background:#08090d80}.live-right-column .rack{background:#0c0e168c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-color:#ffffff14;box-shadow:0 8px 24px #00000047}.live-right-column .framesync-panel{background:#08090d80;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-color:#ffffff14;box-shadow:inset 0 0 0 1px #2a2d3a38}.live-right-column .sub-pills,.live-right-column .lfo-card{background:#14161f85;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.right-panel-slide-enter-active,.right-panel-slide-leave-active{transition:opacity .18s ease,transform .28s ease;will-change:opacity,transform}.right-panel-slide-enter-from,.right-panel-slide-leave-to{opacity:0;transform:translate(26px)}.live-overlay-btn{position:relative;z-index:220;background:linear-gradient(135deg,#08090df0,#171a27eb);border:1px solid rgba(127,119,221,.42);color:var(--text-primary);border-radius:12px;padding:4px 8px;min-height:30px;font-size:10px;cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(6px);white-space:nowrap;display:inline-flex;align-items:center;gap:6px;box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,transform .18s ease,box-shadow .18s ease}.live-overlay-btn:hover{border-color:var(--accent);color:var(--accent-text);transform:translateY(-1px);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.live-overlay-btn--open{background:linear-gradient(135deg,#7f77dd47,#1e2233f5);border-color:#7f77dda8;box-shadow:0 14px 32px #00000070,0 0 0 1px #7f77dd3d}.live-overlay-btn--top{width:100%;min-height:40px;margin:0;padding:6px 12px;border-radius:0;border-bottom:none;display:inline-flex;align-items:center;justify-content:center;gap:8px;flex-shrink:0;box-shadow:0 6px 18px #00000047,0 0 0 1px #7f77dd14}.live-overlay-btn--top:hover{transform:none}.live-overlay-btn__top-label{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary)}.live-overlay-btn--open .live-overlay-btn__top-label{color:var(--accent-text)}.live-overlay-btn__arrow-wrap{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f;flex-shrink:0}.live-overlay-btn__state{width:22px;height:22px;color:currentColor;transition:transform .18s ease}.live-overlay-btn__state path{stroke-width:2.4}.live-overlay-btn--open .live-overlay-btn__state{transform:translate(1px)}.live-drawer-shell--side{--live-drawer-panel-width: min(420px, 36vw);position:fixed;top:var(--app-chrome-top);right:0;bottom:0;left:auto;flex:none;width:0;min-width:0;overflow:visible;z-index:40;pointer-events:none;transition:right .32s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.layout.layout--edge-engine-open .edge-dock-host .live-drawer-shell--side:not(.live-drawer-shell--left){right:var(--engine-drawer-width, min(420px, 36vw))}.live-drawer-shell--side.live-drawer-shell--open{width:var(--live-drawer-panel-width);pointer-events:auto}.live-drawer-shell--side .live-overlay-btn--side{pointer-events:auto}.live-drawer-shell--side .live-right-column{position:relative;width:var(--live-drawer-panel-width);min-width:var(--live-drawer-panel-width);height:100%;max-height:100%;overflow-x:hidden;overflow-y:auto;border-radius:14px 0 0 14px;border:1px solid rgba(255,255,255,.08);border-right:none;background:#11131cf0;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:-12px 0 32px #00000059;padding:8px 10px 12px;transform:translate(100%);opacity:0;transition:transform .32s cubic-bezier(.4,0,.2,1),opacity .22s ease}.live-drawer-shell--side.live-drawer-shell--open .live-right-column{transform:translate(0);opacity:1}.live-overlay-btn--side.edge-dock-tab--context{position:absolute;right:0;top:54%;transform:translateY(-50%);z-index:5;width:32px;min-height:72px;height:auto;padding:8px 4px;border-radius:10px 0 0 10px;border-right:none;flex-direction:column;gap:4px}.live-drawer-shell--side.live-drawer-shell--open .live-overlay-btn--side.edge-dock-tab--context{left:0;right:auto;transform:translate(-100%,-50%);border-radius:10px 0 0 10px;border-right:none;border-left:1px solid rgba(255,255,255,.1)}.live-drawer-shell--left{right:auto!important;left:0;z-index:40;transition:left .32s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.layout.layout--edge-engine-open .edge-dock-host .live-drawer-shell--left{left:0;right:auto!important}.live-drawer-shell--left .live-right-column{border-radius:0 14px 14px 0;border-right:1px solid rgba(255,255,255,.08);border-left:none;box-shadow:12px 0 32px #00000059;transform:translate(-100%)}.live-drawer-shell--left.live-drawer-shell--open .live-right-column{transform:translate(0)}.live-drawer-shell--left:not(.live-drawer-shell--open) .edge-dock-tab--context{position:fixed;left:0;right:auto;top:calc(var(--app-chrome-top) + 52%);transform:translateY(-50%);border-radius:0 10px 10px 0;border-left:none;border-right:1px solid rgba(255,255,255,.12);z-index:56}.live-drawer-shell--left.live-drawer-shell--open .edge-dock-tab--context{position:absolute;left:auto;right:0;top:50%;transform:translate(100%,-50%);border-radius:0 10px 10px 0;border-left:none;border-right:1px solid rgba(255,255,255,.12)}.live-drawer-shell--side:not(.live-drawer-shell--left) .live-overlay-btn--side.edge-dock-tab--context,.live-drawer-shell--side:not(.live-drawer-shell--left).live-drawer-shell--open .live-overlay-btn--side.edge-dock-tab--context{position:absolute;right:0;left:auto;top:54%;transform:translateY(-50%)}.live-drawer-shell--side:not(.live-drawer-shell--left).live-drawer-shell--open .edge-dock-tab--context{transform:translate(-100%,-50%);border-radius:10px 0 0 10px}.edge-dock-tab__label--context{writing-mode:vertical-rl;text-orientation:mixed}.live-overlay-btn--side:hover{color:var(--text);background:#1e2130f2}@media (max-width: 1100px){.layout{grid-template-columns:1fr}}@media (max-width: 768px){header.app-header{padding:6px 10px;flex-wrap:wrap;gap:8px}.app-header__left{flex-wrap:wrap;width:100%}.tabs{flex-wrap:wrap;gap:8px}.tab{min-width:132px;min-height:58px;padding:10px 12px;gap:10px;font-size:10px}.tab__icon-wrap{width:34px;height:34px}.tab__label{font-size:12px}.tab__hint{font-size:9px}.layout{padding:6px;gap:6px}.rack,.framesync-panel{padding:8px}.framesync-title{font-size:14px}.framesync-row{grid-template-columns:1fr;gap:8px}.framesync-footer{grid-template-columns:1fr;gap:6px}.framesync-button{font-size:10px;padding:8px 6px}.slider-row{grid-template-columns:1fr;gap:4px}.lfo-grid,.audio-map-grid,.compact-grid,.recent-runs-rail__list,.prompt-ab-summary,.lora-active-groups,.runs-browser__filters,.runs-detail-card__grid,.lora-picker-row,.lora-active-group__row{grid-template-columns:1fr}.gpu-forge-modal{padding:12px}.gpu-forge-modal__dialog{width:min(100vw - 24px,860px);padding:14px}.lora-picker-row__actions{justify-content:flex-start}.runs-browser__sortbar{align-items:stretch}.runs-browser__spacer{display:none}.audio-map-card__pair,.fs-grid{grid-template-columns:1fr}.video-controls{flex-wrap:wrap;gap:4px}.control-btn{min-width:70px;padding:6px 10px;font-size:11px}.thumb{width:60px;height:36px}.preview-bar{max-height:50px}.mod-row,.fs-row{grid-template-columns:1fr 1fr;gap:4px}.framesync-wave-shapes{grid-template-columns:repeat(3,1fr)}.framesync-buttons{grid-template-columns:repeat(2,1fr)}}@media (max-width: 480px){header.app-header{padding:4px 8px}.tab{min-width:calc(50% - 6px);min-height:52px;padding:9px 10px;gap:9px;border-radius:14px}.tab__icon-wrap{width:30px;height:30px;border-radius:11px}.tab__icon{font-size:16px}.tab__label{font-size:11px}.tab__hint{display:none}.layout{padding:4px;gap:4px}.rack,.framesync-panel{padding:6px;border-radius:8px}.framesync-title{font-size:13px}.framesync-subtitle{font-size:11px}.framesync-select,.framesync-input{font-size:11px;padding:5px}.gpu-forge-modal__dialog{width:calc(100vw - 16px);max-height:calc(100vh - 16px);padding:12px;border-radius:12px}.gpu-forge-modal__header{flex-direction:column}.framesync-button{font-size:9px;padding:6px 4px}.control-btn{min-width:60px;padding:5px 8px;font-size:10px}.thumb{width:50px;height:30px}.lfo-card,.audio-map-card{padding:8px}}@media (hover: none) and (pointer: coarse){.tab,.chip,.sub-pill,.framesync-button,.control-btn,.fs-button,.fs-chip,.btn{min-height:44px;padding:10px 12px}.slider-row input[type=range],.framesync-input[type=range]{height:24px}select,input[type=number],input[type=text],input[type=file],button{min-height:44px}.xy-pad{min-height:200px;min-width:200px}}@media (max-width: 896px) and (orientation: landscape){.layout{grid-template-columns:1fr}.video-wrap{max-height:40vh}.preview.preview--stage-full .video-wrap{max-height:none}.thumbs{max-height:60px}.thumb{width:70px;height:40px}}.layout--stage{align-items:start}.layout--stage .preview{min-width:0}.layout--stage .video-wrap video,.layout--stage .video-wrap .video-still-preview{object-fit:cover}.live-right-column.stage-rack-overlay{position:static;width:auto;max-height:none;display:flex;flex-direction:column;gap:10px}.stage-rack-overlay .rack{background:#11131c85;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.stage-rack-overlay .framesync-panel{background:transparent;border:none;box-shadow:none}.layout--studio{position:relative;grid-template-columns:1fr}.layout--studio .video-wrap video,.layout--studio .video-wrap .video-still-preview{object-fit:cover}.studio-right-column{position:absolute;top:10px;right:10px;width:min(520px,46%);max-height:calc(56.25vw - 30px);z-index:20;overflow-y:auto;display:flex;flex-direction:column;gap:10px;padding:8px 8px 10px;background:linear-gradient(90deg,#11131c33,#11131c75 16%,#11131c94);backdrop-filter:blur(10px) saturate(1.08);-webkit-backdrop-filter:blur(10px) saturate(1.08);border-radius:14px}.studio-right-column .rack{background:#11131c85;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.studio-right-column .framesync-panel{background:#08090d6b;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);border:none;box-shadow:none}.motion-view--hero .motion-panel{display:flex;flex-direction:column;gap:10px}.motion-preset-row--hero{flex-wrap:wrap}.motion-hero-stage{min-height:min(36vh,280px);display:flex;flex-direction:column}.motion-hero-stage .deforum-motion-pads--hero{flex:1;min-height:0}.deforum-motion-pads--compact{display:flex;flex-direction:column;gap:10px;min-height:0}.deforum-motion-pads__mode-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 2px}.deforum-motion-pads__mode-label{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.deforum-motion-pads__mode-btn{display:inline-flex;align-items:center;gap:5px}.deforum-motion-pads__mode-btn .ui-icon{width:14px;height:14px}.motion-controls-compact{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;gap:12px}.xy-controller{display:flex;flex-direction:column;gap:6px;min-width:0}.xy-controller__chrome{display:flex;align-items:center;justify-content:space-between;gap:6px}.xy-controller__axis-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:8px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);cursor:pointer;font-size:10px;font-weight:600;line-height:1;transition:border-color .12s ease,color .12s ease,background .12s ease}.xy-controller__axis-btn:hover{border-color:var(--border-strong);color:var(--text)}.xy-controller--move .xy-controller__axis-btn--x:hover,.xy-controller--move .xy-controller__axis-btn--x:focus-visible{border-color:color-mix(in srgb,var(--live) 55%,var(--border));color:var(--live-text)}.xy-controller--move .xy-controller__axis-btn--y:hover,.xy-controller--move .xy-controller__axis-btn--y:focus-visible{border-color:color-mix(in srgb,var(--live) 55%,var(--border));color:var(--live-text)}.xy-controller--look .xy-controller__axis-btn:hover,.xy-controller--look .xy-controller__axis-btn:focus-visible{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));color:var(--accent)}.xy-controller__axis-btn .ui-icon{width:14px;height:14px}.xy-controller__axis-tag{font-size:9px;letter-spacing:.06em;text-transform:uppercase;opacity:.85}.xy-controller__readout{flex:1;text-align:center;font-size:10px;min-width:0}.xy-controller--compact .xy-controller__pad{width:128px;height:128px;flex:none;aspect-ratio:1}.xy-controller--compact .motion-pad-hero__puck{width:14px;height:14px}.xy-controller--compact .motion-pad-hero__readout{display:none}.deforum-motion-pads--hero .motion-controls-compact{flex:1;align-content:center;justify-content:center}.motion-fine-tune-toggle.active{border-color:var(--live);color:var(--live)}.morph-live-hint,.lora-crossfader-hint{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;margin-top:12px;padding:10px 12px;border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-2)}.morph-live-hint__copy,.lora-crossfader-hint__copy{margin:0;flex:1;min-width:200px}.motion-preset-toolbar{display:flex;gap:8px;align-items:center;margin-top:10px}.motion-preset-select{flex:1;min-width:0}.motion-preset-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;flex-shrink:0}.motion-smoothness{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin:10px 0 4px;padding:8px 10px;border-radius:8px;background:#0000002e;border:1px solid rgba(255,255,255,.06)}.motion-smoothness__toggle{display:inline-flex;align-items:center;gap:8px;font-size:.85rem;cursor:pointer;-webkit-user-select:none;user-select:none}.motion-smoothness__frames{display:inline-flex;align-items:center;gap:8px;font-size:.85rem}.motion-smoothness__frames-input{width:4.5rem;min-width:4.5rem}.motion-smoothness__hint{flex:1 1 100%;font-size:.75rem;opacity:.65;line-height:1.35}.motion-preset-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.motion-panel__header-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.motion-panel__readout,.motion-path-preview__readout,.motion-pad-hero__readout,.motion-axis-slider__value,.deforum-motion-pads__readout,.generate-dock-sync__value,.morph-crossfader-hero__readout,.live-hud-mod-row__val,.motion-readout{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:10px;color:var(--text-dim);letter-spacing:.02em}.motion-panel__readout{font-size:11px;color:var(--text-secondary)}.deforum-motion-pads--hero .motion-pad-hero__readout{left:auto;right:12px;bottom:10px;color:var(--live-text);font-size:11px}.motion-path-preview{margin-top:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#080c14f2,#04080efa);overflow:hidden}.motion-path-preview__header{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.06)}.motion-path-preview__title{margin:0}.motion-path-preview__readout{font-size:10px}.motion-path-preview__stage{height:220px;min-height:180px;position:relative}.motion-path-preview__stage canvas{display:block;width:100%!important;height:100%!important}.motion-controls-row{display:flex;gap:12px;align-items:stretch;margin-top:12px}.motion-controls-2d{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}.motion-controls-2d__block{display:flex;flex-direction:column;gap:6px;min-width:0}.motion-controls-2d__label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.motion-pad-hero{position:relative;flex:1;min-width:0;aspect-ratio:1;background:var(--bg-1);border:.5px solid var(--border);border-radius:12px;cursor:crosshair;-webkit-user-select:none;user-select:none;touch-action:none;overflow:hidden;box-shadow:inset 0 2px 8px #00000080}.motion-pad-hero--move{border-color:color-mix(in srgb,var(--live) 42%,var(--border));background:linear-gradient(165deg,color-mix(in srgb,var(--live) 12%,var(--bg-1)),var(--bg-0));box-shadow:inset 0 2px 10px color-mix(in srgb,var(--live) 8%,transparent)}.motion-pad-hero--look{border-color:color-mix(in srgb,var(--accent) 42%,var(--border));background:linear-gradient(165deg,color-mix(in srgb,var(--accent) 14%,var(--bg-1)),var(--bg-0));box-shadow:inset 0 2px 10px color-mix(in srgb,var(--accent) 10%,transparent)}.motion-controls-2d__block .motion-controls-2d__label:first-child{color:color-mix(in srgb,var(--live) 75%,var(--text-secondary))}.motion-controls-2d__block:last-child .motion-controls-2d__label{color:color-mix(in srgb,var(--accent) 75%,var(--text-secondary))}.motion-pad-hero__readout{position:absolute;left:8px;bottom:8px;pointer-events:none}.motion-axis-sliders{display:flex;flex-direction:column;gap:10px;width:84px;flex-shrink:0}.motion-axis-sliders--2d{flex-direction:row;width:100%;margin-top:4px}.motion-axis-sliders--2d .motion-axis-slider{flex:1 1 0;min-width:0}.motion-axis-sliders--2d .motion-axis-slider__input{writing-mode:horizontal-tb;direction:ltr;width:100%;min-height:0;height:auto}.motion-axis-slider{display:flex;flex-direction:column;align-items:center;gap:6px;flex:1;min-height:0}.motion-axis-slider__label{font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em}.motion-axis-slider__input{writing-mode:vertical-lr;direction:rtl;width:28px;flex:1;min-height:120px;accent-color:var(--accent)}.motion-axis-slider__value{font-size:10px}.motion-pad-hero__axis{position:absolute;font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;pointer-events:none}.motion-pad-hero__axis--x{bottom:8px;right:8px}.motion-pad-hero__axis--y{top:8px;left:8px}.motion-pad-hero__crosshair{position:absolute;background:#ffffff12;pointer-events:none}.motion-pad-hero__crosshair--x{left:0;right:0;top:50%;height:1px;transform:translateY(-50%)}.motion-pad-hero__crosshair--y{top:0;bottom:0;left:50%;width:1px;transform:translate(-50%)}.motion-pad-hero__puck{position:absolute;width:20px;height:20px;border-radius:50%;background:var(--live);box-shadow:0 0 12px var(--live),0 0 28px color-mix(in srgb,var(--live) 45%,transparent);transform:translate(-50%,-50%);pointer-events:none}.motion-pad-hero--move .motion-pad-hero__puck{background:var(--live);box-shadow:0 0 12px var(--live),0 0 28px color-mix(in srgb,var(--live) 45%,transparent)}.motion-pad-hero__puck--look,.motion-pad-hero--look .motion-pad-hero__puck{background:var(--accent);box-shadow:0 0 12px var(--accent),0 0 28px color-mix(in srgb,var(--accent) 45%,transparent)}.xy-controller--dragging{cursor:grabbing}.xy-controller--dragging .motion-pad-hero__puck,.xy-controller--spring .motion-pad-hero__puck{transition:none}.xy-controller:not(.xy-controller--dragging):not(.xy-controller--spring) .motion-pad-hero__puck{transition:left .08s ease-out,top .08s ease-out}.modulation-subtabs{margin-top:12px;margin-bottom:8px;flex-wrap:wrap}.modulation-panel__actions--section{margin-bottom:10px;justify-content:flex-end}.modulation-lfo-grid{grid-template-columns:repeat(3,1fr)!important;margin-top:12px}.modulation-lfo-card__waveform{width:100%!important;height:72px!important}.modulation-lfo-card:not(.modulation-lfo-card--active){opacity:.55}.modulation-summary{font-size:10px;color:var(--live-text);padding:2px 8px;border:1px solid rgba(29,158,117,.35);border-radius:999px;font-weight:600}.modulation-audio-stack{display:grid;gap:12px;margin-top:12px}.modulation-audio-panel,.modulation-macros--audio{background:var(--bg-0);border:1px solid var(--border);border-radius:12px;box-shadow:inset 0 0 0 1px #2a2d3a59}.modulation-macros--audio{padding:12px}.modulation-macros--disabled{opacity:.68}.modulation-macros__hint{margin-top:10px;color:var(--text-dim)}@keyframes macro-beat-pulse{0%,to{box-shadow:0 0 0 1px var(--accent)}45%{box-shadow:0 0 10px 2px var(--accent),inset 0 0 6px #7f77dd26}}.modulation-macro-pill--active{animation:macro-beat-pulse var(--macro-beat-dur, .5s) ease-in-out infinite;border-color:var(--accent)}@media (prefers-reduced-motion: reduce){.tab,.tab:before,.tab:after,.tab__icon-wrap{transition:none}.tab.active,.modulation-macro-pill--active{animation:none}}.audio-map-card__freq-meter{position:relative;height:28px;background:#0000004d;border-radius:8px;overflow:hidden;margin:8px 0;border:.5px solid var(--border)}.audio-map-card__freq-meter--active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 18%,transparent)}.audio-map-card__freq-band{position:absolute;top:2px;bottom:2px;border-radius:999px;background:color-mix(in srgb,var(--live) 18%,transparent);border:.5px solid color-mix(in srgb,var(--live) 45%,transparent);z-index:1}.audio-map-card__freq-bar{height:100%;background:var(--live);border-radius:8px;transition:width .06s linear;box-shadow:0 0 4px var(--live);min-width:0;position:relative;z-index:2}.audio-map-card__target-name{font-size:12px;font-weight:700;color:var(--live)}.audio-map-card__meter-note{font-size:10px;color:var(--text-dim);margin-bottom:6px}.audio-reactive-panel__header--toolbar{justify-content:flex-end}.audio-reactive-panel__intro{margin-top:8px}.audio-reactive-mappings{display:grid;grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));gap:10px;margin-top:12px}.audio-reactive-mapping-card{display:flex;flex-direction:column;gap:6px;padding:10px;border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);cursor:pointer;text-align:left;font:inherit;color:inherit;transition:border-color .12s ease,box-shadow .12s ease}.audio-reactive-mapping-card:hover{border-color:var(--border-strong)}.audio-reactive-mapping-card--active{border-color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.audio-reactive-mapping-card--live.audio-reactive-mapping-card--active{border-color:var(--live);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 28%,transparent)}.audio-reactive-mapping-card--preview{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 65%,transparent),inset 0 0 10px color-mix(in srgb,var(--accent) 16%,transparent)}.audio-reactive-mapping-card__head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;flex-wrap:wrap}.audio-reactive-mapping-card__meter{height:36px;margin:0}.audio-reactive-mapping-card__level{font-size:10px;color:var(--text-dim);font-variant-numeric:tabular-nums}.audio-mini-bars{width:100%;height:36px;display:block}.audio-mini-bars__bar{fill:color-mix(in srgb,var(--live) 18%,transparent)}.audio-mini-bars__bar--on{fill:var(--live)}.audio-mini-bars--live .audio-mini-bars__bar:not(.audio-mini-bars__bar--on){fill:color-mix(in srgb,var(--live) 28%,#0f3a2a 72%)}.audio-reactive-detail{margin-top:12px}.audio-band-reactivity{margin-bottom:12px;padding:12px;border:1px solid var(--border);border-radius:12px;background:color-mix(in srgb,var(--bg-1) 88%,transparent);display:grid;gap:10px}.audio-band-reactivity--live{border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.audio-band-reactivity--preview{border-color:color-mix(in srgb,var(--accent) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 14%,transparent)}.audio-band-reactivity__head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.audio-band-reactivity__hint{margin-top:4px;font-size:10px;color:var(--text-dim);line-height:1.35;max-width:36ch}.audio-band-reactivity__viz{display:grid;gap:10px}.audio-band-reactivity__spectrum{width:100%;height:36px;display:block;border-radius:8px;background:color-mix(in srgb,var(--bg-0) 70%,transparent)}.audio-band-reactivity__spectrum-bar{fill:color-mix(in srgb,var(--live) 18%,transparent)}.audio-band-reactivity__spectrum-bar--on{fill:var(--live)}.audio-band-reactivity__spectrum--live .audio-band-reactivity__spectrum-bar:not(.audio-band-reactivity__spectrum-bar--on){fill:color-mix(in srgb,var(--live) 28%,#0f3a2a 72%)}.audio-band-reactivity__meter-wrap{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:8px}.audio-band-reactivity__meter-label,.audio-band-reactivity__meter-value{font-size:10px;color:var(--text-dim);font-variant-numeric:tabular-nums}.audio-band-reactivity__meter{height:10px;border-radius:999px;background:color-mix(in srgb,var(--bg-0) 80%,transparent);overflow:hidden;border:1px solid var(--border)}.audio-band-reactivity__meter-fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--live) 55%,transparent),var(--live));transition:width .06s linear}.audio-band-reactivity__output{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11px}.audio-band-reactivity__output-label{color:var(--text-dim)}.audio-band-reactivity__output-value{font-variant-numeric:tabular-nums;color:var(--live-text);font-weight:600}.audio-band-presets{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.audio-band-presets .chip--ghost{border-style:dashed;color:var(--text-dim)}.audio-reactive-hz-pair{display:flex;align-items:center;gap:4px}.audio-reactive-hz-pair .framesync-input{width:100%;min-width:0}.audio-reactive-hz-pair__sep{color:var(--text-dim);font-size:11px;flex-shrink:0}.modulation-audio-band-card__controls--compact{grid-template-columns:1.2fr 1fr 1fr}.audio-reactive-panel__spectrum{margin-top:12px}.audio-spectrum-editor{position:relative;border:1px solid var(--border);border-radius:12px;background:var(--bg-1);overflow:hidden;box-shadow:inset 0 0 0 1px #2a2d3a59}.audio-spectrum-editor--live{border-color:color-mix(in srgb,var(--live) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 18%,transparent)}.audio-spectrum-editor__canvas{display:block;width:100%;height:120px;cursor:crosshair;touch-action:none}.audio-spectrum-editor__bands{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.audio-spectrum-editor__band{position:absolute;top:8px;bottom:8px;border-radius:8px;border:1px solid color-mix(in srgb,var(--band-color, var(--live)) 55%,transparent);background:color-mix(in srgb,var(--band-color, var(--live)) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 22%,transparent);opacity:calc(.55 + (var(--band-level, 0) * .45));transition:opacity .08s linear,box-shadow .12s ease;overflow:hidden}.audio-spectrum-editor__band-meter{position:absolute;left:0;right:0;bottom:0;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--band-color, var(--live)) 42%,transparent));pointer-events:none;transition:height .06s linear}.audio-spectrum-editor__band--active,.audio-spectrum-editor__band--dragging{opacity:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 65%,transparent),inset 0 0 12px color-mix(in srgb,var(--band-color, var(--live)) 18%,transparent)}.audio-spectrum-editor__band--preview{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 70%,transparent),inset 0 0 14px color-mix(in srgb,var(--accent) 20%,transparent)}.audio-spectrum-editor__band--reactive{box-shadow:0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 75%,transparent),inset 0 0 16px color-mix(in srgb,var(--band-color, var(--live)) calc(12% + var(--band-level, 0) * 28%),transparent)}.audio-spectrum-editor__band-label{position:absolute;top:4px;left:6px;font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--band-color, var(--live-text));text-shadow:0 1px 2px rgba(0,0,0,.65);z-index:1}.audio-spectrum-editor__band-level{position:absolute;right:6px;bottom:4px;font-size:9px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--band-color, var(--live-text));text-shadow:0 1px 2px rgba(0,0,0,.65);z-index:1}.audio-spectrum-editor__hint{padding:8px 10px 10px;font-size:10px;color:var(--text-dim);text-align:center;border-top:1px solid var(--border)}.audio-band-tabs{margin-top:12px}.audio-band-tabs__level{margin-left:6px;font-size:10px;opacity:.75;font-variant-numeric:tabular-nums}.modulation-audio-band-card{margin-top:12px}.modulation-audio-band-card__meter{margin-top:4px}.modulation-audio-band-card__controls{grid-template-columns:1.4fr repeat(2,minmax(0,1fr))}.modulation-audio-band-card__control--wide{grid-column:1 / -1}.audio-start-button.active{background:#1d9e7526;border-color:var(--live);color:var(--live-text)}.runs-browser>.sub-pills{margin-bottom:0}.forge-tab__endpoint{display:inline-flex;align-items:center;min-height:32px;padding:0 10px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis}.engine-main-summary{display:grid;grid-template-columns:1.8fr repeat(3,minmax(0,1fr));gap:10px;margin-top:12px}.engine-main-card{min-width:0;display:grid;gap:6px;padding:12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1)}.engine-main-card--wide{border-color:#7f77dd59;box-shadow:inset 0 0 0 1px #7f77dd14}.engine-main-card--picker{width:100%;text-align:left;cursor:pointer;transition:border-color .15s ease,transform .15s ease,box-shadow .15s ease}.engine-main-card--picker:hover:not(:disabled){border-color:#7f77dda6;box-shadow:inset 0 0 0 1px #7f77dd33,0 8px 24px #00000038;transform:translateY(-1px)}.engine-main-card--picker:disabled{opacity:.7;cursor:wait}.engine-main-card__hint{font-size:10px;color:var(--text-secondary);letter-spacing:.04em;text-transform:uppercase}.engine-model-picker{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:grid;place-items:center;padding:24px;background:#040810b8;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.engine-model-picker__dialog{width:min(760px,100%);max-height:min(80vh,720px);display:grid;gap:12px;padding:16px;border:1px solid rgba(127,119,221,.35);border-radius:14px;background:linear-gradient(180deg,#0c1220fa,#080d17fa);box-shadow:0 24px 64px #00000073;overflow:hidden}.engine-model-picker__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.engine-model-picker__header-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.engine-model-picker__subtitle,.engine-model-picker__status{margin-top:4px;color:var(--text-secondary)}.engine-model-picker__tabs{margin-top:0}.engine-model-picker__tab-count{margin-left:6px;opacity:.7;font-size:10px}.engine-model-picker__list{display:grid;gap:8px;overflow:auto;max-height:min(52vh,480px);padding-right:4px}.engine-model-picker__item{display:grid;gap:4px;width:100%;text-align:left;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);color:var(--text-primary);cursor:pointer;transition:border-color .15s ease,background .15s ease}.engine-model-picker__item:hover:not(:disabled){border-color:#7f77dd8c;background:#7f77dd14}.engine-model-picker__item.active{border-color:#7f77ddd9;box-shadow:inset 0 0 0 1px #7f77dd40}.engine-model-picker__item:disabled{opacity:.6;cursor:wait}.engine-model-picker__item-title{font-size:13px;font-weight:600;word-break:break-word}.engine-model-picker__item-meta{font-size:11px;color:var(--text-secondary);word-break:break-all}.engine-model-picker__empty{padding:18px 12px;border:1px dashed var(--border);border-radius:10px;color:var(--text-secondary);font-size:12px;text-align:center}.engine-main-card__value{font-size:22px;line-height:1.1;font-weight:700;color:var(--text-primary)}.engine-main-card__value--small{font-size:14px;line-height:1.3}.engine-main-card__value--model{font-size:15px;line-height:1.3;word-break:break-word}.engine-main-card__meta,.engine-main-inline-status,.forge-tab__note{font-size:11px;color:var(--text-secondary)}.engine-main-grid__model{min-width:0}.engine-main-slider__header{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.engine-main-slider__value{font-size:12px;color:var(--text-primary);font-variant-numeric:tabular-nums}.engine-main-slider{width:100%}.forge-tab__metadata{margin-top:14px;padding-top:12px;border-top:1px solid var(--border)}.video-swarm-browser{display:grid;gap:12px;margin-top:12px}.video-swarm-browser__toolbar{padding:12px;display:grid;gap:10px}.video-swarm-browser__toolbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.video-swarm-browser__roots{display:flex;gap:6px;align-items:center;min-width:200px;flex:1}.video-swarm-browser__sort{max-width:140px}.video-swarm-browser__zoom{display:grid;gap:4px;min-width:120px}.video-swarm-browser__zoom input[type=range]{width:100%;accent-color:var(--live)}.video-swarm-browser__path{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:11px}.video-swarm-browser__path code{font-family:var(--mono, ui-monospace, monospace);color:var(--text-secondary);word-break:break-all}.video-swarm-browser__count{font-size:10px;color:var(--text-dim)}.video-swarm-browser__status{margin:0}.video-swarm-browser__cloud-connect,.video-swarm-browser__newfolder{margin-top:10px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,.08);background:#08090d73;display:grid;gap:8px}.video-swarm-browser__cloud-connect-title{font-size:12px;font-weight:600;color:var(--text-secondary)}.video-swarm-browser__cloud-connect-row,.video-swarm-browser__cloud-video-form,.video-swarm-browser__newfolder{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.video-swarm-browser__cloud-connect-row .framesync-input,.video-swarm-browser__cloud-video-form .framesync-input{flex:1 1 200px;min-width:160px}.video-swarm-browser__cloud-hint{margin:0}.video-swarm-browser__cloud-list{display:grid;gap:6px}.video-swarm-browser__cloud-item{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.video-swarm-browser__cloud-item-main{flex:1 1 180px;text-align:left;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#ffffff0a;color:inherit;padding:8px 10px;cursor:pointer;display:grid;gap:2px}.video-swarm-browser__cloud-item-main:hover{border-color:#7f77dd73}.video-swarm-browser__cloud-panel{padding:12px;display:grid;gap:10px}.video-swarm-browser__cloud-panel-actions{display:flex;gap:8px;flex-wrap:wrap}.video-swarm-browser__upload-input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.video-swarm-browser__dropzone{position:relative;min-height:120px}.video-swarm-browser__dropzone--active{outline:2px dashed rgba(127,119,221,.65);outline-offset:4px;border-radius:12px;background:#7f77dd0f}.video-swarm-browser__dropzone-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;font-size:14px;font-weight:600;color:var(--accent-text);pointer-events:none;z-index:2}.video-swarm-browser__empty{padding:24px;text-align:center;font-size:12px;color:var(--text-dim);border:.5px dashed var(--border);border-radius:var(--radius-sm, 7px)}.video-swarm-browser__grid{columns:4;column-gap:10px;max-height:min(62vh,720px);overflow:auto;padding:4px}.video-swarm-browser__grid--zoom-0{columns:6}.video-swarm-browser__grid--zoom-1{columns:5}.video-swarm-browser__grid--zoom-2{columns:4}.video-swarm-browser__grid--zoom-3{columns:3}.video-swarm-browser__grid--zoom-4{columns:2}.video-swarm-browser__tile{break-inside:avoid;margin-bottom:10px;width:100%;display:grid;gap:4px;padding:0;border:.5px solid var(--border);border-radius:var(--radius-sm, 7px);background:var(--bg-3);overflow:hidden;cursor:pointer;text-align:left;font-family:inherit;transition:border-color .15s ease,box-shadow .15s ease}.video-swarm-browser__tile:hover,.video-swarm-browser__tile--hover{border-color:var(--border-strong)}.video-swarm-browser__tile--selected{border-color:var(--live);box-shadow:0 0 0 1px #1d9e7559}.video-swarm-browser__tile--folder{min-height:96px}.video-swarm-browser__folder-icon{aspect-ratio:16 / 9;display:grid;place-items:center;background:var(--bg-0);color:var(--text-dim);font-size:28px}.video-swarm-browser__video{width:100%;display:block;aspect-ratio:16 / 9;object-fit:cover;background:#000}.video-swarm-browser__placeholder{aspect-ratio:16 / 9;display:grid;place-items:center;background:var(--bg-0);color:var(--text-dim);font-size:22px}.video-swarm-browser__label{padding:0 8px;font-size:10px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-swarm-browser__meta{padding:0 8px 8px;font-size:9px;color:var(--text-dim)}.video-swarm-browser__modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;background:#08090deb;display:grid;place-items:center;padding:20px}.video-swarm-browser__modal-inner{width:min(96vw,1200px);max-height:96vh;display:grid;gap:12px}.video-swarm-browser__modal-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;color:var(--text-primary);font-size:13px}.video-swarm-browser__modal-actions{display:flex;flex-wrap:wrap;gap:6px}.video-swarm-browser__modal-video{width:100%;max-height:calc(96vh - 80px);border-radius:var(--radius-sm, 7px);background:#000}.video-swarm-browser__menu{position:fixed;z-index:1300;display:grid;gap:4px;padding:8px;background:var(--bg-2);border:.5px solid var(--border-strong);border-radius:var(--radius-sm, 7px);box-shadow:0 12px 40px #00000073}.library-browser{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}.library-browser__tabs{margin-bottom:2px;padding:0 2px}.library-browser__tab{display:inline-flex;align-items:center;gap:6px;font-weight:600;min-height:34px}.library-browser__tab.active{border-color:color-mix(in srgb,var(--library-accent, var(--accent)) 55%,var(--border));color:var(--text-primary);background:color-mix(in srgb,var(--library-accent, var(--accent)) 14%,var(--bg-2))}.library-browser__pane{display:flex;flex-direction:column;min-height:0;flex:1}.library-browser__panel{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}.library-browser__toolbar{display:grid;gap:10px;padding:10px 12px}.library-browser__head{display:grid;gap:4px}.library-browser__subtitle{margin:0}.library-browser__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.library-browser__actions .framesync-button{display:inline-flex;align-items:center;gap:6px}.library-browser__upload-input{display:none}.library-browser__status{margin:0}.library-browser__dropzone{position:relative;flex:1;min-height:280px;overflow:auto;border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-1)}.library-browser__dropzone--active{border-color:color-mix(in srgb,var(--library-accent) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--library-accent) 20%,transparent)}.library-browser__dropzone-hint{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:var(--library-accent);background:#08090db8;pointer-events:none}.library-browser__empty{min-height:220px;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;color:var(--text-dim);font-size:13px}.library-browser__skeleton-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;padding:12px}.library-browser__skeleton-card{display:grid;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--border);background:var(--bg-2)}.library-browser__skeleton-media{aspect-ratio:16 / 9;border-radius:8px;background:linear-gradient(110deg,#ffffff0a 8%,#ffffff1a 18%,#ffffff0a 33%);background-size:200% 100%;animation:library-shimmer 1.35s ease-in-out infinite}.library-browser__skeleton-line{height:10px;width:55%;border-radius:999px;background:linear-gradient(110deg,#ffffff0a 8%,#ffffff1a 18%,#ffffff0a 33%);background-size:200% 100%;animation:library-shimmer 1.35s ease-in-out infinite}.library-browser__skeleton-line--wide{width:82%;height:12px}@keyframes library-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}.library-browser__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;padding:12px}.library-browser__card{display:grid;grid-template-rows:auto 1fr auto;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--border);background:var(--bg-2);cursor:pointer;text-align:left;transition:border-color .15s,box-shadow .15s,transform .15s}.library-browser__card:hover,.library-browser__card--hover,.library-browser__card--selected{border-color:color-mix(in srgb,var(--library-accent, var(--accent)) 45%,var(--border));box-shadow:0 8px 24px #00000047}.library-browser__media{position:relative;aspect-ratio:16 / 9;border-radius:8px;overflow:hidden;background:var(--media-bg)}.library-browser__media-loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:flex;align-items:center;justify-content:center;background:#08090d8c}.library-browser__video,.library-browser__thumb{width:100%;height:100%;object-fit:cover;display:block}.library-browser__video--poster{pointer-events:none}.library-browser__placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:28px;background:linear-gradient(145deg,#7f77dd1f,#1d9e7514)}.library-browser__badges{position:absolute;left:8px;bottom:8px;display:flex;flex-wrap:wrap;gap:6px;z-index:1}.library-browser__badge{padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-primary);background:#08090dc7;border:1px solid rgba(255,255,255,.08)}.library-browser__badge--video{color:var(--live-text);border-color:#1d9e7559}.library-browser__badge--recording{color:var(--warn);border-color:#ef9f2759}.library-browser__badge--run{color:var(--accent-text);border-color:#7f77dd59}.library-browser__badge--audio{color:#c4b5fd;border-color:#a78bfa59}.library-audio-card__media{display:flex;align-items:center;justify-content:center}.library-audio-card__wave{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;justify-content:center;gap:3px;padding:18% 12%;opacity:.45}.library-audio-card__wave--active{opacity:.85}.library-audio-card__bar{flex:1;max-width:8px;min-height:8px;border-radius:999px;background:linear-gradient(180deg,#a78bfaf2,#7f77dd8c);transform-origin:bottom center;animation:library-audio-bar 1.1s ease-in-out infinite;animation-play-state:paused}.library-audio-card__wave--active .library-audio-card__bar,.library-audio-card--playing .library-audio-card__bar{animation-play-state:running}@keyframes library-audio-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.library-audio-card__icon{position:relative;z-index:1;font-size:28px;color:#c4b5fd8c;pointer-events:none}.library-audio-card--playing .library-audio-card__icon,.library-audio-card--hover .library-audio-card__icon,.library-browser__card--selected.library-audio-card .library-audio-card__icon{opacity:.15}.library-audio-card__audio{position:absolute;width:0;height:0;opacity:0;pointer-events:none}.library-browser__title{margin:0;font-size:13px;font-weight:700;color:var(--text-primary);line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.library-browser__meta{margin:4px 0 0;font-size:11px;color:var(--text-dim)}.library-browser__card-actions{display:flex;flex-wrap:wrap;gap:6px}.library-browser__modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1400;display:flex;align-items:center;justify-content:center;padding:20px;background:#000000d1}.library-browser__modal-inner{width:min(960px,100%);display:grid;gap:10px;padding:12px;border-radius:14px;border:1px solid var(--border);background:var(--bg-1)}.library-browser__modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.library-browser__modal-actions{display:flex;flex-wrap:wrap;gap:6px}.library-browser__modal-video{width:100%;max-height:min(72vh,720px);border-radius:10px;background:#000}.projects-browser{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}@media (max-width: 900px){.stage-rack-overlay,.studio-right-column{position:static;width:100%;max-height:none}.img2img-dropgrid{grid-template-columns:1fr}.generate-sequencer__hero-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.generate-sequencer__control-span{grid-column:span 1}.engine-main-summary,.layout--stage,.layout--studio{grid-template-columns:1fr}.modulation-lfo-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 600px){.generate-sequencer__hero-grid{grid-template-columns:1fr}.modulation-lfo-grid{grid-template-columns:1fr!important}}.layout--editor .preview{max-width:none;width:100%;display:flex;flex-direction:column;grid-template-rows:none}.layout--editor .preview-bottom-dock{display:none}.editor-workspace-shell{display:grid;gap:10px;min-height:min(78vh,900px);grid-template-rows:auto 1fr}.editor-workspace-shell__toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:0 2px 4px}.editor-workspace-shell__status{font-size:11px;color:var(--text-dim);max-width:min(520px,100%);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-workspace-shell__status--live{color:var(--live-text)}.editor-workspace-shell .editor-view{min-height:0}.editor-view{display:grid;gap:10px;min-height:0;height:100%}.editor-view .editor-shell{display:grid;grid-template-rows:auto auto auto 1fr;gap:10px;min-height:min(76vh,880px)}.editor-shell__header{align-items:flex-start;gap:10px}.editor-shell__titles{display:grid;gap:4px}.editor-shell__subtitle{margin:0}.editor-shell__actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.editor-shell__pills{margin:0}.editor-shell__status{font-size:11px;color:var(--text-dim);padding:4px 8px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-1)}.editor-shell__status--live{border-color:var(--live);color:var(--live-text)}.editor-shell__body{min-height:0;display:grid;gap:8px}.editor-view__import{display:grid;gap:6px;padding:8px 10px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-1)}.editor-view__import-url{font-size:10px;word-break:break-all;color:var(--text-secondary)}.editor-view__import-hint{margin:0}.editor-view__frame{width:100%;min-height:min(68vh,760px);border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-0)}.library-storage-browser__header{margin-bottom:0}.library-storage-browser__actions{display:flex;flex-wrap:wrap;gap:8px}.motion-view__tabs{margin-bottom:10px}.prompt-style-bar__row{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:10px}.prompt-style-bar__select{flex:1 1 220px;min-width:180px}.prompt-style-bar__auto{font-size:11px;color:var(--text-secondary);white-space:nowrap}.prompt-style-bar__hint{margin:8px 0 0;font-size:11px;line-height:1.45}.engine-seed-control,.deforum-seed-control{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px}.engine-seed-control__label{font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em}.engine-seed-control__input,.deforum-seed-control__input{width:7.5rem;font-variant-numeric:tabular-nums}.engine-seed-control__random-hint,.deforum-seed-control__hint{font-size:11px;color:var(--text-dim)}.deforum-seed-control{width:100%}.styles-settings__header-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.styles-settings__count{font-size:11px;color:var(--text-dim)}.styles-settings__intro,.styles-settings__status{margin:8px 0 0}.styles-settings__search{margin-top:10px;width:100%}.styles-settings__body{display:grid;grid-template-columns:minmax(220px,280px) minmax(0,1fr);gap:12px;align-items:start}@media (max-width: 1200px){.styles-settings__body{grid-template-columns:1fr}}.styles-settings__list{display:flex;flex-direction:column;gap:6px;max-height:min(62vh,640px);overflow:auto}.styles-settings__item{display:grid;grid-template-columns:48px 1fr auto;gap:10px;align-items:center;width:100%;padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary);text-align:left;cursor:pointer}.styles-settings__item:hover{border-color:var(--border-strong)}.styles-settings__item.active{border-color:var(--accent);box-shadow:0 0 0 1px #7f77dd59}.styles-settings__item.selected{background:#7f77dd1a}.styles-settings__thumb{width:48px;height:48px;border-radius:6px;overflow:hidden;background:var(--bg-0);border:1px solid var(--border)}.styles-settings__thumb img{width:100%;height:100%;object-fit:cover;display:block}.styles-settings__thumb--empty{background:linear-gradient(135deg,#7f77dd33,#2de2ff1f)}.styles-settings__item-title{font-size:12px;font-weight:600}.styles-settings__item-meta{font-size:10px;color:var(--text-dim);margin-top:2px}.styles-settings__active-tag{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--accent-text);padding:2px 6px;border-radius:999px;border:1px solid rgba(127,119,221,.45)}.styles-settings__editor{min-width:0}.styles-settings__field{display:flex;flex-direction:column;gap:4px;margin-top:10px}.styles-settings__example-preview{margin-top:10px;border-radius:var(--radius-sm);overflow:hidden;border:1px solid var(--border);max-height:220px}.styles-settings__example-preview img{width:100%;display:block;object-fit:contain;background:var(--bg-0)}.styles-settings__editor-actions{flex-wrap:wrap;margin-top:12px}.styles-settings__upload{position:relative;overflow:hidden;cursor:pointer}.styles-settings__upload-input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;cursor:pointer}.sequencer-controls-panel--stage .stage-sequencer-bar{border:.5px solid var(--border);background:var(--bg-1);border-radius:var(--radius-sm)}.live-hud-dock .live-hud-modulating,.live-hud-dock .live-hud-morph{width:100%}.live-hud-mod-row{margin-bottom:7px}.live-hud-mod-row__info{display:flex;justify-content:space-between;align-items:baseline;font-size:10px;color:var(--live-text);margin-bottom:4px}.live-hud-mod-row__source{color:var(--text-2)}.live-hud-mod-row__val{font-family:var(--mono)}.live-hud-mod-row__bar{height:3px;background:#1d9e7533;border-radius:2px}.live-hud-mod-row__fill{height:100%;background:var(--live);border-radius:2px;transition:width .12s}.live-hud-morph__labels{display:flex;justify-content:space-between;font-size:10px;margin-bottom:8px}.live-hud-morph__a{color:var(--a-group)}.live-hud-morph__b{color:var(--b-group)}.live-hud-morph__slider-wrap{margin-bottom:8px}.live-hud-morph__slider{width:100%}.live-hud-morph__actions{display:flex;gap:5px}.live-hud-morph__actions .framesync-button{flex:1;font-size:10px}@keyframes beat-pulse{0%{box-shadow:0 0 0 1px var(--accent)}50%{box-shadow:0 0 8px 2px var(--accent),inset 0 0 4px #7f77dd2e}to{box-shadow:0 0 0 1px var(--accent)}}.beat-macro-pill--pulsing{animation:beat-pulse .2s ease-out}.ui-icon[data-v-f0fded0e]{width:1em;height:1em;display:inline-block;vertical-align:middle;flex-shrink:0}.status-strip[data-v-4e565d39]{display:flex;gap:8px;align-items:center;justify-content:flex-end;flex-wrap:wrap}.ss-session[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center;gap:6px}.ss-session__new[data-v-4e565d39]{padding:4px 10px;min-width:30px;justify-content:center}.ss-session-popover[data-v-4e565d39]{position:absolute;right:0;top:calc(100% + 8px);width:min(520px,92vw);max-height:min(60vh,520px);overflow:auto;border-radius:14px;border:.5px solid var(--border);background:#0a0c12eb;box-shadow:0 24px 70px #00000073;padding:10px;z-index:40}.ss-session-empty[data-v-4e565d39]{font-size:11px;color:var(--text-dim);padding:8px 2px}.ss-session-list[data-v-4e565d39]{display:grid;gap:8px;margin-top:6px}.ss-session-row[data-v-4e565d39]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;padding:8px;border-radius:12px;border:.5px solid rgba(255,255,255,.08);background:#ffffff05}.ss-session-row--active[data-v-4e565d39]{border-color:#7f77dd73;box-shadow:inset 0 0 0 1px #7f77dd1f}.ss-session-pick[data-v-4e565d39]{display:grid;gap:2px;text-align:left;color:var(--text-primary);background:transparent;border:none;cursor:pointer;padding:2px 4px;min-width:0}.ss-session-name[data-v-4e565d39]{font-size:12px;font-weight:800;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss-session-meta[data-v-4e565d39]{font-size:10px;color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase}.ss-session-actions[data-v-4e565d39]{display:inline-flex;gap:6px;align-items:center}.ss-transport[data-v-4e565d39]{border-left:none;border-radius:12px;border:.5px solid var(--border);background:#11131cb8;padding:4px;gap:3px}.ss-transport .header-transport__btn[data-v-4e565d39]{width:36px;height:36px}.ss-transport .header-transport__btn--preview[data-v-4e565d39],.ss-transport .header-transport__btn--stream[data-v-4e565d39]{width:auto;min-width:36px;padding:0 10px;gap:5px}.ss-transport .header-transport__btn--stream.header-transport__btn--active[data-v-4e565d39]{color:var(--live-text);border-color:#1d9e758c;box-shadow:0 0 10px #1d9e7533}.ss-transport .header-transport__btn--stream-stop[data-v-4e565d39]{width:36px}.header-transport__preview-label[data-v-4e565d39]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.header-transport__preview-loading[data-v-4e565d39]{font-size:10px}.ss-btn[data-v-4e565d39]{display:inline-flex;align-items:center;gap:4px;padding:4px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);font-size:11px;font-weight:700;cursor:pointer;transition:color .12s,border-color .12s,box-shadow .12s;white-space:nowrap}.ss-icon[data-v-4e565d39]{font-size:13px}.ss-label[data-v-4e565d39]{font-size:9px;text-transform:uppercase;letter-spacing:.08em}.ss-btn--ghost[data-v-4e565d39]{background:transparent;border-color:transparent}.ss-btn--ghost[data-v-4e565d39]:hover{border-color:var(--border)}.ss-btn--active[data-v-4e565d39]{color:var(--live-text);border-color:var(--live);box-shadow:0 0 8px #1d9e7540}.ss-btn--recording[data-v-4e565d39]{color:var(--error);border-color:var(--error);animation:ss-rec-pulse-4e565d39 1.5s ease-in-out infinite}@keyframes ss-rec-pulse-4e565d39{0%,to{opacity:1}50%{opacity:.55}}.ss-pill[data-v-4e565d39]{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);font-size:11px;white-space:nowrap}.ss-pill--button[data-v-4e565d39]{cursor:pointer;color:inherit}.ss-pill--live[data-v-4e565d39]{border-color:#1d9e7566}.ss-pill--error[data-v-4e565d39]{border-color:#e24b4a66}.ss-pill--warn[data-v-4e565d39]{border-color:#ef9f2759}.ss-pill--morph[data-v-4e565d39]{border-color:color-mix(in srgb,var(--b-group) 50%,transparent);color:var(--text-secondary)}.ss-pill--morph strong[data-v-4e565d39]{color:var(--b-group)}.ss-key[data-v-4e565d39]{font-size:9px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-dim)}.ss-pill strong[data-v-4e565d39]{font-size:11px;color:var(--text-secondary)}.ss-dot[data-v-4e565d39]{width:6px;height:6px;border-radius:50%;background:var(--border-strong);flex-shrink:0}.ss-pill--live .ss-dot[data-v-4e565d39]{background:var(--live);box-shadow:0 0 5px var(--live)}.ss-pill--error .ss-dot[data-v-4e565d39]{background:var(--error);box-shadow:0 0 5px var(--error)}.ss-pill--warn .ss-dot[data-v-4e565d39]{background:var(--warn);box-shadow:0 0 5px var(--warn)}.ss-help[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center}.ss-help-popover[data-v-4e565d39]{position:absolute;top:calc(100% + 10px);right:0;z-index:30;width:min(360px,calc(100vw - 28px));padding:12px;border-radius:14px;border:.5px solid var(--border);background:#08090df5;box-shadow:0 18px 40px #00000059;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}.ss-health[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center}.ss-health-popover[data-v-4e565d39]{position:absolute;top:calc(100% + 10px);right:0;z-index:30;width:min(320px,calc(100vw - 28px));padding:12px;border-radius:14px;border:.5px solid var(--border);background:#08090df5;box-shadow:0 18px 40px #00000059;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}.ss-health-popover__header[data-v-4e565d39]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ss-health-popover__title[data-v-4e565d39]{font-size:12px;font-weight:700;color:var(--text-primary);letter-spacing:.04em;text-transform:uppercase}.ss-health-grid[data-v-4e565d39]{display:grid;grid-template-columns:1fr;gap:8px;margin-top:10px}.ss-help-popover__header[data-v-4e565d39]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ss-help-popover__title[data-v-4e565d39]{font-size:12px;font-weight:700;color:var(--text-primary);letter-spacing:.04em;text-transform:uppercase}.ss-help-popover__close[data-v-4e565d39]{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);cursor:pointer}.ss-help-grid[data-v-4e565d39]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:12px}.ss-help-section[data-v-4e565d39]{display:grid;gap:6px;padding:10px;border-radius:10px;border:.5px solid var(--border);background:#ffffff05}.ss-help-section__title[data-v-4e565d39]{font-size:10px;font-weight:700;color:var(--text-primary);letter-spacing:.08em;text-transform:uppercase}.ss-help-section__items[data-v-4e565d39]{display:grid;gap:5px;font-size:11px;line-height:1.5;color:var(--text-secondary)}.ss-help-popover kbd[data-v-4e565d39]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;min-height:20px;padding:0 6px;margin:0 2px;border-radius:6px;border:.5px solid var(--border-strong);background:var(--bg-2);color:var(--text-primary);font-size:10px;font-family:inherit;font-weight:700}@media (max-width: 900px){.ss-help-grid[data-v-4e565d39]{grid-template-columns:1fr}}.glass-panel[data-v-2ca4403b]{background:#11131cd9;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid var(--border);border-radius:11px;overflow:hidden}.glass-panel-header[data-v-2ca4403b]{padding:8px 12px 6px;border-bottom:.5px solid var(--border);font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.glass-panel-body[data-v-2ca4403b]{padding:10px 12px}.glass-panel--sm .glass-panel-body[data-v-2ca4403b]{padding:6px 10px}.glass-panel--lg .glass-panel-body[data-v-2ca4403b]{padding:14px 16px}.glass-panel--overlay[data-v-2ca4403b]{background:#11131c6b;backdrop-filter:blur(10px) saturate(1.08);-webkit-backdrop-filter:blur(10px) saturate(1.08);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.glass-panel--overlay .glass-panel-header[data-v-2ca4403b]{background:transparent;border-bottom-color:#ffffff0f}.lpr[data-v-a2b7413a]{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;gap:6px;align-items:start;padding:5px 0;border-bottom:.5px solid var(--border);opacity:.45;transition:opacity .2s}.lpr[data-v-a2b7413a]:last-child{border-bottom:none}.lpr--modulated[data-v-a2b7413a]{opacity:1}.lpr-main[data-v-a2b7413a]{min-width:0;display:flex;align-items:center;gap:4px;white-space:nowrap;overflow:hidden}.lpr-name[data-v-a2b7413a]{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lpr--modulated .lpr-name[data-v-a2b7413a]{color:var(--live)}.lpr-source[data-v-a2b7413a]{min-width:0;display:inline-flex;align-items:center;gap:2px;font-size:8px;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lpr-source-icon[data-v-a2b7413a]{font-size:9px}.lpr-source-text[data-v-a2b7413a]{min-width:0;overflow:hidden;text-overflow:ellipsis}.lpr-bar-wrap[data-v-a2b7413a]{grid-column:1 / -1;height:3px;border-radius:2px;background:var(--bg-1);overflow:hidden;margin-top:1px}.lpr-bar[data-v-a2b7413a]{height:100%;border-radius:2px;background:var(--text-dim);transition:width .06s}.lpr--modulated .lpr-bar[data-v-a2b7413a]{background:var(--live);box-shadow:0 0 4px var(--live)}.lpr-value[data-v-a2b7413a]{grid-column:2;font-family:ui-monospace,Cascadia Code,monospace;font-size:10px;color:var(--text-dim);text-align:right;white-space:nowrap;padding-top:1px}.lpr--modulated .lpr-value[data-v-a2b7413a]{color:var(--live-text)}.track-lane[data-v-64013507]{display:grid;grid-template-columns:132px minmax(0,1fr);gap:10px;align-items:center}.track-lane__label[data-v-64013507]{border:1px solid var(--border);border-radius:10px;background:var(--bg-1);color:var(--text-primary);min-height:72px;padding:10px 12px;text-align:left;cursor:pointer;display:grid;gap:4px}.track-lane--selected .track-lane__label[data-v-64013507]{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 18%,transparent) inset}.track-lane__name[data-v-64013507]{font-size:12px;font-weight:700;color:var(--text-primary)}.track-lane__meta[data-v-64013507]{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em}.track-lane__graph[data-v-64013507]{position:relative;min-height:72px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 8%,transparent),color-mix(in srgb,var(--accent) 2%,transparent)),linear-gradient(90deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),linear-gradient(180deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),var(--bg-0);background-size:auto,10% 100%,100% 25%,auto;overflow:hidden;cursor:pointer}.track-lane--selected .track-lane__graph[data-v-64013507]{border-color:var(--accent)}.track-lane__path[data-v-64013507]{position:absolute;top:8px;right:8px;bottom:8px;left:8px;width:calc(100% - 16px);height:calc(100% - 16px);overflow:visible}.track-lane__path polyline[data-v-64013507]{fill:none;stroke:var(--accent);stroke-width:1.4;vector-effect:non-scaling-stroke}.track-lane__playhead[data-v-64013507]{position:absolute;top:0;bottom:0;width:2px;background:var(--live);box-shadow:0 0 8px color-mix(in srgb,var(--live) 35%,transparent);transform:translate(-50%)}.track-lane__keyframe[data-v-64013507]{position:absolute;width:14px;height:14px;border:1px solid var(--accent);background:var(--bg-1);border-radius:3px;transform:translate(-50%,-50%) rotate(45deg);cursor:grab;padding:0}.track-lane__keyframe[data-v-64013507]:active{cursor:grabbing}.track-lane__tooltip[data-v-64013507]{position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%) rotate(-45deg);border-radius:6px;background:var(--bg-2);border:1px solid var(--border-strong);color:var(--text-primary);padding:4px 6px;font-size:10px;white-space:nowrap;pointer-events:none}@media (max-width: 768px){.track-lane[data-v-64013507]{grid-template-columns:1fr}.track-lane__label[data-v-64013507]{min-height:auto}}.timeline-hero[data-v-728f6ade]{border:1px solid var(--border);border-radius:14px;background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 8%,transparent),color-mix(in srgb,var(--bg-1) 96%,transparent));padding:12px;display:grid;gap:12px}.timeline-hero--compact[data-v-728f6ade]{gap:10px}.timeline-hero__header[data-v-728f6ade]{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.timeline-hero__header-actions[data-v-728f6ade]{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.timeline-hero__title-block[data-v-728f6ade]{display:grid;gap:4px}.timeline-hero__eyebrow[data-v-728f6ade]{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.timeline-hero__time[data-v-728f6ade]{font-size:14px;color:var(--text-primary)}.timeline-hero__frame[data-v-728f6ade]{font-size:13px;color:var(--text-secondary)}.timeline-hero__frame--live[data-v-728f6ade]{color:var(--live-text);text-shadow:0 0 10px color-mix(in srgb,var(--live) 28%,transparent)}.timeline-hero__summary[data-v-728f6ade]{font-size:11px;color:var(--text-dim)}.timeline-hero__toggle[data-v-728f6ade]{border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);border-radius:999px;padding:4px 10px;font-size:10px;cursor:pointer}.timeline-hero__body[data-v-728f6ade]{position:relative;display:grid;gap:10px}.timeline-hero__shared-playhead[data-v-728f6ade]{position:absolute;top:0;bottom:0;width:2px;background:color-mix(in srgb,var(--live) 55%,transparent);box-shadow:0 0 10px color-mix(in srgb,var(--live) 28%,transparent);transform:translate(-50%);z-index:1;pointer-events:none}.timeline-hero__filmstrip[data-v-728f6ade]{position:relative;min-height:92px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--bg-2) 86%,transparent),var(--bg-0));overflow:hidden}.timeline-hero__filmstrip--empty[data-v-728f6ade]{display:flex;align-items:center;justify-content:center}.timeline-hero__filmstrip-empty[data-v-728f6ade]{color:var(--text-dim);font-size:11px}.timeline-hero__frame[data-v-728f6ade]{position:absolute;top:10px;width:74px;transform:translate(-50%);display:grid;gap:4px;border:none;background:transparent;padding:0;cursor:pointer;z-index:2}.timeline-hero__frame-image[data-v-728f6ade],.timeline-hero__frame-placeholder[data-v-728f6ade]{width:74px;height:42px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);object-fit:cover;box-shadow:0 8px 18px #00000047}.timeline-hero__frame-placeholder[data-v-728f6ade]{display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:10px}.timeline-hero__frame-label[data-v-728f6ade]{font-size:9px;color:var(--text-secondary);white-space:nowrap}.timeline-hero__content-lanes[data-v-728f6ade]{display:grid;gap:6px}.timeline-hero__content-lane[data-v-728f6ade]{display:grid;grid-template-columns:72px 1fr;gap:8px;align-items:center}.timeline-hero__content-lane-label[data-v-728f6ade]{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim)}.timeline-hero__content-lane-track[data-v-728f6ade]{position:relative;min-height:28px;border:1px solid var(--border);border-radius:8px;background:var(--bg-0);overflow:hidden}.timeline-hero__clip[data-v-728f6ade]{position:absolute;top:4px;bottom:4px;min-width:28px;border:1px solid var(--border-strong);border-radius:6px;padding:0 6px;display:flex;align-items:center;cursor:pointer;overflow:hidden;z-index:2}.timeline-hero__clip--prompt[data-v-728f6ade]{background:color-mix(in srgb,var(--accent) 22%,var(--bg-2));border-color:color-mix(in srgb,var(--accent) 45%,var(--border))}.timeline-hero__clip--lora[data-v-728f6ade]{background:color-mix(in srgb,var(--live) 18%,var(--bg-2));border-color:color-mix(in srgb,var(--live) 40%,var(--border))}.timeline-hero__clip--controlnet[data-v-728f6ade]{background:color-mix(in srgb,var(--warn) 18%,var(--bg-2));border-color:color-mix(in srgb,var(--warn) 42%,var(--border))}.timeline-hero__clip--selected[data-v-728f6ade]{box-shadow:0 0 0 1px var(--accent)}.timeline-hero__clip-label[data-v-728f6ade]{font-size:9px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-hero__content-lane-empty[data-v-728f6ade]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:9px;color:var(--text-dim);pointer-events:none}.timeline-hero__ruler[data-v-728f6ade]{position:relative;min-height:64px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(90deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),linear-gradient(180deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),var(--bg-0);background-size:10% 100%,100% 50%,auto;overflow:hidden;cursor:ew-resize}.timeline-hero__marker[data-v-728f6ade]{position:absolute;top:10px;bottom:0;width:0;transform:translate(-50%)}.timeline-hero__marker[data-v-728f6ade]:before{content:"";position:absolute;top:24px;bottom:0;left:50%;width:1px;background:color-mix(in srgb,var(--text-primary) 16%,transparent)}.timeline-hero__marker-label[data-v-728f6ade]{position:relative;left:50%;transform:translate(-50%);border:1px solid var(--border-strong);background:var(--bg-2);color:var(--text-primary);border-radius:999px;padding:4px 8px;font-size:10px;white-space:nowrap;cursor:pointer}.timeline-hero__playhead[data-v-728f6ade]{position:absolute;top:0;bottom:0;width:2px;background:var(--live);box-shadow:0 0 10px color-mix(in srgb,var(--live) 40%,transparent);transform:translate(-50%)}.timeline-hero__playhead-handle[data-v-728f6ade]{position:absolute;top:8px;left:50%;width:14px;height:14px;border-radius:50%;background:var(--live);transform:translate(-50%);box-shadow:0 0 0 4px color-mix(in srgb,var(--live) 16%,transparent)}.timeline-hero__lanes[data-v-728f6ade]{display:grid;gap:10px;position:relative;z-index:2}.timeline-hero__compact-note[data-v-728f6ade]{font-size:11px;color:var(--text-dim)}.timeline-hero__empty[data-v-728f6ade]{min-height:120px;border:1px dashed var(--border);border-radius:12px;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:12px;background:var(--bg-0)}@media (max-width: 768px){.timeline-hero__header-actions[data-v-728f6ade]{width:100%;justify-content:space-between}.timeline-hero__frame[data-v-728f6ade]{width:60px}.timeline-hero__frame-image[data-v-728f6ade],.timeline-hero__frame-placeholder[data-v-728f6ade]{width:60px;height:36px}}.three-background[data-v-6dbfbc00]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;overflow:hidden;background:transparent}.three-background[data-v-6dbfbc00] canvas{width:100%;height:100%;display:block}.library-shell[data-v-73077ca3]{display:grid;gap:12px}.library-shell--fullscreen[data-v-73077ca3]{position:fixed;top:8px;right:8px;bottom:8px;left:8px;z-index:999;padding:12px;background:#08090deb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.08);border-radius:14px;overflow:auto}.library-shell--workspace[data-v-73077ca3]{display:flex;flex-direction:column;min-height:0;height:100%;gap:8px}.library-shell--workspace .library-storage-browser[data-v-73077ca3]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.library-storage-browser[data-v-73077ca3]{display:grid;gap:12px;min-height:0}.waveform[data-v-fb4eb07f]{display:block;overflow:visible}.waveform--active polyline[data-v-fb4eb07f]{filter:drop-shadow(0 0 2px var(--live))}.target-cell[data-v-6d546a48]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px 4px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-2);cursor:pointer;min-width:0;transition:border-color .12s,background .12s,box-shadow .12s;text-align:center}.target-cell[data-v-6d546a48]:hover{border-color:var(--border-strong)}.target-cell--routed[data-v-6d546a48]{border-color:var(--live);background:#1d9e7514;box-shadow:0 0 6px #1d9e752e}.target-cell--selected[data-v-6d546a48]{border-color:var(--accent);background:#7f77dd1a;box-shadow:0 0 6px #7f77dd33}.target-cell--focused[data-v-6d546a48]{outline:2px solid var(--warn);outline-offset:1px}.target-cell-label[data-v-6d546a48]{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.target-cell--routed .target-cell-label[data-v-6d546a48]{color:var(--live-text)}.target-cell--selected .target-cell-label[data-v-6d546a48]{color:var(--accent-text)}.target-cell-owners[data-v-6d546a48]{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:2px}.target-cell-owner[data-v-6d546a48]{font-size:8px;color:var(--live);white-space:nowrap;font-weight:700;border:.5px solid color-mix(in srgb,var(--live) 35%,transparent);border-radius:999px;padding:1px 4px}.target-cell-extra[data-v-6d546a48]{color:var(--text-dim);font-size:8px;font-weight:700}.stream-shell[data-v-090e0a6b]{display:grid;gap:14px;max-width:980px}.stream-card[data-v-090e0a6b]{display:grid;gap:12px}.stream-active-section[data-v-090e0a6b]{display:grid;gap:10px}.stream-active-header[data-v-090e0a6b]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px}.stream-active-list[data-v-090e0a6b]{display:grid;gap:10px}.stream-active-row[data-v-090e0a6b]{display:grid;grid-template-columns:minmax(0,1.4fr) auto auto;gap:12px;align-items:center;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:var(--bg-1)}.stream-active-row--live[data-v-090e0a6b]{border-color:#1d9e7573;box-shadow:inset 0 0 0 1px #1d9e751f}.stream-active-row__main[data-v-090e0a6b]{min-width:0;display:grid;gap:4px}.stream-active-row__title[data-v-090e0a6b]{font-size:12px;font-weight:700;color:var(--text-primary)}.stream-active-row__target[data-v-090e0a6b]{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stream-active-row__metrics[data-v-090e0a6b]{display:flex;flex-wrap:wrap;gap:12px;align-items:center}.stream-metric[data-v-090e0a6b]{display:grid;gap:2px;text-align:center;min-width:52px}.stream-metric__label[data-v-090e0a6b]{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim)}.stream-metric strong[data-v-090e0a6b]{font-size:12px;color:var(--text-primary)}.stream-health-pill[data-v-090e0a6b]{display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border:.5px solid var(--border);color:var(--text-secondary);background:var(--bg-2)}.stream-health-pill--live[data-v-090e0a6b]{color:var(--live-text);border-color:#1d9e7573;background:#1d9e7524}.stream-health-pill--warn[data-v-090e0a6b]{color:var(--warn-text);border-color:#ef9f2773;background:#ef9f2724}.stream-health-pill--error[data-v-090e0a6b]{color:var(--error-text);border-color:#e24b4a73;background:#e24b4a24}.stream-health-pill--dim[data-v-090e0a6b]{color:var(--text-dim)}.stream-active-row__actions[data-v-090e0a6b]{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.stream-view-link[data-v-090e0a6b]{text-decoration:none;display:inline-flex;align-items:center}.stream-card__actions[data-v-090e0a6b],.stream-quick-add[data-v-090e0a6b],.stream-destination__actions[data-v-090e0a6b],.stream-endpoints[data-v-090e0a6b]{display:flex;flex-wrap:wrap;gap:8px}.stream-hls-controls[data-v-090e0a6b]{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:10px}.stream-preview[data-v-090e0a6b]{border:1px solid var(--border);border-radius:14px;overflow:hidden;background:var(--bg-0)}.stream-preview-status[data-v-090e0a6b]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:4px 10px;border-radius:999px;border:.5px solid var(--border)}.stream-preview-status--live[data-v-090e0a6b]{color:var(--live-text);border-color:#1d9e7573;background:#1d9e751f}.stream-preview-status--idle[data-v-090e0a6b]{color:var(--text-dim)}.stream-preview__video[data-v-090e0a6b]{width:100%;min-height:260px;display:block;background:var(--media-bg)}.stream-endpoint[data-v-090e0a6b],.stream-destination__grid[data-v-090e0a6b]{border:1px solid var(--border);border-radius:12px;background:var(--bg-1);color:var(--text-primary)}.stream-endpoint[data-v-090e0a6b]{display:grid;grid-template-columns:auto auto minmax(0,1fr);gap:8px;align-items:center;padding:10px 12px;text-decoration:none;min-width:min(100%,280px)}.stream-endpoint__label[data-v-090e0a6b]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.stream-endpoint__value[data-v-090e0a6b]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim)}.stream-card__status[data-v-090e0a6b],.stream-empty[data-v-090e0a6b]{font-size:11px;color:var(--text-dim)}.stream-status-pill[data-v-090e0a6b]{border-radius:999px;padding:4px 10px;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--border);color:var(--text-secondary);background:var(--bg-2)}.stream-status-pill--live[data-v-090e0a6b]{color:var(--live-text);border-color:#1d9e7580;background:#1d9e7529}.stream-status-pill--error[data-v-090e0a6b]{color:var(--error-text);border-color:#e24b4a73;background:#e24b4a29}.stream-status-pill--idle[data-v-090e0a6b]{color:var(--warn-text);border-color:#ef9f2773;background:#ef9f2729}.stream-status-pill--dim[data-v-090e0a6b]{color:var(--text-dim)}.stream-destination__grid[data-v-090e0a6b]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:12px}.stream-field[data-v-090e0a6b]{display:grid;gap:6px}.stream-field--wide[data-v-090e0a6b]{grid-column:1 / -1}@media (max-width: 900px){.stream-active-row[data-v-090e0a6b]{grid-template-columns:1fr}.stream-active-row__actions[data-v-090e0a6b]{justify-content:flex-start}}@media (max-width: 700px){.stream-destination__grid[data-v-090e0a6b]{grid-template-columns:1fr}}.styles-settings__field-hint[data-v-929085f3]{margin:4px 0 0;font-size:10px;line-height:1.35} +:root{--bg-0: #08090d;--bg-1: #0c0d14;--bg-2: #11131c;--bg-3: #14161f;--border: #2a2d3a;--border-strong: #3a3d4c;--live: #1d9e75;--live-text: #9fe1cb;--accent: #7f77dd;--accent-text: #cecbf6;--a-group: #378add;--b-group: #e879b0;--a-group-text: #cce0f7;--b-group-text: #f6cede;--warn: #ef9f27;--error: #e24b4a;--warn-text: #ffdca8;--error-text: #ffd5d4;--cyan: #2de2ff;--band-low: #5cc8ff;--band-mid: var(--accent);--band-high: var(--success);--text-primary: #e6e8f0;--text-secondary: #9a9db0;--text-dim: #777b8f;--media-bg: #000000;--media-text: #ffffff;--radius: 11px;--radius-sm: 7px;--radius-pill: 5px;--mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;--success: #5af2a9;--library-accent: var(--success);--danger: var(--error);--app-header-height: 54px;--app-top-nav-height: 64px;--app-chrome-top: calc(var(--app-header-height) + var(--app-top-nav-height))}*{box-sizing:border-box}body{margin:0;font-family:Space Grotesk,Inter,"Segoe UI Emoji","Apple Color Emoji","Noto Color Emoji",Arial,sans-serif;background:radial-gradient(circle at 20% 20%,rgba(255,83,217,.12),transparent 25%),radial-gradient(circle at 80% 0%,rgba(45,226,255,.12),transparent 25%),var(--bg-0);color:var(--text-primary);min-height:100vh;display:flex;flex-direction:column;padding-bottom:0}#app{flex:1;display:flex;flex-direction:column;min-height:0;width:100%}.app-chrome{position:sticky;top:0;z-index:200;flex-shrink:0;display:flex;flex-direction:column;background:#08090dfa;border-bottom:.5px solid var(--border);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}header.app-header{padding:0 12px;background:transparent;border-bottom:.5px solid var(--border);display:flex;align-items:stretch;gap:12px;position:relative;z-index:1}.app-header__left{display:flex;align-items:stretch;min-width:0;flex:1}.header-transport{display:flex;align-items:center;gap:4px;padding:0 10px;border-left:.5px solid var(--border);flex-shrink:0}.header-transport__divider{width:1px;height:22px;margin:0 4px;background:var(--border);flex-shrink:0}.header-transport__btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);cursor:pointer;transition:color .12s,border-color .12s,box-shadow .12s,background .12s}.header-transport__btn:disabled{opacity:.38;cursor:default;pointer-events:none}.header-transport__icon{font-size:15px}.header-transport__btn--play{color:color-mix(in srgb,var(--live) 75%,var(--text-secondary));border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.header-transport__btn--play.header-transport__btn--active,.header-transport__btn--play:not(:disabled):hover{color:var(--live-text);border-color:var(--live);box-shadow:0 0 10px #1d9e7538}.header-transport__btn--pause{color:color-mix(in srgb,var(--live) 65%,var(--text-secondary));border-color:color-mix(in srgb,var(--live) 28%,var(--border))}.header-transport__btn--pause.header-transport__btn--active,.header-transport__btn--pause:not(:disabled):hover{color:var(--live-text);border-color:var(--live);background:color-mix(in srgb,var(--live) 12%,var(--bg-3));box-shadow:0 0 10px #1d9e7538}.header-transport__btn--record{color:color-mix(in srgb,var(--error) 70%,var(--text-secondary));border-color:color-mix(in srgb,var(--error) 35%,var(--border))}.header-transport__btn--record.header-transport__btn--active,.header-transport__btn--record:hover{color:#fff;border-color:var(--error);background:color-mix(in srgb,var(--error) 22%,var(--bg-3));box-shadow:0 0 10px #e24b4a47;animation:header-rec-pulse 1.5s ease-in-out infinite}@keyframes header-rec-pulse{0%,to{opacity:1}50%{opacity:.62}}.header-transport__btn--stream{color:color-mix(in srgb,var(--accent) 75%,var(--text-secondary));border-color:color-mix(in srgb,var(--accent) 35%,var(--border))}.header-transport__btn--stream.header-transport__btn--active,.header-transport__btn--stream:hover{color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--bg-3));box-shadow:0 0 10px #8f86ff3d}.header-transport__btn--stop{color:color-mix(in srgb,var(--warn) 80%,var(--text-secondary));border-color:color-mix(in srgb,var(--warn) 40%,var(--border))}.header-transport__btn--stop:hover{color:#1a1408;border-color:var(--warn);background:color-mix(in srgb,var(--warn) 88%,var(--bg-3));box-shadow:0 0 10px #ef9f2752}.header-transport__btn--preview{display:inline-flex;align-items:center;gap:5px;color:color-mix(in srgb,var(--accent) 78%,var(--text-secondary));border-color:color-mix(in srgb,var(--accent) 38%,var(--border))}.header-transport__btn--preview:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 16%,var(--bg-3));box-shadow:0 0 10px #8f86ff42}.header-transport__btn--preview.header-transport__btn--active{color:var(--accent-text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 22%,var(--bg-3));box-shadow:0 0 12px #8f86ff4d;cursor:wait}.stream-dashboard-shell{position:sticky;top:var(--app-chrome-top);z-index:95;border-bottom:.5px solid var(--border);background:#08090df7;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);max-height:min(52vh,520px);display:flex;flex-direction:column;overflow:hidden}.stream-dashboard-shell__bar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 14px;border-bottom:.5px solid var(--border);flex-shrink:0}.stream-dashboard-shell__title{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--text-secondary)}.stream-dashboard-shell__body{overflow:auto;padding:10px 14px 14px;min-height:0}.stream-dashboard-slide-enter-active,.stream-dashboard-slide-leave-active{transition:max-height .2s ease,opacity .18s ease}.stream-dashboard-slide-enter-from,.stream-dashboard-slide-leave-to{max-height:0;opacity:0}.app-header .status-strip{margin-left:auto;padding:6px 0;flex-shrink:0}.brand{display:none}.top-nav{position:relative;left:0;right:0;z-index:2;background:transparent;border-bottom:.5px solid var(--border);display:flex;align-items:stretch;flex-shrink:0}.top-nav__inner{display:flex;justify-content:center;align-items:stretch;gap:2px;flex:1;max-width:900px;margin:0 auto;padding:0 8px}.top-nav__actions{display:flex;align-items:center;gap:14px;padding:0 14px;border-left:.5px solid var(--border);flex-shrink:0}.top-nav__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:34px;height:34px;padding:0 10px;border-radius:var(--radius-pill);border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);cursor:pointer;transition:color .12s,border-color .12s,background .12s}.top-nav__icon-btn:hover{color:var(--text-secondary);border-color:var(--border-strong)}.top-nav__icon-btn--active{color:var(--library-accent);border-color:color-mix(in srgb,var(--library-accent) 45%,transparent);background:color-mix(in srgb,var(--library-accent) 10%,transparent)}.top-nav__action-label{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:inherit}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.tab{--tab-accent: #8f86ff;--tab-accent-soft: rgba(143, 134, 255, .14);position:relative;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;padding:10px 18px;min-height:64px;min-width:72px;flex:1;max-width:120px;border-radius:0;border:none;border-bottom:2px solid transparent;border-top:none;background:transparent;color:var(--text-dim);cursor:pointer;font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;transition:color .15s,border-color .15s,background .15s}.tab:before{display:none}.tab:after{display:none}.tab:hover{color:var(--text-secondary);background:#ffffff0a}.tab.active{color:color-mix(in srgb,var(--tab-accent) 90%,white 10%);border-bottom-color:var(--tab-accent);background:var(--tab-accent-soft)}.tab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;color:color-mix(in srgb,var(--tab-accent) 80%,white 20%);opacity:.7;transition:opacity .15s}.tab:hover .tab__icon-wrap,.tab.active .tab__icon-wrap{opacity:1}.tab__icon{font-size:20px}.tab__copy{display:flex;flex-direction:column;align-items:center;gap:0;min-width:0}.tab__label{font-size:10px;line-height:1;letter-spacing:.08em;color:inherit}.tab__hint{display:none}.tab--live{--tab-accent: #53d8ff;--tab-accent-soft: rgba(83, 216, 255, .1)}.tab--library,.tab--stream{--tab-accent: #6fe3a2;--tab-accent-soft: rgba(111, 227, 162, .1)}.tab--prompts{--tab-accent: #f689d3;--tab-accent-soft: rgba(246, 137, 211, .1)}.tab--motion{--tab-accent: #f2b153;--tab-accent-soft: rgba(242, 177, 83, .1)}.tab--modulation{--tab-accent: #7df2c3;--tab-accent-soft: rgba(125, 242, 195, .1)}.tab--settings{--tab-accent: #8f86ff;--tab-accent-soft: rgba(143, 134, 255, .1)}.tab--generate{--tab-accent: #ff7b8d;--tab-accent-soft: rgba(255, 123, 141, .1)}.pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-secondary);font-size:11px}.pill .dot{width:6px;height:6px;border-radius:50%;background:var(--live);box-shadow:0 0 5px var(--live);flex-shrink:0}.pill.danger .dot{background:var(--error);box-shadow:0 0 5px var(--error)}.btn{display:inline-flex;align-items:center;justify-content:center;background:#1d9e7538;color:var(--live-text);border:.5px solid var(--live);border-radius:var(--radius-sm);padding:6px 12px;font-weight:600;font-size:11px;font-family:inherit;cursor:pointer;letter-spacing:.04em;transition:background .15s,border-color .15s}.btn:hover:not(:disabled){background:#1d9e7552}.btn.ghost{background:var(--bg-2);color:var(--text-dim);border:.5px solid var(--border)}.btn.playing{background:var(--live);box-shadow:0 0 10px #1d9e7559}.btn.recording{background:var(--error);animation:btn-rec-pulse 1.5s ease-in-out infinite}@keyframes btn-rec-pulse{0%,to{opacity:1}50%{opacity:.6}}.layout{flex:1;display:grid;grid-template-columns:1fr;gap:10px;padding:10px;min-height:0}.layout--sidebar{min-height:calc(100vh - var(--app-chrome-top) - 20px);align-content:stretch}.layout--library-workspace .layout{pointer-events:none;-webkit-user-select:none;user-select:none;filter:brightness(.55)}.library-workspace{position:fixed;top:0;right:0;bottom:0;left:0;z-index:350;display:flex;flex-direction:column;background:var(--bg-0)}.library-workspace__chrome{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border);background:var(--bg-1);flex-shrink:0}.library-workspace__tabs{display:flex;gap:6px}.library-workspace__tab{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:var(--radius-pill);border:1px solid var(--border);background:var(--bg-2);color:var(--text-dim);font-size:11px;font-weight:600;cursor:pointer}.library-workspace__tab--active{color:var(--library-accent);border-color:color-mix(in srgb,var(--library-accent) 45%,transparent);background:color-mix(in srgb,var(--library-accent) 10%,transparent)}.library-workspace__body{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:12px}.library-workspace__pane{flex:1;min-height:0;overflow:auto}.library-workspace__pane--editor{display:flex;flex-direction:column}.library-workspace-slide-enter-active,.library-workspace-slide-leave-active{transition:transform .22s ease,opacity .22s ease}.library-workspace-slide-enter-from,.library-workspace-slide-leave-to{transform:translateY(12px);opacity:0}.layout--sidebar .preview{position:relative;width:100%;max-width:min(1200px,calc(100vw - 16px));margin:0 auto;min-height:0;display:flex;flex-direction:column}.preview{display:grid;grid-template-rows:1fr;align-content:stretch;gap:4px;width:100%;min-height:0;flex:1}.preview--motion-dock{grid-template-rows:minmax(0,1fr) minmax(0,40vh)}.preview--top-dock{grid-template-rows:auto minmax(0,1fr)}.preview--motion-dock.preview--top-dock{grid-template-rows:auto minmax(0,1fr) minmax(0,40vh)}.preview-bottom-dock{min-height:240px;flex:1 1 auto;display:flex;flex-direction:column}.preview-bottom-dock__pane{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto}.preview-bottom-dock__pane--sequencer .stage-sequencer-shell{margin-top:0}.video-wrap{position:relative;border-radius:8px;overflow:hidden;background:var(--media-bg);width:100%}.video-wrap__stage{position:relative;width:100%;min-height:0;flex:1 1 auto;overflow:hidden;background:var(--media-bg)}.video-layer-tabs--preview{border-radius:0 0 8px 8px;border-top:none}.layers-sidebar{position:absolute;top:0;right:0;bottom:0;z-index:30;width:32px;display:flex;flex-direction:column;align-items:stretch;background:#06080fe0;border-left:.5px solid var(--border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);transition:width .18s ease;overflow:hidden}.layers-sidebar--open{width:188px}.layers-sidebar__toggle{flex:none;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;padding:0;border-bottom:.5px solid var(--border);flex-shrink:0}.layers-sidebar__toggle:hover{color:var(--text-primary);background:#ffffff0a}.layers-sidebar__toggle svg{width:14px;height:14px;flex-shrink:0}.layers-sidebar__rail-head{flex-shrink:0;padding:4px 0 2px;overflow:hidden}.layers-sidebar--open .layers-sidebar__rail-head{padding:4px 10px 2px}.layers-sidebar__rail-title{font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);white-space:nowrap}.layers-sidebar__active-badge{display:flex;align-items:center;gap:6px;padding:8px 0;flex-shrink:0;overflow:hidden;min-width:0}.layers-sidebar--open .layers-sidebar__active-badge{padding:8px 10px 6px;border-bottom:.5px solid var(--border)}.layers-sidebar__active-dot{flex-shrink:0;margin:0 auto}.layers-sidebar--open .layers-sidebar__active-dot{margin:0}.layers-sidebar__active-name{font-size:10px;font-weight:700;letter-spacing:.04em;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);flex:1;min-height:0}.layers-sidebar--open .layers-sidebar__active-name{writing-mode:horizontal-tb;transform:none;flex:1;min-width:0}.layers-sidebar__list{flex:1;display:flex;flex-direction:column;gap:2px;padding:6px;overflow-y:auto;min-height:0}.layers-sidebar__item{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:var(--radius-sm);border:.5px solid transparent;background:transparent;color:var(--text-secondary);font-size:11px;cursor:pointer;text-align:left;width:100%;white-space:nowrap;overflow:hidden}.layers-sidebar__item:hover{background:#ffffff0d;color:var(--text-primary)}.layers-sidebar__item--active{border-color:#7f77dd80;background:#7f77dd1a;color:var(--accent-text)}.layers-sidebar__item-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layers-sidebar__add{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:var(--radius-sm);border:.5px dashed var(--border);background:transparent;color:var(--text-dim);font-size:11px;cursor:pointer;width:100%;text-align:left;margin-top:auto;white-space:nowrap;overflow:hidden}.layers-sidebar__add:hover{color:var(--text-secondary);border-color:var(--border-strong)}.layers-sidebar__add--active{border-color:#7f77dd8c;color:var(--accent-text)}.layers-sidebar__add-icon{flex-shrink:0;font-size:14px;line-height:1}.layers-sidebar__scenes{flex-shrink:0;border-top:.5px solid var(--border);padding:6px;display:flex;flex-direction:column;gap:3px;max-height:160px;overflow-y:auto}.layers-sidebar__scenes-header{display:flex;align-items:center;justify-content:space-between;padding:2px 2px 4px;gap:6px}.layers-sidebar__scenes-label{font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim)}.layers-sidebar__scenes-save{padding:3px 6px;font-size:9px}.layers-sidebar__scene-item{display:flex;align-items:center;gap:4px;padding:4px 6px;border-radius:var(--radius-sm);border:.5px solid transparent;background:transparent;color:var(--text-secondary);font-size:10px;cursor:pointer;text-align:left;width:100%;overflow:hidden}.layers-sidebar__scene-item:hover{background:#ffffff0a}.layers-sidebar__scene-item--default{border-color:#2de2ff59;color:var(--live-text)}.layers-sidebar__scene-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layers-sidebar__scene-delete{flex-shrink:0;border:none;background:transparent;color:var(--text-dim);font-size:13px;line-height:1;padding:0 2px;cursor:pointer}.layers-sidebar__scene-delete:hover{color:var(--error)}.layers-sidebar__scenes-empty{font-size:10px;color:var(--text-dim);padding:4px 2px;text-align:center}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__scenes{display:none}.video-wrap__default-animation{z-index:0;opacity:0;pointer-events:none;transition:opacity .55s ease}.video-wrap__default-animation--visible{opacity:1;pointer-events:auto}.video-layer-tabs{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px;border-bottom:.5px solid var(--border);background:#08090db8}.video-layer-tabs--engine{border-bottom:none;border-radius:10px;border:1px solid var(--border);background:#08090d8c}.video-layer-tabs__transport{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-right:6px}.control-btn--top{min-width:96px;padding:9px 14px;border-radius:10px;box-shadow:0 10px 24px #00000047}.control-btn--frame:not(.control-btn--loading){border-color:#7f77dd8c;background:#7f77dd29;color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd2e,0 10px 22px #7f77dd24}.control-btn--record:not(.recording){border-color:#e24b4a59;background:#e24b4a1a;color:#f5b4b3}.video-layer-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:var(--radius-sm, 7px);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none}.video-layer-tab.active{border-color:#7f77dd8c;color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd2e}.video-layer-tab--add{border-style:dashed}.video-layer-tab--size{margin-left:auto}.video-layer-tab__close{border:none;background:transparent;color:var(--text-dim);font-size:14px;line-height:1;padding:0 2px;cursor:pointer}.video-layer-tab__dot{width:8px;height:8px;border-radius:999px;display:inline-block;box-shadow:0 0 0 1px #ffffff1f}.video-layer-tab__dot--green{background:var(--live)}.video-layer-tab__dot--yellow{background:var(--warn)}.video-layer-tab__dot--red{background:var(--error)}.video-layer-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:grid;place-content:center;gap:8px;padding:24px;text-align:center;background:#08090db8}.video-layer-empty__title{font-size:14px;font-weight:700;color:var(--text-primary)}.video-layer-add{margin-top:8px;display:grid;gap:10px}.video-layer-add__actions{display:flex;flex-wrap:wrap;gap:8px}.video-wrap__stage:fullscreen{width:100vw;height:100vh;max-width:none;max-height:none;margin:0;border-radius:0}.video-wrap--frame-processing .video-feed--hls{filter:saturate(.92) brightness(.92)}.video-wrap--frame-processing .video-still-preview{filter:none;transform:none}video{width:100%;height:100%;display:block;background:var(--media-bg);object-fit:cover}.video-feed{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;object-fit:cover;opacity:0;pointer-events:none;transition:opacity .55s ease,mix-blend-mode .2s ease}.video-feed--visible{opacity:1;pointer-events:auto}.video-feed--hls.video-feed--forge-reveal.video-feed--visible{animation:video-feed-forge-reveal .8s ease forwards}@keyframes video-feed-forge-reveal{0%{opacity:0}to{opacity:1}}.video-feed--blended{mix-blend-mode:screen;pointer-events:auto}.video-feed:not(.video-feed--visible){visibility:hidden}.video-still-preview--over-webgl{pointer-events:none}.video-feed--standby-preview{z-index:2;object-fit:cover;background:var(--media-bg)}.video-feed--hls{z-index:3;object-fit:cover;background:var(--media-bg)}.video-wrap--hls-and-preview .video-feed--standby-preview{width:50%;left:0;right:auto}.video-wrap--hls-and-preview .video-feed--hls.video-feed--visible{width:50%;left:50%;right:0}.video-still-preview{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;width:100%;height:100%;display:block;background:var(--media-bg);object-fit:cover}.overlay{position:absolute;left:0;right:0;top:0;display:flex;justify-content:space-between;padding:10px 12px;background:linear-gradient(180deg,rgba(0,0,0,.7),transparent);font-size:13px;font-weight:600;color:var(--media-text)}.video-feed-frames{margin-top:4px;font-size:11px;font-weight:600;color:var(--accent-text);letter-spacing:.02em}.video-feed-status{margin-top:4px;display:inline-flex;align-items:center;justify-content:flex-end;padding:2px 8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);background:#08090d9e;color:var(--text-secondary);font-size:10px;letter-spacing:.04em;text-transform:uppercase}.video-feed-status--ready{color:var(--accent-text);border-color:#7f77dd8c}.video-feed-status--selected{box-shadow:0 0 0 1px #2de2ff2e}.preview-loading-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;padding:20px;background:radial-gradient(circle at center,#090b1233,#090b12ad 72%);pointer-events:none}.preview-loading-overlay__card{display:grid;gap:10px;justify-items:center;min-width:min(320px,100%);padding:16px 18px;border-radius:14px;border:1px solid rgba(255,255,255,.12);background:#090b12c2;box-shadow:0 20px 48px #00000061;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);text-align:center}.preview-loading-overlay__hint{font-size:11px;line-height:1.4;color:var(--text-secondary)}.timeline{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:8px}.thumbs{display:flex;gap:8px;overflow-x:auto;margin-bottom:6px;padding-bottom:4px}.thumb-card{position:relative;border-radius:10px;overflow:hidden;border:1px solid var(--border);background:var(--bg-1);box-shadow:0 8px 20px #00000059}.thumb{width:92px;height:54px;display:block;background:var(--bg-2);object-fit:cover}.thumb-label{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:11px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.7))}.frame-rail-overlay{position:absolute;left:10px;bottom:10px;z-index:24;display:flex;flex-direction:column-reverse;align-items:flex-start;gap:8px;max-width:calc(100% - 20px);pointer-events:none}.frame-rail-overlay>*{pointer-events:auto}.frame-rail-overlay__toggle{flex-shrink:0}.frame-rail-overlay__panel{width:min(100%,920px);max-height:min(42vh,228px);overflow:hidden;border-radius:var(--radius);box-shadow:0 16px 40px #00000073;animation:frame-rail-overlay-in .22s ease}@keyframes frame-rail-overlay-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.frame-rail-overlay .frame-rail{margin:0;max-height:min(42vh,228px);overflow:hidden;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);background:#0c0e16e0;border-color:#ffffff1a}.frame-rail-overlay .frame-rail__list{max-height:min(28vh,140px)}.runs-browser__frames-pane{min-height:0;overflow:hidden;display:flex;flex-direction:column}.runs-browser__frames-pane .frame-rail--embedded{flex:1 1 auto;min-height:0;max-height:min(52vh,420px);margin:0}.runs-browser__frames-pane .frame-rail--embedded .frame-rail__list{max-height:min(36vh,280px)}.frame-rail{display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-1)}.frame-rail__header{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.frame-rail__title-wrap{display:grid;gap:2px;min-width:0}.frame-rail__title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-primary)}.frame-rail__meta{font-size:10px;color:var(--text-dim)}.frame-rail__actions{display:flex;align-items:center;gap:8px;min-width:min(440px,100%);flex:1;justify-content:flex-end}.frame-rail__toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--border);border-radius:999px;background:var(--bg-2);color:var(--text-secondary);cursor:pointer;transition:color .18s ease,border-color .18s ease,transform .18s ease;flex-shrink:0}.frame-rail__toggle:hover{color:var(--text-primary);border-color:var(--accent);transform:translateY(-1px)}.frame-rail__toggle-icon{font-size:16px}.frame-rail__controls{display:flex;align-items:center;gap:8px;min-width:min(440px,100%);flex:1;justify-content:flex-end}.frame-rail__step{border:1px solid var(--border);border-radius:999px;background:var(--bg-2);color:var(--text-secondary);padding:4px 10px;font-size:10px;cursor:pointer}.frame-rail__step:disabled{opacity:.4;cursor:not-allowed}.frame-rail__scrubber{flex:1;min-width:120px;accent-color:var(--accent)}.frame-rail__list{display:flex;gap:8px;overflow-x:auto;overflow-y:hidden;padding-bottom:4px;flex-wrap:nowrap;scrollbar-width:thin}.frame-rail__item{position:relative;flex:0 0 auto;width:110px;padding:0;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--bg-2);cursor:pointer;box-shadow:0 8px 20px #00000047}.frame-rail__item--active{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent),0 10px 22px #00000052}.frame-rail__thumb-wrap{position:relative;width:110px;height:62px;background:var(--bg-2)}.frame-rail__thumb-wrap--pending{display:flex;align-items:center;justify-content:center;border:1px dashed color-mix(in srgb,var(--accent) 40%,var(--border));background:color-mix(in srgb,var(--accent) 8%,var(--bg-2))}.frame-rail__thumb{width:110px;height:62px;display:block;background:var(--bg-2);object-fit:cover}.frame-rail__item--loading .frame-rail__thumb{opacity:.55}.frame-rail__thumb-loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,#080c1426,#080c148c);pointer-events:none}.frame-rail__item--pending{cursor:default;border-style:dashed;border-color:color-mix(in srgb,var(--accent) 45%,var(--border));box-shadow:none}.frame-rail__live-tag{margin-left:6px;padding:1px 6px;border-radius:999px;font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--accent-text);background:color-mix(in srgb,var(--accent) 22%,transparent)}.lazy-loading-indicator--thumb{display:inline-flex;align-items:center;justify-content:center;gap:4px;color:var(--accent-text)}.video-still-preview--loading{opacity:.72;filter:saturate(.85)}.video-still-preview__loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:flex-start;justify-content:center;padding-top:12px;pointer-events:none}.frame-rail__label{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:10px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.76))}.library-frame-rail__projects{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.library-frame-rail__project{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border-radius:999px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary);cursor:pointer;font-size:11px;font-weight:600}.library-frame-rail__project:hover{border-color:#7f77dd73}.library-frame-rail__project--active{border-color:#7f77dd8c;box-shadow:inset 0 0 0 1px #7f77dd29;color:var(--accent-text)}.library-frame-rail__project-count{font-size:10px;font-weight:500;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.library-frame-rail__runs{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(100px,140px);gap:8px;overflow-x:auto;padding-bottom:8px;margin-bottom:8px}.library-frame-rail__run-empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.frame-rail__empty{min-height:62px;display:flex;align-items:center;justify-content:center;border:1px dashed var(--border);border-radius:10px;color:var(--text-dim);font-size:11px;text-align:center;padding:10px}.wave{height:40px;border-radius:8px;background:linear-gradient(90deg,#ff53d933,#2de2ff33);border:1px solid var(--border)}.spectral-preview{width:100%;max-height:140px;border-radius:8px;border:1px solid var(--border);display:block;object-fit:fill;background:var(--bg-0)}.rack{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:12px;box-shadow:0 10px 30px #00000040}.rack h3{margin:0 0 8px}.slider-row{display:grid;grid-template-columns:1.1fr 1fr;gap:8px;align-items:center;margin:8px 0;font-size:13px;color:var(--text-secondary)}.slider-row input[type=range]{width:100%;accent-color:var(--accent)}.source{display:inline-flex;gap:6px;font-size:12px;color:var(--text-secondary);align-items:center}.chips{display:flex;flex-wrap:wrap;gap:6px}.chip{padding:6px 12px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-3);color:var(--text-secondary);cursor:pointer;font-size:11px;font-family:inherit;font-weight:600;transition:border-color .15s,color .15s,background .15s}.chip:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.chip.active{border-color:var(--accent);color:var(--accent-text);background:color-mix(in srgb,var(--accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 12%,transparent)}.chip.active--live{border-color:var(--live);color:var(--live-text);background:color-mix(in srgb,var(--live) 18%,transparent)}.framesync-icon-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;background:transparent;color:var(--error);cursor:pointer;border-radius:6px}.framesync-icon-button:hover{background:color-mix(in srgb,var(--error) 14%,transparent)}.framesync-icon-button .ui-icon{width:14px;height:14px}.sub-pills{display:flex;gap:4px;margin-bottom:10px;flex-wrap:wrap}.sub-pill{padding:5px 10px;border-radius:999px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);cursor:pointer;font-size:12px}.sub-pill.active{border-color:var(--accent);color:var(--accent-text);background:color-mix(in srgb,var(--accent) 14%,var(--bg-2));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 10%,transparent)}.live-view{display:flex;flex-direction:column;gap:8px;min-height:0}.motion-panel-glass__header,.generate-dock-panel-glass__header,.stream-card__header{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.motion-panel-glass__header .framesync-button,.stream-card__header .framesync-button{flex-shrink:0}.live-view__scroll{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:8px}.live-view__summary-grid{display:grid;gap:8px;margin-top:4px}.live-view__summary-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px}.live-view__summary-value{font-size:12px;color:var(--text-primary)}.live-view__param-list{margin:10px 0 0;padding:0;list-style:none;display:grid;gap:6px}.live-view__param-list-item{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--text-secondary)}.live-view__param-list-meta{color:var(--text-dim);font-size:10px}.live-view__summary-empty{margin:8px 0 0}.live-view__shortcuts{padding:12px}.live-view__shortcuts-copy{margin:8px 0 10px}.live-view__shortcut-actions{display:flex;flex-wrap:wrap;gap:8px}.prompts-schedule-hint{padding:12px}.prompts-schedule-hint__copy{margin:0 0 10px}.animation-engine-panel__title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.animation-engine-panel__subtitle{margin:0;font-size:10px}.modulation-audio-panel--audio-tab{margin-bottom:10px}.modulation-audio-panel__sync-toggle{margin-top:12px}.deforum-settings-stack{display:grid;gap:12px}.live-parameters-panel{margin-bottom:4px}.live-engine-dock{flex-shrink:0;position:sticky;top:0;z-index:5;margin:0;padding:8px 10px 10px;border-radius:12px;background:#0c0e16eb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 10px 28px #00000052,inset 0 0 0 1px #ffffff14}.live-engine-dock__head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px}.live-engine-dock__tabs{flex-shrink:0}.live-engine-dock__body{max-height:min(44vh,400px);overflow-x:hidden;overflow-y:auto;padding-right:2px}.live-engine-dock__body .deforum-job-panel__head{margin-bottom:8px}.live-engine-dock__preload-hint{margin:8px 0 0;font-size:10px;color:var(--text-dim)}.animation-engine-panel__sources{margin-top:8px;display:flex;flex-direction:column;gap:8px}.live-view__tabs{position:sticky;top:0;z-index:2;background:var(--bg-1);padding:4px 0 8px}.live-view__tab-add{border-style:dashed}.deforum-job-panel__head{margin-bottom:0}.deforum-job-panel__summary{margin:8px 0 0}.deforum-job-panel__transport{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.deforum-job-panel__status{margin-top:8px;opacity:.9}.live-add-source__status{margin-top:8px}.live-add-source__library{margin-top:12px}.live-add-source__library-actions{margin-bottom:10px}.live-add-source__hint{margin-top:8px;opacity:.85}.live-animation-summary{margin-top:10px;display:grid;gap:8px}.lcm-engine-panel{margin-top:14px;padding:12px 14px;border-radius:10px;border:1px solid rgba(255,200,60,.22);background:#ffc83c0f;display:flex;flex-direction:column;gap:10px}.lcm-engine-panel__toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none}.lcm-engine-panel__toggle input{accent-color:rgb(255,200,60)}.lcm-engine-panel__fields{display:grid;grid-template-columns:120px 1fr;gap:10px;align-items:end}.lcm-engine-panel__lora .framesync-input{font-family:ui-monospace,monospace;font-size:12px}.lcm-engine-badge{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:2px 8px 2px 6px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#ffd250;background:#ffc83c24;border:1px solid rgba(255,200,60,.35);vertical-align:middle}.lcm-engine-badge__icon{width:14px;height:14px}.wan-engine-controls{margin-top:4px}.wan-engine-controls__hint{margin:4px 0 10px;font-size:12px;opacity:.85}.wan-engine-controls__hint code{font-size:11px}.wan-engine-controls__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 12px}.wan-engine-controls__toggle label{display:inline-flex;align-items:center;gap:8px;font-size:12px;cursor:pointer}.wan-engine-controls__field .framesync-subtitle{margin-bottom:4px}.wan-engine-controls__speed,.wan-engine-controls__motion,.wan-engine-controls__loras,.wan-engine-controls__init,.wan-engine-controls__download{margin-bottom:12px}.wan-engine-controls__init-drop{margin:8px 0;min-height:120px}.wan-engine-controls__init-actions{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.wan-engine-controls__init-i2v{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 12px}.wan-engine-controls__download-row{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 8px}.wan-engine-controls__download-status{margin-top:6px;color:var(--live-text);font-size:11px}.wan-engine-controls__advanced{margin-top:8px}.wan-engine-controls__advanced>summary{cursor:pointer;margin-bottom:8px}.animation-engine-card--wan.animation-engine-card--active{border-color:#78c8ff8c;box-shadow:0 0 0 1px #78c8ff40}.animation-engine-current{margin-top:10px;padding:12px 14px;border-radius:12px;border:1px solid rgba(127,119,221,.45);background:linear-gradient(135deg,#7f77dd29,#7f77dd0a),#08090d8c;box-shadow:inset 0 0 0 1px #7f77dd1f,0 10px 28px #7f77dd14}.animation-engine-current--compact{margin-bottom:4px}.animation-engine-current__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;border:1px solid rgba(127,119,221,.5);background:#7f77dd33;color:var(--accent-text);font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.animation-engine-current__body{display:flex;align-items:flex-start;gap:12px;margin-top:10px}.animation-engine-current__dot{width:12px;height:12px;margin-top:4px;border-radius:999px;flex-shrink:0;box-shadow:0 0 0 2px #ffffff14,0 0 12px currentColor}.animation-engine-current__dot--green{background:var(--live);color:var(--live)}.animation-engine-current__dot--yellow{background:var(--warn);color:var(--warn)}.animation-engine-current__dot--red{background:var(--error);color:var(--error)}.animation-engine-current__copy{display:grid;gap:4px;min-width:0}.animation-engine-current__title{font-size:16px;font-weight:700;color:var(--text-primary);letter-spacing:.02em}.animation-engine-current__meta{font-size:12px;color:var(--accent-text)}.animation-engine-current__status{font-size:11px;color:var(--text-secondary)}.animation-engine-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:8px;margin-top:8px}.animation-engine-picker--compact{grid-template-columns:repeat(auto-fill,minmax(88px,1fr))}.animation-engine-picker__toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.animation-engine-picker__size{display:inline-flex;align-items:center;gap:6px}.animation-engine-card{position:relative;display:grid;gap:6px;align-content:start;min-height:72px;padding:10px 12px;border-radius:10px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);text-align:left;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background .15s ease,transform .15s ease}.animation-engine-card:hover{border-color:#7f77dd59;transform:translateY(-1px)}.animation-engine-card--active{border-color:#7f77ddb3;background:linear-gradient(180deg,#7f77dd2e,#7f77dd0f),var(--bg-3);color:var(--accent-text);box-shadow:inset 0 0 0 1px #7f77dd38,0 0 0 1px #7f77dd1f,0 12px 24px #7f77dd1f}.animation-engine-card--compact{min-height:0;padding:8px 10px;grid-template-columns:auto 1fr;align-items:center;gap:8px}.animation-engine-card--compact .animation-engine-card__hint,.animation-engine-card--compact .animation-engine-card__active-tag{display:none}.animation-engine-card--add{border-style:dashed;min-height:72px;place-content:center}.animation-engine-card__dot{width:10px;height:10px;border-radius:999px;box-shadow:0 0 0 1px #ffffff1a}.animation-engine-card__dot--green{background:var(--live)}.animation-engine-card__dot--yellow{background:var(--warn)}.animation-engine-card__dot--red{background:var(--error)}.animation-engine-card--active .animation-engine-card__dot{box-shadow:0 0 0 2px #ffffff24,0 0 10px currentColor}.animation-engine-card__label{font-size:12px;font-weight:700;color:inherit}.animation-engine-card__hint{font-size:10px;line-height:1.35;color:var(--text-dim)}.animation-engine-card--active .animation-engine-card__hint{color:var(--text-secondary)}.animation-engine-card__active-tag{position:absolute;top:8px;right:8px;padding:2px 6px;border-radius:999px;background:#7f77dd47;color:var(--accent-text);font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.animation-engine-card__close{position:absolute;top:6px;right:6px;border:none;background:transparent;color:var(--text-dim);font-size:14px;line-height:1;cursor:pointer}.live-source-list{margin-top:14px;display:flex;flex-direction:column;gap:8px}.live-source-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--bg-2)}.live-source-row__meta{display:flex;flex-direction:column;gap:2px;min-width:0}.live-source-row__type{font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary)}.live-source-row__label{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:280px}.live-source-row__actions{display:flex;gap:6px;flex-shrink:0}.table{width:100%;border-collapse:collapse;font-size:13px;color:var(--text-primary)}.table th,.table td{padding:6px 8px;border-bottom:1px solid var(--border);text-align:left}.performance-deck .crossfade-deck-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}.crossfade-empty{font-size:11px;color:var(--text-secondary);padding:12px;text-align:center;border:1px dashed var(--border);border-radius:8px}.crossfade-slot-row{display:grid;grid-template-columns:1fr auto 1fr;gap:8px;align-items:start;padding:8px;margin-bottom:8px;background:var(--bg-1);border:1px solid var(--border);border-radius:8px}.crossfade-side{display:grid;gap:4px;min-width:0}.crossfade-side-label{font-size:10px;font-weight:700;color:var(--a-group)}.crossfade-side-b .crossfade-side-label{color:var(--b-group)}.crossfade-slot-meta{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:18px}.crossfade-type-pill{font-size:9px;padding:2px 6px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}.crossfade-morphed{grid-column:1 / -1;font-size:10px;color:var(--text-dim);display:flex;gap:6px;align-items:baseline}.crossfade-morphed-val{font-family:monospace;color:var(--text-secondary);word-break:break-all}.crossfade-center{padding:0 4px}.crossfade-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--text-secondary);margin-top:4px}.perf-mode-badge{font-size:10px;padding:3px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}.perf-mode-badge.mode-preview{border-color:var(--accent);color:var(--accent-text)}.perf-mode-badge.mode-animate{border-color:var(--live);color:var(--live-text)}.preview-frame-thumb{width:100%;max-height:160px;object-fit:contain;border-radius:8px;border:1px solid var(--border)}.live-hud-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;margin-top:8px}.live-hud-empty{font-size:10px;color:var(--text-dim);padding:4px 0}.top-drawer-shell{position:relative;z-index:36;width:100%;flex-shrink:0;min-height:0;pointer-events:none}.top-drawer-shell>*{pointer-events:auto}.top-drawer-shell:not(.top-drawer-shell--open) .top-drawer-panel{max-height:0;opacity:0;visibility:hidden;margin:0;padding:0;border:none}.top-drawer-fab{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(127,119,221,.42);background:linear-gradient(135deg,#08090df0,#171a27eb);color:var(--text-primary);cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,box-shadow .18s ease}.top-drawer-fab--stage{position:absolute;left:50%;top:12px;z-index:26;width:52px;min-height:34px;padding:4px 10px;transform:translate(-50%);border-radius:12px}.top-drawer-fab--stage:hover{border-color:var(--accent);color:var(--accent-text);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.preview--top-dock .top-drawer-fab--stage{top:10px}.top-drawer-fab--active{border-color:#7f77dda8;background:linear-gradient(135deg,#7f77dd47,#1e2233f5);color:var(--accent-text);box-shadow:0 14px 32px #00000070,0 0 0 1px #7f77dd3d}.top-drawer-fab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f}.top-drawer-fab__icon{width:20px;height:20px}.top-drawer-fab__icon path{stroke-width:2.4}.top-drawer-panel{width:100%;border-radius:0 0 14px 14px;border:1px solid rgba(255,255,255,.1);border-top:none;background:#11131ceb;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);overflow:hidden;max-height:0;opacity:0;visibility:hidden;transition:max-height .28s ease,opacity .22s ease,visibility .22s ease;box-shadow:0 14px 44px #00000073}.top-drawer-panel--open{max-height:min(340px,calc(100vh - var(--app-chrome-top) - 120px));opacity:1;visibility:visible;overflow-y:auto}.top-drawer-panel--open.top-drawer-panel--system,.top-drawer-panel--open.top-drawer-panel--crossfader{max-height:min(56vh,calc(100vh - var(--app-chrome-top) - 80px))}.bottom-drawer-panel--open.bottom-drawer-panel--system{max-height:min(72vh,calc(100vh - 96px))}.crossfader-panel{padding:0 10px 12px;display:flex;flex-direction:column;gap:12px}.crossfader-panel__header{flex-wrap:wrap;gap:8px;padding-top:4px}.crossfader-panel__generic{display:flex;flex-direction:column;gap:8px}.crossfader-panel__warn{margin-top:0;color:var(--warn)}.crossfader-panel__mixer{display:flex;flex-direction:column;gap:8px}.crossfader-panel__section{padding-top:4px;border-top:1px solid rgba(255,255,255,.08)}.crossfader-panel__section-title{margin:0;font-weight:600}.crossfader-panel__hint{margin:0 0 8px;font-size:10px;color:var(--text-dim);line-height:1.35}.crossfader-panel__slot-type{max-width:140px}.crossfader-panel__status{text-align:center;color:var(--success)}.crossfader-panel__footer{margin-top:0;padding-top:0}.live-bottom-drawer__tabs,.live-top-drawer__tabs{display:flex;gap:8px;padding:8px 10px;flex-wrap:wrap;background:#11131ce0;border:.5px solid rgba(255,255,255,.08);border-radius:14px 14px 0 0;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.edge-dock-host{position:fixed;inset:var(--app-chrome-top) 0 0 0;z-index:120;pointer-events:none}.edge-dock-host>*{pointer-events:auto}.edge-dock-tab{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:32px;min-height:72px;padding:8px 4px;border:1px solid rgba(255,255,255,.12);background:#0c0e16eb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);color:var(--text-secondary);cursor:pointer;font:inherit;box-shadow:0 8px 24px #00000059;transition:color .15s ease,border-color .15s ease,background .15s ease}.edge-dock-tab:hover{color:var(--text-primary);border-color:#7f77dd73;background:#161926f5}.edge-dock-tab__icon{width:18px;height:18px;flex-shrink:0}.edge-dock-tab__label{writing-mode:vertical-rl;text-orientation:mixed;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;line-height:1;max-height:72px;overflow:hidden}.edge-dock-tab--engine{position:absolute;right:0;top:36%;transform:translateY(-50%);z-index:56;border-radius:10px 0 0 10px;border-right:none}.engine-drawer-shell:not(.engine-drawer-shell--open) .edge-dock-tab--engine:not(.edge-dock-tab--inside){position:fixed;right:0;top:calc(var(--app-chrome-top) + 36%);transform:translateY(-50%)}.edge-dock-tab--engine.edge-dock-tab--inside{left:0;right:auto;transform:translate(-100%,-50%);border-radius:10px 0 0 10px;border-right:none;border-left:1px solid rgba(255,255,255,.12)}.engine-drawer-shell:not(.engine-drawer-shell--open) .edge-dock-tab--engine{pointer-events:auto}.engine-drawer-shell--open .edge-dock-tab--engine:not(.edge-dock-tab--inside){visibility:hidden;pointer-events:none}.engine-drawer-shell .edge-dock-tab--engine.edge-dock-tab--inside{visibility:visible;pointer-events:auto}.edge-dock-tab--context,.edge-dock-tab--engine,.edge-dock-tab--layers{z-index:55;pointer-events:auto}.edge-dock-tab--panel-open{color:var(--accent-text);border-color:color-mix(in srgb,var(--accent) 50%,rgba(255,255,255,.12));background:#161926fa}@media (min-width: 1360px){.layout:not(.layout--edge-overlay){--edge-left-reserve: 0px;--edge-right-reserve: 0px}.layout.layout--edge-layers-open:not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(188px, 18vw))}.layout.layout--edge-engine-open:not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(420px, 32vw))}.layout.layout--edge-context-open:not(.layout--edge-context-left):not(.layout--edge-overlay){--edge-right-reserve: calc(var(--edge-right-reserve, 0px) + min(420px, 32vw))}.layout.layout--edge-context-left:not(.layout--edge-overlay){--edge-left-reserve: calc(var(--edge-left-reserve, 0px) + min(420px, 32vw))}.layout:not(.layout--edge-overlay) .preview{margin-left:var(--edge-left-reserve, 0px);margin-right:var(--edge-right-reserve, 0px);transition:margin .32s cubic-bezier(.4,0,.2,1)}}.layout.layout--edge-overlay .edge-dock-host .engine-drawer-panel,.layout.layout--edge-overlay .edge-dock-host .live-right-column,.layout.layout--edge-overlay .edge-dock-host .layers-sidebar.layers-sidebar--open{background:#0a0c14ad;backdrop-filter:blur(18px) saturate(1.12);-webkit-backdrop-filter:blur(18px) saturate(1.12)}.live-right-column--overlay{background:#0a0c14ad!important;backdrop-filter:blur(18px) saturate(1.12);-webkit-backdrop-filter:blur(18px) saturate(1.12)}.preview-stage-row{position:relative;display:block;flex:1 1 auto;min-height:0;width:100%;overflow:hidden;isolation:isolate}.preview-stage-main{position:relative;z-index:1;width:100%;max-width:100%;min-width:0;display:flex;flex-direction:column;min-height:0;gap:0}.preview-stage-row--engine-dock .preview-stage-main{width:100%;max-width:100%}.preview-stage-video-stack{position:relative;flex:1 1 auto;min-height:0;min-width:0;display:flex;flex-direction:column}.preview-stage-video-stack>.video-wrap{flex:0 0 auto;min-height:0}.edge-dock-host .layers-sidebar{position:fixed;right:0;left:auto;top:var(--app-chrome-top);bottom:0;z-index:35;transform:none;display:flex;flex-direction:column;gap:8px;width:40px;padding:8px 4px;border-radius:0;border:1px solid rgba(255,255,255,.1);border-right:none;border-top:none;border-bottom:none;background:#08090de0;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:width .3s cubic-bezier(.4,0,.2,1),right .32s cubic-bezier(.4,0,.2,1);overflow:visible;pointer-events:auto}.layout.layout--edge-engine-open .edge-dock-host .layers-sidebar{right:var(--engine-drawer-width, min(420px, 36vw))}.layers-sidebar--open{width:min(188px,28vw);padding:10px 8px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__list{gap:6px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__item,.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__add{justify-content:center;padding:6px 4px;min-height:28px}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__active-badge{display:flex;justify-content:center;padding:4px 0 6px;border-bottom:1px solid rgba(255,255,255,.08)}.layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__active-name{display:none}.edge-dock-host .layers-sidebar__toggle.edge-dock-tab--layers{flex:none;width:100%;min-height:72px;margin:0 auto;border-radius:10px 0 0 10px;border-right:none}.edge-dock-host .layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__toggle.edge-dock-tab--layers{position:fixed;right:0;left:auto;top:calc(var(--app-chrome-top) + 28%);transform:translateY(-50%);width:32px;z-index:56}.layout.layout--edge-engine-open .edge-dock-host .layers-sidebar:not(.layers-sidebar--open) .layers-sidebar__toggle.edge-dock-tab--layers{right:var(--engine-drawer-width, min(420px, 36vw))}.edge-dock-host .layers-sidebar--open .layers-sidebar__toggle.edge-dock-tab--layers{position:relative;right:auto;top:auto;transform:none;width:100%;border-radius:8px;border:1px solid rgba(255,255,255,.12);border-right:none}.layers-sidebar__active-badge{display:none;align-items:center;gap:8px;padding:4px 2px 6px;border-bottom:1px solid rgba(255,255,255,.08)}.layers-sidebar--open .layers-sidebar__active-badge{display:flex}.layers-sidebar__active-name{font-size:12px;font-weight:700;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layers-sidebar__list{display:flex;flex-direction:column;gap:4px}.layers-sidebar__item,.layers-sidebar__add{display:inline-flex;align-items:center;gap:8px;width:100%;min-height:34px;padding:6px 8px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--text-secondary);cursor:pointer;font:inherit;text-align:left}.layers-sidebar__item-label{display:none;font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layers-sidebar--open .layers-sidebar__item-label{display:inline}.layers-sidebar__item--active{border-color:color-mix(in srgb,var(--accent) 45%,transparent);background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent-text)}.layers-sidebar__add-icon{font-size:18px;font-weight:700;line-height:1;width:20px;text-align:center}.engine-drawer-shell{--engine-drawer-width: min(420px, 36vw);position:fixed;top:var(--app-chrome-top);right:0;bottom:0;left:auto;flex:none;width:0;min-width:0;max-width:none;overflow:visible;z-index:45;pointer-events:none;transition:width .32s cubic-bezier(.4,0,.2,1)}.engine-drawer-shell--open{width:var(--engine-drawer-width);pointer-events:auto}.engine-drawer-panel{width:var(--engine-drawer-width);min-width:var(--engine-drawer-width);height:100%;max-height:100%;overflow-x:hidden;overflow-y:auto;border-radius:14px 0 0 14px;border:1px solid rgba(255,255,255,.1);border-right:none;background:#11131cf0;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:-12px 0 32px #00000073;transform:translate(100%);opacity:0;transition:transform .32s cubic-bezier(.4,0,.2,1),opacity .24s ease;will-change:transform}.engine-drawer-shell--open .engine-drawer-panel{transform:translate(0);opacity:1}.animation-engine-panel{display:flex;flex-direction:column;gap:8px;padding:8px 10px 12px;min-height:0}.animation-engine-panel__tabs{flex-shrink:0;display:grid;grid-template-columns:1fr 1fr;gap:0;margin-top:10px;padding:4px;border-radius:12px;border:1px solid var(--border);background:var(--bg-0)}.animation-engine-panel__tab{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:9px;padding:12px 14px;font-size:13px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary);background:transparent;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}.animation-engine-panel__tab:hover{color:var(--text-primary);background:color-mix(in srgb,var(--accent) 8%,transparent)}.animation-engine-panel__tab.active{color:var(--text-primary);background:color-mix(in srgb,var(--accent) 22%,var(--bg-1));box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.animation-engine-panel .rack{margin:0}.animation-engine-panel .live-engine-controls{margin-top:4px}.animation-engine-panel__controls{margin-top:8px;border-top:.5px solid var(--border);padding-top:8px}.animation-engine-panel__head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-shrink:0}.animation-engine-layer-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.animation-engine-layer-row{display:flex;flex-direction:column;gap:8px;padding:8px;border-radius:12px;border:1px solid rgba(255,255,255,.06);background:#08090d59}.animation-engine-layer-row--active{border-color:color-mix(in srgb,var(--accent) 35%,rgba(255,255,255,.06));background:color-mix(in srgb,var(--accent) 8%,rgba(8,9,13,.35))}.animation-engine-layer-row__top{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.animation-engine-layer-row--hidden .animation-engine-layer-row__select,.animation-engine-layer-row--hidden .animation-engine-layer-row__mix{opacity:.55}.animation-engine-layer-row__main{display:flex;flex-direction:column;gap:6px;min-width:0}.animation-engine-layer-row__select{display:flex;align-items:center;gap:10px;min-width:0;padding:10px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.1);background:#08090d8c;color:var(--text-primary);cursor:pointer;text-align:left;font:inherit}.animation-engine-layer-row__select--active,.animation-engine-layer-row--active .animation-engine-layer-row__select{border-color:color-mix(in srgb,var(--accent) 55%,rgba(255,255,255,.1));background:color-mix(in srgb,var(--accent) 14%,rgba(8,9,13,.55))}.animation-engine-layer-row__label{font-weight:700;font-size:15px;letter-spacing:.01em}.animation-engine-layer-row__status{margin-left:auto;font-size:12px;font-weight:600;color:var(--text-secondary);white-space:nowrap}.animation-engine-layer-row__visibility-toggle{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:56px;min-width:56px;padding:10px 6px;border-radius:12px;border:1px solid rgba(255,255,255,.12);background:#08090db8;color:var(--text-dim);cursor:pointer;font:inherit;transition:border-color .15s,background .15s,color .15s,box-shadow .15s}.animation-engine-layer-row__visibility-toggle:hover{border-color:#ffffff38;color:var(--text-secondary)}.animation-engine-layer-row__visibility-toggle--on{border-color:color-mix(in srgb,var(--live) 55%,rgba(255,255,255,.12));background:color-mix(in srgb,var(--live) 16%,rgba(8,9,13,.72));color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 28%,transparent)}.animation-engine-layer-row__visibility-icon{width:22px;height:22px}.animation-engine-layer-row__visibility-label{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.animation-engine-layer-row__mix{display:flex;flex-direction:column;gap:4px;padding:0 2px 2px}.animation-engine-layer-row__mix-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.animation-engine-layer-row__mix-label,.animation-engine-layer-row__opacity-value{font-size:11px;color:var(--text-dim);letter-spacing:.04em;text-transform:uppercase;font-weight:700}.animation-engine-layer-row__opacity-value{color:var(--text-secondary);font-variant-numeric:tabular-nums}.animation-engine-layer-row__opacity-slider{width:100%;margin:0}.animation-engine-layer-row__controls{border-radius:10px;border:1px solid rgba(255,255,255,.08);background:#0000002e;overflow:hidden}.animation-engine-layer-row__controls-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.animation-engine-layer-row__controls-summary::-webkit-details-marker{display:none}.animation-engine-layer-row__controls-summary:hover{color:var(--text-primary);background:#ffffff08}.animation-engine-layer-row__controls-chevron{width:16px;height:16px;flex-shrink:0;transition:transform .18s ease}.animation-engine-layer-row__controls[open] .animation-engine-layer-row__controls-chevron{transform:rotate(180deg)}.animation-engine-layer-row__controls-body{padding:0 10px 12px;border-top:1px solid rgba(255,255,255,.06)}.engine-layer-controls{margin-top:10px;min-width:0}.engine-layer-controls__hint{margin:0 0 10px;line-height:1.4}.engine-layer-controls .deforum-job-panel.rack{margin:0;padding:0;border:none;background:transparent;box-shadow:none}.engine-layer-controls .deforum-job-panel__head{margin-bottom:8px}.engine-layer-controls .deforum-settings-body{max-height:min(60vh,480px);overflow-y:auto;padding-right:2px}.engine-layer-controls .live-engine-controls{margin-top:0}.animation-engine-panel__compositor-section{margin-top:12px;border-radius:12px;border:1px solid rgba(255,255,255,.08);background:#08090d59;overflow:hidden}.animation-engine-panel__compositor-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.animation-engine-panel__compositor-summary::-webkit-details-marker{display:none}.animation-engine-panel__compositor-summary:hover{color:var(--text-primary);background:#ffffff08}.animation-engine-panel__compositor-chevron{width:16px;height:16px;flex-shrink:0;transition:transform .18s ease}.animation-engine-panel__compositor-section[open] .animation-engine-panel__compositor-chevron{transform:rotate(180deg)}.animation-engine-panel__compositor-body{padding:0 10px 12px;border-top:1px solid rgba(255,255,255,.06)}.compositor-panel{display:flex;flex-direction:column;gap:12px;min-height:0}.compositor-panel__head{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:12px;border:1px solid color-mix(in srgb,var(--accent) 28%,var(--border));background:linear-gradient(135deg,#7f77dd1a,#08090d8c)}.compositor-panel__icon{width:24px;height:24px;flex-shrink:0;color:var(--accent-text);margin-top:2px}.compositor-panel__title{margin:0;font-size:16px;font-weight:700;letter-spacing:.02em;color:var(--text-primary)}.compositor-panel__subtitle{margin:4px 0 0;font-size:12px;line-height:1.4;color:var(--text-secondary)}.compositor-panel__cards{display:flex;flex-direction:column;gap:10px}.compositor-card{padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.08);background:#08090d7a}.compositor-card__row{display:flex;align-items:center;justify-content:space-between;gap:12px}.compositor-card__copy{display:flex;flex-direction:column;gap:4px;min-width:0}.compositor-card__label{font-size:14px;font-weight:700;color:var(--text-primary)}.compositor-card__hint{font-size:12px;line-height:1.35;color:var(--text-secondary)}.compositor-card__hint--block{margin:6px 0 10px}.compositor-card__value{font-family:var(--mono);font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--accent-text)}.compositor-card--slider{display:flex;flex-direction:column;gap:10px}.compositor-card__slider-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.compositor-card__range{width:100%;margin:0}.compositor-card--action{padding:10px 14px}.compositor-panel__promote{width:100%;justify-content:center;font-size:14px;font-weight:700}.compositor-big-toggle{display:inline-flex;flex-direction:column;align-items:center;gap:6px;flex-shrink:0;padding:8px 10px;border:1px solid rgba(255,255,255,.12);border-radius:12px;background:#00000038;color:var(--text-dim);cursor:pointer;font:inherit;transition:border-color .15s,background .15s,color .15s}.compositor-big-toggle:hover{border-color:#ffffff38;color:var(--text-secondary)}.compositor-big-toggle--on{border-color:color-mix(in srgb,var(--live) 55%,rgba(255,255,255,.12));background:color-mix(in srgb,var(--live) 14%,rgba(0,0,0,.22));color:var(--live-text)}.compositor-big-toggle__track{position:relative;width:44px;height:24px;border-radius:999px;background:#ffffff1f;transition:background .15s}.compositor-big-toggle--on .compositor-big-toggle__track{background:color-mix(in srgb,var(--live) 70%,rgba(255,255,255,.12))}.compositor-big-toggle__thumb{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 4px #00000059;transition:transform .15s}.compositor-big-toggle--on .compositor-big-toggle__thumb{transform:translate(20px)}.compositor-big-toggle__label{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.compositor-lfo-grid{display:flex;flex-wrap:wrap;gap:8px}.compositor-lfo-chip{padding:10px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.1);background:#0003;color:var(--text-secondary);cursor:pointer;font:inherit;font-size:13px;font-weight:700;transition:border-color .15s,color .15s,background .15s}.compositor-lfo-chip:hover{border-color:#fff3;color:var(--text-primary)}.compositor-lfo-chip.active{border-color:color-mix(in srgb,var(--accent) 55%,rgba(255,255,255,.1));background:color-mix(in srgb,var(--accent) 20%,rgba(0,0,0,.2));color:var(--accent-text)}.animation-engine-panel__details{margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.08);display:flex;flex-direction:column;gap:10px;min-height:0}.animation-engine-panel__preload-hint{margin:4px 0 0;font-size:10px;color:var(--text-dim)}.engine-drawer-fab{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(127,119,221,.42);background:linear-gradient(135deg,#08090df0,#171a27eb);color:var(--text-primary);cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,box-shadow .18s ease}.engine-drawer-fab--stage{position:absolute;right:0;top:50%;z-index:35;width:40px;min-height:72px;padding:4px 6px;transform:translate(50%,-50%);border-radius:12px 0 0 12px;flex-shrink:0;transition:transform .32s cubic-bezier(.4,0,.2,1),border-radius .2s ease}.preview-stage-row--engine-dock .engine-drawer-fab--stage{transform:translateY(-50%);border-radius:12px 0 0 12px}.engine-drawer-fab--stage:hover{border-color:var(--accent);color:var(--accent-text);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.engine-drawer-fab--active{border-color:#7f77dda8;background:linear-gradient(135deg,#7f77dd47,#1e2233f5);color:var(--accent-text)}.engine-drawer-fab__icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f}.engine-drawer-fab__icon{width:20px;height:20px}.engine-drawer-fab__icon path{stroke-width:2.4}@media (prefers-reduced-motion: reduce){.preview-stage-main,.engine-drawer-shell,.engine-drawer-panel,.engine-drawer-fab--stage{transition-duration:.01ms!important}}.preview--engine-dock .video-wrap--anchored .video-wrap__stage{max-height:min(38vh,56.25vw)}.preview--engine-dock.preview--top-dock .video-wrap--anchored .video-wrap__stage{max-height:min(30vh,56.25vw)}.top-drawer-system.system-runs-tab{max-height:calc(72vh - 52px);min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:0 10px 10px}.top-drawer-system.system-runs-tab .runs-browser{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;gap:8px}.top-drawer-system.system-runs-tab .runs-browser__panel{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.top-drawer-system.system-runs-tab .runs-browser__table-wrap{flex:1;min-height:0;max-height:none}.top-drawer-system.system-runs-tab .runs-detail-card,.top-drawer-system.system-runs-tab .runs-compare-card{flex-shrink:0;max-height:min(32vh,280px);overflow-y:auto}.live-mod-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px}.live-mod-slot{border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#08090d8c;padding:10px;display:grid;gap:8px;min-width:0}.live-mod-slot__head{display:flex;align-items:center;gap:8px;min-width:0}.live-mod-slot__map{display:inline-flex;align-items:center;gap:4px;min-width:0;font-size:9px;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-mod-slot__actions{margin-left:auto;display:inline-flex;gap:6px;flex-shrink:0}.live-mod-slot__actions .framesync-button{width:30px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center}.live-mod-slider{border-radius:10px;border:1px solid rgba(255,255,255,.08);padding:8px;background:color-mix(in srgb,rgba(127,119,221,.2) var(--shade),rgba(29,158,117,.12))}.live-mod-slider__readout{margin-top:6px;font-size:10px;color:var(--text-secondary);font-variant-numeric:tabular-nums;text-align:right}.live-mod-pad{position:relative;height:86px;border-radius:12px;border:1px solid rgba(255,255,255,.1);background:radial-gradient(circle at 50% 35%,#7f77dd33,#08090d99);overflow:hidden;cursor:crosshair}.live-mod-pad__crosshair{position:absolute;left:50%;top:0;bottom:0;width:1px;background:#ffffff1a}.live-mod-pad__crosshair--y{left:0;right:0;top:50%;height:1px;width:auto}.live-mod-pad__puck{position:absolute;width:12px;height:12px;border-radius:999px;background:var(--accent-text);box-shadow:0 0 10px #7f77dd59;transform:translate(-50%,-50%)}.live-mod-pad__axes{display:flex;justify-content:space-between;font-variant-numeric:tabular-nums}.live-mod-knob__readout{margin-top:6px;font-size:10px;color:var(--text-secondary);text-align:right;font-variant-numeric:tabular-nums}.restore-session-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:grid;place-items:center;padding:18px;background:#0000008c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.restore-session-modal__dialog{width:min(520px,100%)}.live-active-mod-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:start}.live-active-mod-row__param{min-width:0}.live-active-mod-row__remove{width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.live-main-dock__panel--crossfader{display:grid;gap:10px}.live-main-crossfader__summary{display:grid;gap:6px}.live-main-crossfader__builder{margin-top:2px}.live-hud-pinned{min-width:0}.live-hud-morph__slots{display:grid;gap:4px;margin-bottom:8px}.live-hud-morph__slot{display:inline-flex;align-items:center;border:.5px solid var(--border);border-radius:999px;padding:3px 8px;font-size:9px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-hud-morph__slot--a{border-color:color-mix(in srgb,var(--a-group) 45%,var(--border));color:var(--a-group)}.live-hud-morph__slot--b{border-color:color-mix(in srgb,var(--b-group) 45%,var(--border));color:var(--b-group)}.param-drawer{padding:0;overflow:hidden}.param-drawer-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;background:var(--bg-1);border:none;border-bottom:1px solid var(--border);color:var(--text-primary);cursor:pointer;font-size:13px;font-weight:600}.param-drawer-label{display:inline-flex;align-items:center;gap:6px;min-width:0}.param-drawer-label-icon{font-size:14px;color:var(--warn)}.param-drawer-chevron{font-size:14px;color:var(--text-secondary)}.param-drawer-body{padding:12px}.model-source-pill{display:inline-flex;align-items:center;gap:5px;font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border);white-space:nowrap}.model-source-pill__dot{width:6px;height:6px;border-radius:50%;background:var(--border);flex-shrink:0}.model-source-pill--forge{color:var(--live-text);border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.model-source-pill--forge .model-source-pill__dot{background:var(--live)}.model-source-pill--cache{color:var(--warn-text);border-color:color-mix(in srgb,var(--warn) 35%,var(--border))}.model-source-pill--cache .model-source-pill__dot{background:var(--warn)}.model-source-pill--placeholder{color:var(--error-text);border-color:color-mix(in srgb,var(--error) 35%,var(--border))}.model-source-pill--placeholder .model-source-pill__dot{background:var(--error)}.modulation-audio-tab__intro{margin-top:8px;margin-bottom:4px;color:var(--text-secondary)}.param-lock-btn{border:none;background:transparent;cursor:pointer;font-size:10px;opacity:.55;padding:0 2px}.param-lock-btn.active{opacity:1;color:var(--warn)}.param-pin-btn{border:none;background:transparent;cursor:pointer;font-size:10px;opacity:.25;padding:0 2px;transition:opacity .15s}.param-pin-btn:hover{opacity:.65}.param-pin-btn.active{opacity:1}.param-group--pinned{border:.5px solid var(--border);border-radius:var(--radius-sm);padding:8px;background:#1d9e750a;margin-bottom:8px}.param-locked input[type=range]{opacity:.45}.gpu-pool-enable{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary);cursor:pointer;min-height:34px}.gpu-pool-healthy-count{font-size:13px;color:var(--live-text);padding:6px 0;min-height:34px;display:flex;align-items:center}.gpu-forge-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:140;display:grid;place-items:center;padding:24px;background:#06080cb8;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.gpu-forge-modal__dialog{width:min(860px,calc(100vw - 32px));max-height:min(88vh,900px);overflow:auto;padding:18px;border:1px solid var(--border-strong);border-radius:16px;background:radial-gradient(circle at top right,rgba(127,119,221,.16),transparent 28%),#0d1017f5;box-shadow:0 28px 60px #0000006b}.gpu-forge-modal__header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.gpu-forge-modal__subtitle{margin-top:4px}.gpu-pool-table{width:100%;border-collapse:collapse;font-size:11px}.gpu-pool-table th{text-align:left;padding:8px;color:var(--text-dim);border-bottom:1px solid var(--border)}.gpu-pool-table td{padding:8px;border-bottom:1px solid var(--border);vertical-align:top;color:var(--text-primary)}.gpu-pool-table-wrap{max-height:420px;overflow:auto;border:1px solid var(--border);border-radius:10px}.gpu-row-disabled{opacity:.85}.gpu-status-pill{font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border)}.gpu-status-pill.st-healthy{color:var(--live-text);border-color:var(--live)}.gpu-status-pill.st-unhealthy{color:var(--danger)}.gpu-status-pill.st-disabled,.gpu-status-pill.st-unknown{color:var(--text-dim)}.generate-story__story-result{margin-top:12px;border:1px solid var(--border);border-radius:12px;padding:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),#0d1017b8;box-shadow:0 8px 18px #0000002e}.generate-story__ollama-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}.generate-story__ollama-status{font-size:12px;font-weight:600;letter-spacing:.02em}.generate-story__ollama-status--ready{color:var(--ok, #5dffb0)}.generate-story__ollama-status--warn{color:var(--warn, #ffb347)}.generate-story__ollama-status--off{color:var(--text-dim, #8a9bb0)}.generate-story__config{display:grid;gap:12px;margin-top:12px}.generate-story__theme-input{min-height:44px;font-size:14px}.generate-story__controls-grid{margin-top:0}.generate-story__actions{margin-top:12px}.generate-story__section-title{margin:0}.generate-story__preview{margin-top:12px;border:1px solid var(--border);border-radius:12px;padding:12px;background:var(--bg-1)}.generate-story__image-wrap{margin-top:10px;border-radius:10px;overflow:hidden;border:1px solid var(--border);background:#0000003d}.generate-story__image{display:block;width:100%;height:auto}.generate-sequencer__hero-value--compact{font-size:16px;line-height:1.2;font-weight:700;word-break:break-word}.generate-story__story-text{margin:10px 0 0;padding:12px;border-radius:8px;background:var(--bg-1);border:1px solid rgba(255,255,255,.05);font-size:11px;line-height:1.55;color:var(--text-secondary);white-space:pre-wrap;max-height:320px;overflow:auto}.deforum-settings-drawer{margin-top:8px}.deforum-settings-hint{font-size:11px;color:var(--text-secondary);font-weight:400;flex:1;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px}.deforum-settings-body{max-height:min(70vh,520px);overflow-y:auto}.deforum-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:0;margin-bottom:10px;padding:4px;border-radius:12px;border:1px solid var(--border);background:var(--bg-0)}.deforum-mode-toggle__btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:9px;padding:14px 16px;font-size:15px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);background:transparent;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}.deforum-mode-toggle__btn:hover:not(:disabled){color:var(--text);background:color-mix(in srgb,var(--accent) 8%,transparent)}.deforum-mode-toggle__btn.active{color:var(--text);background:color-mix(in srgb,var(--accent) 22%,var(--bg-1));box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.deforum-mode-toggle__hint{margin:0 0 10px;font-size:12px;color:var(--text-secondary)}.sub-pill--disabled,.sub-pill:disabled{opacity:.45;cursor:not-allowed}.deforum-control-panel__tabs{margin-bottom:12px;flex-wrap:wrap}.deforum-plugin-panel{display:flex;flex-direction:column;gap:12px}.deforum-job-toolbar{padding:10px 12px;display:flex;flex-direction:column;gap:8px}.deforum-job-toolbar__actions{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.deforum-job-toolbar__summary{margin:0}.engine-global-config{margin-bottom:14px;padding:12px}.engine-global-config__grid{margin-top:10px}.engine-global-config__summary{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:8px}.engine-global-config__model{flex:1 1 200px;text-align:left;border:.5px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;background:var(--bg-2);cursor:pointer}.engine-global-config__model-value{display:block;font-size:13px;font-weight:600;margin-top:2px}.engine-global-config__footer{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.deforum-settings-tabs{margin-bottom:10px;flex-wrap:wrap}.deforum-settings-panel{margin-top:10px;padding:10px;background:var(--bg-1)}.deforum-settings-toolbar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:10px}.deforum-advanced-toggle{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-secondary);margin-left:auto}.deforum-json-editor{font-family:ui-monospace,Cascadia Code,monospace;font-size:11px;line-height:1.4;min-height:200px}.deforum-json-error{font-size:11px;color:var(--danger);margin:6px 0 0}.deforum-verify-results{margin:10px 0 0;padding:10px 12px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);font-size:11px}.deforum-verify-results--ok{color:var(--live-text);border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.deforum-verify-results__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.deforum-verify-results__counts{display:flex;gap:6px;flex-wrap:wrap}.deforum-verify-results__badge{font-size:10px;font-weight:600;padding:2px 8px;border-radius:999px;text-transform:uppercase;letter-spacing:.04em}.deforum-verify-results__badge--error{color:var(--danger);border:1px solid color-mix(in srgb,var(--danger) 40%,transparent);background:color-mix(in srgb,var(--danger) 12%,transparent)}.deforum-verify-results__badge--warn{color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 40%,transparent);background:color-mix(in srgb,var(--warn) 10%,transparent)}.deforum-verify-results__list{margin:0 0 8px;padding-left:18px;display:grid;gap:6px}.deforum-verify-results__list:last-child{margin-bottom:0}.deforum-verify-results__list--error{color:color-mix(in srgb,var(--danger) 85%,var(--text))}.deforum-verify-results__list--warn{color:color-mix(in srgb,var(--warn) 90%,var(--text))}.deforum-verify-results__hint{display:block;margin-top:2px;color:var(--text-dim);font-size:10px}.deforum-settings-group{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:#031b2d59}.deforum-settings-group-title{padding:8px 10px;font-size:12px;font-weight:600;color:var(--text-primary);cursor:pointer;list-style:none}.deforum-settings-group-title::-webkit-details-marker{display:none}.deforum-settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 12px}@media (max-width: 900px){.deforum-settings-grid{grid-template-columns:1fr}}.deforum-field{display:flex;flex-direction:column;gap:4px;min-width:0}.deforum-field.deforum-field-textarea{grid-column:1 / -1}.deforum-field-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.deforum-field-label{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em}.deforum-field-toggle{display:inline-flex;align-items:center;gap:6px;font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.04em}.deforum-field-toggle .chip--compact{padding:2px 8px;font-size:9px;min-height:20px}.deforum-field-slider{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:center}.deforum-field-slider__value{font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text-primary);min-width:3.25rem;text-align:right;flex-shrink:0}.deforum-field-number .framesync-input[type=number]{width:100%;max-width:8rem;font-variant-numeric:tabular-nums}.deforum-field-bool{margin-top:2px}.deforum-field--mode-locked .deforum-field-label:after{content:" · 3D only";font-size:10px;font-weight:500;opacity:.65}.deforum-field--disabled{opacity:.72}.morph-blend-bar{padding:0 2px}.morph-blend-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--text-secondary);margin-top:4px}.morph-slot-weights{display:flex;flex-direction:column;gap:12px}.morph-crossfader-panel{margin-top:14px;padding:10px;border:1px solid var(--border);border-radius:10px;background:#031b2d4d;--crossfade-a-weight: .5;--crossfade-b-weight: .5}.morph-crossfader-hero{display:grid;gap:10px;margin-bottom:14px;padding:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(90deg,color-mix(in srgb,var(--a-group) calc(var(--crossfade-a-weight) * 18%),transparent),transparent 42%,transparent 58%,color-mix(in srgb,var(--b-group) calc(var(--crossfade-b-weight) * 18%),transparent)),var(--bg-1);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 24px) color-mix(in srgb,var(--a-group) 16%,transparent),inset 0 0 calc(var(--crossfade-b-weight) * 24px) color-mix(in srgb,var(--b-group) 16%,transparent)}.morph-crossfader-hero__header{margin-bottom:0}.morph-crossfader-hero__readout{font-size:11px;color:var(--text-secondary)}.generate-dock-sync{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:10px;padding:8px 10px;border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-3)}.generate-dock-sync__metric{display:flex;flex-direction:column;gap:2px;min-width:0}.generate-dock-sync__label{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.generate-dock-sync__value{font-size:11px;color:var(--live-text)}.morph-crossfader-deck--split{grid-template-columns:1fr 1fr;margin-top:0}.morph-crossfader-deck__side{transition:border-color .08s linear,box-shadow .08s linear,background .08s linear,opacity .08s linear}.morph-crossfader-deck__side--a{opacity:calc(.55 + var(--crossfade-a-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 28px) color-mix(in srgb,var(--a-group) 28%,transparent),0 0 calc(var(--crossfade-a-weight) * 20px) color-mix(in srgb,var(--a-group) 22%,transparent)}.morph-crossfader-deck__side--b{opacity:calc(.55 + var(--crossfade-b-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-b-weight) * 28px) color-mix(in srgb,var(--b-group) 28%,transparent),0 0 calc(var(--crossfade-b-weight) * 20px) color-mix(in srgb,var(--b-group) 22%,transparent)}.morph-crossfader-deck__side--dominant{opacity:1}.morph-crossfader-deck__weight{font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}.morph-crossfader-deck__side--a .morph-crossfader-deck__weight{color:var(--a-group);text-shadow:0 0 calc(var(--crossfade-a-weight) * 12px) color-mix(in srgb,var(--a-group) 65%,transparent)}.morph-crossfader-deck__side--b .morph-crossfader-deck__weight{color:var(--b-group);text-shadow:0 0 calc(var(--crossfade-b-weight) * 12px) color-mix(in srgb,var(--b-group) 65%,transparent)}.morph-crossfader-mini{margin-top:12px;display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:10px;background:#031b2d2e}.morph-slot-weight-row{display:grid;gap:12px;padding:12px;border:1px solid rgba(58,61,76,.9);border-radius:14px;background:radial-gradient(circle at 0% 50%,rgba(55,138,221,.12),transparent 42%),radial-gradient(circle at 100% 50%,rgba(232,121,176,.14),transparent 42%),linear-gradient(180deg,#0c111cf2,#060b14eb);box-shadow:inset 0 0 0 1px #ffffff08,0 12px 28px #0000002e;position:relative;overflow:hidden}.morph-slot-weight-row:after{content:"";position:absolute;inset:auto 0 0 0;height:2px;background:linear-gradient(90deg,#378add8c,#7f77ddbf,#e879b08c);opacity:.28}.morph-slot-weight-row.inactive{opacity:.45}.morph-slot-weight-row--flowing{border-color:#7f77ddbf;box-shadow:inset 0 0 0 1px #7f77dd33,0 16px 32px #0003}.morph-slot-weight-row--waiting{border-style:dashed}.morph-slot-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.morph-slot-weight-name{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-primary);min-width:0}.morph-slot-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.morph-slot-chip{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 10px;border-radius:999px;border:1px solid rgba(58,61,76,.95);background:#0a101ce0;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.morph-slot-chip--range{border-color:#378add59;color:var(--a-group)}.morph-slot-chip--weight{border-color:#7f77dd59;color:var(--accent-text)}.morph-slot-chip--active{border-color:#1d9e7573;color:var(--live-text);box-shadow:0 0 14px #1d9e7524}.morph-slot-chip--idle{color:var(--text-dim)}.morph-slot-flow{display:grid;grid-template-columns:minmax(0,1fr) minmax(180px,240px) minmax(0,1fr);gap:12px;align-items:stretch}.morph-slot-lane{display:grid;gap:6px;min-width:0;padding:10px;border:1px solid rgba(58,61,76,.95);border-radius:12px;background:#080d17d1;box-shadow:inset 0 0 0 1px #ffffff05}.morph-slot-lane--a{border-color:#378add6b}.morph-slot-lane--b{border-color:#e879b06b}.morph-slot-editor__label{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.06em}.morph-slot-editor__input{min-width:0}.morph-slot-flow__bridge{display:grid;align-content:center;gap:10px;min-width:0}.morph-slot-flow__track{position:relative;height:10px;border-radius:999px;background:linear-gradient(90deg,#378add47,#7f77dd80 50%,#e879b047);border:1px solid rgba(58,61,76,.95);overflow:hidden}.morph-slot-flow__glow{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,#378add73,#7f77dde6,#e879b073);opacity:.55}.morph-slot-flow__marker{position:absolute;top:50%;left:var(--morph-flow-progress, 50%);width:18px;height:18px;border-radius:50%;border:2px solid rgba(230,232,240,.95);background:radial-gradient(circle,#fffffff2,#7f77ddf2 38%,#151928f2);box-shadow:0 0 18px #7f77dd73;transform:translate(-50%,-50%)}.morph-slot-flow__readout{display:grid;gap:6px;justify-items:center;text-align:center}.morph-slot-flow__mix{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-group)}.morph-slot-flow__mix--b{color:var(--b-group)}.morph-slot-flow__preview{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:6px 12px;border-radius:999px;border:1px solid rgba(127,119,221,.45);background:#7f77dd24;color:var(--accent-text);font-size:11px;font-weight:600;line-height:1.35;max-width:100%}.morph-slot-weight-slider{width:100%}.morph-crossfader-links{justify-content:flex-end}.morph-crossfader-status{display:block;margin-top:8px;color:var(--text-secondary)}.morph-crossfader-panel__summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:0}.morph-crossfader-deck{margin-top:8px}.prompt-ab-column__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.morph-crossfader__section{margin-bottom:14px}.morph-crossfader__section-label{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);margin-bottom:8px}.morph-crossfader__card{margin-bottom:8px}.morph-crossfader__card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:6px}.morph-crossfader__card-body{display:grid;gap:6px;margin-top:6px}.morph-crossfader__textarea{min-height:52px;resize:vertical}.morph-crossfader__remove{flex-shrink:0;padding:2px 6px;min-width:0}.morph-crossfader__morphed{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:10px}.morph-crossfader-center__add{display:flex;flex-wrap:wrap;gap:8px;margin-top:0;align-items:center}.morph-crossfader-center__add .framesync-select{flex:1;min-width:120px}.modulation-active-mods__list{display:grid;gap:8px;margin-top:12px}.modulation-audio-dropzone{margin-top:14px;padding:22px 16px;border-radius:12px;border:1.5px dashed rgba(127,119,221,.45);background:#090d188c;text-align:center;cursor:pointer;transition:border-color .15s,background .15s}.modulation-audio-dropzone:hover,.modulation-audio-dropzone--filled{border-color:#50fa7b8c;background:#0c1220bf}.modulation-audio-dropzone__input{display:none}.modulation-audio-dropzone__title{display:block;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--text)}.modulation-audio-dropzone__hint{display:block;margin-top:6px;font-size:11px;color:var(--text-dim)}.modulation-audio-sync-settings{margin-top:8px;padding-top:8px;border-top:.5px solid var(--border)}.modulation-audio-sync-settings__lead{display:flex;align-items:center;gap:10px;margin-top:10px}.modulation-audio-sync-settings__lead .framesync-input{max-width:120px}.modulation-mappings__toolbar{display:flex;justify-content:flex-end;margin-bottom:10px}.modulation-mappings__group-tabs{margin-bottom:12px;flex-wrap:wrap}.modulation-mappings__rows{display:grid;gap:10px}.modulation-mapping-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px 10px;padding:10px 12px;border-radius:10px;border:.5px solid var(--border);background:#080a12a6;opacity:.72}.modulation-mapping-row--mapped{opacity:1;border-color:#50fa7b59}.modulation-mapping-row__head{grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}.modulation-mapping-row__label{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-dim)}.modulation-mapping-row--mapped .modulation-mapping-row__label{color:var(--live)}.modulation-mapping-row__badges{display:flex;flex-wrap:wrap;gap:4px}.modulation-mapping-row__control{display:flex;align-items:center;gap:8px;min-width:0}.modulation-mapping-row__slider{flex:1;min-width:0}.modulation-mapping-row__value{font-size:10px;min-width:3.5em;text-align:right}.modulation-mapping-row__actions{display:flex;gap:6px;align-items:center}.modulation-map-picker{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:flex;align-items:center;justify-content:center;padding:16px;background:#04060cb8}.modulation-map-picker__dialog{width:min(420px,100%);max-height:min(80vh,520px);overflow:auto}.modulation-map-picker__slots{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}.modulation-map-picker__slot.active{border-color:#50fa7b99;color:var(--live)}.modulation-map-picker__lfo-list{display:grid;gap:8px;margin-top:12px}.modulation-map-picker__lfo{display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;padding:10px 12px;border-radius:10px;border:.5px solid var(--border);background:#080a12cc;cursor:pointer}.modulation-map-picker__lfo--on{border-color:#50fa7b66}.modulation-map-picker__lfo-title{font-size:12px;font-weight:600}.modulation-map-picker__lfo-meta{font-size:10px;color:var(--text-dim)}.morph-slot-preview{display:block;font-size:10px;color:var(--text-dim);white-space:normal;line-height:1.45;padding:8px 10px;border-radius:10px;border:1px dashed rgba(127,119,221,.3);background:#090d18b3}@media (max-width: 900px){.morph-slot-head{align-items:flex-start}.morph-slot-flow{grid-template-columns:1fr}.morph-slot-flow__bridge{order:3}}.model-status-pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--border)}.model-status-dot{width:8px;height:8px;border-radius:50%}.model-offline .model-status-dot{background:var(--danger);box-shadow:0 0 6px var(--danger)}.model-offline{color:var(--danger)}.model-loading .model-status-dot{background:var(--warn);box-shadow:0 0 6px var(--warn);animation:pulse-dot 1s ease infinite}.model-loading{color:var(--warn)}.model-ready .model-status-dot{background:var(--success);box-shadow:0 0 6px var(--success)}.model-ready{color:var(--success)}@keyframes pulse-dot{50%{opacity:.4}}.model-bar{display:grid;gap:6px;margin-bottom:14px}.model-loading{font-size:11px;color:var(--warn)}.model-last{font-size:10px;color:var(--text-secondary)}.param-group{margin-bottom:12px}.param-group-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.xy-pad{width:140px;height:140px;border-radius:12px;border:1px solid var(--border);background:var(--bg-1);position:relative;cursor:crosshair;-webkit-user-select:none;user-select:none}.xy-dot{position:absolute;width:12px;height:12px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent)}.lfo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.lfo-card{border:.5px solid var(--border);border-radius:var(--radius);padding:10px;background:var(--bg-2);box-shadow:0 8px 18px #00000047}.lfo-card-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.lfo-waveform{flex:1;min-width:0;border-radius:4px;background:var(--bg-1)}.lfo-card .meta{font-size:12px;color:var(--text-secondary);margin-bottom:4px}.lfo-card select,.lfo-card input[type=number]{width:100%;padding:6px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary)}.lfo-card .switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--text-secondary)}.lfo-target-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(62px,1fr));gap:4px;margin-top:4px}.audio-map-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px}.audio-map-card{border:1px solid var(--border);border-radius:10px;padding:10px;background:var(--bg-1)}.audio-map-card--live{border-color:var(--live);box-shadow:inset 0 0 0 1px #1d9e751f}.framesync-panel{background:var(--bg-0);border:1px solid var(--border);border-radius:10px;padding:10px;box-shadow:inset 0 0 0 1px #2a2d3a59}.framesync-header{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--text-primary);font-weight:600;letter-spacing:.6px}.framesync-title{font-size:18px;display:inline-flex;align-items:center;gap:8px}.framesync-title-icon{font-size:18px;color:var(--accent)}.framesync-accent{color:var(--accent)}.framesync-graph{margin-top:10px;background:var(--bg-0);border:1px solid var(--border);border-radius:8px;padding:6px 10px}.framesync-axis{display:grid;grid-template-columns:repeat(12,1fr);gap:0;margin-top:6px;font-size:10px;color:var(--text-dim)}.framesync-axis span{text-align:center}.framesync-row{display:grid;grid-template-columns:1.1fr 2fr 1.2fr 1.2fr;gap:12px;margin-top:12px}.framesync-stack{display:grid;gap:10px}.framesync-subtitle{font-size:12px;color:var(--text-secondary);margin-bottom:6px;letter-spacing:.3px}.framesync-checkbox{font-size:12px;color:var(--text-secondary);display:flex;align-items:center;gap:8px;cursor:pointer}.framesync-checkbox input[type=checkbox]{accent-color:var(--success)}.framesync-list{font-size:12px;color:var(--text-primary)}.framesync-list .item{padding:4px 0;border-bottom:1px solid var(--border)}.framesync-list .item:last-child{border-bottom:none}.framesync-select,.framesync-input{width:100%;padding:6px;background:var(--bg-0);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);font-size:12px}.framesync-input[type=range]{accent-color:var(--accent)}.framesync-gradient-bar{background:linear-gradient(90deg,var(--a-group),var(--b-group));height:24px;border-radius:6px}.xy-dot.framesync{background:var(--accent);box-shadow:0 0 10px var(--accent)}.framesync-buttons{display:grid;grid-template-columns:repeat(auto-fit,minmax(64px,1fr));gap:6px}.framesync-button{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);font-size:11px;padding:6px 12px;text-align:center;border-radius:var(--radius-sm, 7px);cursor:pointer;font-family:inherit;transition:border-color .15s ease,color .15s ease,background .15s ease}.framesync-button:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.framesync-button.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd1f}.framesync-button--live,.framesync-button.live{border-color:var(--live);color:var(--live-text);background:#1d9e7524}.framesync-button--accent{border-color:var(--accent);color:var(--accent-text);background:#7f77dd2e}.framesync-button--danger{border-color:var(--error);color:var(--error);background:#e24b4a1a}.framesync-button--compact{padding:4px 8px;font-size:10px}.framesync-button:disabled{opacity:.45;cursor:not-allowed}.framesync-metric{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:12px;color:var(--text-primary)}.framesync-metric span{display:block;color:var(--text-dim);font-size:10px}.framesync-wave-shapes{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:6px}.framesync-wave{background:var(--bg-0);border:1px solid var(--border);border-radius:6px;padding:6px;text-align:center;font-size:10px;color:var(--text-primary)}.framesync-wave svg{width:100%;height:40px;display:block;margin-bottom:4px}.framesync-footer{margin-top:10px;display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.img2img-panel{display:grid;gap:12px;margin-top:10px}.img2img-panel__summary,.img2img-panel__status,.img2img-panel__output{text-align:center}.img2img-dropgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.img2img-dropgrid__actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.img2img-dropzone{position:relative;min-height:240px;display:flex;align-items:center;justify-content:center;padding:14px;border:1px dashed rgba(127,119,221,.42);border-radius:16px;background:linear-gradient(180deg,#7f77dd14,#08090deb);cursor:pointer;overflow:hidden;text-align:center;transition:border-color .18s ease,transform .18s ease,box-shadow .18s ease}.img2img-dropzone:hover{border-color:#7f77ddb3;transform:translateY(-1px);box-shadow:0 14px 32px #00000047}.img2img-dropzone--mask{border-color:#2de2ff57;background:linear-gradient(180deg,#2de2ff14,#08090deb)}.img2img-dropzone--filled{border-style:solid}.img2img-dropzone__input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;cursor:pointer}.img2img-dropzone__preview,.img2img-dropzone__empty{width:100%;height:100%;display:grid;place-items:center}.img2img-dropzone__image{width:100%;height:100%;max-height:320px;object-fit:contain;border-radius:12px;background:#00000059}.img2img-dropzone__empty{gap:8px;align-content:center;color:var(--text-primary)}.img2img-dropzone__title{font-size:20px;font-weight:700;color:var(--text-primary)}.img2img-dropzone__hint{font-size:14px;color:var(--accent-text)}.img2img-dropzone__meta{font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.08em}.img2img-controls-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.img2img-control-card{display:grid;gap:10px;padding:14px;border:1px solid var(--border);border-radius:14px;background:var(--bg-1)}.img2img-control-card--primary{border-color:#7f77dd66;box-shadow:inset 0 0 0 1px #7f77dd1a}.img2img-control-card__value{font-size:28px;line-height:1;font-weight:700;color:var(--text-primary)}.img2img-control-card__slider{min-height:36px}.img2img-control-card__input{min-height:44px;font-size:18px;padding:10px 12px;border-radius:10px}.img2img-panel__actions .framesync-button{min-height:42px;font-size:13px;font-weight:700}.framesync-toggle{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-primary)}.framesync-dot{width:10px;height:10px;border-radius:50%;background:var(--warn);box-shadow:0 0 8px #ef9f2799}.compact-panel{background:var(--bg-1);border:1px solid var(--border);border-radius:12px;padding:10px;display:grid;gap:8px}.compact-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.mod-row{display:grid;grid-template-columns:24px 1.2fr 1fr 70px 70px 1fr 36px;gap:6px;align-items:center;font-size:12px}.mod-row .select,.mod-row input{width:100%}.mod-row .chip{padding:6px 8px;font-size:11px}.mod-row button{background:var(--bg-1);border:1px solid var(--border);color:var(--text-primary);border-radius:8px;padding:4px 6px;cursor:pointer}.mod-header{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary)}.mod-preview{grid-column:2 / span 5;background:var(--bg-1);border:1px solid var(--border);border-radius:8px;padding:6px}.mod-preview svg{width:100%;height:36px;display:block}.mod-subheader{font-size:12px;color:var(--text-secondary);margin-top:6px}.fs-card{background:var(--bg-1);border:1px solid var(--border);border-radius:12px;padding:10px;box-shadow:inset 0 0 0 1px #2a2d3a73}.fs-card h4{margin:0 0 8px;font-size:13px;color:var(--text-primary);letter-spacing:.3px}.fs-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:var(--text-secondary)}.fs-field{display:grid;grid-template-columns:1fr 1fr;gap:6px;align-items:center;font-size:12px;color:var(--text-primary)}.fs-input,.fs-select{width:100%;padding:6px;background:var(--bg-0);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:12px}.fs-button{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:6px 12px;font-size:11px;font-family:inherit;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s,background .15s}.fs-button:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-2)}.fs-button.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd40}.fs-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:8px}.fs-chip{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:4px 10px;font-size:10px;font-family:inherit;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s,background .15s}.fs-chip:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.fs-chip.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd38}.fs-row{display:grid;grid-template-columns:24px 1.2fr 1fr 70px 70px 1fr 36px;gap:6px;align-items:center;font-size:12px;color:var(--text-primary)}.fs-row input[type=number],.fs-row select{background:var(--bg-0);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);padding:4px 6px}.fs-row button{background:var(--bg-1);border:1px solid var(--border);color:var(--text-primary);border-radius:8px;padding:4px 6px;cursor:pointer}.preview-bar-container{margin-top:4px;background:var(--bg-0);border:1px solid var(--border);border-radius:6px;overflow:hidden}.preview-bar-header{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;background:var(--bg-1);border-bottom:1px solid var(--border)}.preview-bar-title{font-size:11px;color:var(--text-secondary);font-weight:600}.preview-bar-toggle{background:transparent;border:1px solid var(--border);color:var(--text-primary);border-radius:4px;padding:2px 6px;font-size:10px;cursor:pointer}.preview-bar-toggle:hover{border-color:var(--warn);color:var(--warn)}.preview-bar-toggle-icon{font-size:13px}.preview-bar{display:flex;gap:4px;overflow-x:auto;padding:6px;max-height:70px}.preview-bar.collapsed{display:none}.preview-bar::-webkit-scrollbar{height:4px}.preview-bar::-webkit-scrollbar-track{background:var(--bg-0)}.preview-bar::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.preview-bar::-webkit-scrollbar-thumb:hover{background:var(--warn)}.thumb-card{position:relative;border-radius:4px;overflow:hidden;border:1px solid var(--border);background:var(--bg-1);flex-shrink:0}.thumb{width:80px;height:45px;display:block;background:var(--bg-2);object-fit:cover}.thumb-label{position:absolute;left:0;right:0;bottom:0;padding:2px 4px;font-size:9px;color:var(--text-primary);background:linear-gradient(180deg,transparent,rgba(0,0,0,.8))}.video-controls-panel{background:linear-gradient(135deg,var(--bg-1) 0%,var(--bg-0) 100%);border:1px solid var(--border);border-radius:8px;padding:8px 12px;margin-top:4px;box-shadow:0 4px 12px #0000004d}.video-controls{display:flex;gap:8px;align-items:center;justify-content:center}.control-btn{background:var(--bg-3);border:.5px solid var(--border);color:var(--text-secondary);border-radius:var(--radius-sm);padding:8px 14px;font-size:11px;font-family:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:border-color .15s,color .15s,background .15s;min-width:90px;justify-content:center;font-weight:600;letter-spacing:.03em}.control-btn:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-2)}.control-btn.playing,.control-btn--live{border-color:var(--live);background:#1d9e752e;color:var(--live-text)}.control-btn.recording{border-color:var(--error);background:#e24b4a26;color:#f5b4b3;animation:pulse 1.5s ease-in-out infinite}.control-btn--loading{border-color:var(--accent);background:#7f77dd29;color:var(--accent-text);box-shadow:0 0 0 1px #7f77dd3d,0 10px 24px #7f77dd2e}.control-btn__icon{font-size:14px}.lazy-loading-indicator{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-width:0}.lazy-loading-indicator--button{gap:7px;font-weight:600}.lazy-loading-indicator--inline{gap:8px;font-weight:600}.lazy-loading-indicator--subtle{gap:6px}.header-frame-processing{display:inline-flex;align-items:center;max-width:min(280px,32vw);padding:4px 10px;border-radius:999px;border:1px solid rgba(127,119,221,.45);background:#7f77dd1f;color:var(--accent-text);font-size:11px;font-weight:600;letter-spacing:.02em}.header-frame-processing__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-frame-processing-banner{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:8px;padding:8px 12px;border-radius:10px;border:1px solid rgba(127,119,221,.35);background:#7f77dd14;color:var(--accent-text);font-size:12px;font-weight:600}.live-frame-processing-banner__hint{font-size:11px;font-weight:500;color:var(--text-secondary);flex:1 1 12rem;min-width:0;line-height:1.35}.lazy-loading-indicator--overlay{font-size:14px;color:var(--media-text);text-shadow:0 1px 10px rgba(0,0,0,.35)}.lazy-loading-indicator__spinner{width:14px;height:14px;border-radius:999px;border:2px solid currentColor;border-right-color:transparent;flex:0 0 auto;animation:preview-spin .85s linear infinite}.lazy-loading-indicator--overlay .lazy-loading-indicator__spinner{width:18px;height:18px;border-width:2.5px}.lazy-loading-indicator__dots{display:inline-flex;align-items:flex-end;gap:3px;flex:0 0 auto}.lazy-loading-indicator__dots span{width:4px;height:4px;border-radius:999px;background:currentColor;opacity:.32;animation:preview-dots 1.2s ease-in-out infinite}.lazy-loading-indicator__dots span:nth-child(2){animation-delay:.16s}.lazy-loading-indicator__dots span:nth-child(3){animation-delay:.32s}.framesync-button--loading{border-color:var(--accent);color:var(--accent-text);background:#7f77dd24;box-shadow:0 0 0 1px #7f77dd33}@keyframes preview-spin{to{transform:rotate(360deg)}}@keyframes preview-dots{0%,80%,to{opacity:.28;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}.stream-link{background:var(--bg-0);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-size:10px;color:var(--text-primary);display:flex;align-items:center;gap:6px;margin-top:4px;justify-content:center}.stream-link a{color:var(--warn);text-decoration:none;display:inline-flex;align-items:center;gap:4px}.stream-link a:hover{text-decoration:underline}.stream-link-icon{font-size:12px}.thumb-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--bg-1) 0%,var(--bg-0) 100%)}.thumb-placeholder svg{width:30px;height:30px;opacity:.3}video::-webkit-media-controls{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.runs-row-selected{background:#2de2ff14!important}.status-chip{display:inline-block;padding:2px 8px;border-radius:4px;font-size:9px;font-weight:600;text-transform:uppercase}.status-completed{background:#1d9e7526;color:var(--live-text)}.status-failed{background:#e24b4a26;color:var(--error)}.status-running{background:#7f77dd26;color:var(--accent-text)}.status-queued{background:#ef9f2726;color:var(--warn)}.recent-runs-rail{margin-top:8px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);padding:8px;display:grid;gap:8px}.recent-runs-rail__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.recent-runs-rail__title{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.recent-runs-rail__link{border:1px solid var(--border);background:var(--bg-0);color:var(--text-primary);font-size:10px;border-radius:999px;padding:4px 10px;cursor:pointer}.recent-runs-rail__list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.recent-runs-rail__item{border:1px solid var(--border);background:var(--bg-0);border-radius:8px;padding:6px;display:grid;gap:6px;cursor:pointer;min-width:0}.recent-runs-rail__item:hover{border-color:var(--border-strong)}.recent-runs-rail__thumb{width:100%;aspect-ratio:16 / 9;border-radius:6px;object-fit:cover;background:var(--bg-2);border:1px solid var(--border)}.recent-runs-rail__thumb--empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.recent-runs-rail__meta{display:grid;gap:2px;min-width:0}.recent-runs-rail__id{font-size:10px;font-family:ui-monospace,Cascadia Code,monospace;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.recent-runs-rail__date{font-size:9px;color:var(--text-dim)}.recent-runs-rail__empty{font-size:11px;color:var(--text-dim)}.prompt-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prompt-input-row{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.prompt-input-row__input{min-height:46px;resize:vertical}.prompt-input-row__actions{display:flex;gap:6px;align-items:center;padding-top:2px}.prompt-input-row__actions .framesync-button{width:32px;height:28px;display:inline-flex;align-items:center;justify-content:center;padding:0}.prompt-history-panel{margin-top:10px;border:1px solid var(--border);background:var(--bg-1);border-radius:10px;padding:10px}.prompt-history-panel__header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.prompt-history-panel__empty{font-size:11px;color:var(--text-dim);padding:6px 0;text-align:center}.prompt-history-panel__list{display:grid;gap:6px;max-height:220px;overflow:auto}.prompt-history-panel__item{text-align:left;width:100%;border:1px solid var(--border);background:var(--bg-0);color:var(--text-primary);border-radius:8px;padding:8px;font-size:11px;line-height:1.25;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prompt-history-panel__item:hover{border-color:#ffffff2e}.lora-crossfader-shell{margin-top:12px}.lora-crossfader-shell--off{opacity:.72}.lora-crossfader-shell--off .prompt-ab-center--disabled,.lora-crossfader-links--disabled{opacity:.55;pointer-events:none}.lora-crossfader-inline{display:grid;gap:10px;margin-top:16px;padding:12px;border:1px solid var(--border);border-radius:12px;background:var(--bg-1)}.lora-crossfader-inline__header{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.lora-crossfader-summary__status{display:block;margin-top:0;color:var(--text-secondary)}.lora-crossfader-links{display:flex;flex-wrap:wrap;gap:8px}.lora-crossfader-panel{padding:10px;--crossfade-a-weight: .5;--crossfade-b-weight: .5}.lora-crossfader-panel__header{margin-bottom:8px}.lora-crossfader-panel__deck{margin-top:12px;grid-template-columns:1fr 1fr}.lora-crossfader-panel__side{transition:border-color .08s linear,box-shadow .08s linear,opacity .08s linear}.lora-crossfader-panel__side--a{opacity:calc(.55 + var(--crossfade-a-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-a-weight) * 24px) color-mix(in srgb,var(--a-group) 24%,transparent),0 0 calc(var(--crossfade-a-weight) * 16px) color-mix(in srgb,var(--a-group) 18%,transparent)}.lora-crossfader-panel__side--b{opacity:calc(.55 + var(--crossfade-b-weight) * .45);box-shadow:inset 0 0 calc(var(--crossfade-b-weight) * 24px) color-mix(in srgb,var(--b-group) 24%,transparent),0 0 calc(var(--crossfade-b-weight) * 16px) color-mix(in srgb,var(--b-group) 18%,transparent)}.lora-crossfader-panel__side--dominant{opacity:1}.lora-crossfader-panel__footer{margin-top:12px}.lora-crossfader-panel--off .lora-crossfader-panel__deck{opacity:.72}.prompt-ab-summary{margin-top:20px;display:grid;grid-template-columns:1fr 2fr 1fr;gap:16px;align-items:stretch}.prompt-ab-column{display:grid;gap:8px;padding:10px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1)}.prompt-ab-column--a{border-color:var(--a-group)}.prompt-ab-column--b{border-color:var(--b-group)}.prompt-ab-column__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.prompt-ab-column__title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.lora-picker-panel--column{margin-bottom:10px;max-height:280px;overflow:auto}.prompt-ab-column--a .prompt-ab-column__title{color:var(--a-group)}.prompt-ab-column--b .prompt-ab-column__title{color:var(--b-group)}.prompt-ab-column__empty,.prompt-ab-column__more{font-size:10px;color:var(--text-dim);text-align:center;padding:6px 0}.prompt-ab-card{background:var(--bg-0);border:1px solid var(--border);border-radius:8px;padding:8px;display:grid;gap:4px}.prompt-ab-card__name{font-size:12px;color:var(--text-primary);font-weight:600}.prompt-ab-card__slider{margin-top:4px}.prompt-ab-card__value{font-size:10px;color:var(--text-dim)}.prompt-ab-center{padding:10px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1);align-content:start}.prompt-ab-center__labels{display:flex;justify-content:space-between;font-size:10px;margin-top:4px}.prompt-ab-center__label--a{color:var(--a-group)}.prompt-ab-center__label--b{color:var(--b-group)}.prompt-group-button--a{border-color:var(--a-group);color:var(--a-group)}.prompt-group-button--common{border-color:#7f77dda6;color:var(--accent-text)}.prompt-group-button--b{border-color:var(--b-group);color:var(--b-group)}.prompt-group-button--common.active{border-color:var(--accent);color:var(--accent-text);background:#7f77dd40;box-shadow:inset 0 0 0 1px #7f77dd24}.prompt-group-button--a.active{border-color:var(--a-group);color:var(--a-group-text);background:#378add33;box-shadow:inset 0 0 0 1px #378add24}.prompt-group-button--b.active{border-color:var(--b-group);color:var(--b-group-text);background:#e879b033;box-shadow:inset 0 0 0 1px #e879b024}.lora-family-pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 10px;border-radius:999px;border:1px solid rgba(127,119,221,.35);background:#7f77dd1f;color:var(--accent-text);font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700}.lora-browser-summary{display:block;margin-top:10px;color:var(--text-secondary)}.lora-picker-trigger{min-width:34px;padding:0 10px;font-size:18px;line-height:1}.lora-picker-panel{display:grid;gap:10px;margin-top:12px;padding:12px;border:1px solid rgba(127,119,221,.35);border-radius:12px;background:#080d17e6}.lora-picker-families{display:grid;gap:10px}.lora-picker-family{display:grid;gap:8px}.lora-picker-family__title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text)}.lora-picker-list{display:grid;gap:8px;max-height:320px;overflow-y:auto}.lora-picker-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;padding:10px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1)}.lora-picker-row__copy{min-width:0;display:grid;gap:4px}.lora-picker-row__name{font-size:12px;color:var(--text-primary);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-picker-row__path{font-size:10px;color:var(--text-dim);word-break:break-all}.lora-picker-row__actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.lora-picker-empty{font-size:11px;color:var(--text-dim);text-align:center;padding-top:6px}.lora-family-stack{display:grid;gap:10px;margin-top:12px}.lora-family-group{border:1px solid var(--border);border-radius:12px;background:#080d17d1;overflow:hidden}.lora-family-group--open{border-color:#7f77dd73;box-shadow:inset 0 0 0 1px #7f77dd1f}.lora-family-group__header{width:100%;display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:center;padding:12px;border:none;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.lora-family-group__label{font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.lora-family-group__meta,.lora-family-group__toggle{font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.06em}.lora-family-group__empty{padding:0 12px 12px;font-size:11px;color:var(--text-dim)}.lora-browser-grid{margin:0;padding:0 12px 12px;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;max-height:400px;overflow-y:auto}.lora-card{background:var(--bg-2);border:1px solid var(--border);border-radius:11px;overflow:hidden;cursor:pointer;display:grid}.lora-card__media{position:relative;width:100%;height:180px;background:var(--bg-0)}.lora-card__thumb{width:100%;height:100%;object-fit:cover;display:block}.lora-card__placeholder{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-dim)}.lora-card__selected{position:absolute;top:8px;right:8px;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:700;background:var(--bg-0);border:1px solid var(--border)}.lora-card__selected--a{border-color:var(--a-group);color:var(--a-group)}.lora-card__selected--b{border-color:var(--b-group);color:var(--b-group)}.lora-card__body{padding:10px;display:grid;gap:8px}.lora-card__title{font-size:13px;color:var(--text-primary);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-card__path{font-size:10px;color:var(--text-dim);min-height:28px;word-break:break-all}.lora-card__strength{font-size:10px;color:var(--text-dim)}.lora-card__actions{display:grid;grid-template-columns:1fr 1fr auto;gap:6px;align-items:center}.lora-active-groups{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}.lora-active-group{display:grid;gap:8px}.lora-active-group--common{grid-column:1 / -1}.lora-active-group__title{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.lora-active-group--common .lora-active-group__title{color:var(--accent-text)}.lora-active-group--a .lora-active-group__title{color:var(--a-group)}.lora-active-group--b .lora-active-group__title{color:var(--b-group)}.lora-active-group__body{background:var(--bg-0);border:1px solid var(--border);border-radius:11px;padding:8px}.lora-active-group__row{display:grid;grid-template-columns:minmax(0,1fr) minmax(120px,180px) auto;align-items:center;gap:10px;padding:6px 0;border-bottom:1px solid var(--border)}.lora-active-group__row:last-child{border-bottom:none}.lora-active-group__copy{min-width:0;display:grid;gap:3px}.lora-active-group__name{font-size:12px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lora-active-group__value{font-size:10px;color:var(--text-dim)}.lora-active-group__slider{width:100%}.lora-active-group__remove{white-space:nowrap}.lora-active-group__empty{font-size:11px;color:var(--text-dim);padding:8px;text-align:center}.controlnet-model-summary{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px;font-size:11px;color:var(--text-secondary)}.controlnet-model-warning{margin-top:8px;font-size:11px;color:var(--warn)}.controlnet-weight-card{display:grid;gap:8px;padding:12px;border:1px solid rgba(127,119,221,.35);border-radius:12px;background:linear-gradient(180deg,#7f77dd1f,#7f77dd0a),var(--bg-1);box-shadow:inset 0 0 0 1px #7f77dd14}.controlnet-weight-card__hero{display:flex;justify-content:space-between;align-items:baseline;gap:10px}.controlnet-weight-card__value{font-size:22px;font-weight:800;color:var(--text-primary);line-height:1}.controlnet-weight-card__label{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent-text)}.controlnet-weight-card__bar{position:relative;height:12px;border-radius:999px;overflow:hidden;background:#ffffff0f;border:1px solid rgba(255,255,255,.08)}.controlnet-weight-card__fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,#58d1ff,#7f77dd 52%,#ff9a4d);box-shadow:0 0 18px #7f77dd47}.controlnet-weight-card__ticks{display:flex;justify-content:space-between;gap:10px;font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.controlnet-weight-card__slider{margin-top:8px}.controlnet-slot-strip{margin-top:12px;display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px}.controlnet-slot-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.controlnet-slot-row__select{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.controlnet-slot-row__state{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}.controlnet-slot-row__state--live{color:var(--live-text)}.controlnet-slot-row__toggle{min-width:54px;white-space:nowrap}.audio-reactive-panel__status{margin-top:10px;font-size:11px;color:var(--live-text)}.audio-start-button.active{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px var(--live) inset}.audio-map-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:8px}.audio-map-card__title-wrap{display:grid;gap:6px;flex:1;min-width:0}.audio-map-card__target{border-color:var(--live)}.audio-map-card__remove{min-width:auto}.audio-map-card__fields{display:grid;grid-template-columns:1fr 1fr;gap:4px;align-items:start}.audio-map-card__fields .audio-map-card__presets{grid-column:1 / -1}.audio-map-card__pair{display:grid;grid-template-columns:1fr 1fr;gap:6px}.audio-map-card__input{font-size:10px;padding:4px}.audio-map-card__presets,.audio-band-row__pills{display:flex;flex-wrap:wrap;gap:6px}.audio-map-card__presets-label{width:100%;font-size:10px;color:var(--live-text);text-transform:uppercase;letter-spacing:.08em}.audio-band-pill{border-color:var(--live);color:var(--live-text);font-size:10px;padding:4px 8px;min-width:auto}.audio-band-pill--ghost{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:999px;padding:4px 8px;font-size:10px;color:var(--text-secondary);background:var(--bg-1)}.audio-add-mapping{min-height:100%;border-style:dashed;border-color:var(--live);color:var(--live-text);background:var(--bg-1)}.audio-band-row{margin-top:12px;display:grid;gap:8px}.runs-browser__panel{display:grid;gap:0}.runs-browser__main-tabs{margin-top:8px}.runs-browser__tab-badge{margin-left:5px;padding:0 6px;border-radius:999px;background:#7f77dd33;color:var(--accent-text);font-size:9px;font-weight:700}.runs-browser__tab-badge--dim{background:#ffffff14;color:var(--text-dim)}.runs-activity-summary{margin-top:8px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px}.runs-activity-summary__label{font-weight:600;color:var(--text-primary)}.runs-browser__table-wrap--active{margin-top:8px}.runs-browser__worker,.runs-browser__live-frames,.runs-browser__eta{font-size:10px;white-space:nowrap}.runs-browser__worker{max-width:88px;overflow:hidden;text-overflow:ellipsis}.runs-browser__live-frames{font-variant-numeric:tabular-nums;color:var(--live-text)}.runs-browser__eta{color:var(--text-dim)}.system-runs-tab{max-height:calc(100vh - 200px);min-height:0;overflow:hidden;display:flex;flex-direction:column}.system-runs-tab .runs-browser{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;gap:8px}.system-runs-tab .runs-browser__panel{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.system-runs-tab .runs-browser__table-wrap{flex:1;min-height:0;max-height:none}.system-runs-tab .runs-detail-card,.system-runs-tab .runs-compare-card{flex-shrink:0;max-height:min(38vh,320px);overflow-y:auto}.runs-browser__filters--compact{margin-top:8px;grid-template-columns:2fr 1fr 1fr 1fr;gap:6px}.runs-browser__sortbar--compact{margin-top:6px}.runs-browser__hint{font-size:9px;color:var(--text-dim)}.runs-browser__table--compact th,.runs-browser__table--compact td{padding:4px 5px}.runs-browser__model{max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.runs-row-active{background:#7f77dd1a}.runs-active-jobs{margin:0 0 8px;padding:8px 10px;border:1px solid var(--border);border-radius:11px;background:#7f77dd0a;max-height:110px;overflow:auto}.runs-active-jobs__header{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}.runs-active-jobs__warn,.runs-active-jobs__status{font-size:10px;color:var(--text-dim)}.runs-active-jobs__warn{color:var(--warn)}.runs-active-jobs__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.runs-active-jobs__node{border:1px solid var(--border);border-radius:9px;background:var(--bg-1);padding:10px;display:grid;gap:8px}.runs-active-jobs__node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.runs-active-jobs__node-name{font-size:11px;font-weight:700;color:var(--text)}.runs-active-jobs__meta{font-size:10px;color:var(--text-dim);margin-left:auto}.runs-active-jobs__list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.runs-active-jobs__item{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:10px}.runs-active-jobs__detail{color:var(--text-dim);margin-left:auto}.runs-active-jobs__empty{font-size:10px;color:var(--text-dim)}.runs-detail-card__header-actions{display:flex;align-items:center;gap:8px}.runs-browser__meta{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.runs-browser__count{font-size:11px;color:var(--text-dim)}.runs-monitor__refreshed{font-size:10px;color:var(--text-dim)}.runs-monitor-bar{margin-top:6px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}.runs-monitor__auto{font-size:11px;color:var(--text-dim)}.runs-job-log{margin-top:6px;max-height:72px;overflow:auto;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#00000040;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px}.runs-job-log__line{display:flex;gap:8px;padding:2px 0;color:var(--text-dim)}.runs-job-log__line--success{color:var(--live-text)}.runs-job-log__line--error{color:var(--error)}.runs-job-log__line--info{color:var(--text-dim)}.runs-job-log__time{flex:0 0 auto;opacity:.7}.runs-job-log__msg{flex:1;word-break:break-word}.runs-job-log__json{margin:4px 0 0;max-height:120px;overflow:auto;white-space:pre-wrap;word-break:break-word;color:var(--text-dim);font-size:9px}.generate-story__llm-log{margin-top:10px}.generate-story__llm-json{margin:6px 0 0;max-height:160px;overflow:auto;padding:8px;border-radius:8px;border:1px solid rgba(255,255,255,.08);background:#00000040;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;white-space:pre-wrap;word-break:break-word;color:var(--text-dim)}.runs-browser__filters{margin-top:12px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:8px}.runs-browser__sortbar{margin-top:8px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}.runs-browser__sort-label{font-size:11px;color:var(--text-dim)}.runs-browser__sort-select{max-width:140px}.runs-browser__sort-order,.runs-browser__export{padding:4px 10px}.runs-browser__spacer{flex:1}.runs-browser__table-wrap{margin-top:8px;max-height:280px;overflow-y:auto;border:1px solid var(--border);border-radius:11px;background:var(--bg-1)}.runs-browser__table{width:100%;border-collapse:collapse;font-size:11px}.runs-browser__table thead{position:sticky;top:0;background:var(--bg-1);z-index:1}.runs-browser__table th{padding:8px;text-align:left;color:var(--text-dim);font-weight:600;border-bottom:1px solid var(--border)}.runs-browser__table td{padding:6px;border-bottom:1px solid var(--border);vertical-align:middle;color:var(--text-primary)}.runs-browser__thumb{width:32px;height:32px;object-fit:cover;border-radius:6px;border:1px solid var(--border);background:var(--bg-2)}.runs-browser__preview{width:40px}.runs-browser__progress{min-width:92px}.runs-browser__progress-label{font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-primary);white-space:nowrap}.runs-browser__progress-bar{margin-top:4px;height:4px;border-radius:999px;background:#ffffff14;overflow:hidden}.runs-browser__progress-fill{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#7f77ddd9,#1d9e75e6)}.runs-browser__thumb--empty{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text-dim)}.runs-browser__run-id,.runs-browser__seed{font-family:ui-monospace,Cascadia Code,monospace;font-size:10px}.runs-browser__date{font-size:10px;color:var(--text-dim)}.runs-browser__actions{display:flex;gap:4px;flex-wrap:wrap}.runs-browser__action{padding:2px 6px;font-size:9px;min-width:auto}.runs-browser__action--danger{border-color:var(--error);color:var(--error)}.runs-browser__empty{padding:20px;text-align:center;color:var(--text-dim);font-size:12px}.runs-status-pill{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;border:1px solid var(--border);font-size:9px;font-weight:700;text-transform:uppercase}.runs-status-pill--completed{border-color:var(--live);color:var(--live-text);background:#1d9e751f}.runs-status-pill--running{border-color:var(--accent);color:var(--accent-text);background:#7f77dd1f}.runs-status-pill--queued{border-color:var(--warn);color:var(--warn);background:#ef9f271f}.runs-status-pill--failed{border-color:var(--error);color:var(--error);background:#e24b4a1f}.runs-detail-card,.runs-compare-card{margin-top:8px;border:1px solid var(--border);border-radius:11px;background:var(--bg-1);padding:10px 12px}.runs-detail-card__header,.runs-compare-card__header{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}.runs-detail-card__id{font-family:ui-monospace,Cascadia Code,monospace;font-size:12px}.runs-detail-card__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;font-size:10px}.runs-detail-card__grid--compact{margin-top:8px}.runs-detail-card__outputs{margin-top:8px;display:grid;gap:8px}.runs-detail-card__outputs--empty{display:flex;align-items:center;gap:8px}.runs-detail-card__no-output{font-size:10px;color:var(--text-dim)}.runs-detail-card__video-wrap{max-width:360px}.runs-detail-card__video{width:100%;max-height:160px;border-radius:8px;border:1px solid var(--border);background:#000}.runs-detail-card__output-links{display:flex;flex-wrap:wrap;gap:6px}.runs-detail-card__full{grid-column:1 / -1}.runs-detail-card__prompt{max-height:48px;overflow-y:auto;font-size:10px;color:var(--text-primary)}.runs-detail-card__notes{min-height:60px;font-size:10px}.runs-detail-card__save{margin-top:6px;padding:4px 12px}.runs-detail-card__frames{margin-top:12px}.runs-detail-card__frames-list{display:flex;flex-wrap:wrap;gap:4px;max-height:88px;overflow-y:auto}.runs-detail-card__frame-link{display:block;line-height:0}.runs-detail-card__frame{width:48px;height:48px;object-fit:cover;border-radius:4px;border:1px solid var(--border)}.runs-detail-card__tabs{margin-top:8px}.runs-detail-json{margin-top:8px;display:grid;gap:8px;min-height:0}.runs-detail-json__toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.runs-detail-json__filter{font-size:10px;color:var(--text-dim)}.runs-detail-json__diff-hint{font-size:10px;color:var(--warn)}.runs-detail-json__diff-badge{margin-left:4px;padding:0 5px;border-radius:999px;background:#ef9f272e;color:var(--warn);font-size:9px;font-weight:700}.runs-detail-json__table-wrap{max-height:220px;overflow:auto;border:1px solid var(--border);border-radius:8px;background:#0003}.runs-detail-json__table{width:100%;border-collapse:collapse;font-size:10px;font-family:ui-monospace,Cascadia Code,monospace}.runs-detail-json__table th,.runs-detail-json__table td{padding:4px 6px;border-bottom:1px solid var(--border);vertical-align:top;text-align:left}.runs-detail-json__table th{position:sticky;top:0;background:var(--bg-1);color:var(--text-dim);z-index:1}.runs-detail-json__key{color:var(--accent-text);white-space:nowrap}.runs-detail-json__value,.runs-detail-json__current{word-break:break-word;color:var(--text-primary)}.runs-detail-json__na{color:var(--text-dim)}.runs-detail-json__row--diff{background:#ef9f2714}.runs-detail-json__row--diff .runs-detail-json__value{color:var(--warn)}.runs-detail-json__changed{margin-left:4px;color:var(--warn);font-weight:700}.runs-detail-json__empty{padding:12px;text-align:center;color:var(--text-dim)}.runs-detail-json__raw{font-size:10px;color:var(--text-dim)}.runs-detail-json__raw summary{cursor:pointer;-webkit-user-select:none;user-select:none;margin-bottom:4px}.runs-detail-json__pre{margin:0;max-height:180px;overflow:auto;padding:8px;border:1px solid var(--border);border-radius:8px;background:#00000040;font-size:10px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.runs-compare-card__actions{display:flex;gap:6px;flex-wrap:wrap}.runs-compare-card__table-wrap{overflow-x:auto}.runs-compare-card__table{width:100%;border-collapse:collapse;font-size:10px}.runs-compare-card__table th,.runs-compare-card__table td{padding:6px;text-align:left;border-bottom:1px solid var(--border)}.runs-compare-card__table th{color:var(--text-dim)}.gpu-node-card{border:1px solid var(--border);border-radius:10px;background:var(--bg-1);overflow:hidden}.gpu-node-card__header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px}.gpu-node-card__identity{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-width:0}.gpu-node-card__stats{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.gpu-node-log{border-top:1px solid var(--border);background:var(--bg-0);max-height:200px;overflow-y:auto;font-size:10px;font-family:ui-monospace,Cascadia Code,monospace}.gpu-node-log__empty{padding:8px 10px;color:var(--text-dim)}.gpu-node-log__entry{display:flex;align-items:center;gap:6px;padding:3px 10px;border-bottom:1px solid rgba(42,45,58,.5)}.gpu-node-log__entry--error{background:#e24b4a0f}.gpu-node-log__badge{padding:1px 5px;border-radius:3px;font-size:9px;font-weight:700;text-transform:uppercase;flex-shrink:0}.gpu-node-log__badge--health{background:#1d9e7526;color:var(--live-text)}.gpu-node-log__badge--stats{background:#7f77dd26;color:var(--accent-text)}.gpu-node-log__badge--generate{background:#ef9f2726;color:var(--warn)}.gpu-node-log__badge--options{background:#378add26;color:var(--a-group)}.gpu-node-log__path{flex:1;min-width:0;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gpu-node-log__status{flex-shrink:0}.gpu-node-log__duration{color:var(--text-dim);flex-shrink:0}.gpu-node-log__error{color:var(--error);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gpu-node-log__time{color:var(--text-dim);flex-shrink:0}.settings-tab-shell .framesync-panel,.infra-panel{margin-bottom:12px}.settings-plugins-tab__intro{margin-top:8px}.settings-plugins-tab__list{margin-top:8px;font-size:11px;padding-left:16px}.settings-plugins-tab__empty{margin-top:8px;color:var(--text-dim)}.infra-section{margin-top:14px}.infra-section .framesync-subtitle{margin-bottom:8px}.infra-panel__empty,.infra-panel__hint{font-size:11px;color:var(--text-dim);margin:8px 0 0}.infra-panel__hint code{font-size:10px}.service-health-grid{margin-top:12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 900px){.service-health-grid{grid-template-columns:1fr}}.service-health-card{border:1px solid var(--border);border-radius:12px;background:#031b2d59;padding:10px;min-width:0}.service-health-card__head{display:flex;justify-content:space-between;align-items:center;gap:10px}.service-health-card__meta{margin-top:6px;font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.infra-mediator-list{display:grid;gap:10px;margin-top:8px}.infra-mediator-card{padding:12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);display:grid;gap:8px}.gpu-forge-modal__mediator{margin-top:4px;padding-top:4px;border-top:1px solid var(--border)}.infra-mediator-card__head{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.infra-mediator-card__head strong{font-size:13px}.infra-mediator-card__source{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.infra-mediator-card__meta{display:grid;gap:4px;font-size:11px;color:var(--text-secondary)}.infra-mediator-card__meta code{font-size:10px;color:var(--live-text)}.infra-address{display:block;font-size:10px;word-break:break-all}.infra-address-sub{display:block;font-size:10px;color:var(--text-dim);margin-top:2px}.infra-transcoder-table td{vertical-align:middle}[data-testid=gpu-pool-panel]{border-radius:11px}.settings-tab-shell .table,.settings-tab-shell table{font-size:11px}.settings-tab-shell kbd{background:var(--bg-2);border:1px solid var(--border-strong);border-radius:4px;padding:2px 6px;color:var(--text-primary)}.modulation-lfo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.modulation-lfo-card{border:.5px solid var(--border);border-radius:var(--radius);padding:10px;background:var(--bg-2);box-shadow:0 8px 18px #00000047;cursor:pointer;display:grid;gap:8px}.modulation-lfo-card--active{border-color:var(--live);background:color-mix(in srgb,var(--live) 8%,var(--bg-2))}.modulation-lfo-card--selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg-2))}.compositor-lfo-chip.active{border-color:var(--live);color:var(--live-text);background:color-mix(in srgb,var(--live) 16%,transparent)}.modulation-lfo-card--static{cursor:default}.modulation-lfo-card__control--wide{grid-column:1 / -1}.modulation-lfo-card__control--switch{display:inline-flex;align-items:center;gap:8px}.generate-sequencer__control-grid .modulation-lfo-card--static{opacity:1}.generate-sequencer__control-grid--edit{margin-top:12px}.generate-sequencer__control-span{grid-column:span 2}.generate-sequencer__marker-input{flex:1;min-width:120px}.generate-sequencer__load-select{min-width:140px;flex:1}.generate-sequencer__keyframe-list{display:grid;gap:6px}.generate-sequencer__keyframe-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:6px;align-items:center}.generate-sequencer__keyframe-easing{min-width:96px}.generate-sequencer__clip-hint{margin-top:4px;font-size:10px;color:var(--text-dim);line-height:1.4}.generate-sequencer__control-grid--edit .generate-sequencer__control-span{grid-column:1 / -1}.generate-story__status-line{margin-top:8px;font-size:11px;color:var(--text-secondary)}.modulation-lfo-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.modulation-lfo-card__switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--text-secondary)}.modulation-lfo-card__title{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary)}.modulation-lfo-card__dot{width:8px;height:8px;border-radius:50%;background:var(--border);flex-shrink:0}.modulation-lfo-card--active .modulation-lfo-card__dot{background:var(--live);box-shadow:0 0 6px var(--live)}.modulation-lfo-card__meta{font-size:11px;color:var(--text-dim)}.modulation-lfo-card__waveform{border-radius:4px;background:var(--bg-1)}.modulation-lfo-card__controls{display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-top:2px}.modulation-lfo-card__control{display:grid;gap:2px}.modulation-lfo-card__control .framesync-subtitle{font-size:9px}.modulation-lfo-card__control .framesync-select,.modulation-lfo-card__control .framesync-input{font-size:11px;padding:3px 5px;height:auto}.modulation-lfo-card__footer{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.modulation-route-pill{display:inline-flex;align-items:center;font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--live);color:var(--live-text);background:#1d9e7514}.modulation-route-pill--idle{border-color:var(--border);color:var(--text-dim);background:transparent}.modulation-lfo-card__route-button{margin-left:auto;font-size:10px}.modulation-target-board{margin-top:12px}.modulation-target-board__header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:8px}.modulation-target-board__hint{font-size:10px;color:var(--text-dim);margin-top:4px}.modulation-target-board__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:4px}.generate-sequencer__status{font-size:10px;padding:3px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim)}.generate-sequencer__status--live{border-color:var(--live);color:var(--live-text)}.generate-sequencer__hero-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:12px}.generate-sequencer__hero-card{display:grid;gap:6px;min-width:0;padding:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1);box-shadow:0 10px 22px #0000002e}.generate-sequencer__hero-value{font-size:22px;line-height:1;font-weight:800;color:var(--text-primary)}.generate-sequencer__hero-value--status{color:var(--live-text)}.generate-sequencer__hero-meta{font-size:11px;color:var(--text-secondary);line-height:1.35}.generate-sequencer__transport{display:flex;flex-wrap:wrap;gap:16px;align-items:flex-end;margin-top:12px}.generate-sequencer__transport--secondary{background:var(--bg-1);border:1px solid var(--border);border-radius:8px;padding:8px;margin-top:8px}.generate-sequencer__field{display:grid;gap:4px;min-width:80px;flex:1}.generate-sequencer__field--calc{align-content:end}.generate-sequencer__toggle{display:grid;gap:4px;min-width:130px}.generate-sequencer__timeline-tools{display:flex;gap:8px;align-items:flex-end;margin-top:12px}.generate-sequencer__playhead{flex:1;display:grid;gap:4px}.generate-sequencer__marker-tools{display:flex;gap:6px;align-items:flex-end}.generate-sequencer__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;align-items:flex-start}.generate-sequencer__track-builder{display:flex;flex-wrap:wrap;gap:6px;align-items:center;flex:1}.generate-sequencer__transport-actions{display:flex;gap:6px;flex-wrap:wrap}.generate-sequencer__track-list,.generate-sequencer__markers{margin-top:12px}.generate-sequencer__empty-markers{font-size:11px;color:var(--text-dim);padding:8px 0}.generate-sequencer__status-text{margin-top:8px;font-size:11px;color:var(--live-text)}.generate-dock-shell{margin-top:8px}.stage-sequencer-shell{margin-top:8px;position:relative;display:flex;align-items:stretch;gap:0;min-height:0;border:1px solid var(--border);border-radius:14px;padding:10px 10px 12px;background:linear-gradient(180deg,#ffffff0a,#ffffff03),var(--bg-1);box-shadow:0 10px 28px #00000047}.stage-sequencer-shell--side-open{padding-left:0}.stage-sequencer-main{flex:1 1 auto;min-width:0;display:grid;gap:8px;padding-left:2px}.stage-sequencer-side{flex:0 0 min(380px,42vw);width:min(380px,42vw);max-width:100%;display:grid;grid-template-rows:auto 1fr;gap:0;border-right:1px solid var(--border);background:#08090db8;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-radius:14px 0 0 14px;overflow:hidden;animation:stage-sequencer-side-in .22s ease}@keyframes stage-sequencer-side-in{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}.stage-sequencer-side__head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--border);background:#0c0e16e0}.stage-sequencer-side__title{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-primary)}.stage-sequencer-side__body{min-height:0;overflow:auto;padding:8px 10px 10px}.stage-sequencer-side-toggle{position:absolute;left:0;top:50%;z-index:3;transform:translate(-50%,-50%);display:inline-flex;align-items:center;justify-content:center;width:28px;height:52px;padding:0;border:1px solid var(--border);border-radius:0 10px 10px 0;background:#0c0e16f0;color:var(--text-secondary);cursor:pointer;box-shadow:4px 0 14px #00000047;transition:color .18s ease,border-color .18s ease,background .18s ease}.stage-sequencer-side-toggle:hover{color:var(--accent-text);border-color:#7f77dd8c}.stage-sequencer-side-toggle--open{left:min(380px,42vw);color:var(--accent-text);border-color:#7f77dd73;background:#7f77dd29}.sequencer-controls-panel--side-drawer{display:grid;gap:10px}.sequencer-controls-panel--side-drawer .generate-sequencer__control-grid--edit{margin-top:0}.sequencer-controls-panel--stage{display:grid;gap:10px}.stage-sequencer-bar{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:10px}.stage-sequencer-bar__left,.stage-sequencer-bar__right{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.stage-sequencer-bar__btn{width:34px;height:34px;border-radius:10px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.stage-sequencer-bar__btn--live{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 22%,transparent)}.stage-sequencer-bar__frame{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--text-primary);min-width:4.5em}.stage-sequencer-bar__frame--live{color:var(--live-text)}.stage-sequencer-bar__frame-total{font-weight:600;color:var(--text-dim)}.stage-sequencer-bar__scrub{min-width:0}.stage-sequencer-bar__scrub-input{width:100%;accent-color:var(--live)}.stage-sequencer-bar__meta{font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums}.stage-sequencer-bar__status{font-size:11px;color:var(--text-dim);max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stage-sequencer-bar__status--clip{color:var(--live-text)}.stage-sequencer-bar__loop{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-secondary);cursor:pointer}.stage-sequencer-bar__text-btn{border:1px solid var(--border);background:transparent;color:var(--text-secondary);border-radius:8px;padding:5px 10px;font-size:11px;font-weight:600;cursor:pointer}.stage-sequencer-bar__text-btn--active{border-color:color-mix(in srgb,var(--accent) 50%,var(--border));color:var(--text-primary)}.stage-sequencer-bar__text-btn--accent{border-color:color-mix(in srgb,var(--live) 45%,var(--border));color:var(--live-text)}.generate-story-strip{border-top:1px solid var(--border);padding-top:8px}.generate-story-strip__toggle{width:100%;display:flex;align-items:center;gap:8px;border:none;background:transparent;color:var(--text-secondary);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;padding:4px 0}.generate-story-strip__pill{font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-primary);text-transform:none;letter-spacing:0}.generate-story-strip__pill--dim{color:var(--text-dim)}.generate-story-strip__chevron{width:14px;height:14px;margin-left:auto}.generate-story-strip__body{margin-top:8px;display:grid;gap:6px}.generate-story-strip__line{font-size:11px;color:var(--text-secondary)}.generate-story-strip__text{margin:0;max-height:120px;overflow:auto;font-size:11px;line-height:1.45;color:var(--text-secondary);white-space:pre-wrap}.generate-dock{border-radius:14px}.generate-dock__header{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.generate-sequencer__transport--dock{margin-top:0}.generate-sequencer__details{margin-top:12px;display:grid;gap:12px}.generate-sequencer__dock-note{margin-top:8px;font-size:11px;color:var(--text-dim)}.generate-sequencer__frame-counter{font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-1)}.generate-sequencer__frame-counter--live{border-color:var(--live);color:var(--live-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 24%,transparent)}.generate-sequencer__frame-hero{display:grid;gap:6px;margin-bottom:12px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1)}.generate-sequencer__frame-hero--live{border-color:var(--live);box-shadow:0 0 0 1px color-mix(in srgb,var(--live) 20%,transparent)}.generate-sequencer__frame-hero-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.generate-sequencer__frame-hero-value{display:flex;align-items:baseline;gap:6px;font-variant-numeric:tabular-nums}.generate-sequencer__frame-hero-current{font-size:28px;line-height:1;font-weight:800;color:var(--text-primary)}.generate-sequencer__frame-hero--live .generate-sequencer__frame-hero-current{color:var(--live-text)}.generate-sequencer__frame-hero-sep,.generate-sequencer__frame-hero-total{font-size:16px;color:var(--text-secondary);font-weight:600}.generate-sequencer__frame-hero-meta{font-size:11px;color:var(--text-dim)}.generate-sequencer__frame-hero-bar{height:4px;border-radius:999px;background:#ffffff0f;overflow:hidden}.generate-sequencer__frame-hero-bar-fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--live),color-mix(in srgb,var(--accent) 70%,var(--live)));transition:width 80ms linear}.generate-sequencer__frame-hero--compact{margin-top:12px;margin-bottom:0}.generate-track-card{border:1px solid var(--border);border-radius:12px;padding:12px;background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1);box-shadow:0 8px 18px #0003}.generate-track-card--selected{border-color:#7f77dd85;box-shadow:0 10px 22px #0000003d,inset 0 0 0 1px #7f77dd24}.generate-track-card__header{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px}.generate-track-card__title.framesync-button{text-align:left;justify-content:flex-start;flex:1;min-width:0}.generate-track-card__title{border:0;background:transparent;padding:0;color:var(--text-primary);font-size:13px;font-weight:700;cursor:pointer;text-align:left}.generate-track-card__remove{flex-shrink:0}.generate-track-card__keyframes{display:grid;gap:8px}.generate-track-card__keyframe-row{display:grid;grid-template-columns:auto auto minmax(120px,1fr) auto;gap:8px;align-items:center;padding:8px 10px;border-radius:10px;background:#0000002e;border:1px solid rgba(255,255,255,.04)}.generate-track-card__keyframe-time,.generate-track-card__keyframe-value{font-size:11px;color:var(--text-secondary);white-space:nowrap}.generate-track-card__easing{min-width:0}.generate-track-card__delete{min-width:auto}.generate-track-card__empty{font-size:11px;color:var(--text-dim);padding:8px 0 2px}.generate-marker-row{display:grid;grid-template-columns:auto minmax(120px,160px) minmax(0,1fr) auto;gap:8px;align-items:center;padding:10px;border-radius:12px;border:1px solid var(--border);background:linear-gradient(180deg,#ffffff08,#ffffff03),var(--bg-1)}.generate-marker-row__jump{justify-self:start}.generate-marker-row__hint{font-size:11px;color:var(--text-dim);min-width:0}.generate-marker-row__delete{justify-self:end;min-width:auto}.layout--live,.layout--stage,.layout--studio{grid-template-columns:1fr}.layout--sidebar .video-wrap--anchored{width:100%;max-width:none;margin:0;border-radius:10px;overflow:hidden;display:flex;flex-direction:column;flex:0 0 auto;min-height:0;background:var(--media-bg);border:1px solid var(--border);box-shadow:inset 0 0 0 1px #2a2d3a59}.video-wrap--anchored .video-wrap__stage{position:relative;width:100%;max-width:100%;margin:0;aspect-ratio:16 / 9;height:auto;min-height:0;flex:0 0 auto;overflow:hidden;border-radius:10px 10px 0 0;border:1px solid rgba(255,255,255,.08);border-bottom:none;background:var(--media-bg)}.preview--top-dock .video-wrap--anchored .video-wrap__stage{max-height:min(34vh,56.25vw)}.preview--top-dock.preview--stage-full .video-wrap--anchored .video-wrap__stage{max-height:min(38vh,56.25vw)}.preview--top-dock.preview--stage-full .video-wrap--anchored .video-wrap__stage--full{max-height:min(40vh,56.25vw)}.video-wrap--anchored .video-wrap__stage--preview{max-width:100%}.video-wrap--anchored .video-wrap__stage--full{max-width:100%;border-radius:0;border-left:none;border-right:none}.layout--stage-full{padding:0;gap:0;min-height:calc(100vh - var(--app-chrome-top))}.layout--sidebar .preview.preview--stage-full{max-width:none;margin:0;width:100%;flex:1;min-height:0;display:grid;grid-template-columns:1fr;grid-template-rows:1fr}.layout--sidebar .preview.preview--stage-full.preview--motion-dock{grid-template-rows:minmax(0,1fr) minmax(0,28vh)}.layout--sidebar .preview.preview--stage-full .preview-stage-row{grid-row:1;grid-column:1;min-height:0;height:100%}.layout--sidebar .preview.preview--stage-full .preview-bottom-dock{grid-row:2;grid-column:1;min-height:0}.layout--sidebar .preview.preview--stage-full .video-layer-tabs--preview{grid-row:1;grid-column:1;align-self:end;z-index:12;border-radius:0;border:none;border-top:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,transparent 0%,rgba(8,9,13,.72) 35%,rgba(8,9,13,.94) 100%);padding-top:24px}.layout--sidebar .preview.preview--stage-full .recent-runs-rail{display:none}.layout--sidebar .preview.preview--stage-full .video-layer-add{grid-row:1;grid-column:1;align-self:end;z-index:14;max-height:min(50vh,420px);overflow-y:auto;margin:0 12px 52px}.layout--sidebar .preview.preview--stage-full .preview-stage-video-stack{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;justify-content:center}.layout--sidebar .preview.preview--stage-full .video-wrap--anchored{border-radius:0;border-left:none;border-right:none;border-top:none;box-shadow:none;width:100%;flex:0 0 auto}.layout--sidebar .preview.preview--stage-full .video-wrap--anchored .video-wrap__stage,.layout--sidebar .preview.preview--stage-full .video-wrap--anchored .video-wrap__stage--full{width:100%;max-width:100%;aspect-ratio:16 / 9;height:auto;min-height:0;max-height:calc(100vh - var(--app-chrome-top) - 72px);border-radius:0;border:none}.video-wrap--anchored .video-wrap__stage video,.video-wrap--anchored .video-wrap__stage .video-still-preview,.video-wrap--anchored .video-wrap__stage .video-feed{object-fit:cover}.video-wrap--anchored .video-wrap__stage>.overlay{pointer-events:none}.video-wrap--anchored .video-wrap__stage>.live-hud-strip--pinned{position:absolute;top:8px;left:8px;right:auto;bottom:auto;max-width:min(360px,calc(100% - 16px));z-index:5;margin-top:0;grid-template-columns:minmax(0,320px)}.video-wrap--anchored .video-wrap__stage>.live-hud-dock{position:absolute;left:14px;right:14px;bottom:14px;z-index:10;display:flex;align-items:flex-end;justify-content:flex-end;gap:12px;pointer-events:none}.live-hud-dock__cell{pointer-events:auto;flex:0 1 auto;min-width:0}.live-hud-dock__cell--modulating{margin-right:auto;width:min(240px,calc(50% - 8px))}.live-hud-dock__cell--morph{width:min(280px,calc(50% - 8px))}.live-sequencer-dock{position:absolute;left:0;right:0;bottom:0;z-index:6;display:grid;gap:10px;padding:28px 12px 12px;background:linear-gradient(180deg,transparent 0%,rgba(8,10,16,.72) 28%,rgba(8,10,16,.94) 100%);border-top:1px solid rgba(255,255,255,.08);pointer-events:auto}.live-sequencer-dock__head{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px}.live-seq-time{font-variant-numeric:tabular-nums;font-size:18px;font-weight:600;letter-spacing:.02em}.live-seq-time__sep{color:var(--text-dim);margin:0 4px;font-weight:400}.live-seq-time__total{color:var(--text-secondary);font-weight:500}.live-seq-status{font-size:13px;font-weight:600;padding:6px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em}.live-seq-status--playing{border-color:var(--live);color:var(--live-text);background:#5af2a91f}.live-sequencer-dock__timeline{width:100%}.live-seq-scrub{display:grid;gap:6px}.live-seq-scrub__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}.live-seq-range{width:100%;min-height:44px;accent-color:var(--live);cursor:pointer}.live-seq-transport{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.live-seq-transport .framesync-button{flex:0 1 auto}.live-seq-load-select{width:auto;min-width:9rem;flex:1 1 8rem;max-width:14rem}.live-seq-builder{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.live-seq-builder .framesync-select{flex:1 1 10rem;min-width:8rem;width:auto}.live-seq-input--value{width:5.5rem;flex:0 0 auto}.live-seq-input--label{flex:1 1 10rem;min-width:8rem;width:auto}.live-seq-btn{min-height:44px;min-width:44px;padding:10px 16px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#ffffff14;color:var(--text);font-size:14px;font-weight:600;cursor:pointer;transition:background .15s ease,border-color .15s ease,transform .1s ease}.live-seq-btn:hover,.live-seq-btn:focus-visible{background:#ffffff24;border-color:#ffffff38;outline:none}.live-seq-btn:active{transform:scale(.98)}.live-seq-btn--primary{background:#5af2a938;border-color:var(--live);color:var(--live-text);padding-inline:22px}.live-seq-btn--ghost{margin-left:auto;background:transparent}.live-seq-btn--danger{border-color:color-mix(in srgb,var(--error) 45%,var(--border));color:var(--error-text)}.live-seq-select,.live-seq-input{min-height:44px;padding:8px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#00000059;color:var(--text);font-size:14px}.live-seq-select{min-width:140px;cursor:pointer}.live-seq-input--value{width:100px}.live-seq-input--label{flex:1;min-width:120px}.live-seq-details{display:grid;gap:12px;max-height:min(42vh,360px);overflow-y:auto;padding-top:4px}.live-seq-settings{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.live-seq-settings--bpm{padding:10px;border-radius:10px;background:#00000040;border:1px solid rgba(255,255,255,.08)}.live-seq-field{display:grid;gap:6px;min-width:100px;flex:1}.live-seq-field__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary)}.live-seq-check{display:flex;align-items:center;gap:10px;min-height:44px;padding:0 8px;font-size:14px;cursor:pointer}.live-seq-check input{width:20px;height:20px;accent-color:var(--live)}.live-seq-builder{display:flex;flex-wrap:wrap;gap:8px;align-items:stretch}.live-seq-calc{display:block;padding:10px 0;font-size:15px;color:var(--live-text)}.generate-sequencer__live-hint{margin:0 0 12px;font-size:13px;line-height:1.5;color:var(--text-secondary)}.generate-sequencer__live-link{border:none;background:none;padding:0;color:var(--live-text);font:inherit;font-weight:600;text-decoration:underline;cursor:pointer}.live-drawer-shell{--live-drawer-width: min(1200px, calc(100vw - 16px) );--live-drawer-handle-width: 44px;position:sticky;top:var(--app-chrome-top);z-index:190;display:flex;flex-direction:column;align-items:stretch;width:100%;max-width:var(--live-drawer-width);margin:0 auto;transition:max-height .28s ease;pointer-events:none}.live-drawer-shell--dock-top{transform:none;left:auto;right:auto;bottom:auto}.live-drawer-shell--dock-top:not(.live-drawer-shell--open) .live-right-column{max-height:0;opacity:0;visibility:hidden;overflow:hidden;padding-top:0;padding-bottom:0;border:none;box-shadow:none}.live-drawer-shell--dock-top.live-drawer-shell--open .live-right-column{max-height:min(52vh,calc(100vh - var(--app-chrome-top) - 96px));opacity:1;visibility:visible;overflow-y:auto}.live-drawer-shell>*{pointer-events:auto}.live-right-column{position:relative;width:100%;z-index:1;background:#11131ceb;backdrop-filter:blur(12px) saturate(1.08);-webkit-backdrop-filter:blur(12px) saturate(1.08);border:.5px solid rgba(255,255,255,.08);border-top:none;border-radius:0 0 14px 14px;padding:8px 10px 12px;box-shadow:0 14px 36px #00000061;transition:max-height .28s ease,opacity .22s ease,visibility .22s ease}.live-drawer-shell--dock-top .live-right-column .rack{background:#0c0e168c}.live-drawer-shell--dock-top .live-right-column .framesync-panel{background:#08090d80}.live-right-column .rack{background:#0c0e168c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-color:#ffffff14;box-shadow:0 8px 24px #00000047}.live-right-column .framesync-panel{background:#08090d80;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-color:#ffffff14;box-shadow:inset 0 0 0 1px #2a2d3a38}.live-right-column .sub-pills,.live-right-column .lfo-card{background:#14161f85;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.right-panel-slide-enter-active,.right-panel-slide-leave-active{transition:opacity .18s ease,transform .28s ease;will-change:opacity,transform}.right-panel-slide-enter-from,.right-panel-slide-leave-to{opacity:0;transform:translate(26px)}.live-overlay-btn{position:relative;z-index:220;background:linear-gradient(135deg,#08090df0,#171a27eb);border:1px solid rgba(127,119,221,.42);color:var(--text-primary);border-radius:12px;padding:4px 8px;min-height:30px;font-size:10px;cursor:pointer;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(6px);white-space:nowrap;display:inline-flex;align-items:center;gap:6px;box-shadow:0 8px 20px #00000052,0 0 0 1px #7f77dd14;transition:border-color .18s ease,color .18s ease,background .18s ease,transform .18s ease,box-shadow .18s ease}.live-overlay-btn:hover{border-color:var(--accent);color:var(--accent-text);transform:translateY(-1px);box-shadow:0 14px 32px #0000006b,0 0 0 1px #7f77dd2e}.live-overlay-btn--open{background:linear-gradient(135deg,#7f77dd47,#1e2233f5);border-color:#7f77dda8;box-shadow:0 14px 32px #00000070,0 0 0 1px #7f77dd3d}.live-overlay-btn--top{width:100%;min-height:40px;margin:0;padding:6px 12px;border-radius:0;border-bottom:none;display:inline-flex;align-items:center;justify-content:center;gap:8px;flex-shrink:0;box-shadow:0 6px 18px #00000047,0 0 0 1px #7f77dd14}.live-overlay-btn--top:hover{transform:none}.live-overlay-btn__top-label{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary)}.live-overlay-btn--open .live-overlay-btn__top-label{color:var(--accent-text)}.live-overlay-btn__arrow-wrap{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:999px;background:#ffffff1a;color:var(--accent-text);box-shadow:inset 0 0 0 1px #ffffff1f;flex-shrink:0}.live-overlay-btn__state{width:22px;height:22px;color:currentColor;transition:transform .18s ease}.live-overlay-btn__state path{stroke-width:2.4}.live-overlay-btn--open .live-overlay-btn__state{transform:translate(1px)}.live-drawer-shell--side{--live-drawer-panel-width: min(420px, 36vw);position:fixed;top:var(--app-chrome-top);right:0;bottom:0;left:auto;flex:none;width:0;min-width:0;overflow:visible;z-index:40;pointer-events:none;transition:right .32s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.layout.layout--edge-engine-open .edge-dock-host .live-drawer-shell--side:not(.live-drawer-shell--left){right:var(--engine-drawer-width, min(420px, 36vw))}.live-drawer-shell--side.live-drawer-shell--open{width:var(--live-drawer-panel-width);pointer-events:auto}.live-drawer-shell--side .live-overlay-btn--side{pointer-events:auto}.live-drawer-shell--side .live-right-column{position:relative;width:var(--live-drawer-panel-width);min-width:var(--live-drawer-panel-width);height:100%;max-height:100%;overflow-x:hidden;overflow-y:auto;border-radius:14px 0 0 14px;border:1px solid rgba(255,255,255,.08);border-right:none;background:#11131cf0;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:-12px 0 32px #00000059;padding:8px 10px 12px;transform:translate(100%);opacity:0;transition:transform .32s cubic-bezier(.4,0,.2,1),opacity .22s ease}.live-drawer-shell--side.live-drawer-shell--open .live-right-column{transform:translate(0);opacity:1}.live-overlay-btn--side.edge-dock-tab--context{position:absolute;right:0;top:54%;transform:translateY(-50%);z-index:5;width:32px;min-height:72px;height:auto;padding:8px 4px;border-radius:10px 0 0 10px;border-right:none;flex-direction:column;gap:4px}.live-drawer-shell--side.live-drawer-shell--open .live-overlay-btn--side.edge-dock-tab--context{left:0;right:auto;transform:translate(-100%,-50%);border-radius:10px 0 0 10px;border-right:none;border-left:1px solid rgba(255,255,255,.1)}.live-drawer-shell--left{right:auto!important;left:0;z-index:40;transition:left .32s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}.layout.layout--edge-engine-open .edge-dock-host .live-drawer-shell--left{left:0;right:auto!important}.live-drawer-shell--left .live-right-column{border-radius:0 14px 14px 0;border-right:1px solid rgba(255,255,255,.08);border-left:none;box-shadow:12px 0 32px #00000059;transform:translate(-100%)}.live-drawer-shell--left.live-drawer-shell--open .live-right-column{transform:translate(0)}.live-drawer-shell--left:not(.live-drawer-shell--open) .edge-dock-tab--context{position:fixed;left:0;right:auto;top:calc(var(--app-chrome-top) + 52%);transform:translateY(-50%);border-radius:0 10px 10px 0;border-left:none;border-right:1px solid rgba(255,255,255,.12);z-index:56}.live-drawer-shell--left.live-drawer-shell--open .edge-dock-tab--context{position:absolute;left:auto;right:0;top:50%;transform:translate(100%,-50%);border-radius:0 10px 10px 0;border-left:none;border-right:1px solid rgba(255,255,255,.12)}.live-drawer-shell--side:not(.live-drawer-shell--left) .live-overlay-btn--side.edge-dock-tab--context,.live-drawer-shell--side:not(.live-drawer-shell--left).live-drawer-shell--open .live-overlay-btn--side.edge-dock-tab--context{position:absolute;right:0;left:auto;top:54%;transform:translateY(-50%)}.live-drawer-shell--side:not(.live-drawer-shell--left).live-drawer-shell--open .edge-dock-tab--context{transform:translate(-100%,-50%);border-radius:10px 0 0 10px}.edge-dock-tab__label--context{writing-mode:vertical-rl;text-orientation:mixed}.live-overlay-btn--side:hover{color:var(--text);background:#1e2130f2}@media (max-width: 1100px){.layout{grid-template-columns:1fr}}@media (max-width: 768px){header.app-header{padding:6px 10px;flex-wrap:wrap;gap:8px}.app-header__left{flex-wrap:wrap;width:100%}.tabs{flex-wrap:wrap;gap:8px}.tab{min-width:132px;min-height:58px;padding:10px 12px;gap:10px;font-size:10px}.tab__icon-wrap{width:34px;height:34px}.tab__label{font-size:12px}.tab__hint{font-size:9px}.layout{padding:6px;gap:6px}.rack,.framesync-panel{padding:8px}.framesync-title{font-size:14px}.framesync-row{grid-template-columns:1fr;gap:8px}.framesync-footer{grid-template-columns:1fr;gap:6px}.framesync-button{font-size:10px;padding:8px 6px}.slider-row{grid-template-columns:1fr;gap:4px}.lfo-grid,.audio-map-grid,.compact-grid,.recent-runs-rail__list,.prompt-ab-summary,.lora-active-groups,.runs-browser__filters,.runs-detail-card__grid,.lora-picker-row,.lora-active-group__row{grid-template-columns:1fr}.gpu-forge-modal{padding:12px}.gpu-forge-modal__dialog{width:min(100vw - 24px,860px);padding:14px}.lora-picker-row__actions{justify-content:flex-start}.runs-browser__sortbar{align-items:stretch}.runs-browser__spacer{display:none}.audio-map-card__pair,.fs-grid{grid-template-columns:1fr}.video-controls{flex-wrap:wrap;gap:4px}.control-btn{min-width:70px;padding:6px 10px;font-size:11px}.thumb{width:60px;height:36px}.preview-bar{max-height:50px}.mod-row,.fs-row{grid-template-columns:1fr 1fr;gap:4px}.framesync-wave-shapes{grid-template-columns:repeat(3,1fr)}.framesync-buttons{grid-template-columns:repeat(2,1fr)}}@media (max-width: 480px){header.app-header{padding:4px 8px}.tab{min-width:calc(50% - 6px);min-height:52px;padding:9px 10px;gap:9px;border-radius:14px}.tab__icon-wrap{width:30px;height:30px;border-radius:11px}.tab__icon{font-size:16px}.tab__label{font-size:11px}.tab__hint{display:none}.layout{padding:4px;gap:4px}.rack,.framesync-panel{padding:6px;border-radius:8px}.framesync-title{font-size:13px}.framesync-subtitle{font-size:11px}.framesync-select,.framesync-input{font-size:11px;padding:5px}.gpu-forge-modal__dialog{width:calc(100vw - 16px);max-height:calc(100vh - 16px);padding:12px;border-radius:12px}.gpu-forge-modal__header{flex-direction:column}.framesync-button{font-size:9px;padding:6px 4px}.control-btn{min-width:60px;padding:5px 8px;font-size:10px}.thumb{width:50px;height:30px}.lfo-card,.audio-map-card{padding:8px}}@media (hover: none) and (pointer: coarse){.tab,.chip,.sub-pill,.framesync-button,.control-btn,.fs-button,.fs-chip,.btn{min-height:44px;padding:10px 12px}.slider-row input[type=range],.framesync-input[type=range]{height:24px}select,input[type=number],input[type=text],input[type=file],button{min-height:44px}.xy-pad{min-height:200px;min-width:200px}}@media (max-width: 896px) and (orientation: landscape){.layout{grid-template-columns:1fr}.video-wrap{max-height:40vh}.preview.preview--stage-full .video-wrap{max-height:none}.thumbs{max-height:60px}.thumb{width:70px;height:40px}}.layout--stage{align-items:start}.layout--stage .preview{min-width:0}.layout--stage .video-wrap video,.layout--stage .video-wrap .video-still-preview{object-fit:cover}.live-right-column.stage-rack-overlay{position:static;width:auto;max-height:none;display:flex;flex-direction:column;gap:10px}.stage-rack-overlay .rack{background:#11131c85;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.stage-rack-overlay .framesync-panel{background:transparent;border:none;box-shadow:none}.layout--studio{position:relative;grid-template-columns:1fr}.layout--studio .video-wrap video,.layout--studio .video-wrap .video-still-preview{object-fit:cover}.studio-right-column{position:absolute;top:10px;right:10px;width:min(520px,46%);max-height:calc(56.25vw - 30px);z-index:20;overflow-y:auto;display:flex;flex-direction:column;gap:10px;padding:8px 8px 10px;background:linear-gradient(90deg,#11131c33,#11131c75 16%,#11131c94);backdrop-filter:blur(10px) saturate(1.08);-webkit-backdrop-filter:blur(10px) saturate(1.08);border-radius:14px}.studio-right-column .rack{background:#11131c85;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.studio-right-column .framesync-panel{background:#08090d6b;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);border:none;box-shadow:none}.motion-view--hero .motion-panel{display:flex;flex-direction:column;gap:10px}.motion-preset-row--hero{flex-wrap:wrap}.motion-hero-stage{min-height:min(36vh,280px);display:flex;flex-direction:column}.motion-hero-stage .deforum-motion-pads--hero{flex:1;min-height:0}.deforum-motion-pads--compact{display:flex;flex-direction:column;gap:10px;min-height:0}.deforum-motion-pads__mode-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 2px}.deforum-motion-pads__mode-label{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.deforum-motion-pads__mode-btn{display:inline-flex;align-items:center;gap:5px}.deforum-motion-pads__mode-btn .ui-icon{width:14px;height:14px}.motion-controls-compact{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;gap:12px}.xy-controller{display:flex;flex-direction:column;gap:6px;min-width:0}.xy-controller__chrome{display:flex;align-items:center;justify-content:space-between;gap:6px}.xy-controller__axis-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:8px;border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);cursor:pointer;font-size:10px;font-weight:600;line-height:1;transition:border-color .12s ease,color .12s ease,background .12s ease}.xy-controller__axis-btn:hover{border-color:var(--border-strong);color:var(--text)}.xy-controller--move .xy-controller__axis-btn--x:hover,.xy-controller--move .xy-controller__axis-btn--x:focus-visible{border-color:color-mix(in srgb,var(--live) 55%,var(--border));color:var(--live-text)}.xy-controller--move .xy-controller__axis-btn--y:hover,.xy-controller--move .xy-controller__axis-btn--y:focus-visible{border-color:color-mix(in srgb,var(--live) 55%,var(--border));color:var(--live-text)}.xy-controller--look .xy-controller__axis-btn:hover,.xy-controller--look .xy-controller__axis-btn:focus-visible{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));color:var(--accent)}.xy-controller__axis-btn .ui-icon{width:14px;height:14px}.xy-controller__axis-tag{font-size:9px;letter-spacing:.06em;text-transform:uppercase;opacity:.85}.xy-controller__readout{flex:1;text-align:center;font-size:10px;min-width:0}.xy-controller--compact .xy-controller__pad{width:128px;height:128px;flex:none;aspect-ratio:1}.xy-controller--compact .motion-pad-hero__puck{width:14px;height:14px}.xy-controller--compact .motion-pad-hero__readout{display:none}.deforum-motion-pads--hero .motion-controls-compact{flex:1;align-content:center;justify-content:center}.motion-fine-tune-toggle.active{border-color:var(--live);color:var(--live)}.morph-live-hint,.lora-crossfader-hint{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;margin-top:12px;padding:10px 12px;border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-2)}.morph-live-hint__copy,.lora-crossfader-hint__copy{margin:0;flex:1;min-width:200px}.motion-preset-toolbar{display:flex;gap:8px;align-items:center;margin-top:10px}.motion-preset-select{flex:1;min-width:0}.motion-preset-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;flex-shrink:0}.motion-smoothness{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin:10px 0 4px;padding:8px 10px;border-radius:8px;background:#0000002e;border:1px solid rgba(255,255,255,.06)}.motion-smoothness__toggle{display:inline-flex;align-items:center;gap:8px;font-size:.85rem;cursor:pointer;-webkit-user-select:none;user-select:none}.motion-smoothness__frames{display:inline-flex;align-items:center;gap:8px;font-size:.85rem}.motion-smoothness__frames-input{width:4.5rem;min-width:4.5rem}.motion-smoothness__hint{flex:1 1 100%;font-size:.75rem;opacity:.65;line-height:1.35}.motion-preset-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.motion-panel__header-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.motion-panel__readout,.motion-path-preview__readout,.motion-pad-hero__readout,.motion-axis-slider__value,.deforum-motion-pads__readout,.generate-dock-sync__value,.morph-crossfader-hero__readout,.live-hud-mod-row__val,.motion-readout{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:10px;color:var(--text-dim);letter-spacing:.02em}.motion-panel__readout{font-size:11px;color:var(--text-secondary)}.deforum-motion-pads--hero .motion-pad-hero__readout{left:auto;right:12px;bottom:10px;color:var(--live-text);font-size:11px}.motion-path-preview{margin-top:12px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#080c14f2,#04080efa);overflow:hidden}.motion-path-preview__header{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.06)}.motion-path-preview__title{margin:0}.motion-path-preview__readout{font-size:10px}.motion-path-preview__stage{height:220px;min-height:180px;position:relative}.motion-path-preview__stage canvas{display:block;width:100%!important;height:100%!important}.motion-controls-row{display:flex;gap:12px;align-items:stretch;margin-top:12px}.motion-controls-2d{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}.motion-controls-2d__block{display:flex;flex-direction:column;gap:6px;min-width:0}.motion-controls-2d__label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.motion-pad-hero{position:relative;flex:1;min-width:0;aspect-ratio:1;background:var(--bg-1);border:.5px solid var(--border);border-radius:12px;cursor:crosshair;-webkit-user-select:none;user-select:none;touch-action:none;overflow:hidden;box-shadow:inset 0 2px 8px #00000080}.motion-pad-hero--move{border-color:color-mix(in srgb,var(--live) 42%,var(--border));background:linear-gradient(165deg,color-mix(in srgb,var(--live) 12%,var(--bg-1)),var(--bg-0));box-shadow:inset 0 2px 10px color-mix(in srgb,var(--live) 8%,transparent)}.motion-pad-hero--look{border-color:color-mix(in srgb,var(--accent) 42%,var(--border));background:linear-gradient(165deg,color-mix(in srgb,var(--accent) 14%,var(--bg-1)),var(--bg-0));box-shadow:inset 0 2px 10px color-mix(in srgb,var(--accent) 10%,transparent)}.motion-controls-2d__block .motion-controls-2d__label:first-child{color:color-mix(in srgb,var(--live) 75%,var(--text-secondary))}.motion-controls-2d__block:last-child .motion-controls-2d__label{color:color-mix(in srgb,var(--accent) 75%,var(--text-secondary))}.motion-pad-hero__readout{position:absolute;left:8px;bottom:8px;pointer-events:none}.motion-axis-sliders{display:flex;flex-direction:column;gap:10px;width:84px;flex-shrink:0}.motion-axis-sliders--2d{flex-direction:row;width:100%;margin-top:4px}.motion-axis-sliders--2d .motion-axis-slider{flex:1 1 0;min-width:0}.motion-axis-sliders--2d .motion-axis-slider__input{writing-mode:horizontal-tb;direction:ltr;width:100%;min-height:0;height:auto}.motion-axis-slider{display:flex;flex-direction:column;align-items:center;gap:6px;flex:1;min-height:0}.motion-axis-slider__label{font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em}.motion-axis-slider__input{writing-mode:vertical-lr;direction:rtl;width:28px;flex:1;min-height:120px;accent-color:var(--accent)}.motion-axis-slider__value{font-size:10px}.motion-pad-hero__axis{position:absolute;font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;pointer-events:none}.motion-pad-hero__axis--x{bottom:8px;right:8px}.motion-pad-hero__axis--y{top:8px;left:8px}.motion-pad-hero__crosshair{position:absolute;background:#ffffff12;pointer-events:none}.motion-pad-hero__crosshair--x{left:0;right:0;top:50%;height:1px;transform:translateY(-50%)}.motion-pad-hero__crosshair--y{top:0;bottom:0;left:50%;width:1px;transform:translate(-50%)}.motion-pad-hero__puck{position:absolute;width:20px;height:20px;border-radius:50%;background:var(--live);box-shadow:0 0 12px var(--live),0 0 28px color-mix(in srgb,var(--live) 45%,transparent);transform:translate(-50%,-50%);pointer-events:none}.motion-pad-hero--move .motion-pad-hero__puck{background:var(--live);box-shadow:0 0 12px var(--live),0 0 28px color-mix(in srgb,var(--live) 45%,transparent)}.motion-pad-hero__puck--look,.motion-pad-hero--look .motion-pad-hero__puck{background:var(--accent);box-shadow:0 0 12px var(--accent),0 0 28px color-mix(in srgb,var(--accent) 45%,transparent)}.xy-controller--dragging{cursor:grabbing}.xy-controller--dragging .motion-pad-hero__puck,.xy-controller--spring .motion-pad-hero__puck{transition:none}.xy-controller:not(.xy-controller--dragging):not(.xy-controller--spring) .motion-pad-hero__puck{transition:left .08s ease-out,top .08s ease-out}.modulation-subtabs{margin-top:12px;margin-bottom:8px;flex-wrap:wrap}.modulation-panel__actions--section{margin-bottom:10px;justify-content:flex-end}.modulation-lfo-grid{grid-template-columns:repeat(3,1fr)!important;margin-top:12px}.modulation-lfo-card__waveform{width:100%!important;height:72px!important}.modulation-lfo-card:not(.modulation-lfo-card--active){opacity:.55}.modulation-summary{font-size:10px;color:var(--live-text);padding:2px 8px;border:1px solid rgba(29,158,117,.35);border-radius:999px;font-weight:600}.modulation-audio-stack{display:grid;gap:12px;margin-top:12px}.modulation-audio-panel,.modulation-macros--audio{background:var(--bg-0);border:1px solid var(--border);border-radius:12px;box-shadow:inset 0 0 0 1px #2a2d3a59}.modulation-macros--audio{padding:12px}.modulation-macros--disabled{opacity:.68}.modulation-macros__hint{margin-top:10px;color:var(--text-dim)}@keyframes macro-beat-pulse{0%,to{box-shadow:0 0 0 1px var(--accent)}45%{box-shadow:0 0 10px 2px var(--accent),inset 0 0 6px #7f77dd26}}.modulation-macro-pill--active{animation:macro-beat-pulse var(--macro-beat-dur, .5s) ease-in-out infinite;border-color:var(--accent)}@media (prefers-reduced-motion: reduce){.tab,.tab:before,.tab:after,.tab__icon-wrap{transition:none}.tab.active,.modulation-macro-pill--active{animation:none}}.audio-map-card__freq-meter{position:relative;height:28px;background:#0000004d;border-radius:8px;overflow:hidden;margin:8px 0;border:.5px solid var(--border)}.audio-map-card__freq-meter--active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 18%,transparent)}.audio-map-card__freq-band{position:absolute;top:2px;bottom:2px;border-radius:999px;background:color-mix(in srgb,var(--live) 18%,transparent);border:.5px solid color-mix(in srgb,var(--live) 45%,transparent);z-index:1}.audio-map-card__freq-bar{height:100%;background:var(--live);border-radius:8px;transition:width .06s linear;box-shadow:0 0 4px var(--live);min-width:0;position:relative;z-index:2}.audio-map-card__target-name{font-size:12px;font-weight:700;color:var(--live)}.audio-map-card__meter-note{font-size:10px;color:var(--text-dim);margin-bottom:6px}.audio-reactive-panel__header--toolbar{justify-content:flex-end}.audio-reactive-panel__intro{margin-top:8px}.audio-reactive-mappings{display:grid;grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));gap:10px;margin-top:12px}.audio-reactive-mapping-card{display:flex;flex-direction:column;gap:6px;padding:10px;border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);cursor:pointer;text-align:left;font:inherit;color:inherit;transition:border-color .12s ease,box-shadow .12s ease}.audio-reactive-mapping-card:hover{border-color:var(--border-strong)}.audio-reactive-mapping-card--active{border-color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.audio-reactive-mapping-card--live.audio-reactive-mapping-card--active{border-color:var(--live);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 28%,transparent)}.audio-reactive-mapping-card--preview{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 65%,transparent),inset 0 0 10px color-mix(in srgb,var(--accent) 16%,transparent)}.audio-reactive-mapping-card__head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;flex-wrap:wrap}.audio-reactive-mapping-card__meter{height:36px;margin:0}.audio-reactive-mapping-card__level{font-size:10px;color:var(--text-dim);font-variant-numeric:tabular-nums}.audio-mini-bars{width:100%;height:36px;display:block}.audio-mini-bars__bar{fill:color-mix(in srgb,var(--live) 18%,transparent)}.audio-mini-bars__bar--on{fill:var(--live)}.audio-mini-bars--live .audio-mini-bars__bar:not(.audio-mini-bars__bar--on){fill:color-mix(in srgb,var(--live) 28%,#0f3a2a 72%)}.audio-reactive-detail{margin-top:12px}.audio-band-reactivity{margin-bottom:12px;padding:12px;border:1px solid var(--border);border-radius:12px;background:color-mix(in srgb,var(--bg-1) 88%,transparent);display:grid;gap:10px}.audio-band-reactivity--live{border-color:color-mix(in srgb,var(--live) 35%,var(--border))}.audio-band-reactivity--preview{border-color:color-mix(in srgb,var(--accent) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 14%,transparent)}.audio-band-reactivity__head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.audio-band-reactivity__hint{margin-top:4px;font-size:10px;color:var(--text-dim);line-height:1.35;max-width:36ch}.audio-band-reactivity__viz{display:grid;gap:10px}.audio-band-reactivity__spectrum{width:100%;height:36px;display:block;border-radius:8px;background:color-mix(in srgb,var(--bg-0) 70%,transparent)}.audio-band-reactivity__spectrum-bar{fill:color-mix(in srgb,var(--live) 18%,transparent)}.audio-band-reactivity__spectrum-bar--on{fill:var(--live)}.audio-band-reactivity__spectrum--live .audio-band-reactivity__spectrum-bar:not(.audio-band-reactivity__spectrum-bar--on){fill:color-mix(in srgb,var(--live) 28%,#0f3a2a 72%)}.audio-band-reactivity__meter-wrap{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:8px}.audio-band-reactivity__meter-label,.audio-band-reactivity__meter-value{font-size:10px;color:var(--text-dim);font-variant-numeric:tabular-nums}.audio-band-reactivity__meter{height:10px;border-radius:999px;background:color-mix(in srgb,var(--bg-0) 80%,transparent);overflow:hidden;border:1px solid var(--border)}.audio-band-reactivity__meter-fill{height:100%;border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--live) 55%,transparent),var(--live));transition:width .06s linear}.audio-band-reactivity__output{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11px}.audio-band-reactivity__output-label{color:var(--text-dim)}.audio-band-reactivity__output-value{font-variant-numeric:tabular-nums;color:var(--live-text);font-weight:600}.audio-band-presets{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.audio-band-presets .chip--ghost{border-style:dashed;color:var(--text-dim)}.audio-reactive-hz-pair{display:flex;align-items:center;gap:4px}.audio-reactive-hz-pair .framesync-input{width:100%;min-width:0}.audio-reactive-hz-pair__sep{color:var(--text-dim);font-size:11px;flex-shrink:0}.modulation-audio-band-card__controls--compact{grid-template-columns:1.2fr 1fr 1fr}.audio-reactive-panel__spectrum{margin-top:12px}.audio-spectrum-editor{position:relative;border:1px solid var(--border);border-radius:12px;background:var(--bg-1);overflow:hidden;box-shadow:inset 0 0 0 1px #2a2d3a59}.audio-spectrum-editor--live{border-color:color-mix(in srgb,var(--live) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--live) 18%,transparent)}.audio-spectrum-editor__canvas{display:block;width:100%;height:120px;cursor:crosshair;touch-action:none}.audio-spectrum-editor__bands{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.audio-spectrum-editor__band{position:absolute;top:8px;bottom:8px;border-radius:8px;border:1px solid color-mix(in srgb,var(--band-color, var(--live)) 55%,transparent);background:color-mix(in srgb,var(--band-color, var(--live)) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 22%,transparent);opacity:calc(.55 + (var(--band-level, 0) * .45));transition:opacity .08s linear,box-shadow .12s ease;overflow:hidden}.audio-spectrum-editor__band-meter{position:absolute;left:0;right:0;bottom:0;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--band-color, var(--live)) 42%,transparent));pointer-events:none;transition:height .06s linear}.audio-spectrum-editor__band--active,.audio-spectrum-editor__band--dragging{opacity:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 65%,transparent),inset 0 0 12px color-mix(in srgb,var(--band-color, var(--live)) 18%,transparent)}.audio-spectrum-editor__band--preview{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 70%,transparent),inset 0 0 14px color-mix(in srgb,var(--accent) 20%,transparent)}.audio-spectrum-editor__band--reactive{box-shadow:0 0 0 1px color-mix(in srgb,var(--band-color, var(--live)) 75%,transparent),inset 0 0 16px color-mix(in srgb,var(--band-color, var(--live)) calc(12% + var(--band-level, 0) * 28%),transparent)}.audio-spectrum-editor__band-label{position:absolute;top:4px;left:6px;font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--band-color, var(--live-text));text-shadow:0 1px 2px rgba(0,0,0,.65);z-index:1}.audio-spectrum-editor__band-level{position:absolute;right:6px;bottom:4px;font-size:9px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--band-color, var(--live-text));text-shadow:0 1px 2px rgba(0,0,0,.65);z-index:1}.audio-spectrum-editor__hint{padding:8px 10px 10px;font-size:10px;color:var(--text-dim);text-align:center;border-top:1px solid var(--border)}.audio-band-tabs{margin-top:12px}.audio-band-tabs__level{margin-left:6px;font-size:10px;opacity:.75;font-variant-numeric:tabular-nums}.modulation-audio-band-card{margin-top:12px}.modulation-audio-band-card__meter{margin-top:4px}.modulation-audio-band-card__controls{grid-template-columns:1.4fr repeat(2,minmax(0,1fr))}.modulation-audio-band-card__control--wide{grid-column:1 / -1}.audio-start-button.active{background:#1d9e7526;border-color:var(--live);color:var(--live-text)}.runs-browser>.sub-pills{margin-bottom:0}.forge-tab__endpoint{display:inline-flex;align-items:center;min-height:32px;padding:0 10px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis}.engine-main-summary{display:grid;grid-template-columns:1.8fr repeat(3,minmax(0,1fr));gap:10px;margin-top:12px}.engine-main-card{min-width:0;display:grid;gap:6px;padding:12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1)}.engine-main-card--wide{border-color:#7f77dd59;box-shadow:inset 0 0 0 1px #7f77dd14}.engine-main-card--picker{width:100%;text-align:left;cursor:pointer;transition:border-color .15s ease,transform .15s ease,box-shadow .15s ease}.engine-main-card--picker:hover:not(:disabled){border-color:#7f77dda6;box-shadow:inset 0 0 0 1px #7f77dd33,0 8px 24px #00000038;transform:translateY(-1px)}.engine-main-card--picker:disabled{opacity:.7;cursor:wait}.engine-main-card__hint{font-size:10px;color:var(--text-secondary);letter-spacing:.04em;text-transform:uppercase}.engine-model-picker{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:grid;place-items:center;padding:24px;background:#040810b8;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.engine-model-picker__dialog{width:min(760px,100%);max-height:min(80vh,720px);display:grid;gap:12px;padding:16px;border:1px solid rgba(127,119,221,.35);border-radius:14px;background:linear-gradient(180deg,#0c1220fa,#080d17fa);box-shadow:0 24px 64px #00000073;overflow:hidden}.engine-model-picker__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.engine-model-picker__header-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.engine-model-picker__subtitle,.engine-model-picker__status{margin-top:4px;color:var(--text-secondary)}.engine-model-picker__tabs{margin-top:0}.engine-model-picker__tab-count{margin-left:6px;opacity:.7;font-size:10px}.engine-model-picker__list{display:grid;gap:8px;overflow:auto;max-height:min(52vh,480px);padding-right:4px}.engine-model-picker__item{display:grid;gap:4px;width:100%;text-align:left;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-1);color:var(--text-primary);cursor:pointer;transition:border-color .15s ease,background .15s ease}.engine-model-picker__item:hover:not(:disabled){border-color:#7f77dd8c;background:#7f77dd14}.engine-model-picker__item.active{border-color:#7f77ddd9;box-shadow:inset 0 0 0 1px #7f77dd40}.engine-model-picker__item:disabled{opacity:.6;cursor:wait}.engine-model-picker__item-title{font-size:13px;font-weight:600;word-break:break-word}.engine-model-picker__item-meta{font-size:11px;color:var(--text-secondary);word-break:break-all}.engine-model-picker__empty{padding:18px 12px;border:1px dashed var(--border);border-radius:10px;color:var(--text-secondary);font-size:12px;text-align:center}.engine-main-card__value{font-size:22px;line-height:1.1;font-weight:700;color:var(--text-primary)}.engine-main-card__value--small{font-size:14px;line-height:1.3}.engine-main-card__value--model{font-size:15px;line-height:1.3;word-break:break-word}.engine-main-card__meta,.engine-main-inline-status,.forge-tab__note{font-size:11px;color:var(--text-secondary)}.engine-main-grid__model{min-width:0}.engine-main-slider__header{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.engine-main-slider__value{font-size:12px;color:var(--text-primary);font-variant-numeric:tabular-nums}.engine-main-slider{width:100%}.forge-tab__metadata{margin-top:14px;padding-top:12px;border-top:1px solid var(--border)}.video-swarm-browser{display:grid;gap:12px;margin-top:12px}.video-swarm-browser__toolbar{padding:12px;display:grid;gap:10px}.video-swarm-browser__toolbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.video-swarm-browser__roots{display:flex;gap:6px;align-items:center;min-width:200px;flex:1}.video-swarm-browser__sort{max-width:140px}.video-swarm-browser__zoom{display:grid;gap:4px;min-width:120px}.video-swarm-browser__zoom input[type=range]{width:100%;accent-color:var(--live)}.video-swarm-browser__path{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:11px}.video-swarm-browser__path code{font-family:var(--mono, ui-monospace, monospace);color:var(--text-secondary);word-break:break-all}.video-swarm-browser__count{font-size:10px;color:var(--text-dim)}.video-swarm-browser__status{margin:0}.video-swarm-browser__cloud-connect,.video-swarm-browser__newfolder{margin-top:10px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,.08);background:#08090d73;display:grid;gap:8px}.video-swarm-browser__cloud-connect-title{font-size:12px;font-weight:600;color:var(--text-secondary)}.video-swarm-browser__cloud-connect-row,.video-swarm-browser__cloud-video-form,.video-swarm-browser__newfolder{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.video-swarm-browser__cloud-connect-row .framesync-input,.video-swarm-browser__cloud-video-form .framesync-input{flex:1 1 200px;min-width:160px}.video-swarm-browser__cloud-hint{margin:0}.video-swarm-browser__cloud-list{display:grid;gap:6px}.video-swarm-browser__cloud-item{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.video-swarm-browser__cloud-item-main{flex:1 1 180px;text-align:left;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#ffffff0a;color:inherit;padding:8px 10px;cursor:pointer;display:grid;gap:2px}.video-swarm-browser__cloud-item-main:hover{border-color:#7f77dd73}.video-swarm-browser__cloud-panel{padding:12px;display:grid;gap:10px}.video-swarm-browser__cloud-panel-actions{display:flex;gap:8px;flex-wrap:wrap}.video-swarm-browser__upload-input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.video-swarm-browser__dropzone{position:relative;min-height:120px}.video-swarm-browser__dropzone--active{outline:2px dashed rgba(127,119,221,.65);outline-offset:4px;border-radius:12px;background:#7f77dd0f}.video-swarm-browser__dropzone-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;font-size:14px;font-weight:600;color:var(--accent-text);pointer-events:none;z-index:2}.video-swarm-browser__empty{padding:24px;text-align:center;font-size:12px;color:var(--text-dim);border:.5px dashed var(--border);border-radius:var(--radius-sm, 7px)}.video-swarm-browser__grid{columns:4;column-gap:10px;max-height:min(62vh,720px);overflow:auto;padding:4px}.video-swarm-browser__grid--zoom-0{columns:6}.video-swarm-browser__grid--zoom-1{columns:5}.video-swarm-browser__grid--zoom-2{columns:4}.video-swarm-browser__grid--zoom-3{columns:3}.video-swarm-browser__grid--zoom-4{columns:2}.video-swarm-browser__tile{break-inside:avoid;margin-bottom:10px;width:100%;display:grid;gap:4px;padding:0;border:.5px solid var(--border);border-radius:var(--radius-sm, 7px);background:var(--bg-3);overflow:hidden;cursor:pointer;text-align:left;font-family:inherit;transition:border-color .15s ease,box-shadow .15s ease}.video-swarm-browser__tile:hover,.video-swarm-browser__tile--hover{border-color:var(--border-strong)}.video-swarm-browser__tile--selected{border-color:var(--live);box-shadow:0 0 0 1px #1d9e7559}.video-swarm-browser__tile--folder{min-height:96px}.video-swarm-browser__folder-icon{aspect-ratio:16 / 9;display:grid;place-items:center;background:var(--bg-0);color:var(--text-dim);font-size:28px}.video-swarm-browser__video{width:100%;display:block;aspect-ratio:16 / 9;object-fit:cover;background:#000}.video-swarm-browser__placeholder{aspect-ratio:16 / 9;display:grid;place-items:center;background:var(--bg-0);color:var(--text-dim);font-size:22px}.video-swarm-browser__label{padding:0 8px;font-size:10px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-swarm-browser__meta{padding:0 8px 8px;font-size:9px;color:var(--text-dim)}.video-swarm-browser__modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;background:#08090deb;display:grid;place-items:center;padding:20px}.video-swarm-browser__modal-inner{width:min(96vw,1200px);max-height:96vh;display:grid;gap:12px}.video-swarm-browser__modal-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;color:var(--text-primary);font-size:13px}.video-swarm-browser__modal-actions{display:flex;flex-wrap:wrap;gap:6px}.video-swarm-browser__modal-video{width:100%;max-height:calc(96vh - 80px);border-radius:var(--radius-sm, 7px);background:#000}.video-swarm-browser__menu{position:fixed;z-index:1300;display:grid;gap:4px;padding:8px;background:var(--bg-2);border:.5px solid var(--border-strong);border-radius:var(--radius-sm, 7px);box-shadow:0 12px 40px #00000073}.library-browser{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}.library-browser__tabs{margin-bottom:2px;padding:0 2px}.library-browser__tab{display:inline-flex;align-items:center;gap:6px;font-weight:600;min-height:34px}.library-browser__tab.active{border-color:color-mix(in srgb,var(--library-accent, var(--accent)) 55%,var(--border));color:var(--text-primary);background:color-mix(in srgb,var(--library-accent, var(--accent)) 14%,var(--bg-2))}.library-browser__pane{display:flex;flex-direction:column;min-height:0;flex:1}.library-browser__panel{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}.library-browser__toolbar{display:grid;gap:10px;padding:10px 12px}.library-browser__head{display:grid;gap:4px}.library-browser__subtitle{margin:0}.library-browser__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.library-browser__actions .framesync-button{display:inline-flex;align-items:center;gap:6px}.library-browser__upload-input{display:none}.library-browser__status{margin:0}.library-browser__dropzone{position:relative;flex:1;min-height:280px;overflow:auto;border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-1)}.library-browser__dropzone--active{border-color:color-mix(in srgb,var(--library-accent) 45%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--library-accent) 20%,transparent)}.library-browser__dropzone-hint{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:var(--library-accent);background:#08090db8;pointer-events:none}.library-browser__empty{min-height:220px;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;color:var(--text-dim);font-size:13px}.library-browser__skeleton-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;padding:12px}.library-browser__skeleton-card{display:grid;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--border);background:var(--bg-2)}.library-browser__skeleton-media{aspect-ratio:16 / 9;border-radius:8px;background:linear-gradient(110deg,#ffffff0a 8%,#ffffff1a 18%,#ffffff0a 33%);background-size:200% 100%;animation:library-shimmer 1.35s ease-in-out infinite}.library-browser__skeleton-line{height:10px;width:55%;border-radius:999px;background:linear-gradient(110deg,#ffffff0a 8%,#ffffff1a 18%,#ffffff0a 33%);background-size:200% 100%;animation:library-shimmer 1.35s ease-in-out infinite}.library-browser__skeleton-line--wide{width:82%;height:12px}@keyframes library-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}.library-browser__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;padding:12px}.library-browser__card{display:grid;grid-template-rows:auto 1fr auto;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--border);background:var(--bg-2);cursor:pointer;text-align:left;transition:border-color .15s,box-shadow .15s,transform .15s}.library-browser__card:hover,.library-browser__card--hover,.library-browser__card--selected{border-color:color-mix(in srgb,var(--library-accent, var(--accent)) 45%,var(--border));box-shadow:0 8px 24px #00000047}.library-browser__media{position:relative;aspect-ratio:16 / 9;border-radius:8px;overflow:hidden;background:var(--media-bg)}.library-browser__media-loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:flex;align-items:center;justify-content:center;background:#08090d8c}.library-browser__video,.library-browser__thumb{width:100%;height:100%;object-fit:cover;display:block}.library-browser__video--poster{pointer-events:none}.library-browser__placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:28px;background:linear-gradient(145deg,#7f77dd1f,#1d9e7514)}.library-browser__badges{position:absolute;left:8px;bottom:8px;display:flex;flex-wrap:wrap;gap:6px;z-index:1}.library-browser__badge{padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-primary);background:#08090dc7;border:1px solid rgba(255,255,255,.08)}.library-browser__badge--video{color:var(--live-text);border-color:#1d9e7559}.library-browser__badge--recording{color:var(--warn);border-color:#ef9f2759}.library-browser__badge--run{color:var(--accent-text);border-color:#7f77dd59}.library-browser__badge--audio{color:#c4b5fd;border-color:#a78bfa59}.library-audio-card__media{display:flex;align-items:center;justify-content:center}.library-audio-card__wave{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;justify-content:center;gap:3px;padding:18% 12%;opacity:.45}.library-audio-card__wave--active{opacity:.85}.library-audio-card__bar{flex:1;max-width:8px;min-height:8px;border-radius:999px;background:linear-gradient(180deg,#a78bfaf2,#7f77dd8c);transform-origin:bottom center;animation:library-audio-bar 1.1s ease-in-out infinite;animation-play-state:paused}.library-audio-card__wave--active .library-audio-card__bar,.library-audio-card--playing .library-audio-card__bar{animation-play-state:running}@keyframes library-audio-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.library-audio-card__icon{position:relative;z-index:1;font-size:28px;color:#c4b5fd8c;pointer-events:none}.library-audio-card--playing .library-audio-card__icon,.library-audio-card--hover .library-audio-card__icon,.library-browser__card--selected.library-audio-card .library-audio-card__icon{opacity:.15}.library-audio-card__audio{position:absolute;width:0;height:0;opacity:0;pointer-events:none}.library-browser__title{margin:0;font-size:13px;font-weight:700;color:var(--text-primary);line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.library-browser__meta{margin:4px 0 0;font-size:11px;color:var(--text-dim)}.library-browser__card-actions{display:flex;flex-wrap:wrap;gap:6px}.library-browser__modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1400;display:flex;align-items:center;justify-content:center;padding:20px;background:#000000d1}.library-browser__modal-inner{width:min(960px,100%);display:grid;gap:10px;padding:12px;border-radius:14px;border:1px solid var(--border);background:var(--bg-1)}.library-browser__modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.library-browser__modal-actions{display:flex;flex-wrap:wrap;gap:6px}.library-browser__modal-video{width:100%;max-height:min(72vh,720px);border-radius:10px;background:#000}.projects-browser{display:flex;flex-direction:column;gap:10px;min-height:0;flex:1}@media (max-width: 900px){.stage-rack-overlay,.studio-right-column{position:static;width:100%;max-height:none}.img2img-dropgrid{grid-template-columns:1fr}.generate-sequencer__hero-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.generate-sequencer__control-span{grid-column:span 1}.engine-main-summary,.layout--stage,.layout--studio{grid-template-columns:1fr}.modulation-lfo-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 600px){.generate-sequencer__hero-grid{grid-template-columns:1fr}.modulation-lfo-grid{grid-template-columns:1fr!important}}.layout--editor .preview{max-width:none;width:100%;display:flex;flex-direction:column;grid-template-rows:none}.layout--editor .preview-bottom-dock{display:none}.editor-workspace-shell{display:grid;gap:10px;min-height:min(78vh,900px);grid-template-rows:auto 1fr}.editor-workspace-shell__toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:0 2px 4px}.editor-workspace-shell__status{font-size:11px;color:var(--text-dim);max-width:min(520px,100%);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-workspace-shell__status--live{color:var(--live-text)}.editor-workspace-shell .editor-view{min-height:0}.editor-view{display:grid;gap:10px;min-height:0;height:100%}.editor-view .editor-shell{display:grid;grid-template-rows:auto auto auto 1fr;gap:10px;min-height:min(76vh,880px)}.editor-shell__header{align-items:flex-start;gap:10px}.editor-shell__titles{display:grid;gap:4px}.editor-shell__subtitle{margin:0}.editor-shell__actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.editor-shell__pills{margin:0}.editor-shell__status{font-size:11px;color:var(--text-dim);padding:4px 8px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-1)}.editor-shell__status--live{border-color:var(--live);color:var(--live-text)}.editor-shell__body{min-height:0;display:grid;gap:8px}.editor-view__import{display:grid;gap:6px;padding:8px 10px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-1)}.editor-view__import-url{font-size:10px;word-break:break-all;color:var(--text-secondary)}.editor-view__import-hint{margin:0}.editor-view__frame{width:100%;min-height:min(68vh,760px);border:.5px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-0)}.library-storage-browser__header{margin-bottom:0}.library-storage-browser__actions{display:flex;flex-wrap:wrap;gap:8px}.motion-view__tabs{margin-bottom:10px}.prompt-style-bar__row{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:10px}.prompt-style-bar__select{flex:1 1 220px;min-width:180px}.prompt-style-bar__auto{font-size:11px;color:var(--text-secondary);white-space:nowrap}.prompt-style-bar__hint{margin:8px 0 0;font-size:11px;line-height:1.45}.engine-seed-control,.deforum-seed-control{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px}.engine-seed-control__label{font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em}.engine-seed-control__input,.deforum-seed-control__input{width:7.5rem;font-variant-numeric:tabular-nums}.engine-seed-control__random-hint,.deforum-seed-control__hint{font-size:11px;color:var(--text-dim)}.deforum-seed-control{width:100%}.styles-settings__header-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.styles-settings__count{font-size:11px;color:var(--text-dim)}.styles-settings__intro,.styles-settings__status{margin:8px 0 0}.styles-settings__search{margin-top:10px;width:100%}.styles-settings__body{display:grid;grid-template-columns:minmax(220px,280px) minmax(0,1fr);gap:12px;align-items:start}@media (max-width: 1200px){.styles-settings__body{grid-template-columns:1fr}}.styles-settings__list{display:flex;flex-direction:column;gap:6px;max-height:min(62vh,640px);overflow:auto}.styles-settings__item{display:grid;grid-template-columns:48px 1fr auto;gap:10px;align-items:center;width:100%;padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-1);color:var(--text-primary);text-align:left;cursor:pointer}.styles-settings__item:hover{border-color:var(--border-strong)}.styles-settings__item.active{border-color:var(--accent);box-shadow:0 0 0 1px #7f77dd59}.styles-settings__item.selected{background:#7f77dd1a}.styles-settings__thumb{width:48px;height:48px;border-radius:6px;overflow:hidden;background:var(--bg-0);border:1px solid var(--border)}.styles-settings__thumb img{width:100%;height:100%;object-fit:cover;display:block}.styles-settings__thumb--empty{background:linear-gradient(135deg,#7f77dd33,#2de2ff1f)}.styles-settings__item-title{font-size:12px;font-weight:600}.styles-settings__item-meta{font-size:10px;color:var(--text-dim);margin-top:2px}.styles-settings__active-tag{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--accent-text);padding:2px 6px;border-radius:999px;border:1px solid rgba(127,119,221,.45)}.styles-settings__editor{min-width:0}.styles-settings__field{display:flex;flex-direction:column;gap:4px;margin-top:10px}.styles-settings__example-preview{margin-top:10px;border-radius:var(--radius-sm);overflow:hidden;border:1px solid var(--border);max-height:220px}.styles-settings__example-preview img{width:100%;display:block;object-fit:contain;background:var(--bg-0)}.styles-settings__editor-actions{flex-wrap:wrap;margin-top:12px}.styles-settings__upload{position:relative;overflow:hidden;cursor:pointer}.styles-settings__upload-input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;cursor:pointer}.sequencer-controls-panel--stage .stage-sequencer-bar{border:.5px solid var(--border);background:var(--bg-1);border-radius:var(--radius-sm)}.live-hud-dock .live-hud-modulating,.live-hud-dock .live-hud-morph{width:100%}.live-hud-mod-row{margin-bottom:7px}.live-hud-mod-row__info{display:flex;justify-content:space-between;align-items:baseline;font-size:10px;color:var(--live-text);margin-bottom:4px}.live-hud-mod-row__source{color:var(--text-2)}.live-hud-mod-row__val{font-family:var(--mono)}.live-hud-mod-row__bar{height:3px;background:#1d9e7533;border-radius:2px}.live-hud-mod-row__fill{height:100%;background:var(--live);border-radius:2px;transition:width .12s}.live-hud-morph__labels{display:flex;justify-content:space-between;font-size:10px;margin-bottom:8px}.live-hud-morph__a{color:var(--a-group)}.live-hud-morph__b{color:var(--b-group)}.live-hud-morph__slider-wrap{margin-bottom:8px}.live-hud-morph__slider{width:100%}.live-hud-morph__actions{display:flex;gap:5px}.live-hud-morph__actions .framesync-button{flex:1;font-size:10px}@keyframes beat-pulse{0%{box-shadow:0 0 0 1px var(--accent)}50%{box-shadow:0 0 8px 2px var(--accent),inset 0 0 4px #7f77dd2e}to{box-shadow:0 0 0 1px var(--accent)}}.beat-macro-pill--pulsing{animation:beat-pulse .2s ease-out}.ui-icon[data-v-f0fded0e]{width:1em;height:1em;display:inline-block;vertical-align:middle;flex-shrink:0}.status-strip[data-v-4e565d39]{display:flex;gap:8px;align-items:center;justify-content:flex-end;flex-wrap:wrap}.ss-session[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center;gap:6px}.ss-session__new[data-v-4e565d39]{padding:4px 10px;min-width:30px;justify-content:center}.ss-session-popover[data-v-4e565d39]{position:absolute;right:0;top:calc(100% + 8px);width:min(520px,92vw);max-height:min(60vh,520px);overflow:auto;border-radius:14px;border:.5px solid var(--border);background:#0a0c12eb;box-shadow:0 24px 70px #00000073;padding:10px;z-index:40}.ss-session-empty[data-v-4e565d39]{font-size:11px;color:var(--text-dim);padding:8px 2px}.ss-session-list[data-v-4e565d39]{display:grid;gap:8px;margin-top:6px}.ss-session-row[data-v-4e565d39]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;padding:8px;border-radius:12px;border:.5px solid rgba(255,255,255,.08);background:#ffffff05}.ss-session-row--active[data-v-4e565d39]{border-color:#7f77dd73;box-shadow:inset 0 0 0 1px #7f77dd1f}.ss-session-pick[data-v-4e565d39]{display:grid;gap:2px;text-align:left;color:var(--text-primary);background:transparent;border:none;cursor:pointer;padding:2px 4px;min-width:0}.ss-session-name[data-v-4e565d39]{font-size:12px;font-weight:800;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss-session-meta[data-v-4e565d39]{font-size:10px;color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase}.ss-session-actions[data-v-4e565d39]{display:inline-flex;gap:6px;align-items:center}.ss-transport[data-v-4e565d39]{border-left:none;border-radius:12px;border:.5px solid var(--border);background:#11131cb8;padding:4px;gap:3px}.ss-transport .header-transport__btn[data-v-4e565d39]{width:36px;height:36px}.ss-transport .header-transport__btn--preview[data-v-4e565d39],.ss-transport .header-transport__btn--stream[data-v-4e565d39]{width:auto;min-width:36px;padding:0 10px;gap:5px}.ss-transport .header-transport__btn--stream.header-transport__btn--active[data-v-4e565d39]{color:var(--live-text);border-color:#1d9e758c;box-shadow:0 0 10px #1d9e7533}.ss-transport .header-transport__btn--stream-stop[data-v-4e565d39]{width:36px}.header-transport__preview-label[data-v-4e565d39]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.header-transport__preview-loading[data-v-4e565d39]{font-size:10px}.ss-btn[data-v-4e565d39]{display:inline-flex;align-items:center;gap:4px;padding:4px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);font-size:11px;font-weight:700;cursor:pointer;transition:color .12s,border-color .12s,box-shadow .12s;white-space:nowrap}.ss-icon[data-v-4e565d39]{font-size:13px}.ss-label[data-v-4e565d39]{font-size:9px;text-transform:uppercase;letter-spacing:.08em}.ss-btn--ghost[data-v-4e565d39]{background:transparent;border-color:transparent}.ss-btn--ghost[data-v-4e565d39]:hover{border-color:var(--border)}.ss-btn--active[data-v-4e565d39]{color:var(--live-text);border-color:var(--live);box-shadow:0 0 8px #1d9e7540}.ss-btn--recording[data-v-4e565d39]{color:var(--error);border-color:var(--error);animation:ss-rec-pulse-4e565d39 1.5s ease-in-out infinite}@keyframes ss-rec-pulse-4e565d39{0%,to{opacity:1}50%{opacity:.55}}.ss-pill[data-v-4e565d39]{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);font-size:11px;white-space:nowrap}.ss-pill--button[data-v-4e565d39]{cursor:pointer;color:inherit}.ss-pill--live[data-v-4e565d39]{border-color:#1d9e7566}.ss-pill--error[data-v-4e565d39]{border-color:#e24b4a66}.ss-pill--warn[data-v-4e565d39]{border-color:#ef9f2759}.ss-pill--morph[data-v-4e565d39]{border-color:color-mix(in srgb,var(--b-group) 50%,transparent);color:var(--text-secondary)}.ss-pill--morph strong[data-v-4e565d39]{color:var(--b-group)}.ss-key[data-v-4e565d39]{font-size:9px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-dim)}.ss-pill strong[data-v-4e565d39]{font-size:11px;color:var(--text-secondary)}.ss-dot[data-v-4e565d39]{width:6px;height:6px;border-radius:50%;background:var(--border-strong);flex-shrink:0}.ss-pill--live .ss-dot[data-v-4e565d39]{background:var(--live);box-shadow:0 0 5px var(--live)}.ss-pill--error .ss-dot[data-v-4e565d39]{background:var(--error);box-shadow:0 0 5px var(--error)}.ss-pill--warn .ss-dot[data-v-4e565d39]{background:var(--warn);box-shadow:0 0 5px var(--warn)}.ss-help[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center}.ss-help-popover[data-v-4e565d39]{position:absolute;top:calc(100% + 10px);right:0;z-index:30;width:min(360px,calc(100vw - 28px));padding:12px;border-radius:14px;border:.5px solid var(--border);background:#08090df5;box-shadow:0 18px 40px #00000059;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}.ss-health[data-v-4e565d39]{position:relative;display:inline-flex;align-items:center}.ss-health-popover[data-v-4e565d39]{position:absolute;top:calc(100% + 10px);right:0;z-index:30;width:min(320px,calc(100vw - 28px));padding:12px;border-radius:14px;border:.5px solid var(--border);background:#08090df5;box-shadow:0 18px 40px #00000059;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}.ss-health-popover__header[data-v-4e565d39]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ss-health-popover__title[data-v-4e565d39]{font-size:12px;font-weight:700;color:var(--text-primary);letter-spacing:.04em;text-transform:uppercase}.ss-health-grid[data-v-4e565d39]{display:grid;grid-template-columns:1fr;gap:8px;margin-top:10px}.ss-help-popover__header[data-v-4e565d39]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ss-help-popover__title[data-v-4e565d39]{font-size:12px;font-weight:700;color:var(--text-primary);letter-spacing:.04em;text-transform:uppercase}.ss-help-popover__close[data-v-4e565d39]{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:999px;border:.5px solid var(--border);background:var(--bg-2);color:var(--text-dim);cursor:pointer}.ss-help-grid[data-v-4e565d39]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:12px}.ss-help-section[data-v-4e565d39]{display:grid;gap:6px;padding:10px;border-radius:10px;border:.5px solid var(--border);background:#ffffff05}.ss-help-section__title[data-v-4e565d39]{font-size:10px;font-weight:700;color:var(--text-primary);letter-spacing:.08em;text-transform:uppercase}.ss-help-section__items[data-v-4e565d39]{display:grid;gap:5px;font-size:11px;line-height:1.5;color:var(--text-secondary)}.ss-help-popover kbd[data-v-4e565d39]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;min-height:20px;padding:0 6px;margin:0 2px;border-radius:6px;border:.5px solid var(--border-strong);background:var(--bg-2);color:var(--text-primary);font-size:10px;font-family:inherit;font-weight:700}@media (max-width: 900px){.ss-help-grid[data-v-4e565d39]{grid-template-columns:1fr}}.glass-panel[data-v-2ca4403b]{background:#11131cd9;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:.5px solid var(--border);border-radius:11px;overflow:hidden}.glass-panel-header[data-v-2ca4403b]{padding:8px 12px 6px;border-bottom:.5px solid var(--border);font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim)}.glass-panel-body[data-v-2ca4403b]{padding:10px 12px}.glass-panel--sm .glass-panel-body[data-v-2ca4403b]{padding:6px 10px}.glass-panel--lg .glass-panel-body[data-v-2ca4403b]{padding:14px 16px}.glass-panel--overlay[data-v-2ca4403b]{background:#11131c6b;backdrop-filter:blur(10px) saturate(1.08);-webkit-backdrop-filter:blur(10px) saturate(1.08);border:.5px solid rgba(255,255,255,.08);box-shadow:0 8px 24px #00000047}.glass-panel--overlay .glass-panel-header[data-v-2ca4403b]{background:transparent;border-bottom-color:#ffffff0f}.lpr[data-v-a2b7413a]{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;gap:6px;align-items:start;padding:5px 0;border-bottom:.5px solid var(--border);opacity:.45;transition:opacity .2s}.lpr[data-v-a2b7413a]:last-child{border-bottom:none}.lpr--modulated[data-v-a2b7413a]{opacity:1}.lpr-main[data-v-a2b7413a]{min-width:0;display:flex;align-items:center;gap:4px;white-space:nowrap;overflow:hidden}.lpr-name[data-v-a2b7413a]{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lpr--modulated .lpr-name[data-v-a2b7413a]{color:var(--live)}.lpr-source[data-v-a2b7413a]{min-width:0;display:inline-flex;align-items:center;gap:2px;font-size:8px;color:var(--live-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lpr-source-icon[data-v-a2b7413a]{font-size:9px}.lpr-source-text[data-v-a2b7413a]{min-width:0;overflow:hidden;text-overflow:ellipsis}.lpr-bar-wrap[data-v-a2b7413a]{grid-column:1 / -1;height:3px;border-radius:2px;background:var(--bg-1);overflow:hidden;margin-top:1px}.lpr-bar[data-v-a2b7413a]{height:100%;border-radius:2px;background:var(--text-dim);transition:width .06s}.lpr--modulated .lpr-bar[data-v-a2b7413a]{background:var(--live);box-shadow:0 0 4px var(--live)}.lpr-value[data-v-a2b7413a]{grid-column:2;font-family:ui-monospace,Cascadia Code,monospace;font-size:10px;color:var(--text-dim);text-align:right;white-space:nowrap;padding-top:1px}.lpr--modulated .lpr-value[data-v-a2b7413a]{color:var(--live-text)}.track-lane[data-v-64013507]{display:grid;grid-template-columns:132px minmax(0,1fr);gap:10px;align-items:center}.track-lane__label[data-v-64013507]{border:1px solid var(--border);border-radius:10px;background:var(--bg-1);color:var(--text-primary);min-height:72px;padding:10px 12px;text-align:left;cursor:pointer;display:grid;gap:4px}.track-lane--selected .track-lane__label[data-v-64013507]{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 18%,transparent) inset}.track-lane__name[data-v-64013507]{font-size:12px;font-weight:700;color:var(--text-primary)}.track-lane__meta[data-v-64013507]{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em}.track-lane__graph[data-v-64013507]{position:relative;min-height:72px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 8%,transparent),color-mix(in srgb,var(--accent) 2%,transparent)),linear-gradient(90deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),linear-gradient(180deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),var(--bg-0);background-size:auto,10% 100%,100% 25%,auto;overflow:hidden;cursor:pointer}.track-lane--selected .track-lane__graph[data-v-64013507]{border-color:var(--accent)}.track-lane__path[data-v-64013507]{position:absolute;top:8px;right:8px;bottom:8px;left:8px;width:calc(100% - 16px);height:calc(100% - 16px);overflow:visible}.track-lane__path polyline[data-v-64013507]{fill:none;stroke:var(--accent);stroke-width:1.4;vector-effect:non-scaling-stroke}.track-lane__playhead[data-v-64013507]{position:absolute;top:0;bottom:0;width:2px;background:var(--live);box-shadow:0 0 8px color-mix(in srgb,var(--live) 35%,transparent);transform:translate(-50%)}.track-lane__keyframe[data-v-64013507]{position:absolute;width:14px;height:14px;border:1px solid var(--accent);background:var(--bg-1);border-radius:3px;transform:translate(-50%,-50%) rotate(45deg);cursor:grab;padding:0}.track-lane__keyframe[data-v-64013507]:active{cursor:grabbing}.track-lane__tooltip[data-v-64013507]{position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%) rotate(-45deg);border-radius:6px;background:var(--bg-2);border:1px solid var(--border-strong);color:var(--text-primary);padding:4px 6px;font-size:10px;white-space:nowrap;pointer-events:none}@media (max-width: 768px){.track-lane[data-v-64013507]{grid-template-columns:1fr}.track-lane__label[data-v-64013507]{min-height:auto}}.timeline-hero[data-v-728f6ade]{border:1px solid var(--border);border-radius:14px;background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 8%,transparent),color-mix(in srgb,var(--bg-1) 96%,transparent));padding:12px;display:grid;gap:12px}.timeline-hero--compact[data-v-728f6ade]{gap:10px}.timeline-hero__header[data-v-728f6ade]{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.timeline-hero__header-actions[data-v-728f6ade]{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.timeline-hero__title-block[data-v-728f6ade]{display:grid;gap:4px}.timeline-hero__eyebrow[data-v-728f6ade]{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary)}.timeline-hero__time[data-v-728f6ade]{font-size:14px;color:var(--text-primary)}.timeline-hero__frame[data-v-728f6ade]{font-size:13px;color:var(--text-secondary)}.timeline-hero__frame--live[data-v-728f6ade]{color:var(--live-text);text-shadow:0 0 10px color-mix(in srgb,var(--live) 28%,transparent)}.timeline-hero__summary[data-v-728f6ade]{font-size:11px;color:var(--text-dim)}.timeline-hero__toggle[data-v-728f6ade]{border:1px solid var(--border);background:var(--bg-2);color:var(--text-secondary);border-radius:999px;padding:4px 10px;font-size:10px;cursor:pointer}.timeline-hero__body[data-v-728f6ade]{position:relative;display:grid;gap:10px}.timeline-hero__shared-playhead[data-v-728f6ade]{position:absolute;top:0;bottom:0;width:2px;background:color-mix(in srgb,var(--live) 55%,transparent);box-shadow:0 0 10px color-mix(in srgb,var(--live) 28%,transparent);transform:translate(-50%);z-index:1;pointer-events:none}.timeline-hero__filmstrip[data-v-728f6ade]{position:relative;min-height:92px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--bg-2) 86%,transparent),var(--bg-0));overflow:hidden}.timeline-hero__filmstrip--empty[data-v-728f6ade]{display:flex;align-items:center;justify-content:center}.timeline-hero__filmstrip-empty[data-v-728f6ade]{color:var(--text-dim);font-size:11px}.timeline-hero__frame[data-v-728f6ade]{position:absolute;top:10px;width:74px;transform:translate(-50%);display:grid;gap:4px;border:none;background:transparent;padding:0;cursor:pointer;z-index:2}.timeline-hero__frame-image[data-v-728f6ade],.timeline-hero__frame-placeholder[data-v-728f6ade]{width:74px;height:42px;border-radius:8px;border:1px solid var(--border);background:var(--bg-1);object-fit:cover;box-shadow:0 8px 18px #00000047}.timeline-hero__frame-placeholder[data-v-728f6ade]{display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:10px}.timeline-hero__frame-label[data-v-728f6ade]{font-size:9px;color:var(--text-secondary);white-space:nowrap}.timeline-hero__content-lanes[data-v-728f6ade]{display:grid;gap:6px}.timeline-hero__content-lane[data-v-728f6ade]{display:grid;grid-template-columns:72px 1fr;gap:8px;align-items:center}.timeline-hero__content-lane-label[data-v-728f6ade]{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim)}.timeline-hero__content-lane-track[data-v-728f6ade]{position:relative;min-height:28px;border:1px solid var(--border);border-radius:8px;background:var(--bg-0);overflow:hidden}.timeline-hero__clip[data-v-728f6ade]{position:absolute;top:4px;bottom:4px;min-width:28px;border:1px solid var(--border-strong);border-radius:6px;padding:0 6px;display:flex;align-items:center;cursor:pointer;overflow:hidden;z-index:2}.timeline-hero__clip--prompt[data-v-728f6ade]{background:color-mix(in srgb,var(--accent) 22%,var(--bg-2));border-color:color-mix(in srgb,var(--accent) 45%,var(--border))}.timeline-hero__clip--lora[data-v-728f6ade]{background:color-mix(in srgb,var(--live) 18%,var(--bg-2));border-color:color-mix(in srgb,var(--live) 40%,var(--border))}.timeline-hero__clip--controlnet[data-v-728f6ade]{background:color-mix(in srgb,var(--warn) 18%,var(--bg-2));border-color:color-mix(in srgb,var(--warn) 42%,var(--border))}.timeline-hero__clip--selected[data-v-728f6ade]{box-shadow:0 0 0 1px var(--accent)}.timeline-hero__clip-label[data-v-728f6ade]{font-size:9px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-hero__content-lane-empty[data-v-728f6ade]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:9px;color:var(--text-dim);pointer-events:none}.timeline-hero__ruler[data-v-728f6ade]{position:relative;min-height:64px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(90deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),linear-gradient(180deg,color-mix(in srgb,var(--text-primary) 4%,transparent) 1px,transparent 1px),var(--bg-0);background-size:10% 100%,100% 50%,auto;overflow:hidden;cursor:ew-resize}.timeline-hero__marker[data-v-728f6ade]{position:absolute;top:10px;bottom:0;width:0;transform:translate(-50%)}.timeline-hero__marker[data-v-728f6ade]:before{content:"";position:absolute;top:24px;bottom:0;left:50%;width:1px;background:color-mix(in srgb,var(--text-primary) 16%,transparent)}.timeline-hero__marker-label[data-v-728f6ade]{position:relative;left:50%;transform:translate(-50%);border:1px solid var(--border-strong);background:var(--bg-2);color:var(--text-primary);border-radius:999px;padding:4px 8px;font-size:10px;white-space:nowrap;cursor:pointer}.timeline-hero__playhead[data-v-728f6ade]{position:absolute;top:0;bottom:0;width:2px;background:var(--live);box-shadow:0 0 10px color-mix(in srgb,var(--live) 40%,transparent);transform:translate(-50%)}.timeline-hero__playhead-handle[data-v-728f6ade]{position:absolute;top:8px;left:50%;width:14px;height:14px;border-radius:50%;background:var(--live);transform:translate(-50%);box-shadow:0 0 0 4px color-mix(in srgb,var(--live) 16%,transparent)}.timeline-hero__lanes[data-v-728f6ade]{display:grid;gap:10px;position:relative;z-index:2}.timeline-hero__compact-note[data-v-728f6ade]{font-size:11px;color:var(--text-dim)}.timeline-hero__empty[data-v-728f6ade]{min-height:120px;border:1px dashed var(--border);border-radius:12px;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:12px;background:var(--bg-0)}@media (max-width: 768px){.timeline-hero__header-actions[data-v-728f6ade]{width:100%;justify-content:space-between}.timeline-hero__frame[data-v-728f6ade]{width:60px}.timeline-hero__frame-image[data-v-728f6ade],.timeline-hero__frame-placeholder[data-v-728f6ade]{width:60px;height:36px}}.three-background[data-v-74f9bc89]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;overflow:hidden;background:transparent}.three-background[data-v-74f9bc89] canvas{width:100%;height:100%;display:block}.library-shell[data-v-73077ca3]{display:grid;gap:12px}.library-shell--fullscreen[data-v-73077ca3]{position:fixed;top:8px;right:8px;bottom:8px;left:8px;z-index:999;padding:12px;background:#08090deb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.08);border-radius:14px;overflow:auto}.library-shell--workspace[data-v-73077ca3]{display:flex;flex-direction:column;min-height:0;height:100%;gap:8px}.library-shell--workspace .library-storage-browser[data-v-73077ca3]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.library-storage-browser[data-v-73077ca3]{display:grid;gap:12px;min-height:0}.waveform[data-v-fb4eb07f]{display:block;overflow:visible}.waveform--active polyline[data-v-fb4eb07f]{filter:drop-shadow(0 0 2px var(--live))}.target-cell[data-v-6d546a48]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px 4px;border-radius:var(--radius-sm);border:.5px solid var(--border);background:var(--bg-2);cursor:pointer;min-width:0;transition:border-color .12s,background .12s,box-shadow .12s;text-align:center}.target-cell[data-v-6d546a48]:hover{border-color:var(--border-strong)}.target-cell--routed[data-v-6d546a48]{border-color:var(--live);background:#1d9e7514;box-shadow:0 0 6px #1d9e752e}.target-cell--selected[data-v-6d546a48]{border-color:var(--accent);background:#7f77dd1a;box-shadow:0 0 6px #7f77dd33}.target-cell--focused[data-v-6d546a48]{outline:2px solid var(--warn);outline-offset:1px}.target-cell-label[data-v-6d546a48]{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.target-cell--routed .target-cell-label[data-v-6d546a48]{color:var(--live-text)}.target-cell--selected .target-cell-label[data-v-6d546a48]{color:var(--accent-text)}.target-cell-owners[data-v-6d546a48]{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:2px}.target-cell-owner[data-v-6d546a48]{font-size:8px;color:var(--live);white-space:nowrap;font-weight:700;border:.5px solid color-mix(in srgb,var(--live) 35%,transparent);border-radius:999px;padding:1px 4px}.target-cell-extra[data-v-6d546a48]{color:var(--text-dim);font-size:8px;font-weight:700}.stream-shell[data-v-5c3b8013]{display:grid;gap:14px;max-width:980px}.stream-card[data-v-5c3b8013]{display:grid;gap:12px}.stream-active-section[data-v-5c3b8013]{display:grid;gap:10px}.stream-active-header[data-v-5c3b8013]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px}.stream-active-list[data-v-5c3b8013]{display:grid;gap:10px}.stream-active-row[data-v-5c3b8013]{display:grid;grid-template-columns:minmax(0,1.4fr) auto auto;gap:12px;align-items:center;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:var(--bg-1)}.stream-active-row--live[data-v-5c3b8013]{border-color:#1d9e7573;box-shadow:inset 0 0 0 1px #1d9e751f}.stream-active-row__main[data-v-5c3b8013]{min-width:0;display:grid;gap:4px}.stream-active-row__title[data-v-5c3b8013]{font-size:12px;font-weight:700;color:var(--text-primary)}.stream-active-row__target[data-v-5c3b8013]{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stream-active-row__metrics[data-v-5c3b8013]{display:flex;flex-wrap:wrap;gap:12px;align-items:center}.stream-metric[data-v-5c3b8013]{display:grid;gap:2px;text-align:center;min-width:52px}.stream-metric__label[data-v-5c3b8013]{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim)}.stream-metric strong[data-v-5c3b8013]{font-size:12px;color:var(--text-primary)}.stream-health-pill[data-v-5c3b8013]{display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border:.5px solid var(--border);color:var(--text-secondary);background:var(--bg-2)}.stream-health-pill--live[data-v-5c3b8013]{color:var(--live-text);border-color:#1d9e7573;background:#1d9e7524}.stream-health-pill--warn[data-v-5c3b8013]{color:var(--warn-text);border-color:#ef9f2773;background:#ef9f2724}.stream-health-pill--error[data-v-5c3b8013]{color:var(--error-text);border-color:#e24b4a73;background:#e24b4a24}.stream-health-pill--dim[data-v-5c3b8013]{color:var(--text-dim)}.stream-active-row__actions[data-v-5c3b8013]{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.stream-view-link[data-v-5c3b8013]{text-decoration:none;display:inline-flex;align-items:center}.stream-card__actions[data-v-5c3b8013],.stream-quick-add[data-v-5c3b8013],.stream-destination__actions[data-v-5c3b8013],.stream-endpoints[data-v-5c3b8013]{display:flex;flex-wrap:wrap;gap:8px}.stream-hls-controls[data-v-5c3b8013]{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:10px}.stream-preview[data-v-5c3b8013]{border:1px solid var(--border);border-radius:14px;overflow:hidden;background:var(--bg-0)}.stream-preview-status[data-v-5c3b8013]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:4px 10px;border-radius:999px;border:.5px solid var(--border)}.stream-preview-status--live[data-v-5c3b8013]{color:var(--live-text);border-color:#1d9e7573;background:#1d9e751f}.stream-preview-status--idle[data-v-5c3b8013]{color:var(--text-dim)}.stream-preview__video[data-v-5c3b8013]{width:100%;min-height:260px;display:block;background:var(--media-bg)}.stream-endpoint[data-v-5c3b8013],.stream-destination__grid[data-v-5c3b8013]{border:1px solid var(--border);border-radius:12px;background:var(--bg-1);color:var(--text-primary)}.stream-endpoint[data-v-5c3b8013]{display:grid;grid-template-columns:auto auto minmax(0,1fr);gap:8px;align-items:center;padding:10px 12px;text-decoration:none;min-width:min(100%,280px)}.stream-endpoint__label[data-v-5c3b8013]{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.stream-endpoint__value[data-v-5c3b8013]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim)}.stream-card__status[data-v-5c3b8013],.stream-empty[data-v-5c3b8013]{font-size:11px;color:var(--text-dim)}.stream-status-pill[data-v-5c3b8013]{border-radius:999px;padding:4px 10px;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--border);color:var(--text-secondary);background:var(--bg-2)}.stream-status-pill--live[data-v-5c3b8013]{color:var(--live-text);border-color:color-mix(in srgb,var(--live) 50%,var(--border));background:color-mix(in srgb,var(--live) 16%,var(--bg-2))}.stream-status-pill--error[data-v-5c3b8013]{color:var(--error-text);border-color:#e24b4a73;background:#e24b4a29}.stream-status-pill--idle[data-v-5c3b8013]{color:var(--warn-text);border-color:#ef9f2773;background:#ef9f2729}.stream-status-pill--dim[data-v-5c3b8013]{color:var(--text-dim)}.stream-destination__grid[data-v-5c3b8013]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:12px}.stream-field[data-v-5c3b8013]{display:grid;gap:6px}.stream-field--wide[data-v-5c3b8013]{grid-column:1 / -1}@media (max-width: 900px){.stream-active-row[data-v-5c3b8013]{grid-template-columns:1fr}.stream-active-row__actions[data-v-5c3b8013]{justify-content:flex-start}}@media (max-width: 700px){.stream-destination__grid[data-v-5c3b8013]{grid-template-columns:1fr}}.styles-settings__field-hint[data-v-929085f3]{margin:4px 0 0;font-size:10px;line-height:1.35} diff --git a/docker/web/public/assets/index.js b/docker/web/public/assets/index.js index 7c03c1e6..85a28e10 100644 --- a/docker/web/public/assets/index.js +++ b/docker/web/public/assets/index.js @@ -2,33 +2,204 @@ * @vue/shared v3.5.26 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function ac(t){const e=Object.create(null);for(const i of t.split(","))e[i]=1;return i=>i in e}const Ut={},Ar=[],Mn=()=>{},$m=()=>!1,Sl=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),lc=t=>t.startsWith("onUpdate:"),ci=Object.assign,dc=(t,e)=>{const i=t.indexOf(e);i>-1&&t.splice(i,1)},_y=Object.prototype.hasOwnProperty,xt=(t,e)=>_y.call(t,e),it=Array.isArray,Er=t=>Ho(t)==="[object Map]",qr=t=>Ho(t)==="[object Set]",yh=t=>Ho(t)==="[object Date]",ut=t=>typeof t=="function",Xt=t=>typeof t=="string",nn=t=>typeof t=="symbol",Ft=t=>t!==null&&typeof t=="object",Gm=t=>(Ft(t)||ut(t))&&ut(t.then)&&ut(t.catch),Hm=Object.prototype.toString,Ho=t=>Hm.call(t),Sy=t=>Ho(t).slice(8,-1),Wm=t=>Ho(t)==="[object Object]",uc=t=>Xt(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,po=ac(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),wl=t=>{const e=Object.create(null);return i=>e[i]||(e[i]=t(i))},wy=/-\w/g,ji=wl(t=>t.replace(wy,e=>e.slice(1).toUpperCase())),My=/\B([A-Z])/g,vs=wl(t=>t.replace(My,"-$1").toLowerCase()),Ml=wl(t=>t.charAt(0).toUpperCase()+t.slice(1)),$l=wl(t=>t?`on${Ml(t)}`:""),ps=(t,e)=>!Object.is(t,e),Ga=(t,...e)=>{for(let i=0;i{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:n,value:i})},Pl=t=>{const e=parseFloat(t);return isNaN(e)?t:e},Py=t=>{const e=Xt(t)?Number(t):NaN;return isNaN(e)?t:e};let vh;const xl=()=>vh||(vh=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Mt(t){if(it(t)){const e={};for(let i=0;i{if(i){const n=i.split(Ty);n.length>1&&(e[n[0].trim()]=n[1].trim())}}),e}function B(t){let e="";if(Xt(t))e=t;else if(it(t))for(let i=0;iWo(i,e))}const Xm=t=>!!(t&&t.__v_isRef===!0),b=t=>Xt(t)?t:t==null?"":it(t)||Ft(t)&&(t.toString===Hm||!ut(t.toString))?Xm(t)?b(t.value):JSON.stringify(t,Km,2):String(t),Km=(t,e)=>Xm(e)?Km(t,e.value):Er(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((i,[n,s],r)=>(i[Gl(n,r)+" =>"]=s,i),{})}:qr(e)?{[`Set(${e.size})`]:[...e.values()].map(i=>Gl(i))}:nn(e)?Gl(e):Ft(e)&&!it(e)&&!Wm(e)?String(e):e,Gl=(t,e="")=>{var i;return nn(t)?`Symbol(${(i=t.description)!=null?i:e})`:t};/** +**/function Oc(t){const e=Object.create(null);for(const i of t.split(","))e[i]=1;return i=>i in e}const Vt={},zr=[],En=()=>{},Uf=()=>!1,$l=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),Uc=t=>t.startsWith("onUpdate:"),pi=Object.assign,Vc=(t,e)=>{const i=t.indexOf(e);i>-1&&t.splice(i,1)},gv=Object.prototype.hasOwnProperty,Ct=(t,e)=>gv.call(t,e),nt=Array.isArray,$r=t=>la(t)==="[object Map]",ro=t=>la(t)==="[object Set]",tm=t=>la(t)==="[object Date]",lt=t=>typeof t=="function",ei=t=>typeof t=="string",an=t=>typeof t=="symbol",Ft=t=>t!==null&&typeof t=="object",Vf=t=>(Ft(t)||lt(t))&<(t.then)&<(t.catch),Bf=Object.prototype.toString,la=t=>Bf.call(t),yv=t=>la(t).slice(8,-1),zf=t=>la(t)==="[object Object]",Bc=t=>ei(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,Ro=Oc(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Gl=t=>{const e=Object.create(null);return i=>e[i]||(e[i]=t(i))},vv=/-\w/g,Zi=Gl(t=>t.replace(vv,e=>e.slice(1).toUpperCase())),bv=/\B([A-Z])/g,Ts=Gl(t=>t.replace(bv,"-$1").toLowerCase()),Hl=Gl(t=>t.charAt(0).toUpperCase()+t.slice(1)),hu=Gl(t=>t?`on${Hl(t)}`:""),ws=(t,e)=>!Object.is(t,e),ul=(t,...e)=>{for(let i=0;i{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:n,value:i})},Wl=t=>{const e=parseFloat(t);return isNaN(e)?t:e},_v=t=>{const e=ei(t)?Number(t):NaN;return isNaN(e)?t:e};let im;const ql=()=>im||(im=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Pt(t){if(nt(t)){const e={};for(let i=0;i{if(i){const n=i.split(wv);n.length>1&&(e[n[0].trim()]=n[1].trim())}}),e}function U(t){let e="";if(ei(t))e=t;else if(nt(t))for(let i=0;iua(i,e))}const Hf=t=>!!(t&&t.__v_isRef===!0),_=t=>ei(t)?t:t==null?"":nt(t)||Ft(t)&&(t.toString===Bf||!lt(t.toString))?Hf(t)?_(t.value):JSON.stringify(t,Wf,2):String(t),Wf=(t,e)=>Hf(e)?Wf(t,e.value):$r(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((i,[n,s],r)=>(i[mu(n,r)+" =>"]=s,i),{})}:ro(e)?{[`Set(${e.size})`]:[...e.values()].map(i=>mu(i))}:an(e)?mu(e):Ft(e)&&!nt(e)&&!zf(e)?String(e):e,mu=(t,e="")=>{var i;return an(t)?`Symbol(${(i=t.description)!=null?i:e})`:t};/** * @vue/reactivity v3.5.26 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Ci;class Ry{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Ci,!e&&Ci&&(this.index=(Ci.scopes||(Ci.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,i;if(this.scopes)for(e=0,i=this.scopes.length;e0&&--this._on===0&&(Ci=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){this._active=!1;let i,n;for(i=0,n=this.effects.length;i0)return;if(yo){let e=yo;for(yo=void 0;e;){const i=e.next;e.next=void 0,e.flags&=-9,e=i}}let t;for(;go;){let e=go;for(go=void 0;e;){const i=e.next;if(e.next=void 0,e.flags&=-9,e.flags&1)try{e.trigger()}catch(n){t||(t=n)}e=i}}if(t)throw t}function Qm(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveLink=e.dep.activeLink,e.dep.activeLink=e}function ep(t){let e,i=t.depsTail,n=i;for(;n;){const s=n.prevDep;n.version===-1?(n===i&&(i=s),mc(n),Iy(n)):e=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=s}t.deps=e,t.depsTail=i}function Kd(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.version||e.dep.computed&&(tp(e.dep.computed)||e.dep.version!==e.version))return!0;return!!t._dirty}function tp(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===Ao)||(t.globalVersion=Ao,!t.isSSR&&t.flags&128&&(!t.deps&&!t._dirty||!Kd(t))))return;t.flags|=2;const e=t.dep,i=Vt,n=Qi;Vt=t,Qi=!0;try{Qm(t);const s=t.fn(t._value);(e.version===0||ps(s,t._value))&&(t.flags|=128,t._value=s,e.version++)}catch(s){throw e.version++,s}finally{Vt=i,Qi=n,ep(t),t.flags&=-3}}function mc(t,e=!1){const{dep:i,prevSub:n,nextSub:s}=t;if(n&&(n.nextSub=s,t.prevSub=void 0),s&&(s.prevSub=n,t.nextSub=void 0),i.subs===t&&(i.subs=n,!n&&i.computed)){i.computed.flags&=-5;for(let r=i.computed.deps;r;r=r.nextDep)mc(r,!0)}!e&&!--i.sc&&i.map&&i.map.delete(i.key)}function Iy(t){const{prevDep:e,nextDep:i}=t;e&&(e.nextDep=i,t.prevDep=void 0),i&&(i.prevDep=e,t.nextDep=void 0)}let Qi=!0;const ip=[];function qn(){ip.push(Qi),Qi=!1}function jn(){const t=ip.pop();Qi=t===void 0?!0:t}function bh(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const i=Vt;Vt=void 0;try{e()}finally{Vt=i}}}let Ao=0;class Fy{constructor(e,i){this.sub=e,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class pc{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!Vt||!Qi||Vt===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==Vt)i=this.activeLink=new Fy(Vt,this),Vt.deps?(i.prevDep=Vt.depsTail,Vt.depsTail.nextDep=i,Vt.depsTail=i):Vt.deps=Vt.depsTail=i,np(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const n=i.nextDep;n.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=n),i.prevDep=Vt.depsTail,i.nextDep=void 0,Vt.depsTail.nextDep=i,Vt.depsTail=i,Vt.deps===i&&(Vt.deps=n)}return i}trigger(e){this.version++,Ao++,this.notify(e)}notify(e){hc();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{fc()}}}function np(t){if(t.dep.sc++,t.sub.flags&4){const e=t.dep.computed;if(e&&!t.dep.subs){e.flags|=20;for(let n=e.deps;n;n=n.nextDep)np(n)}const i=t.dep.subs;i!==t&&(t.prevSub=i,i&&(i.nextSub=t)),t.dep.subs=t}}const Yd=new WeakMap,$s=Symbol(""),Jd=Symbol(""),Eo=Symbol("");function pi(t,e,i){if(Qi&&Vt){let n=Yd.get(t);n||Yd.set(t,n=new Map);let s=n.get(i);s||(n.set(i,s=new pc),s.map=n,s.key=i),s.track()}}function Bn(t,e,i,n,s,r){const l=Yd.get(t);if(!l){Ao++;return}const o=d=>{d&&d.trigger()};if(hc(),e==="clear")l.forEach(o);else{const d=it(t),u=d&&uc(i);if(d&&i==="length"){const h=Number(n);l.forEach((c,f)=>{(f==="length"||f===Eo||!nn(f)&&f>=h)&&o(c)})}else switch((i!==void 0||l.has(void 0))&&o(l.get(i)),u&&o(l.get(Eo)),e){case"add":d?u&&o(l.get("length")):(o(l.get($s)),Er(t)&&o(l.get(Jd)));break;case"delete":d||(o(l.get($s)),Er(t)&&o(l.get(Jd)));break;case"set":Er(t)&&o(l.get($s));break}}fc()}function Js(t){const e=wt(t);return e===t?e:(pi(e,"iterate",Eo),qi(t)?e:e.map(sn))}function Tl(t){return pi(t=wt(t),"iterate",Eo),t}function ds(t,e){return Xn(t)?Gs(t)?Ur(sn(e)):Ur(e):sn(e)}const Ny={__proto__:null,[Symbol.iterator](){return Wl(this,Symbol.iterator,t=>ds(this,t))},concat(...t){return Js(this).concat(...t.map(e=>it(e)?Js(e):e))},entries(){return Wl(this,"entries",t=>(t[1]=ds(this,t[1]),t))},every(t,e){return Cn(this,"every",t,e,void 0,arguments)},filter(t,e){return Cn(this,"filter",t,e,i=>i.map(n=>ds(this,n)),arguments)},find(t,e){return Cn(this,"find",t,e,i=>ds(this,i),arguments)},findIndex(t,e){return Cn(this,"findIndex",t,e,void 0,arguments)},findLast(t,e){return Cn(this,"findLast",t,e,i=>ds(this,i),arguments)},findLastIndex(t,e){return Cn(this,"findLastIndex",t,e,void 0,arguments)},forEach(t,e){return Cn(this,"forEach",t,e,void 0,arguments)},includes(...t){return ql(this,"includes",t)},indexOf(...t){return ql(this,"indexOf",t)},join(t){return Js(this).join(t)},lastIndexOf(...t){return ql(this,"lastIndexOf",t)},map(t,e){return Cn(this,"map",t,e,void 0,arguments)},pop(){return Kr(this,"pop")},push(...t){return Kr(this,"push",t)},reduce(t,...e){return _h(this,"reduce",t,e)},reduceRight(t,...e){return _h(this,"reduceRight",t,e)},shift(){return Kr(this,"shift")},some(t,e){return Cn(this,"some",t,e,void 0,arguments)},splice(...t){return Kr(this,"splice",t)},toReversed(){return Js(this).toReversed()},toSorted(t){return Js(this).toSorted(t)},toSpliced(...t){return Js(this).toSpliced(...t)},unshift(...t){return Kr(this,"unshift",t)},values(){return Wl(this,"values",t=>ds(this,t))}};function Wl(t,e,i){const n=Tl(t),s=n[e]();return n!==t&&!qi(t)&&(s._next=s.next,s.next=()=>{const r=s._next();return r.done||(r.value=i(r.value)),r}),s}const Oy=Array.prototype;function Cn(t,e,i,n,s,r){const l=Tl(t),o=l!==t&&!qi(t),d=l[e];if(d!==Oy[e]){const c=d.apply(t,r);return o?sn(c):c}let u=i;l!==t&&(o?u=function(c,f){return i.call(this,ds(t,c),f,t)}:i.length>2&&(u=function(c,f){return i.call(this,c,f,t)}));const h=d.call(l,u,n);return o&&s?s(h):h}function _h(t,e,i,n){const s=Tl(t);let r=i;return s!==t&&(qi(t)?i.length>3&&(r=function(l,o,d){return i.call(this,l,o,d,t)}):r=function(l,o,d){return i.call(this,l,ds(t,o),d,t)}),s[e](r,...n)}function ql(t,e,i){const n=wt(t);pi(n,"iterate",Eo);const s=n[e](...i);return(s===-1||s===!1)&&bc(i[0])?(i[0]=wt(i[0]),n[e](...i)):s}function Kr(t,e,i=[]){qn(),hc();const n=wt(t)[e].apply(t,i);return fc(),jn(),n}const Uy=ac("__proto__,__v_isRef,__isVue"),sp=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(nn));function By(t){nn(t)||(t=String(t));const e=wt(this);return pi(e,"has",t),e.hasOwnProperty(t)}class rp{constructor(e=!1,i=!1){this._isReadonly=e,this._isShallow=i}get(e,i,n){if(i==="__v_skip")return e.__v_skip;const s=this._isReadonly,r=this._isShallow;if(i==="__v_isReactive")return!s;if(i==="__v_isReadonly")return s;if(i==="__v_isShallow")return r;if(i==="__v_raw")return n===(s?r?Ky:dp:r?lp:ap).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const l=it(e);if(!s){let d;if(l&&(d=Ny[i]))return d;if(i==="hasOwnProperty")return By}const o=Reflect.get(e,i,bi(e)?e:n);if((nn(i)?sp.has(i):Uy(i))||(s||pi(e,"get",i),r))return o;if(bi(o)){const d=l&&uc(i)?o:o.value;return s&&Ft(d)?Qd(d):d}return Ft(o)?s?Qd(o):yc(o):o}}class op extends rp{constructor(e=!1){super(!1,e)}set(e,i,n,s){let r=e[i];const l=it(e)&&uc(i);if(!this._isShallow){const u=Xn(r);if(!qi(n)&&!Xn(n)&&(r=wt(r),n=wt(n)),!l&&bi(r)&&!bi(n))return u||(r.value=n),!0}const o=l?Number(i)t,Jo=t=>Reflect.getPrototypeOf(t);function Hy(t,e,i){return function(...n){const s=this.__v_raw,r=wt(s),l=Er(r),o=t==="entries"||t===Symbol.iterator&&l,d=t==="keys"&&l,u=s[t](...n),h=i?Zd:e?Ur:sn;return!e&&pi(r,"iterate",d?Jd:$s),{next(){const{value:c,done:f}=u.next();return f?{value:c,done:f}:{value:o?[h(c[0]),h(c[1])]:h(c),done:f}},[Symbol.iterator](){return this}}}}function Zo(t){return function(...e){return t==="delete"?!1:t==="clear"?void 0:this}}function Wy(t,e){const i={get(s){const r=this.__v_raw,l=wt(r),o=wt(s);t||(ps(s,o)&&pi(l,"get",s),pi(l,"get",o));const{has:d}=Jo(l),u=e?Zd:t?Ur:sn;if(d.call(l,s))return u(r.get(s));if(d.call(l,o))return u(r.get(o));r!==l&&r.get(s)},get size(){const s=this.__v_raw;return!t&&pi(wt(s),"iterate",$s),s.size},has(s){const r=this.__v_raw,l=wt(r),o=wt(s);return t||(ps(s,o)&&pi(l,"has",s),pi(l,"has",o)),s===o?r.has(s):r.has(s)||r.has(o)},forEach(s,r){const l=this,o=l.__v_raw,d=wt(o),u=e?Zd:t?Ur:sn;return!t&&pi(d,"iterate",$s),o.forEach((h,c)=>s.call(r,u(h),u(c),l))}};return ci(i,t?{add:Zo("add"),set:Zo("set"),delete:Zo("delete"),clear:Zo("clear")}:{add(s){!e&&!qi(s)&&!Xn(s)&&(s=wt(s));const r=wt(this);return Jo(r).has.call(r,s)||(r.add(s),Bn(r,"add",s,s)),this},set(s,r){!e&&!qi(r)&&!Xn(r)&&(r=wt(r));const l=wt(this),{has:o,get:d}=Jo(l);let u=o.call(l,s);u||(s=wt(s),u=o.call(l,s));const h=d.call(l,s);return l.set(s,r),u?ps(r,h)&&Bn(l,"set",s,r):Bn(l,"add",s,r),this},delete(s){const r=wt(this),{has:l,get:o}=Jo(r);let d=l.call(r,s);d||(s=wt(s),d=l.call(r,s)),o&&o.call(r,s);const u=r.delete(s);return d&&Bn(r,"delete",s,void 0),u},clear(){const s=wt(this),r=s.size!==0,l=s.clear();return r&&Bn(s,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(s=>{i[s]=Hy(s,t,e)}),i}function gc(t,e){const i=Wy(t,e);return(n,s,r)=>s==="__v_isReactive"?!t:s==="__v_isReadonly"?t:s==="__v_raw"?n:Reflect.get(xt(i,s)&&s in n?i:n,s,r)}const qy={get:gc(!1,!1)},jy={get:gc(!1,!0)},Xy={get:gc(!0,!1)};const ap=new WeakMap,lp=new WeakMap,dp=new WeakMap,Ky=new WeakMap;function Yy(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Jy(t){return t.__v_skip||!Object.isExtensible(t)?0:Yy(Sy(t))}function yc(t){return Xn(t)?t:vc(t,!1,zy,qy,ap)}function Zy(t){return vc(t,!1,Gy,jy,lp)}function Qd(t){return vc(t,!0,$y,Xy,dp)}function vc(t,e,i,n,s){if(!Ft(t)||t.__v_raw&&!(e&&t.__v_isReactive))return t;const r=Jy(t);if(r===0)return t;const l=s.get(t);if(l)return l;const o=new Proxy(t,r===2?n:i);return s.set(t,o),o}function Gs(t){return Xn(t)?Gs(t.__v_raw):!!(t&&t.__v_isReactive)}function Xn(t){return!!(t&&t.__v_isReadonly)}function qi(t){return!!(t&&t.__v_isShallow)}function bc(t){return t?!!t.__v_raw:!1}function wt(t){const e=t&&t.__v_raw;return e?wt(e):t}function Qy(t){return!xt(t,"__v_skip")&&Object.isExtensible(t)&&qm(t,"__v_skip",!0),t}const sn=t=>Ft(t)?yc(t):t,Ur=t=>Ft(t)?Qd(t):t;function bi(t){return t?t.__v_isRef===!0:!1}function Qo(t){return ev(t,!1)}function ev(t,e){return bi(t)?t:new tv(t,e)}class tv{constructor(e,i){this.dep=new pc,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?e:wt(e),this._value=i?e:sn(e),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(e){const i=this._rawValue,n=this.__v_isShallow||qi(e)||Xn(e);e=n?e:wt(e),ps(e,i)&&(this._rawValue=e,this._value=n?e:sn(e),this.dep.trigger())}}function iv(t){return bi(t)?t.value:t}const nv={get:(t,e,i)=>e==="__v_raw"?t:iv(Reflect.get(t,e,i)),set:(t,e,i,n)=>{const s=t[e];return bi(s)&&!bi(i)?(s.value=i,!0):Reflect.set(t,e,i,n)}};function up(t){return Gs(t)?t:new Proxy(t,nv)}class sv{constructor(e,i,n){this.fn=e,this.setter=i,this._value=void 0,this.dep=new pc(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ao-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&Vt!==this)return Zm(this,!0),!0}get value(){const e=this.dep.track();return tp(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function rv(t,e,i=!1){let n,s;return ut(t)?n=t:(n=t.get,s=t.set),new sv(n,s,i)}const ea={},tl=new WeakMap;let Ds;function ov(t,e=!1,i=Ds){if(i){let n=tl.get(i);n||tl.set(i,n=[]),n.push(t)}}function av(t,e,i=Ut){const{immediate:n,deep:s,once:r,scheduler:l,augmentJob:o,call:d}=i,u=x=>s?x:qi(x)||s===!1||s===0?Vn(x,1):Vn(x);let h,c,f,g,y=!1,T=!1;if(bi(t)?(c=()=>t.value,y=qi(t)):Gs(t)?(c=()=>u(t),y=!0):it(t)?(T=!0,y=t.some(x=>Gs(x)||qi(x)),c=()=>t.map(x=>{if(bi(x))return x.value;if(Gs(x))return u(x);if(ut(x))return d?d(x,2):x()})):ut(t)?e?c=d?()=>d(t,2):t:c=()=>{if(f){qn();try{f()}finally{jn()}}const x=Ds;Ds=h;try{return d?d(t,3,[g]):t(g)}finally{Ds=x}}:c=Mn,e&&s){const x=c,k=s===!0?1/0:s;c=()=>Vn(x(),k)}const _=Dy(),v=()=>{h.stop(),_&&_.active&&dc(_.effects,h)};if(r&&e){const x=e;e=(...k)=>{x(...k),v()}}let S=T?new Array(t.length).fill(ea):ea;const w=x=>{if(!(!(h.flags&1)||!h.dirty&&!x))if(e){const k=h.run();if(s||y||(T?k.some((E,D)=>ps(E,S[D])):ps(k,S))){f&&f();const E=Ds;Ds=h;try{const D=[k,S===ea?void 0:T&&S[0]===ea?[]:S,g];S=k,d?d(e,3,D):e(...D)}finally{Ds=E}}}else h.run()};return o&&o(w),h=new Ym(c),h.scheduler=l?()=>l(w,!1):w,g=x=>ov(x,!1,h),f=h.onStop=()=>{const x=tl.get(h);if(x){if(d)d(x,4);else for(const k of x)k();tl.delete(h)}},e?n?w(!0):S=h.run():l?l(w.bind(null,!0),!0):h.run(),v.pause=h.pause.bind(h),v.resume=h.resume.bind(h),v.stop=v,v}function Vn(t,e=1/0,i){if(e<=0||!Ft(t)||t.__v_skip||(i=i||new Map,(i.get(t)||0)>=e))return t;if(i.set(t,e),e--,bi(t))Vn(t.value,e,i);else if(it(t))for(let n=0;n{Vn(n,e,i)});else if(Wm(t)){for(const n in t)Vn(t[n],e,i);for(const n of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,n)&&Vn(t[n],e,i)}return t}/** +**/let Li;class Cv{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Li,!e&&Li&&(this.index=(Li.scopes||(Li.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,i;if(this.scopes)for(e=0,i=this.scopes.length;e0&&--this._on===0&&(Li=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){this._active=!1;let i,n;for(i=0,n=this.effects.length;i0)return;if(Do){let e=Do;for(Do=void 0;e;){const i=e.next;e.next=void 0,e.flags&=-9,e=i}}let t;for(;Lo;){let e=Lo;for(Lo=void 0;e;){const i=e.next;if(e.next=void 0,e.flags&=-9,e.flags&1)try{e.trigger()}catch(n){t||(t=n)}e=i}}if(t)throw t}function Kf(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveLink=e.dep.activeLink,e.dep.activeLink=e}function Yf(t){let e,i=t.depsTail,n=i;for(;n;){const s=n.prevDep;n.version===-1?(n===i&&(i=s),Hc(n),kv(n)):e=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=s}t.deps=e,t.depsTail=i}function Sd(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.version||e.dep.computed&&(Jf(e.dep.computed)||e.dep.version!==e.version))return!0;return!!t._dirty}function Jf(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===Ho)||(t.globalVersion=Ho,!t.isSSR&&t.flags&128&&(!t.deps&&!t._dirty||!Sd(t))))return;t.flags|=2;const e=t.dep,i=Gt,n=rn;Gt=t,rn=!0;try{Kf(t);const s=t.fn(t._value);(e.version===0||ws(s,t._value))&&(t.flags|=128,t._value=s,e.version++)}catch(s){throw e.version++,s}finally{Gt=i,rn=n,Yf(t),t.flags&=-3}}function Hc(t,e=!1){const{dep:i,prevSub:n,nextSub:s}=t;if(n&&(n.nextSub=s,t.prevSub=void 0),s&&(s.prevSub=n,t.nextSub=void 0),i.subs===t&&(i.subs=n,!n&&i.computed)){i.computed.flags&=-5;for(let r=i.computed.deps;r;r=r.nextDep)Hc(r,!0)}!e&&!--i.sc&&i.map&&i.map.delete(i.key)}function kv(t){const{prevDep:e,nextDep:i}=t;e&&(e.nextDep=i,t.prevDep=void 0),i&&(i.prevDep=e,t.nextDep=void 0)}let rn=!0;const Zf=[];function Zn(){Zf.push(rn),rn=!1}function Qn(){const t=Zf.pop();rn=t===void 0?!0:t}function nm(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const i=Gt;Gt=void 0;try{e()}finally{Gt=i}}}let Ho=0;class Rv{constructor(e,i){this.sub=e,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Wc{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!Gt||!rn||Gt===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==Gt)i=this.activeLink=new Rv(Gt,this),Gt.deps?(i.prevDep=Gt.depsTail,Gt.depsTail.nextDep=i,Gt.depsTail=i):Gt.deps=Gt.depsTail=i,Qf(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const n=i.nextDep;n.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=n),i.prevDep=Gt.depsTail,i.nextDep=void 0,Gt.depsTail.nextDep=i,Gt.depsTail=i,Gt.deps===i&&(Gt.deps=n)}return i}trigger(e){this.version++,Ho++,this.notify(e)}notify(e){$c();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{Gc()}}}function Qf(t){if(t.dep.sc++,t.sub.flags&4){const e=t.dep.computed;if(e&&!t.dep.subs){e.flags|=20;for(let n=e.deps;n;n=n.nextDep)Qf(n)}const i=t.dep.subs;i!==t&&(t.prevSub=i,i&&(i.nextSub=t)),t.dep.subs=t}}const wd=new WeakMap,Ys=Symbol(""),Md=Symbol(""),Wo=Symbol("");function vi(t,e,i){if(rn&&Gt){let n=wd.get(t);n||wd.set(t,n=new Map);let s=n.get(i);s||(n.set(i,s=new Wc),s.map=n,s.key=i),s.track()}}function jn(t,e,i,n,s,r){const l=wd.get(t);if(!l){Ho++;return}const o=u=>{u&&u.trigger()};if($c(),e==="clear")l.forEach(o);else{const u=nt(t),c=u&&Bc(i);if(u&&i==="length"){const h=Number(n);l.forEach((d,m)=>{(m==="length"||m===Wo||!an(m)&&m>=h)&&o(d)})}else switch((i!==void 0||l.has(void 0))&&o(l.get(i)),c&&o(l.get(Wo)),e){case"add":u?c&&o(l.get("length")):(o(l.get(Ys)),$r(t)&&o(l.get(Md)));break;case"delete":u||(o(l.get(Ys)),$r(t)&&o(l.get(Md)));break;case"set":$r(t)&&o(l.get(Ys));break}}Gc()}function or(t){const e=xt(t);return e===t?e:(vi(e,"iterate",Wo),Ji(t)?e:e.map(ln))}function jl(t){return vi(t=xt(t),"iterate",Wo),t}function gs(t,e){return es(t)?Js(t)?Zr(ln(e)):Zr(e):ln(e)}const Lv={__proto__:null,[Symbol.iterator](){return fu(this,Symbol.iterator,t=>gs(this,t))},concat(...t){return or(this).concat(...t.map(e=>nt(e)?or(e):e))},entries(){return fu(this,"entries",t=>(t[1]=gs(this,t[1]),t))},every(t,e){return On(this,"every",t,e,void 0,arguments)},filter(t,e){return On(this,"filter",t,e,i=>i.map(n=>gs(this,n)),arguments)},find(t,e){return On(this,"find",t,e,i=>gs(this,i),arguments)},findIndex(t,e){return On(this,"findIndex",t,e,void 0,arguments)},findLast(t,e){return On(this,"findLast",t,e,i=>gs(this,i),arguments)},findLastIndex(t,e){return On(this,"findLastIndex",t,e,void 0,arguments)},forEach(t,e){return On(this,"forEach",t,e,void 0,arguments)},includes(...t){return gu(this,"includes",t)},indexOf(...t){return gu(this,"indexOf",t)},join(t){return or(this).join(t)},lastIndexOf(...t){return gu(this,"lastIndexOf",t)},map(t,e){return On(this,"map",t,e,void 0,arguments)},pop(){return lo(this,"pop")},push(...t){return lo(this,"push",t)},reduce(t,...e){return sm(this,"reduce",t,e)},reduceRight(t,...e){return sm(this,"reduceRight",t,e)},shift(){return lo(this,"shift")},some(t,e){return On(this,"some",t,e,void 0,arguments)},splice(...t){return lo(this,"splice",t)},toReversed(){return or(this).toReversed()},toSorted(t){return or(this).toSorted(t)},toSpliced(...t){return or(this).toSpliced(...t)},unshift(...t){return lo(this,"unshift",t)},values(){return fu(this,"values",t=>gs(this,t))}};function fu(t,e,i){const n=jl(t),s=n[e]();return n!==t&&!Ji(t)&&(s._next=s.next,s.next=()=>{const r=s._next();return r.done||(r.value=i(r.value)),r}),s}const Dv=Array.prototype;function On(t,e,i,n,s,r){const l=jl(t),o=l!==t&&!Ji(t),u=l[e];if(u!==Dv[e]){const d=u.apply(t,r);return o?ln(d):d}let c=i;l!==t&&(o?c=function(d,m){return i.call(this,gs(t,d),m,t)}:i.length>2&&(c=function(d,m){return i.call(this,d,m,t)}));const h=u.call(l,c,n);return o&&s?s(h):h}function sm(t,e,i,n){const s=jl(t);let r=i;return s!==t&&(Ji(t)?i.length>3&&(r=function(l,o,u){return i.call(this,l,o,u,t)}):r=function(l,o,u){return i.call(this,l,gs(t,o),u,t)}),s[e](r,...n)}function gu(t,e,i){const n=xt(t);vi(n,"iterate",Wo);const s=n[e](...i);return(s===-1||s===!1)&&Kc(i[0])?(i[0]=xt(i[0]),n[e](...i)):s}function lo(t,e,i=[]){Zn(),$c();const n=xt(t)[e].apply(t,i);return Gc(),Qn(),n}const Iv=Oc("__proto__,__v_isRef,__isVue"),eg=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(an));function Fv(t){an(t)||(t=String(t));const e=xt(this);return vi(e,"has",t),e.hasOwnProperty(t)}class tg{constructor(e=!1,i=!1){this._isReadonly=e,this._isShallow=i}get(e,i,n){if(i==="__v_skip")return e.__v_skip;const s=this._isReadonly,r=this._isShallow;if(i==="__v_isReactive")return!s;if(i==="__v_isReadonly")return s;if(i==="__v_isShallow")return r;if(i==="__v_raw")return n===(s?r?Wv:rg:r?sg:ng).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const l=nt(e);if(!s){let u;if(l&&(u=Lv[i]))return u;if(i==="hasOwnProperty")return Fv}const o=Reflect.get(e,i,wi(e)?e:n);if((an(i)?eg.has(i):Iv(i))||(s||vi(e,"get",i),r))return o;if(wi(o)){const u=l&&Bc(i)?o:o.value;return s&&Ft(u)?Pd(u):u}return Ft(o)?s?Pd(o):jc(o):o}}class ig extends tg{constructor(e=!1){super(!1,e)}set(e,i,n,s){let r=e[i];const l=nt(e)&&Bc(i);if(!this._isShallow){const c=es(r);if(!Ji(n)&&!es(n)&&(r=xt(r),n=xt(n)),!l&&wi(r)&&!wi(n))return c||(r.value=n),!0}const o=l?Number(i)t,ga=t=>Reflect.getPrototypeOf(t);function Bv(t,e,i){return function(...n){const s=this.__v_raw,r=xt(s),l=$r(r),o=t==="entries"||t===Symbol.iterator&&l,u=t==="keys"&&l,c=s[t](...n),h=i?xd:e?Zr:ln;return!e&&vi(r,"iterate",u?Md:Ys),{next(){const{value:d,done:m}=c.next();return m?{value:d,done:m}:{value:o?[h(d[0]),h(d[1])]:h(d),done:m}},[Symbol.iterator](){return this}}}}function ya(t){return function(...e){return t==="delete"?!1:t==="clear"?void 0:this}}function zv(t,e){const i={get(s){const r=this.__v_raw,l=xt(r),o=xt(s);t||(ws(s,o)&&vi(l,"get",s),vi(l,"get",o));const{has:u}=ga(l),c=e?xd:t?Zr:ln;if(u.call(l,s))return c(r.get(s));if(u.call(l,o))return c(r.get(o));r!==l&&r.get(s)},get size(){const s=this.__v_raw;return!t&&vi(xt(s),"iterate",Ys),s.size},has(s){const r=this.__v_raw,l=xt(r),o=xt(s);return t||(ws(s,o)&&vi(l,"has",s),vi(l,"has",o)),s===o?r.has(s):r.has(s)||r.has(o)},forEach(s,r){const l=this,o=l.__v_raw,u=xt(o),c=e?xd:t?Zr:ln;return!t&&vi(u,"iterate",Ys),o.forEach((h,d)=>s.call(r,c(h),c(d),l))}};return pi(i,t?{add:ya("add"),set:ya("set"),delete:ya("delete"),clear:ya("clear")}:{add(s){!e&&!Ji(s)&&!es(s)&&(s=xt(s));const r=xt(this);return ga(r).has.call(r,s)||(r.add(s),jn(r,"add",s,s)),this},set(s,r){!e&&!Ji(r)&&!es(r)&&(r=xt(r));const l=xt(this),{has:o,get:u}=ga(l);let c=o.call(l,s);c||(s=xt(s),c=o.call(l,s));const h=u.call(l,s);return l.set(s,r),c?ws(r,h)&&jn(l,"set",s,r):jn(l,"add",s,r),this},delete(s){const r=xt(this),{has:l,get:o}=ga(r);let u=l.call(r,s);u||(s=xt(s),u=l.call(r,s)),o&&o.call(r,s);const c=r.delete(s);return u&&jn(r,"delete",s,void 0),c},clear(){const s=xt(this),r=s.size!==0,l=s.clear();return r&&jn(s,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(s=>{i[s]=Bv(s,t,e)}),i}function qc(t,e){const i=zv(t,e);return(n,s,r)=>s==="__v_isReactive"?!t:s==="__v_isReadonly"?t:s==="__v_raw"?n:Reflect.get(Ct(i,s)&&s in n?i:n,s,r)}const $v={get:qc(!1,!1)},Gv={get:qc(!1,!0)},Hv={get:qc(!0,!1)};const ng=new WeakMap,sg=new WeakMap,rg=new WeakMap,Wv=new WeakMap;function qv(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function jv(t){return t.__v_skip||!Object.isExtensible(t)?0:qv(yv(t))}function jc(t){return es(t)?t:Xc(t,!1,Ov,$v,ng)}function Xv(t){return Xc(t,!1,Vv,Gv,sg)}function Pd(t){return Xc(t,!0,Uv,Hv,rg)}function Xc(t,e,i,n,s){if(!Ft(t)||t.__v_raw&&!(e&&t.__v_isReactive))return t;const r=jv(t);if(r===0)return t;const l=s.get(t);if(l)return l;const o=new Proxy(t,r===2?n:i);return s.set(t,o),o}function Js(t){return es(t)?Js(t.__v_raw):!!(t&&t.__v_isReactive)}function es(t){return!!(t&&t.__v_isReadonly)}function Ji(t){return!!(t&&t.__v_isShallow)}function Kc(t){return t?!!t.__v_raw:!1}function xt(t){const e=t&&t.__v_raw;return e?xt(e):t}function Kv(t){return!Ct(t,"__v_skip")&&Object.isExtensible(t)&&$f(t,"__v_skip",!0),t}const ln=t=>Ft(t)?jc(t):t,Zr=t=>Ft(t)?Pd(t):t;function wi(t){return t?t.__v_isRef===!0:!1}function va(t){return Yv(t,!1)}function Yv(t,e){return wi(t)?t:new Jv(t,e)}class Jv{constructor(e,i){this.dep=new Wc,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?e:xt(e),this._value=i?e:ln(e),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(e){const i=this._rawValue,n=this.__v_isShallow||Ji(e)||es(e);e=n?e:xt(e),ws(e,i)&&(this._rawValue=e,this._value=n?e:ln(e),this.dep.trigger())}}function Zv(t){return wi(t)?t.value:t}const Qv={get:(t,e,i)=>e==="__v_raw"?t:Zv(Reflect.get(t,e,i)),set:(t,e,i,n)=>{const s=t[e];return wi(s)&&!wi(i)?(s.value=i,!0):Reflect.set(t,e,i,n)}};function og(t){return Js(t)?t:new Proxy(t,Qv)}class eb{constructor(e,i,n){this.fn=e,this.setter=i,this._value=void 0,this.dep=new Wc(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ho-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&Gt!==this)return Xf(this,!0),!0}get value(){const e=this.dep.track();return Jf(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function tb(t,e,i=!1){let n,s;return lt(t)?n=t:(n=t.get,s=t.set),new eb(n,s,i)}const ba={},Sl=new WeakMap;let Bs;function ib(t,e=!1,i=Bs){if(i){let n=Sl.get(i);n||Sl.set(i,n=[]),n.push(t)}}function nb(t,e,i=Vt){const{immediate:n,deep:s,once:r,scheduler:l,augmentJob:o,call:u}=i,c=M=>s?M:Ji(M)||s===!1||s===0?Xn(M,1):Xn(M);let h,d,m,g,b=!1,w=!1;if(wi(t)?(d=()=>t.value,b=Ji(t)):Js(t)?(d=()=>c(t),b=!0):nt(t)?(w=!0,b=t.some(M=>Js(M)||Ji(M)),d=()=>t.map(M=>{if(wi(M))return M.value;if(Js(M))return c(M);if(lt(M))return u?u(M,2):M()})):lt(t)?e?d=u?()=>u(t,2):t:d=()=>{if(m){Zn();try{m()}finally{Qn()}}const M=Bs;Bs=h;try{return u?u(t,3,[g]):t(g)}finally{Bs=M}}:d=En,e&&s){const M=d,k=s===!0?1/0:s;d=()=>Xn(M(),k)}const v=Ev(),y=()=>{h.stop(),v&&v.active&&Vc(v.effects,h)};if(r&&e){const M=e;e=(...k)=>{M(...k),y()}}let S=w?new Array(t.length).fill(ba):ba;const P=M=>{if(!(!(h.flags&1)||!h.dirty&&!M))if(e){const k=h.run();if(s||b||(w?k.some((C,L)=>ws(C,S[L])):ws(k,S))){m&&m();const C=Bs;Bs=h;try{const L=[k,S===ba?void 0:w&&S[0]===ba?[]:S,g];S=k,u?u(e,3,L):e(...L)}finally{Bs=C}}}else h.run()};return o&&o(P),h=new qf(d),h.scheduler=l?()=>l(P,!1):P,g=M=>ib(M,!1,h),m=h.onStop=()=>{const M=Sl.get(h);if(M){if(u)u(M,4);else for(const k of M)k();Sl.delete(h)}},e?n?P(!0):S=h.run():l?l(P.bind(null,!0),!0):h.run(),y.pause=h.pause.bind(h),y.resume=h.resume.bind(h),y.stop=y,y}function Xn(t,e=1/0,i){if(e<=0||!Ft(t)||t.__v_skip||(i=i||new Map,(i.get(t)||0)>=e))return t;if(i.set(t,e),e--,wi(t))Xn(t.value,e,i);else if(nt(t))for(let n=0;n{Xn(n,e,i)});else if(zf(t)){for(const n in t)Xn(t[n],e,i);for(const n of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,n)&&Xn(t[n],e,i)}return t}/** * @vue/runtime-core v3.5.26 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function qo(t,e,i,n){try{return n?t(...n):t()}catch(s){Al(s,e,i)}}function rn(t,e,i,n){if(ut(t)){const s=qo(t,e,i,n);return s&&Gm(s)&&s.catch(r=>{Al(r,e,i)}),s}if(it(t)){const s=[];for(let r=0;r>>1,s=Mi[n],r=Co(s);r=Co(i)?Mi.push(t):Mi.splice(dv(e),0,t),t.flags|=1,hp()}}function hp(){il||(il=cp.then(mp))}function uv(t){it(t)?Cr.push(...t):us&&t.id===-1?us.splice(xr+1,0,t):t.flags&1||(Cr.push(t),t.flags|=1),hp()}function Sh(t,e,i=gn+1){for(;iCo(i)-Co(n));if(Cr.length=0,us){us.push(...e);return}for(us=e,xr=0;xrt.id==null?t.flags&2?-1:1/0:t.id;function mp(t){try{for(gn=0;gn{n._d&&ol(-1);const r=nl(e);let l;try{l=t(...s)}finally{nl(r),n._d&&ol(1)}return l};return n._n=!0,n._c=!0,n._d=!0,n}function J(t,e){if(li===null)return t;const i=Rl(li),n=t.dirs||(t.dirs=[]);for(let s=0;s1)return i&&ut(e)?e.call(n&&n.proxy):e}}const hv=Symbol.for("v-scx"),fv=()=>kr(hv);function vo(t,e,i){return gp(t,e,i)}function gp(t,e,i=Ut){const{immediate:n,deep:s,flush:r,once:l}=i,o=ci({},i),d=e&&n||!e&&r!=="post";let u;if(Do){if(r==="sync"){const g=fv();u=g.__watcherHandles||(g.__watcherHandles=[])}else if(!d){const g=()=>{};return g.stop=Mn,g.resume=Mn,g.pause=Mn,g}}const h=yi;o.call=(g,y,T)=>rn(g,h,y,T);let c=!1;r==="post"?o.scheduler=g=>{Fi(g,h&&h.suspense)}:r!=="sync"&&(c=!0,o.scheduler=(g,y)=>{y?g():Sc(g)}),o.augmentJob=g=>{e&&(g.flags|=4),c&&(g.flags|=2,h&&(g.id=h.uid,g.i=h))};const f=av(t,e,o);return Do&&(u?u.push(f):d&&f()),f}function mv(t,e,i){const n=this.proxy,s=Xt(t)?t.includes(".")?yp(n,t):()=>n[t]:t.bind(n,n);let r;ut(e)?r=e:(r=e.handler,i=e);const l=jo(this),o=gp(s,r.bind(n),i);return l(),o}function yp(t,e){const i=e.split(".");return()=>{let n=t;for(let s=0;st.__isTeleport,On=Symbol("_leaveCb"),ta=Symbol("_enterCb");function gv(){const t={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return wc(()=>{t.isMounted=!0}),Mc(()=>{t.isUnmounting=!0}),t}const zi=[Function,Array],bp={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:zi,onEnter:zi,onAfterEnter:zi,onEnterCancelled:zi,onBeforeLeave:zi,onLeave:zi,onAfterLeave:zi,onLeaveCancelled:zi,onBeforeAppear:zi,onAppear:zi,onAfterAppear:zi,onAppearCancelled:zi},_p=t=>{const e=t.subTree;return e.component?_p(e.component):e},yv={name:"BaseTransition",props:bp,setup(t,{slots:e}){const i=qp(),n=gv();return()=>{const s=e.default&&Mp(e.default(),!0);if(!s||!s.length)return;const r=Sp(s),l=wt(t),{mode:o}=l;if(n.isLeaving)return jl(r);const d=wh(r);if(!d)return jl(r);let u=eu(d,l,n,i,c=>u=c);d.type!==gi&&ko(d,u);let h=i.subTree&&wh(i.subTree);if(h&&h.type!==gi&&!Is(h,d)&&_p(i).type!==gi){let c=eu(h,l,n,i);if(ko(h,c),o==="out-in"&&d.type!==gi)return n.isLeaving=!0,c.afterLeave=()=>{n.isLeaving=!1,i.job.flags&8||i.update(),delete c.afterLeave,h=void 0},jl(r);o==="in-out"&&d.type!==gi?c.delayLeave=(f,g,y)=>{const T=wp(n,h);T[String(h.key)]=h,f[On]=()=>{g(),f[On]=void 0,delete u.delayedLeave,h=void 0},u.delayedLeave=()=>{y(),delete u.delayedLeave,h=void 0}}:h=void 0}else h&&(h=void 0);return r}}};function Sp(t){let e=t[0];if(t.length>1){for(const i of t)if(i.type!==gi){e=i;break}}return e}const vv=yv;function wp(t,e){const{leavingVNodes:i}=t;let n=i.get(e.type);return n||(n=Object.create(null),i.set(e.type,n)),n}function eu(t,e,i,n,s){const{appear:r,mode:l,persisted:o=!1,onBeforeEnter:d,onEnter:u,onAfterEnter:h,onEnterCancelled:c,onBeforeLeave:f,onLeave:g,onAfterLeave:y,onLeaveCancelled:T,onBeforeAppear:_,onAppear:v,onAfterAppear:S,onAppearCancelled:w}=e,x=String(t.key),k=wp(i,t),E=(M,F)=>{M&&rn(M,n,9,F)},D=(M,F)=>{const I=F[1];E(M,F),it(M)?M.every(C=>C.length<=1)&&I():M.length<=1&&I()},P={mode:l,persisted:o,beforeEnter(M){let F=d;if(!i.isMounted)if(r)F=_||d;else return;M[On]&&M[On](!0);const I=k[x];I&&Is(t,I)&&I.el[On]&&I.el[On](),E(F,[M])},enter(M){let F=u,I=h,C=c;if(!i.isMounted)if(r)F=v||u,I=S||h,C=w||c;else return;let z=!1;const K=M[ta]=$=>{z||(z=!0,$?E(C,[M]):E(I,[M]),P.delayedLeave&&P.delayedLeave(),M[ta]=void 0)};F?D(F,[M,K]):K()},leave(M,F){const I=String(t.key);if(M[ta]&&M[ta](!0),i.isUnmounting)return F();E(f,[M]);let C=!1;const z=M[On]=K=>{C||(C=!0,F(),K?E(T,[M]):E(y,[M]),M[On]=void 0,k[I]===t&&delete k[I])};k[I]=t,g?D(g,[M,z]):z()},clone(M){const F=eu(M,e,i,n,s);return s&&s(F),F}};return P}function jl(t){if(El(t))return t=gs(t),t.children=null,t}function wh(t){if(!El(t))return vp(t.type)&&t.children?Sp(t.children):t;if(t.component)return t.component.subTree;const{shapeFlag:e,children:i}=t;if(i){if(e&16)return i[0];if(e&32&&ut(i.default))return i.default()}}function ko(t,e){t.shapeFlag&6&&t.component?(t.transition=e,ko(t.component.subTree,e)):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function Mp(t,e=!1,i){let n=[],s=0;for(let r=0;r1)for(let r=0;rbo(y,e&&(it(e)?e[T]:e),i,n,s));return}if(Lr(n)&&!s){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&bo(t,e,i,n.component.subTree);return}const r=n.shapeFlag&4?Rl(n.component):n.el,l=s?null:r,{i:o,r:d}=t,u=e&&e.r,h=o.refs===Ut?o.refs={}:o.refs,c=o.setupState,f=wt(c),g=c===Ut?$m:y=>xt(f,y);if(u!=null&&u!==d){if(Mh(e),Xt(u))h[u]=null,g(u)&&(c[u]=null);else if(bi(u)){u.value=null;const y=e;y.k&&(h[y.k]=null)}}if(ut(d))qo(d,o,12,[l,h]);else{const y=Xt(d),T=bi(d);if(y||T){const _=()=>{if(t.f){const v=y?g(d)?c[d]:h[d]:d.value;if(s)it(v)&&dc(v,r);else if(it(v))v.includes(r)||v.push(r);else if(y)h[d]=[r],g(d)&&(c[d]=h[d]);else{const S=[r];d.value=S,t.k&&(h[t.k]=S)}}else y?(h[d]=l,g(d)&&(c[d]=l)):T&&(d.value=l,t.k&&(h[t.k]=l))};if(l){const v=()=>{_(),sl.delete(t)};v.id=-1,sl.set(t,v),Fi(v,i)}else Mh(t),_()}}}function Mh(t){const e=sl.get(t);e&&(e.flags|=8,sl.delete(t))}xl().requestIdleCallback;xl().cancelIdleCallback;const Lr=t=>!!t.type.__asyncLoader,El=t=>t.type.__isKeepAlive;function bv(t,e){xp(t,"a",e)}function _v(t,e){xp(t,"da",e)}function xp(t,e,i=yi){const n=t.__wdc||(t.__wdc=()=>{let s=i;for(;s;){if(s.isDeactivated)return;s=s.parent}return t()});if(Cl(e,n,i),i){let s=i.parent;for(;s&&s.parent;)El(s.parent.vnode)&&Sv(n,e,i,s),s=s.parent}}function Sv(t,e,i,n){const s=Cl(e,t,n,!0);Tp(()=>{dc(n[e],s)},i)}function Cl(t,e,i=yi,n=!1){if(i){const s=i[t]||(i[t]=[]),r=e.__weh||(e.__weh=(...l)=>{qn();const o=jo(i),d=rn(e,i,t,l);return o(),jn(),d});return n?s.unshift(r):s.push(r),r}}const Jn=t=>(e,i=yi)=>{(!Do||t==="sp")&&Cl(t,(...n)=>e(...n),i)},wv=Jn("bm"),wc=Jn("m"),Mv=Jn("bu"),Pv=Jn("u"),Mc=Jn("bum"),Tp=Jn("um"),xv=Jn("sp"),Tv=Jn("rtg"),Av=Jn("rtc");function Ev(t,e=yi){Cl("ec",t,e)}const Cv="components";function Ne(t,e){return Lv(Cv,t,!0,e)||t}const kv=Symbol.for("v-ndc");function Lv(t,e,i=!0,n=!1){const s=li||yi;if(s){const r=s.type;{const o=pb(r,!1);if(o&&(o===e||o===ji(e)||o===Ml(ji(e))))return r}const l=Ph(s[t]||r[t],e)||Ph(s.appContext[t],e);return!l&&n?r:l}}function Ph(t,e){return t&&(t[e]||t[ji(e)]||t[Ml(ji(e))])}function oe(t,e,i,n){let s;const r=i,l=it(t);if(l||Xt(t)){const o=l&&Gs(t);let d=!1,u=!1;o&&(d=!qi(t),u=Xn(t),t=Tl(t)),s=new Array(t.length);for(let h=0,c=t.length;he(o,d,void 0,r));else{const o=Object.keys(t);s=new Array(o.length);for(let d=0,u=o.length;d0;return e!=="default"&&(i.name=e),m(),at(H,null,[ve("slot",i,n)],u?-2:64)}let r=t[e];r&&r._c&&(r._d=!1),m();const l=r&&Ap(r(i)),o=i.key||l&&l.key,d=at(H,{key:(o&&!nn(o)?o:`_${e}`)+(!l&&n?"_fb":"")},l||[],l&&t._===1?64:-2);return!s&&d.scopeId&&(d.slotScopeIds=[d.scopeId+"-s"]),r&&r._c&&(r._d=!0),d}function Ap(t){return t.some(e=>Ro(e)?!(e.type===gi||e.type===H&&!Ap(e.children)):!0)?t:null}const tu=t=>t?jp(t)?Rl(t):tu(t.parent):null,So=ci(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>tu(t.parent),$root:t=>tu(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>Cp(t),$forceUpdate:t=>t.f||(t.f=()=>{Sc(t.update)}),$nextTick:t=>t.n||(t.n=_c.bind(t.proxy)),$watch:t=>mv.bind(t)}),Xl=(t,e)=>t!==Ut&&!t.__isScriptSetup&&xt(t,e),Rv={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:i,setupState:n,data:s,props:r,accessCache:l,type:o,appContext:d}=t;if(e[0]!=="$"){const f=l[e];if(f!==void 0)switch(f){case 1:return n[e];case 2:return s[e];case 4:return i[e];case 3:return r[e]}else{if(Xl(n,e))return l[e]=1,n[e];if(s!==Ut&&xt(s,e))return l[e]=2,s[e];if(xt(r,e))return l[e]=3,r[e];if(i!==Ut&&xt(i,e))return l[e]=4,i[e];iu&&(l[e]=0)}}const u=So[e];let h,c;if(u)return e==="$attrs"&&pi(t.attrs,"get",""),u(t);if((h=o.__cssModules)&&(h=h[e]))return h;if(i!==Ut&&xt(i,e))return l[e]=4,i[e];if(c=d.config.globalProperties,xt(c,e))return c[e]},set({_:t},e,i){const{data:n,setupState:s,ctx:r}=t;return Xl(s,e)?(s[e]=i,!0):n!==Ut&&xt(n,e)?(n[e]=i,!0):xt(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(r[e]=i,!0)},has({_:{data:t,setupState:e,accessCache:i,ctx:n,appContext:s,props:r,type:l}},o){let d;return!!(i[o]||t!==Ut&&o[0]!=="$"&&xt(t,o)||Xl(e,o)||xt(r,o)||xt(n,o)||xt(So,o)||xt(s.config.globalProperties,o)||(d=l.__cssModules)&&d[o])},defineProperty(t,e,i){return i.get!=null?t._.accessCache[e]=0:xt(i,"value")&&this.set(t,e,i.value,null),Reflect.defineProperty(t,e,i)}};function xh(t){return it(t)?t.reduce((e,i)=>(e[i]=null,e),{}):t}let iu=!0;function Dv(t){const e=Cp(t),i=t.proxy,n=t.ctx;iu=!1,e.beforeCreate&&Th(e.beforeCreate,t,"bc");const{data:s,computed:r,methods:l,watch:o,provide:d,inject:u,created:h,beforeMount:c,mounted:f,beforeUpdate:g,updated:y,activated:T,deactivated:_,beforeDestroy:v,beforeUnmount:S,destroyed:w,unmounted:x,render:k,renderTracked:E,renderTriggered:D,errorCaptured:P,serverPrefetch:M,expose:F,inheritAttrs:I,components:C,directives:z,filters:K}=e;if(u&&Iv(u,n,null),l)for(const q in l){const te=l[q];ut(te)&&(n[q]=te.bind(i))}if(s){const q=s.call(i,i);Ft(q)&&(t.data=yc(q))}if(iu=!0,r)for(const q in r){const te=r[q],he=ut(te)?te.bind(i,i):ut(te.get)?te.get.bind(i,i):Mn,Pe=!ut(te)&&ut(te.set)?te.set.bind(i):Mn,Ee=qa({get:he,set:Pe});Object.defineProperty(n,q,{enumerable:!0,configurable:!0,get:()=>Ee.value,set:Ie=>Ee.value=Ie})}if(o)for(const q in o)Ep(o[q],n,i,q);if(d){const q=ut(d)?d.call(i):d;Reflect.ownKeys(q).forEach(te=>{cv(te,q[te])})}h&&Th(h,t,"c");function W(q,te){it(te)?te.forEach(he=>q(he.bind(i))):te&&q(te.bind(i))}if(W(wv,c),W(wc,f),W(Mv,g),W(Pv,y),W(bv,T),W(_v,_),W(Ev,P),W(Av,E),W(Tv,D),W(Mc,S),W(Tp,x),W(xv,M),it(F))if(F.length){const q=t.exposed||(t.exposed={});F.forEach(te=>{Object.defineProperty(q,te,{get:()=>i[te],set:he=>i[te]=he,enumerable:!0})})}else t.exposed||(t.exposed={});k&&t.render===Mn&&(t.render=k),I!=null&&(t.inheritAttrs=I),C&&(t.components=C),z&&(t.directives=z),M&&Pp(t)}function Iv(t,e,i=Mn){it(t)&&(t=nu(t));for(const n in t){const s=t[n];let r;Ft(s)?"default"in s?r=kr(s.from||n,s.default,!0):r=kr(s.from||n):r=kr(s),bi(r)?Object.defineProperty(e,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):e[n]=r}}function Th(t,e,i){rn(it(t)?t.map(n=>n.bind(e.proxy)):t.bind(e.proxy),e,i)}function Ep(t,e,i,n){let s=n.includes(".")?yp(i,n):()=>i[n];if(Xt(t)){const r=e[t];ut(r)&&vo(s,r)}else if(ut(t))vo(s,t.bind(i));else if(Ft(t))if(it(t))t.forEach(r=>Ep(r,e,i,n));else{const r=ut(t.handler)?t.handler.bind(i):e[t.handler];ut(r)&&vo(s,r,t)}}function Cp(t){const e=t.type,{mixins:i,extends:n}=e,{mixins:s,optionsCache:r,config:{optionMergeStrategies:l}}=t.appContext,o=r.get(e);let d;return o?d=o:!s.length&&!i&&!n?d=e:(d={},s.length&&s.forEach(u=>rl(d,u,l,!0)),rl(d,e,l)),Ft(e)&&r.set(e,d),d}function rl(t,e,i,n=!1){const{mixins:s,extends:r}=e;r&&rl(t,r,i,!0),s&&s.forEach(l=>rl(t,l,i,!0));for(const l in e)if(!(n&&l==="expose")){const o=Fv[l]||i&&i[l];t[l]=o?o(t[l],e[l]):e[l]}return t}const Fv={data:Ah,props:Eh,emits:Eh,methods:ho,computed:ho,beforeCreate:Si,created:Si,beforeMount:Si,mounted:Si,beforeUpdate:Si,updated:Si,beforeDestroy:Si,beforeUnmount:Si,destroyed:Si,unmounted:Si,activated:Si,deactivated:Si,errorCaptured:Si,serverPrefetch:Si,components:ho,directives:ho,watch:Ov,provide:Ah,inject:Nv};function Ah(t,e){return e?t?function(){return ci(ut(t)?t.call(this,this):t,ut(e)?e.call(this,this):e)}:e:t}function Nv(t,e){return ho(nu(t),nu(e))}function nu(t){if(it(t)){const e={};for(let i=0;ie==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${ji(e)}Modifiers`]||t[`${vs(e)}Modifiers`];function zv(t,e,...i){if(t.isUnmounted)return;const n=t.vnode.props||Ut;let s=i;const r=e.startsWith("update:"),l=r&&Vv(n,e.slice(7));l&&(l.trim&&(s=i.map(h=>Xt(h)?h.trim():h)),l.number&&(s=i.map(Pl)));let o,d=n[o=$l(e)]||n[o=$l(ji(e))];!d&&r&&(d=n[o=$l(vs(e))]),d&&rn(d,t,6,s);const u=n[o+"Once"];if(u){if(!t.emitted)t.emitted={};else if(t.emitted[o])return;t.emitted[o]=!0,rn(u,t,6,s)}}const $v=new WeakMap;function Lp(t,e,i=!1){const n=i?$v:e.emitsCache,s=n.get(t);if(s!==void 0)return s;const r=t.emits;let l={},o=!1;if(!ut(t)){const d=u=>{const h=Lp(u,e,!0);h&&(o=!0,ci(l,h))};!i&&e.mixins.length&&e.mixins.forEach(d),t.extends&&d(t.extends),t.mixins&&t.mixins.forEach(d)}return!r&&!o?(Ft(t)&&n.set(t,null),null):(it(r)?r.forEach(d=>l[d]=null):ci(l,r),Ft(t)&&n.set(t,l),l)}function kl(t,e){return!t||!Sl(e)?!1:(e=e.slice(2).replace(/Once$/,""),xt(t,e[0].toLowerCase()+e.slice(1))||xt(t,vs(e))||xt(t,e))}function Ch(t){const{type:e,vnode:i,proxy:n,withProxy:s,propsOptions:[r],slots:l,attrs:o,emit:d,render:u,renderCache:h,props:c,data:f,setupState:g,ctx:y,inheritAttrs:T}=t,_=nl(t);let v,S;try{if(i.shapeFlag&4){const x=s||n,k=x;v=yn(u.call(k,x,h,c,g,f,y)),S=o}else{const x=e;v=yn(x.length>1?x(c,{attrs:o,slots:l,emit:d}):x(c,null)),S=e.props?o:Gv(o)}}catch(x){wo.length=0,Al(x,t,1),v=ve(gi)}let w=v;if(S&&T!==!1){const x=Object.keys(S),{shapeFlag:k}=w;x.length&&k&7&&(r&&x.some(lc)&&(S=Hv(S,r)),w=gs(w,S,!1,!0))}return i.dirs&&(w=gs(w,null,!1,!0),w.dirs=w.dirs?w.dirs.concat(i.dirs):i.dirs),i.transition&&ko(w,i.transition),v=w,nl(_),v}const Gv=t=>{let e;for(const i in t)(i==="class"||i==="style"||Sl(i))&&((e||(e={}))[i]=t[i]);return e},Hv=(t,e)=>{const i={};for(const n in t)(!lc(n)||!(n.slice(9)in e))&&(i[n]=t[n]);return i};function Wv(t,e,i){const{props:n,children:s,component:r}=t,{props:l,children:o,patchFlag:d}=e,u=r.emitsOptions;if(e.dirs||e.transition)return!0;if(i&&d>=0){if(d&1024)return!0;if(d&16)return n?kh(n,l,u):!!l;if(d&8){const h=e.dynamicProps;for(let c=0;cObject.create(Rp),Ip=t=>Object.getPrototypeOf(t)===Rp;function jv(t,e,i,n=!1){const s={},r=Dp();t.propsDefaults=Object.create(null),Fp(t,e,s,r);for(const l in t.propsOptions[0])l in s||(s[l]=void 0);i?t.props=n?s:Zy(s):t.type.props?t.props=s:t.props=r,t.attrs=r}function Xv(t,e,i,n){const{props:s,attrs:r,vnode:{patchFlag:l}}=t,o=wt(s),[d]=t.propsOptions;let u=!1;if((n||l>0)&&!(l&16)){if(l&8){const h=t.vnode.dynamicProps;for(let c=0;c{d=!0;const[f,g]=Np(c,e,!0);ci(l,f),g&&o.push(...g)};!i&&e.mixins.length&&e.mixins.forEach(h),t.extends&&h(t.extends),t.mixins&&t.mixins.forEach(h)}if(!r&&!d)return Ft(t)&&n.set(t,Ar),Ar;if(it(r))for(let h=0;ht==="_"||t==="_ctx"||t==="$stable",xc=t=>it(t)?t.map(yn):[yn(t)],Yv=(t,e,i)=>{if(e._n)return e;const n=Ni((...s)=>xc(e(...s)),i);return n._c=!1,n},Op=(t,e,i)=>{const n=t._ctx;for(const s in t){if(Pc(s))continue;const r=t[s];if(ut(r))e[s]=Yv(s,r,n);else if(r!=null){const l=xc(r);e[s]=()=>l}}},Up=(t,e)=>{const i=xc(e);t.slots.default=()=>i},Bp=(t,e,i)=>{for(const n in e)(i||!Pc(n))&&(t[n]=e[n])},Jv=(t,e,i)=>{const n=t.slots=Dp();if(t.vnode.shapeFlag&32){const s=e._;s?(Bp(n,e,i),i&&qm(n,"_",s,!0)):Op(e,n)}else e&&Up(t,e)},Zv=(t,e,i)=>{const{vnode:n,slots:s}=t;let r=!0,l=Ut;if(n.shapeFlag&32){const o=e._;o?i&&o===1?r=!1:Bp(s,e,i):(r=!e.$stable,Op(e,s)),l=e}else e&&(Up(t,e),l={default:1});if(r)for(const o in s)!Pc(o)&&l[o]==null&&delete s[o]},Fi=nb;function Qv(t){return eb(t)}function eb(t,e){const i=xl();i.__VUE__=!0;const{insert:n,remove:s,patchProp:r,createElement:l,createText:o,createComment:d,setText:u,setElementText:h,parentNode:c,nextSibling:f,setScopeId:g=Mn,insertStaticContent:y}=t,T=(U,G,Q,ue=null,se=null,fe=null,_e=void 0,xe=null,O=!!G.dynamicChildren)=>{if(U===G)return;U&&!Is(U,G)&&(ue=ke(U),Ie(U,se,fe,!0),U=null),G.patchFlag===-2&&(O=!1,G.dynamicChildren=null);const{type:me,ref:Ce,shapeFlag:Se}=G;switch(me){case Ll:_(U,G,Q,ue);break;case gi:v(U,G,Q,ue);break;case Ha:U==null&&S(G,Q,ue,_e);break;case H:C(U,G,Q,ue,se,fe,_e,xe,O);break;default:Se&1?k(U,G,Q,ue,se,fe,_e,xe,O):Se&6?z(U,G,Q,ue,se,fe,_e,xe,O):(Se&64||Se&128)&&me.process(U,G,Q,ue,se,fe,_e,xe,O,et)}Ce!=null&&se?bo(Ce,U&&U.ref,fe,G||U,!G):Ce==null&&U&&U.ref!=null&&bo(U.ref,null,fe,U,!0)},_=(U,G,Q,ue)=>{if(U==null)n(G.el=o(G.children),Q,ue);else{const se=G.el=U.el;G.children!==U.children&&u(se,G.children)}},v=(U,G,Q,ue)=>{U==null?n(G.el=d(G.children||""),Q,ue):G.el=U.el},S=(U,G,Q,ue)=>{[U.el,U.anchor]=y(U.children,G,Q,ue,U.el,U.anchor)},w=({el:U,anchor:G},Q,ue)=>{let se;for(;U&&U!==G;)se=f(U),n(U,Q,ue),U=se;n(G,Q,ue)},x=({el:U,anchor:G})=>{let Q;for(;U&&U!==G;)Q=f(U),s(U),U=Q;s(G)},k=(U,G,Q,ue,se,fe,_e,xe,O)=>{if(G.type==="svg"?_e="svg":G.type==="math"&&(_e="mathml"),U==null)E(G,Q,ue,se,fe,_e,xe,O);else{const me=U.el&&U.el._isVueCE?U.el:null;try{me&&me._beginPatch(),M(U,G,se,fe,_e,xe,O)}finally{me&&me._endPatch()}}},E=(U,G,Q,ue,se,fe,_e,xe)=>{let O,me;const{props:Ce,shapeFlag:Se,transition:le,dirs:Ge}=U;if(O=U.el=l(U.type,fe,Ce&&Ce.is,Ce),Se&8?h(O,U.children):Se&16&&P(U.children,O,null,ue,se,Kl(U,fe),_e,xe),Ge&&Ms(U,null,ue,"created"),D(O,U,U.scopeId,_e,ue),Ce){for(const A in Ce)A!=="value"&&!po(A)&&r(O,A,null,Ce[A],fe,ue);"value"in Ce&&r(O,"value",null,Ce.value,fe),(me=Ce.onVnodeBeforeMount)&&ln(me,ue,U)}Ge&&Ms(U,null,ue,"beforeMount");const R=tb(se,le);R&&le.beforeEnter(O),n(O,G,Q),((me=Ce&&Ce.onVnodeMounted)||R||Ge)&&Fi(()=>{me&&ln(me,ue,U),R&&le.enter(O),Ge&&Ms(U,null,ue,"mounted")},se)},D=(U,G,Q,ue,se)=>{if(Q&&g(U,Q),ue)for(let fe=0;fe{for(let me=O;me{const xe=G.el=U.el;let{patchFlag:O,dynamicChildren:me,dirs:Ce}=G;O|=U.patchFlag&16;const Se=U.props||Ut,le=G.props||Ut;let Ge;if(Q&&Ps(Q,!1),(Ge=le.onVnodeBeforeUpdate)&&ln(Ge,Q,G,U),Ce&&Ms(G,U,Q,"beforeUpdate"),Q&&Ps(Q,!0),(Se.innerHTML&&le.innerHTML==null||Se.textContent&&le.textContent==null)&&h(xe,""),me?F(U.dynamicChildren,me,xe,Q,ue,Kl(G,se),fe):_e||te(U,G,xe,null,Q,ue,Kl(G,se),fe,!1),O>0){if(O&16)I(xe,Se,le,Q,se);else if(O&2&&Se.class!==le.class&&r(xe,"class",null,le.class,se),O&4&&r(xe,"style",Se.style,le.style,se),O&8){const R=G.dynamicProps;for(let A=0;A{Ge&&ln(Ge,Q,G,U),Ce&&Ms(G,U,Q,"updated")},ue)},F=(U,G,Q,ue,se,fe,_e)=>{for(let xe=0;xe{if(G!==Q){if(G!==Ut)for(const fe in G)!po(fe)&&!(fe in Q)&&r(U,fe,G[fe],null,se,ue);for(const fe in Q){if(po(fe))continue;const _e=Q[fe],xe=G[fe];_e!==xe&&fe!=="value"&&r(U,fe,xe,_e,se,ue)}"value"in Q&&r(U,"value",G.value,Q.value,se)}},C=(U,G,Q,ue,se,fe,_e,xe,O)=>{const me=G.el=U?U.el:o(""),Ce=G.anchor=U?U.anchor:o("");let{patchFlag:Se,dynamicChildren:le,slotScopeIds:Ge}=G;Ge&&(xe=xe?xe.concat(Ge):Ge),U==null?(n(me,Q,ue),n(Ce,Q,ue),P(G.children||[],Q,Ce,se,fe,_e,xe,O)):Se>0&&Se&64&&le&&U.dynamicChildren&&U.dynamicChildren.length===le.length?(F(U.dynamicChildren,le,Q,se,fe,_e,xe),(G.key!=null||se&&G===se.subTree)&&Vp(U,G,!0)):te(U,G,Q,Ce,se,fe,_e,xe,O)},z=(U,G,Q,ue,se,fe,_e,xe,O)=>{G.slotScopeIds=xe,U==null?G.shapeFlag&512?se.ctx.activate(G,Q,ue,_e,O):K(G,Q,ue,se,fe,_e,O):$(U,G,O)},K=(U,G,Q,ue,se,fe,_e)=>{const xe=U.component=ub(U,ue,se);if(El(U)&&(xe.ctx.renderer=et),cb(xe,!1,_e),xe.asyncDep){if(se&&se.registerDep(xe,W,_e),!U.el){const O=xe.subTree=ve(gi);v(null,O,G,Q),U.placeholder=O.el}}else W(xe,U,G,Q,se,fe,_e)},$=(U,G,Q)=>{const ue=G.component=U.component;if(Wv(U,G,Q))if(ue.asyncDep&&!ue.asyncResolved){q(ue,G,Q);return}else ue.next=G,ue.update();else G.el=U.el,ue.vnode=G},W=(U,G,Q,ue,se,fe,_e)=>{const xe=()=>{if(U.isMounted){let{next:Se,bu:le,u:Ge,parent:R,vnode:A}=U;{const Te=zp(U);if(Te){Se&&(Se.el=A.el,q(U,Se,_e)),Te.asyncDep.then(()=>{U.isUnmounted||xe()});return}}let X=Se,ae;Ps(U,!1),Se?(Se.el=A.el,q(U,Se,_e)):Se=A,le&&Ga(le),(ae=Se.props&&Se.props.onVnodeBeforeUpdate)&&ln(ae,R,Se,A),Ps(U,!0);const ge=Ch(U),we=U.subTree;U.subTree=ge,T(we,ge,c(we.el),ke(we),U,se,fe),Se.el=ge.el,X===null&&qv(U,ge.el),Ge&&Fi(Ge,se),(ae=Se.props&&Se.props.onVnodeUpdated)&&Fi(()=>ln(ae,R,Se,A),se)}else{let Se;const{el:le,props:Ge}=G,{bm:R,m:A,parent:X,root:ae,type:ge}=U,we=Lr(G);Ps(U,!1),R&&Ga(R),!we&&(Se=Ge&&Ge.onVnodeBeforeMount)&&ln(Se,X,G),Ps(U,!0);{ae.ce&&ae.ce._def.shadowRoot!==!1&&ae.ce._injectChildStyle(ge);const Te=U.subTree=Ch(U);T(null,Te,Q,ue,U,se,fe),G.el=Te.el}if(A&&Fi(A,se),!we&&(Se=Ge&&Ge.onVnodeMounted)){const Te=G;Fi(()=>ln(Se,X,Te),se)}(G.shapeFlag&256||X&&Lr(X.vnode)&&X.vnode.shapeFlag&256)&&U.a&&Fi(U.a,se),U.isMounted=!0,G=Q=ue=null}};U.scope.on();const O=U.effect=new Ym(xe);U.scope.off();const me=U.update=O.run.bind(O),Ce=U.job=O.runIfDirty.bind(O);Ce.i=U,Ce.id=U.uid,O.scheduler=()=>Sc(Ce),Ps(U,!0),me()},q=(U,G,Q)=>{G.component=U;const ue=U.vnode.props;U.vnode=G,U.next=null,Xv(U,G.props,ue,Q),Zv(U,G.children,Q),qn(),Sh(U),jn()},te=(U,G,Q,ue,se,fe,_e,xe,O=!1)=>{const me=U&&U.children,Ce=U?U.shapeFlag:0,Se=G.children,{patchFlag:le,shapeFlag:Ge}=G;if(le>0){if(le&128){Pe(me,Se,Q,ue,se,fe,_e,xe,O);return}else if(le&256){he(me,Se,Q,ue,se,fe,_e,xe,O);return}}Ge&8?(Ce&16&&de(me,se,fe),Se!==me&&h(Q,Se)):Ce&16?Ge&16?Pe(me,Se,Q,ue,se,fe,_e,xe,O):de(me,se,fe,!0):(Ce&8&&h(Q,""),Ge&16&&P(Se,Q,ue,se,fe,_e,xe,O))},he=(U,G,Q,ue,se,fe,_e,xe,O)=>{U=U||Ar,G=G||Ar;const me=U.length,Ce=G.length,Se=Math.min(me,Ce);let le;for(le=0;leCe?de(U,se,fe,!0,!1,Se):P(G,Q,ue,se,fe,_e,xe,O,Se)},Pe=(U,G,Q,ue,se,fe,_e,xe,O)=>{let me=0;const Ce=G.length;let Se=U.length-1,le=Ce-1;for(;me<=Se&&me<=le;){const Ge=U[me],R=G[me]=O?cs(G[me]):yn(G[me]);if(Is(Ge,R))T(Ge,R,Q,null,se,fe,_e,xe,O);else break;me++}for(;me<=Se&&me<=le;){const Ge=U[Se],R=G[le]=O?cs(G[le]):yn(G[le]);if(Is(Ge,R))T(Ge,R,Q,null,se,fe,_e,xe,O);else break;Se--,le--}if(me>Se){if(me<=le){const Ge=le+1,R=Gele)for(;me<=Se;)Ie(U[me],se,fe,!0),me++;else{const Ge=me,R=me,A=new Map;for(me=R;me<=le;me++){const Le=G[me]=O?cs(G[me]):yn(G[me]);Le.key!=null&&A.set(Le.key,me)}let X,ae=0;const ge=le-R+1;let we=!1,Te=0;const re=new Array(ge);for(me=0;me=ge){Ie(Le,se,fe,!0);continue}let Ue;if(Le.key!=null)Ue=A.get(Le.key);else for(X=R;X<=le;X++)if(re[X-R]===0&&Is(Le,G[X])){Ue=X;break}Ue===void 0?Ie(Le,se,fe,!0):(re[Ue-R]=me+1,Ue>=Te?Te=Ue:we=!0,T(Le,G[Ue],Q,null,se,fe,_e,xe,O),ae++)}const pe=we?ib(re):Ar;for(X=pe.length-1,me=ge-1;me>=0;me--){const Le=R+me,Ue=G[Le],Re=G[Le+1],Ae=Le+1{const{el:fe,type:_e,transition:xe,children:O,shapeFlag:me}=U;if(me&6){Ee(U.component.subTree,G,Q,ue);return}if(me&128){U.suspense.move(G,Q,ue);return}if(me&64){_e.move(U,G,Q,et);return}if(_e===H){n(fe,G,Q);for(let Se=0;Sexe.enter(fe),se);else{const{leave:Se,delayLeave:le,afterLeave:Ge}=xe,R=()=>{U.ctx.isUnmounted?s(fe):n(fe,G,Q)},A=()=>{fe._isLeaving&&fe[On](!0),Se(fe,()=>{R(),Ge&&Ge()})};le?le(fe,R,A):A()}else n(fe,G,Q)},Ie=(U,G,Q,ue=!1,se=!1)=>{const{type:fe,props:_e,ref:xe,children:O,dynamicChildren:me,shapeFlag:Ce,patchFlag:Se,dirs:le,cacheIndex:Ge}=U;if(Se===-2&&(se=!1),xe!=null&&(qn(),bo(xe,null,Q,U,!0),jn()),Ge!=null&&(G.renderCache[Ge]=void 0),Ce&256){G.ctx.deactivate(U);return}const R=Ce&1&&le,A=!Lr(U);let X;if(A&&(X=_e&&_e.onVnodeBeforeUnmount)&&ln(X,G,U),Ce&6)st(U.component,Q,ue);else{if(Ce&128){U.suspense.unmount(Q,ue);return}R&&Ms(U,null,G,"beforeUnmount"),Ce&64?U.type.remove(U,G,Q,et,ue):me&&!me.hasOnce&&(fe!==H||Se>0&&Se&64)?de(me,G,Q,!1,!0):(fe===H&&Se&384||!se&&Ce&16)&&de(O,G,Q),ue&&qe(U)}(A&&(X=_e&&_e.onVnodeUnmounted)||R)&&Fi(()=>{X&&ln(X,G,U),R&&Ms(U,null,G,"unmounted")},Q)},qe=U=>{const{type:G,el:Q,anchor:ue,transition:se}=U;if(G===H){mt(Q,ue);return}if(G===Ha){x(U);return}const fe=()=>{s(Q),se&&!se.persisted&&se.afterLeave&&se.afterLeave()};if(U.shapeFlag&1&&se&&!se.persisted){const{leave:_e,delayLeave:xe}=se,O=()=>_e(Q,fe);xe?xe(U.el,fe,O):O()}else fe()},mt=(U,G)=>{let Q;for(;U!==G;)Q=f(U),s(U),U=Q;s(G)},st=(U,G,Q)=>{const{bum:ue,scope:se,job:fe,subTree:_e,um:xe,m:O,a:me}=U;Rh(O),Rh(me),ue&&Ga(ue),se.stop(),fe&&(fe.flags|=8,Ie(_e,U,G,Q)),xe&&Fi(xe,G),Fi(()=>{U.isUnmounted=!0},G)},de=(U,G,Q,ue=!1,se=!1,fe=0)=>{for(let _e=fe;_e{if(U.shapeFlag&6)return ke(U.component.subTree);if(U.shapeFlag&128)return U.suspense.next();const G=f(U.anchor||U.el),Q=G&&G[pv];return Q?f(Q):G};let Me=!1;const Xe=(U,G,Q)=>{let ue;U==null?G._vnode&&(Ie(G._vnode,null,null,!0),ue=G._vnode.component):T(G._vnode||null,U,G,null,null,null,Q),G._vnode=U,Me||(Me=!0,Sh(ue),fp(),Me=!1)},et={p:T,um:Ie,m:Ee,r:qe,mt:K,mc:P,pc:te,pbc:F,n:ke,o:t};return{render:Xe,hydrate:void 0,createApp:Bv(Xe)}}function Kl({type:t,props:e},i){return i==="svg"&&t==="foreignObject"||i==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:i}function Ps({effect:t,job:e},i){i?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function tb(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function Vp(t,e,i=!1){const n=t.children,s=e.children;if(it(n)&&it(s))for(let r=0;r>1,t[i[o]]0&&(e[n]=i[r-1]),i[r]=n)}}for(r=i.length,l=i[r-1];r-- >0;)i[r]=l,l=e[l];return i}function zp(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:zp(e)}function Rh(t){if(t)for(let e=0;et.__isSuspense;function nb(t,e){e&&e.pendingBranch?it(t)?e.effects.push(...t):e.effects.push(t):uv(t)}const H=Symbol.for("v-fgt"),Ll=Symbol.for("v-txt"),gi=Symbol.for("v-cmt"),Ha=Symbol.for("v-stc"),wo=[];let Ui=null;function m(t=!1){wo.push(Ui=t?null:[])}function sb(){wo.pop(),Ui=wo[wo.length-1]||null}let Lo=1;function ol(t,e=!1){Lo+=t,t<0&&Ui&&e&&(Ui.hasOnce=!0)}function Hp(t){return t.dynamicChildren=Lo>0?Ui||Ar:null,sb(),Lo>0&&Ui&&Ui.push(t),t}function p(t,e,i,n,s,r){return Hp(a(t,e,i,n,s,r,!0))}function at(t,e,i,n,s){return Hp(ve(t,e,i,n,s,!0))}function Ro(t){return t?t.__v_isVNode===!0:!1}function Is(t,e){return t.type===e.type&&t.key===e.key}const Wp=({key:t})=>t??null,Wa=({ref:t,ref_key:e,ref_for:i})=>(typeof t=="number"&&(t=""+t),t!=null?Xt(t)||bi(t)||ut(t)?{i:li,r:t,k:e,f:!!i}:t:null);function a(t,e=null,i=null,n=0,s=null,r=t===H?0:1,l=!1,o=!1){const d={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&Wp(e),ref:e&&Wa(e),scopeId:pp,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:n,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:li};return o?(Tc(d,i),r&128&&t.normalize(d)):i&&(d.shapeFlag|=Xt(i)?8:16),Lo>0&&!l&&Ui&&(d.patchFlag>0||r&6)&&d.patchFlag!==32&&Ui.push(d),d}const ve=rb;function rb(t,e=null,i=null,n=0,s=null,r=!1){if((!t||t===kv)&&(t=gi),Ro(t)){const o=gs(t,e,!0);return i&&Tc(o,i),Lo>0&&!r&&Ui&&(o.shapeFlag&6?Ui[Ui.indexOf(t)]=o:Ui.push(o)),o.patchFlag=-2,o}if(gb(t)&&(t=t.__vccOpts),e){e=ob(e);let{class:o,style:d}=e;o&&!Xt(o)&&(e.class=B(o)),Ft(d)&&(bc(d)&&!it(d)&&(d=ci({},d)),e.style=Mt(d))}const l=Xt(t)?1:Gp(t)?128:vp(t)?64:Ft(t)?4:ut(t)?2:0;return a(t,e,i,n,s,l,r,!0)}function ob(t){return t?bc(t)||Ip(t)?ci({},t):t:null}function gs(t,e,i=!1,n=!1){const{props:s,ref:r,patchFlag:l,children:o,transition:d}=t,u=e?ab(s||{},e):s,h={__v_isVNode:!0,__v_skip:!0,type:t.type,props:u,key:u&&Wp(u),ref:e&&e.ref?i&&r?it(r)?r.concat(Wa(e)):[r,Wa(e)]:Wa(e):r,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:o,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==H?l===-1?16:l|16:l,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:d,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&gs(t.ssContent),ssFallback:t.ssFallback&&gs(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return d&&n&&ko(h,d.clone(h)),h}function ie(t=" ",e=0){return ve(Ll,null,t,e)}function Bi(t,e){const i=ve(Ha,null,t);return i.staticCount=e,i}function N(t="",e=!1){return e?(m(),at(gi,null,t)):ve(gi,null,t)}function yn(t){return t==null||typeof t=="boolean"?ve(gi):it(t)?ve(H,null,t.slice()):Ro(t)?cs(t):ve(Ll,null,String(t))}function cs(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:gs(t)}function Tc(t,e){let i=0;const{shapeFlag:n}=t;if(e==null)e=null;else if(it(e))i=16;else if(typeof e=="object")if(n&65){const s=e.default;s&&(s._c&&(s._d=!1),Tc(t,s()),s._c&&(s._d=!0));return}else{i=32;const s=e._;!s&&!Ip(e)?e._ctx=li:s===3&&li&&(li.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else ut(e)?(e={default:e,_ctx:li},i=32):(e=String(e),n&64?(i=16,e=[ie(e)]):i=8);t.children=e,t.shapeFlag|=i}function ab(...t){const e={};for(let i=0;iyi||li;let al,ru;{const t=xl(),e=(i,n)=>{let s;return(s=t[i])||(s=t[i]=[]),s.push(n),r=>{s.length>1?s.forEach(l=>l(r)):s[0](r)}};al=e("__VUE_INSTANCE_SETTERS__",i=>yi=i),ru=e("__VUE_SSR_SETTERS__",i=>Do=i)}const jo=t=>{const e=yi;return al(t),t.scope.on(),()=>{t.scope.off(),al(e)}},Dh=()=>{yi&&yi.scope.off(),al(null)};function jp(t){return t.vnode.shapeFlag&4}let Do=!1;function cb(t,e=!1,i=!1){e&&ru(e);const{props:n,children:s}=t.vnode,r=jp(t);jv(t,n,r,e),Jv(t,s,i||e);const l=r?hb(t,e):void 0;return e&&ru(!1),l}function hb(t,e){const i=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,Rv);const{setup:n}=i;if(n){qn();const s=t.setupContext=n.length>1?mb(t):null,r=jo(t),l=qo(n,t,0,[t.props,s]),o=Gm(l);if(jn(),r(),(o||t.sp)&&!Lr(t)&&Pp(t),o){if(l.then(Dh,Dh),e)return l.then(d=>{Ih(t,d)}).catch(d=>{Al(d,t,0)});t.asyncDep=l}else Ih(t,l)}else Xp(t)}function Ih(t,e,i){ut(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Ft(e)&&(t.setupState=up(e)),Xp(t)}function Xp(t,e,i){const n=t.type;t.render||(t.render=n.render||Mn);{const s=jo(t);qn();try{Dv(t)}finally{jn(),s()}}}const fb={get(t,e){return pi(t,"get",""),t[e]}};function mb(t){const e=i=>{t.exposed=i||{}};return{attrs:new Proxy(t.attrs,fb),slots:t.slots,emit:t.emit,expose:e}}function Rl(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(up(Qy(t.exposed)),{get(e,i){if(i in e)return e[i];if(i in So)return So[i](t)},has(e,i){return i in e||i in So}})):t.proxy}function pb(t,e=!0){return ut(t)?t.displayName||t.name:t.name||e&&t.__name}function gb(t){return ut(t)&&"__vccOpts"in t}const qa=(t,e)=>rv(t,e,Do);function yb(t,e,i){try{ol(-1);const n=arguments.length;return n===2?Ft(e)&&!it(e)?Ro(e)?ve(t,null,[e]):ve(t,e):ve(t,null,e):(n>3?i=Array.prototype.slice.call(arguments,2):n===3&&Ro(i)&&(i=[i]),ve(t,e,i))}finally{ol(1)}}const vb="3.5.26";/** +**/function da(t,e,i,n){try{return n?t(...n):t()}catch(s){Xl(s,e,i)}}function un(t,e,i,n){if(lt(t)){const s=da(t,e,i,n);return s&&Vf(s)&&s.catch(r=>{Xl(r,e,i)}),s}if(nt(t)){const s=[];for(let r=0;r>>1,s=Ai[n],r=qo(s);r=qo(i)?Ai.push(t):Ai.splice(rb(e),0,t),t.flags|=1,lg()}}function lg(){wl||(wl=ag.then(dg))}function ob(t){nt(t)?Gr.push(...t):ys&&t.id===-1?ys.splice(Or+1,0,t):t.flags&1||(Gr.push(t),t.flags|=1),lg()}function rm(t,e,i=Mn+1){for(;iqo(i)-qo(n));if(Gr.length=0,ys){ys.push(...e);return}for(ys=e,Or=0;Ort.id==null?t.flags&2?-1:1/0:t.id;function dg(t){try{for(Mn=0;Mn{n._d&&Tl(-1);const r=Ml(e);let l;try{l=t(...s)}finally{Ml(r),n._d&&Tl(1)}return l};return n._n=!0,n._c=!0,n._d=!0,n}function K(t,e){if(hi===null)return t;const i=Ql(hi),n=t.dirs||(t.dirs=[]);for(let s=0;s1)return i&<(e)?e.call(n&&n.proxy):e}}const lb=Symbol.for("v-scx"),ub=()=>Hr(lb);function Io(t,e,i){return hg(t,e,i)}function hg(t,e,i=Vt){const{immediate:n,deep:s,flush:r,once:l}=i,o=pi({},i),u=e&&n||!e&&r!=="post";let c;if(Yo){if(r==="sync"){const g=ub();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!u){const g=()=>{};return g.stop=En,g.resume=En,g.pause=En,g}}const h=_i;o.call=(g,b,w)=>un(g,h,b,w);let d=!1;r==="post"?o.scheduler=g=>{Ui(g,h&&h.suspense)}:r!=="sync"&&(d=!0,o.scheduler=(g,b)=>{b?g():Jc(g)}),o.augmentJob=g=>{e&&(g.flags|=4),d&&(g.flags|=2,h&&(g.id=h.uid,g.i=h))};const m=nb(t,e,o);return Yo&&(c?c.push(m):u&&m()),m}function db(t,e,i){const n=this.proxy,s=ei(t)?t.includes(".")?mg(n,t):()=>n[t]:t.bind(n,n);let r;lt(e)?r=e:(r=e.handler,i=e);const l=ca(this),o=hg(s,r.bind(n),i);return l(),o}function mg(t,e){const i=e.split(".");return()=>{let n=t;for(let s=0;st.__isTeleport,Wn=Symbol("_leaveCb"),_a=Symbol("_enterCb");function hb(){const t={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Zc(()=>{t.isMounted=!0}),Qc(()=>{t.isUnmounting=!0}),t}const ji=[Function,Array],fg={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ji,onEnter:ji,onAfterEnter:ji,onEnterCancelled:ji,onBeforeLeave:ji,onLeave:ji,onAfterLeave:ji,onLeaveCancelled:ji,onBeforeAppear:ji,onAppear:ji,onAfterAppear:ji,onAppearCancelled:ji},gg=t=>{const e=t.subTree;return e.component?gg(e.component):e},mb={name:"BaseTransition",props:fg,setup(t,{slots:e}){const i=$g(),n=hb();return()=>{const s=e.default&&bg(e.default(),!0);if(!s||!s.length)return;const r=yg(s),l=xt(t),{mode:o}=l;if(n.isLeaving)return yu(r);const u=om(r);if(!u)return yu(r);let c=Td(u,l,n,i,d=>c=d);u.type!==bi&&jo(u,c);let h=i.subTree&&om(i.subTree);if(h&&h.type!==bi&&!zs(h,u)&&gg(i).type!==bi){let d=Td(h,l,n,i);if(jo(h,d),o==="out-in"&&u.type!==bi)return n.isLeaving=!0,d.afterLeave=()=>{n.isLeaving=!1,i.job.flags&8||i.update(),delete d.afterLeave,h=void 0},yu(r);o==="in-out"&&u.type!==bi?d.delayLeave=(m,g,b)=>{const w=vg(n,h);w[String(h.key)]=h,m[Wn]=()=>{g(),m[Wn]=void 0,delete c.delayedLeave,h=void 0},c.delayedLeave=()=>{b(),delete c.delayedLeave,h=void 0}}:h=void 0}else h&&(h=void 0);return r}}};function yg(t){let e=t[0];if(t.length>1){for(const i of t)if(i.type!==bi){e=i;break}}return e}const pb=mb;function vg(t,e){const{leavingVNodes:i}=t;let n=i.get(e.type);return n||(n=Object.create(null),i.set(e.type,n)),n}function Td(t,e,i,n,s){const{appear:r,mode:l,persisted:o=!1,onBeforeEnter:u,onEnter:c,onAfterEnter:h,onEnterCancelled:d,onBeforeLeave:m,onLeave:g,onAfterLeave:b,onLeaveCancelled:w,onBeforeAppear:v,onAppear:y,onAfterAppear:S,onAppearCancelled:P}=e,M=String(t.key),k=vg(i,t),C=(T,F)=>{T&&un(T,n,9,F)},L=(T,F)=>{const I=F[1];C(T,F),nt(T)?T.every(E=>E.length<=1)&&I():T.length<=1&&I()},x={mode:l,persisted:o,beforeEnter(T){let F=u;if(!i.isMounted)if(r)F=v||u;else return;T[Wn]&&T[Wn](!0);const I=k[M];I&&zs(t,I)&&I.el[Wn]&&I.el[Wn](),C(F,[T])},enter(T){let F=c,I=h,E=d;if(!i.isMounted)if(r)F=y||c,I=S||h,E=P||d;else return;let z=!1;const Y=T[_a]=$=>{z||(z=!0,$?C(E,[T]):C(I,[T]),x.delayedLeave&&x.delayedLeave(),T[_a]=void 0)};F?L(F,[T,Y]):Y()},leave(T,F){const I=String(t.key);if(T[_a]&&T[_a](!0),i.isUnmounting)return F();C(m,[T]);let E=!1;const z=T[Wn]=Y=>{E||(E=!0,F(),Y?C(w,[T]):C(b,[T]),T[Wn]=void 0,k[I]===t&&delete k[I])};k[I]=t,g?L(g,[T,z]):z()},clone(T){const F=Td(T,e,i,n,s);return s&&s(F),F}};return x}function yu(t){if(Kl(t))return t=Ms(t),t.children=null,t}function om(t){if(!Kl(t))return pg(t.type)&&t.children?yg(t.children):t;if(t.component)return t.component.subTree;const{shapeFlag:e,children:i}=t;if(i){if(e&16)return i[0];if(e&32&<(i.default))return i.default()}}function jo(t,e){t.shapeFlag&6&&t.component?(t.transition=e,jo(t.component.subTree,e)):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function bg(t,e=!1,i){let n=[],s=0;for(let r=0;r1)for(let r=0;rFo(b,e&&(nt(e)?e[w]:e),i,n,s));return}if(Wr(n)&&!s){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Fo(t,e,i,n.component.subTree);return}const r=n.shapeFlag&4?Ql(n.component):n.el,l=s?null:r,{i:o,r:u}=t,c=e&&e.r,h=o.refs===Vt?o.refs={}:o.refs,d=o.setupState,m=xt(d),g=d===Vt?Uf:b=>Ct(m,b);if(c!=null&&c!==u){if(am(e),ei(c))h[c]=null,g(c)&&(d[c]=null);else if(wi(c)){c.value=null;const b=e;b.k&&(h[b.k]=null)}}if(lt(u))da(u,o,12,[l,h]);else{const b=ei(u),w=wi(u);if(b||w){const v=()=>{if(t.f){const y=b?g(u)?d[u]:h[u]:u.value;if(s)nt(y)&&Vc(y,r);else if(nt(y))y.includes(r)||y.push(r);else if(b)h[u]=[r],g(u)&&(d[u]=h[u]);else{const S=[r];u.value=S,t.k&&(h[t.k]=S)}}else b?(h[u]=l,g(u)&&(d[u]=l)):w&&(u.value=l,t.k&&(h[t.k]=l))};if(l){const y=()=>{v(),xl.delete(t)};y.id=-1,xl.set(t,y),Ui(y,i)}else am(t),v()}}}function am(t){const e=xl.get(t);e&&(e.flags|=8,xl.delete(t))}ql().requestIdleCallback;ql().cancelIdleCallback;const Wr=t=>!!t.type.__asyncLoader,Kl=t=>t.type.__isKeepAlive;function fb(t,e){Sg(t,"a",e)}function gb(t,e){Sg(t,"da",e)}function Sg(t,e,i=_i){const n=t.__wdc||(t.__wdc=()=>{let s=i;for(;s;){if(s.isDeactivated)return;s=s.parent}return t()});if(Yl(e,n,i),i){let s=i.parent;for(;s&&s.parent;)Kl(s.parent.vnode)&&yb(n,e,i,s),s=s.parent}}function yb(t,e,i,n){const s=Yl(e,t,n,!0);wg(()=>{Vc(n[e],s)},i)}function Yl(t,e,i=_i,n=!1){if(i){const s=i[t]||(i[t]=[]),r=e.__weh||(e.__weh=(...l)=>{Zn();const o=ca(i),u=un(e,i,t,l);return o(),Qn(),u});return n?s.unshift(r):s.push(r),r}}const ss=t=>(e,i=_i)=>{(!Yo||t==="sp")&&Yl(t,(...n)=>e(...n),i)},vb=ss("bm"),Zc=ss("m"),bb=ss("bu"),_b=ss("u"),Qc=ss("bum"),wg=ss("um"),Sb=ss("sp"),wb=ss("rtg"),Mb=ss("rtc");function xb(t,e=_i){Yl("ec",t,e)}const Pb="components";function Ie(t,e){return Ab(Pb,t,!0,e)||t}const Tb=Symbol.for("v-ndc");function Ab(t,e,i=!0,n=!1){const s=hi||_i;if(s){const r=s.type;{const o=c1(r,!1);if(o&&(o===e||o===Zi(e)||o===Hl(Zi(e))))return r}const l=lm(s[t]||r[t],e)||lm(s.appContext[t],e);return!l&&n?r:l}}function lm(t,e){return t&&(t[e]||t[Zi(e)]||t[Hl(Zi(e))])}function re(t,e,i,n){let s;const r=i,l=nt(t);if(l||ei(t)){const o=l&&Js(t);let u=!1,c=!1;o&&(u=!Ji(t),c=es(t),t=jl(t)),s=new Array(t.length);for(let h=0,d=t.length;he(o,u,void 0,r));else{const o=Object.keys(t);s=new Array(o.length);for(let u=0,c=o.length;u0;return e!=="default"&&(i.name=e),p(),ht(G,null,[ve("slot",i,n)],c?-2:64)}let r=t[e];r&&r._c&&(r._d=!1),p();const l=r&&Mg(r(i)),o=i.key||l&&l.key,u=ht(G,{key:(o&&!an(o)?o:`_${e}`)+(!l&&n?"_fb":"")},l||[],l&&t._===1?64:-2);return!s&&u.scopeId&&(u.slotScopeIds=[u.scopeId+"-s"]),r&&r._c&&(r._d=!0),u}function Mg(t){return t.some(e=>Ko(e)?!(e.type===bi||e.type===G&&!Mg(e.children)):!0)?t:null}const Ad=t=>t?Gg(t)?Ql(t):Ad(t.parent):null,Oo=pi(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Ad(t.parent),$root:t=>Ad(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>Pg(t),$forceUpdate:t=>t.f||(t.f=()=>{Jc(t.update)}),$nextTick:t=>t.n||(t.n=Yc.bind(t.proxy)),$watch:t=>db.bind(t)}),vu=(t,e)=>t!==Vt&&!t.__isScriptSetup&&Ct(t,e),Cb={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:i,setupState:n,data:s,props:r,accessCache:l,type:o,appContext:u}=t;if(e[0]!=="$"){const m=l[e];if(m!==void 0)switch(m){case 1:return n[e];case 2:return s[e];case 4:return i[e];case 3:return r[e]}else{if(vu(n,e))return l[e]=1,n[e];if(s!==Vt&&Ct(s,e))return l[e]=2,s[e];if(Ct(r,e))return l[e]=3,r[e];if(i!==Vt&&Ct(i,e))return l[e]=4,i[e];Cd&&(l[e]=0)}}const c=Oo[e];let h,d;if(c)return e==="$attrs"&&vi(t.attrs,"get",""),c(t);if((h=o.__cssModules)&&(h=h[e]))return h;if(i!==Vt&&Ct(i,e))return l[e]=4,i[e];if(d=u.config.globalProperties,Ct(d,e))return d[e]},set({_:t},e,i){const{data:n,setupState:s,ctx:r}=t;return vu(s,e)?(s[e]=i,!0):n!==Vt&&Ct(n,e)?(n[e]=i,!0):Ct(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(r[e]=i,!0)},has({_:{data:t,setupState:e,accessCache:i,ctx:n,appContext:s,props:r,type:l}},o){let u;return!!(i[o]||t!==Vt&&o[0]!=="$"&&Ct(t,o)||vu(e,o)||Ct(r,o)||Ct(n,o)||Ct(Oo,o)||Ct(s.config.globalProperties,o)||(u=l.__cssModules)&&u[o])},defineProperty(t,e,i){return i.get!=null?t._.accessCache[e]=0:Ct(i,"value")&&this.set(t,e,i.value,null),Reflect.defineProperty(t,e,i)}};function um(t){return nt(t)?t.reduce((e,i)=>(e[i]=null,e),{}):t}let Cd=!0;function Eb(t){const e=Pg(t),i=t.proxy,n=t.ctx;Cd=!1,e.beforeCreate&&dm(e.beforeCreate,t,"bc");const{data:s,computed:r,methods:l,watch:o,provide:u,inject:c,created:h,beforeMount:d,mounted:m,beforeUpdate:g,updated:b,activated:w,deactivated:v,beforeDestroy:y,beforeUnmount:S,destroyed:P,unmounted:M,render:k,renderTracked:C,renderTriggered:L,errorCaptured:x,serverPrefetch:T,expose:F,inheritAttrs:I,components:E,directives:z,filters:Y}=e;if(c&&kb(c,n,null),l)for(const q in l){const te=l[q];lt(te)&&(n[q]=te.bind(i))}if(s){const q=s.call(i,i);Ft(q)&&(t.data=jc(q))}if(Cd=!0,r)for(const q in r){const te=r[q],me=lt(te)?te.bind(i,i):lt(te.get)?te.get.bind(i,i):En,xe=!lt(te)&<(te.set)?te.set.bind(i):En,Ce=hl({get:me,set:xe});Object.defineProperty(n,q,{enumerable:!0,configurable:!0,get:()=>Ce.value,set:Fe=>Ce.value=Fe})}if(o)for(const q in o)xg(o[q],n,i,q);if(u){const q=lt(u)?u.call(i):u;Reflect.ownKeys(q).forEach(te=>{ab(te,q[te])})}h&&dm(h,t,"c");function W(q,te){nt(te)?te.forEach(me=>q(me.bind(i))):te&&q(te.bind(i))}if(W(vb,d),W(Zc,m),W(bb,g),W(_b,b),W(fb,w),W(gb,v),W(xb,x),W(Mb,C),W(wb,L),W(Qc,S),W(wg,M),W(Sb,T),nt(F))if(F.length){const q=t.exposed||(t.exposed={});F.forEach(te=>{Object.defineProperty(q,te,{get:()=>i[te],set:me=>i[te]=me,enumerable:!0})})}else t.exposed||(t.exposed={});k&&t.render===En&&(t.render=k),I!=null&&(t.inheritAttrs=I),E&&(t.components=E),z&&(t.directives=z),T&&_g(t)}function kb(t,e,i=En){nt(t)&&(t=Ed(t));for(const n in t){const s=t[n];let r;Ft(s)?"default"in s?r=Hr(s.from||n,s.default,!0):r=Hr(s.from||n):r=Hr(s),wi(r)?Object.defineProperty(e,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):e[n]=r}}function dm(t,e,i){un(nt(t)?t.map(n=>n.bind(e.proxy)):t.bind(e.proxy),e,i)}function xg(t,e,i,n){let s=n.includes(".")?mg(i,n):()=>i[n];if(ei(t)){const r=e[t];lt(r)&&Io(s,r)}else if(lt(t))Io(s,t.bind(i));else if(Ft(t))if(nt(t))t.forEach(r=>xg(r,e,i,n));else{const r=lt(t.handler)?t.handler.bind(i):e[t.handler];lt(r)&&Io(s,r,t)}}function Pg(t){const e=t.type,{mixins:i,extends:n}=e,{mixins:s,optionsCache:r,config:{optionMergeStrategies:l}}=t.appContext,o=r.get(e);let u;return o?u=o:!s.length&&!i&&!n?u=e:(u={},s.length&&s.forEach(c=>Pl(u,c,l,!0)),Pl(u,e,l)),Ft(e)&&r.set(e,u),u}function Pl(t,e,i,n=!1){const{mixins:s,extends:r}=e;r&&Pl(t,r,i,!0),s&&s.forEach(l=>Pl(t,l,i,!0));for(const l in e)if(!(n&&l==="expose")){const o=Rb[l]||i&&i[l];t[l]=o?o(t[l],e[l]):e[l]}return t}const Rb={data:cm,props:hm,emits:hm,methods:To,computed:To,beforeCreate:xi,created:xi,beforeMount:xi,mounted:xi,beforeUpdate:xi,updated:xi,beforeDestroy:xi,beforeUnmount:xi,destroyed:xi,unmounted:xi,activated:xi,deactivated:xi,errorCaptured:xi,serverPrefetch:xi,components:To,directives:To,watch:Db,provide:cm,inject:Lb};function cm(t,e){return e?t?function(){return pi(lt(t)?t.call(this,this):t,lt(e)?e.call(this,this):e)}:e:t}function Lb(t,e){return To(Ed(t),Ed(e))}function Ed(t){if(nt(t)){const e={};for(let i=0;ie==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${Zi(e)}Modifiers`]||t[`${Ts(e)}Modifiers`];function Ob(t,e,...i){if(t.isUnmounted)return;const n=t.vnode.props||Vt;let s=i;const r=e.startsWith("update:"),l=r&&Nb(n,e.slice(7));l&&(l.trim&&(s=i.map(h=>ei(h)?h.trim():h)),l.number&&(s=i.map(Wl)));let o,u=n[o=hu(e)]||n[o=hu(Zi(e))];!u&&r&&(u=n[o=hu(Ts(e))]),u&&un(u,t,6,s);const c=n[o+"Once"];if(c){if(!t.emitted)t.emitted={};else if(t.emitted[o])return;t.emitted[o]=!0,un(c,t,6,s)}}const Ub=new WeakMap;function Ag(t,e,i=!1){const n=i?Ub:e.emitsCache,s=n.get(t);if(s!==void 0)return s;const r=t.emits;let l={},o=!1;if(!lt(t)){const u=c=>{const h=Ag(c,e,!0);h&&(o=!0,pi(l,h))};!i&&e.mixins.length&&e.mixins.forEach(u),t.extends&&u(t.extends),t.mixins&&t.mixins.forEach(u)}return!r&&!o?(Ft(t)&&n.set(t,null),null):(nt(r)?r.forEach(u=>l[u]=null):pi(l,r),Ft(t)&&n.set(t,l),l)}function Jl(t,e){return!t||!$l(e)?!1:(e=e.slice(2).replace(/Once$/,""),Ct(t,e[0].toLowerCase()+e.slice(1))||Ct(t,Ts(e))||Ct(t,e))}function mm(t){const{type:e,vnode:i,proxy:n,withProxy:s,propsOptions:[r],slots:l,attrs:o,emit:u,render:c,renderCache:h,props:d,data:m,setupState:g,ctx:b,inheritAttrs:w}=t,v=Ml(t);let y,S;try{if(i.shapeFlag&4){const M=s||n,k=M;y=xn(c.call(k,M,h,d,g,m,b)),S=o}else{const M=e;y=xn(M.length>1?M(d,{attrs:o,slots:l,emit:u}):M(d,null)),S=e.props?o:Vb(o)}}catch(M){Uo.length=0,Xl(M,t,1),y=ve(bi)}let P=y;if(S&&w!==!1){const M=Object.keys(S),{shapeFlag:k}=P;M.length&&k&7&&(r&&M.some(Uc)&&(S=Bb(S,r)),P=Ms(P,S,!1,!0))}return i.dirs&&(P=Ms(P,null,!1,!0),P.dirs=P.dirs?P.dirs.concat(i.dirs):i.dirs),i.transition&&jo(P,i.transition),y=P,Ml(v),y}const Vb=t=>{let e;for(const i in t)(i==="class"||i==="style"||$l(i))&&((e||(e={}))[i]=t[i]);return e},Bb=(t,e)=>{const i={};for(const n in t)(!Uc(n)||!(n.slice(9)in e))&&(i[n]=t[n]);return i};function zb(t,e,i){const{props:n,children:s,component:r}=t,{props:l,children:o,patchFlag:u}=e,c=r.emitsOptions;if(e.dirs||e.transition)return!0;if(i&&u>=0){if(u&1024)return!0;if(u&16)return n?pm(n,l,c):!!l;if(u&8){const h=e.dynamicProps;for(let d=0;dObject.create(Cg),kg=t=>Object.getPrototypeOf(t)===Cg;function Gb(t,e,i,n=!1){const s={},r=Eg();t.propsDefaults=Object.create(null),Rg(t,e,s,r);for(const l in t.propsOptions[0])l in s||(s[l]=void 0);i?t.props=n?s:Xv(s):t.type.props?t.props=s:t.props=r,t.attrs=r}function Hb(t,e,i,n){const{props:s,attrs:r,vnode:{patchFlag:l}}=t,o=xt(s),[u]=t.propsOptions;let c=!1;if((n||l>0)&&!(l&16)){if(l&8){const h=t.vnode.dynamicProps;for(let d=0;d{u=!0;const[m,g]=Lg(d,e,!0);pi(l,m),g&&o.push(...g)};!i&&e.mixins.length&&e.mixins.forEach(h),t.extends&&h(t.extends),t.mixins&&t.mixins.forEach(h)}if(!r&&!u)return Ft(t)&&n.set(t,zr),zr;if(nt(r))for(let h=0;ht==="_"||t==="_ctx"||t==="$stable",th=t=>nt(t)?t.map(xn):[xn(t)],qb=(t,e,i)=>{if(e._n)return e;const n=Ht((...s)=>th(e(...s)),i);return n._c=!1,n},Dg=(t,e,i)=>{const n=t._ctx;for(const s in t){if(eh(s))continue;const r=t[s];if(lt(r))e[s]=qb(s,r,n);else if(r!=null){const l=th(r);e[s]=()=>l}}},Ig=(t,e)=>{const i=th(e);t.slots.default=()=>i},Fg=(t,e,i)=>{for(const n in e)(i||!eh(n))&&(t[n]=e[n])},jb=(t,e,i)=>{const n=t.slots=Eg();if(t.vnode.shapeFlag&32){const s=e._;s?(Fg(n,e,i),i&&$f(n,"_",s,!0)):Dg(e,n)}else e&&Ig(t,e)},Xb=(t,e,i)=>{const{vnode:n,slots:s}=t;let r=!0,l=Vt;if(n.shapeFlag&32){const o=e._;o?i&&o===1?r=!1:Fg(s,e,i):(r=!e.$stable,Dg(e,s)),l=e}else e&&(Ig(t,e),l={default:1});if(r)for(const o in s)!eh(o)&&l[o]==null&&delete s[o]},Ui=Qb;function Kb(t){return Yb(t)}function Yb(t,e){const i=ql();i.__VUE__=!0;const{insert:n,remove:s,patchProp:r,createElement:l,createText:o,createComment:u,setText:c,setElementText:h,parentNode:d,nextSibling:m,setScopeId:g=En,insertStaticContent:b}=t,w=(V,H,Q,ce=null,se=null,pe=null,_e=void 0,Pe=null,O=!!H.dynamicChildren)=>{if(V===H)return;V&&!zs(V,H)&&(ce=ke(V),Fe(V,se,pe,!0),V=null),H.patchFlag===-2&&(O=!1,H.dynamicChildren=null);const{type:fe,ref:Ee,shapeFlag:Se}=H;switch(fe){case Zl:v(V,H,Q,ce);break;case bi:y(V,H,Q,ce);break;case dl:V==null&&S(H,Q,ce,_e);break;case G:E(V,H,Q,ce,se,pe,_e,Pe,O);break;default:Se&1?k(V,H,Q,ce,se,pe,_e,Pe,O):Se&6?z(V,H,Q,ce,se,pe,_e,Pe,O):(Se&64||Se&128)&&fe.process(V,H,Q,ce,se,pe,_e,Pe,O,et)}Ee!=null&&se?Fo(Ee,V&&V.ref,pe,H||V,!H):Ee==null&&V&&V.ref!=null&&Fo(V.ref,null,pe,V,!0)},v=(V,H,Q,ce)=>{if(V==null)n(H.el=o(H.children),Q,ce);else{const se=H.el=V.el;H.children!==V.children&&c(se,H.children)}},y=(V,H,Q,ce)=>{V==null?n(H.el=u(H.children||""),Q,ce):H.el=V.el},S=(V,H,Q,ce)=>{[V.el,V.anchor]=b(V.children,H,Q,ce,V.el,V.anchor)},P=({el:V,anchor:H},Q,ce)=>{let se;for(;V&&V!==H;)se=m(V),n(V,Q,ce),V=se;n(H,Q,ce)},M=({el:V,anchor:H})=>{let Q;for(;V&&V!==H;)Q=m(V),s(V),V=Q;s(H)},k=(V,H,Q,ce,se,pe,_e,Pe,O)=>{if(H.type==="svg"?_e="svg":H.type==="math"&&(_e="mathml"),V==null)C(H,Q,ce,se,pe,_e,Pe,O);else{const fe=V.el&&V.el._isVueCE?V.el:null;try{fe&&fe._beginPatch(),T(V,H,se,pe,_e,Pe,O)}finally{fe&&fe._endPatch()}}},C=(V,H,Q,ce,se,pe,_e,Pe)=>{let O,fe;const{props:Ee,shapeFlag:Se,transition:ue,dirs:Ge}=V;if(O=V.el=l(V.type,pe,Ee&&Ee.is,Ee),Se&8?h(O,V.children):Se&16&&x(V.children,O,null,ce,se,bu(V,pe),_e,Pe),Ge&&Es(V,null,ce,"created"),L(O,V,V.scopeId,_e,ce),Ee){for(const A in Ee)A!=="value"&&!Ro(A)&&r(O,A,null,Ee[A],pe,ce);"value"in Ee&&r(O,"value",null,Ee.value,pe),(fe=Ee.onVnodeBeforeMount)&&hn(fe,ce,V)}Ge&&Es(V,null,ce,"beforeMount");const D=Jb(se,ue);D&&ue.beforeEnter(O),n(O,H,Q),((fe=Ee&&Ee.onVnodeMounted)||D||Ge)&&Ui(()=>{fe&&hn(fe,ce,V),D&&ue.enter(O),Ge&&Es(V,null,ce,"mounted")},se)},L=(V,H,Q,ce,se)=>{if(Q&&g(V,Q),ce)for(let pe=0;pe{for(let fe=O;fe{const Pe=H.el=V.el;let{patchFlag:O,dynamicChildren:fe,dirs:Ee}=H;O|=V.patchFlag&16;const Se=V.props||Vt,ue=H.props||Vt;let Ge;if(Q&&ks(Q,!1),(Ge=ue.onVnodeBeforeUpdate)&&hn(Ge,Q,H,V),Ee&&Es(H,V,Q,"beforeUpdate"),Q&&ks(Q,!0),(Se.innerHTML&&ue.innerHTML==null||Se.textContent&&ue.textContent==null)&&h(Pe,""),fe?F(V.dynamicChildren,fe,Pe,Q,ce,bu(H,se),pe):_e||te(V,H,Pe,null,Q,ce,bu(H,se),pe,!1),O>0){if(O&16)I(Pe,Se,ue,Q,se);else if(O&2&&Se.class!==ue.class&&r(Pe,"class",null,ue.class,se),O&4&&r(Pe,"style",Se.style,ue.style,se),O&8){const D=H.dynamicProps;for(let A=0;A{Ge&&hn(Ge,Q,H,V),Ee&&Es(H,V,Q,"updated")},ce)},F=(V,H,Q,ce,se,pe,_e)=>{for(let Pe=0;Pe{if(H!==Q){if(H!==Vt)for(const pe in H)!Ro(pe)&&!(pe in Q)&&r(V,pe,H[pe],null,se,ce);for(const pe in Q){if(Ro(pe))continue;const _e=Q[pe],Pe=H[pe];_e!==Pe&&pe!=="value"&&r(V,pe,Pe,_e,se,ce)}"value"in Q&&r(V,"value",H.value,Q.value,se)}},E=(V,H,Q,ce,se,pe,_e,Pe,O)=>{const fe=H.el=V?V.el:o(""),Ee=H.anchor=V?V.anchor:o("");let{patchFlag:Se,dynamicChildren:ue,slotScopeIds:Ge}=H;Ge&&(Pe=Pe?Pe.concat(Ge):Ge),V==null?(n(fe,Q,ce),n(Ee,Q,ce),x(H.children||[],Q,Ee,se,pe,_e,Pe,O)):Se>0&&Se&64&&ue&&V.dynamicChildren&&V.dynamicChildren.length===ue.length?(F(V.dynamicChildren,ue,Q,se,pe,_e,Pe),(H.key!=null||se&&H===se.subTree)&&Ng(V,H,!0)):te(V,H,Q,Ee,se,pe,_e,Pe,O)},z=(V,H,Q,ce,se,pe,_e,Pe,O)=>{H.slotScopeIds=Pe,V==null?H.shapeFlag&512?se.ctx.activate(H,Q,ce,_e,O):Y(H,Q,ce,se,pe,_e,O):$(V,H,O)},Y=(V,H,Q,ce,se,pe,_e)=>{const Pe=V.component=o1(V,ce,se);if(Kl(V)&&(Pe.ctx.renderer=et),a1(Pe,!1,_e),Pe.asyncDep){if(se&&se.registerDep(Pe,W,_e),!V.el){const O=Pe.subTree=ve(bi);y(null,O,H,Q),V.placeholder=O.el}}else W(Pe,V,H,Q,se,pe,_e)},$=(V,H,Q)=>{const ce=H.component=V.component;if(zb(V,H,Q))if(ce.asyncDep&&!ce.asyncResolved){q(ce,H,Q);return}else ce.next=H,ce.update();else H.el=V.el,ce.vnode=H},W=(V,H,Q,ce,se,pe,_e)=>{const Pe=()=>{if(V.isMounted){let{next:Se,bu:ue,u:Ge,parent:D,vnode:A}=V;{const Te=Og(V);if(Te){Se&&(Se.el=A.el,q(V,Se,_e)),Te.asyncDep.then(()=>{V.isUnmounted||Pe()});return}}let X=Se,le;ks(V,!1),Se?(Se.el=A.el,q(V,Se,_e)):Se=A,ue&&ul(ue),(le=Se.props&&Se.props.onVnodeBeforeUpdate)&&hn(le,D,Se,A),ks(V,!0);const ye=mm(V),we=V.subTree;V.subTree=ye,w(we,ye,d(we.el),ke(we),V,se,pe),Se.el=ye.el,X===null&&$b(V,ye.el),Ge&&Ui(Ge,se),(le=Se.props&&Se.props.onVnodeUpdated)&&Ui(()=>hn(le,D,Se,A),se)}else{let Se;const{el:ue,props:Ge}=H,{bm:D,m:A,parent:X,root:le,type:ye}=V,we=Wr(H);ks(V,!1),D&&ul(D),!we&&(Se=Ge&&Ge.onVnodeBeforeMount)&&hn(Se,X,H),ks(V,!0);{le.ce&&le.ce._def.shadowRoot!==!1&&le.ce._injectChildStyle(ye);const Te=V.subTree=mm(V);w(null,Te,Q,ce,V,se,pe),H.el=Te.el}if(A&&Ui(A,se),!we&&(Se=Ge&&Ge.onVnodeMounted)){const Te=H;Ui(()=>hn(Se,X,Te),se)}(H.shapeFlag&256||X&&Wr(X.vnode)&&X.vnode.shapeFlag&256)&&V.a&&Ui(V.a,se),V.isMounted=!0,H=Q=ce=null}};V.scope.on();const O=V.effect=new qf(Pe);V.scope.off();const fe=V.update=O.run.bind(O),Ee=V.job=O.runIfDirty.bind(O);Ee.i=V,Ee.id=V.uid,O.scheduler=()=>Jc(Ee),ks(V,!0),fe()},q=(V,H,Q)=>{H.component=V;const ce=V.vnode.props;V.vnode=H,V.next=null,Hb(V,H.props,ce,Q),Xb(V,H.children,Q),Zn(),rm(V),Qn()},te=(V,H,Q,ce,se,pe,_e,Pe,O=!1)=>{const fe=V&&V.children,Ee=V?V.shapeFlag:0,Se=H.children,{patchFlag:ue,shapeFlag:Ge}=H;if(ue>0){if(ue&128){xe(fe,Se,Q,ce,se,pe,_e,Pe,O);return}else if(ue&256){me(fe,Se,Q,ce,se,pe,_e,Pe,O);return}}Ge&8?(Ee&16&&de(fe,se,pe),Se!==fe&&h(Q,Se)):Ee&16?Ge&16?xe(fe,Se,Q,ce,se,pe,_e,Pe,O):de(fe,se,pe,!0):(Ee&8&&h(Q,""),Ge&16&&x(Se,Q,ce,se,pe,_e,Pe,O))},me=(V,H,Q,ce,se,pe,_e,Pe,O)=>{V=V||zr,H=H||zr;const fe=V.length,Ee=H.length,Se=Math.min(fe,Ee);let ue;for(ue=0;ueEe?de(V,se,pe,!0,!1,Se):x(H,Q,ce,se,pe,_e,Pe,O,Se)},xe=(V,H,Q,ce,se,pe,_e,Pe,O)=>{let fe=0;const Ee=H.length;let Se=V.length-1,ue=Ee-1;for(;fe<=Se&&fe<=ue;){const Ge=V[fe],D=H[fe]=O?vs(H[fe]):xn(H[fe]);if(zs(Ge,D))w(Ge,D,Q,null,se,pe,_e,Pe,O);else break;fe++}for(;fe<=Se&&fe<=ue;){const Ge=V[Se],D=H[ue]=O?vs(H[ue]):xn(H[ue]);if(zs(Ge,D))w(Ge,D,Q,null,se,pe,_e,Pe,O);else break;Se--,ue--}if(fe>Se){if(fe<=ue){const Ge=ue+1,D=Geue)for(;fe<=Se;)Fe(V[fe],se,pe,!0),fe++;else{const Ge=fe,D=fe,A=new Map;for(fe=D;fe<=ue;fe++){const Re=H[fe]=O?vs(H[fe]):xn(H[fe]);Re.key!=null&&A.set(Re.key,fe)}let X,le=0;const ye=ue-D+1;let we=!1,Te=0;const oe=new Array(ye);for(fe=0;fe=ye){Fe(Re,se,pe,!0);continue}let Ue;if(Re.key!=null)Ue=A.get(Re.key);else for(X=D;X<=ue;X++)if(oe[X-D]===0&&zs(Re,H[X])){Ue=X;break}Ue===void 0?Fe(Re,se,pe,!0):(oe[Ue-D]=fe+1,Ue>=Te?Te=Ue:we=!0,w(Re,H[Ue],Q,null,se,pe,_e,Pe,O),le++)}const ge=we?Zb(oe):zr;for(X=ge.length-1,fe=ye-1;fe>=0;fe--){const Re=D+fe,Ue=H[Re],Le=H[Re+1],Ae=Re+1{const{el:pe,type:_e,transition:Pe,children:O,shapeFlag:fe}=V;if(fe&6){Ce(V.component.subTree,H,Q,ce);return}if(fe&128){V.suspense.move(H,Q,ce);return}if(fe&64){_e.move(V,H,Q,et);return}if(_e===G){n(pe,H,Q);for(let Se=0;SePe.enter(pe),se);else{const{leave:Se,delayLeave:ue,afterLeave:Ge}=Pe,D=()=>{V.ctx.isUnmounted?s(pe):n(pe,H,Q)},A=()=>{pe._isLeaving&&pe[Wn](!0),Se(pe,()=>{D(),Ge&&Ge()})};ue?ue(pe,D,A):A()}else n(pe,H,Q)},Fe=(V,H,Q,ce=!1,se=!1)=>{const{type:pe,props:_e,ref:Pe,children:O,dynamicChildren:fe,shapeFlag:Ee,patchFlag:Se,dirs:ue,cacheIndex:Ge}=V;if(Se===-2&&(se=!1),Pe!=null&&(Zn(),Fo(Pe,null,Q,V,!0),Qn()),Ge!=null&&(H.renderCache[Ge]=void 0),Ee&256){H.ctx.deactivate(V);return}const D=Ee&1&&ue,A=!Wr(V);let X;if(A&&(X=_e&&_e.onVnodeBeforeUnmount)&&hn(X,H,V),Ee&6)st(V.component,Q,ce);else{if(Ee&128){V.suspense.unmount(Q,ce);return}D&&Es(V,null,H,"beforeUnmount"),Ee&64?V.type.remove(V,H,Q,et,ce):fe&&!fe.hasOnce&&(pe!==G||Se>0&&Se&64)?de(fe,H,Q,!1,!0):(pe===G&&Se&384||!se&&Ee&16)&&de(O,H,Q),ce&&qe(V)}(A&&(X=_e&&_e.onVnodeUnmounted)||D)&&Ui(()=>{X&&hn(X,H,V),D&&Es(V,null,H,"unmounted")},Q)},qe=V=>{const{type:H,el:Q,anchor:ce,transition:se}=V;if(H===G){mt(Q,ce);return}if(H===dl){M(V);return}const pe=()=>{s(Q),se&&!se.persisted&&se.afterLeave&&se.afterLeave()};if(V.shapeFlag&1&&se&&!se.persisted){const{leave:_e,delayLeave:Pe}=se,O=()=>_e(Q,pe);Pe?Pe(V.el,pe,O):O()}else pe()},mt=(V,H)=>{let Q;for(;V!==H;)Q=m(V),s(V),V=Q;s(H)},st=(V,H,Q)=>{const{bum:ce,scope:se,job:pe,subTree:_e,um:Pe,m:O,a:fe}=V;gm(O),gm(fe),ce&&ul(ce),se.stop(),pe&&(pe.flags|=8,Fe(_e,V,H,Q)),Pe&&Ui(Pe,H),Ui(()=>{V.isUnmounted=!0},H)},de=(V,H,Q,ce=!1,se=!1,pe=0)=>{for(let _e=pe;_e{if(V.shapeFlag&6)return ke(V.component.subTree);if(V.shapeFlag&128)return V.suspense.next();const H=m(V.anchor||V.el),Q=H&&H[cb];return Q?m(Q):H};let Me=!1;const Ke=(V,H,Q)=>{let ce;V==null?H._vnode&&(Fe(H._vnode,null,null,!0),ce=H._vnode.component):w(H._vnode||null,V,H,null,null,null,Q),H._vnode=V,Me||(Me=!0,rm(ce),ug(),Me=!1)},et={p:w,um:Fe,m:Ce,r:qe,mt:Y,mc:x,pc:te,pbc:F,n:ke,o:t};return{render:Ke,hydrate:void 0,createApp:Fb(Ke)}}function bu({type:t,props:e},i){return i==="svg"&&t==="foreignObject"||i==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:i}function ks({effect:t,job:e},i){i?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function Jb(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function Ng(t,e,i=!1){const n=t.children,s=e.children;if(nt(n)&&nt(s))for(let r=0;r>1,t[i[o]]0&&(e[n]=i[r-1]),i[r]=n)}}for(r=i.length,l=i[r-1];r-- >0;)i[r]=l,l=e[l];return i}function Og(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:Og(e)}function gm(t){if(t)for(let e=0;et.__isSuspense;function Qb(t,e){e&&e.pendingBranch?nt(t)?e.effects.push(...t):e.effects.push(t):ob(t)}const G=Symbol.for("v-fgt"),Zl=Symbol.for("v-txt"),bi=Symbol.for("v-cmt"),dl=Symbol.for("v-stc"),Uo=[];let zi=null;function p(t=!1){Uo.push(zi=t?null:[])}function e1(){Uo.pop(),zi=Uo[Uo.length-1]||null}let Xo=1;function Tl(t,e=!1){Xo+=t,t<0&&zi&&e&&(zi.hasOnce=!0)}function Bg(t){return t.dynamicChildren=Xo>0?zi||zr:null,e1(),Xo>0&&zi&&zi.push(t),t}function f(t,e,i,n,s,r){return Bg(a(t,e,i,n,s,r,!0))}function ht(t,e,i,n,s){return Bg(ve(t,e,i,n,s,!0))}function Ko(t){return t?t.__v_isVNode===!0:!1}function zs(t,e){return t.type===e.type&&t.key===e.key}const zg=({key:t})=>t??null,cl=({ref:t,ref_key:e,ref_for:i})=>(typeof t=="number"&&(t=""+t),t!=null?ei(t)||wi(t)||lt(t)?{i:hi,r:t,k:e,f:!!i}:t:null);function a(t,e=null,i=null,n=0,s=null,r=t===G?0:1,l=!1,o=!1){const u={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&zg(e),ref:e&&cl(e),scopeId:cg,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:n,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:hi};return o?(ih(u,i),r&128&&t.normalize(u)):i&&(u.shapeFlag|=ei(i)?8:16),Xo>0&&!l&&zi&&(u.patchFlag>0||r&6)&&u.patchFlag!==32&&zi.push(u),u}const ve=t1;function t1(t,e=null,i=null,n=0,s=null,r=!1){if((!t||t===Tb)&&(t=bi),Ko(t)){const o=Ms(t,e,!0);return i&&ih(o,i),Xo>0&&!r&&zi&&(o.shapeFlag&6?zi[zi.indexOf(t)]=o:zi.push(o)),o.patchFlag=-2,o}if(h1(t)&&(t=t.__vccOpts),e){e=i1(e);let{class:o,style:u}=e;o&&!ei(o)&&(e.class=U(o)),Ft(u)&&(Kc(u)&&!nt(u)&&(u=pi({},u)),e.style=Pt(u))}const l=ei(t)?1:Vg(t)?128:pg(t)?64:Ft(t)?4:lt(t)?2:0;return a(t,e,i,n,s,l,r,!0)}function i1(t){return t?Kc(t)||kg(t)?pi({},t):t:null}function Ms(t,e,i=!1,n=!1){const{props:s,ref:r,patchFlag:l,children:o,transition:u}=t,c=e?n1(s||{},e):s,h={__v_isVNode:!0,__v_skip:!0,type:t.type,props:c,key:c&&zg(c),ref:e&&e.ref?i&&r?nt(r)?r.concat(cl(e)):[r,cl(e)]:cl(e):r,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:o,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==G?l===-1?16:l|16:l,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:u,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&Ms(t.ssContent),ssFallback:t.ssFallback&&Ms(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return u&&n&&jo(h,u.clone(h)),h}function ie(t=" ",e=0){return ve(Zl,null,t,e)}function $i(t,e){const i=ve(dl,null,t);return i.staticCount=e,i}function N(t="",e=!1){return e?(p(),ht(bi,null,t)):ve(bi,null,t)}function xn(t){return t==null||typeof t=="boolean"?ve(bi):nt(t)?ve(G,null,t.slice()):Ko(t)?vs(t):ve(Zl,null,String(t))}function vs(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:Ms(t)}function ih(t,e){let i=0;const{shapeFlag:n}=t;if(e==null)e=null;else if(nt(e))i=16;else if(typeof e=="object")if(n&65){const s=e.default;s&&(s._c&&(s._d=!1),ih(t,s()),s._c&&(s._d=!0));return}else{i=32;const s=e._;!s&&!kg(e)?e._ctx=hi:s===3&&hi&&(hi.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else lt(e)?(e={default:e,_ctx:hi},i=32):(e=String(e),n&64?(i=16,e=[ie(e)]):i=8);t.children=e,t.shapeFlag|=i}function n1(...t){const e={};for(let i=0;i_i||hi;let Al,Rd;{const t=ql(),e=(i,n)=>{let s;return(s=t[i])||(s=t[i]=[]),s.push(n),r=>{s.length>1?s.forEach(l=>l(r)):s[0](r)}};Al=e("__VUE_INSTANCE_SETTERS__",i=>_i=i),Rd=e("__VUE_SSR_SETTERS__",i=>Yo=i)}const ca=t=>{const e=_i;return Al(t),t.scope.on(),()=>{t.scope.off(),Al(e)}},ym=()=>{_i&&_i.scope.off(),Al(null)};function Gg(t){return t.vnode.shapeFlag&4}let Yo=!1;function a1(t,e=!1,i=!1){e&&Rd(e);const{props:n,children:s}=t.vnode,r=Gg(t);Gb(t,n,r,e),jb(t,s,i||e);const l=r?l1(t,e):void 0;return e&&Rd(!1),l}function l1(t,e){const i=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,Cb);const{setup:n}=i;if(n){Zn();const s=t.setupContext=n.length>1?d1(t):null,r=ca(t),l=da(n,t,0,[t.props,s]),o=Vf(l);if(Qn(),r(),(o||t.sp)&&!Wr(t)&&_g(t),o){if(l.then(ym,ym),e)return l.then(u=>{vm(t,u)}).catch(u=>{Xl(u,t,0)});t.asyncDep=l}else vm(t,l)}else Hg(t)}function vm(t,e,i){lt(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Ft(e)&&(t.setupState=og(e)),Hg(t)}function Hg(t,e,i){const n=t.type;t.render||(t.render=n.render||En);{const s=ca(t);Zn();try{Eb(t)}finally{Qn(),s()}}}const u1={get(t,e){return vi(t,"get",""),t[e]}};function d1(t){const e=i=>{t.exposed=i||{}};return{attrs:new Proxy(t.attrs,u1),slots:t.slots,emit:t.emit,expose:e}}function Ql(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(og(Kv(t.exposed)),{get(e,i){if(i in e)return e[i];if(i in Oo)return Oo[i](t)},has(e,i){return i in e||i in Oo}})):t.proxy}function c1(t,e=!0){return lt(t)?t.displayName||t.name:t.name||e&&t.__name}function h1(t){return lt(t)&&"__vccOpts"in t}const hl=(t,e)=>tb(t,e,Yo);function m1(t,e,i){try{Tl(-1);const n=arguments.length;return n===2?Ft(e)&&!nt(e)?Ko(e)?ve(t,null,[e]):ve(t,e):ve(t,null,e):(n>3?i=Array.prototype.slice.call(arguments,2):n===3&&Ko(i)&&(i=[i]),ve(t,e,i))}finally{Tl(1)}}const p1="3.5.26";/** * @vue/runtime-dom v3.5.26 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let ou;const Fh=typeof window<"u"&&window.trustedTypes;if(Fh)try{ou=Fh.createPolicy("vue",{createHTML:t=>t})}catch{}const Kp=ou?t=>ou.createHTML(t):t=>t,bb="http://www.w3.org/2000/svg",_b="http://www.w3.org/1998/Math/MathML",Nn=typeof document<"u"?document:null,Nh=Nn&&Nn.createElement("template"),Sb={insert:(t,e,i)=>{e.insertBefore(t,i||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,i,n)=>{const s=e==="svg"?Nn.createElementNS(bb,t):e==="mathml"?Nn.createElementNS(_b,t):i?Nn.createElement(t,{is:i}):Nn.createElement(t);return t==="select"&&n&&n.multiple!=null&&s.setAttribute("multiple",n.multiple),s},createText:t=>Nn.createTextNode(t),createComment:t=>Nn.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Nn.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,i,n,s,r){const l=i?i.previousSibling:e.lastChild;if(s&&(s===r||s.nextSibling))for(;e.insertBefore(s.cloneNode(!0),i),!(s===r||!(s=s.nextSibling)););else{Nh.innerHTML=Kp(n==="svg"?`${t}`:n==="mathml"?`${t}`:t);const o=Nh.content;if(n==="svg"||n==="mathml"){const d=o.firstChild;for(;d.firstChild;)o.appendChild(d.firstChild);o.removeChild(d)}e.insertBefore(o,i)}return[l?l.nextSibling:e.firstChild,i?i.previousSibling:e.lastChild]}},ts="transition",Yr="animation",Io=Symbol("_vtc"),Yp={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},wb=ci({},bp,Yp),Mb=t=>(t.displayName="Transition",t.props=wb,t),Pb=Mb((t,{slots:e})=>yb(vv,xb(t),e)),xs=(t,e=[])=>{it(t)?t.forEach(i=>i(...e)):t&&t(...e)},Oh=t=>t?it(t)?t.some(e=>e.length>1):t.length>1:!1;function xb(t){const e={};for(const C in t)C in Yp||(e[C]=t[C]);if(t.css===!1)return e;const{name:i="v",type:n,duration:s,enterFromClass:r=`${i}-enter-from`,enterActiveClass:l=`${i}-enter-active`,enterToClass:o=`${i}-enter-to`,appearFromClass:d=r,appearActiveClass:u=l,appearToClass:h=o,leaveFromClass:c=`${i}-leave-from`,leaveActiveClass:f=`${i}-leave-active`,leaveToClass:g=`${i}-leave-to`}=t,y=Tb(s),T=y&&y[0],_=y&&y[1],{onBeforeEnter:v,onEnter:S,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:E=v,onAppear:D=S,onAppearCancelled:P=w}=e,M=(C,z,K,$)=>{C._enterCancelled=$,Ts(C,z?h:o),Ts(C,z?u:l),K&&K()},F=(C,z)=>{C._isLeaving=!1,Ts(C,c),Ts(C,g),Ts(C,f),z&&z()},I=C=>(z,K)=>{const $=C?D:S,W=()=>M(z,C,K);xs($,[z,W]),Uh(()=>{Ts(z,C?d:r),kn(z,C?h:o),Oh($)||Bh(z,n,T,W)})};return ci(e,{onBeforeEnter(C){xs(v,[C]),kn(C,r),kn(C,l)},onBeforeAppear(C){xs(E,[C]),kn(C,d),kn(C,u)},onEnter:I(!1),onAppear:I(!0),onLeave(C,z){C._isLeaving=!0;const K=()=>F(C,z);kn(C,c),C._enterCancelled?(kn(C,f),$h(C)):($h(C),kn(C,f)),Uh(()=>{C._isLeaving&&(Ts(C,c),kn(C,g),Oh(x)||Bh(C,n,_,K))}),xs(x,[C,K])},onEnterCancelled(C){M(C,!1,void 0,!0),xs(w,[C])},onAppearCancelled(C){M(C,!0,void 0,!0),xs(P,[C])},onLeaveCancelled(C){F(C),xs(k,[C])}})}function Tb(t){if(t==null)return null;if(Ft(t))return[Yl(t.enter),Yl(t.leave)];{const e=Yl(t);return[e,e]}}function Yl(t){return Py(t)}function kn(t,e){e.split(/\s+/).forEach(i=>i&&t.classList.add(i)),(t[Io]||(t[Io]=new Set)).add(e)}function Ts(t,e){e.split(/\s+/).forEach(n=>n&&t.classList.remove(n));const i=t[Io];i&&(i.delete(e),i.size||(t[Io]=void 0))}function Uh(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let Ab=0;function Bh(t,e,i,n){const s=t._endId=++Ab,r=()=>{s===t._endId&&n()};if(i!=null)return setTimeout(r,i);const{type:l,timeout:o,propCount:d}=Eb(t,e);if(!l)return n();const u=l+"end";let h=0;const c=()=>{t.removeEventListener(u,f),r()},f=g=>{g.target===t&&++h>=d&&c()};setTimeout(()=>{h(i[y]||"").split(", "),s=n(`${ts}Delay`),r=n(`${ts}Duration`),l=Vh(s,r),o=n(`${Yr}Delay`),d=n(`${Yr}Duration`),u=Vh(o,d);let h=null,c=0,f=0;e===ts?l>0&&(h=ts,c=l,f=r.length):e===Yr?u>0&&(h=Yr,c=u,f=d.length):(c=Math.max(l,u),h=c>0?l>u?ts:Yr:null,f=h?h===ts?r.length:d.length:0);const g=h===ts&&/\b(?:transform|all)(?:,|$)/.test(n(`${ts}Property`).toString());return{type:h,timeout:c,propCount:f,hasTransform:g}}function Vh(t,e){for(;t.lengthzh(i)+zh(t[n])))}function zh(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function $h(t){return(t?t.ownerDocument:document).body.offsetHeight}function Cb(t,e,i){const n=t[Io];n&&(e=(e?[e,...n]:[...n]).join(" ")),e==null?t.removeAttribute("class"):i?t.setAttribute("class",e):t.className=e}const ll=Symbol("_vod"),Jp=Symbol("_vsh"),Wi={name:"show",beforeMount(t,{value:e},{transition:i}){t[ll]=t.style.display==="none"?"":t.style.display,i&&e?i.beforeEnter(t):Jr(t,e)},mounted(t,{value:e},{transition:i}){i&&e&&i.enter(t)},updated(t,{value:e,oldValue:i},{transition:n}){!e!=!i&&(n?e?(n.beforeEnter(t),Jr(t,!0),n.enter(t)):n.leave(t,()=>{Jr(t,!1)}):Jr(t,e))},beforeUnmount(t,{value:e}){Jr(t,e)}};function Jr(t,e){t.style.display=e?t[ll]:"none",t[Jp]=!e}const kb=Symbol(""),Lb=/(?:^|;)\s*display\s*:/;function Rb(t,e,i){const n=t.style,s=Xt(i);let r=!1;if(i&&!s){if(e)if(Xt(e))for(const l of e.split(";")){const o=l.slice(0,l.indexOf(":")).trim();i[o]==null&&ja(n,o,"")}else for(const l in e)i[l]==null&&ja(n,l,"");for(const l in i)l==="display"&&(r=!0),ja(n,l,i[l])}else if(s){if(e!==i){const l=n[kb];l&&(i+=";"+l),n.cssText=i,r=Lb.test(i)}}else e&&t.removeAttribute("style");ll in t&&(t[ll]=r?n.display:"",t[Jp]&&(n.display="none"))}const Gh=/\s*!important$/;function ja(t,e,i){if(it(i))i.forEach(n=>ja(t,e,n));else if(i==null&&(i=""),e.startsWith("--"))t.setProperty(e,i);else{const n=Db(t,e);Gh.test(i)?t.setProperty(vs(n),i.replace(Gh,""),"important"):t[n]=i}}const Hh=["Webkit","Moz","ms"],Jl={};function Db(t,e){const i=Jl[e];if(i)return i;let n=ji(e);if(n!=="filter"&&n in t)return Jl[e]=n;n=Ml(n);for(let s=0;sZl||(Ob.then(()=>Zl=0),Zl=Date.now());function Bb(t,e){const i=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=i.attached)return;rn(Vb(n,i.value),e,5,[n])};return i.value=t,i.attached=Ub(),i}function Vb(t,e){if(it(e)){const i=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{i.call(t),t._stopped=!0},e.map(n=>s=>!s._stopped&&n&&n(s))}else return e}const Yh=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,zb=(t,e,i,n,s,r)=>{const l=s==="svg";e==="class"?Cb(t,n,l):e==="style"?Rb(t,i,n):Sl(e)?lc(e)||Fb(t,e,i,n,r):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):$b(t,e,n,l))?(jh(t,e,n),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&qh(t,e,n,l,r,e!=="value")):t._isVueCE&&(/[A-Z]/.test(e)||!Xt(n))?jh(t,ji(e),n,r,e):(e==="true-value"?t._trueValue=n:e==="false-value"&&(t._falseValue=n),qh(t,e,n,l))};function $b(t,e,i,n){if(n)return!!(e==="innerHTML"||e==="textContent"||e in t&&Yh(e)&&ut(i));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="autocorrect"||e==="sandbox"&&t.tagName==="IFRAME"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const s=t.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Yh(e)&&Xt(i)?!1:e in t}const Br=t=>{const e=t.props["onUpdate:modelValue"]||!1;return it(e)?i=>Ga(e,i):e};function Gb(t){t.target.composing=!0}function Jh(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const $n=Symbol("_assign");function Zh(t,e,i){return e&&(t=t.trim()),i&&(t=Pl(t)),t}const ye={created(t,{modifiers:{lazy:e,trim:i,number:n}},s){t[$n]=Br(s);const r=n||s.props&&s.props.type==="number";hs(t,e?"change":"input",l=>{l.target.composing||t[$n](Zh(t.value,i,r))}),(i||r)&&hs(t,"change",()=>{t.value=Zh(t.value,i,r)}),e||(hs(t,"compositionstart",Gb),hs(t,"compositionend",Jh),hs(t,"change",Jh))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:i,modifiers:{lazy:n,trim:s,number:r}},l){if(t[$n]=Br(l),t.composing)return;const o=(r||t.type==="number")&&!/^0\d/.test(t.value)?Pl(t.value):t.value,d=e??"";o!==d&&(document.activeElement===t&&t.type!=="range"&&(n&&e===i||s&&t.value.trim()===d)||(t.value=d))}},xi={deep:!0,created(t,e,i){t[$n]=Br(i),hs(t,"change",()=>{const n=t._modelValue,s=Fo(t),r=t.checked,l=t[$n];if(it(n)){const o=cc(n,s),d=o!==-1;if(r&&!d)l(n.concat(s));else if(!r&&d){const u=[...n];u.splice(o,1),l(u)}}else if(qr(n)){const o=new Set(n);r?o.add(s):o.delete(s),l(o)}else l(Zp(t,r))})},mounted:Qh,beforeUpdate(t,e,i){t[$n]=Br(i),Qh(t,e,i)}};function Qh(t,{value:e,oldValue:i},n){t._modelValue=e;let s;if(it(e))s=cc(e,n.props.value)>-1;else if(qr(e))s=e.has(n.props.value);else{if(e===i)return;s=Wo(e,Zp(t,!0))}t.checked!==s&&(t.checked=s)}const Dt={deep:!0,created(t,{value:e,modifiers:{number:i}},n){const s=qr(e);hs(t,"change",()=>{const r=Array.prototype.filter.call(t.options,l=>l.selected).map(l=>i?Pl(Fo(l)):Fo(l));t[$n](t.multiple?s?new Set(r):r:r[0]),t._assigning=!0,_c(()=>{t._assigning=!1})}),t[$n]=Br(n)},mounted(t,{value:e}){ef(t,e)},beforeUpdate(t,e,i){t[$n]=Br(i)},updated(t,{value:e}){t._assigning||ef(t,e)}};function ef(t,e){const i=t.multiple,n=it(e);if(!(i&&!n&&!qr(e))){for(let s=0,r=t.options.length;sString(u)===String(o)):l.selected=cc(e,o)>-1}else l.selected=e.has(o);else if(Wo(Fo(l),e)){t.selectedIndex!==s&&(t.selectedIndex=s);return}}!i&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function Fo(t){return"_value"in t?t._value:t.value}function Zp(t,e){const i=e?"_trueValue":"_falseValue";return i in t?t[i]:e}const Hb=["ctrl","shift","alt","meta"],Wb={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>Hb.some(i=>t[`${i}Key`]&&!e.includes(i))},lt=(t,e)=>{const i=t._withMods||(t._withMods={}),n=e.join(".");return i[n]||(i[n]=(s,...r)=>{for(let l=0;l{const i=t._withKeys||(t._withKeys={}),n=e.join(".");return i[n]||(i[n]=s=>{if(!("key"in s))return;const r=vs(s.key);if(e.some(l=>l===r||qb[l]===r))return t(s)})},jb=ci({patchProp:zb},Sb);let tf;function Xb(){return tf||(tf=Qv(jb))}const Kb=(...t)=>{const e=Xb().createApp(...t),{mount:i}=e;return e.mount=n=>{const s=Jb(n);if(!s)return;const r=e._component;!ut(r)&&!r.render&&!r.template&&(r.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const l=i(s,!1,Yb(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),l},e};function Yb(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function Jb(t){return Xt(t)?document.querySelector(t):t}function Qp(t){const e=Number(t);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):.5}function jr(t){const e=Qp(t);return e*e*(3-2*e)}function Mo(t,e,i){const n=jr(i),s=t!=null&&t!=="",r=e!=null&&e!=="";if(!s&&!r)return null;if(!s)return Number(e);if(!r)return Number(t);const l=Number(t),o=Number(e);return!Number.isFinite(l)||!Number.isFinite(o)?r?e:t:l+(o-l)*n}function au(t,e,i){const n=t!=null?String(t).trim():"",s=e!=null?String(e).trim():"";if(!n&&!s)return"";if(!n)return s;if(!s)return n;const r=jr(i);if(r<=.02)return n;if(r>=.98)return s;const l=(1-r).toFixed(2),o=r.toFixed(2);return`(${n}:${l}) (${s}:${o})`}function Zb(t,e,i){const n=t!=null,s=e!=null;return!n&&!s?null:n?s&&jr(i)>=.5?!!e:!!t:!!e}function Qb(t,e,i){const n=jr(i),s=o=>o?typeof o=="object"?o:{name:String(o),strength:1}:null,r=s(t),l=s(e);return!r&&!l?null:r?l?n<.5?{name:r.name,strength:(r.strength??1)*(1-n*2)}:{name:l.name,strength:(l.strength??1)*((n-.5)*2)}:r:l}function e1(t,e,i){const n=l=>!l||typeof l!="object"?{positive:"",negative:""}:{positive:String(l.positive??"").trim(),negative:String(l.negative??"").trim()},s=n(t),r=n(e);return!s.positive&&!s.negative&&!r.positive&&!r.negative?{positive:"",negative:""}:{positive:au(s.positive,r.positive,i)||"",negative:au(s.negative,r.negative,i)||""}}function t1(t,e,i){const n=jr(i),s=o=>!o||typeof o!="object"?null:{slotId:o.slotId||o.id||"CN1",weight:Number(o.weight??.4),start:Number(o.start??0),end:Number(o.end??.9),enabled:o.enabled!==!1},r=s(t),l=s(e);return!r&&!l?null:r?l?{slotId:n<.5?r.slotId:l.slotId,weight:Mo(r.weight,l.weight,n),start:Mo(r.start,l.start,n),end:Mo(r.end,l.end,n),enabled:Zb(r.enabled,l.enabled,n)}:r:l}function Zs(t,e){if(!t)return null;const i=Qp(e);switch(t.type){case"prompt":return au(t.valueA,t.valueB,i);case"param":return Mo(t.valueA,t.valueB,i);case"lora":return Qb(t.valueA,t.valueB,i);case"controlnet":return t1(t.valueA,t.valueB,i);case"style":{const n=e1(t.valueA,t.valueB,i);return!n.positive&&!n.negative?null:n}default:return Mo(t.valueA,t.valueB,i)}}const i1=[{id:"prompt",label:"Prompt"},{id:"style",label:"Style"},{id:"param",label:"Parameter"},{id:"lora",label:"LoRA"},{id:"controlnet",label:"ControlNet"}],ia={W:512,H:512,show_info_on_ui:!1,tiling:!1,restore_faces:!1,seed_resize_from_w:0,seed_resize_from_h:0,seed:-1,sampler:"Euler",scheduler:"sgm_uniform",steps:4,batch_name:"floral_neu",seed_behavior:"random",seed_iter_N:1,use_init:!1,strength:1,strength_0_no_init:!0,init_image:null,use_mask:!1,animation_mode:"2D",max_frames:120,border:"replicate",angle:"0: (0)",zoom:"0: (1.0)",translation_x:"0: (0)",translation_y:"0: (0.0)",translation_z:"0: (0.0)",transform_center_x:"0: (0.5)",transform_center_y:"0: (0.5)",rotation_3d_x:"0: (0)",rotation_3d_y:"0: (0)",rotation_3d_z:"0: (0)",noise_schedule:"0: (0.065)",strength_schedule:"0: (0.60)",keyframe_strength_schedule:"0: (0.50)",contrast_schedule:"0: (1.0)",cfg_scale_schedule:"0:(1)",distilled_cfg_scale_schedule:"0: (1)",enable_steps_scheduling:!1,steps_schedule:"0: (4)",prompts:{0:"silhouette black big wild flowers and wild plants and berries, red background, many different flowers, layered silhouettes, folk art style floral graphics, flat folk art style illustration, layered composition, detailed composition, natural colors, medium high contrast"},positive_prompts:"",negative_prompts:"star, star shape, watermark, signature, dreamstime, logo, writing, text, poster element, year, number, date, label, vignette, glow, symbol, alphabet, number, freepik, blurry, low quality, ugly",fps:24,sd_model_name:"SDXL/sd_xl_turbo_1.0_fp16.safetensors",skip_video_creation:!0,cn_1_enabled:!1,cn_1_weight:"0:(2)",cn_1_guidance_start:"0:(0.0)",cn_1_guidance_end:"0:(1.0)",cn_1_module:"None",cn_1_model:"temporalnetversion2 [b554c208]",cn_1_overwrite_frames:!0,cn_1_vid_path:"",cn_1_mask_vid_path:"",cn_1_low_vram:!1,cn_1_pixel_perfect:!1,cn_1_processor_res:64,cn_1_threshold_a:64,cn_1_threshold_b:64,cn_1_resize_mode:"Inner Fit (Scale to Fit)",cn_1_control_mode:"Balanced",cn_1_loopback_mode:!1,cn_2_overwrite_frames:!0,cn_2_vid_path:"",cn_2_mask_vid_path:"",cn_2_enabled:!1,cn_2_low_vram:!1,cn_2_pixel_perfect:!1,cn_2_module:"none",cn_2_model:"None",cn_2_weight:"0:(1)",cn_2_guidance_start:"0:(0.0)",cn_2_guidance_end:"0:(1.0)",cn_2_processor_res:64,cn_2_threshold_a:64,cn_2_threshold_b:64,cn_2_resize_mode:"Inner Fit (Scale to Fit)",cn_2_control_mode:"Balanced",cn_2_loopback_mode:!1,cn_3_overwrite_frames:!0,cn_3_vid_path:"",cn_3_mask_vid_path:"",cn_3_enabled:!1,cn_3_low_vram:!1,cn_3_pixel_perfect:!1,cn_3_module:"none",cn_3_model:"None",cn_3_weight:"0:(1)",cn_3_guidance_start:"0:(0.0)",cn_3_guidance_end:"0:(1.0)",cn_3_processor_res:64,cn_3_threshold_a:64,cn_3_threshold_b:64,cn_3_resize_mode:"Inner Fit (Scale to Fit)",cn_3_control_mode:"Balanced",cn_3_loopback_mode:!1,cn_4_overwrite_frames:!0,cn_4_vid_path:"",cn_4_mask_vid_path:"",cn_4_enabled:!1,cn_4_low_vram:!1,cn_4_pixel_perfect:!1,cn_4_module:"none",cn_4_model:"None",cn_4_weight:"0:(1)",cn_4_guidance_start:"0:(0.0)",cn_4_guidance_end:"0:(1.0)",cn_4_processor_res:64,cn_4_threshold_a:64,cn_4_threshold_b:64,cn_4_resize_mode:"Inner Fit (Scale to Fit)",cn_4_control_mode:"Balanced",cn_4_loopback_mode:!1,cn_5_overwrite_frames:!0,cn_5_vid_path:"",cn_5_mask_vid_path:"",cn_5_enabled:!1,cn_5_low_vram:!1,cn_5_pixel_perfect:!1,cn_5_module:"none",cn_5_model:"None",cn_5_weight:"0:(1)",cn_5_guidance_start:"0:(0.0)",cn_5_guidance_end:"0:(1.0)",cn_5_processor_res:64,cn_5_threshold_a:64,cn_5_threshold_b:64,cn_5_resize_mode:"Inner Fit (Scale to Fit)",cn_5_control_mode:"Balanced",cn_5_loopback_mode:!1},Dl=[{id:"canvas",label:"Canvas",fields:[{key:"W",label:"Width",type:"number",min:256,max:4096,step:64},{key:"H",label:"Height",type:"number",min:256,max:4096,step:64},{key:"fps",label:"FPS",type:"select",options:["8","12","24","30"]},{key:"max_frames",label:"Max frames",type:"number",min:1,max:99999,step:1},{key:"batch_name",label:"Batch name",type:"text"}]},{id:"sampling",label:"Sampling",fields:[{key:"seed",label:"Seed",type:"number",min:-1,max:2147483647,step:1},{key:"sampler",label:"Sampler",type:"select"},{key:"scheduler",label:"Scheduler",type:"select"},{key:"steps",label:"Steps",type:"slider",min:2,max:150,step:1},{key:"sd_model_name",label:"Checkpoint",type:"text"}]},{id:"prompts",label:"Prompts",fields:[{key:"prompts.0",label:"Prompt @ 0",type:"textarea",rows:4},{key:"negative_prompts",label:"Negative",type:"textarea",rows:3},{key:"positive_prompts",label:"Positive (extra)",type:"textarea",rows:2}]},{id:"init",label:"Init",fields:[{key:"use_init",label:"Use init image",type:"bool"},{key:"strength",label:"Strength",type:"number",min:0,max:1.5,step:.01},{key:"init_image",label:"Init image URL/path",type:"text"}]},{id:"motion",label:"Motion 2D",fields:[{key:"zoom",label:"Zoom schedule",type:"text"},{key:"translation_x",label:"Pan X schedule",type:"text"},{key:"translation_y",label:"Pan Y schedule",type:"text"},{key:"angle",label:"Angle schedule",type:"text"}]},{id:"motion3d",label:"Motion 3D",fields:[{key:"translation_z",label:"Zoom Z schedule",type:"text"},{key:"rotation_3d_x",label:"Rotate X schedule",type:"text"},{key:"rotation_3d_y",label:"Rotate Y schedule",type:"text"},{key:"rotation_3d_z",label:"Rotate Z schedule",type:"text"}]},{id:"schedules",label:"Schedules",fields:[{key:"noise_schedule",label:"Noise",type:"text"},{key:"strength_schedule",label:"Strength",type:"text"},{key:"cfg_scale_schedule",label:"CFG",type:"text"},{key:"steps_schedule",label:"Steps",type:"text"}]}];function Zr(t){const e=`cn_${t}_`,i=t===1?"ControlNet 1":`ControlNet ${t}`;return{id:t===1?"controlnet":`controlnet_${t}`,label:i,fields:[{key:`${e}enabled`,label:"Enabled",type:"bool"},{key:`${e}module`,label:"Module",type:"text"},{key:`${e}model`,label:"Model",type:"text"},{key:`${e}weight`,label:"Weight schedule",type:"text"},{key:`${e}guidance_start`,label:"Guidance start",type:"text"},{key:`${e}guidance_end`,label:"Guidance end",type:"text"},{key:`${e}processor_res`,label:"Processor res",type:"slider",min:64,max:2048,step:1},{key:`${e}threshold_a`,label:"Threshold A",type:"slider",min:0,max:255,step:1},{key:`${e}threshold_b`,label:"Threshold B",type:"slider",min:0,max:255,step:1},{key:`${e}control_mode`,label:"Control mode",type:"text"},{key:`${e}resize_mode`,label:"Resize mode",type:"text"},{key:`${e}pixel_perfect`,label:"Pixel perfect",type:"bool"},{key:`${e}low_vram`,label:"Low VRAM",type:"bool"},{key:`${e}vid_path`,label:"Video path",type:"text"}]}}Dl.push(Zr(1),Zr(2),Zr(3),Zr(4),Zr(5));const lu=Dl.flatMap(t=>t.fields.map(e=>e.key));new Set(Dl.filter(t=>String(t.id).startsWith("controlnet")).map(t=>t.id));const eg=new Set(["translation_z","rotation_3d_x","rotation_3d_y","rotation_3d_z"]),nf="motion3d";function sf(t){return String(t||"2D").trim().toUpperCase()==="3D"?"3D":"2D"}function n1(t){return eg.has(t)}const s1=new Set(["sampler","scheduler","sd_model_name","seed","steps","W","H","fps","max_frames","batch_name"]),r1=["Euler","Euler a","DPM++ 2M","DPM++ SDE","DDIM","Heun"],o1=["automatic","uniform","sgm_uniform","karras","normal","exponential"];function Qs(t={}){const e={};return lu.forEach(i=>{e[i]=t[i]!==!1}),e}function na(t,e){if(!e||!t)return;const i=String(e).split(".");let n=t;for(const s of i){if(n==null)return;n=n[s]}return n}function rf(t,e,i){const n=String(e).split(".");let s=t;for(let r=0;r=0;r-=1){const{parent:l,key:o}=n[r],d=l[o];if(!d||typeof d!="object"||Array.isArray(d)||Object.keys(d).length)break;delete l[o]}}}function tg(t){if(t==null||t==="")return[{frame:0,value:0}];const e=String(t).trim(),i=[],n=/(\d+)\s*:\s*\(?\s*([-\d.eE+]+)\s*\)?/g;let s;for(;(s=n.exec(e))!==null;)i.push({frame:Number(s[1]),value:Number(s[2])});if(!i.length){const r=Number(e.replace(/[()]/g,"").trim());return Number.isFinite(r)?[{frame:0,value:r}]:[{frame:0,value:0}]}return i.sort((r,l)=>r.frame-l.frame),i}function a1(t){const e=Number(t);if(!Number.isFinite(e))return"0";const i=Math.round(e*1e3)/1e3;return String(i)}function l1(t){return(t||[]).map(e=>`${Math.max(0,Math.round(Number(e.frame)||0))}: (${a1(e.value)})`).join(", ")}function of(t,e){var r;const i=tg(t),n=Math.max(0,Math.round(Number(e)||0));let s=((r=i[0])==null?void 0:r.value)??0;for(const l of i)if(l.frame<=n)s=l.value;else break;return s}function d1(t,e,i,n,s=""){const r=Math.max(0,Math.round(Number(t)||0)),l=Math.max(1,Math.round(Number(e)||1)),o=Number(i),d=Number(n),u=Number.isFinite(o)?o:0,h=Number.isFinite(d)?d:u,c=r+l-1,f=[];if(l===1)f.push({frame:r,value:h});else for(let T=0;TT.framec),...f].sort((T,_)=>T.frame-_.frame);return l1(y)}function u1(t,e){const i=String(t).split(".");if(i.length===1)return{[i[0]]:e};const n=i[0],s={};let r=s;for(let l=1;lr.frame-l.frame),i}function af(t){if(t==null||t==="")return!0;const e=String(t).trim();return!!(/\d+\s*:\s*\(?/.test(e)||/^\([\d.eE+\-]+\)$/.test(e))}function ra(t){return Ac(t).every(i=>Math.abs(i.value)<1e-6)}function dn(t){return Ac(t).some(i=>Math.abs(i.value)>1e-6)}function f1(t){const e=t&&t.prompts;if(e&&typeof e=="object"){const n=e[0]??e[0];if(n!=null&&String(n).trim())return String(n).trim();const s=Object.values(e).find(r=>r!=null&&String(r).trim());if(s)return String(s).trim()}const i=t&&t.positive_prompts;return i!=null&&String(i).trim()?String(i).trim():""}function yt(t,e,i,n){const s={field:e,message:i};n&&(s.hint=n),t.push(s)}function m1(t,e={}){var _,v,S;const i=!!e.onlyDefinedKeys,n=w=>!i||t&&Object.prototype.hasOwnProperty.call(t,w),s=[],r=[];if(!t||typeof t!="object"||Array.isArray(t))return yt(s,"settings","Settings must be a JSON object"),{ok:!1,errors:s,warnings:r};const l=Number(t.W),o=Number(t.H);n("W")&&(!Number.isFinite(l)||l<64)?yt(s,"W","Width must be at least 64 pixels"):n("W")&&l%8!==0&&yt(r,"W","Width is not a multiple of 8 — SD/Deforum often works best with divisible-by-8 sizes","Try 768, 832, 1024…"),n("H")&&(!Number.isFinite(o)||o<64)?yt(s,"H","Height must be at least 64 pixels"):n("H")&&o%8!==0&&yt(r,"H","Height is not a multiple of 8","Try 432, 576, 768…"),Number.isFinite(l)&&Number.isFinite(o)&&l*o>1920*1080&&yt(r,"W×H",`Canvas ${l}×${o} is large — may be slow or OOM on consumer GPUs`,"Consider 1280×720 or 1024×576 for iteration");const d=Number(t.max_frames);n("max_frames")&&(!Number.isFinite(d)||d<1)?yt(s,"max_frames","max_frames must be at least 1"):d>8e3&&yt(r,"max_frames",`${d} frames is very long`,"Long runs are costly; confirm duration and disk space");const u=Number(t.fps);n("fps")&&(!Number.isFinite(u)||u<1)?yt(s,"fps","FPS must be at least 1"):u>60&&yt(r,"fps",`${u} FPS is unusually high for Deforum`,"24–30 FPS is typical");const h=Number(t.steps),c=String(t.sd_model_name||"").toLowerCase();n("steps")&&(!Number.isFinite(h)||h<1)?yt(s,"steps","Steps must be at least 1"):h<2&&/lightning|turbo|lcm/.test(c)?yt(r,"steps",`Only ${h} step(s) with a fast/lightning checkpoint`,"Lightning models often expect 2–8 steps"):h>60&&yt(r,"steps",`${h} steps per frame is high`,"Try 4–20 unless you need maximum quality");const f=String(t.batch_name||"").trim();if(f?/^[a-zA-Z0-9_.-]+$/.test(f)||yt(r,"batch_name","Batch name has spaces or special characters","Use letters, numbers, underscore, hyphen"):yt(r,"batch_name","Batch name is empty","Outputs may be harder to find in the runs browser"),f1(t)||yt(s,"prompts",'No positive prompt — add text under Prompts or prompts["0"]'),t.use_init&&!String(t.init_image||"").trim()&&yt(s,"init_image","use_init is enabled but init_image is missing"),t.use_init){const w=Number(t.strength);(!Number.isFinite(w)||w<0||w>1.5)&&yt(r,"strength","Init strength is outside 0–1.5","Typical img2img strength is 0.3–0.85")}const g=String(t.animation_mode||"2D").trim().toUpperCase(),y=g==="WAN VIDEO"||g==="WAN";if(["2D","3D","WAN VIDEO","WAN","ANIMATELCM"].includes(g)||yt(r,"animation_mode",`Unknown animation mode "${t.animation_mode}"`,"Use 2D, 3D, Wan Video, or AnimateLCM"),y){const w=Number(t.wan_inference_steps??t.steps);if((!Number.isFinite(w)||w<1)&&yt(r,"wan_inference_steps","Wan inference steps should be at least 1","Typical range is 5–30"),String(t.animation_prompts||((_=t.prompts)==null?void 0:_["0"])||((v=t.prompts)==null?void 0:v[0])||"").trim()||yt(r,"animation_prompts","Wan Video needs at least one prompt","Set prompts in the Prompts tab or animation_prompts schedule"),t.use_init&&!String(t.init_image||"").trim()&&yt(s,"init_image","Wan I2V init is enabled but no init image is set","Upload an image under WAN → Image init (I2V)"),t.use_init){const x=Number(t.strength);(!Number.isFinite(x)||x<.05)&&yt(r,"strength","Wan init strength is very low","Try 0.5–0.95 for strong I2V conditioning on the first frame")}}else if(g==="2D"){dn(t.translation_z)&&yt(r,"translation_z","3D zoom schedule is non-zero while mode is 2D","Ignored in 2D — use zoom / angle instead");for(const w of["rotation_3d_x","rotation_3d_y","rotation_3d_z"])dn(t[w])&&yt(r,w,"3D rotation schedule is active in 2D mode","Switch to 3D mode or zero this schedule")}else if(g==="3D"){const w=dn(t.translation_z)||dn(t.rotation_3d_x)||dn(t.rotation_3d_y)||dn(t.rotation_3d_z),x=dn(t.translation_x)||dn(t.translation_y)||dn(t.zoom)||dn(t.angle);!w&&!x&&yt(r,"motion","No camera motion in schedules","Add translation, zoom, or 3D rotation keyframes")}for(const w of c1){const x=t[w];x==null||x===""||af(x)||yt(r,w,"Value does not look like a Deforum schedule","Use frame:value pairs, e.g. 0:(1.0) or 0: (0), 24: (1.02)")}ra(t.cfg_scale_schedule)&&ra(t.distilled_cfg_scale_schedule)&&yt(r,"cfg_scale_schedule","CFG schedule is zero everywhere","Deforum may produce blank or weak results — try 0:(7) or similar"),ra(t.strength_schedule)&&!t.use_init&&yt(r,"strength_schedule","Strength schedule is flat at 0","Usually keep strength > 0 for generation");const T=String(t.steps_schedule||"");if(T&&af(T)){const w=(S=Ac(T)[0])==null?void 0:S.value;Number.isFinite(h)&&Number.isFinite(w)&&Math.round(h)!==Math.round(w)&&yt(r,"steps",`UI steps (${h}) differs from steps_schedule (${w})`,"Align steps and steps_schedule")}for(let w=1;w<=5;w+=1){if(!t[`cn_${w}_enabled`])continue;const k=String(t[`cn_${w}_module`]||"").toLowerCase(),E=String(t[`cn_${w}_model`]||"").toLowerCase();(!k||k==="none")&&yt(r,`cn_${w}_module`,"ControlNet enabled but module is None"),(!E||E==="none")&&yt(r,`cn_${w}_model`,"ControlNet enabled but model is None");const D=String(t[`cn_${w}_vid_path`]||"").trim();/video|temporal|animated/i.test(k+E)&&!D&&yt(r,`cn_${w}_vid_path`,"Video/temporal ControlNet without cn_*_vid_path")}for(const w of h1)t[w.replace("_weight","_enabled")]&&ra(t[w])&&yt(r,w,"ControlNet weight schedule is zero while unit is enabled");return String(t.sd_model_name||"").trim()||yt(r,"sd_model_name","No checkpoint selected"),t.skip_video_creation===!1&&yt(r,"skip_video_creation","Video export enabled","Encoding adds time; enable only when you need an MP4"),{ok:s.length===0,errors:s,warnings:r}}const p1="defora_control_token";let lf=!1;function g1(){if(typeof localStorage>"u")return"";try{return localStorage.getItem(p1)||""}catch{return""}}function y1(t){if(typeof window>"u"||typeof URL>"u")return!1;const e=typeof t=="string"||t instanceof URL?t:t&&typeof t.url=="string"?t.url:null;if(!e)return!1;try{const i=new URL(e,window.location.origin);return i.origin===window.location.origin&&i.pathname.startsWith("/api")}catch{return!1}}function ig(t,e={}){const i=g1();if(!i||!y1(t)||typeof Headers>"u")return e;const n=new Headers(e.headers||void 0);return!n.has("Authorization")&&!n.has("X-API-Token")&&!n.has("X-Control-Token")&&n.set("Authorization",`Bearer ${i}`),{...e,headers:n}}function v1(){if(lf||typeof window>"u"||typeof window.fetch!="function")return;const t=window.fetch.bind(window);window.fetch=(e,i={})=>t(e,ig(e,i)),lf=!0}async function Gt(t,e={},i="API"){const n=i||t;try{const s=await fetch(t,ig(t,e));let r=null;if((s.headers.get("content-type")||"").includes("application/json"))try{r=await s.json()}catch{r=null}else{const o=await s.text();o&&(r={_raw:o.slice(0,200)})}if(!s.ok){const o=r&&(r.error||r.message)||s.statusText||`HTTP ${s.status}`;console.error(`[Defora ${n}] ${s.status}: ${o}`,r||"");const d=new Error(o);throw d.status=s.status,d.data=r,d}return{res:s,data:r}}catch(s){throw s.status||console.error(`[Defora ${n}] Network error: ${s.message}`),s}}function b1(t){return t==="sd-forge"?"Forge":t==="cache"?"Cache":t==="placeholder"?"Placeholder":t||"Unknown"}function df(t){if(t==null)return;if(typeof t=="number")return t;const e=String(t),i=e.match(/\(([^)]+)\)/);if(i){const s=parseFloat(i[1]);if(Number.isFinite(s))return s}const n=parseFloat(e);return Number.isFinite(n)?n:e}function _1(t){if(!t||typeof t!="object")return;const e=t.prompts;if(e&&typeof e=="object"){const i=Object.keys(e).sort((n,s)=>Number(n)-Number(s))[0];if(i!=null)return e[i]}return t.animation_prompts_positive||t.prompt}function S1({deforumSettings:t,forgeModel:e}={}){const i=t&&typeof t=="object"?t:{},n=new Map([["model",i.sd_model_name||i.sd_model_checkpoint||e],["seed",i.seed],["steps",i.steps],["frame_count",i.max_frames],["length_frames",i.max_frames],["max_frames",i.max_frames],["fps",i.fps],["tag",i.batch_name],["prompt_positive",_1(i)],["prompt_negative",i.negative_prompts||i.negative_prompt],["cfg",df(i.cfg_scale_schedule)],["strength",df(i.strength_schedule)]]);return{settings:i,byPath:n}}function w1(t,e){if(t===e||t==null&&e==null)return!0;if(typeof t=="number"&&typeof e=="number")return Math.abs(t-e)<1e-9;if(typeof t=="string"&&typeof e=="number"||typeof t=="number"&&typeof e=="string")return String(t)===String(e);try{return JSON.stringify(t)===JSON.stringify(e)}catch{return!1}}function uf(t){if(t===void 0)return"undefined";if(t===null)return"null";if(typeof t=="string")return t.length>160?`${t.slice(0,160)}…`:t;if(typeof t=="object")try{const e=JSON.stringify(t);return e.length>160?`${e.slice(0,160)}…`:e}catch{return String(t)}return String(t)}function M1(t,e){if(!t||!e)return;const i=e.settings||{},n=["job.snapshot.settings.","job.settings.","snapshot.settings."];for(const r of n)if(t.startsWith(r)){const l=t.slice(r.length);return Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0}const s=t.split(/[.[]/)[0];if(e.byPath&&e.byPath.has(s))return e.byPath.get(s);if(Object.prototype.hasOwnProperty.call(i,t))return i[t];if(Object.prototype.hasOwnProperty.call(i,s))return i[s];if(s==="_batch"&&t.includes("model"))return e.byPath.get("model")}function P1(t,e){return Array.isArray(e)&&e.length>16&&/(^|\.)frames$/.test(t)}function Xa(t,e=""){const i=[];if(t==null)return i.push({path:e||"(root)",value:t}),i;if(typeof t!="object")return i.push({path:e||"(root)",value:t}),i;if(Array.isArray(t))return P1(e,t)?(i.push({path:e,value:t,summary:`[${t.length} items] ${t[0]??""}${t.length>1?` … ${t[t.length-1]}`:""}`}),i):t.length===0?(i.push({path:e,value:[]}),i):(t.forEach((s,r)=>{i.push(...Xa(s,`${e}[${r}]`))}),i);const n=Object.keys(t).sort();return e?(n.forEach(s=>i.push(...Xa(t[s],`${e}.${s}`))),i):(n.forEach(s=>i.push(...Xa(t[s],s))),i)}function cf(t,e,{diffOnly:i=!1}={}){if(!t||typeof t!="object")return[];const s=Xa(t).map(r=>{const l=M1(r.path,e),o=l!==void 0,d=o&&!w1(r.value,l);return{path:r.path,value:r.value,displayValue:r.summary!=null?r.summary:uf(r.value),current:l,displayCurrent:o?uf(l):"",hasCurrent:o,differs:d}});return i?s.filter(r=>r.differs):s}function x1(t){if(!t)return"";try{return JSON.stringify(t,null,2)}catch{return String(t)}}function dl(t,e){const i=String(t??"").trim(),n=String(e??"").trim();return n?i?`${i}, ${n}`:n:i}function hf({positive:t,negative:e},i){return i?{positive:dl(t,i.positive),negative:dl(e,i.negative)}:{positive:String(t??"").trim(),negative:String(e??"").trim()}}const T1="SDXL/sd_xl_turbo_1.0_fp16.safetensors",pn="",er={enabled:!1,steps:1,loraTag:pn};function A1(t,e){const i=String(t??"").trim(),n=String(e??"").trim();return!n||i.includes(n)?i:i?`${i}, ${n}`:n}const ng=[{id:"v2_lora_ZoomIn",label:"Zoom In"},{id:"v2_lora_ZoomOut",label:"Zoom Out"},{id:"v2_lora_PanLeft",label:"Pan ←"},{id:"v2_lora_PanRight",label:"Pan →"},{id:"v2_lora_TiltUp",label:"Tilt ↑"},{id:"v2_lora_TiltDown",label:"Tilt ↓"},{id:"v2_lora_RollingClockwise",label:"Roll ↻"},{id:"v2_lora_RollingAnticlockwise",label:"Roll ↺"}],sg="Wan Video",rg=ng,E1=["Turbo","Fast","Balanced","Quality"],ff={Turbo:{wan_speed_preset:"Turbo",wan_inference_steps:8,wan_flash_attention_mode:"Force Flash Attention",wan_enable_interpolation:!1,wan_guidance_scale:6,wan_frame_overlap:1},Fast:{wan_speed_preset:"Fast",wan_inference_steps:12,wan_flash_attention_mode:"Force Flash Attention",wan_enable_interpolation:!0,wan_interpolation_strength:.35,wan_guidance_scale:7,wan_frame_overlap:2},Balanced:{wan_speed_preset:"Balanced",wan_inference_steps:20,wan_flash_attention_mode:"Auto (Recommended)",wan_enable_interpolation:!0,wan_interpolation_strength:.5,wan_guidance_scale:7.5,wan_frame_overlap:2},Quality:{wan_speed_preset:"Quality",wan_inference_steps:35,wan_flash_attention_mode:"Auto (Recommended)",wan_enable_interpolation:!0,wan_interpolation_strength:.65,wan_guidance_scale:8,wan_frame_overlap:3}},C1=["Static","Dolly","Pan","Handheld","Cinematic"],mf={Static:{wan_motion_preset:"Static",wan_motion_strength:.45,wan_motion_strength_override:!0,wan_movement_sensitivity:.6,wan_frame_overlap:1,wan_enable_interpolation:!1},Dolly:{wan_motion_preset:"Dolly",wan_motion_strength:1,wan_motion_strength_override:!0,wan_movement_sensitivity:1,wan_frame_overlap:2,wan_enable_interpolation:!0,wan_interpolation_strength:.45},Pan:{wan_motion_preset:"Pan",wan_motion_strength:.9,wan_motion_strength_override:!0,wan_movement_sensitivity:1.15,wan_frame_overlap:2,wan_enable_interpolation:!0,wan_interpolation_strength:.5},Handheld:{wan_motion_preset:"Handheld",wan_motion_strength:.75,wan_motion_strength_override:!0,wan_movement_sensitivity:1.35,wan_frame_overlap:3,wan_enable_interpolation:!0,wan_interpolation_strength:.55},Cinematic:{wan_motion_preset:"Cinematic",wan_motion_strength:1.1,wan_motion_strength_override:!0,wan_movement_sensitivity:.85,wan_frame_overlap:4,wan_enable_interpolation:!0,wan_interpolation_strength:.7}},Po=[{id:"vace-1.3b",label:"VACE 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-VACE-1.3B",t2vModel:"1.3B VACE",preferredSize:"1.3B VACE (Recommended)",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-VACE-1.3B --local-dir models/wan"},{id:"vace-14b",label:"VACE 14B (~75GB)",hfRepo:"Wan-AI/Wan2.1-VACE-14B",t2vModel:"14B VACE",preferredSize:"14B VACE",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-VACE-14B --local-dir models/wan"},{id:"t2v-1.3b",label:"T2V 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-T2V-1.3B",t2vModel:"1.3B T2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-T2V-1.3B --local-dir models/wan"},{id:"i2v-1.3b",label:"I2V 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-I2V-1.3B",i2vModel:"1.3B I2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-I2V-1.3B --local-dir models/wan"},{id:"i2v-14b",label:"I2V 14B (~75GB)",hfRepo:"Wan-AI/Wan2.1-I2V-14B",i2vModel:"14B I2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-I2V-14B --local-dir models/wan"},{id:"qwen-3b",label:"Qwen 2.5-VL-3B (prompt enhancer)",kind:"qwen",qwenModel:"Qwen2.5-VL-3B",hfRepo:"Qwen/Qwen2.5-VL-3B-Instruct",hfCommand:"huggingface-cli download Qwen/Qwen2.5-VL-3B-Instruct --local-dir models/qwen"}],og=new Set(rg.map(t=>t.id)),ag=new Set(["wan_speed_preset","wan_motion_preset","motion_loras","motion_lora_weight","wan_use_init_image","wan_init_image","wan_i2v_init_strength"]);function k1(t){return Po.find(e=>e.id===t)||Po[0]}function L1(t){return ff[t]||ff.Balanced}function R1(t){return mf[t]||mf.Static}const Vr={wan_speed_preset:"Balanced",wan_motion_preset:"Static",motion_loras:[],motion_lora_weight:.8,wan_use_init_image:!1,wan_init_image:null,wan_i2v_init_strength:.85,wan_t2v_model:"1.3B VACE",wan_i2v_model:"Use Primary Model",wan_auto_download:!0,wan_preferred_size:"1.3B VACE (Recommended)",wan_model_path:"models/wan",wan_resolution:"864x480 (Landscape)",wan_seed:-1,wan_inference_steps:20,wan_strength_override:!0,wan_fixed_strength:1,wan_guidance_override:!0,wan_guidance_scale:7.5,wan_frame_overlap:2,wan_motion_strength:1,wan_motion_strength_override:!1,wan_enable_interpolation:!0,wan_interpolation_strength:.5,wan_flash_attention_mode:"Auto (Recommended)",wan_qwen_model:"Auto-Select",wan_qwen_auto_download:!1,wan_qwen_language:"English",wan_movement_sensitivity:1},D1=["Auto-Detect","1.3B VACE","14B VACE","1.3B T2V","14B T2V","Custom Path"],lg=["Use Primary Model","Use T2V Model (No Continuity)","1.3B VACE","14B VACE","1.3B I2V","14B I2V"],du=["864x480 (Landscape)","480x864 (Portrait)","1280x720 (Landscape HD)","720x1280 (Portrait HD)","854x480","480x854"],I1=["Auto (Recommended)","Force Flash Attention","Force PyTorch"],F1=["Auto-Select","Qwen2.5-VL-3B","Qwen2.5-VL-7B","Qwen-VL-Chat"],dg=[{key:"wan_t2v_model",label:"T2V model",type:"select",options:D1},{key:"wan_i2v_model",label:"I2V model",type:"select",options:lg},{key:"wan_resolution",label:"Resolution",type:"select",options:du},{key:"wan_inference_steps",label:"Inference steps",type:"number",min:5,max:100,step:1},{key:"wan_guidance_scale",label:"Guidance scale",type:"number",min:1,max:20,step:.5,when:t=>t.wan_guidance_override!==!1},{key:"wan_guidance_override",label:"Override guidance",type:"boolean"},{key:"wan_fixed_strength",label:"I2V strength",type:"number",min:0,max:1,step:.05,when:t=>t.wan_strength_override!==!1},{key:"wan_strength_override",label:"Override strength schedule",type:"boolean"},{key:"wan_frame_overlap",label:"Frame overlap",type:"number",min:0,max:10,step:1},{key:"wan_motion_strength",label:"Motion strength",type:"number",min:0,max:2,step:.05},{key:"wan_motion_strength_override",label:"Fixed motion strength",type:"boolean"},{key:"wan_movement_sensitivity",label:"Movement sensitivity",type:"number",min:.1,max:2,step:.05},{key:"wan_interpolation_strength",label:"Interpolation strength",type:"number",min:0,max:1,step:.05,when:t=>t.wan_enable_interpolation!==!1},{key:"wan_enable_interpolation",label:"Clip interpolation",type:"boolean"},{key:"wan_seed",label:"Wan seed",type:"number",min:-1,max:2147483647,step:1},{key:"wan_auto_download",label:"Auto-download models",type:"boolean"},{key:"wan_flash_attention_mode",label:"Flash attention",type:"select",options:I1},{key:"wan_preferred_size",label:"Preferred size",type:"select",options:["1.3B VACE (Recommended)","14B VACE","Legacy Models"]},{key:"wan_model_path",label:"Model path",type:"text",when:t=>String(t.wan_t2v_model||"").includes("Custom")},{key:"wan_qwen_model",label:"Qwen enhancer",type:"select",options:F1},{key:"wan_qwen_auto_download",label:"Qwen auto-download",type:"boolean"},{key:"wan_qwen_language",label:"Qwen language",type:"select",options:["English","Chinese"]}];function ul(t){const e=String(t||"").match(/(\d+)\s*x\s*(\d+)/i);return e?{width:Number(e[1]),height:Number(e[2])}:null}function N1(t,e){const i=Number(t),n=Number(e);if(!Number.isFinite(i)||!Number.isFinite(n)||i<1||n<1)return null;const s=i/n;let r=du[0],l=1/0;for(const o of du){const d=ul(o);if(!d)continue;const u=d.width/d.height,h=Math.abs(Math.log(s/u)),c=Math.abs(d.width-i)+Math.abs(d.height-n),f=h*1e3+c;fog.has(h)).map(h=>``).join(" ");if(l)for(const h of Object.keys(s))s[h]=`${String(s[h]||"").trimEnd()} ${l}`.trimStart();const o={...t,animation_mode:sg,skip_video_creation:!1,animation_prompts:Object.keys(s).length?JSON.stringify(s):O1(t,i),animation_prompts_positive:(t==null?void 0:t.animation_prompts_positive)??(t==null?void 0:t.positive_prompts)??"",animation_prompts_negative:(t==null?void 0:t.animation_prompts_negative)??(t==null?void 0:t.negative_prompts)??""};for(const h of Object.keys(Vr))ag.has(h)||n[h]!==void 0&&(o[h]=n[h]);const d=ul(n.wan_resolution);d&&(o.W=d.width,o.H=d.height),n.wan_seed!=null&&Number.isFinite(Number(n.wan_seed))&&(o.seed=Number(n.wan_seed));const u=String(n.wan_init_image||o.init_image||"").trim();if(n.wan_use_init_image&&u){o.use_init=!0,o.init_image=u;const h=Number(n.wan_i2v_init_strength);Number.isFinite(h)&&(o.strength=Math.max(0,Math.min(1,h))),n.wan_strength_override!==!1&&(o.wan_strength_override=!0,o.wan_fixed_strength=o.strength)}else n.wan_use_init_image===!1&&(o.use_init=!1);return o}function un(t={}){const e={...Vr};for(const i of Object.keys(Vr)){if(t[i]===void 0)continue;if(i==="motion_loras"&&Array.isArray(t.motion_loras)){e.motion_loras=t.motion_loras.filter(s=>og.has(s));continue}if(i==="wan_init_image"){const s=t.wan_init_image;e.wan_init_image=s==null||s===""?null:String(s);continue}if(i==="wan_use_init_image"){e.wan_use_init_image=!!t.wan_use_init_image&&!!String(t.wan_init_image||"").trim();continue}if(i==="wan_i2v_init_strength"){const s=Number(t.wan_i2v_init_strength);Number.isFinite(s)&&(e.wan_i2v_init_strength=Math.max(0,Math.min(1,s)));continue}const n=dg.find(s=>s.key===i);if((n==null?void 0:n.type)==="boolean")e[i]=!!t[i];else if((n==null?void 0:n.type)==="number"){const s=Number(t[i]);Number.isFinite(s)&&(e[i]=s)}else e[i]=String(t[i])}return String(e.wan_init_image||"").trim()||(e.wan_init_image=null,e.wan_use_init_image=!1),e}function B1(t){const e=t||Vr,i=e.wan_use_init_image&&String(e.wan_init_image||"").trim();return dg.filter(n=>ag.has(n.key)||i&&n.key==="wan_i2v_model"?!1:typeof n.when=="function"?n.when(e):!0)}function V1(t,e={}){const i=k1(t),n={...e,wan_auto_download:!0,wan_model_path:e.wan_model_path||"models/wan"};return i.kind==="qwen"?(n.wan_qwen_auto_download=!0,n.wan_qwen_model=i.qwenModel||"Qwen2.5-VL-3B",n):(i.t2vModel&&(n.wan_t2v_model=i.t2vModel),i.i2vModel&&(n.wan_i2v_model=i.i2vModel),i.preferredSize&&(n.wan_preferred_size=i.preferredSize),n)}const ug="AnimateLCM",cg=[{id:"static",label:"Static"},{id:"pan",label:"Pan"},{id:"zoom",label:"Zoom"},{id:"orbit",label:"Orbit"},{id:"handheld",label:"Handheld"},{id:"custom",label:"Custom"}],hg=ng,cl={motion_type:"pan",motion_preset:"Static",alcm_motion_amount:1,alcm_strength:.75,alcm_cfg:7,alcm_steps:4,alcm_noise:.05,alcm_contrast:1,alcm_zoom:1,alcm_pan_x:0,alcm_pan_y:0,alcm_seed:-1,motion_loras:[],motion_lora_weight:.8},Ec=[{key:"motion_type",label:"Motion type",type:"select",options:cg.map(t=>t.id)},{key:"motion_preset",label:"Motion preset",type:"text"},{key:"alcm_motion_amount",label:"Motion amount",type:"number",min:0,max:2,step:.05},{key:"alcm_strength",label:"Strength",type:"number",min:0,max:1.5,step:.01},{key:"alcm_cfg",label:"CFG",type:"number",min:0,max:30,step:.1},{key:"alcm_steps",label:"Steps",type:"number",min:1,max:20,step:1},{key:"alcm_noise",label:"Noise",type:"number",min:0,max:.5,step:.005},{key:"alcm_contrast",label:"Contrast",type:"number",min:0,max:2,step:.01},{key:"alcm_zoom",label:"Zoom",type:"number",min:.5,max:2,step:.01},{key:"alcm_pan_x",label:"Pan X",type:"number",min:-10,max:10,step:.05},{key:"alcm_pan_y",label:"Pan Y",type:"number",min:-10,max:10,step:.05},{key:"alcm_seed",label:"Seed",type:"number",min:-1,max:2147483647,step:1},{key:"motion_lora_weight",label:"LoRA weight",type:"number",min:0,max:1.5,step:.05}],z1=new Set(hg.map(t=>t.id));new Set(Ec.map(t=>t.key));function td(t={}){const e={...cl};for(const i of Ec)if(t[i.key]!==void 0)if(i.type==="number"){const n=Number(t[i.key]);Number.isFinite(n)&&(e[i.key]=n)}else e[i.key]=String(t[i.key]);return Array.isArray(t.motion_loras)&&(e.motion_loras=t.motion_loras.filter(i=>z1.has(i))),e}function $1(t,e,{positivePrompt:i=""}={}){const n={...cl,...e||{}},s=t!=null&&t.prompts&&typeof t.prompts=="object"&&!Array.isArray(t.prompts)?{...t.prompts}:{},r=String(i||"").trim();r&&(s[0]=r);const l=(Array.isArray(n.motion_loras)?n.motion_loras:[]).map(d=>``).join(" ");if(l)for(const d of Object.keys(s))s[d]=`${String(s[d]||"").trimEnd()} ${l}`.trimStart();const o={...t,animation_mode:ug,skip_video_creation:!1};Object.keys(s).length&&(o.prompts=s);for(const d of Object.keys(cl))d==="motion_loras"||d==="motion_lora_weight"||n[d]!==void 0&&(o[d]=n[d]);return n.alcm_seed!=null&&Number.isFinite(Number(n.alcm_seed))&&(o.seed=Number(n.alcm_seed)),Number.isFinite(Number(n.alcm_steps))&&(o.steps=Math.max(1,Math.round(Number(n.alcm_steps))),o.steps_schedule=`0: (${o.steps})`),o}const id=[{id:"strength",label:"Strength",min:0,max:1.5,step:.01,default:.65},{id:"motion",label:"Motion",min:0,max:2.5,step:.01,default:.75},{id:"noise",label:"Noise",min:0,max:1,step:.01,default:.2},{id:"contrast",label:"Contrast",min:0,max:2,step:.01,default:1},{id:"cfg",label:"CFG",min:0,max:30,step:.1,default:6},{id:"zoom",label:"Zoom",min:-5,max:5,step:.05,default:0},{id:"pan_x",label:"Pan X",min:-10,max:10,step:.05,default:0},{id:"pan_y",label:"Pan Y",min:-10,max:10,step:.05,default:0}],G1={webgl:{strength:{type:"animation",field:"glow"},motion:{type:"animation",field:"speed"},noise:{type:"animation",field:"spread"},contrast:{type:"animation",field:"pulse"},cfg:{type:"animation",field:"hue"},zoom:{type:"animation",field:"orbit"},pan_x:{type:"disabled"},pan_y:{type:"disabled"}},deforum:{strength:{type:"schedule",key:"strength_schedule"},motion:{type:"schedule",key:"translation_z"},noise:{type:"schedule",key:"noise_schedule"},contrast:{type:"schedule",key:"contrast_schedule"},cfg:{type:"schedule",key:"cfg_scale_schedule"},zoom:{type:"schedule",key:"zoom"},pan_x:{type:"schedule",key:"translation_x"},pan_y:{type:"schedule",key:"translation_y"}},wan:{strength:{type:"wan",key:"wan_fixed_strength"},motion:{type:"wan",key:"wan_motion_strength"},noise:{type:"wan",key:"wan_movement_sensitivity"},contrast:{type:"wan",key:"wan_interpolation_strength"},cfg:{type:"wan",key:"wan_guidance_scale"},zoom:{type:"disabled"},pan_x:{type:"disabled"},pan_y:{type:"disabled"}},animatelcm:{strength:{type:"animatelcm",key:"alcm_strength"},motion:{type:"animatelcm",key:"alcm_motion_amount"},noise:{type:"animatelcm",key:"alcm_noise"},contrast:{type:"animatelcm",key:"alcm_contrast"},cfg:{type:"animatelcm",key:"alcm_cfg"},zoom:{type:"animatelcm",key:"alcm_zoom"},pan_x:{type:"animatelcm",key:"alcm_pan_x"},pan_y:{type:"animatelcm",key:"alcm_pan_y"}}};function H1(t){const e=String(t||"").match(/^([a-z]+)\.common\.([a-z_]+)$/);return e?{pluginId:e[1],paramId:e[2]}:null}function uu(t,e){var i;return((i=G1[t])==null?void 0:i[e])||{type:"disabled"}}function W1(t,e){return uu(t,e).type!=="disabled"}const nt=(t,e)=>{const i=t.__vccOpts||t;for(const[n,s]of e)i[n]=s;return i},q1={name:"UiIcon",props:{name:{type:String,required:!0}}},j1={key:0,d:"M8 6.5V17.5L17 12L8 6.5Z",fill:"currentColor"},X1={key:2,x:"6.5",y:"6.5",width:"11",height:"11",rx:"2",fill:"currentColor"},K1={key:3,cx:"12",cy:"12",r:"5",fill:"currentColor"},Y1={key:8,d:"M13 2.5L6.5 13.5H11.5L10.5 21.5L17 10.5H12L13 2.5Z",fill:"currentColor",stroke:"currentColor","stroke-width":"0.5","stroke-linejoin":"round"},J1={key:10,d:"M2.5 12C4.4 12 4.4 7 6.3 7C8.2 7 8.2 17 10.1 17C12 17 12 7 13.9 7C15.8 7 15.8 17 17.7 17C19.6 17 19.6 12 21.5 12",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},Z1={key:13,d:"M6 14L12 8L18 14",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Q1={key:14,d:"M6 10L12 16L18 10",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},e0={key:19,d:"M3 13C4.4 13 4.8 8 6.3 8C7.8 8 8.2 16 9.7 16C11.2 16 11.6 5 13.1 5C14.6 5 15 19 16.5 19C18 19 18.4 11 19.9 11C20.7 11 21.3 12 21 13",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"};function t0(t,e,i,n,s,r){return m(),p("svg",{class:B(["ui-icon",`ui-icon--${i.name}`]),viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true"},[i.name==="play"?(m(),p("path",j1)):i.name==="pause"?(m(),p(H,{key:1},[e[0]||(e[0]=a("rect",{x:"7",y:"6",width:"3.5",height:"12",rx:"1",fill:"currentColor"},null,-1)),e[1]||(e[1]=a("rect",{x:"13.5",y:"6",width:"3.5",height:"12",rx:"1",fill:"currentColor"},null,-1))],64)):i.name==="stop"?(m(),p("rect",X1)):i.name==="record"?(m(),p("circle",K1)):i.name==="image"?(m(),p(H,{key:4},[e[2]||(e[2]=a("rect",{x:"4",y:"5",width:"16",height:"14",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[3]||(e[3]=a("circle",{cx:"9",cy:"10",r:"1.5",fill:"currentColor"},null,-1)),e[4]||(e[4]=a("path",{d:"M6 16L10 12L13 14.8L16 11L18 13.5V17H6V16Z",fill:"currentColor",opacity:"0.9"},null,-1))],64)):i.name==="broadcast"?(m(),p(H,{key:5},[e[5]||(e[5]=a("path",{d:"M5 12C8.5 12 12 15.5 12 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[6]||(e[6]=a("path",{d:"M5 7C11.2 7 17 12.8 17 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[7]||(e[7]=a("path",{d:"M5 2C14 2 22 10 22 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[8]||(e[8]=a("circle",{cx:"5",cy:"19",r:"2",fill:"currentColor"},null,-1))],64)):i.name==="sliders"?(m(),p(H,{key:6},[e[9]||(e[9]=Bi('',6))],64)):i.name==="film"?(m(),p(H,{key:7},[e[10]||(e[10]=Bi('',5))],64)):i.name==="lightning"?(m(),p("path",Y1)):i.name==="sparkles"?(m(),p(H,{key:9},[e[11]||(e[11]=a("path",{d:"M12 3.5L13.7 8.3L18.5 10L13.7 11.7L12 16.5L10.3 11.7L5.5 10L10.3 8.3L12 3.5Z",fill:"currentColor"},null,-1)),e[12]||(e[12]=a("path",{d:"M18.5 3L19.2 5L21.2 5.7L19.2 6.4L18.5 8.4L17.8 6.4L15.8 5.7L17.8 5L18.5 3Z",fill:"currentColor",opacity:"0.75"},null,-1)),e[13]||(e[13]=a("path",{d:"M5.2 14.6L5.8 16.2L7.4 16.8L5.8 17.4L5.2 19L4.6 17.4L3 16.8L4.6 16.2L5.2 14.6Z",fill:"currentColor",opacity:"0.75"},null,-1))],64)):i.name==="wave"?(m(),p("path",J1)):i.name==="folder"?(m(),p(H,{key:11},[e[14]||(e[14]=a("path",{d:"M3.5 7.5A2.5 2.5 0 0 1 6 5h3.2l1.6 1.8H18A2.5 2.5 0 0 1 20.5 9.3v7.2A2.5 2.5 0 0 1 18 19H6a2.5 2.5 0 0 1-2.5-2.5v-9Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[15]||(e[15]=a("path",{d:"M3.8 9h16.4",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="gear"?(m(),p(H,{key:12},[e[16]||(e[16]=a("path",{d:"M12 8.2A3.8 3.8 0 1 0 12 15.8A3.8 3.8 0 1 0 12 8.2Z",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[17]||(e[17]=a("path",{d:"M12 3.8V5.4M12 18.6V20.2M5.5 6.5L6.7 7.7M17.3 18.3L18.5 19.5M3.8 12H5.4M18.6 12H20.2M5.5 17.5L6.7 16.3M17.3 5.7L18.5 4.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="chevron-up"?(m(),p("path",Z1)):i.name==="chevron-down"?(m(),p("path",Q1)):i.name==="panel-bottom"?(m(),p(H,{key:15},[e[18]||(e[18]=a("rect",{x:"4",y:"5",width:"16",height:"11",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[19]||(e[19]=a("path",{d:"M8 14H16",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.55"},null,-1)),e[20]||(e[20]=a("path",{d:"M12 8.5V12.5",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1)),e[21]||(e[21]=a("path",{d:"M9.5 10.5L12 8L14.5 10.5",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="close"?(m(),p(H,{key:16},[e[22]||(e[22]=a("path",{d:"M7 7L17 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1)),e[23]||(e[23]=a("path",{d:"M17 7L7 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1))],64)):i.name==="shuffle"?(m(),p(H,{key:17},[e[24]||(e[24]=a("path",{d:"M4 7H6.5C8.5 7 9.8 7.5 11.2 9.4L12.5 11.1C13.9 13 15.2 13.5 17.2 13.5H20",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[25]||(e[25]=a("path",{d:"M4 17H6.5C8.2 17 9.4 16.6 10.6 15.1L13.4 11.5C14.6 10 15.8 9.5 17.5 9.5H20",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[26]||(e[26]=a("path",{d:"M17 6.5L20 9.5L17 12.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[27]||(e[27]=a("path",{d:"M17 10.5L20 13.5L17 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="sparkles"?(m(),p(H,{key:18},[e[28]||(e[28]=a("path",{d:"M12 3.8L13.7 8.3L18.2 10L13.7 11.7L12 16.2L10.3 11.7L5.8 10L10.3 8.3L12 3.8Z",stroke:"currentColor","stroke-width":"1.7","stroke-linejoin":"round"},null,-1)),e[29]||(e[29]=a("path",{d:"M18.5 4.5L19.2 6.3L21 7L19.2 7.7L18.5 9.5L17.8 7.7L16 7L17.8 6.3L18.5 4.5Z",fill:"currentColor"},null,-1)),e[30]||(e[30]=a("path",{d:"M6 15.5L6.8 17.5L8.8 18.3L6.8 19.1L6 21.1L5.2 19.1L3.2 18.3L5.2 17.5L6 15.5Z",fill:"currentColor"},null,-1))],64)):i.name==="wave"?(m(),p("path",e0)):i.name==="gear"?(m(),p(H,{key:20},[e[31]||(e[31]=Bi('',9))],64)):i.name==="arrow-left"?(m(),p(H,{key:21},[e[32]||(e[32]=a("path",{d:"M15.5 7.5L10.5 12L15.5 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[33]||(e[33]=a("path",{d:"M11 12H19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="arrow-right"?(m(),p(H,{key:22},[e[34]||(e[34]=a("path",{d:"M8.5 7.5L13.5 12L8.5 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[35]||(e[35]=a("path",{d:"M13 12H5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="rotate-ccw"?(m(),p(H,{key:23},[e[36]||(e[36]=a("path",{d:"M8 7H4V3",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[37]||(e[37]=a("path",{d:"M4.5 7.5C6.1 5.1 8.8 3.5 12 3.5C17 3.5 21 7.5 21 12.5C21 17.5 17 21.5 12 21.5C7.8 21.5 4.3 18.6 3.3 14.8",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="size-small"?(m(),p(H,{key:24},[e[38]||(e[38]=a("rect",{x:"4.5",y:"6.5",width:"15",height:"11",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[39]||(e[39]=a("path",{d:"M6.5 9.2H12",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.85"},null,-1)),e[40]||(e[40]=a("path",{d:"M6.5 12H10.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.75"},null,-1))],64)):i.name==="size-medium"?(m(),p(H,{key:25},[e[41]||(e[41]=a("rect",{x:"4.5",y:"5.5",width:"15",height:"13",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[42]||(e[42]=a("path",{d:"M6.5 9H17.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.85"},null,-1)),e[43]||(e[43]=a("path",{d:"M6.5 12.5H15",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.75"},null,-1))],64)):i.name==="size-full"?(m(),p(H,{key:26},[e[44]||(e[44]=Bi('',5))],64)):i.name==="help"?(m(),p(H,{key:27},[e[45]||(e[45]=a("circle",{cx:"12",cy:"12",r:"8.5",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[46]||(e[46]=a("path",{d:"M9.8 9.3C10 8.2 10.9 7.4 12.1 7.4C13.5 7.4 14.5 8.3 14.5 9.5C14.5 10.5 13.9 11.1 13.1 11.7C12.3 12.3 11.8 12.8 11.8 13.9",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[47]||(e[47]=a("circle",{cx:"12",cy:"16.8",r:"1",fill:"currentColor"},null,-1))],64)):i.name==="mic"?(m(),p(H,{key:28},[e[48]||(e[48]=a("rect",{x:"9",y:"3.8",width:"6",height:"10",rx:"3",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[49]||(e[49]=a("path",{d:"M6.8 11.5C6.8 14.2 9 16.4 11.8 16.4H12.2C15 16.4 17.2 14.2 17.2 11.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[50]||(e[50]=a("path",{d:"M12 16.4V20.2",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[51]||(e[51]=a("path",{d:"M9 20.2H15",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="history"?(m(),p(H,{key:29},[e[52]||(e[52]=a("path",{d:"M12 4.2A8 8 0 1 1 4.5 9.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[53]||(e[53]=a("path",{d:"M4.2 4.8V9.4H8.8",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[54]||(e[54]=a("path",{d:"M12 8V12.2L14.8 14",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="save"?(m(),p(H,{key:30},[e[55]||(e[55]=a("path",{d:"M6 4.5H15L18.5 8V19.5A1.5 1.5 0 0 1 17 21H7A1.5 1.5 0 0 1 5.5 19.5V6A1.5 1.5 0 0 1 6 4.5Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[56]||(e[56]=a("path",{d:"M8 4.5V9H14V4.5",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[57]||(e[57]=a("rect",{x:"8",y:"13",width:"8",height:"5",rx:"1",stroke:"currentColor","stroke-width":"1.8"},null,-1))],64)):i.name==="load"?(m(),p(H,{key:31},[e[58]||(e[58]=a("path",{d:"M12 4.5V13.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[59]||(e[59]=a("path",{d:"M8.5 10L12 13.5L15.5 10",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[60]||(e[60]=a("path",{d:"M5.5 16.5V18A1.5 1.5 0 0 0 7 19.5H17A1.5 1.5 0 0 0 18.5 18V16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="pin"?(m(),p(H,{key:32},[e[61]||(e[61]=a("path",{d:"M12 17.5V21",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[62]||(e[62]=a("path",{d:"M8.5 3.5H15.5L14 8.5H10L8.5 3.5Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[63]||(e[63]=a("path",{d:"M10 8.5H14V12.5C14 14.4 13.1 15.8 12 17.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="lock"?(m(),p(H,{key:33},[e[64]||(e[64]=a("rect",{x:"7",y:"10",width:"10",height:"8.5",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[65]||(e[65]=a("path",{d:"M9 10V8.2C9 6.4 10.3 5 12 5C13.7 5 15 6.4 15 8.2V10",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="eye"?(m(),p(H,{key:34},[e[66]||(e[66]=a("path",{d:"M2.5 12C4.2 8.2 7.7 5.5 12 5.5C16.3 5.5 19.8 8.2 21.5 12C19.8 15.8 16.3 18.5 12 18.5C7.7 18.5 4.2 15.8 2.5 12Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[67]||(e[67]=a("circle",{cx:"12",cy:"12",r:"2.8",stroke:"currentColor","stroke-width":"1.8"},null,-1))],64)):i.name==="eye-off"?(m(),p(H,{key:35},[e[68]||(e[68]=a("path",{d:"M4.5 4.5L19.5 19.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[69]||(e[69]=a("path",{d:"M8.2 8.8C7.2 9.8 6.5 10.9 6 12C7.7 15.8 11.2 18.5 15.5 18.5C16.7 18.5 17.8 18.2 18.8 17.6",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[70]||(e[70]=a("path",{d:"M10.2 6.4C10.8 6.2 11.4 6.1 12 6.1C16.3 6.1 19.8 8.8 21.5 12.5C20.8 13.9 19.8 15.1 18.5 16",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):N("",!0)],2)}const Kt=nt(q1,[["render",t0],["__scopeId","data-v-f0fded0e"]]),i0={name:"StatusStrip",components:{UiIcon:Kt},emits:["toggle-play","stop-play","toggle-record","start-hls-watch","stop-hls-watch","generate-preview","toggle-ws","open-midi","open-gpus","select-session","new-session","purge-session","restore-session","reset-layout"],props:{playing:{type:Boolean,default:!1},recording:{type:Boolean,default:!1},hlsWatchEnabled:{type:Boolean,default:!1},hlsPreviewValid:{type:Boolean,default:!1},previewGenerating:{type:Boolean,default:!1},frameProcessingActive:{type:Boolean,default:!1},frameProcessingLabel:{type:String,default:""},frameProcessingHint:{type:String,default:""},previewDisabled:{type:Boolean,default:!1},apiHealth:{type:Object,default:()=>({})},gpuActiveCount:{type:Number,default:0},gpuTotalCount:{type:Number,default:0},midiSupported:{type:Boolean,default:!1},midiSelected:{default:null},wsStatus:{type:String,default:"disconnected"},session:{type:String,default:""},sessions:{type:Array,default:()=>[]},morphOn:{type:Boolean,default:!1}},data(){return{helpOpen:!1,healthOpen:!1,sessionOpen:!1}},computed:{canStartHlsWatch(){return this.hlsPreviewValid&&!this.hlsWatchEnabled},healthHasIssues(){const t=this.gpuTotalCount>0&&this.gpuActiveCount===0,e=this.gpuTotalCount===0,i=this.wsStatus!=="connected"&&this.wsStatus!=="offline";return!!(t||e||i)}},mounted(){typeof document<"u"&&(this._statusStripHelpClose=t=>{!this.$el||this.$el.contains(t.target)||(this.helpOpen=!1,this.healthOpen=!1,this.sessionOpen=!1)},document.addEventListener("click",this._statusStripHelpClose))},beforeUnmount(){typeof document<"u"&&this._statusStripHelpClose&&document.removeEventListener("click",this._statusStripHelpClose)},methods:{toggleHelp(){this.helpOpen=!this.helpOpen,this.healthOpen=!1,this.sessionOpen=!1},toggleHealth(){this.healthOpen=!this.healthOpen,this.helpOpen=!1,this.sessionOpen=!1},toggleSession(){this.sessionOpen=!this.sessionOpen,this.helpOpen=!1,this.healthOpen=!1}}},n0={class:"status-strip"},s0={class:"header-transport ss-transport","data-testid":"header-transport"},r0=["disabled","title","aria-label"],o0=["disabled"],a0=["disabled","title","aria-label"],l0=["disabled"],d0=["disabled"],u0=["disabled"],c0={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button header-transport__preview-loading"},h0=["title"],f0={class:"lazy-loading-indicator lazy-loading-indicator--inline"},m0={class:"header-frame-processing__label"},p0={key:1,class:"ss-pill ss-pill--morph",title:"Prompt morph is enabled — use the LIVE stage morph HUD","data-testid":"status-morph-indicator"},g0={class:"ss-health"},y0={key:0},v0={key:1},b0={class:"ss-health-popover__header"},_0={class:"ss-health-grid"},S0=["title"],w0={class:"ss-session"},M0=["aria-expanded"],P0={class:"ss-help-popover__header"},x0={key:0,class:"ss-session-empty"},T0={key:1,class:"ss-session-list"},A0=["onClick"],E0={class:"ss-session-name"},C0={class:"ss-session-meta"},k0={class:"ss-session-actions"},L0=["onClick"],R0=["onClick"],D0={class:"ss-help"},I0={class:"ss-help-popover__header"};function F0(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",n0,[a("div",s0,[a("button",{type:"button",class:B(["header-transport__btn",i.playing?"header-transport__btn--pause header-transport__btn--active":"header-transport__btn--play"]),disabled:i.previewGenerating,title:i.playing?"Pause Deforum animation":"Play Deforum animation","aria-label":i.playing?"Pause animation":"Play animation","data-testid":"header-play",onClick:e[0]||(e[0]=o=>t.$emit("toggle-play"))},[ve(l,{class:"header-transport__icon",name:i.playing?"pause":"play"},null,8,["name"])],10,r0),a("button",{type:"button",class:"header-transport__btn header-transport__btn--stop",disabled:!i.playing||i.previewGenerating,title:"Stop animation","aria-label":"Stop animation","data-testid":"header-stop",onClick:e[1]||(e[1]=o=>t.$emit("stop-play"))},[ve(l,{class:"header-transport__icon",name:"stop"})],8,o0),a("button",{type:"button",class:B(["header-transport__btn header-transport__btn--record",{"header-transport__btn--active":i.recording}]),disabled:i.playing||i.previewGenerating,title:i.recording?"Stop recording":"Start recording","aria-label":i.recording?"Stop recording":"Start recording","data-testid":"header-record",onClick:e[2]||(e[2]=o=>t.$emit("toggle-record"))},[ve(l,{class:"header-transport__icon",name:i.recording?"stop":"record"},null,8,["name"])],10,a0),a("button",{type:"button",class:B(["header-transport__btn header-transport__btn--stream",{"header-transport__btn--active":i.hlsWatchEnabled}]),disabled:!r.canStartHlsWatch,title:"Show HLS feed on main stage (Stream tab)","aria-label":"Start HLS on main stage","data-testid":"header-stream-start",onClick:e[3]||(e[3]=o=>t.$emit("start-hls-watch"))},[ve(l,{class:"header-transport__icon",name:"broadcast"}),e[20]||(e[20]=a("span",{class:"header-transport__preview-label"},"Stream",-1))],10,l0),a("button",{type:"button",class:"header-transport__btn header-transport__btn--stream-stop",disabled:!i.hlsWatchEnabled,title:"Stop HLS on main stage","aria-label":"Stop HLS on main stage","data-testid":"header-stream-stop",onClick:e[4]||(e[4]=o=>t.$emit("stop-hls-watch"))},[ve(l,{class:"header-transport__icon",name:"stop"})],8,d0),e[26]||(e[26]=a("span",{class:"header-transport__divider","aria-hidden":"true"},null,-1)),a("button",{type:"button",class:B(["header-transport__btn header-transport__btn--preview",{"header-transport__btn--active":i.previewGenerating}]),disabled:i.previewGenerating||i.previewDisabled,title:"Generate preview frame from current settings","aria-label":"Generate preview frame","data-testid":"header-preview-frame",onClick:e[5]||(e[5]=o=>t.$emit("generate-preview"))},[i.previewGenerating?(m(),p("span",c0,[...e[21]||(e[21]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",{class:"header-transport__preview-label"},"Frame",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ve(l,{class:"header-transport__icon",name:"image"}),e[22]||(e[22]=a("span",{class:"header-transport__preview-label"},"Frame",-1))],64))],10,u0),i.frameProcessingActive?(m(),p("div",{key:0,class:"header-frame-processing","data-testid":"header-frame-processing","aria-live":"polite",title:i.frameProcessingHint},[a("span",f0,[e[23]||(e[23]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",m0,b(i.frameProcessingLabel),1),e[24]||(e[24]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))])],8,h0)):N("",!0),i.morphOn?(m(),p("span",p0,[...e[25]||(e[25]=[a("span",{class:"ss-key"},"Morph",-1),a("strong",null,"on",-1)])])):N("",!0)]),a("div",g0,[a("button",{type:"button",class:B(["ss-pill ss-pill--button ss-pill--health",{"ss-pill--live":!r.healthHasIssues,"ss-pill--warn":r.healthHasIssues}]),title:"Health status","data-testid":"health-dropdown",onClick:e[6]||(e[6]=lt((...o)=>r.toggleHealth&&r.toggleHealth(...o),["stop"]))},[e[27]||(e[27]=a("span",{class:"ss-dot"},null,-1)),e[28]||(e[28]=a("span",{class:"ss-key"},"Health",-1)),r.healthHasIssues?(m(),p("strong",y0,"!")):(m(),p("strong",v0,"ok"))],2),s.healthOpen?(m(),p("div",{key:0,class:"ss-health-popover",onClick:e[11]||(e[11]=lt(()=>{},["stop"]))},[a("div",b0,[e[29]||(e[29]=a("div",{class:"ss-health-popover__title"},"Health",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[7]||(e[7]=o=>s.healthOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),a("div",_0,[a("button",{type:"button",class:B(["ss-pill ss-pill--button",{"ss-pill--live":i.gpuActiveCount>0,"ss-pill--error":i.gpuTotalCount>0&&i.gpuActiveCount===0,"ss-pill--warn":i.gpuTotalCount===0}]),title:"Open GPU pool settings",onClick:e[8]||(e[8]=o=>{t.$emit("open-gpus"),s.healthOpen=!1})},[e[30]||(e[30]=a("span",{class:"ss-dot"},null,-1)),e[31]||(e[31]=a("span",{class:"ss-key"},"GPU",-1)),a("strong",null,b(i.gpuActiveCount)+"("+b(i.gpuTotalCount)+")",1)],2),i.midiSupported?(m(),p("button",{key:0,type:"button",class:B(["ss-pill ss-pill--button",{"ss-pill--live":i.midiSelected}]),title:"Open MIDI settings",onClick:e[9]||(e[9]=o=>{t.$emit("open-midi"),s.healthOpen=!1})},[e[32]||(e[32]=a("span",{class:"ss-dot"},null,-1)),e[33]||(e[33]=a("span",{class:"ss-key"},"MIDI",-1)),a("strong",null,b(i.midiSelected?"on":"off"),1)],2)):N("",!0),a("button",{type:"button",class:B(["ss-pill ss-pill--button",{"ss-pill--live":i.wsStatus==="connected","ss-pill--warn":i.wsStatus!=="connected"&&i.wsStatus!=="offline"}]),title:i.wsStatus==="connected"?"Go offline and disable collaboration":"Reconnect collaboration",onClick:e[10]||(e[10]=o=>{t.$emit("toggle-ws"),s.healthOpen=!1})},[e[34]||(e[34]=a("span",{class:"ss-dot"},null,-1)),e[35]||(e[35]=a("span",{class:"ss-key"},"WS",-1)),a("strong",null,b(i.wsStatus),1)],10,S0)])])):N("",!0)]),a("div",w0,[a("button",{type:"button",class:"ss-pill ss-pill--button",title:"Session manager","aria-expanded":s.sessionOpen?"true":"false","data-testid":"session-dropdown",onClick:e[12]||(e[12]=lt((...o)=>r.toggleSession&&r.toggleSession(...o),["stop"]))},[e[36]||(e[36]=a("span",{class:"ss-key"},"Session",-1)),a("strong",null,b(i.session),1),ve(l,{class:"ss-icon",name:s.sessionOpen?"chevron-up":"chevron-down"},null,8,["name"])],8,M0),a("button",{type:"button",class:"ss-btn ss-btn--ghost",title:"Reset UI layout to defaults","aria-label":"Reset UI layout","data-testid":"session-reset-layout",onClick:e[13]||(e[13]=lt(o=>t.$emit("reset-layout"),["stop"]))}," Reset "),a("button",{type:"button",class:"ss-btn ss-btn--ghost ss-session__new",title:"New session","aria-label":"New session","data-testid":"session-new",onClick:e[14]||(e[14]=lt(o=>t.$emit("new-session"),["stop"]))}," + "),s.sessionOpen?(m(),p("div",{key:0,class:"ss-session-popover",onClick:e[16]||(e[16]=lt(()=>{},["stop"]))},[a("div",P0,[e[37]||(e[37]=a("div",{class:"ss-help-popover__title"},"Sessions",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[15]||(e[15]=o=>s.sessionOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),i.sessions.length?(m(),p("div",T0,[(m(!0),p(H,null,oe(i.sessions,o=>(m(),p("div",{key:o.name,class:B(["ss-session-row",{"ss-session-row--active":o.name===i.session}])},[a("button",{type:"button",class:"ss-session-pick",onClick:d=>{t.$emit("select-session",o.name),s.sessionOpen=!1}},[a("span",E0,b(o.name),1),a("span",C0,b(o.images)+" img · "+b(o.videos)+" vid",1)],8,A0),a("div",k0,[a("button",{type:"button",class:"ss-btn ss-btn--ghost",onClick:d=>{t.$emit("restore-session",o.name),s.sessionOpen=!1}},"Restore",8,L0),a("button",{type:"button",class:"ss-btn ss-btn--ghost",onClick:d=>t.$emit("purge-session",o.name)},"Purge",8,R0)])],2))),128))])):(m(),p("div",x0,"No saved sessions yet."))])):N("",!0)]),a("div",D0,[a("button",{type:"button",class:B(["ss-btn ss-btn--ghost",{"ss-btn--active":s.helpOpen}]),title:"Keyboard shortcuts help",onClick:e[17]||(e[17]=lt((...o)=>r.toggleHelp&&r.toggleHelp(...o),["stop"]))},[ve(l,{class:"ss-icon",name:"help"}),e[38]||(e[38]=a("span",{class:"ss-label"},"Help",-1))],2),s.helpOpen?(m(),p("div",{key:0,class:"ss-help-popover",onClick:e[19]||(e[19]=lt(()=>{},["stop"]))},[a("div",I0,[e[39]||(e[39]=a("div",{class:"ss-help-popover__title"},"Keyboard Shortcuts",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[18]||(e[18]=o=>s.helpOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),e[40]||(e[40]=Bi('
Navigation
Switch main tabs
Switch sub-tabs (when available)
16 Jump to tab (LIVE … SETTINGS)
P Controls drawer · E Engine drawer
Esc Close overlays (library → engine → controls → sequencer)
LIVE
Space Generate preview frame
R Reset vibe & camera params
Live params + morph HUD on stage; schedules in E → Deforum
PROMPTS · MODULATION · AUDIO
M Toggle prompt morph (PROMPTS)
L Toggle LFO master (MODULATION)
B Beat macros (MODULATION → Beat)
Reference audio: MODULATION → Audio or AUDIO tab upload
Bindings
F FOV (not E — reserved for Engine drawer)
WASDQ Motion / camera nudges
',1))])):N("",!0)])])}const N0=nt(i0,[["render",F0],["__scopeId","data-v-4e565d39"]]),O0={name:"GlassPanel",props:{size:{type:String,default:"md"},variant:{type:String,default:"solid"}}},U0={key:0,class:"glass-panel-header"},B0={class:"glass-panel-body"};function V0(t,e,i,n,s,r){return m(),p("div",{class:B(["glass-panel",[`glass-panel--${i.size}`,i.variant!=="solid"?`glass-panel--${i.variant}`:null]])},[t.$slots.header?(m(),p("div",U0,[_o(t.$slots,"header",{},void 0,!0)])):N("",!0),a("div",B0,[_o(t.$slots,"default",{},void 0,!0)])],2)}const Cc=nt(O0,[["render",V0],["__scopeId","data-v-2ca4403b"]]),z0={name:"LiveParamRow",components:{UiIcon:Kt},props:{label:{type:String,required:!0},paramKey:{type:String,required:!0},value:{type:Number,default:0},min:{type:Number,default:0},max:{type:Number,default:1},source:{type:String,default:""},modulated:{type:Boolean,default:!1}},computed:{fillPct(){const t=this.max-this.min;return t===0?0:Math.max(0,Math.min(100,(this.value-this.min)/t*100))},formattedValue(){const t=this.value;return Number.isNaN(t)?"—":Math.abs(t)>=10?t.toFixed(1):t.toFixed(2)}}},$0={class:"lpr-main"},G0={class:"lpr-name"},H0={key:0,class:"lpr-source"},W0={class:"lpr-source-text"},q0={class:"lpr-value"},j0={class:"lpr-bar-wrap"};function X0(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",{class:B(["lpr",{"lpr--modulated":i.modulated}])},[a("div",$0,[a("span",G0,b(i.label),1),i.source&&i.modulated?(m(),p("span",H0,[ve(l,{class:"lpr-source-icon",name:"arrow-left"}),a("span",W0,b(i.source),1)])):N("",!0)]),a("code",q0,b(r.formattedValue),1),a("div",j0,[a("div",{class:"lpr-bar",style:Mt({width:r.fillPct+"%"})},null,4)])],2)}const K0=nt(z0,[["render",X0],["__scopeId","data-v-a2b7413a"]]),Y0={name:"TrackLane",emits:["seek","select-track","update-keyframe"],props:{track:{type:Object,required:!0},label:{type:String,required:!0},duration:{type:Number,default:8},playhead:{type:Number,default:0},selected:{type:Boolean,default:!1},valueMin:{type:Number,default:-1},valueMax:{type:Number,default:1}},data(){return{dragKeyframe:null,hoveredKeyframe:null,detachDragHandlers:null}},computed:{sortedKeyframes(){return[...this.track.keyframes||[]].sort((t,e)=>t.t-e.t)},playheadPct(){const t=Math.max(.01,Number(this.duration)||.01);return`${Math.min(t,Math.max(0,Number(this.playhead)||0))/t*100}%`},points(){return this.sortedKeyframes.length?this.sortedKeyframes.map(t=>`${this.timePct(t.t)},${this.valuePct(t.v)}`).join(" "):""}},beforeUnmount(){this.stopDragging()},methods:{clamp(t,e,i){return Math.min(i,Math.max(e,t))},timePct(t){const e=Math.max(.01,Number(this.duration)||.01);return(this.clamp(Number(t)||0,0,e)/e*100).toFixed(3)},valuePct(t){const e=Number(this.valueMin),i=Number(this.valueMax);return!Number.isFinite(e)||!Number.isFinite(i)||i<=e?50:(100-(this.clamp(Number(t)||0,e,i)-e)/(i-e)*100).toFixed(3)},keyframeStyle(t){return{left:`${this.timePct(t.t)}%`,top:`${this.valuePct(t.v)}%`}},pointerToTrackValues(t){const e=this.$refs.graph;if(!e)return{t:0,v:0};const i=e.getBoundingClientRect(),n=this.clamp(t.clientX-i.left,0,i.width),s=this.clamp(t.clientY-i.top,0,i.height),r=Math.max(.01,Number(this.duration)||.01),l=n/i.width*r,o=Number(this.valueMin),d=Number(this.valueMax),u=d<=o?0:d-s/i.height*(d-o);return{t:this.clamp(l,0,r),v:this.clamp(u,o,d)}},onGraphPointerDown(t){this.$emit("select-track",this.track.id);const{t:e}=this.pointerToTrackValues(t);this.$emit("seek",e)},onKeyframePointerDown(t,e){this.dragKeyframe=e,this.hoveredKeyframe=e,this.$emit("select-track",this.track.id);const i=s=>{if(!this.dragKeyframe)return;const{t:r,v:l}=this.pointerToTrackValues(s);this.$emit("update-keyframe",{trackId:this.track.id,keyframe:this.dragKeyframe,t:r,v:l}),this.$emit("seek",r)},n=()=>{this.stopDragging()};window.addEventListener("pointermove",i),window.addEventListener("pointerup",n,{once:!0}),this.detachDragHandlers=()=>{window.removeEventListener("pointermove",i),window.removeEventListener("pointerup",n)}},stopDragging(){typeof this.detachDragHandlers=="function"&&this.detachDragHandlers(),this.detachDragHandlers=null,this.dragKeyframe=null},clearHovered(t){this.hoveredKeyframe===t&&(this.hoveredKeyframe=null)},formatValue(t){const e=Number(t);return Number.isFinite(e)?Math.abs(e)>=100?e.toFixed(0):Math.abs(e)>=10?e.toFixed(1):e.toFixed(2):"0"}}},J0={class:"track-lane__name"},Z0={class:"track-lane__meta"},Q0={class:"track-lane__path",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-hidden":"true"},e_=["points"],t_=["onPointerdown","onMouseenter","onMouseleave"],i_={key:0,class:"track-lane__tooltip"};function n_(t,e,i,n,s,r){return m(),p("div",{class:B(["track-lane",{"track-lane--selected":i.selected}])},[a("button",{type:"button",class:"track-lane__label",onClick:e[0]||(e[0]=l=>t.$emit("select-track",i.track.id))},[a("span",J0,b(i.label),1),a("span",Z0,b(r.sortedKeyframes.length)+" keyframes",1)]),a("div",{ref:"graph",class:"track-lane__graph",onPointerdown:e[1]||(e[1]=(...l)=>r.onGraphPointerDown&&r.onGraphPointerDown(...l))},[(m(),p("svg",Q0,[r.points?(m(),p("polyline",{key:0,points:r.points},null,8,e_)):N("",!0)])),a("div",{class:"track-lane__playhead",style:Mt({left:r.playheadPct})},null,4),(m(!0),p(H,null,oe(r.sortedKeyframes,(l,o)=>(m(),p("button",{key:i.track.id+"-"+o+"-"+(l.t||0),type:"button",class:"track-lane__keyframe",style:Mt(r.keyframeStyle(l)),onPointerdown:lt(d=>r.onKeyframePointerDown(d,l),["stop"]),onMouseenter:d=>s.hoveredKeyframe=l,onMouseleave:d=>r.clearHovered(l)},[s.hoveredKeyframe===l?(m(),p("span",i_,b(r.formatValue(l.v)),1)):N("",!0)],44,t_))),128))],544)],2)}const s_=nt(Y0,[["render",n_],["__scopeId","data-v-64013507"]]),r_={name:"Timeline",components:{TrackLane:s_},emits:["jump-marker","jump-clip","seek","select-track","toggle-compact","update-keyframe"],props:{duration:{type:Number,default:8},playhead:{type:Number,default:0},markers:{type:Array,default:()=>[]},clips:{type:Array,default:()=>[]},selectedClipId:{type:String,default:""},tracks:{type:Array,default:()=>[]},selectedTrackId:{type:String,default:""},paramMeta:{type:Object,default:()=>({})},frames:{type:Array,default:()=>[]},fps:{type:Number,default:24},jobFrameNumber:{type:Number,default:1},jobTotalFrames:{type:Number,default:1},jobFrameLive:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},expandable:{type:Boolean,default:!1}},computed:{playheadPct(){const t=Math.max(.01,Number(this.duration)||.01);return`${Math.min(t,Math.max(0,Number(this.playhead)||0))/t*100}%`},sortedMarkers(){return[...this.markers].sort((t,e)=>t.t-e.t)},clipLanes(){const t=[{type:"prompt",label:"Prompts"},{type:"lora",label:"LoRAs"},{type:"controlnet",label:"ControlNet"}],e=Math.max(.01,Number(this.duration)||.01);return t.map(i=>({...i,clips:(this.clips||[]).filter(n=>n&&n.type===i.type).map(n=>({...n,title:`${n.label||i.label} @ ${this.formatTime(n.t)}${n.endT!=null?` – ${this.formatTime(n.endT)}`:""}`,left:`${Math.max(0,Number(n.t)||0)/e*100}%`,width:this.clipWidthPct(n,e)}))}))},showContentLanes(){return!this.compact},frameItems(){if(!Array.isArray(this.frames)||!this.frames.length)return[];const t=Math.max(.01,Number(this.duration)||.01),e=Math.max(1,Number(this.fps)||24),i=this.frames.map((r,l)=>({frame:r,index:l,num:Number(r&&r.frame)})).filter(r=>Number.isFinite(r.num)),n=i.length?Math.min(...i.map(r=>r.num)):null;return(this.frames.length>16?this.frames.slice(-16):this.frames).map((r,l,o)=>{const d=Number(r&&r.frame),u=Number.isFinite(d)?d:null,h=u!=null&&n!=null?Math.max(0,(u-n)/e):o.length<=1?0:t*l/(o.length-1),c=Math.max(0,Math.min(100,h/t*100));return{key:`${r&&r.name?r.name:"frame"}-${l}`,src:r&&(r.src||r.url||r.path||""),label:this.frameLabel(r,l),time:h,left:`${c}%`}})}},methods:{formatTime(t){return Math.max(0,Number(t)||0).toFixed(2)+"s"},markerLeft(t){const e=Math.max(.01,Number(this.duration)||.01);return`${Math.min(e,Math.max(0,Number(t.t)||0))/e*100}%`},clipWidthPct(t,e){const i=Math.max(0,Number(t.t)||0),n=t.endT!=null?Math.min(e,Number(t.endT)):Math.min(e,i+.35);return`${Math.max(.08,n-i)/e*100}%`},clipStyle(t){return{left:t.left,width:t.width}},metaFor(t){return this.paramMeta[t]||{label:t,min:-1,max:1}},frameLabel(t,e){const i=Number(t&&t.frame);return Number.isFinite(i)?`F${i}`:(t&&t.name?String(t.name).replace(/\.[^.]+$/,""):"")||`Frame ${e+1}`},onRulerPointerDown(t){const e=this.$refs.ruler;if(!e)return;const i=r=>{const l=e.getBoundingClientRect(),o=Math.min(l.width,Math.max(0,r.clientX-l.left)),d=Math.max(.01,Number(this.duration)||.01);this.$emit("seek",o/l.width*d)};i(t);const n=r=>i(r),s=()=>{window.removeEventListener("pointermove",n)};window.addEventListener("pointermove",n),window.addEventListener("pointerup",s,{once:!0})}}},o_={class:"timeline-hero__header"},a_={class:"timeline-hero__title-block"},l_={class:"timeline-hero__time"},d_={class:"timeline-hero__header-actions"},u_={class:"timeline-hero__summary"},c_={class:"timeline-hero__body"},h_=["title","onClick"],f_=["src","alt"],m_={key:1,class:"timeline-hero__frame-placeholder"},p_={class:"timeline-hero__frame-label"},g_={key:0,class:"timeline-hero__filmstrip-empty"},y_={key:0,class:"timeline-hero__content-lanes"},v_={class:"timeline-hero__content-lane-label"},b_={class:"timeline-hero__content-lane-track"},__=["title","onClick"],S_={class:"timeline-hero__clip-label"},w_={key:0,class:"timeline-hero__content-lane-empty"},M_=["onClick"],P_={key:1,class:"timeline-hero__lanes"},x_={key:0,class:"timeline-hero__compact-note"},T_={key:1,class:"timeline-hero__empty"};function A_(t,e,i,n,s,r){const l=Ne("TrackLane");return m(),p("div",{class:B(["timeline-hero",{"timeline-hero--compact":i.compact}])},[a("div",o_,[a("div",a_,[e[5]||(e[5]=a("span",{class:"timeline-hero__eyebrow"},"Timeline",-1)),a("code",l_,b(r.formatTime(i.playhead))+" / "+b(r.formatTime(i.duration)),1),a("code",{class:B(["timeline-hero__frame",{"timeline-hero__frame--live":i.jobFrameLive}]),"data-testid":"timeline-job-frame-counter"}," Frame "+b(i.jobFrameNumber)+" / "+b(i.jobTotalFrames),3)]),a("div",d_,[a("div",u_,[ie(b(i.tracks.length)+" tracks · "+b(i.markers.length)+" markers ",1),i.clips.length?(m(),p(H,{key:0},[ie(" · "+b(i.clips.length)+" clips",1)],64)):N("",!0)]),i.expandable?(m(),p("button",{key:0,type:"button",class:"timeline-hero__toggle",onClick:e[0]||(e[0]=o=>t.$emit("toggle-compact"))},b(i.compact?"Expand lanes":"Compact"),1)):N("",!0)])]),a("div",c_,[a("div",{class:"timeline-hero__shared-playhead",style:Mt({left:r.playheadPct}),"aria-hidden":"true"},null,4),a("div",{class:B(["timeline-hero__filmstrip",{"timeline-hero__filmstrip--empty":!r.frameItems.length}])},[(m(!0),p(H,null,oe(r.frameItems,o=>(m(),p("button",{key:o.key,type:"button",class:"timeline-hero__frame",style:Mt({left:o.left}),title:`${o.label} @ ${r.formatTime(o.time)}`,onClick:d=>t.$emit("seek",o.time)},[o.src?(m(),p("img",{key:0,class:"timeline-hero__frame-image",src:o.src,alt:o.label},null,8,f_)):(m(),p("div",m_,b(o.label),1)),a("span",p_,b(o.label),1)],12,h_))),128)),r.frameItems.length?N("",!0):(m(),p("div",g_," Frame filmstrip appears here as previews arrive. "))],2),r.showContentLanes?(m(),p("div",y_,[(m(!0),p(H,null,oe(r.clipLanes,o=>(m(),p("div",{key:"clip-lane-"+o.type,class:"timeline-hero__content-lane"},[a("div",v_,b(o.label),1),a("div",b_,[(m(!0),p(H,null,oe(o.clips,d=>(m(),p("button",{key:d.id,type:"button",class:B(["timeline-hero__clip",["timeline-hero__clip--"+d.type,{"timeline-hero__clip--selected":d.id===i.selectedClipId}]]),style:Mt(r.clipStyle(d)),title:d.title,onClick:lt(u=>t.$emit("jump-clip",d),["stop"])},[a("span",S_,b(d.label),1)],14,__))),128)),o.clips.length?N("",!0):(m(),p("div",w_,"Add clips from the sequencer panel"))])]))),128))])):N("",!0),a("div",{class:"timeline-hero__ruler",ref:"ruler",onPointerdown:e[1]||(e[1]=(...o)=>r.onRulerPointerDown&&r.onRulerPointerDown(...o))},[a("div",{class:"timeline-hero__playhead",style:Mt({left:r.playheadPct})},[...e[6]||(e[6]=[a("div",{class:"timeline-hero__playhead-handle"},null,-1)])],4),(m(!0),p(H,null,oe(r.sortedMarkers,o=>(m(),p("div",{key:o.name+"-"+o.t,class:"timeline-hero__marker",style:Mt({left:r.markerLeft(o)})},[a("button",{type:"button",class:"timeline-hero__marker-label",onClick:lt(d=>t.$emit("jump-marker",o),["stop"])},b(o.name),9,M_)],4))),128))],544),i.tracks.length&&!i.compact?(m(),p("div",P_,[(m(!0),p(H,null,oe(i.tracks,o=>(m(),at(l,{key:o.id,track:o,label:r.metaFor(o.param).label,duration:i.duration,playhead:i.playhead,selected:o.id===i.selectedTrackId,"value-min":r.metaFor(o.param).min,"value-max":r.metaFor(o.param).max,onSeek:e[2]||(e[2]=d=>t.$emit("seek",d)),onSelectTrack:e[3]||(e[3]=d=>t.$emit("select-track",d)),onUpdateKeyframe:e[4]||(e[4]=d=>t.$emit("update-keyframe",d))},null,8,["track","label","duration","playhead","selected","value-min","value-max"]))),128))])):N("",!0)]),i.tracks.length&&i.compact?(m(),p("div",x_," Compact mode keeps the filmstrip and shared playhead visible while preserving preview space. ")):N("",!0),i.tracks.length?N("",!0):(m(),p("div",T_,"No tracks yet. Add a track to begin."))],2)}const E_=nt(r_,[["render",A_],["__scopeId","data-v-728f6ade"]]);function As(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function Et(t){return new Proxy({},{get(e,i){if(i==="app"&&As(t,"app"))return t.app;if(As(t,i)&&i!=="app")return t[i];if(t.app==null)return;const n=Reflect.get(t.app,i);return typeof n=="function"?n.bind(t.app):n},set(e,i,n){return As(t,i)&&i!=="app"?!1:(Reflect.set(t.app,i,n),!0)},has(e,i){return i==="app"&&As(t,"app")?!0:As(t,i)&&i!=="app"||t.app!=null&&Reflect.has(t.app,i)},getOwnPropertyDescriptor(e,i){if(i==="app"&&As(t,"app"))return{configurable:!0,enumerable:!0,value:t.app,writable:!1};if(As(t,i)&&i!=="app")return{configurable:!0,enumerable:!0,value:t[i],writable:!1};if(t.app!=null)return{configurable:!0,enumerable:!0,value:Reflect.get(t.app,i),writable:!0}}})}const C_={name:"SequencerControlsPanel",components:{UiIcon:Kt,Timeline:E_},props:{app:{type:Object,required:!0},showTimeline:{type:Boolean,default:!0},summaryOnly:{type:Boolean,default:!1},stage:{type:Boolean,default:!1},sideDrawer:{type:Boolean,default:!1}},setup(t){return Et(t)}},k_={key:0,class:"stage-sequencer-bar"},L_={class:"stage-sequencer-bar__left"},R_=["title"],D_={class:"stage-sequencer-bar__frame-total"},I_={class:"stage-sequencer-bar__scrub"},F_=["max"],N_={class:"stage-sequencer-bar__right"},O_={key:0,class:"stage-sequencer-bar__status stage-sequencer-bar__status--clip"},U_={key:1,class:"stage-sequencer-bar__status"},B_={class:"stage-sequencer-bar__meta"},V_={class:"stage-sequencer-bar__meta"},z_={class:"stage-sequencer-bar__loop",title:"Loop timeline"},$_={class:"generate-sequencer__frame-hero-value"},G_={class:"generate-sequencer__frame-hero-current"},H_={class:"generate-sequencer__frame-hero-total"},W_={class:"generate-sequencer__frame-hero-meta"},q_={class:"generate-sequencer__frame-hero-bar"},j_={key:2,class:"modulation-lfo-grid generate-sequencer__control-grid"},X_={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},K_={class:"modulation-lfo-card__header"},Y_={class:"modulation-lfo-card__title"},J_={class:"modulation-lfo-card__meta"},Z_={key:0,class:"modulation-lfo-card__footer"},Q_={class:"modulation-route-pill"},eS={key:1,class:"modulation-lfo-card__controls"},tS={class:"modulation-lfo-card__control"},iS={class:"modulation-lfo-card__control"},nS={class:"modulation-lfo-card__control modulation-lfo-card__control--wide modulation-lfo-card__control--switch"},sS={class:"modulation-lfo-card__header"},rS={key:0,class:"modulation-lfo-card__switch"},oS={key:1,class:"modulation-lfo-card__title"},aS={class:"modulation-lfo-card__meta"},lS={key:0,class:"modulation-lfo-card__footer"},dS={key:1,class:"modulation-lfo-card__controls"},uS={class:"modulation-lfo-card__control"},cS={class:"modulation-lfo-card__control"},hS={class:"modulation-lfo-card__control"},fS={class:"modulation-lfo-card__control"},mS={class:"modulation-lfo-card__meta"},pS={key:2,class:"modulation-lfo-card__footer"},gS={class:"modulation-lfo-card__header"},yS={class:"modulation-lfo-card__title"},vS={class:"modulation-lfo-card__meta"},bS={key:0,class:"modulation-lfo-card__footer"},_S={class:"modulation-route-pill"},SS={key:1,class:"modulation-lfo-card__footer"},wS={class:"modulation-lfo-card__header"},MS={class:"modulation-lfo-card__title"},PS={class:"modulation-lfo-card__meta"},xS={key:0,class:"modulation-lfo-card__footer"},TS={class:"modulation-lfo-card__control"},AS=["value","max"],ES={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},CS=["max"],kS={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},LS=["max","value"],RS={class:"modulation-lfo-card__footer"},DS={class:"modulation-lfo-grid generate-sequencer__control-grid generate-sequencer__control-grid--edit"},IS={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active generate-sequencer__control-span"},FS={class:"modulation-lfo-card__header"},NS={class:"modulation-lfo-card__meta"},OS={class:"modulation-lfo-card__controls"},US={class:"modulation-lfo-card__control"},BS={class:"modulation-lfo-card__footer"},VS={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},zS={class:"modulation-lfo-card__header"},$S={class:"modulation-lfo-card__meta"},GS={class:"modulation-lfo-card__controls"},HS={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},WS=["value"],qS={class:"modulation-lfo-card__control"},jS={class:"modulation-lfo-card__footer"},XS={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},KS={class:"modulation-lfo-card__header"},YS={class:"modulation-lfo-card__meta"},JS={class:"modulation-lfo-card__footer"},ZS=["value"],QS={key:0,class:"generate-sequencer__details"},ew={key:0,class:"modulation-lfo-grid generate-sequencer__track-list"},tw=["onClick"],iw={class:"modulation-lfo-card__header"},nw={class:"modulation-lfo-card__title"},sw={class:"modulation-lfo-card__meta"},rw={class:"modulation-lfo-card__controls"},ow={class:"modulation-lfo-card__control"},aw=["onUpdate:modelValue","max"],lw={class:"modulation-lfo-card__control"},dw=["value","max","onChange"],uw={class:"modulation-lfo-card__footer"},cw={class:"modulation-route-pill"},hw=["onClick"],fw=["onClick"],mw=["onClick"],pw={key:1,class:"modulation-lfo-grid generate-sequencer__track-list"},gw=["onClick"],yw={class:"modulation-lfo-card__header"},vw={class:"modulation-lfo-card__title"},bw={class:"modulation-lfo-card__meta"},_w={key:0,class:"generate-sequencer__keyframe-list"},Sw={class:"modulation-lfo-card__meta"},ww=["value","onChange"],Mw=["onClick"],Pw={key:1,class:"modulation-lfo-card__footer"},xw={class:"modulation-lfo-card__footer"},Tw=["onClick"],Aw={key:2,class:"modulation-lfo-grid generate-sequencer__markers"},Ew={class:"modulation-lfo-card__header"},Cw=["onClick"],kw={class:"modulation-lfo-card__meta"},Lw={class:"modulation-lfo-card__controls"},Rw={class:"modulation-lfo-card__control"},Dw=["value","onChange"],Iw={key:0,class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},Fw=["value","placeholder","onChange","title"],Nw={key:1,class:"modulation-lfo-card__control modulation-lfo-card__control--wide generate-marker-row__hint"},Ow={class:"modulation-lfo-card__footer"},Uw=["onClick"],Bw={key:3,class:"generate-sequencer__empty-markers"},Vw={key:4,class:"generate-sequencer__status-text"},zw={key:1,class:"generate-sequencer__dock-note"};function $w(t,e,i,n,s,r){var d;const l=Ne("UiIcon"),o=Ne("Timeline");return m(),p("div",{class:B(["sequencer-controls-panel",{"sequencer-controls-panel--stage":i.stage,"sequencer-controls-panel--side-drawer":i.sideDrawer}]),"data-testid":"sequencer-controls-panel"},[i.stage?(m(),p("div",k_,[a("div",L_,[a("button",{type:"button",class:B(["framesync-button framesync-button--compact control-btn",{"framesync-button--live":t.sequencerPlaying,playing:t.sequencerPlaying}]),title:t.sequencerPlaying?"Stop":"Play",onClick:e[0]||(e[0]=(...u)=>t.toggleSequencerPlayback&&t.toggleSequencerPlayback(...u))},[ve(l,{name:t.sequencerPlaying?"stop":"play"},null,8,["name"])],10,R_),a("button",{type:"button",class:"framesync-button framesync-button--compact",title:"Preview frame",onClick:e[1]||(e[1]=(...u)=>t.previewSequencerFrame&&t.previewSequencerFrame(...u))},[ve(l,{name:"sparkles"})]),a("span",{class:B(["stage-sequencer-bar__frame",{"stage-sequencer-bar__frame--live":t.sequencerJobFrameLive}]),"data-testid":"sequencer-job-frame-counter"},[ie(b(t.sequencerJobFrameNumber),1),a("span",D_,"/"+b(t.sequencerJobTotalFrames),1)],2)]),a("label",I_,[J(a("input",{type:"range",class:"stage-sequencer-bar__scrub-input",min:"0",max:Math.max(.01,Number(t.sequencer.durationSec)||0),step:"0.01","onUpdate:modelValue":e[2]||(e[2]=u=>t.sequencerPlayhead=u),onInput:e[3]||(e[3]=(...u)=>t.previewSequencerFrame&&t.previewSequencerFrame(...u))},null,40,F_),[[ye,t.sequencerPlayhead,void 0,{number:!0}]])]),a("div",N_,[t.sequencerStatus?(m(),p("span",O_,b(t.sequencerStatus),1)):t.performance.status?(m(),p("span",U_,b(t.performance.status),1)):N("",!0),a("span",B_,b(t.sequencerPlayhead.toFixed(2))+"s",1),a("span",V_,b(t.masterFps)+" fps",1),a("label",z_,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[4]||(e[4]=u=>t.sequencer.loop=u)},null,512),[[xi,t.sequencer.loop]]),e[42]||(e[42]=a("span",null,"Loop",-1))]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=u=>t.addSequencerClip("prompt"))},"+ Prompt"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[6]||(e[6]=u=>t.addSequencerClip("lora"))},"+ LoRA"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[7]||(e[7]=u=>t.addSequencerClip("controlnet"))},"+ CN"),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{active:t.motionSequencerSideOpen}]),"data-testid":"motion-sequencer-side-toggle-bar",onClick:e[8]||(e[8]=u=>{t.motionSequencerSideOpen=!t.motionSequencerSideOpen,t.saveSessionState()})},b(t.motionSequencerSideOpen?"Less":"Edit"),3),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[9]||(e[9]=(...u)=>t.applySequencerToDeforumSettings&&t.applySequencerToDeforumSettings(...u))}," Apply ")])])):N("",!0),!i.stage&&!i.sideDrawer&&!i.summaryOnly?(m(),p("div",{key:1,class:B(["generate-sequencer__frame-hero",{"generate-sequencer__frame-hero--live":t.sequencerJobFrameLive}]),"data-testid":"sequencer-job-frame-hero"},[e[44]||(e[44]=a("div",{class:"generate-sequencer__frame-hero-label"},"Job frame",-1)),a("div",$_,[a("span",G_,b(t.sequencerJobFrameNumber),1),e[43]||(e[43]=a("span",{class:"generate-sequencer__frame-hero-sep"},"/",-1)),a("span",H_,b(t.sequencerJobTotalFrames),1)]),a("div",W_,b(t.sequencerJobFps)+" fps · "+b(t.sequencerPlayhead.toFixed(2))+"s · "+b(t.sequencerJobTotalFrames)+" frames total ",1),a("div",q_,[a("div",{class:"generate-sequencer__frame-hero-bar-fill",style:Mt({width:`${t.sequencerJobFrameProgressPct}%`})},null,4)])],2)):N("",!0),!i.stage&&!i.sideDrawer?(m(),p("div",j_,[a("div",X_,[a("div",K_,[a("div",Y_,[e[45]||(e[45]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,b(i.summaryOnly?"Tracks":"Timeline"),1)]),a("code",J_,b(i.summaryOnly?t.selectedSequencerTrack?((d=t.sequencerParamMetaMap[t.selectedSequencerTrack.param])==null?void 0:d.label)||t.selectedSequencerTrack.param:"No track selected":`${Number(t.sequencer.durationSec||0).toFixed(1)}s · ${t.sequencer.fps} fps`),1)]),i.summaryOnly?(m(),p("div",Z_,[a("span",Q_,b(t.sequencer.tracks.length)+" track"+b(t.sequencer.tracks.length===1?"":"s"),1)])):(m(),p("div",eS,[a("label",tS,[e[46]||(e[46]=a("span",{class:"framesync-subtitle"},"Duration (s)",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[10]||(e[10]=u=>t.sequencer.durationSec=u),min:"0.5",max:"600",step:"0.5",onChange:e[11]||(e[11]=(...u)=>t.clampSequencerPlayhead&&t.clampSequencerPlayhead(...u))},null,544),[[ye,t.sequencer.durationSec,void 0,{number:!0}]])]),a("label",iS,[e[47]||(e[47]=a("span",{class:"framesync-subtitle"},"FPS",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[12]||(e[12]=u=>t.sequencer.fps=u),min:"1",max:"60",step:"1"},null,512),[[ye,t.sequencer.fps,void 0,{number:!0}]])]),a("label",nS,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[13]||(e[13]=u=>t.sequencer.loop=u)},null,512),[[xi,t.sequencer.loop]]),e[48]||(e[48]=a("span",{class:"framesync-subtitle"},"Loop timeline",-1))])]))]),a("div",{class:B(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--active":i.summaryOnly?t.sortedSequencerMarkers.length>0:t.sequencer.bpmSync}])},[a("div",sS,[i.summaryOnly?(m(),p("div",oS,[...e[50]||(e[50]=[a("span",{class:"modulation-lfo-card__dot"},null,-1),a("span",null,"Markers",-1)])])):(m(),p("label",rS,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[14]||(e[14]=u=>t.sequencer.bpmSync=u)},null,512),[[xi,t.sequencer.bpmSync]]),e[49]||(e[49]=a("span",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"BPM sync")],-1))])),a("code",aS,b(i.summaryOnly?t.sortedSequencerMarkers.length?"Scene triggers ready":"No marker cues yet":t.sequencer.bpmSync?`${t.sequencerCalculatedDuration}s`:"Manual timing"),1)]),i.summaryOnly?(m(),p("div",lS,[a("span",{class:B(["modulation-route-pill",{"modulation-route-pill--idle":!t.sortedSequencerMarkers.length}])},b(t.sortedSequencerMarkers.length)+" marker"+b(t.sortedSequencerMarkers.length===1?"":"s"),3)])):t.sequencer.bpmSync?(m(),p("div",dS,[a("label",uS,[e[51]||(e[51]=a("span",{class:"framesync-subtitle"},"BPM",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[15]||(e[15]=u=>t.sequencer.bpm=u),min:"20",max:"300",step:"0.1"},null,512),[[ye,t.sequencer.bpm,void 0,{number:!0}]])]),a("label",cS,[e[52]||(e[52]=a("span",{class:"framesync-subtitle"},"Bars",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[16]||(e[16]=u=>t.sequencer.bars=u),min:"1",max:"128",step:"1"},null,512),[[ye,t.sequencer.bars,void 0,{number:!0}]])]),a("label",hS,[e[54]||(e[54]=a("span",{class:"framesync-subtitle"},"Beats/bar",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[17]||(e[17]=u=>t.sequencer.beatsPerBar=u)},[...e[53]||(e[53]=[a("option",{value:4},"4/4",-1),a("option",{value:3},"3/4",-1),a("option",{value:6},"6/8",-1)])],512),[[Dt,t.sequencer.beatsPerBar,void 0,{number:!0}]])]),a("label",fS,[e[55]||(e[55]=a("span",{class:"framesync-subtitle"},"Length",-1)),a("code",mS,b(t.sequencerCalculatedDuration)+"s",1)])])):i.summaryOnly?N("",!0):(m(),p("div",pS,[...e[56]||(e[56]=[a("span",{class:"modulation-route-pill modulation-route-pill--idle"},"Sync timeline length to uploaded audio BPM",-1)])]))],2),a("div",{class:B(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--active":i.summaryOnly||t.sequencerPlaying}])},[a("div",gS,[a("div",yS,[e[57]||(e[57]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,b(i.summaryOnly?"Playhead":"Transport"),1)]),a("code",vS,b(i.summaryOnly?`${Number(t.sequencer.durationSec||0).toFixed(2)}s timeline`:`${t.sequencerPlayhead.toFixed(2)}s playhead`),1)]),i.summaryOnly?(m(),p("div",bS,[a("span",_S,b(t.sequencerJobFrameLabel),1)])):(m(),p("div",SS,[a("button",{type:"button",class:B(["framesync-button",{"framesync-button--live":t.sequencerPlaying}]),onClick:e[18]||(e[18]=(...u)=>t.toggleSequencerPlayback&&t.toggleSequencerPlayback(...u))},b(t.sequencerPlaying?"Stop":"Play"),3),a("button",{type:"button",class:"framesync-button",onClick:e[19]||(e[19]=(...u)=>t.previewSequencerFrame&&t.previewSequencerFrame(...u))},"Preview frame"),a("button",{type:"button",class:"framesync-button framesync-button--accent",onClick:e[20]||(e[20]=(...u)=>t.applySequencerToDeforumSettings&&t.applySequencerToDeforumSettings(...u)),title:"Convert timeline keyframes to Deforum schedule strings and save to settings"},"Apply to Deforum")]))],2),a("div",{class:B(["modulation-lfo-card modulation-lfo-card--static generate-sequencer__control-span",{"modulation-lfo-card--active":i.summaryOnly?/frame ready/i.test(String(t.performance.status||"")):!0}])},[a("div",wS,[a("div",MS,[e[58]||(e[58]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,b(i.summaryOnly?"Preview":"Playhead"),1)]),a("code",PS,b(i.summaryOnly?t.performance.status||"Preview status appears here":`${t.sortedSequencerMarkers.length} marker${t.sortedSequencerMarkers.length===1?"":"s"}`),1)]),i.summaryOnly?(m(),p("div",xS,[a("span",{class:B(["modulation-route-pill",{"modulation-route-pill--idle":!/frame ready/i.test(String(t.performance.status||""))}])},b(/frame ready/i.test(String(t.performance.status||""))?"Ready":t.sequencerPlaying?"Playing":"Idle"),3)])):(m(),p(H,{key:1},[a("label",TS,[e[59]||(e[59]=a("span",{class:"framesync-subtitle"},"Job frame",-1)),a("input",{type:"number",class:"framesync-input",value:t.sequencerJobFrameNumber,min:"1",max:t.sequencerJobTotalFrames,step:"1",onChange:e[21]||(e[21]=u=>t.seekSequencerToJobFrame(u.target.value))},null,40,AS)]),a("label",ES,[e[60]||(e[60]=a("span",{class:"framesync-subtitle"},"Scrub timeline (s)",-1)),J(a("input",{type:"range",class:"framesync-input",min:"0",max:Math.max(.01,t.sequencer.durationSec),step:"0.01","onUpdate:modelValue":e[22]||(e[22]=u=>t.sequencerPlayhead=u),onInput:e[23]||(e[23]=(...u)=>t.previewSequencerFrame&&t.previewSequencerFrame(...u))},null,40,CS),[[ye,t.sequencerPlayhead,void 0,{number:!0}]])]),a("label",kS,[e[61]||(e[61]=a("span",{class:"framesync-subtitle"},"Scrub job frame",-1)),a("input",{type:"range",class:"framesync-input",min:"1",max:t.sequencerJobTotalFrames,step:"1",value:t.sequencerJobFrameNumber,onInput:e[24]||(e[24]=u=>t.seekSequencerToJobFrame(u.target.value))},null,40,LS)]),a("div",RS,[J(a("input",{type:"text",class:"framesync-input generate-sequencer__marker-input","onUpdate:modelValue":e[25]||(e[25]=u=>t.sequencerMarkerName=u),maxlength:"48",placeholder:"Marker label",title:"1–48 chars: letters, digits, space, _ - ."},null,512),[[ye,t.sequencerMarkerName,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button",onClick:e[26]||(e[26]=(...u)=>t.addSequencerMarker&&t.addSequencerMarker(...u))},"+ Marker @ playhead")])],64))],2)])):N("",!0),i.showTimeline&&!i.sideDrawer?(m(),at(o,{key:3,duration:Number(t.sequencer.durationSec)||0,playhead:t.sequencerPlayhead,markers:t.sortedSequencerMarkers,clips:t.sortedSequencerClips,"selected-clip-id":t.sequencerSelectedClipId||"",tracks:t.sequencer.tracks,"selected-track-id":t.selectedSequencerTrack?t.selectedSequencerTrack.id:"","param-meta":t.sequencerParamMetaMap,frames:t.thumbs,fps:Number(t.sequencer.fps)||24,"job-frame-number":t.sequencerJobFrameNumber,"job-total-frames":t.sequencerJobTotalFrames,"job-frame-live":t.sequencerJobFrameLive,compact:i.stage?!1:!t.generateDockExpanded,expandable:!i.stage,onSeek:t.seekSequencer,onJumpMarker:t.jumpToSequencerMarker,onJumpClip:t.jumpToSequencerClip,onSelectTrack:t.selectSequencerTrack,onToggleCompact:e[27]||(e[27]=u=>{t.generateDockExpanded=!t.generateDockExpanded,t.saveSessionState()}),onUpdateKeyframe:t.updateSequencerKeyframe},null,8,["duration","playhead","markers","clips","selected-clip-id","tracks","selected-track-id","param-meta","frames","fps","job-frame-number","job-total-frames","job-frame-live","compact","expandable","onSeek","onJumpMarker","onJumpClip","onSelectTrack","onUpdateKeyframe"])):N("",!0),!i.summaryOnly&&(i.sideDrawer||!i.stage&&t.generateDockExpanded)?(m(),p(H,{key:4},[a("div",DS,[a("div",IS,[a("div",FS,[e[62]||(e[62]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Timeline content")],-1)),a("code",NS,b(t.sequencerClipSummary.prompt)+"p · "+b(t.sequencerClipSummary.lora)+"l · "+b(t.sequencerClipSummary.controlnet)+"c ",1)]),a("div",OS,[a("label",US,[e[63]||(e[63]=a("span",{class:"framesync-subtitle"},"Clip span (s)",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[28]||(e[28]=u=>t.sequencerClipDurationSec=u),min:"0.1",max:"120",step:"0.1"},null,512),[[ye,t.sequencerClipDurationSec,void 0,{number:!0}]])])]),a("div",BS,[a("button",{type:"button",class:"framesync-button",onClick:e[29]||(e[29]=u=>t.addSequencerClip("prompt"))},"+ Prompt"),a("button",{type:"button",class:"framesync-button",onClick:e[30]||(e[30]=u=>t.addSequencerClip("lora"))},"+ LoRA"),a("button",{type:"button",class:"framesync-button",onClick:e[31]||(e[31]=u=>t.addSequencerClip("controlnet"))},"+ ControlNet")]),e[64]||(e[64]=a("div",{class:"framesync-subtitle generate-sequencer__clip-hint"}," Snapshots current prompts, LoRA groups, or ControlNet slots at the playhead. Scrubbing or playback applies the active clip for each type. ",-1))]),a("div",VS,[a("div",zS,[e[65]||(e[65]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Track editor")],-1)),a("code",$S,b(t.sequencer.tracks.length)+" track"+b(t.sequencer.tracks.length===1?"":"s"),1)]),a("div",GS,[a("label",HS,[e[66]||(e[66]=a("span",{class:"framesync-subtitle"},"Parameter",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[32]||(e[32]=u=>t.sequencerNewParam=u)},[(m(!0),p(H,null,oe(t.sequencerParamOptions,u=>(m(),p("option",{key:"sp-"+u.key,value:u.key},b(u.label),9,WS))),128))],512),[[Dt,t.sequencerNewParam]])]),a("label",qS,[e[67]||(e[67]=a("span",{class:"framesync-subtitle"},"Keyframe value",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[33]||(e[33]=u=>t.sequencerKeyframeVal=u),step:"any",placeholder:"Value"},null,512),[[ye,t.sequencerKeyframeVal,void 0,{number:!0}]])])]),a("div",jS,[a("button",{type:"button",class:"framesync-button",onClick:e[34]||(e[34]=(...u)=>t.addSequencerTrack&&t.addSequencerTrack(...u))},"+ Track"),a("button",{type:"button",class:"framesync-button",onClick:e[35]||(e[35]=(...u)=>t.addSequencerKeyframe&&t.addSequencerKeyframe(...u))},"+ Keyframe @ playhead")])]),a("div",XS,[a("div",KS,[e[68]||(e[68]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Timeline files")],-1)),a("code",YS,b(t.sequencerList.length)+" saved",1)]),a("div",JS,[a("button",{type:"button",class:"framesync-button",onClick:e[36]||(e[36]=(...u)=>t.saveSequencerTimeline&&t.saveSequencerTimeline(...u))},"Save"),a("button",{type:"button",class:"framesync-button",onClick:e[37]||(e[37]=(...u)=>t.exportSequencerDownload&&t.exportSequencerDownload(...u))},"Export JSON"),J(a("select",{class:"framesync-select generate-sequencer__load-select","onUpdate:modelValue":e[38]||(e[38]=u=>t.sequencerLoadPick=u),onChange:e[39]||(e[39]=(...u)=>t.loadSequencerTimeline&&t.loadSequencerTimeline(...u))},[e[69]||(e[69]=a("option",{value:""},"Load saved…",-1)),(m(!0),p(H,null,oe(t.sequencerList,u=>(m(),p("option",{key:"seq-"+u,value:u},b(u),9,ZS))),128))],544),[[Dt,t.sequencerLoadPick]])])])]),t.generateDockExpanded||i.sideDrawer?(m(),p("div",QS,[t.sortedSequencerClips.length?(m(),p("div",ew,[(m(!0),p(H,null,oe(t.sortedSequencerClips,u=>(m(),p("div",{key:u.id,class:B(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--selected":t.sequencerSelectedClipId===u.id}]),onClick:h=>t.selectSequencerClip(u.id)},[a("div",iw,[a("div",nw,[e[70]||(e[70]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,b(u.label||t.clipTypeLabel(u.type)),1)]),a("code",sw,b(t.clipTypeLabel(u.type)),1)]),a("div",rw,[a("label",ow,[e[71]||(e[71]=a("span",{class:"framesync-subtitle"},"Start (s)",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":h=>u.t=h,min:"0",max:t.sequencer.durationSec,step:"0.01",onChange:e[40]||(e[40]=(...h)=>t.clampSequencerPlayhead&&t.clampSequencerPlayhead(...h))},null,40,aw),[[ye,u.t,void 0,{number:!0}]])]),a("label",lw,[e[72]||(e[72]=a("span",{class:"framesync-subtitle"},"End (s)",-1)),a("input",{type:"number",class:"framesync-input",value:u.endT==null?"":u.endT,min:"0",max:t.sequencer.durationSec,step:"0.01",placeholder:"Point cue",onChange:h=>u.endT=h.target.value===""?null:parseFloat(h.target.value)},null,40,dw)])]),a("div",uw,[a("span",cw,b(t.clipSummaryText(u)),1),a("button",{type:"button",class:"framesync-button",onClick:lt(h=>t.jumpToSequencerClip(u),["stop"])},"Go to",8,hw),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:lt(h=>t.applySequencerClip(u),["stop"])},"Apply",8,fw),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:lt(h=>t.removeSequencerClip(u.id),["stop"])},"Remove",8,mw)])],10,tw))),128))])):N("",!0),t.sequencer.tracks.length?(m(),p("div",pw,[(m(!0),p(H,null,oe(t.sequencer.tracks,u=>{var h;return m(),p("div",{key:u.id,class:B(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--selected":t.selectedSequencerTrack&&t.selectedSequencerTrack.id===u.id}]),onClick:c=>t.selectSequencerTrack(u.id)},[a("div",yw,[a("div",vw,[e[73]||(e[73]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,b(((h=t.sequencerParamMetaMap[u.param])==null?void 0:h.label)||u.param),1)]),a("code",bw,b(t.sortedKeyframes(u).length)+" keyframes",1)]),t.sortedKeyframes(u).length?(m(),p("div",_w,[(m(!0),p(H,null,oe(t.sortedKeyframes(u),(c,f)=>(m(),p("div",{key:u.id+"-"+f+"-"+(c.t||0),class:"generate-sequencer__keyframe-row"},[a("code",Sw,b(c.t.toFixed(2))+"s → "+b(c.v.toFixed(3)),1),a("select",{class:"framesync-select generate-sequencer__keyframe-easing",value:c.easing||"linear",title:"Easing to next keyframe",onClick:e[41]||(e[41]=lt(()=>{},["stop"])),onChange:g=>t.setKeyframeEasing(c,g.target.value)},[...e[74]||(e[74]=[a("option",{value:"linear"},"linear",-1),a("option",{value:"easeIn"},"easeIn",-1),a("option",{value:"easeOut"},"easeOut",-1),a("option",{value:"easeInOut"},"easeInOut",-1)])],40,ww),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",title:"Remove keyframe",onClick:lt(g=>t.removeSequencerKeyframe(u.id,f),["stop"])},"Remove",8,Mw)]))),128))])):(m(),p("div",Pw,[...e[75]||(e[75]=[a("span",{class:"modulation-route-pill modulation-route-pill--idle"},"No keyframes yet",-1)])])),a("div",xw,[a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:lt(c=>t.removeSequencerTrack(u.id),["stop"])},"Remove track",8,Tw)])],10,gw)}),128))])):N("",!0),t.sortedSequencerMarkers.length?(m(),p("div",Aw,[(m(!0),p(H,null,oe(t.sortedSequencerMarkers,(u,h)=>(m(),p("div",{key:"mrow-"+h+"-"+(u.t||0),class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},[a("div",Ew,[a("button",{type:"button",class:"generate-marker-row__jump framesync-button",onClick:c=>t.jumpToSequencerMarker(u)},b(u.name)+" @ "+b(u.t.toFixed(2))+"s ",9,Cw),a("code",kw,b(u.action||"jump"),1)]),a("div",Lw,[a("label",Rw,[e[77]||(e[77]=a("span",{class:"framesync-subtitle"},"Action",-1)),a("select",{class:"framesync-select",value:u.action||"jump",onChange:c=>t.setMarkerAction(u,c.target.value)},[...e[76]||(e[76]=[Bi('',6)])],40,Dw)]),u.action&&u.action!=="jump"&&u.action!=="generate"&&u.action!=="pause"?(m(),p("label",Iw,[e[78]||(e[78]=a("span",{class:"framesync-subtitle"},"Target",-1)),a("input",{type:"text",class:"framesync-input",value:u.target||"",placeholder:t.markerActionPlaceholder(u.action),onChange:c=>t.setMarkerTarget(u,c.target.value),title:t.markerActionTitle(u.action)},null,40,Fw)])):(m(),p("span",Nw,b(u.action==="jump"?"jump to time":u.action==="generate"?"trigger generation":u.action==="pause"?"pause playback":""),1))]),a("div",Ow,[a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",title:"Remove marker",onClick:c=>t.removeSequencerMarker(h)},"Remove",8,Uw)])]))),128))])):(m(),p("div",Bw,"No markers yet.")),t.sequencerStatus?(m(),p("div",Vw,b(t.sequencerStatus),1)):N("",!0)])):i.sideDrawer?N("",!0):(m(),p("div",zw," Open the side editor for keyframes, clips, markers, and track files. "))],64)):N("",!0)],2)}const Gw=nt(C_,[["render",$w]]);/** +**/let Ld;const bm=typeof window<"u"&&window.trustedTypes;if(bm)try{Ld=bm.createPolicy("vue",{createHTML:t=>t})}catch{}const Wg=Ld?t=>Ld.createHTML(t):t=>t,f1="http://www.w3.org/2000/svg",g1="http://www.w3.org/1998/Math/MathML",Hn=typeof document<"u"?document:null,_m=Hn&&Hn.createElement("template"),y1={insert:(t,e,i)=>{e.insertBefore(t,i||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,i,n)=>{const s=e==="svg"?Hn.createElementNS(f1,t):e==="mathml"?Hn.createElementNS(g1,t):i?Hn.createElement(t,{is:i}):Hn.createElement(t);return t==="select"&&n&&n.multiple!=null&&s.setAttribute("multiple",n.multiple),s},createText:t=>Hn.createTextNode(t),createComment:t=>Hn.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Hn.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,i,n,s,r){const l=i?i.previousSibling:e.lastChild;if(s&&(s===r||s.nextSibling))for(;e.insertBefore(s.cloneNode(!0),i),!(s===r||!(s=s.nextSibling)););else{_m.innerHTML=Wg(n==="svg"?`${t}`:n==="mathml"?`${t}`:t);const o=_m.content;if(n==="svg"||n==="mathml"){const u=o.firstChild;for(;u.firstChild;)o.appendChild(u.firstChild);o.removeChild(u)}e.insertBefore(o,i)}return[l?l.nextSibling:e.firstChild,i?i.previousSibling:e.lastChild]}},ls="transition",uo="animation",Jo=Symbol("_vtc"),qg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},v1=pi({},fg,qg),b1=t=>(t.displayName="Transition",t.props=v1,t),_1=b1((t,{slots:e})=>m1(pb,S1(t),e)),Rs=(t,e=[])=>{nt(t)?t.forEach(i=>i(...e)):t&&t(...e)},Sm=t=>t?nt(t)?t.some(e=>e.length>1):t.length>1:!1;function S1(t){const e={};for(const E in t)E in qg||(e[E]=t[E]);if(t.css===!1)return e;const{name:i="v",type:n,duration:s,enterFromClass:r=`${i}-enter-from`,enterActiveClass:l=`${i}-enter-active`,enterToClass:o=`${i}-enter-to`,appearFromClass:u=r,appearActiveClass:c=l,appearToClass:h=o,leaveFromClass:d=`${i}-leave-from`,leaveActiveClass:m=`${i}-leave-active`,leaveToClass:g=`${i}-leave-to`}=t,b=w1(s),w=b&&b[0],v=b&&b[1],{onBeforeEnter:y,onEnter:S,onEnterCancelled:P,onLeave:M,onLeaveCancelled:k,onBeforeAppear:C=y,onAppear:L=S,onAppearCancelled:x=P}=e,T=(E,z,Y,$)=>{E._enterCancelled=$,Ls(E,z?h:o),Ls(E,z?c:l),Y&&Y()},F=(E,z)=>{E._isLeaving=!1,Ls(E,d),Ls(E,g),Ls(E,m),z&&z()},I=E=>(z,Y)=>{const $=E?L:S,W=()=>T(z,E,Y);Rs($,[z,W]),wm(()=>{Ls(z,E?u:r),Un(z,E?h:o),Sm($)||Mm(z,n,w,W)})};return pi(e,{onBeforeEnter(E){Rs(y,[E]),Un(E,r),Un(E,l)},onBeforeAppear(E){Rs(C,[E]),Un(E,u),Un(E,c)},onEnter:I(!1),onAppear:I(!0),onLeave(E,z){E._isLeaving=!0;const Y=()=>F(E,z);Un(E,d),E._enterCancelled?(Un(E,m),Tm(E)):(Tm(E),Un(E,m)),wm(()=>{E._isLeaving&&(Ls(E,d),Un(E,g),Sm(M)||Mm(E,n,v,Y))}),Rs(M,[E,Y])},onEnterCancelled(E){T(E,!1,void 0,!0),Rs(P,[E])},onAppearCancelled(E){T(E,!0,void 0,!0),Rs(x,[E])},onLeaveCancelled(E){F(E),Rs(k,[E])}})}function w1(t){if(t==null)return null;if(Ft(t))return[_u(t.enter),_u(t.leave)];{const e=_u(t);return[e,e]}}function _u(t){return _v(t)}function Un(t,e){e.split(/\s+/).forEach(i=>i&&t.classList.add(i)),(t[Jo]||(t[Jo]=new Set)).add(e)}function Ls(t,e){e.split(/\s+/).forEach(n=>n&&t.classList.remove(n));const i=t[Jo];i&&(i.delete(e),i.size||(t[Jo]=void 0))}function wm(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let M1=0;function Mm(t,e,i,n){const s=t._endId=++M1,r=()=>{s===t._endId&&n()};if(i!=null)return setTimeout(r,i);const{type:l,timeout:o,propCount:u}=x1(t,e);if(!l)return n();const c=l+"end";let h=0;const d=()=>{t.removeEventListener(c,m),r()},m=g=>{g.target===t&&++h>=u&&d()};setTimeout(()=>{h(i[b]||"").split(", "),s=n(`${ls}Delay`),r=n(`${ls}Duration`),l=xm(s,r),o=n(`${uo}Delay`),u=n(`${uo}Duration`),c=xm(o,u);let h=null,d=0,m=0;e===ls?l>0&&(h=ls,d=l,m=r.length):e===uo?c>0&&(h=uo,d=c,m=u.length):(d=Math.max(l,c),h=d>0?l>c?ls:uo:null,m=h?h===ls?r.length:u.length:0);const g=h===ls&&/\b(?:transform|all)(?:,|$)/.test(n(`${ls}Property`).toString());return{type:h,timeout:d,propCount:m,hasTransform:g}}function xm(t,e){for(;t.lengthPm(i)+Pm(t[n])))}function Pm(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function Tm(t){return(t?t.ownerDocument:document).body.offsetHeight}function P1(t,e,i){const n=t[Jo];n&&(e=(e?[e,...n]:[...n]).join(" ")),e==null?t.removeAttribute("class"):i?t.setAttribute("class",e):t.className=e}const Cl=Symbol("_vod"),jg=Symbol("_vsh"),Ii={name:"show",beforeMount(t,{value:e},{transition:i}){t[Cl]=t.style.display==="none"?"":t.style.display,i&&e?i.beforeEnter(t):co(t,e)},mounted(t,{value:e},{transition:i}){i&&e&&i.enter(t)},updated(t,{value:e,oldValue:i},{transition:n}){!e!=!i&&(n?e?(n.beforeEnter(t),co(t,!0),n.enter(t)):n.leave(t,()=>{co(t,!1)}):co(t,e))},beforeUnmount(t,{value:e}){co(t,e)}};function co(t,e){t.style.display=e?t[Cl]:"none",t[jg]=!e}const T1=Symbol(""),A1=/(?:^|;)\s*display\s*:/;function C1(t,e,i){const n=t.style,s=ei(i);let r=!1;if(i&&!s){if(e)if(ei(e))for(const l of e.split(";")){const o=l.slice(0,l.indexOf(":")).trim();i[o]==null&&ml(n,o,"")}else for(const l in e)i[l]==null&&ml(n,l,"");for(const l in i)l==="display"&&(r=!0),ml(n,l,i[l])}else if(s){if(e!==i){const l=n[T1];l&&(i+=";"+l),n.cssText=i,r=A1.test(i)}}else e&&t.removeAttribute("style");Cl in t&&(t[Cl]=r?n.display:"",t[jg]&&(n.display="none"))}const Am=/\s*!important$/;function ml(t,e,i){if(nt(i))i.forEach(n=>ml(t,e,n));else if(i==null&&(i=""),e.startsWith("--"))t.setProperty(e,i);else{const n=E1(t,e);Am.test(i)?t.setProperty(Ts(n),i.replace(Am,""),"important"):t[n]=i}}const Cm=["Webkit","Moz","ms"],Su={};function E1(t,e){const i=Su[e];if(i)return i;let n=Zi(e);if(n!=="filter"&&n in t)return Su[e]=n;n=Hl(n);for(let s=0;swu||(D1.then(()=>wu=0),wu=Date.now());function F1(t,e){const i=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=i.attached)return;un(N1(n,i.value),e,5,[n])};return i.value=t,i.attached=I1(),i}function N1(t,e){if(nt(e)){const i=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{i.call(t),t._stopped=!0},e.map(n=>s=>!s._stopped&&n&&n(s))}else return e}const Im=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,O1=(t,e,i,n,s,r)=>{const l=s==="svg";e==="class"?P1(t,n,l):e==="style"?C1(t,i,n):$l(e)?Uc(e)||R1(t,e,i,n,r):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):U1(t,e,n,l))?(Rm(t,e,n),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&km(t,e,n,l,r,e!=="value")):t._isVueCE&&(/[A-Z]/.test(e)||!ei(n))?Rm(t,Zi(e),n,r,e):(e==="true-value"?t._trueValue=n:e==="false-value"&&(t._falseValue=n),km(t,e,n,l))};function U1(t,e,i,n){if(n)return!!(e==="innerHTML"||e==="textContent"||e in t&&Im(e)&<(i));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="autocorrect"||e==="sandbox"&&t.tagName==="IFRAME"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const s=t.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Im(e)&&ei(i)?!1:e in t}const Qr=t=>{const e=t.props["onUpdate:modelValue"]||!1;return nt(e)?i=>ul(e,i):e};function V1(t){t.target.composing=!0}function Fm(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const Kn=Symbol("_assign");function Nm(t,e,i){return e&&(t=t.trim()),i&&(t=Wl(t)),t}const ae={created(t,{modifiers:{lazy:e,trim:i,number:n}},s){t[Kn]=Qr(s);const r=n||s.props&&s.props.type==="number";bs(t,e?"change":"input",l=>{l.target.composing||t[Kn](Nm(t.value,i,r))}),(i||r)&&bs(t,"change",()=>{t.value=Nm(t.value,i,r)}),e||(bs(t,"compositionstart",V1),bs(t,"compositionend",Fm),bs(t,"change",Fm))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:i,modifiers:{lazy:n,trim:s,number:r}},l){if(t[Kn]=Qr(l),t.composing)return;const o=(r||t.type==="number")&&!/^0\d/.test(t.value)?Wl(t.value):t.value,u=e??"";o!==u&&(document.activeElement===t&&t.type!=="range"&&(n&&e===i||s&&t.value.trim()===u)||(t.value=u))}},Ci={deep:!0,created(t,e,i){t[Kn]=Qr(i),bs(t,"change",()=>{const n=t._modelValue,s=Zo(t),r=t.checked,l=t[Kn];if(nt(n)){const o=zc(n,s),u=o!==-1;if(r&&!u)l(n.concat(s));else if(!r&&u){const c=[...n];c.splice(o,1),l(c)}}else if(ro(n)){const o=new Set(n);r?o.add(s):o.delete(s),l(o)}else l(Xg(t,r))})},mounted:Om,beforeUpdate(t,e,i){t[Kn]=Qr(i),Om(t,e,i)}};function Om(t,{value:e,oldValue:i},n){t._modelValue=e;let s;if(nt(e))s=zc(e,n.props.value)>-1;else if(ro(e))s=e.has(n.props.value);else{if(e===i)return;s=ua(e,Xg(t,!0))}t.checked!==s&&(t.checked=s)}const Rt={deep:!0,created(t,{value:e,modifiers:{number:i}},n){const s=ro(e);bs(t,"change",()=>{const r=Array.prototype.filter.call(t.options,l=>l.selected).map(l=>i?Wl(Zo(l)):Zo(l));t[Kn](t.multiple?s?new Set(r):r:r[0]),t._assigning=!0,Yc(()=>{t._assigning=!1})}),t[Kn]=Qr(n)},mounted(t,{value:e}){Um(t,e)},beforeUpdate(t,e,i){t[Kn]=Qr(i)},updated(t,{value:e}){t._assigning||Um(t,e)}};function Um(t,e){const i=t.multiple,n=nt(e);if(!(i&&!n&&!ro(e))){for(let s=0,r=t.options.length;sString(c)===String(o)):l.selected=zc(e,o)>-1}else l.selected=e.has(o);else if(ua(Zo(l),e)){t.selectedIndex!==s&&(t.selectedIndex=s);return}}!i&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function Zo(t){return"_value"in t?t._value:t.value}function Xg(t,e){const i=e?"_trueValue":"_falseValue";return i in t?t[i]:e}const B1=["ctrl","shift","alt","meta"],z1={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>B1.some(i=>t[`${i}Key`]&&!e.includes(i))},ft=(t,e)=>{const i=t._withMods||(t._withMods={}),n=e.join(".");return i[n]||(i[n]=(s,...r)=>{for(let l=0;l{const i=t._withKeys||(t._withKeys={}),n=e.join(".");return i[n]||(i[n]=s=>{if(!("key"in s))return;const r=Ts(s.key);if(e.some(l=>l===r||$1[l]===r))return t(s)})},G1=pi({patchProp:O1},y1);let Vm;function H1(){return Vm||(Vm=Kb(G1))}const W1=(...t)=>{const e=H1().createApp(...t),{mount:i}=e;return e.mount=n=>{const s=j1(n);if(!s)return;const r=e._component;!lt(r)&&!r.render&&!r.template&&(r.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const l=i(s,!1,q1(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),l},e};function q1(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function j1(t){return ei(t)?document.querySelector(t):t}function Kg(t){const e=Number(t);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):.5}function oo(t){const e=Kg(t);return e*e*(3-2*e)}function Vo(t,e,i){const n=oo(i),s=t!=null&&t!=="",r=e!=null&&e!=="";if(!s&&!r)return null;if(!s)return Number(e);if(!r)return Number(t);const l=Number(t),o=Number(e);return!Number.isFinite(l)||!Number.isFinite(o)?r?e:t:l+(o-l)*n}function Dd(t,e,i){const n=t!=null?String(t).trim():"",s=e!=null?String(e).trim():"";if(!n&&!s)return"";if(!n)return s;if(!s)return n;const r=oo(i);if(r<=.02)return n;if(r>=.98)return s;const l=(1-r).toFixed(2),o=r.toFixed(2);return`(${n}:${l}) (${s}:${o})`}function X1(t,e,i){const n=t!=null,s=e!=null;return!n&&!s?null:n?s&&oo(i)>=.5?!!e:!!t:!!e}function K1(t,e,i){const n=oo(i),s=o=>o?typeof o=="object"?o:{name:String(o),strength:1}:null,r=s(t),l=s(e);return!r&&!l?null:r?l?n<.5?{name:r.name,strength:(r.strength??1)*(1-n*2)}:{name:l.name,strength:(l.strength??1)*((n-.5)*2)}:r:l}function Y1(t,e,i){const n=l=>!l||typeof l!="object"?{positive:"",negative:""}:{positive:String(l.positive??"").trim(),negative:String(l.negative??"").trim()},s=n(t),r=n(e);return!s.positive&&!s.negative&&!r.positive&&!r.negative?{positive:"",negative:""}:{positive:Dd(s.positive,r.positive,i)||"",negative:Dd(s.negative,r.negative,i)||""}}function J1(t,e,i){const n=oo(i),s=o=>!o||typeof o!="object"?null:{slotId:o.slotId||o.id||"CN1",weight:Number(o.weight??.4),start:Number(o.start??0),end:Number(o.end??.9),enabled:o.enabled!==!1},r=s(t),l=s(e);return!r&&!l?null:r?l?{slotId:n<.5?r.slotId:l.slotId,weight:Vo(r.weight,l.weight,n),start:Vo(r.start,l.start,n),end:Vo(r.end,l.end,n),enabled:X1(r.enabled,l.enabled,n)}:r:l}function ar(t,e){if(!t)return null;const i=Kg(e);switch(t.type){case"prompt":return Dd(t.valueA,t.valueB,i);case"param":return Vo(t.valueA,t.valueB,i);case"lora":return K1(t.valueA,t.valueB,i);case"controlnet":return J1(t.valueA,t.valueB,i);case"style":{const n=Y1(t.valueA,t.valueB,i);return!n.positive&&!n.negative?null:n}default:return Vo(t.valueA,t.valueB,i)}}const Z1=[{id:"prompt",label:"Prompt"},{id:"style",label:"Style"},{id:"param",label:"Parameter"},{id:"lora",label:"LoRA"},{id:"controlnet",label:"ControlNet"}],Sa={W:512,H:512,show_info_on_ui:!1,tiling:!1,restore_faces:!1,seed_resize_from_w:0,seed_resize_from_h:0,seed:-1,sampler:"Euler",scheduler:"sgm_uniform",steps:4,batch_name:"floral_neu",seed_behavior:"random",seed_iter_N:1,use_init:!1,strength:1,strength_0_no_init:!0,init_image:null,use_mask:!1,animation_mode:"2D",max_frames:120,border:"replicate",angle:"0: (0)",zoom:"0: (1.0)",translation_x:"0: (0)",translation_y:"0: (0.0)",translation_z:"0: (0.0)",transform_center_x:"0: (0.5)",transform_center_y:"0: (0.5)",rotation_3d_x:"0: (0)",rotation_3d_y:"0: (0)",rotation_3d_z:"0: (0)",noise_schedule:"0: (0.065)",strength_schedule:"0: (0.60)",keyframe_strength_schedule:"0: (0.50)",contrast_schedule:"0: (1.0)",cfg_scale_schedule:"0:(1)",distilled_cfg_scale_schedule:"0: (1)",enable_steps_scheduling:!1,steps_schedule:"0: (4)",prompts:{0:"silhouette black big wild flowers and wild plants and berries, red background, many different flowers, layered silhouettes, folk art style floral graphics, flat folk art style illustration, layered composition, detailed composition, natural colors, medium high contrast"},positive_prompts:"",negative_prompts:"star, star shape, watermark, signature, dreamstime, logo, writing, text, poster element, year, number, date, label, vignette, glow, symbol, alphabet, number, freepik, blurry, low quality, ugly",fps:24,sd_model_name:"SDXL/sd_xl_turbo_1.0_fp16.safetensors",skip_video_creation:!0,cn_1_enabled:!1,cn_1_weight:"0:(2)",cn_1_guidance_start:"0:(0.0)",cn_1_guidance_end:"0:(1.0)",cn_1_module:"None",cn_1_model:"temporalnetversion2 [b554c208]",cn_1_overwrite_frames:!0,cn_1_vid_path:"",cn_1_mask_vid_path:"",cn_1_low_vram:!1,cn_1_pixel_perfect:!1,cn_1_processor_res:64,cn_1_threshold_a:64,cn_1_threshold_b:64,cn_1_resize_mode:"Inner Fit (Scale to Fit)",cn_1_control_mode:"Balanced",cn_1_loopback_mode:!1,cn_2_overwrite_frames:!0,cn_2_vid_path:"",cn_2_mask_vid_path:"",cn_2_enabled:!1,cn_2_low_vram:!1,cn_2_pixel_perfect:!1,cn_2_module:"none",cn_2_model:"None",cn_2_weight:"0:(1)",cn_2_guidance_start:"0:(0.0)",cn_2_guidance_end:"0:(1.0)",cn_2_processor_res:64,cn_2_threshold_a:64,cn_2_threshold_b:64,cn_2_resize_mode:"Inner Fit (Scale to Fit)",cn_2_control_mode:"Balanced",cn_2_loopback_mode:!1,cn_3_overwrite_frames:!0,cn_3_vid_path:"",cn_3_mask_vid_path:"",cn_3_enabled:!1,cn_3_low_vram:!1,cn_3_pixel_perfect:!1,cn_3_module:"none",cn_3_model:"None",cn_3_weight:"0:(1)",cn_3_guidance_start:"0:(0.0)",cn_3_guidance_end:"0:(1.0)",cn_3_processor_res:64,cn_3_threshold_a:64,cn_3_threshold_b:64,cn_3_resize_mode:"Inner Fit (Scale to Fit)",cn_3_control_mode:"Balanced",cn_3_loopback_mode:!1,cn_4_overwrite_frames:!0,cn_4_vid_path:"",cn_4_mask_vid_path:"",cn_4_enabled:!1,cn_4_low_vram:!1,cn_4_pixel_perfect:!1,cn_4_module:"none",cn_4_model:"None",cn_4_weight:"0:(1)",cn_4_guidance_start:"0:(0.0)",cn_4_guidance_end:"0:(1.0)",cn_4_processor_res:64,cn_4_threshold_a:64,cn_4_threshold_b:64,cn_4_resize_mode:"Inner Fit (Scale to Fit)",cn_4_control_mode:"Balanced",cn_4_loopback_mode:!1,cn_5_overwrite_frames:!0,cn_5_vid_path:"",cn_5_mask_vid_path:"",cn_5_enabled:!1,cn_5_low_vram:!1,cn_5_pixel_perfect:!1,cn_5_module:"none",cn_5_model:"None",cn_5_weight:"0:(1)",cn_5_guidance_start:"0:(0.0)",cn_5_guidance_end:"0:(1.0)",cn_5_processor_res:64,cn_5_threshold_a:64,cn_5_threshold_b:64,cn_5_resize_mode:"Inner Fit (Scale to Fit)",cn_5_control_mode:"Balanced",cn_5_loopback_mode:!1},Yg={id:"global",label:"Global",fields:[{key:"W",label:"Width",type:"number",min:256,max:4096,step:64},{key:"H",label:"Height",type:"number",min:256,max:4096,step:64},{key:"fps",label:"FPS",type:"select",options:["8","12","24","30"]},{key:"seed",label:"Seed",type:"number",min:-1,max:2147483647,step:1},{key:"sampler",label:"Sampler",type:"select"},{key:"scheduler",label:"Scheduler",type:"select"},{key:"steps",label:"Steps",type:"slider",min:2,max:150,step:1},{key:"sd_model_name",label:"Checkpoint",type:"text"}]},nh=[{id:"canvas",label:"Canvas",fields:[{key:"max_frames",label:"Max frames",type:"number",min:1,max:99999,step:1},{key:"batch_name",label:"Batch name",type:"text"}]},{id:"prompts",label:"Prompts",fields:[{key:"prompts.0",label:"Prompt @ 0",type:"textarea",rows:4},{key:"negative_prompts",label:"Negative",type:"textarea",rows:3},{key:"positive_prompts",label:"Positive (extra)",type:"textarea",rows:2}]},{id:"init",label:"Init",fields:[{key:"use_init",label:"Use init image",type:"bool"},{key:"strength",label:"Strength",type:"number",min:0,max:1.5,step:.01},{key:"init_image",label:"Init image URL/path",type:"text"}]},{id:"motion",label:"Motion 2D",fields:[{key:"zoom",label:"Zoom schedule",type:"text"},{key:"translation_x",label:"Pan X schedule",type:"text"},{key:"translation_y",label:"Pan Y schedule",type:"text"},{key:"angle",label:"Angle schedule",type:"text"}]},{id:"motion3d",label:"Motion 3D",fields:[{key:"translation_z",label:"Zoom Z schedule",type:"text"},{key:"rotation_3d_x",label:"Rotate X schedule",type:"text"},{key:"rotation_3d_y",label:"Rotate Y schedule",type:"text"},{key:"rotation_3d_z",label:"Rotate Z schedule",type:"text"}]},{id:"schedules",label:"Schedules",fields:[{key:"noise_schedule",label:"Noise",type:"text"},{key:"strength_schedule",label:"Strength",type:"text"},{key:"cfg_scale_schedule",label:"CFG",type:"text"},{key:"steps_schedule",label:"Steps",type:"text"}]}];function ho(t){const e=`cn_${t}_`,i=t===1?"ControlNet 1":`ControlNet ${t}`;return{id:t===1?"controlnet":`controlnet_${t}`,label:i,fields:[{key:`${e}enabled`,label:"Enabled",type:"bool"},{key:`${e}module`,label:"Module",type:"text"},{key:`${e}model`,label:"Model",type:"text"},{key:`${e}weight`,label:"Weight schedule",type:"text"},{key:`${e}guidance_start`,label:"Guidance start",type:"text"},{key:`${e}guidance_end`,label:"Guidance end",type:"text"},{key:`${e}processor_res`,label:"Processor res",type:"slider",min:64,max:2048,step:1},{key:`${e}threshold_a`,label:"Threshold A",type:"slider",min:0,max:255,step:1},{key:`${e}threshold_b`,label:"Threshold B",type:"slider",min:0,max:255,step:1},{key:`${e}control_mode`,label:"Control mode",type:"text"},{key:`${e}resize_mode`,label:"Resize mode",type:"text"},{key:`${e}pixel_perfect`,label:"Pixel perfect",type:"bool"},{key:`${e}low_vram`,label:"Low VRAM",type:"bool"},{key:`${e}vid_path`,label:"Video path",type:"text"}]}}nh.push(ho(1),ho(2),ho(3),ho(4),ho(5));const sh=[Yg,...nh],Id=sh.flatMap(t=>t.fields.map(e=>e.key));new Set(sh.filter(t=>String(t.id).startsWith("controlnet")).map(t=>t.id));const Jg=new Set(["translation_z","rotation_3d_x","rotation_3d_y","rotation_3d_z"]),Bm="motion3d";function zm(t){return String(t||"2D").trim().toUpperCase()==="3D"?"3D":"2D"}function Q1(t){return Jg.has(t)}const e0=new Set(["sampler","scheduler","sd_model_name","seed","steps","W","H","fps","max_frames","batch_name"]),t0=["Euler","Euler a","DPM++ 2M","DPM++ SDE","DDIM","Heun"],i0=["automatic","uniform","sgm_uniform","karras","normal","exponential"];function lr(t={}){const e={};return Id.forEach(i=>{e[i]=t[i]!==!1}),e}function wa(t,e){if(!e||!t)return;const i=String(e).split(".");let n=t;for(const s of i){if(n==null)return;n=n[s]}return n}function $m(t,e,i){const n=String(e).split(".");let s=t;for(let r=0;r=0;r-=1){const{parent:l,key:o}=n[r],u=l[o];if(!u||typeof u!="object"||Array.isArray(u)||Object.keys(u).length)break;delete l[o]}}}function Zg(t){if(t==null||t==="")return[{frame:0,value:0}];const e=String(t).trim(),i=[],n=/(\d+)\s*:\s*\(?\s*([-\d.eE+]+)\s*\)?/g;let s;for(;(s=n.exec(e))!==null;)i.push({frame:Number(s[1]),value:Number(s[2])});if(!i.length){const r=Number(e.replace(/[()]/g,"").trim());return Number.isFinite(r)?[{frame:0,value:r}]:[{frame:0,value:0}]}return i.sort((r,l)=>r.frame-l.frame),i}function n0(t){const e=Number(t);if(!Number.isFinite(e))return"0";const i=Math.round(e*1e3)/1e3;return String(i)}function s0(t){return(t||[]).map(e=>`${Math.max(0,Math.round(Number(e.frame)||0))}: (${n0(e.value)})`).join(", ")}function Gm(t,e){var r;const i=Zg(t),n=Math.max(0,Math.round(Number(e)||0));let s=((r=i[0])==null?void 0:r.value)??0;for(const l of i)if(l.frame<=n)s=l.value;else break;return s}function r0(t,e,i,n,s=""){const r=Math.max(0,Math.round(Number(t)||0)),l=Math.max(1,Math.round(Number(e)||1)),o=Number(i),u=Number(n),c=Number.isFinite(o)?o:0,h=Number.isFinite(u)?u:c,d=r+l-1,m=[];if(l===1)m.push({frame:r,value:h});else for(let w=0;ww.framed),...m].sort((w,v)=>w.frame-v.frame);return s0(b)}function o0(t,e){const i=String(t).split(".");if(i.length===1)return{[i[0]]:e};const n=i[0],s={};let r=s;for(let l=1;lr.frame-l.frame),i}function Hm(t){if(t==null||t==="")return!0;const e=String(t).trim();return!!(/\d+\s*:\s*\(?/.test(e)||/^\([\d.eE+\-]+\)$/.test(e))}function xa(t){return rh(t).every(i=>Math.abs(i.value)<1e-6)}function mn(t){return rh(t).some(i=>Math.abs(i.value)>1e-6)}function u0(t){const e=t&&t.prompts;if(e&&typeof e=="object"){const n=e[0]??e[0];if(n!=null&&String(n).trim())return String(n).trim();const s=Object.values(e).find(r=>r!=null&&String(r).trim());if(s)return String(s).trim()}const i=t&&t.positive_prompts;return i!=null&&String(i).trim()?String(i).trim():""}function yt(t,e,i,n){const s={field:e,message:i};n&&(s.hint=n),t.push(s)}function d0(t,e={}){var v,y,S;const i=!!e.onlyDefinedKeys,n=P=>!i||t&&Object.prototype.hasOwnProperty.call(t,P),s=[],r=[];if(!t||typeof t!="object"||Array.isArray(t))return yt(s,"settings","Settings must be a JSON object"),{ok:!1,errors:s,warnings:r};const l=Number(t.W),o=Number(t.H);n("W")&&(!Number.isFinite(l)||l<64)?yt(s,"W","Width must be at least 64 pixels"):n("W")&&l%8!==0&&yt(r,"W","Width is not a multiple of 8 — SD/Deforum often works best with divisible-by-8 sizes","Try 768, 832, 1024…"),n("H")&&(!Number.isFinite(o)||o<64)?yt(s,"H","Height must be at least 64 pixels"):n("H")&&o%8!==0&&yt(r,"H","Height is not a multiple of 8","Try 432, 576, 768…"),Number.isFinite(l)&&Number.isFinite(o)&&l*o>1920*1080&&yt(r,"W×H",`Canvas ${l}×${o} is large — may be slow or OOM on consumer GPUs`,"Consider 1280×720 or 1024×576 for iteration");const u=Number(t.max_frames);n("max_frames")&&(!Number.isFinite(u)||u<1)?yt(s,"max_frames","max_frames must be at least 1"):u>8e3&&yt(r,"max_frames",`${u} frames is very long`,"Long runs are costly; confirm duration and disk space");const c=Number(t.fps);n("fps")&&(!Number.isFinite(c)||c<1)?yt(s,"fps","FPS must be at least 1"):c>60&&yt(r,"fps",`${c} FPS is unusually high for Deforum`,"24–30 FPS is typical");const h=Number(t.steps),d=String(t.sd_model_name||"").toLowerCase();n("steps")&&(!Number.isFinite(h)||h<1)?yt(s,"steps","Steps must be at least 1"):h<2&&/lightning|turbo|lcm/.test(d)?yt(r,"steps",`Only ${h} step(s) with a fast/lightning checkpoint`,"Lightning models often expect 2–8 steps"):h>60&&yt(r,"steps",`${h} steps per frame is high`,"Try 4–20 unless you need maximum quality");const m=String(t.batch_name||"").trim();if(m?/^[a-zA-Z0-9_.-]+$/.test(m)||yt(r,"batch_name","Batch name has spaces or special characters","Use letters, numbers, underscore, hyphen"):yt(r,"batch_name","Batch name is empty","Outputs may be harder to find in the runs browser"),u0(t)||yt(s,"prompts",'No positive prompt — add text under Prompts or prompts["0"]'),t.use_init&&!String(t.init_image||"").trim()&&yt(s,"init_image","use_init is enabled but init_image is missing"),t.use_init){const P=Number(t.strength);(!Number.isFinite(P)||P<0||P>1.5)&&yt(r,"strength","Init strength is outside 0–1.5","Typical img2img strength is 0.3–0.85")}const g=String(t.animation_mode||"2D").trim().toUpperCase(),b=g==="WAN VIDEO"||g==="WAN";if(["2D","3D","WAN VIDEO","WAN","ANIMATELCM"].includes(g)||yt(r,"animation_mode",`Unknown animation mode "${t.animation_mode}"`,"Use 2D, 3D, Wan Video, or AnimateLCM"),b){const P=Number(t.wan_inference_steps??t.steps);if((!Number.isFinite(P)||P<1)&&yt(r,"wan_inference_steps","Wan inference steps should be at least 1","Typical range is 5–30"),String(t.animation_prompts||((v=t.prompts)==null?void 0:v["0"])||((y=t.prompts)==null?void 0:y[0])||"").trim()||yt(r,"animation_prompts","Wan Video needs at least one prompt","Set prompts in the Prompts tab or animation_prompts schedule"),t.use_init&&!String(t.init_image||"").trim()&&yt(s,"init_image","Wan I2V init is enabled but no init image is set","Upload an image under WAN → Image init (I2V)"),t.use_init){const M=Number(t.strength);(!Number.isFinite(M)||M<.05)&&yt(r,"strength","Wan init strength is very low","Try 0.5–0.95 for strong I2V conditioning on the first frame")}}else if(g==="2D"){mn(t.translation_z)&&yt(r,"translation_z","3D zoom schedule is non-zero while mode is 2D","Ignored in 2D — use zoom / angle instead");for(const P of["rotation_3d_x","rotation_3d_y","rotation_3d_z"])mn(t[P])&&yt(r,P,"3D rotation schedule is active in 2D mode","Switch to 3D mode or zero this schedule")}else if(g==="3D"){const P=mn(t.translation_z)||mn(t.rotation_3d_x)||mn(t.rotation_3d_y)||mn(t.rotation_3d_z),M=mn(t.translation_x)||mn(t.translation_y)||mn(t.zoom)||mn(t.angle);!P&&!M&&yt(r,"motion","No camera motion in schedules","Add translation, zoom, or 3D rotation keyframes")}for(const P of a0){const M=t[P];M==null||M===""||Hm(M)||yt(r,P,"Value does not look like a Deforum schedule","Use frame:value pairs, e.g. 0:(1.0) or 0: (0), 24: (1.02)")}xa(t.cfg_scale_schedule)&&xa(t.distilled_cfg_scale_schedule)&&yt(r,"cfg_scale_schedule","CFG schedule is zero everywhere","Deforum may produce blank or weak results — try 0:(7) or similar"),xa(t.strength_schedule)&&!t.use_init&&yt(r,"strength_schedule","Strength schedule is flat at 0","Usually keep strength > 0 for generation");const w=String(t.steps_schedule||"");if(w&&Hm(w)){const P=(S=rh(w)[0])==null?void 0:S.value;Number.isFinite(h)&&Number.isFinite(P)&&Math.round(h)!==Math.round(P)&&yt(r,"steps",`UI steps (${h}) differs from steps_schedule (${P})`,"Align steps and steps_schedule")}for(let P=1;P<=5;P+=1){if(!t[`cn_${P}_enabled`])continue;const k=String(t[`cn_${P}_module`]||"").toLowerCase(),C=String(t[`cn_${P}_model`]||"").toLowerCase();(!k||k==="none")&&yt(r,`cn_${P}_module`,"ControlNet enabled but module is None"),(!C||C==="none")&&yt(r,`cn_${P}_model`,"ControlNet enabled but model is None");const L=String(t[`cn_${P}_vid_path`]||"").trim();/video|temporal|animated/i.test(k+C)&&!L&&yt(r,`cn_${P}_vid_path`,"Video/temporal ControlNet without cn_*_vid_path")}for(const P of l0)t[P.replace("_weight","_enabled")]&&xa(t[P])&&yt(r,P,"ControlNet weight schedule is zero while unit is enabled");return String(t.sd_model_name||"").trim()||yt(r,"sd_model_name","No checkpoint selected"),t.skip_video_creation===!1&&yt(r,"skip_video_creation","Video export enabled","Encoding adds time; enable only when you need an MP4"),{ok:s.length===0,errors:s,warnings:r}}const c0="defora_control_token";let Wm=!1;function h0(){if(typeof localStorage>"u")return"";try{return localStorage.getItem(c0)||""}catch{return""}}function m0(t){if(typeof window>"u"||typeof URL>"u")return!1;const e=typeof t=="string"||t instanceof URL?t:t&&typeof t.url=="string"?t.url:null;if(!e)return!1;try{const i=new URL(e,window.location.origin);return i.origin===window.location.origin&&i.pathname.startsWith("/api")}catch{return!1}}function Qg(t,e={}){const i=h0();if(!i||!m0(t)||typeof Headers>"u")return e;const n=new Headers(e.headers||void 0);return!n.has("Authorization")&&!n.has("X-API-Token")&&!n.has("X-Control-Token")&&n.set("Authorization",`Bearer ${i}`),{...e,headers:n}}function p0(){if(Wm||typeof window>"u"||typeof window.fetch!="function")return;const t=window.fetch.bind(window);window.fetch=(e,i={})=>t(e,Qg(e,i)),Wm=!0}async function jt(t,e={},i="API"){const n=i||t;try{const s=await fetch(t,Qg(t,e));let r=null;if((s.headers.get("content-type")||"").includes("application/json"))try{r=await s.json()}catch{r=null}else{const o=await s.text();o&&(r={_raw:o.slice(0,200)})}if(!s.ok){const o=r&&(r.error||r.message)||s.statusText||`HTTP ${s.status}`;console.error(`[Defora ${n}] ${s.status}: ${o}`,r||"");const u=new Error(o);throw u.status=s.status,u.data=r,u}return{res:s,data:r}}catch(s){throw s.status||console.error(`[Defora ${n}] Network error: ${s.message}`),s}}function f0(t){return t==="sd-forge"?"Forge":t==="cache"?"Cache":t==="placeholder"?"Placeholder":t||"Unknown"}function qm(t){if(t==null)return;if(typeof t=="number")return t;const e=String(t),i=e.match(/\(([^)]+)\)/);if(i){const s=parseFloat(i[1]);if(Number.isFinite(s))return s}const n=parseFloat(e);return Number.isFinite(n)?n:e}function g0(t){if(!t||typeof t!="object")return;const e=t.prompts;if(e&&typeof e=="object"){const i=Object.keys(e).sort((n,s)=>Number(n)-Number(s))[0];if(i!=null)return e[i]}return t.animation_prompts_positive||t.prompt}function y0({deforumSettings:t,forgeModel:e}={}){const i=t&&typeof t=="object"?t:{},n=new Map([["model",i.sd_model_name||i.sd_model_checkpoint||e],["seed",i.seed],["steps",i.steps],["frame_count",i.max_frames],["length_frames",i.max_frames],["max_frames",i.max_frames],["fps",i.fps],["tag",i.batch_name],["prompt_positive",g0(i)],["prompt_negative",i.negative_prompts||i.negative_prompt],["cfg",qm(i.cfg_scale_schedule)],["strength",qm(i.strength_schedule)]]);return{settings:i,byPath:n}}function v0(t,e){if(t===e||t==null&&e==null)return!0;if(typeof t=="number"&&typeof e=="number")return Math.abs(t-e)<1e-9;if(typeof t=="string"&&typeof e=="number"||typeof t=="number"&&typeof e=="string")return String(t)===String(e);try{return JSON.stringify(t)===JSON.stringify(e)}catch{return!1}}function jm(t){if(t===void 0)return"undefined";if(t===null)return"null";if(typeof t=="string")return t.length>160?`${t.slice(0,160)}…`:t;if(typeof t=="object")try{const e=JSON.stringify(t);return e.length>160?`${e.slice(0,160)}…`:e}catch{return String(t)}return String(t)}function b0(t,e){if(!t||!e)return;const i=e.settings||{},n=["job.snapshot.settings.","job.settings.","snapshot.settings."];for(const r of n)if(t.startsWith(r)){const l=t.slice(r.length);return Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0}const s=t.split(/[.[]/)[0];if(e.byPath&&e.byPath.has(s))return e.byPath.get(s);if(Object.prototype.hasOwnProperty.call(i,t))return i[t];if(Object.prototype.hasOwnProperty.call(i,s))return i[s];if(s==="_batch"&&t.includes("model"))return e.byPath.get("model")}function _0(t,e){return Array.isArray(e)&&e.length>16&&/(^|\.)frames$/.test(t)}function pl(t,e=""){const i=[];if(t==null)return i.push({path:e||"(root)",value:t}),i;if(typeof t!="object")return i.push({path:e||"(root)",value:t}),i;if(Array.isArray(t))return _0(e,t)?(i.push({path:e,value:t,summary:`[${t.length} items] ${t[0]??""}${t.length>1?` … ${t[t.length-1]}`:""}`}),i):t.length===0?(i.push({path:e,value:[]}),i):(t.forEach((s,r)=>{i.push(...pl(s,`${e}[${r}]`))}),i);const n=Object.keys(t).sort();return e?(n.forEach(s=>i.push(...pl(t[s],`${e}.${s}`))),i):(n.forEach(s=>i.push(...pl(t[s],s))),i)}function Xm(t,e,{diffOnly:i=!1}={}){if(!t||typeof t!="object")return[];const s=pl(t).map(r=>{const l=b0(r.path,e),o=l!==void 0,u=o&&!v0(r.value,l);return{path:r.path,value:r.value,displayValue:r.summary!=null?r.summary:jm(r.value),current:l,displayCurrent:o?jm(l):"",hasCurrent:o,differs:u}});return i?s.filter(r=>r.differs):s}function S0(t){if(!t)return"";try{return JSON.stringify(t,null,2)}catch{return String(t)}}function El(t,e){const i=String(t??"").trim(),n=String(e??"").trim();return n?i?`${i}, ${n}`:n:i}function Km({positive:t,negative:e},i){return i?{positive:El(t,i.positive),negative:El(e,i.negative)}:{positive:String(t??"").trim(),negative:String(e??"").trim()}}const w0="SDXL/sd_xl_turbo_1.0_fp16.safetensors",wn="",ur={enabled:!1,steps:1,loraTag:wn};function M0(t,e){const i=String(t??"").trim(),n=String(e??"").trim();return!n||i.includes(n)?i:i?`${i}, ${n}`:n}const ey=[{id:"v2_lora_ZoomIn",label:"Zoom In"},{id:"v2_lora_ZoomOut",label:"Zoom Out"},{id:"v2_lora_PanLeft",label:"Pan ←"},{id:"v2_lora_PanRight",label:"Pan →"},{id:"v2_lora_TiltUp",label:"Tilt ↑"},{id:"v2_lora_TiltDown",label:"Tilt ↓"},{id:"v2_lora_RollingClockwise",label:"Roll ↻"},{id:"v2_lora_RollingAnticlockwise",label:"Roll ↺"}],ty="Wan Video",iy=ey,x0=["Turbo","Fast","Balanced","Quality"],Ym={Turbo:{wan_speed_preset:"Turbo",wan_inference_steps:8,wan_flash_attention_mode:"Force Flash Attention",wan_enable_interpolation:!1,wan_guidance_scale:6,wan_frame_overlap:1},Fast:{wan_speed_preset:"Fast",wan_inference_steps:12,wan_flash_attention_mode:"Force Flash Attention",wan_enable_interpolation:!0,wan_interpolation_strength:.35,wan_guidance_scale:7,wan_frame_overlap:2},Balanced:{wan_speed_preset:"Balanced",wan_inference_steps:20,wan_flash_attention_mode:"Auto (Recommended)",wan_enable_interpolation:!0,wan_interpolation_strength:.5,wan_guidance_scale:7.5,wan_frame_overlap:2},Quality:{wan_speed_preset:"Quality",wan_inference_steps:35,wan_flash_attention_mode:"Auto (Recommended)",wan_enable_interpolation:!0,wan_interpolation_strength:.65,wan_guidance_scale:8,wan_frame_overlap:3}},P0=["Static","Dolly","Pan","Handheld","Cinematic"],Jm={Static:{wan_motion_preset:"Static",wan_motion_strength:.45,wan_motion_strength_override:!0,wan_movement_sensitivity:.6,wan_frame_overlap:1,wan_enable_interpolation:!1},Dolly:{wan_motion_preset:"Dolly",wan_motion_strength:1,wan_motion_strength_override:!0,wan_movement_sensitivity:1,wan_frame_overlap:2,wan_enable_interpolation:!0,wan_interpolation_strength:.45},Pan:{wan_motion_preset:"Pan",wan_motion_strength:.9,wan_motion_strength_override:!0,wan_movement_sensitivity:1.15,wan_frame_overlap:2,wan_enable_interpolation:!0,wan_interpolation_strength:.5},Handheld:{wan_motion_preset:"Handheld",wan_motion_strength:.75,wan_motion_strength_override:!0,wan_movement_sensitivity:1.35,wan_frame_overlap:3,wan_enable_interpolation:!0,wan_interpolation_strength:.55},Cinematic:{wan_motion_preset:"Cinematic",wan_motion_strength:1.1,wan_motion_strength_override:!0,wan_movement_sensitivity:.85,wan_frame_overlap:4,wan_enable_interpolation:!0,wan_interpolation_strength:.7}},Bo=[{id:"vace-1.3b",label:"VACE 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-VACE-1.3B",t2vModel:"1.3B VACE",preferredSize:"1.3B VACE (Recommended)",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-VACE-1.3B --local-dir models/wan"},{id:"vace-14b",label:"VACE 14B (~75GB)",hfRepo:"Wan-AI/Wan2.1-VACE-14B",t2vModel:"14B VACE",preferredSize:"14B VACE",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-VACE-14B --local-dir models/wan"},{id:"t2v-1.3b",label:"T2V 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-T2V-1.3B",t2vModel:"1.3B T2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-T2V-1.3B --local-dir models/wan"},{id:"i2v-1.3b",label:"I2V 1.3B (~17GB)",hfRepo:"Wan-AI/Wan2.1-I2V-1.3B",i2vModel:"1.3B I2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-I2V-1.3B --local-dir models/wan"},{id:"i2v-14b",label:"I2V 14B (~75GB)",hfRepo:"Wan-AI/Wan2.1-I2V-14B",i2vModel:"14B I2V",preferredSize:"Legacy Models",hfCommand:"huggingface-cli download Wan-AI/Wan2.1-I2V-14B --local-dir models/wan"},{id:"qwen-3b",label:"Qwen 2.5-VL-3B (prompt enhancer)",kind:"qwen",qwenModel:"Qwen2.5-VL-3B",hfRepo:"Qwen/Qwen2.5-VL-3B-Instruct",hfCommand:"huggingface-cli download Qwen/Qwen2.5-VL-3B-Instruct --local-dir models/qwen"}],ny=new Set(iy.map(t=>t.id)),sy=new Set(["wan_speed_preset","wan_motion_preset","motion_loras","motion_lora_weight","wan_use_init_image","wan_init_image","wan_i2v_init_strength"]);function T0(t){return Bo.find(e=>e.id===t)||Bo[0]}function A0(t){return Ym[t]||Ym.Balanced}function C0(t){return Jm[t]||Jm.Static}const eo={wan_speed_preset:"Balanced",wan_motion_preset:"Static",motion_loras:[],motion_lora_weight:.8,wan_use_init_image:!1,wan_init_image:null,wan_i2v_init_strength:.85,wan_t2v_model:"1.3B VACE",wan_i2v_model:"Use Primary Model",wan_auto_download:!0,wan_preferred_size:"1.3B VACE (Recommended)",wan_model_path:"models/wan",wan_resolution:"864x480 (Landscape)",wan_seed:-1,wan_inference_steps:20,wan_strength_override:!0,wan_fixed_strength:1,wan_guidance_override:!0,wan_guidance_scale:7.5,wan_frame_overlap:2,wan_motion_strength:1,wan_motion_strength_override:!1,wan_enable_interpolation:!0,wan_interpolation_strength:.5,wan_flash_attention_mode:"Auto (Recommended)",wan_qwen_model:"Auto-Select",wan_qwen_auto_download:!1,wan_qwen_language:"English",wan_movement_sensitivity:1},E0=["Auto-Detect","1.3B VACE","14B VACE","1.3B T2V","14B T2V","Custom Path"],ry=["Use Primary Model","Use T2V Model (No Continuity)","1.3B VACE","14B VACE","1.3B I2V","14B I2V"],Fd=["864x480 (Landscape)","480x864 (Portrait)","1280x720 (Landscape HD)","720x1280 (Portrait HD)","854x480","480x854"],k0=["Auto (Recommended)","Force Flash Attention","Force PyTorch"],R0=["Auto-Select","Qwen2.5-VL-3B","Qwen2.5-VL-7B","Qwen-VL-Chat"],oy=[{key:"wan_t2v_model",label:"T2V model",type:"select",options:E0},{key:"wan_i2v_model",label:"I2V model",type:"select",options:ry},{key:"wan_resolution",label:"Resolution",type:"select",options:Fd},{key:"wan_inference_steps",label:"Inference steps",type:"number",min:5,max:100,step:1},{key:"wan_guidance_scale",label:"Guidance scale",type:"number",min:1,max:20,step:.5,when:t=>t.wan_guidance_override!==!1},{key:"wan_guidance_override",label:"Override guidance",type:"boolean"},{key:"wan_fixed_strength",label:"I2V strength",type:"number",min:0,max:1,step:.05,when:t=>t.wan_strength_override!==!1},{key:"wan_strength_override",label:"Override strength schedule",type:"boolean"},{key:"wan_frame_overlap",label:"Frame overlap",type:"number",min:0,max:10,step:1},{key:"wan_motion_strength",label:"Motion strength",type:"number",min:0,max:2,step:.05},{key:"wan_motion_strength_override",label:"Fixed motion strength",type:"boolean"},{key:"wan_movement_sensitivity",label:"Movement sensitivity",type:"number",min:.1,max:2,step:.05},{key:"wan_interpolation_strength",label:"Interpolation strength",type:"number",min:0,max:1,step:.05,when:t=>t.wan_enable_interpolation!==!1},{key:"wan_enable_interpolation",label:"Clip interpolation",type:"boolean"},{key:"wan_seed",label:"Wan seed",type:"number",min:-1,max:2147483647,step:1},{key:"wan_auto_download",label:"Auto-download models",type:"boolean"},{key:"wan_flash_attention_mode",label:"Flash attention",type:"select",options:k0},{key:"wan_preferred_size",label:"Preferred size",type:"select",options:["1.3B VACE (Recommended)","14B VACE","Legacy Models"]},{key:"wan_model_path",label:"Model path",type:"text",when:t=>String(t.wan_t2v_model||"").includes("Custom")},{key:"wan_qwen_model",label:"Qwen enhancer",type:"select",options:R0},{key:"wan_qwen_auto_download",label:"Qwen auto-download",type:"boolean"},{key:"wan_qwen_language",label:"Qwen language",type:"select",options:["English","Chinese"]}];function kl(t){const e=String(t||"").match(/(\d+)\s*x\s*(\d+)/i);return e?{width:Number(e[1]),height:Number(e[2])}:null}function L0(t,e){const i=Number(t),n=Number(e);if(!Number.isFinite(i)||!Number.isFinite(n)||i<1||n<1)return null;const s=i/n;let r=Fd[0],l=1/0;for(const o of Fd){const u=kl(o);if(!u)continue;const c=u.width/u.height,h=Math.abs(Math.log(s/c)),d=Math.abs(u.width-i)+Math.abs(u.height-n),m=h*1e3+d;mny.has(h)).map(h=>``).join(" ");if(l)for(const h of Object.keys(s))s[h]=`${String(s[h]||"").trimEnd()} ${l}`.trimStart();const o={...t,animation_mode:ty,skip_video_creation:!1,animation_prompts:Object.keys(s).length?JSON.stringify(s):D0(t,i),animation_prompts_positive:(t==null?void 0:t.animation_prompts_positive)??(t==null?void 0:t.positive_prompts)??"",animation_prompts_negative:(t==null?void 0:t.animation_prompts_negative)??(t==null?void 0:t.negative_prompts)??""};for(const h of Object.keys(eo))sy.has(h)||n[h]!==void 0&&(o[h]=n[h]);const u=kl(n.wan_resolution);u&&(o.W=u.width,o.H=u.height),n.wan_seed!=null&&Number.isFinite(Number(n.wan_seed))&&(o.seed=Number(n.wan_seed));const c=String(n.wan_init_image||o.init_image||"").trim();if(n.wan_use_init_image&&c){o.use_init=!0,o.init_image=c;const h=Number(n.wan_i2v_init_strength);Number.isFinite(h)&&(o.strength=Math.max(0,Math.min(1,h))),n.wan_strength_override!==!1&&(o.wan_strength_override=!0,o.wan_fixed_strength=o.strength)}else n.wan_use_init_image===!1&&(o.use_init=!1);return o}function pn(t={}){const e={...eo};for(const i of Object.keys(eo)){if(t[i]===void 0)continue;if(i==="motion_loras"&&Array.isArray(t.motion_loras)){e.motion_loras=t.motion_loras.filter(s=>ny.has(s));continue}if(i==="wan_init_image"){const s=t.wan_init_image;e.wan_init_image=s==null||s===""?null:String(s);continue}if(i==="wan_use_init_image"){e.wan_use_init_image=!!t.wan_use_init_image&&!!String(t.wan_init_image||"").trim();continue}if(i==="wan_i2v_init_strength"){const s=Number(t.wan_i2v_init_strength);Number.isFinite(s)&&(e.wan_i2v_init_strength=Math.max(0,Math.min(1,s)));continue}const n=oy.find(s=>s.key===i);if((n==null?void 0:n.type)==="boolean")e[i]=!!t[i];else if((n==null?void 0:n.type)==="number"){const s=Number(t[i]);Number.isFinite(s)&&(e[i]=s)}else e[i]=String(t[i])}return String(e.wan_init_image||"").trim()||(e.wan_init_image=null,e.wan_use_init_image=!1),e}function F0(t){const e=t||eo,i=e.wan_use_init_image&&String(e.wan_init_image||"").trim();return oy.filter(n=>sy.has(n.key)||i&&n.key==="wan_i2v_model"?!1:typeof n.when=="function"?n.when(e):!0)}function N0(t,e={}){const i=T0(t),n={...e,wan_auto_download:!0,wan_model_path:e.wan_model_path||"models/wan"};return i.kind==="qwen"?(n.wan_qwen_auto_download=!0,n.wan_qwen_model=i.qwenModel||"Qwen2.5-VL-3B",n):(i.t2vModel&&(n.wan_t2v_model=i.t2vModel),i.i2vModel&&(n.wan_i2v_model=i.i2vModel),i.preferredSize&&(n.wan_preferred_size=i.preferredSize),n)}const ay="AnimateLCM",ly=[{id:"static",label:"Static"},{id:"pan",label:"Pan"},{id:"zoom",label:"Zoom"},{id:"orbit",label:"Orbit"},{id:"handheld",label:"Handheld"},{id:"custom",label:"Custom"}],uy=ey,Rl={motion_type:"pan",motion_preset:"Static",alcm_motion_amount:1,alcm_strength:.75,alcm_cfg:7,alcm_steps:4,alcm_noise:.05,alcm_contrast:1,alcm_zoom:1,alcm_pan_x:0,alcm_pan_y:0,alcm_seed:-1,motion_loras:[],motion_lora_weight:.8},oh=[{key:"motion_type",label:"Motion type",type:"select",options:ly.map(t=>t.id)},{key:"motion_preset",label:"Motion preset",type:"text"},{key:"alcm_motion_amount",label:"Motion amount",type:"number",min:0,max:2,step:.05},{key:"alcm_strength",label:"Strength",type:"number",min:0,max:1.5,step:.01},{key:"alcm_cfg",label:"CFG",type:"number",min:0,max:30,step:.1},{key:"alcm_steps",label:"Steps",type:"number",min:1,max:20,step:1},{key:"alcm_noise",label:"Noise",type:"number",min:0,max:.5,step:.005},{key:"alcm_contrast",label:"Contrast",type:"number",min:0,max:2,step:.01},{key:"alcm_zoom",label:"Zoom",type:"number",min:.5,max:2,step:.01},{key:"alcm_pan_x",label:"Pan X",type:"number",min:-10,max:10,step:.05},{key:"alcm_pan_y",label:"Pan Y",type:"number",min:-10,max:10,step:.05},{key:"alcm_seed",label:"Seed",type:"number",min:-1,max:2147483647,step:1},{key:"motion_lora_weight",label:"LoRA weight",type:"number",min:0,max:1.5,step:.05}],O0=new Set(uy.map(t=>t.id));new Set(oh.map(t=>t.key));function Pu(t={}){const e={...Rl};for(const i of oh)if(t[i.key]!==void 0)if(i.type==="number"){const n=Number(t[i.key]);Number.isFinite(n)&&(e[i.key]=n)}else e[i.key]=String(t[i.key]);return Array.isArray(t.motion_loras)&&(e.motion_loras=t.motion_loras.filter(i=>O0.has(i))),e}function U0(t,e,{positivePrompt:i=""}={}){const n={...Rl,...e||{}},s=t!=null&&t.prompts&&typeof t.prompts=="object"&&!Array.isArray(t.prompts)?{...t.prompts}:{},r=String(i||"").trim();r&&(s[0]=r);const l=(Array.isArray(n.motion_loras)?n.motion_loras:[]).map(u=>``).join(" ");if(l)for(const u of Object.keys(s))s[u]=`${String(s[u]||"").trimEnd()} ${l}`.trimStart();const o={...t,animation_mode:ay,skip_video_creation:!1};Object.keys(s).length&&(o.prompts=s);for(const u of Object.keys(Rl))u==="motion_loras"||u==="motion_lora_weight"||n[u]!==void 0&&(o[u]=n[u]);return n.alcm_seed!=null&&Number.isFinite(Number(n.alcm_seed))&&(o.seed=Number(n.alcm_seed)),Number.isFinite(Number(n.alcm_steps))&&(o.steps=Math.max(1,Math.round(Number(n.alcm_steps))),o.steps_schedule=`0: (${o.steps})`),o}const V0=["XT 1.1","XT","Low motion","High motion"],B0={"XT 1.1":{svd_preset:"XT 1.1",svd_checkpoint:"svd_xt_1_1.safetensors",width:1024,height:576,video_frames:25,motion_bucket_id:127,fps:6,augmentation_level:0,sampling_steps:25,sampling_cfg:2.5,sampling_denoise:1,guidance_min_cfg:1,sampling_sampler_name:"euler",sampling_scheduler:"karras"},XT:{svd_preset:"XT",svd_checkpoint:"svd_xt.safetensors",width:1024,height:576,video_frames:25,motion_bucket_id:127,fps:6,augmentation_level:0,sampling_steps:25,sampling_cfg:2.5,sampling_denoise:1,guidance_min_cfg:1,sampling_sampler_name:"euler",sampling_scheduler:"karras"},"Low motion":{svd_preset:"Low motion",motion_bucket_id:80,augmentation_level:0,fps:6},"High motion":{svd_preset:"High motion",motion_bucket_id:180,augmentation_level:.05,fps:6}},z0=["euler","euler_ancestral","heun","heunpp2","dpm_2","dpm_2_ancestral","lms","dpm_fast","dpm_adaptive","dpmpp_2s_ancestral","dpmpp_sde","dpmpp_sde_gpu","dpmpp_2m","dpmpp_2m_sde","dpmpp_2m_sde_gpu","dpmpp_3m_sde","dpmpp_3m_sde_gpu","ddpm","lcm","ddim","uni_pc","uni_pc_bh2"],$0=["normal","karras","exponential","sgm_uniform","simple","ddim_uniform"],G0=["1024×576 (XT 1.1 landscape)","576×1024 (XT 1.1 portrait)"],ah={svd_preset:"XT 1.1",svd_checkpoint:"svd_xt_1_1.safetensors",svd_resolution:"1024×576 (XT 1.1 landscape)",width:1024,height:576,video_frames:25,motion_bucket_id:127,fps:6,augmentation_level:0,sampling_steps:25,sampling_cfg:2.5,sampling_denoise:1,guidance_min_cfg:1,sampling_sampler_name:"euler",sampling_scheduler:"karras",sampling_seed:-1,svd_init_image:null},dy=[{key:"svd_checkpoint",label:"SVD checkpoint",type:"text",hint:"File in Forge models/svd (e.g. svd_xt_1_1.safetensors)"},{key:"svd_resolution",label:"Resolution preset",type:"select",options:G0},{key:"width",label:"Width",type:"number",min:16,max:8192,step:8},{key:"height",label:"Height",type:"number",min:16,max:8192,step:8},{key:"video_frames",label:"Video frames",type:"number",min:1,max:4096,step:1},{key:"motion_bucket_id",label:"Motion bucket ID",type:"number",min:1,max:1023,step:1},{key:"fps",label:"FPS",type:"number",min:1,max:1024,step:1},{key:"augmentation_level",label:"Augmentation level",type:"number",min:0,max:10,step:.01},{key:"sampling_steps",label:"Sampling steps",type:"number",min:1,max:200,step:1},{key:"sampling_cfg",label:"CFG scale",type:"number",min:0,max:50,step:.1},{key:"sampling_denoise",label:"Sampling denoise",type:"number",min:0,max:1,step:.01},{key:"guidance_min_cfg",label:"Guidance min CFG",type:"number",min:0,max:100,step:.5},{key:"sampling_sampler_name",label:"Sampler",type:"select",options:z0},{key:"sampling_scheduler",label:"Scheduler",type:"select",options:$0},{key:"sampling_seed",label:"Seed",type:"number",min:-1,max:2147483647,step:1}],H0={"1024×576 (XT 1.1 landscape)":{width:1024,height:576},"576×1024 (XT 1.1 portrait)":{width:576,height:1024}};function Nd(t){const e=H0[String(t||"").trim()];if(e)return{...e};const i=String(t||"").match(/(\d+)\s*[×x]\s*(\d+)/i);return i?{width:Number(i[1]),height:Number(i[2])}:null}function W0(t,e){const i=Number(t),n=Number(e);return!Number.isFinite(i)||!Number.isFinite(n)||i<=0||n<=0||i>=n?"1024×576 (XT 1.1 landscape)":"576×1024 (XT 1.1 portrait)"}function Zm(t){return B0[String(t||"").trim()]||null}function q0(t={}){return dy.filter(e=>typeof e.when=="function"?e.when(t):!0)}function Vi(t={}){const e={...ah};for(const n of dy)if(t[n.key]!==void 0)if(n.type==="number"){const s=Number(t[n.key]);Number.isFinite(s)&&(e[n.key]=s)}else e[n.key]=String(t[n.key]);t.svd_preset!==void 0&&(e.svd_preset=String(t.svd_preset)),(t.svd_init_image===null||typeof t.svd_init_image=="string")&&(e.svd_init_image=t.svd_init_image);const i=Nd(e.svd_resolution);return i&&(e.width=i.width,e.height=i.height),e.video_frames=Math.max(1,Math.min(4096,Math.round(Number(e.video_frames)||25))),e.motion_bucket_id=Math.max(1,Math.min(1023,Math.round(Number(e.motion_bucket_id)||127))),e.fps=Math.max(1,Math.min(1024,Math.round(Number(e.fps)||6))),e}function j0(t,{initImageBase64:e=null,preview:i=!1}={}){const n=Vi(t||{}),s=e||n.svd_init_image||null,r=i?Math.max(1,Math.min(4,Number(n.video_frames)||25)):Number(n.video_frames)||25,l=Number(n.sampling_seed),o=Number.isFinite(l)&&l>=0?l:Math.floor(Math.random()*2147483647);return{checkpoint:String(n.svd_checkpoint||ah.svd_checkpoint).trim(),width:Math.round(Number(n.width)||1024),height:Math.round(Number(n.height)||576),video_frames:r,motion_bucket_id:Math.round(Number(n.motion_bucket_id)||127),fps:Math.round(Number(n.fps)||6),augmentation_level:Number(n.augmentation_level)||0,sampling_steps:Math.max(1,Math.round(Number(n.sampling_steps)||25)),sampling_cfg:Number(n.sampling_cfg)||2.5,sampling_denoise:Number(n.sampling_denoise)??1,guidance_min_cfg:Number(n.guidance_min_cfg)||1,sampling_sampler_name:String(n.sampling_sampler_name||"euler"),sampling_scheduler:String(n.sampling_scheduler||"karras"),sampling_seed:o,init_image:s,preview:!!i,model_family:"svd_xt_1_1"}}function X0(t={}){const e=String(t.svd_checkpoint||"").toLowerCase();return String(t.svd_preset||"").trim()==="XT 1.1"?!0:/xt.?1.?1|xt_1_1|img2vid.?xt.?1/.test(e)}function K0(t={}){const e=Vi(t);return{supported:!0,modelFamily:X0(e)?"SVD XT 1.1":"SVD",checkpoint:e.svd_checkpoint,resolution:`${e.width}×${e.height}`,frames:e.video_frames,motionBucketId:e.motion_bucket_id,fps:e.fps}}const Tu=[{id:"strength",label:"Strength",min:0,max:1.5,step:.01,default:.65},{id:"motion",label:"Motion",min:0,max:2.5,step:.01,default:.75},{id:"noise",label:"Noise",min:0,max:1,step:.01,default:.2},{id:"contrast",label:"Contrast",min:0,max:2,step:.01,default:1},{id:"cfg",label:"CFG",min:0,max:30,step:.1,default:6},{id:"zoom",label:"Zoom",min:-5,max:5,step:.05,default:0},{id:"pan_x",label:"Pan X",min:-10,max:10,step:.05,default:0},{id:"pan_y",label:"Pan Y",min:-10,max:10,step:.05,default:0}],Y0={webgl:{strength:{type:"animation",field:"glow"},motion:{type:"animation",field:"speed"},noise:{type:"animation",field:"spread"},contrast:{type:"animation",field:"pulse"},cfg:{type:"animation",field:"hue"},zoom:{type:"animation",field:"orbit"},pan_x:{type:"disabled"},pan_y:{type:"disabled"}},deforum:{strength:{type:"schedule",key:"strength_schedule"},motion:{type:"schedule",key:"translation_z"},noise:{type:"schedule",key:"noise_schedule"},contrast:{type:"schedule",key:"contrast_schedule"},cfg:{type:"schedule",key:"cfg_scale_schedule"},zoom:{type:"schedule",key:"zoom"},pan_x:{type:"schedule",key:"translation_x"},pan_y:{type:"schedule",key:"translation_y"}},wan:{strength:{type:"wan",key:"wan_fixed_strength"},motion:{type:"wan",key:"wan_motion_strength"},noise:{type:"wan",key:"wan_movement_sensitivity"},contrast:{type:"wan",key:"wan_interpolation_strength"},cfg:{type:"wan",key:"wan_guidance_scale"},zoom:{type:"disabled"},pan_x:{type:"disabled"},pan_y:{type:"disabled"}},animatelcm:{strength:{type:"animatelcm",key:"alcm_strength"},motion:{type:"animatelcm",key:"alcm_motion_amount"},noise:{type:"animatelcm",key:"alcm_noise"},contrast:{type:"animatelcm",key:"alcm_contrast"},cfg:{type:"animatelcm",key:"alcm_cfg"},zoom:{type:"animatelcm",key:"alcm_zoom"},pan_x:{type:"animatelcm",key:"alcm_pan_x"},pan_y:{type:"animatelcm",key:"alcm_pan_y"}}};function J0(t){const e=String(t||"").match(/^([a-z]+)\.common\.([a-z_]+)$/);return e?{pluginId:e[1],paramId:e[2]}:null}function Od(t,e){var i;return((i=Y0[t])==null?void 0:i[e])||{type:"disabled"}}function Z0(t,e){return Od(t,e).type!=="disabled"}function cy(t="/freecut"){return String(t||"/freecut").replace(/\/+$/,"")||"/freecut"}function hy(t="/freecut"){return`${cy(t)}/projects`}function Q0(t,e="/freecut"){const i=cy(e),n=String(t||"").trim();return n?`${i}/editor/${encodeURIComponent(n)}`:hy(i)}function e_(t,e){const i=String(t||"").trim(),n=String(e||"").trim();if(!i||!n)return i;const s=i.includes("?")?"&":"?";return`${i}${s}deforaImport=${encodeURIComponent(n)}`}function t_(t,e,i){const n=String(e||"").trim();if(!n)return"";const s=new URLSearchParams({path:n});return i&&s.set("rootId",String(i)),`${String(t||"").replace(/\/+$/,"")}/api/video-swarm/file?${s.toString()}`}function i_(t){const e=String(t||"").trim();return e?{type:"defora:import-url",url:e}:null}function my(t){const e=String(t||"").trim();if(!e)return null;const i=e.indexOf("?");return i>=0?e.slice(0,i):e}function Qo(t){if(!t||typeof t!="object")return null;const e=Number(t.frame);if(Number.isFinite(e)&&e>=0)return e;const n=String(t.name||t.src||t.url||t.path||"").match(/(\d{3,})/);return n?parseInt(n.pop(),10):null}function Ud(t){return!Array.isArray(t)||!t.length?null:t[t.length-1]}function n_(t,{fallback:e=0,initImage:i=null}={}){const n=Ud(t),s=Qo(n);if(Number.isFinite(s)&&s>=0)return s;const r=Qo({name:i});return Number.isFinite(r)&&r>=0?r:e}function py(t){const e=my(t&&(t.src||t.url||t.path));return e?{init_image:e,use_init:!0}:null}const Qm=32;function eu(t){if(!t||typeof t!="object")return null;const e=Number(t.frame);if(!Number.isFinite(e)||e<0)return null;const i=my(t.init_image);if(!i)return null;const n=Number(t.thumbCount);return{frame:e,init_image:i,use_init:t.use_init!==!1,thumbCount:Number.isFinite(n)&&n>=0?n:0}}function s_(t,e){const i=eu(e);if(!i)return Array.isArray(t)?[...t]:[];const n=Array.isArray(t)?t:[],s=n.length?n[n.length-1]:null;if(s&&s.frame===i.frame&&s.init_image===i.init_image)return n;const r=[...n,i];return r.length>Qm?r.slice(r.length-Qm):r}function fy(t){return Array.isArray(t)&&t.length>=2}function r_(t){if(!fy(t))return{stack:Array.isArray(t)?[...t]:[],restored:null};const e=t.slice(0,-1),i=e[e.length-1]||null;return{stack:e,restored:eu(i)}}function o_(t,e){const i=Number(e);return!Array.isArray(t)||!Number.isFinite(i)?[]:t.filter(n=>{const s=Qo(n);return Number.isFinite(s)&&s<=i})}function a_(t,e=0){const i=py(t);if(!i)return null;const n=Qo(t);return!Number.isFinite(n)||n<0?null:eu({frame:n,init_image:i.init_image,use_init:i.use_init,thumbCount:e})}function ep(t={}){const e=String(t.theme||"").trim()||"Cinematic visual journey",i=String(t.style||"").trim()||"Masterpiece, Realistic",n=Math.max(64,parseInt(t.width,10)||1024),s=Math.max(64,parseInt(t.height,10)||576),r=Math.max(1,parseInt(t.fps,10)||24),l=Math.max(8,parseInt(t.totalFrames,10)||96),o=Math.max(2,parseInt(t.numScenes,10)||4),u={theme:e,style:i,width:n,height:s,fps:r,totalFrames:l,numScenes:o};return t.model&&(u.model=String(t.model)),u}function l_(t,e){const i=Math.max(1,Math.floor(t/e));return Array.from({length:e},(n,s)=>s*i)}function u_(t){const e=l_(t.totalFrames,t.numScenes);return["Create a Deforum-ready story plan as JSON only.",`Theme: ${t.theme}`,`Style: ${t.style}`,`Canvas: ${t.width}x${t.height}`,`FPS: ${t.fps}`,`Total frames: ${t.totalFrames}`,`Scenes: ${t.numScenes}`,`Frame starts: ${e.join(", ")}`,"Return an object with keys: theme, style, summary, scenes, motion.",`The "scenes" object must contain exactly these frame keys: ${e.join(", ")}.`,"Each scene value should be a concise SD/Deforum prompt fragment with continuity across scenes.",'The "motion" object should include a few useful Deforum schedules like Zoom, Translation X, Translation Y, Rotation Z, or Transform Center X/Y when appropriate.',"Values in motion must be schedule strings such as 0:(1.0), 24:(1.02), 96:(1.0).","Do not include markdown or code fences."].join(` +`)}const d_="You are a cinematic prompt planner for Deforum animations. Respond with valid JSON only and keep prompts production-ready.";function c_(t,{model:e=""}={}){const i=u_(t);return{model:String(e||t.model||"").trim(),stream:!1,format:"json",options:{temperature:.7},prompt:i,system:d_}}function tp(t){const e=new WeakSet,i=n=>n==null||typeof n!="object"?n:e.has(n)?null:(e.add(n),Array.isArray(n)?n.map(i):Object.keys(n).sort().reduce((s,r)=>(s[r]=i(n[r]),s),{}));return JSON.stringify(i(t))}function h_(t,e,{id:i,ts:n}={}){return{id:i||`story-llm-${Date.now()}`,ts:n||new Date().toISOString(),level:"info",kind:"story_llm_request",message:"Story LLM request",clientRequest:t,ollamaRequest:e}}const Vd=64,m_=` +#define delta ( 1.0 / 60.0 ) + +void main() { + + vec2 uv = gl_FragCoord.xy / resolution.xy; + + vec4 tmpPos = texture2D( texturePosition, uv ); + vec3 pos = tmpPos.xyz; + + vec4 tmpVel = texture2D( textureVelocity, uv ); + vec3 vel = tmpVel.xyz; + float mass = tmpVel.w; + + if ( mass == 0.0 ) { + vel = vec3( 0.0 ); + } + + pos += vel * delta; + + gl_FragColor = vec4( pos, 1.0 ); + +} +`,p_=` +#include + +#define delta ( 1.0 / 60.0 ) + +uniform float gravityConstant; +uniform float density; + +const float width = resolution.x; +const float height = resolution.y; + +float radiusFromMass( float mass ) { + return pow( ( 3.0 / ( 4.0 * PI ) ) * mass / density, 1.0 / 3.0 ); +} + +void main() { + + vec2 uv = gl_FragCoord.xy / resolution.xy; + float idParticle = uv.y * resolution.x + uv.x; + + vec4 tmpPos = texture2D( texturePosition, uv ); + vec3 pos = tmpPos.xyz; + + vec4 tmpVel = texture2D( textureVelocity, uv ); + vec3 vel = tmpVel.xyz; + float mass = tmpVel.w; + + if ( mass > 0.0 ) { + + float radius = radiusFromMass( mass ); + vec3 acceleration = vec3( 0.0 ); + + for ( float y = 0.0; y < height; y++ ) { + + for ( float x = 0.0; x < width; x++ ) { + + vec2 secondParticleCoords = vec2( x + 0.5, y + 0.5 ) / resolution.xy; + vec3 pos2 = texture2D( texturePosition, secondParticleCoords ).xyz; + vec4 velTemp2 = texture2D( textureVelocity, secondParticleCoords ); + vec3 vel2 = velTemp2.xyz; + float mass2 = velTemp2.w; + + float idParticle2 = secondParticleCoords.y * resolution.x + secondParticleCoords.x; + + if ( idParticle == idParticle2 ) { + continue; + } + + if ( mass2 == 0.0 ) { + continue; + } + + vec3 dPos = pos2 - pos; + float distance = length( dPos ); + float radius2 = radiusFromMass( mass2 ); + + if ( distance == 0.0 ) { + continue; + } + + if ( distance < radius + radius2 ) { + + if ( idParticle < idParticle2 ) { + vel = ( vel * mass + vel2 * mass2 ) / ( mass + mass2 ); + mass += mass2; + radius = radiusFromMass( mass ); + } else { + mass = 0.0; + radius = 0.0; + vel = vec3( 0.0 ); + break; + } + + } + + float distanceSq = distance * distance; + float gravityField = gravityConstant * mass2 / distanceSq; + gravityField = min( gravityField, 1000.0 ); + acceleration += gravityField * normalize( dPos ); + + } + + if ( mass == 0.0 ) { + break; + } + } + + vel += delta * acceleration; + + } + + gl_FragColor = vec4( vel, mass ); + +} +`,f_=` +#include + +uniform sampler2D texturePosition; +uniform sampler2D textureVelocity; + +uniform float cameraConstant; +uniform float density; +uniform float hueTint; + +varying vec4 vColor; + +float radiusFromMass( float mass ) { + return pow( ( 3.0 / ( 4.0 * PI ) ) * mass / density, 1.0 / 3.0 ); +} + +void main() { + + vec4 posTemp = texture2D( texturePosition, uv ); + vec3 pos = posTemp.xyz; + + vec4 velTemp = texture2D( textureVelocity, uv ); + vec3 vel = velTemp.xyz; + float mass = velTemp.w; + + vColor = vec4( 1.0, mass / 250.0, hueTint * 0.45, 1.0 ); + + vec4 mvPosition = modelViewMatrix * vec4( pos, 1.0 ); + float radius = radiusFromMass( mass ); + + if ( mass == 0.0 ) { + gl_PointSize = 0.0; + } else { + gl_PointSize = radius * cameraConstant / ( - mvPosition.z ); + } + + gl_Position = projectionMatrix * mvPosition; + +} +`,g_=` +varying vec4 vColor; + +void main() { + + if ( vColor.y == 0.0 ) discard; + + float f = length( gl_PointCoord - vec2( 0.5, 0.5 ) ); + if ( f > 0.5 ) { + discard; + } + gl_FragColor = vColor; + +} +`;function fn(t,e,i){return Math.max(e,Math.min(i,t))}function $s(){return{ppGravityConstant:100,ppDensity:.45,ppRadius:300,ppHeight:8,ppExponent:.4,ppMaxMass:15,ppVelocity:70,ppVelocityExponent:.2,ppRandVelocity:.001,ppHue:.08}}function gn(t,e){const i=Number(t);return Number.isFinite(i)?i:e}function Ao(t={}){const e=$s(),i=t&&typeof t=="object"?t:{};return{ppGravityConstant:fn(gn(i.ppGravityConstant,e.ppGravityConstant),0,1e3),ppDensity:fn(gn(i.ppDensity,e.ppDensity),.001,10),ppRadius:fn(gn(i.ppRadius,e.ppRadius),10,1e3),ppHeight:fn(gn(i.ppHeight,e.ppHeight),0,50),ppExponent:fn(gn(i.ppExponent,e.ppExponent),0,2),ppMaxMass:fn(gn(i.ppMaxMass,e.ppMaxMass),1,50),ppVelocity:fn(gn(i.ppVelocity,e.ppVelocity),0,150),ppVelocityExponent:fn(gn(i.ppVelocityExponent,e.ppVelocityExponent),0,1),ppRandVelocity:fn(gn(i.ppRandVelocity,e.ppRandVelocity),0,50),ppHue:fn(gn(i.ppHue,e.ppHue),0,1)}}function ip(t){return[t.ppRadius,t.ppHeight,t.ppExponent,t.ppMaxMass,t.ppVelocity,t.ppVelocityExponent,t.ppRandVelocity].join("|")}function y_(t,e,i,n=Vd){const s=t.image.data,r=e.image.data,l=n*n,o=i.ppRadius,u=i.ppHeight,c=i.ppExponent,h=i.ppMaxMass*1024/l,d=i.ppVelocity,m=i.ppVelocityExponent,g=i.ppRandVelocity;for(let b=0,w=s.length;b1);S=Math.sqrt(S);const P=o*Math.pow(S,c),M=d*Math.pow(S,m),k=M*y+(Math.random()*2-1)*g,C=(Math.random()*2-1)*g*.05,L=-M*v+(Math.random()*2-1)*g;v*=P,y*=P;const x=(Math.random()*2-1)*u,T=Math.random()*h+1;s[b+0]=v,s[b+1]=x,s[b+2]=y,s[b+3]=1,r[b+0]=k,r[b+1]=C,r[b+2]=L,r[b+3]=T}}function np(t,e){return Math.max(1,e||1)/(Math.tan(Math.PI/180*.5*t.fov)/(t.zoom||1))}const zo=["table","sphere","helix","grid"];function dr(t,e,i){return Math.max(e,Math.min(i,t))}function lh(){return{ptLayout:"table",ptTransitionMs:2e3,ptSpacing:1,ptCardOpacity:.45,ptCardScale:1,ptAutoCycle:!1,ptAutoCycleSec:8,ptHue:.5}}function Co(t={}){const e=lh(),i=t&&typeof t=="object"?t:{};return{ptLayout:zo.includes(i.ptLayout)?i.ptLayout:e.ptLayout,ptTransitionMs:dr(Math.round(Number(i.ptTransitionMs)||e.ptTransitionMs),400,6e3),ptSpacing:dr(Number.isFinite(Number(i.ptSpacing))?Number(i.ptSpacing):e.ptSpacing,.5,1.5),ptCardOpacity:dr(Number.isFinite(Number(i.ptCardOpacity))?Number(i.ptCardOpacity):e.ptCardOpacity,.15,.85),ptCardScale:dr(Number.isFinite(Number(i.ptCardScale))?Number(i.ptCardScale):e.ptCardScale,.6,1.4),ptAutoCycle:!!i.ptAutoCycle,ptAutoCycleSec:dr(Number.isFinite(Number(i.ptAutoCycleSec))?Number(i.ptAutoCycleSec):e.ptAutoCycleSec,3,30),ptHue:dr(Number.isFinite(Number(i.ptHue))?Number(i.ptHue):e.ptHue,0,1)}}const it=(t,e)=>{const i=t.__vccOpts||t;for(const[n,s]of e)i[n]=s;return i},v_={name:"UiIcon",props:{name:{type:String,required:!0}}},b_={key:0,d:"M8 6.5V17.5L17 12L8 6.5Z",fill:"currentColor"},__={key:2,x:"6.5",y:"6.5",width:"11",height:"11",rx:"2",fill:"currentColor"},S_={key:3,cx:"12",cy:"12",r:"5",fill:"currentColor"},w_={key:8,d:"M13 2.5L6.5 13.5H11.5L10.5 21.5L17 10.5H12L13 2.5Z",fill:"currentColor",stroke:"currentColor","stroke-width":"0.5","stroke-linejoin":"round"},M_={key:10,d:"M2.5 12C4.4 12 4.4 7 6.3 7C8.2 7 8.2 17 10.1 17C12 17 12 7 13.9 7C15.8 7 15.8 17 17.7 17C19.6 17 19.6 12 21.5 12",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},x_={key:13,d:"M6 14L12 8L18 14",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},P_={key:14,d:"M6 10L12 16L18 10",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},T_={key:19,d:"M3 13C4.4 13 4.8 8 6.3 8C7.8 8 8.2 16 9.7 16C11.2 16 11.6 5 13.1 5C14.6 5 15 19 16.5 19C18 19 18.4 11 19.9 11C20.7 11 21.3 12 21 13",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"};function A_(t,e,i,n,s,r){return p(),f("svg",{class:U(["ui-icon",`ui-icon--${i.name}`]),viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true"},[i.name==="play"?(p(),f("path",b_)):i.name==="pause"?(p(),f(G,{key:1},[e[0]||(e[0]=a("rect",{x:"7",y:"6",width:"3.5",height:"12",rx:"1",fill:"currentColor"},null,-1)),e[1]||(e[1]=a("rect",{x:"13.5",y:"6",width:"3.5",height:"12",rx:"1",fill:"currentColor"},null,-1))],64)):i.name==="stop"?(p(),f("rect",__)):i.name==="record"?(p(),f("circle",S_)):i.name==="image"?(p(),f(G,{key:4},[e[2]||(e[2]=a("rect",{x:"4",y:"5",width:"16",height:"14",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[3]||(e[3]=a("circle",{cx:"9",cy:"10",r:"1.5",fill:"currentColor"},null,-1)),e[4]||(e[4]=a("path",{d:"M6 16L10 12L13 14.8L16 11L18 13.5V17H6V16Z",fill:"currentColor",opacity:"0.9"},null,-1))],64)):i.name==="broadcast"?(p(),f(G,{key:5},[e[5]||(e[5]=a("path",{d:"M5 12C8.5 12 12 15.5 12 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[6]||(e[6]=a("path",{d:"M5 7C11.2 7 17 12.8 17 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[7]||(e[7]=a("path",{d:"M5 2C14 2 22 10 22 19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[8]||(e[8]=a("circle",{cx:"5",cy:"19",r:"2",fill:"currentColor"},null,-1))],64)):i.name==="sliders"?(p(),f(G,{key:6},[e[9]||(e[9]=$i('',6))],64)):i.name==="film"?(p(),f(G,{key:7},[e[10]||(e[10]=$i('',5))],64)):i.name==="lightning"?(p(),f("path",w_)):i.name==="sparkles"?(p(),f(G,{key:9},[e[11]||(e[11]=a("path",{d:"M12 3.5L13.7 8.3L18.5 10L13.7 11.7L12 16.5L10.3 11.7L5.5 10L10.3 8.3L12 3.5Z",fill:"currentColor"},null,-1)),e[12]||(e[12]=a("path",{d:"M18.5 3L19.2 5L21.2 5.7L19.2 6.4L18.5 8.4L17.8 6.4L15.8 5.7L17.8 5L18.5 3Z",fill:"currentColor",opacity:"0.75"},null,-1)),e[13]||(e[13]=a("path",{d:"M5.2 14.6L5.8 16.2L7.4 16.8L5.8 17.4L5.2 19L4.6 17.4L3 16.8L4.6 16.2L5.2 14.6Z",fill:"currentColor",opacity:"0.75"},null,-1))],64)):i.name==="wave"?(p(),f("path",M_)):i.name==="folder"?(p(),f(G,{key:11},[e[14]||(e[14]=a("path",{d:"M3.5 7.5A2.5 2.5 0 0 1 6 5h3.2l1.6 1.8H18A2.5 2.5 0 0 1 20.5 9.3v7.2A2.5 2.5 0 0 1 18 19H6a2.5 2.5 0 0 1-2.5-2.5v-9Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[15]||(e[15]=a("path",{d:"M3.8 9h16.4",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="gear"?(p(),f(G,{key:12},[e[16]||(e[16]=a("path",{d:"M12 8.2A3.8 3.8 0 1 0 12 15.8A3.8 3.8 0 1 0 12 8.2Z",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[17]||(e[17]=a("path",{d:"M12 3.8V5.4M12 18.6V20.2M5.5 6.5L6.7 7.7M17.3 18.3L18.5 19.5M3.8 12H5.4M18.6 12H20.2M5.5 17.5L6.7 16.3M17.3 5.7L18.5 4.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="chevron-up"?(p(),f("path",x_)):i.name==="chevron-down"?(p(),f("path",P_)):i.name==="panel-bottom"?(p(),f(G,{key:15},[e[18]||(e[18]=a("rect",{x:"4",y:"5",width:"16",height:"11",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[19]||(e[19]=a("path",{d:"M8 14H16",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.55"},null,-1)),e[20]||(e[20]=a("path",{d:"M12 8.5V12.5",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1)),e[21]||(e[21]=a("path",{d:"M9.5 10.5L12 8L14.5 10.5",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="close"?(p(),f(G,{key:16},[e[22]||(e[22]=a("path",{d:"M7 7L17 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1)),e[23]||(e[23]=a("path",{d:"M17 7L7 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1))],64)):i.name==="shuffle"?(p(),f(G,{key:17},[e[24]||(e[24]=a("path",{d:"M4 7H6.5C8.5 7 9.8 7.5 11.2 9.4L12.5 11.1C13.9 13 15.2 13.5 17.2 13.5H20",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[25]||(e[25]=a("path",{d:"M4 17H6.5C8.2 17 9.4 16.6 10.6 15.1L13.4 11.5C14.6 10 15.8 9.5 17.5 9.5H20",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[26]||(e[26]=a("path",{d:"M17 6.5L20 9.5L17 12.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[27]||(e[27]=a("path",{d:"M17 10.5L20 13.5L17 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="sparkles"?(p(),f(G,{key:18},[e[28]||(e[28]=a("path",{d:"M12 3.8L13.7 8.3L18.2 10L13.7 11.7L12 16.2L10.3 11.7L5.8 10L10.3 8.3L12 3.8Z",stroke:"currentColor","stroke-width":"1.7","stroke-linejoin":"round"},null,-1)),e[29]||(e[29]=a("path",{d:"M18.5 4.5L19.2 6.3L21 7L19.2 7.7L18.5 9.5L17.8 7.7L16 7L17.8 6.3L18.5 4.5Z",fill:"currentColor"},null,-1)),e[30]||(e[30]=a("path",{d:"M6 15.5L6.8 17.5L8.8 18.3L6.8 19.1L6 21.1L5.2 19.1L3.2 18.3L5.2 17.5L6 15.5Z",fill:"currentColor"},null,-1))],64)):i.name==="wave"?(p(),f("path",T_)):i.name==="gear"?(p(),f(G,{key:20},[e[31]||(e[31]=$i('',9))],64)):i.name==="arrow-left"?(p(),f(G,{key:21},[e[32]||(e[32]=a("path",{d:"M15.5 7.5L10.5 12L15.5 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[33]||(e[33]=a("path",{d:"M11 12H19",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="arrow-right"?(p(),f(G,{key:22},[e[34]||(e[34]=a("path",{d:"M8.5 7.5L13.5 12L8.5 16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[35]||(e[35]=a("path",{d:"M13 12H5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="rotate-ccw"?(p(),f(G,{key:23},[e[36]||(e[36]=a("path",{d:"M8 7H4V3",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[37]||(e[37]=a("path",{d:"M4.5 7.5C6.1 5.1 8.8 3.5 12 3.5C17 3.5 21 7.5 21 12.5C21 17.5 17 21.5 12 21.5C7.8 21.5 4.3 18.6 3.3 14.8",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="size-small"?(p(),f(G,{key:24},[e[38]||(e[38]=a("rect",{x:"4.5",y:"6.5",width:"15",height:"11",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[39]||(e[39]=a("path",{d:"M6.5 9.2H12",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.85"},null,-1)),e[40]||(e[40]=a("path",{d:"M6.5 12H10.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.75"},null,-1))],64)):i.name==="size-medium"?(p(),f(G,{key:25},[e[41]||(e[41]=a("rect",{x:"4.5",y:"5.5",width:"15",height:"13",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[42]||(e[42]=a("path",{d:"M6.5 9H17.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.85"},null,-1)),e[43]||(e[43]=a("path",{d:"M6.5 12.5H15",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round",opacity:"0.75"},null,-1))],64)):i.name==="size-full"?(p(),f(G,{key:26},[e[44]||(e[44]=$i('',5))],64)):i.name==="help"?(p(),f(G,{key:27},[e[45]||(e[45]=a("circle",{cx:"12",cy:"12",r:"8.5",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[46]||(e[46]=a("path",{d:"M9.8 9.3C10 8.2 10.9 7.4 12.1 7.4C13.5 7.4 14.5 8.3 14.5 9.5C14.5 10.5 13.9 11.1 13.1 11.7C12.3 12.3 11.8 12.8 11.8 13.9",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[47]||(e[47]=a("circle",{cx:"12",cy:"16.8",r:"1",fill:"currentColor"},null,-1))],64)):i.name==="mic"?(p(),f(G,{key:28},[e[48]||(e[48]=a("rect",{x:"9",y:"3.8",width:"6",height:"10",rx:"3",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[49]||(e[49]=a("path",{d:"M6.8 11.5C6.8 14.2 9 16.4 11.8 16.4H12.2C15 16.4 17.2 14.2 17.2 11.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[50]||(e[50]=a("path",{d:"M12 16.4V20.2",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[51]||(e[51]=a("path",{d:"M9 20.2H15",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="history"?(p(),f(G,{key:29},[e[52]||(e[52]=a("path",{d:"M12 4.2A8 8 0 1 1 4.5 9.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[53]||(e[53]=a("path",{d:"M4.2 4.8V9.4H8.8",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[54]||(e[54]=a("path",{d:"M12 8V12.2L14.8 14",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="save"?(p(),f(G,{key:30},[e[55]||(e[55]=a("path",{d:"M6 4.5H15L18.5 8V19.5A1.5 1.5 0 0 1 17 21H7A1.5 1.5 0 0 1 5.5 19.5V6A1.5 1.5 0 0 1 6 4.5Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[56]||(e[56]=a("path",{d:"M8 4.5V9H14V4.5",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[57]||(e[57]=a("rect",{x:"8",y:"13",width:"8",height:"5",rx:"1",stroke:"currentColor","stroke-width":"1.8"},null,-1))],64)):i.name==="load"?(p(),f(G,{key:31},[e[58]||(e[58]=a("path",{d:"M12 4.5V13.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[59]||(e[59]=a("path",{d:"M8.5 10L12 13.5L15.5 10",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[60]||(e[60]=a("path",{d:"M5.5 16.5V18A1.5 1.5 0 0 0 7 19.5H17A1.5 1.5 0 0 0 18.5 18V16.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="pin"?(p(),f(G,{key:32},[e[61]||(e[61]=a("path",{d:"M12 17.5V21",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[62]||(e[62]=a("path",{d:"M8.5 3.5H15.5L14 8.5H10L8.5 3.5Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[63]||(e[63]=a("path",{d:"M10 8.5H14V12.5C14 14.4 13.1 15.8 12 17.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):i.name==="lock"?(p(),f(G,{key:33},[e[64]||(e[64]=a("rect",{x:"7",y:"10",width:"10",height:"8.5",rx:"2",stroke:"currentColor","stroke-width":"1.8"},null,-1)),e[65]||(e[65]=a("path",{d:"M9 10V8.2C9 6.4 10.3 5 12 5C13.7 5 15 6.4 15 8.2V10",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1))],64)):i.name==="eye"?(p(),f(G,{key:34},[e[66]||(e[66]=a("path",{d:"M2.5 12C4.2 8.2 7.7 5.5 12 5.5C16.3 5.5 19.8 8.2 21.5 12C19.8 15.8 16.3 18.5 12 18.5C7.7 18.5 4.2 15.8 2.5 12Z",stroke:"currentColor","stroke-width":"1.8","stroke-linejoin":"round"},null,-1)),e[67]||(e[67]=a("circle",{cx:"12",cy:"12",r:"2.8",stroke:"currentColor","stroke-width":"1.8"},null,-1))],64)):i.name==="eye-off"?(p(),f(G,{key:35},[e[68]||(e[68]=a("path",{d:"M4.5 4.5L19.5 19.5",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round"},null,-1)),e[69]||(e[69]=a("path",{d:"M8.2 8.8C7.2 9.8 6.5 10.9 6 12C7.7 15.8 11.2 18.5 15.5 18.5C16.7 18.5 17.8 18.2 18.8 17.6",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)),e[70]||(e[70]=a("path",{d:"M10.2 6.4C10.8 6.2 11.4 6.1 12 6.1C16.3 6.1 19.8 8.8 21.5 12.5C20.8 13.9 19.8 15.1 18.5 16",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},null,-1))],64)):N("",!0)],2)}const oi=it(v_,[["render",A_],["__scopeId","data-v-f0fded0e"]]),C_={name:"StatusStrip",components:{UiIcon:oi},emits:["toggle-play","stop-play","toggle-record","start-hls-watch","stop-hls-watch","generate-preview","toggle-ws","open-midi","open-gpus","select-session","new-session","purge-session","restore-session","reset-layout"],props:{playing:{type:Boolean,default:!1},recording:{type:Boolean,default:!1},hlsWatchEnabled:{type:Boolean,default:!1},hlsPreviewValid:{type:Boolean,default:!1},previewGenerating:{type:Boolean,default:!1},frameProcessingActive:{type:Boolean,default:!1},frameProcessingLabel:{type:String,default:""},frameProcessingHint:{type:String,default:""},previewDisabled:{type:Boolean,default:!1},apiHealth:{type:Object,default:()=>({})},gpuActiveCount:{type:Number,default:0},gpuTotalCount:{type:Number,default:0},midiSupported:{type:Boolean,default:!1},midiSelected:{default:null},wsStatus:{type:String,default:"disconnected"},session:{type:String,default:""},sessions:{type:Array,default:()=>[]},morphOn:{type:Boolean,default:!1}},data(){return{helpOpen:!1,healthOpen:!1,sessionOpen:!1}},computed:{canStartHlsWatch(){return this.hlsPreviewValid&&!this.hlsWatchEnabled},healthHasIssues(){const t=this.gpuTotalCount>0&&this.gpuActiveCount===0,e=this.gpuTotalCount===0,i=this.wsStatus!=="connected"&&this.wsStatus!=="offline";return!!(t||e||i)}},mounted(){typeof document<"u"&&(this._statusStripHelpClose=t=>{!this.$el||this.$el.contains(t.target)||(this.helpOpen=!1,this.healthOpen=!1,this.sessionOpen=!1)},document.addEventListener("click",this._statusStripHelpClose))},beforeUnmount(){typeof document<"u"&&this._statusStripHelpClose&&document.removeEventListener("click",this._statusStripHelpClose)},methods:{toggleHelp(){this.helpOpen=!this.helpOpen,this.healthOpen=!1,this.sessionOpen=!1},toggleHealth(){this.healthOpen=!this.healthOpen,this.helpOpen=!1,this.sessionOpen=!1},toggleSession(){this.sessionOpen=!this.sessionOpen,this.helpOpen=!1,this.healthOpen=!1}}},E_={class:"status-strip"},k_={class:"header-transport ss-transport","data-testid":"header-transport"},R_=["disabled","title","aria-label"],L_=["disabled"],D_=["disabled","title","aria-label"],I_=["disabled"],F_=["disabled"],N_=["disabled"],O_={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button header-transport__preview-loading"},U_=["title"],V_={class:"lazy-loading-indicator lazy-loading-indicator--inline"},B_={class:"header-frame-processing__label"},z_={key:1,class:"ss-pill ss-pill--morph",title:"Prompt morph is enabled — use the LIVE stage morph HUD","data-testid":"status-morph-indicator"},$_={class:"ss-health"},G_={key:0},H_={key:1},W_={class:"ss-health-popover__header"},q_={class:"ss-health-grid"},j_=["title"],X_={class:"ss-session"},K_=["aria-expanded"],Y_={class:"ss-help-popover__header"},J_={key:0,class:"ss-session-empty"},Z_={key:1,class:"ss-session-list"},Q_=["onClick"],eS={class:"ss-session-name"},tS={class:"ss-session-meta"},iS={class:"ss-session-actions"},nS=["onClick"],sS=["onClick"],rS={class:"ss-help"},oS={class:"ss-help-popover__header"};function aS(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("div",E_,[a("div",k_,[a("button",{type:"button",class:U(["header-transport__btn",i.playing?"header-transport__btn--pause header-transport__btn--active":"header-transport__btn--play"]),disabled:i.previewGenerating,title:i.playing?"Pause Deforum animation":"Play Deforum animation","aria-label":i.playing?"Pause animation":"Play animation","data-testid":"header-play",onClick:e[0]||(e[0]=o=>t.$emit("toggle-play"))},[ve(l,{class:"header-transport__icon",name:i.playing?"pause":"play"},null,8,["name"])],10,R_),a("button",{type:"button",class:"header-transport__btn header-transport__btn--stop",disabled:!i.playing||i.previewGenerating,title:"Stop animation","aria-label":"Stop animation","data-testid":"header-stop",onClick:e[1]||(e[1]=o=>t.$emit("stop-play"))},[ve(l,{class:"header-transport__icon",name:"stop"})],8,L_),a("button",{type:"button",class:U(["header-transport__btn header-transport__btn--record",{"header-transport__btn--active":i.recording}]),disabled:i.playing||i.previewGenerating,title:i.recording?"Stop recording":"Start recording","aria-label":i.recording?"Stop recording":"Start recording","data-testid":"header-record",onClick:e[2]||(e[2]=o=>t.$emit("toggle-record"))},[ve(l,{class:"header-transport__icon",name:i.recording?"stop":"record"},null,8,["name"])],10,D_),a("button",{type:"button",class:U(["header-transport__btn header-transport__btn--stream",{"header-transport__btn--active":i.hlsWatchEnabled}]),disabled:!r.canStartHlsWatch,title:"Show HLS feed on main stage (Stream tab)","aria-label":"Start HLS on main stage","data-testid":"header-stream-start",onClick:e[3]||(e[3]=o=>t.$emit("start-hls-watch"))},[ve(l,{class:"header-transport__icon",name:"broadcast"}),e[20]||(e[20]=a("span",{class:"header-transport__preview-label"},"Stream",-1))],10,I_),a("button",{type:"button",class:"header-transport__btn header-transport__btn--stream-stop",disabled:!i.hlsWatchEnabled,title:"Stop HLS on main stage","aria-label":"Stop HLS on main stage","data-testid":"header-stream-stop",onClick:e[4]||(e[4]=o=>t.$emit("stop-hls-watch"))},[ve(l,{class:"header-transport__icon",name:"stop"})],8,F_),e[26]||(e[26]=a("span",{class:"header-transport__divider","aria-hidden":"true"},null,-1)),a("button",{type:"button",class:U(["header-transport__btn header-transport__btn--preview",{"header-transport__btn--active":i.previewGenerating}]),disabled:i.previewGenerating||i.previewDisabled,title:"Generate preview frame from current settings","aria-label":"Generate preview frame","data-testid":"header-preview-frame",onClick:e[5]||(e[5]=o=>t.$emit("generate-preview"))},[i.previewGenerating?(p(),f("span",O_,[...e[21]||(e[21]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",{class:"header-transport__preview-label"},"Frame",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ve(l,{class:"header-transport__icon",name:"image"}),e[22]||(e[22]=a("span",{class:"header-transport__preview-label"},"Frame",-1))],64))],10,N_),i.frameProcessingActive?(p(),f("div",{key:0,class:"header-frame-processing","data-testid":"header-frame-processing","aria-live":"polite",title:i.frameProcessingHint},[a("span",V_,[e[23]||(e[23]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",B_,_(i.frameProcessingLabel),1),e[24]||(e[24]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))])],8,U_)):N("",!0),i.morphOn?(p(),f("span",z_,[...e[25]||(e[25]=[a("span",{class:"ss-key"},"Morph",-1),a("strong",null,"on",-1)])])):N("",!0)]),a("div",$_,[a("button",{type:"button",class:U(["ss-pill ss-pill--button ss-pill--health",{"ss-pill--live":!r.healthHasIssues,"ss-pill--warn":r.healthHasIssues}]),title:"Health status","data-testid":"health-dropdown",onClick:e[6]||(e[6]=ft((...o)=>r.toggleHealth&&r.toggleHealth(...o),["stop"]))},[e[27]||(e[27]=a("span",{class:"ss-dot"},null,-1)),e[28]||(e[28]=a("span",{class:"ss-key"},"Health",-1)),r.healthHasIssues?(p(),f("strong",G_,"!")):(p(),f("strong",H_,"ok"))],2),s.healthOpen?(p(),f("div",{key:0,class:"ss-health-popover",onClick:e[11]||(e[11]=ft(()=>{},["stop"]))},[a("div",W_,[e[29]||(e[29]=a("div",{class:"ss-health-popover__title"},"Health",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[7]||(e[7]=o=>s.healthOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),a("div",q_,[a("button",{type:"button",class:U(["ss-pill ss-pill--button",{"ss-pill--live":i.gpuActiveCount>0,"ss-pill--error":i.gpuTotalCount>0&&i.gpuActiveCount===0,"ss-pill--warn":i.gpuTotalCount===0}]),title:"Open GPU pool settings",onClick:e[8]||(e[8]=o=>{t.$emit("open-gpus"),s.healthOpen=!1})},[e[30]||(e[30]=a("span",{class:"ss-dot"},null,-1)),e[31]||(e[31]=a("span",{class:"ss-key"},"GPU",-1)),a("strong",null,_(i.gpuActiveCount)+"("+_(i.gpuTotalCount)+")",1)],2),i.midiSupported?(p(),f("button",{key:0,type:"button",class:U(["ss-pill ss-pill--button",{"ss-pill--live":i.midiSelected}]),title:"Open MIDI settings",onClick:e[9]||(e[9]=o=>{t.$emit("open-midi"),s.healthOpen=!1})},[e[32]||(e[32]=a("span",{class:"ss-dot"},null,-1)),e[33]||(e[33]=a("span",{class:"ss-key"},"MIDI",-1)),a("strong",null,_(i.midiSelected?"on":"off"),1)],2)):N("",!0),a("button",{type:"button",class:U(["ss-pill ss-pill--button",{"ss-pill--live":i.wsStatus==="connected","ss-pill--warn":i.wsStatus!=="connected"&&i.wsStatus!=="offline"}]),title:i.wsStatus==="connected"?"Go offline and disable collaboration":"Reconnect collaboration",onClick:e[10]||(e[10]=o=>{t.$emit("toggle-ws"),s.healthOpen=!1})},[e[34]||(e[34]=a("span",{class:"ss-dot"},null,-1)),e[35]||(e[35]=a("span",{class:"ss-key"},"WS",-1)),a("strong",null,_(i.wsStatus),1)],10,j_)])])):N("",!0)]),a("div",X_,[a("button",{type:"button",class:"ss-pill ss-pill--button",title:"Session manager","aria-expanded":s.sessionOpen?"true":"false","data-testid":"session-dropdown",onClick:e[12]||(e[12]=ft((...o)=>r.toggleSession&&r.toggleSession(...o),["stop"]))},[e[36]||(e[36]=a("span",{class:"ss-key"},"Session",-1)),a("strong",null,_(i.session),1),ve(l,{class:"ss-icon",name:s.sessionOpen?"chevron-up":"chevron-down"},null,8,["name"])],8,K_),a("button",{type:"button",class:"ss-btn ss-btn--ghost",title:"Reset UI layout to defaults","aria-label":"Reset UI layout","data-testid":"session-reset-layout",onClick:e[13]||(e[13]=ft(o=>t.$emit("reset-layout"),["stop"]))}," Reset "),a("button",{type:"button",class:"ss-btn ss-btn--ghost ss-session__new",title:"New session","aria-label":"New session","data-testid":"session-new",onClick:e[14]||(e[14]=ft(o=>t.$emit("new-session"),["stop"]))}," + "),s.sessionOpen?(p(),f("div",{key:0,class:"ss-session-popover",onClick:e[16]||(e[16]=ft(()=>{},["stop"]))},[a("div",Y_,[e[37]||(e[37]=a("div",{class:"ss-help-popover__title"},"Sessions",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[15]||(e[15]=o=>s.sessionOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),i.sessions.length?(p(),f("div",Z_,[(p(!0),f(G,null,re(i.sessions,o=>(p(),f("div",{key:o.name,class:U(["ss-session-row",{"ss-session-row--active":o.name===i.session}])},[a("button",{type:"button",class:"ss-session-pick",onClick:u=>{t.$emit("select-session",o.name),s.sessionOpen=!1}},[a("span",eS,_(o.name),1),a("span",tS,_(o.images)+" img · "+_(o.videos)+" vid",1)],8,Q_),a("div",iS,[a("button",{type:"button",class:"ss-btn ss-btn--ghost",onClick:u=>{t.$emit("restore-session",o.name),s.sessionOpen=!1}},"Restore",8,nS),a("button",{type:"button",class:"ss-btn ss-btn--ghost",onClick:u=>t.$emit("purge-session",o.name)},"Purge",8,sS)])],2))),128))])):(p(),f("div",J_,"No saved sessions yet."))])):N("",!0)]),a("div",rS,[a("button",{type:"button",class:U(["ss-btn ss-btn--ghost",{"ss-btn--active":s.helpOpen}]),title:"Keyboard shortcuts help",onClick:e[17]||(e[17]=ft((...o)=>r.toggleHelp&&r.toggleHelp(...o),["stop"]))},[ve(l,{class:"ss-icon",name:"help"}),e[38]||(e[38]=a("span",{class:"ss-label"},"Help",-1))],2),s.helpOpen?(p(),f("div",{key:0,class:"ss-help-popover",onClick:e[19]||(e[19]=ft(()=>{},["stop"]))},[a("div",oS,[e[39]||(e[39]=a("div",{class:"ss-help-popover__title"},"Keyboard Shortcuts",-1)),a("button",{type:"button",class:"ss-help-popover__close",onClick:e[18]||(e[18]=o=>s.helpOpen=!1)},[ve(l,{class:"ss-icon",name:"close"})])]),e[40]||(e[40]=$i('
Navigation
Switch main tabs
Switch sub-tabs (when available)
16 Jump to tab (LIVE … SETTINGS)
P Controls drawer · E Engine drawer
Esc Close overlays (library → engine → controls → sequencer)
LIVE
Space Generate preview frame
R Reset vibe & camera params
Live params + morph HUD on stage; schedules in E → Deforum
PROMPTS · MODULATION · AUDIO
M Toggle prompt morph (PROMPTS)
L Toggle LFO master (MODULATION)
B Beat macros (MODULATION → Beat)
Reference audio: MODULATION → Audio or AUDIO tab upload
Bindings
F FOV (not E — reserved for Engine drawer)
WASDQ Motion / camera nudges
',1))])):N("",!0)])])}const lS=it(C_,[["render",aS],["__scopeId","data-v-4e565d39"]]),uS={name:"GlassPanel",props:{size:{type:String,default:"md"},variant:{type:String,default:"solid"}}},dS={key:0,class:"glass-panel-header"},cS={class:"glass-panel-body"};function hS(t,e,i,n,s,r){return p(),f("div",{class:U(["glass-panel",[`glass-panel--${i.size}`,i.variant!=="solid"?`glass-panel--${i.variant}`:null]])},[t.$slots.header?(p(),f("div",dS,[No(t.$slots,"header",{},void 0,!0)])):N("",!0),a("div",cS,[No(t.$slots,"default",{},void 0,!0)])],2)}const nr=it(uS,[["render",hS],["__scopeId","data-v-2ca4403b"]]),mS={name:"LiveParamRow",components:{UiIcon:oi},props:{label:{type:String,required:!0},paramKey:{type:String,required:!0},value:{type:Number,default:0},min:{type:Number,default:0},max:{type:Number,default:1},source:{type:String,default:""},modulated:{type:Boolean,default:!1}},computed:{fillPct(){const t=this.max-this.min;return t===0?0:Math.max(0,Math.min(100,(this.value-this.min)/t*100))},formattedValue(){const t=this.value;return Number.isNaN(t)?"—":Math.abs(t)>=10?t.toFixed(1):t.toFixed(2)}}},pS={class:"lpr-main"},fS={class:"lpr-name"},gS={key:0,class:"lpr-source"},yS={class:"lpr-source-text"},vS={class:"lpr-value"},bS={class:"lpr-bar-wrap"};function _S(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("div",{class:U(["lpr",{"lpr--modulated":i.modulated}])},[a("div",pS,[a("span",fS,_(i.label),1),i.source&&i.modulated?(p(),f("span",gS,[ve(l,{class:"lpr-source-icon",name:"arrow-left"}),a("span",yS,_(i.source),1)])):N("",!0)]),a("code",vS,_(r.formattedValue),1),a("div",bS,[a("div",{class:"lpr-bar",style:Pt({width:r.fillPct+"%"})},null,4)])],2)}const SS=it(mS,[["render",_S],["__scopeId","data-v-a2b7413a"]]),wS={name:"TrackLane",emits:["seek","select-track","update-keyframe"],props:{track:{type:Object,required:!0},label:{type:String,required:!0},duration:{type:Number,default:8},playhead:{type:Number,default:0},selected:{type:Boolean,default:!1},valueMin:{type:Number,default:-1},valueMax:{type:Number,default:1}},data(){return{dragKeyframe:null,hoveredKeyframe:null,detachDragHandlers:null}},computed:{sortedKeyframes(){return[...this.track.keyframes||[]].sort((t,e)=>t.t-e.t)},playheadPct(){const t=Math.max(.01,Number(this.duration)||.01);return`${Math.min(t,Math.max(0,Number(this.playhead)||0))/t*100}%`},points(){return this.sortedKeyframes.length?this.sortedKeyframes.map(t=>`${this.timePct(t.t)},${this.valuePct(t.v)}`).join(" "):""}},beforeUnmount(){this.stopDragging()},methods:{clamp(t,e,i){return Math.min(i,Math.max(e,t))},timePct(t){const e=Math.max(.01,Number(this.duration)||.01);return(this.clamp(Number(t)||0,0,e)/e*100).toFixed(3)},valuePct(t){const e=Number(this.valueMin),i=Number(this.valueMax);return!Number.isFinite(e)||!Number.isFinite(i)||i<=e?50:(100-(this.clamp(Number(t)||0,e,i)-e)/(i-e)*100).toFixed(3)},keyframeStyle(t){return{left:`${this.timePct(t.t)}%`,top:`${this.valuePct(t.v)}%`}},pointerToTrackValues(t){const e=this.$refs.graph;if(!e)return{t:0,v:0};const i=e.getBoundingClientRect(),n=this.clamp(t.clientX-i.left,0,i.width),s=this.clamp(t.clientY-i.top,0,i.height),r=Math.max(.01,Number(this.duration)||.01),l=n/i.width*r,o=Number(this.valueMin),u=Number(this.valueMax),c=u<=o?0:u-s/i.height*(u-o);return{t:this.clamp(l,0,r),v:this.clamp(c,o,u)}},onGraphPointerDown(t){this.$emit("select-track",this.track.id);const{t:e}=this.pointerToTrackValues(t);this.$emit("seek",e)},onKeyframePointerDown(t,e){this.dragKeyframe=e,this.hoveredKeyframe=e,this.$emit("select-track",this.track.id);const i=s=>{if(!this.dragKeyframe)return;const{t:r,v:l}=this.pointerToTrackValues(s);this.$emit("update-keyframe",{trackId:this.track.id,keyframe:this.dragKeyframe,t:r,v:l}),this.$emit("seek",r)},n=()=>{this.stopDragging()};window.addEventListener("pointermove",i),window.addEventListener("pointerup",n,{once:!0}),this.detachDragHandlers=()=>{window.removeEventListener("pointermove",i),window.removeEventListener("pointerup",n)}},stopDragging(){typeof this.detachDragHandlers=="function"&&this.detachDragHandlers(),this.detachDragHandlers=null,this.dragKeyframe=null},clearHovered(t){this.hoveredKeyframe===t&&(this.hoveredKeyframe=null)},formatValue(t){const e=Number(t);return Number.isFinite(e)?Math.abs(e)>=100?e.toFixed(0):Math.abs(e)>=10?e.toFixed(1):e.toFixed(2):"0"}}},MS={class:"track-lane__name"},xS={class:"track-lane__meta"},PS={class:"track-lane__path",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-hidden":"true"},TS=["points"],AS=["onPointerdown","onMouseenter","onMouseleave"],CS={key:0,class:"track-lane__tooltip"};function ES(t,e,i,n,s,r){return p(),f("div",{class:U(["track-lane",{"track-lane--selected":i.selected}])},[a("button",{type:"button",class:"track-lane__label",onClick:e[0]||(e[0]=l=>t.$emit("select-track",i.track.id))},[a("span",MS,_(i.label),1),a("span",xS,_(r.sortedKeyframes.length)+" keyframes",1)]),a("div",{ref:"graph",class:"track-lane__graph",onPointerdown:e[1]||(e[1]=(...l)=>r.onGraphPointerDown&&r.onGraphPointerDown(...l))},[(p(),f("svg",PS,[r.points?(p(),f("polyline",{key:0,points:r.points},null,8,TS)):N("",!0)])),a("div",{class:"track-lane__playhead",style:Pt({left:r.playheadPct})},null,4),(p(!0),f(G,null,re(r.sortedKeyframes,(l,o)=>(p(),f("button",{key:i.track.id+"-"+o+"-"+(l.t||0),type:"button",class:"track-lane__keyframe",style:Pt(r.keyframeStyle(l)),onPointerdown:ft(u=>r.onKeyframePointerDown(u,l),["stop"]),onMouseenter:u=>s.hoveredKeyframe=l,onMouseleave:u=>r.clearHovered(l)},[s.hoveredKeyframe===l?(p(),f("span",CS,_(r.formatValue(l.v)),1)):N("",!0)],44,AS))),128))],544)],2)}const kS=it(wS,[["render",ES],["__scopeId","data-v-64013507"]]),RS={name:"Timeline",components:{TrackLane:kS},emits:["jump-marker","jump-clip","seek","select-track","toggle-compact","update-keyframe"],props:{duration:{type:Number,default:8},playhead:{type:Number,default:0},markers:{type:Array,default:()=>[]},clips:{type:Array,default:()=>[]},selectedClipId:{type:String,default:""},tracks:{type:Array,default:()=>[]},selectedTrackId:{type:String,default:""},paramMeta:{type:Object,default:()=>({})},frames:{type:Array,default:()=>[]},fps:{type:Number,default:24},jobFrameNumber:{type:Number,default:1},jobTotalFrames:{type:Number,default:1},jobFrameLive:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},expandable:{type:Boolean,default:!1}},computed:{playheadPct(){const t=Math.max(.01,Number(this.duration)||.01);return`${Math.min(t,Math.max(0,Number(this.playhead)||0))/t*100}%`},sortedMarkers(){return[...this.markers].sort((t,e)=>t.t-e.t)},clipLanes(){const t=[{type:"prompt",label:"Prompts"},{type:"lora",label:"LoRAs"},{type:"controlnet",label:"ControlNet"}],e=Math.max(.01,Number(this.duration)||.01);return t.map(i=>({...i,clips:(this.clips||[]).filter(n=>n&&n.type===i.type).map(n=>({...n,title:`${n.label||i.label} @ ${this.formatTime(n.t)}${n.endT!=null?` – ${this.formatTime(n.endT)}`:""}`,left:`${Math.max(0,Number(n.t)||0)/e*100}%`,width:this.clipWidthPct(n,e)}))}))},showContentLanes(){return!this.compact},frameItems(){if(!Array.isArray(this.frames)||!this.frames.length)return[];const t=Math.max(.01,Number(this.duration)||.01),e=Math.max(1,Number(this.fps)||24),i=this.frames.map((r,l)=>({frame:r,index:l,num:Number(r&&r.frame)})).filter(r=>Number.isFinite(r.num)),n=i.length?Math.min(...i.map(r=>r.num)):null;return(this.frames.length>16?this.frames.slice(-16):this.frames).map((r,l,o)=>{const u=Number(r&&r.frame),c=Number.isFinite(u)?u:null,h=c!=null&&n!=null?Math.max(0,(c-n)/e):o.length<=1?0:t*l/(o.length-1),d=Math.max(0,Math.min(100,h/t*100));return{key:`${r&&r.name?r.name:"frame"}-${l}`,src:r&&(r.src||r.url||r.path||""),label:this.frameLabel(r,l),time:h,left:`${d}%`}})}},methods:{formatTime(t){return Math.max(0,Number(t)||0).toFixed(2)+"s"},markerLeft(t){const e=Math.max(.01,Number(this.duration)||.01);return`${Math.min(e,Math.max(0,Number(t.t)||0))/e*100}%`},clipWidthPct(t,e){const i=Math.max(0,Number(t.t)||0),n=t.endT!=null?Math.min(e,Number(t.endT)):Math.min(e,i+.35);return`${Math.max(.08,n-i)/e*100}%`},clipStyle(t){return{left:t.left,width:t.width}},metaFor(t){return this.paramMeta[t]||{label:t,min:-1,max:1}},frameLabel(t,e){const i=Number(t&&t.frame);return Number.isFinite(i)?`F${i}`:(t&&t.name?String(t.name).replace(/\.[^.]+$/,""):"")||`Frame ${e+1}`},onRulerPointerDown(t){const e=this.$refs.ruler;if(!e)return;const i=r=>{const l=e.getBoundingClientRect(),o=Math.min(l.width,Math.max(0,r.clientX-l.left)),u=Math.max(.01,Number(this.duration)||.01);this.$emit("seek",o/l.width*u)};i(t);const n=r=>i(r),s=()=>{window.removeEventListener("pointermove",n)};window.addEventListener("pointermove",n),window.addEventListener("pointerup",s,{once:!0})}}},LS={class:"timeline-hero__header"},DS={class:"timeline-hero__title-block"},IS={class:"timeline-hero__time"},FS={class:"timeline-hero__header-actions"},NS={class:"timeline-hero__summary"},OS={class:"timeline-hero__body"},US=["title","onClick"],VS=["src","alt"],BS={key:1,class:"timeline-hero__frame-placeholder"},zS={class:"timeline-hero__frame-label"},$S={key:0,class:"timeline-hero__filmstrip-empty"},GS={key:0,class:"timeline-hero__content-lanes"},HS={class:"timeline-hero__content-lane-label"},WS={class:"timeline-hero__content-lane-track"},qS=["title","onClick"],jS={class:"timeline-hero__clip-label"},XS={key:0,class:"timeline-hero__content-lane-empty"},KS=["onClick"],YS={key:1,class:"timeline-hero__lanes"},JS={key:0,class:"timeline-hero__compact-note"},ZS={key:1,class:"timeline-hero__empty"};function QS(t,e,i,n,s,r){const l=Ie("TrackLane");return p(),f("div",{class:U(["timeline-hero",{"timeline-hero--compact":i.compact}])},[a("div",LS,[a("div",DS,[e[5]||(e[5]=a("span",{class:"timeline-hero__eyebrow"},"Timeline",-1)),a("code",IS,_(r.formatTime(i.playhead))+" / "+_(r.formatTime(i.duration)),1),a("code",{class:U(["timeline-hero__frame",{"timeline-hero__frame--live":i.jobFrameLive}]),"data-testid":"timeline-job-frame-counter"}," Frame "+_(i.jobFrameNumber)+" / "+_(i.jobTotalFrames),3)]),a("div",FS,[a("div",NS,[ie(_(i.tracks.length)+" tracks · "+_(i.markers.length)+" markers ",1),i.clips.length?(p(),f(G,{key:0},[ie(" · "+_(i.clips.length)+" clips",1)],64)):N("",!0)]),i.expandable?(p(),f("button",{key:0,type:"button",class:"timeline-hero__toggle",onClick:e[0]||(e[0]=o=>t.$emit("toggle-compact"))},_(i.compact?"Expand lanes":"Compact"),1)):N("",!0)])]),a("div",OS,[a("div",{class:"timeline-hero__shared-playhead",style:Pt({left:r.playheadPct}),"aria-hidden":"true"},null,4),a("div",{class:U(["timeline-hero__filmstrip",{"timeline-hero__filmstrip--empty":!r.frameItems.length}])},[(p(!0),f(G,null,re(r.frameItems,o=>(p(),f("button",{key:o.key,type:"button",class:"timeline-hero__frame",style:Pt({left:o.left}),title:`${o.label} @ ${r.formatTime(o.time)}`,onClick:u=>t.$emit("seek",o.time)},[o.src?(p(),f("img",{key:0,class:"timeline-hero__frame-image",src:o.src,alt:o.label},null,8,VS)):(p(),f("div",BS,_(o.label),1)),a("span",zS,_(o.label),1)],12,US))),128)),r.frameItems.length?N("",!0):(p(),f("div",$S," Frame filmstrip appears here as previews arrive. "))],2),r.showContentLanes?(p(),f("div",GS,[(p(!0),f(G,null,re(r.clipLanes,o=>(p(),f("div",{key:"clip-lane-"+o.type,class:"timeline-hero__content-lane"},[a("div",HS,_(o.label),1),a("div",WS,[(p(!0),f(G,null,re(o.clips,u=>(p(),f("button",{key:u.id,type:"button",class:U(["timeline-hero__clip",["timeline-hero__clip--"+u.type,{"timeline-hero__clip--selected":u.id===i.selectedClipId}]]),style:Pt(r.clipStyle(u)),title:u.title,onClick:ft(c=>t.$emit("jump-clip",u),["stop"])},[a("span",jS,_(u.label),1)],14,qS))),128)),o.clips.length?N("",!0):(p(),f("div",XS,"Add clips from the sequencer panel"))])]))),128))])):N("",!0),a("div",{class:"timeline-hero__ruler",ref:"ruler",onPointerdown:e[1]||(e[1]=(...o)=>r.onRulerPointerDown&&r.onRulerPointerDown(...o))},[a("div",{class:"timeline-hero__playhead",style:Pt({left:r.playheadPct})},[...e[6]||(e[6]=[a("div",{class:"timeline-hero__playhead-handle"},null,-1)])],4),(p(!0),f(G,null,re(r.sortedMarkers,o=>(p(),f("div",{key:o.name+"-"+o.t,class:"timeline-hero__marker",style:Pt({left:r.markerLeft(o)})},[a("button",{type:"button",class:"timeline-hero__marker-label",onClick:ft(u=>t.$emit("jump-marker",o),["stop"])},_(o.name),9,KS)],4))),128))],544),i.tracks.length&&!i.compact?(p(),f("div",YS,[(p(!0),f(G,null,re(i.tracks,o=>(p(),ht(l,{key:o.id,track:o,label:r.metaFor(o.param).label,duration:i.duration,playhead:i.playhead,selected:o.id===i.selectedTrackId,"value-min":r.metaFor(o.param).min,"value-max":r.metaFor(o.param).max,onSeek:e[2]||(e[2]=u=>t.$emit("seek",u)),onSelectTrack:e[3]||(e[3]=u=>t.$emit("select-track",u)),onUpdateKeyframe:e[4]||(e[4]=u=>t.$emit("update-keyframe",u))},null,8,["track","label","duration","playhead","selected","value-min","value-max"]))),128))])):N("",!0)]),i.tracks.length&&i.compact?(p(),f("div",JS," Compact mode keeps the filmstrip and shared playhead visible while preserving preview space. ")):N("",!0),i.tracks.length?N("",!0):(p(),f("div",ZS,"No tracks yet. Add a track to begin."))],2)}const ew=it(RS,[["render",QS],["__scopeId","data-v-728f6ade"]]);function Ds(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function Tt(t){return new Proxy({},{get(e,i){if(i==="app"&&Ds(t,"app"))return t.app;if(Ds(t,i)&&i!=="app")return t[i];if(t.app==null)return;const n=Reflect.get(t.app,i);return typeof n=="function"?n.bind(t.app):n},set(e,i,n){return Ds(t,i)&&i!=="app"?!1:(Reflect.set(t.app,i,n),!0)},has(e,i){return i==="app"&&Ds(t,"app")?!0:Ds(t,i)&&i!=="app"||t.app!=null&&Reflect.has(t.app,i)},getOwnPropertyDescriptor(e,i){if(i==="app"&&Ds(t,"app"))return{configurable:!0,enumerable:!0,value:t.app,writable:!1};if(Ds(t,i)&&i!=="app")return{configurable:!0,enumerable:!0,value:t[i],writable:!1};if(t.app!=null)return{configurable:!0,enumerable:!0,value:Reflect.get(t.app,i),writable:!0}}})}const tw={name:"SequencerControlsPanel",components:{UiIcon:oi,Timeline:ew},props:{app:{type:Object,required:!0},showTimeline:{type:Boolean,default:!0},summaryOnly:{type:Boolean,default:!1},stage:{type:Boolean,default:!1},sideDrawer:{type:Boolean,default:!1}},setup(t){return Tt(t)}},iw={key:0,class:"stage-sequencer-bar"},nw={class:"stage-sequencer-bar__left"},sw=["title"],rw={class:"stage-sequencer-bar__frame-total"},ow={class:"stage-sequencer-bar__scrub"},aw=["max"],lw={class:"stage-sequencer-bar__right"},uw={key:0,class:"stage-sequencer-bar__status stage-sequencer-bar__status--clip"},dw={key:1,class:"stage-sequencer-bar__status"},cw={class:"stage-sequencer-bar__meta"},hw={class:"stage-sequencer-bar__meta"},mw={class:"stage-sequencer-bar__loop",title:"Loop timeline"},pw={class:"generate-sequencer__frame-hero-value"},fw={class:"generate-sequencer__frame-hero-current"},gw={class:"generate-sequencer__frame-hero-total"},yw={class:"generate-sequencer__frame-hero-meta"},vw={class:"generate-sequencer__frame-hero-bar"},bw={key:2,class:"modulation-lfo-grid generate-sequencer__control-grid"},_w={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},Sw={class:"modulation-lfo-card__header"},ww={class:"modulation-lfo-card__title"},Mw={class:"modulation-lfo-card__meta"},xw={key:0,class:"modulation-lfo-card__footer"},Pw={class:"modulation-route-pill"},Tw={key:1,class:"modulation-lfo-card__controls"},Aw={class:"modulation-lfo-card__control"},Cw={class:"modulation-lfo-card__control"},Ew={class:"modulation-lfo-card__control modulation-lfo-card__control--wide modulation-lfo-card__control--switch"},kw={class:"modulation-lfo-card__header"},Rw={key:0,class:"modulation-lfo-card__switch"},Lw={key:1,class:"modulation-lfo-card__title"},Dw={class:"modulation-lfo-card__meta"},Iw={key:0,class:"modulation-lfo-card__footer"},Fw={key:1,class:"modulation-lfo-card__controls"},Nw={class:"modulation-lfo-card__control"},Ow={class:"modulation-lfo-card__control"},Uw={class:"modulation-lfo-card__control"},Vw={class:"modulation-lfo-card__control"},Bw={class:"modulation-lfo-card__meta"},zw={key:2,class:"modulation-lfo-card__footer"},$w={class:"modulation-lfo-card__header"},Gw={class:"modulation-lfo-card__title"},Hw={class:"modulation-lfo-card__meta"},Ww={key:0,class:"modulation-lfo-card__footer"},qw={class:"modulation-route-pill"},jw={key:1,class:"modulation-lfo-card__footer"},Xw={class:"modulation-lfo-card__header"},Kw={class:"modulation-lfo-card__title"},Yw={class:"modulation-lfo-card__meta"},Jw={key:0,class:"modulation-lfo-card__footer"},Zw={class:"modulation-lfo-card__control"},Qw=["value","max"],eM={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},tM=["max"],iM={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},nM=["max","value"],sM={class:"modulation-lfo-card__footer"},rM={class:"modulation-lfo-grid generate-sequencer__control-grid generate-sequencer__control-grid--edit"},oM={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active generate-sequencer__control-span"},aM={class:"modulation-lfo-card__header"},lM={class:"modulation-lfo-card__meta"},uM={class:"modulation-lfo-card__controls"},dM={class:"modulation-lfo-card__control"},cM={class:"modulation-lfo-card__footer"},hM={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},mM={class:"modulation-lfo-card__header"},pM={class:"modulation-lfo-card__meta"},fM={class:"modulation-lfo-card__controls"},gM={class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},yM=["value"],vM={class:"modulation-lfo-card__control"},bM={class:"modulation-lfo-card__footer"},_M={class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},SM={class:"modulation-lfo-card__header"},wM={class:"modulation-lfo-card__meta"},MM={class:"modulation-lfo-card__footer"},xM=["value"],PM={key:0,class:"generate-sequencer__details"},TM={key:0,class:"modulation-lfo-grid generate-sequencer__track-list"},AM=["onClick"],CM={class:"modulation-lfo-card__header"},EM={class:"modulation-lfo-card__title"},kM={class:"modulation-lfo-card__meta"},RM={class:"modulation-lfo-card__controls"},LM={class:"modulation-lfo-card__control"},DM=["onUpdate:modelValue","max"],IM={class:"modulation-lfo-card__control"},FM=["value","max","onChange"],NM={class:"modulation-lfo-card__footer"},OM={class:"modulation-route-pill"},UM=["onClick"],VM=["onClick"],BM=["onClick"],zM={key:1,class:"modulation-lfo-grid generate-sequencer__track-list"},$M=["onClick"],GM={class:"modulation-lfo-card__header"},HM={class:"modulation-lfo-card__title"},WM={class:"modulation-lfo-card__meta"},qM={key:0,class:"generate-sequencer__keyframe-list"},jM={class:"modulation-lfo-card__meta"},XM=["value","onChange"],KM=["onClick"],YM={key:1,class:"modulation-lfo-card__footer"},JM={class:"modulation-lfo-card__footer"},ZM=["onClick"],QM={key:2,class:"modulation-lfo-grid generate-sequencer__markers"},ex={class:"modulation-lfo-card__header"},tx=["onClick"],ix={class:"modulation-lfo-card__meta"},nx={class:"modulation-lfo-card__controls"},sx={class:"modulation-lfo-card__control"},rx=["value","onChange"],ox={key:0,class:"modulation-lfo-card__control modulation-lfo-card__control--wide"},ax=["value","placeholder","onChange","title"],lx={key:1,class:"modulation-lfo-card__control modulation-lfo-card__control--wide generate-marker-row__hint"},ux={class:"modulation-lfo-card__footer"},dx=["onClick"],cx={key:3,class:"generate-sequencer__empty-markers"},hx={key:4,class:"generate-sequencer__status-text"},mx={key:1,class:"generate-sequencer__dock-note"};function px(t,e,i,n,s,r){var u;const l=Ie("UiIcon"),o=Ie("Timeline");return p(),f("div",{class:U(["sequencer-controls-panel",{"sequencer-controls-panel--stage":i.stage,"sequencer-controls-panel--side-drawer":i.sideDrawer}]),"data-testid":"sequencer-controls-panel"},[i.stage?(p(),f("div",iw,[a("div",nw,[a("button",{type:"button",class:U(["framesync-button framesync-button--compact control-btn",{"framesync-button--live":t.sequencerPlaying,playing:t.sequencerPlaying}]),title:t.sequencerPlaying?"Stop":"Play",onClick:e[0]||(e[0]=(...c)=>t.toggleSequencerPlayback&&t.toggleSequencerPlayback(...c))},[ve(l,{name:t.sequencerPlaying?"stop":"play"},null,8,["name"])],10,sw),a("button",{type:"button",class:"framesync-button framesync-button--compact",title:"Preview frame",onClick:e[1]||(e[1]=(...c)=>t.previewSequencerFrame&&t.previewSequencerFrame(...c))},[ve(l,{name:"sparkles"})]),a("span",{class:U(["stage-sequencer-bar__frame",{"stage-sequencer-bar__frame--live":t.sequencerJobFrameLive}]),"data-testid":"sequencer-job-frame-counter"},[ie(_(t.sequencerJobFrameNumber),1),a("span",rw,"/"+_(t.sequencerJobTotalFrames),1)],2)]),a("label",ow,[K(a("input",{type:"range",class:"stage-sequencer-bar__scrub-input",min:"0",max:Math.max(.01,Number(t.sequencer.durationSec)||0),step:"0.01","onUpdate:modelValue":e[2]||(e[2]=c=>t.sequencerPlayhead=c),onInput:e[3]||(e[3]=(...c)=>t.previewSequencerFrame&&t.previewSequencerFrame(...c))},null,40,aw),[[ae,t.sequencerPlayhead,void 0,{number:!0}]])]),a("div",lw,[t.sequencerStatus?(p(),f("span",uw,_(t.sequencerStatus),1)):t.performance.status?(p(),f("span",dw,_(t.performance.status),1)):N("",!0),a("span",cw,_(t.sequencerPlayhead.toFixed(2))+"s",1),a("span",hw,_(t.masterFps)+" fps",1),a("label",mw,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[4]||(e[4]=c=>t.sequencer.loop=c)},null,512),[[Ci,t.sequencer.loop]]),e[42]||(e[42]=a("span",null,"Loop",-1))]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=c=>t.addSequencerClip("prompt"))},"+ Prompt"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[6]||(e[6]=c=>t.addSequencerClip("lora"))},"+ LoRA"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[7]||(e[7]=c=>t.addSequencerClip("controlnet"))},"+ CN"),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{active:t.motionSequencerSideOpen}]),"data-testid":"motion-sequencer-side-toggle-bar",onClick:e[8]||(e[8]=c=>{t.motionSequencerSideOpen=!t.motionSequencerSideOpen,t.saveSessionState()})},_(t.motionSequencerSideOpen?"Less":"Edit"),3),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[9]||(e[9]=(...c)=>t.applySequencerToDeforumSettings&&t.applySequencerToDeforumSettings(...c))}," Apply ")])])):N("",!0),!i.stage&&!i.sideDrawer&&!i.summaryOnly?(p(),f("div",{key:1,class:U(["generate-sequencer__frame-hero",{"generate-sequencer__frame-hero--live":t.sequencerJobFrameLive}]),"data-testid":"sequencer-job-frame-hero"},[e[44]||(e[44]=a("div",{class:"generate-sequencer__frame-hero-label"},"Job frame",-1)),a("div",pw,[a("span",fw,_(t.sequencerJobFrameNumber),1),e[43]||(e[43]=a("span",{class:"generate-sequencer__frame-hero-sep"},"/",-1)),a("span",gw,_(t.sequencerJobTotalFrames),1)]),a("div",yw,_(t.sequencerJobFps)+" fps · "+_(t.sequencerPlayhead.toFixed(2))+"s · "+_(t.sequencerJobTotalFrames)+" frames total ",1),a("div",vw,[a("div",{class:"generate-sequencer__frame-hero-bar-fill",style:Pt({width:`${t.sequencerJobFrameProgressPct}%`})},null,4)])],2)):N("",!0),!i.stage&&!i.sideDrawer?(p(),f("div",bw,[a("div",_w,[a("div",Sw,[a("div",ww,[e[45]||(e[45]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,_(i.summaryOnly?"Tracks":"Timeline"),1)]),a("code",Mw,_(i.summaryOnly?t.selectedSequencerTrack?((u=t.sequencerParamMetaMap[t.selectedSequencerTrack.param])==null?void 0:u.label)||t.selectedSequencerTrack.param:"No track selected":`${Number(t.sequencer.durationSec||0).toFixed(1)}s · ${t.sequencer.fps} fps`),1)]),i.summaryOnly?(p(),f("div",xw,[a("span",Pw,_(t.sequencer.tracks.length)+" track"+_(t.sequencer.tracks.length===1?"":"s"),1)])):(p(),f("div",Tw,[a("label",Aw,[e[46]||(e[46]=a("span",{class:"framesync-subtitle"},"Duration (s)",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[10]||(e[10]=c=>t.sequencer.durationSec=c),min:"0.5",max:"600",step:"0.5",onChange:e[11]||(e[11]=(...c)=>t.clampSequencerPlayhead&&t.clampSequencerPlayhead(...c))},null,544),[[ae,t.sequencer.durationSec,void 0,{number:!0}]])]),a("label",Cw,[e[47]||(e[47]=a("span",{class:"framesync-subtitle"},"FPS",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[12]||(e[12]=c=>t.sequencer.fps=c),min:"1",max:"60",step:"1"},null,512),[[ae,t.sequencer.fps,void 0,{number:!0}]])]),a("label",Ew,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[13]||(e[13]=c=>t.sequencer.loop=c)},null,512),[[Ci,t.sequencer.loop]]),e[48]||(e[48]=a("span",{class:"framesync-subtitle"},"Loop timeline",-1))])]))]),a("div",{class:U(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--active":i.summaryOnly?t.sortedSequencerMarkers.length>0:t.sequencer.bpmSync}])},[a("div",kw,[i.summaryOnly?(p(),f("div",Lw,[...e[50]||(e[50]=[a("span",{class:"modulation-lfo-card__dot"},null,-1),a("span",null,"Markers",-1)])])):(p(),f("label",Rw,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[14]||(e[14]=c=>t.sequencer.bpmSync=c)},null,512),[[Ci,t.sequencer.bpmSync]]),e[49]||(e[49]=a("span",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"BPM sync")],-1))])),a("code",Dw,_(i.summaryOnly?t.sortedSequencerMarkers.length?"Scene triggers ready":"No marker cues yet":t.sequencer.bpmSync?`${t.sequencerCalculatedDuration}s`:"Manual timing"),1)]),i.summaryOnly?(p(),f("div",Iw,[a("span",{class:U(["modulation-route-pill",{"modulation-route-pill--idle":!t.sortedSequencerMarkers.length}])},_(t.sortedSequencerMarkers.length)+" marker"+_(t.sortedSequencerMarkers.length===1?"":"s"),3)])):t.sequencer.bpmSync?(p(),f("div",Fw,[a("label",Nw,[e[51]||(e[51]=a("span",{class:"framesync-subtitle"},"BPM",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[15]||(e[15]=c=>t.sequencer.bpm=c),min:"20",max:"300",step:"0.1"},null,512),[[ae,t.sequencer.bpm,void 0,{number:!0}]])]),a("label",Ow,[e[52]||(e[52]=a("span",{class:"framesync-subtitle"},"Bars",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[16]||(e[16]=c=>t.sequencer.bars=c),min:"1",max:"128",step:"1"},null,512),[[ae,t.sequencer.bars,void 0,{number:!0}]])]),a("label",Uw,[e[54]||(e[54]=a("span",{class:"framesync-subtitle"},"Beats/bar",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[17]||(e[17]=c=>t.sequencer.beatsPerBar=c)},[...e[53]||(e[53]=[a("option",{value:4},"4/4",-1),a("option",{value:3},"3/4",-1),a("option",{value:6},"6/8",-1)])],512),[[Rt,t.sequencer.beatsPerBar,void 0,{number:!0}]])]),a("label",Vw,[e[55]||(e[55]=a("span",{class:"framesync-subtitle"},"Length",-1)),a("code",Bw,_(t.sequencerCalculatedDuration)+"s",1)])])):i.summaryOnly?N("",!0):(p(),f("div",zw,[...e[56]||(e[56]=[a("span",{class:"modulation-route-pill modulation-route-pill--idle"},"Sync timeline length to uploaded audio BPM",-1)])]))],2),a("div",{class:U(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--active":i.summaryOnly||t.sequencerPlaying}])},[a("div",$w,[a("div",Gw,[e[57]||(e[57]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,_(i.summaryOnly?"Playhead":"Transport"),1)]),a("code",Hw,_(i.summaryOnly?`${Number(t.sequencer.durationSec||0).toFixed(2)}s timeline`:`${t.sequencerPlayhead.toFixed(2)}s playhead`),1)]),i.summaryOnly?(p(),f("div",Ww,[a("span",qw,_(t.sequencerJobFrameLabel),1)])):(p(),f("div",jw,[a("button",{type:"button",class:U(["framesync-button",{"framesync-button--live":t.sequencerPlaying}]),onClick:e[18]||(e[18]=(...c)=>t.toggleSequencerPlayback&&t.toggleSequencerPlayback(...c))},_(t.sequencerPlaying?"Stop":"Play"),3),a("button",{type:"button",class:"framesync-button",onClick:e[19]||(e[19]=(...c)=>t.previewSequencerFrame&&t.previewSequencerFrame(...c))},"Preview frame"),a("button",{type:"button",class:"framesync-button framesync-button--accent",onClick:e[20]||(e[20]=(...c)=>t.applySequencerToDeforumSettings&&t.applySequencerToDeforumSettings(...c)),title:"Convert timeline keyframes to Deforum schedule strings and save to settings"},"Apply to Deforum")]))],2),a("div",{class:U(["modulation-lfo-card modulation-lfo-card--static generate-sequencer__control-span",{"modulation-lfo-card--active":i.summaryOnly?/frame ready/i.test(String(t.performance.status||"")):!0}])},[a("div",Xw,[a("div",Kw,[e[58]||(e[58]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,_(i.summaryOnly?"Preview":"Playhead"),1)]),a("code",Yw,_(i.summaryOnly?t.performance.status||"Preview status appears here":`${t.sortedSequencerMarkers.length} marker${t.sortedSequencerMarkers.length===1?"":"s"}`),1)]),i.summaryOnly?(p(),f("div",Jw,[a("span",{class:U(["modulation-route-pill",{"modulation-route-pill--idle":!/frame ready/i.test(String(t.performance.status||""))}])},_(/frame ready/i.test(String(t.performance.status||""))?"Ready":t.sequencerPlaying?"Playing":"Idle"),3)])):(p(),f(G,{key:1},[a("label",Zw,[e[59]||(e[59]=a("span",{class:"framesync-subtitle"},"Job frame",-1)),a("input",{type:"number",class:"framesync-input",value:t.sequencerJobFrameNumber,min:"1",max:t.sequencerJobTotalFrames,step:"1",onChange:e[21]||(e[21]=c=>t.seekSequencerToJobFrame(c.target.value))},null,40,Qw)]),a("label",eM,[e[60]||(e[60]=a("span",{class:"framesync-subtitle"},"Scrub timeline (s)",-1)),K(a("input",{type:"range",class:"framesync-input",min:"0",max:Math.max(.01,t.sequencer.durationSec),step:"0.01","onUpdate:modelValue":e[22]||(e[22]=c=>t.sequencerPlayhead=c),onInput:e[23]||(e[23]=(...c)=>t.previewSequencerFrame&&t.previewSequencerFrame(...c))},null,40,tM),[[ae,t.sequencerPlayhead,void 0,{number:!0}]])]),a("label",iM,[e[61]||(e[61]=a("span",{class:"framesync-subtitle"},"Scrub job frame",-1)),a("input",{type:"range",class:"framesync-input",min:"1",max:t.sequencerJobTotalFrames,step:"1",value:t.sequencerJobFrameNumber,onInput:e[24]||(e[24]=c=>t.seekSequencerToJobFrame(c.target.value))},null,40,nM)]),a("div",sM,[K(a("input",{type:"text",class:"framesync-input generate-sequencer__marker-input","onUpdate:modelValue":e[25]||(e[25]=c=>t.sequencerMarkerName=c),maxlength:"48",placeholder:"Marker label",title:"1–48 chars: letters, digits, space, _ - ."},null,512),[[ae,t.sequencerMarkerName,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button",onClick:e[26]||(e[26]=(...c)=>t.addSequencerMarker&&t.addSequencerMarker(...c))},"+ Marker @ playhead")])],64))],2)])):N("",!0),i.showTimeline&&!i.sideDrawer?(p(),ht(o,{key:3,duration:Number(t.sequencer.durationSec)||0,playhead:t.sequencerPlayhead,markers:t.sortedSequencerMarkers,clips:t.sortedSequencerClips,"selected-clip-id":t.sequencerSelectedClipId||"",tracks:t.sequencer.tracks,"selected-track-id":t.selectedSequencerTrack?t.selectedSequencerTrack.id:"","param-meta":t.sequencerParamMetaMap,frames:t.thumbs,fps:Number(t.sequencer.fps)||24,"job-frame-number":t.sequencerJobFrameNumber,"job-total-frames":t.sequencerJobTotalFrames,"job-frame-live":t.sequencerJobFrameLive,compact:i.stage?!1:!t.generateDockExpanded,expandable:!i.stage,onSeek:t.seekSequencer,onJumpMarker:t.jumpToSequencerMarker,onJumpClip:t.jumpToSequencerClip,onSelectTrack:t.selectSequencerTrack,onToggleCompact:e[27]||(e[27]=c=>{t.generateDockExpanded=!t.generateDockExpanded,t.saveSessionState()}),onUpdateKeyframe:t.updateSequencerKeyframe},null,8,["duration","playhead","markers","clips","selected-clip-id","tracks","selected-track-id","param-meta","frames","fps","job-frame-number","job-total-frames","job-frame-live","compact","expandable","onSeek","onJumpMarker","onJumpClip","onSelectTrack","onUpdateKeyframe"])):N("",!0),!i.summaryOnly&&(i.sideDrawer||!i.stage&&t.generateDockExpanded)?(p(),f(G,{key:4},[a("div",rM,[a("div",oM,[a("div",aM,[e[62]||(e[62]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Timeline content")],-1)),a("code",lM,_(t.sequencerClipSummary.prompt)+"p · "+_(t.sequencerClipSummary.lora)+"l · "+_(t.sequencerClipSummary.controlnet)+"c ",1)]),a("div",uM,[a("label",dM,[e[63]||(e[63]=a("span",{class:"framesync-subtitle"},"Clip span (s)",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[28]||(e[28]=c=>t.sequencerClipDurationSec=c),min:"0.1",max:"120",step:"0.1"},null,512),[[ae,t.sequencerClipDurationSec,void 0,{number:!0}]])])]),a("div",cM,[a("button",{type:"button",class:"framesync-button",onClick:e[29]||(e[29]=c=>t.addSequencerClip("prompt"))},"+ Prompt"),a("button",{type:"button",class:"framesync-button",onClick:e[30]||(e[30]=c=>t.addSequencerClip("lora"))},"+ LoRA"),a("button",{type:"button",class:"framesync-button",onClick:e[31]||(e[31]=c=>t.addSequencerClip("controlnet"))},"+ ControlNet")]),e[64]||(e[64]=a("div",{class:"framesync-subtitle generate-sequencer__clip-hint"}," Snapshots current prompts, LoRA groups, or ControlNet slots at the playhead. Scrubbing or playback applies the active clip for each type. ",-1))]),a("div",hM,[a("div",mM,[e[65]||(e[65]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Track editor")],-1)),a("code",pM,_(t.sequencer.tracks.length)+" track"+_(t.sequencer.tracks.length===1?"":"s"),1)]),a("div",fM,[a("label",gM,[e[66]||(e[66]=a("span",{class:"framesync-subtitle"},"Parameter",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[32]||(e[32]=c=>t.sequencerNewParam=c)},[(p(!0),f(G,null,re(t.sequencerParamOptions,c=>(p(),f("option",{key:"sp-"+c.key,value:c.key},_(c.label),9,yM))),128))],512),[[Rt,t.sequencerNewParam]])]),a("label",vM,[e[67]||(e[67]=a("span",{class:"framesync-subtitle"},"Keyframe value",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[33]||(e[33]=c=>t.sequencerKeyframeVal=c),step:"any",placeholder:"Value"},null,512),[[ae,t.sequencerKeyframeVal,void 0,{number:!0}]])])]),a("div",bM,[a("button",{type:"button",class:"framesync-button",onClick:e[34]||(e[34]=(...c)=>t.addSequencerTrack&&t.addSequencerTrack(...c))},"+ Track"),a("button",{type:"button",class:"framesync-button",onClick:e[35]||(e[35]=(...c)=>t.addSequencerKeyframe&&t.addSequencerKeyframe(...c))},"+ Keyframe @ playhead")])]),a("div",_M,[a("div",SM,[e[68]||(e[68]=a("div",{class:"modulation-lfo-card__title"},[a("span",{class:"modulation-lfo-card__dot"}),a("span",null,"Timeline files")],-1)),a("code",wM,_(t.sequencerList.length)+" saved",1)]),a("div",MM,[a("button",{type:"button",class:"framesync-button",onClick:e[36]||(e[36]=(...c)=>t.saveSequencerTimeline&&t.saveSequencerTimeline(...c))},"Save"),a("button",{type:"button",class:"framesync-button",onClick:e[37]||(e[37]=(...c)=>t.exportSequencerDownload&&t.exportSequencerDownload(...c))},"Export JSON"),K(a("select",{class:"framesync-select generate-sequencer__load-select","onUpdate:modelValue":e[38]||(e[38]=c=>t.sequencerLoadPick=c),onChange:e[39]||(e[39]=(...c)=>t.loadSequencerTimeline&&t.loadSequencerTimeline(...c))},[e[69]||(e[69]=a("option",{value:""},"Load saved…",-1)),(p(!0),f(G,null,re(t.sequencerList,c=>(p(),f("option",{key:"seq-"+c,value:c},_(c),9,xM))),128))],544),[[Rt,t.sequencerLoadPick]])])])]),t.generateDockExpanded||i.sideDrawer?(p(),f("div",PM,[t.sortedSequencerClips.length?(p(),f("div",TM,[(p(!0),f(G,null,re(t.sortedSequencerClips,c=>(p(),f("div",{key:c.id,class:U(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--selected":t.sequencerSelectedClipId===c.id}]),onClick:h=>t.selectSequencerClip(c.id)},[a("div",CM,[a("div",EM,[e[70]||(e[70]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,_(c.label||t.clipTypeLabel(c.type)),1)]),a("code",kM,_(t.clipTypeLabel(c.type)),1)]),a("div",RM,[a("label",LM,[e[71]||(e[71]=a("span",{class:"framesync-subtitle"},"Start (s)",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":h=>c.t=h,min:"0",max:t.sequencer.durationSec,step:"0.01",onChange:e[40]||(e[40]=(...h)=>t.clampSequencerPlayhead&&t.clampSequencerPlayhead(...h))},null,40,DM),[[ae,c.t,void 0,{number:!0}]])]),a("label",IM,[e[72]||(e[72]=a("span",{class:"framesync-subtitle"},"End (s)",-1)),a("input",{type:"number",class:"framesync-input",value:c.endT==null?"":c.endT,min:"0",max:t.sequencer.durationSec,step:"0.01",placeholder:"Point cue",onChange:h=>c.endT=h.target.value===""?null:parseFloat(h.target.value)},null,40,FM)])]),a("div",NM,[a("span",OM,_(t.clipSummaryText(c)),1),a("button",{type:"button",class:"framesync-button",onClick:ft(h=>t.jumpToSequencerClip(c),["stop"])},"Go to",8,UM),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:ft(h=>t.applySequencerClip(c),["stop"])},"Apply",8,VM),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:ft(h=>t.removeSequencerClip(c.id),["stop"])},"Remove",8,BM)])],10,AM))),128))])):N("",!0),t.sequencer.tracks.length?(p(),f("div",zM,[(p(!0),f(G,null,re(t.sequencer.tracks,c=>{var h;return p(),f("div",{key:c.id,class:U(["modulation-lfo-card modulation-lfo-card--static",{"modulation-lfo-card--selected":t.selectedSequencerTrack&&t.selectedSequencerTrack.id===c.id}]),onClick:d=>t.selectSequencerTrack(c.id)},[a("div",GM,[a("div",HM,[e[73]||(e[73]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,_(((h=t.sequencerParamMetaMap[c.param])==null?void 0:h.label)||c.param),1)]),a("code",WM,_(t.sortedKeyframes(c).length)+" keyframes",1)]),t.sortedKeyframes(c).length?(p(),f("div",qM,[(p(!0),f(G,null,re(t.sortedKeyframes(c),(d,m)=>(p(),f("div",{key:c.id+"-"+m+"-"+(d.t||0),class:"generate-sequencer__keyframe-row"},[a("code",jM,_(d.t.toFixed(2))+"s → "+_(d.v.toFixed(3)),1),a("select",{class:"framesync-select generate-sequencer__keyframe-easing",value:d.easing||"linear",title:"Easing to next keyframe",onClick:e[41]||(e[41]=ft(()=>{},["stop"])),onChange:g=>t.setKeyframeEasing(d,g.target.value)},[...e[74]||(e[74]=[a("option",{value:"linear"},"linear",-1),a("option",{value:"easeIn"},"easeIn",-1),a("option",{value:"easeOut"},"easeOut",-1),a("option",{value:"easeInOut"},"easeInOut",-1)])],40,XM),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",title:"Remove keyframe",onClick:ft(g=>t.removeSequencerKeyframe(c.id,m),["stop"])},"Remove",8,KM)]))),128))])):(p(),f("div",YM,[...e[75]||(e[75]=[a("span",{class:"modulation-route-pill modulation-route-pill--idle"},"No keyframes yet",-1)])])),a("div",JM,[a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:ft(d=>t.removeSequencerTrack(c.id),["stop"])},"Remove track",8,ZM)])],10,$M)}),128))])):N("",!0),t.sortedSequencerMarkers.length?(p(),f("div",QM,[(p(!0),f(G,null,re(t.sortedSequencerMarkers,(c,h)=>(p(),f("div",{key:"mrow-"+h+"-"+(c.t||0),class:"modulation-lfo-card modulation-lfo-card--static modulation-lfo-card--active"},[a("div",ex,[a("button",{type:"button",class:"generate-marker-row__jump framesync-button",onClick:d=>t.jumpToSequencerMarker(c)},_(c.name)+" @ "+_(c.t.toFixed(2))+"s ",9,tx),a("code",ix,_(c.action||"jump"),1)]),a("div",nx,[a("label",sx,[e[77]||(e[77]=a("span",{class:"framesync-subtitle"},"Action",-1)),a("select",{class:"framesync-select",value:c.action||"jump",onChange:d=>t.setMarkerAction(c,d.target.value)},[...e[76]||(e[76]=[$i('',6)])],40,rx)]),c.action&&c.action!=="jump"&&c.action!=="generate"&&c.action!=="pause"?(p(),f("label",ox,[e[78]||(e[78]=a("span",{class:"framesync-subtitle"},"Target",-1)),a("input",{type:"text",class:"framesync-input",value:c.target||"",placeholder:t.markerActionPlaceholder(c.action),onChange:d=>t.setMarkerTarget(c,d.target.value),title:t.markerActionTitle(c.action)},null,40,ax)])):(p(),f("span",lx,_(c.action==="jump"?"jump to time":c.action==="generate"?"trigger generation":c.action==="pause"?"pause playback":""),1))]),a("div",ux,[a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",title:"Remove marker",onClick:d=>t.removeSequencerMarker(h)},"Remove",8,dx)])]))),128))])):(p(),f("div",cx,"No markers yet.")),t.sequencerStatus?(p(),f("div",hx,_(t.sequencerStatus),1)):N("",!0)])):i.sideDrawer?N("",!0):(p(),f("div",mx," Open the side editor for keyframes, clips, markers, and track files. "))],64)):N("",!0)],2)}const fx=it(tw,[["render",px]]);/** * @license * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT - */const kc="184",Dr={ROTATE:0,DOLLY:1,PAN:2},Tr={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Hw=0,pf=1,Ww=2,Ka=1,qw=2,fo=3,Kn=0,Ti=1,Gi=2,Gn=0,Ir=1,Fs=2,gf=3,yf=4,jw=5,Ns=100,Xw=101,Kw=102,Yw=103,Jw=104,Zw=200,Qw=201,eM=202,tM=203,cu=204,hu=205,iM=206,nM=207,sM=208,rM=209,oM=210,aM=211,lM=212,dM=213,uM=214,fu=0,mu=1,pu=2,zr=3,gu=4,yu=5,vu=6,bu=7,Il=0,cM=1,hM=2,en=0,fg=1,mg=2,pg=3,Lc=4,gg=5,yg=6,vg=7,bg=300,qs=301,$r=302,nd=303,sd=304,Fl=306,No=1e3,zn=1001,_u=1002,di=1003,fM=1004,oa=1005,vi=1006,rd=1007,Bs=1008,Oi=1009,_g=1010,Sg=1011,Oo=1012,Rc=1013,Pn=1014,_n=1015,xn=1016,Dc=1017,Ic=1018,Uo=1020,wg=35902,Mg=35899,Pg=1021,xg=1022,Zi=1023,Yn=1026,Vs=1027,Tg=1028,Fc=1029,js=1030,Nc=1031,Oc=1033,Ya=33776,Ja=33777,Za=33778,Qa=33779,Su=35840,wu=35841,Mu=35842,Pu=35843,xu=36196,Tu=37492,Au=37496,Eu=37488,Cu=37489,hl=37490,ku=37491,Lu=37808,Ru=37809,Du=37810,Iu=37811,Fu=37812,Nu=37813,Ou=37814,Uu=37815,Bu=37816,Vu=37817,zu=37818,$u=37819,Gu=37820,Hu=37821,Wu=36492,qu=36494,ju=36495,Xu=36283,Ku=36284,fl=36285,Yu=36286,mM=3200,Bo=0,pM=1,fs="",ki="srgb",ml="srgb-linear",pl="linear",Ct="srgb",tr=7680,vf=519,gM=512,yM=513,vM=514,Uc=515,bM=516,_M=517,Bc=518,SM=519,Ju=35044,aa=35048,wM="100",bf="300 es",Sn=2e3,Vo=2001;function MM(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}function zo(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function PM(){const t=zo("canvas");return t.style.display="block",t}const _f={};function gl(...t){const e="THREE."+t.shift();console.log(e,...t)}function Ag(t){const e=t[0];if(typeof e=="string"&&e.startsWith("TSL:")){const i=t[1];i&&i.isStackTrace?t[0]+=" "+i.getLocation():t[1]='Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.'}return t}function tt(...t){t=Ag(t);const e="THREE."+t.shift();{const i=t[0];i&&i.isStackTrace?console.warn(i.getError(e)):console.warn(e,...t)}}function vt(...t){t=Ag(t);const e="THREE."+t.shift();{const i=t[0];i&&i.isStackTrace?console.error(i.getError(e)):console.error(e,...t)}}function Zu(...t){const e=t.join(" ");e in _f||(_f[e]=!0,tt(...t))}function xM(t,e,i){return new Promise(function(n,s){function r(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:s();break;case t.TIMEOUT_EXPIRED:setTimeout(r,i);break;default:n()}}setTimeout(r,i)})}const TM={[fu]:mu,[pu]:vu,[gu]:bu,[zr]:yu,[mu]:fu,[vu]:pu,[bu]:gu,[yu]:zr};class bs{addEventListener(e,i){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(i)===-1&&n[e].push(i)}hasEventListener(e,i){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(i)!==-1}removeEventListener(e,i){const n=this._listeners;if(n===void 0)return;const s=n[e];if(s!==void 0){const r=s.indexOf(i);r!==-1&&s.splice(r,1)}}dispatchEvent(e){const i=this._listeners;if(i===void 0)return;const n=i[e.type];if(n!==void 0){e.target=this;const s=n.slice(0);for(let r=0,l=s.length;r>8&255]+fi[t>>16&255]+fi[t>>24&255]+"-"+fi[e&255]+fi[e>>8&255]+"-"+fi[e>>16&15|64]+fi[e>>24&255]+"-"+fi[i&63|128]+fi[i>>8&255]+"-"+fi[i>>16&255]+fi[i>>24&255]+fi[n&255]+fi[n>>8&255]+fi[n>>16&255]+fi[n>>24&255]).toLowerCase()}function rt(t,e,i){return Math.max(e,Math.min(i,t))}function Vc(t,e){return(t%e+e)%e}function AM(t,e,i,n,s){return n+(t-e)*(s-n)/(i-e)}function EM(t,e,i){return t!==e?(i-t)/(e-t):0}function To(t,e,i){return(1-i)*t+i*e}function CM(t,e,i,n){return To(t,e,1-Math.exp(-i*n))}function kM(t,e=1){return e-Math.abs(Vc(t,e*2)-e)}function LM(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e),t*t*(3-2*t))}function RM(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e),t*t*t*(t*(t*6-15)+10))}function DM(t,e){return t+Math.floor(Math.random()*(e-t+1))}function IM(t,e){return t+Math.random()*(e-t)}function FM(t){return t*(.5-Math.random())}function NM(t){t!==void 0&&(Sf=t);let e=Sf+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function OM(t){return t*xo}function UM(t){return t*$o}function BM(t){return(t&t-1)===0&&t!==0}function VM(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function zM(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function $M(t,e,i,n,s){const r=Math.cos,l=Math.sin,o=r(i/2),d=l(i/2),u=r((e+n)/2),h=l((e+n)/2),c=r((e-n)/2),f=l((e-n)/2),g=r((n-e)/2),y=l((n-e)/2);switch(s){case"XYX":t.set(o*h,d*c,d*f,o*u);break;case"YZY":t.set(d*f,o*h,d*c,o*u);break;case"ZXZ":t.set(d*c,d*f,o*h,o*u);break;case"XZX":t.set(o*h,d*y,d*g,o*u);break;case"YXY":t.set(d*g,o*h,d*y,o*u);break;case"ZYZ":t.set(d*y,d*g,o*h,o*u);break;default:tt("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+s)}}function Ji(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function kt(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(t*4294967295);case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int32Array:return Math.round(t*2147483647);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}const yl={DEG2RAD:xo,RAD2DEG:$o,generateUUID:Hn,clamp:rt,euclideanModulo:Vc,mapLinear:AM,inverseLerp:EM,lerp:To,damp:CM,pingpong:kM,smoothstep:LM,smootherstep:RM,randInt:DM,randFloat:IM,randFloatSpread:FM,seededRandom:NM,degToRad:OM,radToDeg:UM,isPowerOfTwo:BM,ceilPowerOfTwo:VM,floorPowerOfTwo:zM,setQuaternionFromProperEuler:$M,normalize:kt,denormalize:Ji},sh=class sh{constructor(e=0,i=0){this.x=e,this.y=i}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,i){return this.x=e,this.y=i,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const i=this.x,n=this.y,s=e.elements;return this.x=s[0]*i+s[3]*n+s[6],this.y=s[1]*i+s[4]*n+s[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const i=Math.sqrt(this.lengthSq()*e.lengthSq());if(i===0)return Math.PI/2;const n=this.dot(e)/i;return Math.acos(rt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const i=this.x-e.x,n=this.y-e.y;return i*i+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this}rotateAround(e,i){const n=Math.cos(i),s=Math.sin(i),r=this.x-e.x,l=this.y-e.y;return this.x=r*n-l*s+e.x,this.y=r*s+l*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}};sh.prototype.isVector2=!0;let Ye=sh;class ys{constructor(e=0,i=0,n=0,s=1){this.isQuaternion=!0,this._x=e,this._y=i,this._z=n,this._w=s}static slerpFlat(e,i,n,s,r,l,o){let d=n[s+0],u=n[s+1],h=n[s+2],c=n[s+3],f=r[l+0],g=r[l+1],y=r[l+2],T=r[l+3];if(c!==T||d!==f||u!==g||h!==y){let _=d*f+u*g+h*y+c*T;_<0&&(f=-f,g=-g,y=-y,T=-T,_=-_);let v=1-o;if(_<.9995){const S=Math.acos(_),w=Math.sin(S);v=Math.sin(v*S)/w,o=Math.sin(o*S)/w,d=d*v+f*o,u=u*v+g*o,h=h*v+y*o,c=c*v+T*o}else{d=d*v+f*o,u=u*v+g*o,h=h*v+y*o,c=c*v+T*o;const S=1/Math.sqrt(d*d+u*u+h*h+c*c);d*=S,u*=S,h*=S,c*=S}}e[i]=d,e[i+1]=u,e[i+2]=h,e[i+3]=c}static multiplyQuaternionsFlat(e,i,n,s,r,l){const o=n[s],d=n[s+1],u=n[s+2],h=n[s+3],c=r[l],f=r[l+1],g=r[l+2],y=r[l+3];return e[i]=o*y+h*c+d*g-u*f,e[i+1]=d*y+h*f+u*c-o*g,e[i+2]=u*y+h*g+o*f-d*c,e[i+3]=h*y-o*c-d*f-u*g,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,i,n,s){return this._x=e,this._y=i,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,i=!0){const n=e._x,s=e._y,r=e._z,l=e._order,o=Math.cos,d=Math.sin,u=o(n/2),h=o(s/2),c=o(r/2),f=d(n/2),g=d(s/2),y=d(r/2);switch(l){case"XYZ":this._x=f*h*c+u*g*y,this._y=u*g*c-f*h*y,this._z=u*h*y+f*g*c,this._w=u*h*c-f*g*y;break;case"YXZ":this._x=f*h*c+u*g*y,this._y=u*g*c-f*h*y,this._z=u*h*y-f*g*c,this._w=u*h*c+f*g*y;break;case"ZXY":this._x=f*h*c-u*g*y,this._y=u*g*c+f*h*y,this._z=u*h*y+f*g*c,this._w=u*h*c-f*g*y;break;case"ZYX":this._x=f*h*c-u*g*y,this._y=u*g*c+f*h*y,this._z=u*h*y-f*g*c,this._w=u*h*c+f*g*y;break;case"YZX":this._x=f*h*c+u*g*y,this._y=u*g*c+f*h*y,this._z=u*h*y-f*g*c,this._w=u*h*c-f*g*y;break;case"XZY":this._x=f*h*c-u*g*y,this._y=u*g*c-f*h*y,this._z=u*h*y+f*g*c,this._w=u*h*c+f*g*y;break;default:tt("Quaternion: .setFromEuler() encountered an unknown order: "+l)}return i===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,i){const n=i/2,s=Math.sin(n);return this._x=e.x*s,this._y=e.y*s,this._z=e.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const i=e.elements,n=i[0],s=i[4],r=i[8],l=i[1],o=i[5],d=i[9],u=i[2],h=i[6],c=i[10],f=n+o+c;if(f>0){const g=.5/Math.sqrt(f+1);this._w=.25/g,this._x=(h-d)*g,this._y=(r-u)*g,this._z=(l-s)*g}else if(n>o&&n>c){const g=2*Math.sqrt(1+n-o-c);this._w=(h-d)/g,this._x=.25*g,this._y=(s+l)/g,this._z=(r+u)/g}else if(o>c){const g=2*Math.sqrt(1+o-n-c);this._w=(r-u)/g,this._x=(s+l)/g,this._y=.25*g,this._z=(d+h)/g}else{const g=2*Math.sqrt(1+c-n-o);this._w=(l-s)/g,this._x=(r+u)/g,this._y=(d+h)/g,this._z=.25*g}return this._onChangeCallback(),this}setFromUnitVectors(e,i){let n=e.dot(i)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*i.z-e.z*i.y,this._y=e.z*i.x-e.x*i.z,this._z=e.x*i.y-e.y*i.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(rt(this.dot(e),-1,1)))}rotateTowards(e,i){const n=this.angleTo(e);if(n===0)return this;const s=Math.min(1,i/n);return this.slerp(e,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,i){const n=e._x,s=e._y,r=e._z,l=e._w,o=i._x,d=i._y,u=i._z,h=i._w;return this._x=n*h+l*o+s*u-r*d,this._y=s*h+l*d+r*o-n*u,this._z=r*h+l*u+n*d-s*o,this._w=l*h-n*o-s*d-r*u,this._onChangeCallback(),this}slerp(e,i){let n=e._x,s=e._y,r=e._z,l=e._w,o=this.dot(e);o<0&&(n=-n,s=-s,r=-r,l=-l,o=-o);let d=1-i;if(o<.9995){const u=Math.acos(o),h=Math.sin(u);d=Math.sin(d*u)/h,i=Math.sin(i*u)/h,this._x=this._x*d+n*i,this._y=this._y*d+s*i,this._z=this._z*d+r*i,this._w=this._w*d+l*i,this._onChangeCallback()}else this._x=this._x*d+n*i,this._y=this._y*d+s*i,this._z=this._z*d+r*i,this._w=this._w*d+l*i,this.normalize();return this}slerpQuaternions(e,i,n){return this.copy(e).slerp(i,n)}random(){const e=2*Math.PI*Math.random(),i=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(e),s*Math.cos(e),r*Math.sin(i),r*Math.cos(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,i=0){return this._x=e[i],this._y=e[i+1],this._z=e[i+2],this._w=e[i+3],this._onChangeCallback(),this}toArray(e=[],i=0){return e[i]=this._x,e[i+1]=this._y,e[i+2]=this._z,e[i+3]=this._w,e}fromBufferAttribute(e,i){return this._x=e.getX(i),this._y=e.getY(i),this._z=e.getZ(i),this._w=e.getW(i),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}const rh=class rh{constructor(e=0,i=0,n=0){this.x=e,this.y=i,this.z=n}set(e,i,n){return n===void 0&&(n=this.z),this.x=e,this.y=i,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;case 2:this.z=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this.z=e.z+i.z,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this.z+=e.z*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this.z=e.z-i.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,i){return this.x=e.x*i.x,this.y=e.y*i.y,this.z=e.z*i.z,this}applyEuler(e){return this.applyQuaternion(wf.setFromEuler(e))}applyAxisAngle(e,i){return this.applyQuaternion(wf.setFromAxisAngle(e,i))}applyMatrix3(e){const i=this.x,n=this.y,s=this.z,r=e.elements;return this.x=r[0]*i+r[3]*n+r[6]*s,this.y=r[1]*i+r[4]*n+r[7]*s,this.z=r[2]*i+r[5]*n+r[8]*s,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const i=this.x,n=this.y,s=this.z,r=e.elements,l=1/(r[3]*i+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*i+r[4]*n+r[8]*s+r[12])*l,this.y=(r[1]*i+r[5]*n+r[9]*s+r[13])*l,this.z=(r[2]*i+r[6]*n+r[10]*s+r[14])*l,this}applyQuaternion(e){const i=this.x,n=this.y,s=this.z,r=e.x,l=e.y,o=e.z,d=e.w,u=2*(l*s-o*n),h=2*(o*i-r*s),c=2*(r*n-l*i);return this.x=i+d*u+l*c-o*h,this.y=n+d*h+o*u-r*c,this.z=s+d*c+r*h-l*u,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const i=this.x,n=this.y,s=this.z,r=e.elements;return this.x=r[0]*i+r[4]*n+r[8]*s,this.y=r[1]*i+r[5]*n+r[9]*s,this.z=r[2]*i+r[6]*n+r[10]*s,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this.z=rt(this.z,e.z,i.z),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this.z=rt(this.z,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this.z+=(e.z-this.z)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this.z=e.z+(i.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,i){const n=e.x,s=e.y,r=e.z,l=i.x,o=i.y,d=i.z;return this.x=s*d-r*o,this.y=r*l-n*d,this.z=n*o-s*l,this}projectOnVector(e){const i=e.lengthSq();if(i===0)return this.set(0,0,0);const n=e.dot(this)/i;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return od.copy(this).projectOnVector(e),this.sub(od)}reflect(e){return this.sub(od.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const i=Math.sqrt(this.lengthSq()*e.lengthSq());if(i===0)return Math.PI/2;const n=this.dot(e)/i;return Math.acos(rt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const i=this.x-e.x,n=this.y-e.y,s=this.z-e.z;return i*i+n*n+s*s}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,i,n){const s=Math.sin(i)*e;return this.x=s*Math.sin(n),this.y=Math.cos(i)*e,this.z=s*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,i,n){return this.x=e*Math.sin(i),this.y=n,this.z=e*Math.cos(i),this}setFromMatrixPosition(e){const i=e.elements;return this.x=i[12],this.y=i[13],this.z=i[14],this}setFromMatrixScale(e){const i=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),s=this.setFromMatrixColumn(e,2).length();return this.x=i,this.y=n,this.z=s,this}setFromMatrixColumn(e,i){return this.fromArray(e.elements,i*4)}setFromMatrix3Column(e,i){return this.fromArray(e.elements,i*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this.z=e[i+2],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e[i+2]=this.z,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this.z=e.getZ(i),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,i=Math.random()*2-1,n=Math.sqrt(1-i*i);return this.x=n*Math.cos(e),this.y=i,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}};rh.prototype.isVector3=!0;let V=rh;const od=new V,wf=new ys,oh=class oh{constructor(e,i,n,s,r,l,o,d,u){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,i,n,s,r,l,o,d,u)}set(e,i,n,s,r,l,o,d,u){const h=this.elements;return h[0]=e,h[1]=s,h[2]=o,h[3]=i,h[4]=r,h[5]=d,h[6]=n,h[7]=l,h[8]=u,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const i=this.elements,n=e.elements;return i[0]=n[0],i[1]=n[1],i[2]=n[2],i[3]=n[3],i[4]=n[4],i[5]=n[5],i[6]=n[6],i[7]=n[7],i[8]=n[8],this}extractBasis(e,i,n){return e.setFromMatrix3Column(this,0),i.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const i=e.elements;return this.set(i[0],i[4],i[8],i[1],i[5],i[9],i[2],i[6],i[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,i){const n=e.elements,s=i.elements,r=this.elements,l=n[0],o=n[3],d=n[6],u=n[1],h=n[4],c=n[7],f=n[2],g=n[5],y=n[8],T=s[0],_=s[3],v=s[6],S=s[1],w=s[4],x=s[7],k=s[2],E=s[5],D=s[8];return r[0]=l*T+o*S+d*k,r[3]=l*_+o*w+d*E,r[6]=l*v+o*x+d*D,r[1]=u*T+h*S+c*k,r[4]=u*_+h*w+c*E,r[7]=u*v+h*x+c*D,r[2]=f*T+g*S+y*k,r[5]=f*_+g*w+y*E,r[8]=f*v+g*x+y*D,this}multiplyScalar(e){const i=this.elements;return i[0]*=e,i[3]*=e,i[6]*=e,i[1]*=e,i[4]*=e,i[7]*=e,i[2]*=e,i[5]*=e,i[8]*=e,this}determinant(){const e=this.elements,i=e[0],n=e[1],s=e[2],r=e[3],l=e[4],o=e[5],d=e[6],u=e[7],h=e[8];return i*l*h-i*o*u-n*r*h+n*o*d+s*r*u-s*l*d}invert(){const e=this.elements,i=e[0],n=e[1],s=e[2],r=e[3],l=e[4],o=e[5],d=e[6],u=e[7],h=e[8],c=h*l-o*u,f=o*d-h*r,g=u*r-l*d,y=i*c+n*f+s*g;if(y===0)return this.set(0,0,0,0,0,0,0,0,0);const T=1/y;return e[0]=c*T,e[1]=(s*u-h*n)*T,e[2]=(o*n-s*l)*T,e[3]=f*T,e[4]=(h*i-s*d)*T,e[5]=(s*r-o*i)*T,e[6]=g*T,e[7]=(n*d-u*i)*T,e[8]=(l*i-n*r)*T,this}transpose(){let e;const i=this.elements;return e=i[1],i[1]=i[3],i[3]=e,e=i[2],i[2]=i[6],i[6]=e,e=i[5],i[5]=i[7],i[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const i=this.elements;return e[0]=i[0],e[1]=i[3],e[2]=i[6],e[3]=i[1],e[4]=i[4],e[5]=i[7],e[6]=i[2],e[7]=i[5],e[8]=i[8],this}setUvTransform(e,i,n,s,r,l,o){const d=Math.cos(r),u=Math.sin(r);return this.set(n*d,n*u,-n*(d*l+u*o)+l+e,-s*u,s*d,-s*(-u*l+d*o)+o+i,0,0,1),this}scale(e,i){return this.premultiply(ad.makeScale(e,i)),this}rotate(e){return this.premultiply(ad.makeRotation(-e)),this}translate(e,i){return this.premultiply(ad.makeTranslation(e,i)),this}makeTranslation(e,i){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,i,0,0,1),this}makeRotation(e){const i=Math.cos(e),n=Math.sin(e);return this.set(i,-n,0,n,i,0,0,0,1),this}makeScale(e,i){return this.set(e,0,0,0,i,0,0,0,1),this}equals(e){const i=this.elements,n=e.elements;for(let s=0;s<9;s++)if(i[s]!==n[s])return!1;return!0}fromArray(e,i=0){for(let n=0;n<9;n++)this.elements[n]=e[n+i];return this}toArray(e=[],i=0){const n=this.elements;return e[i]=n[0],e[i+1]=n[1],e[i+2]=n[2],e[i+3]=n[3],e[i+4]=n[4],e[i+5]=n[5],e[i+6]=n[6],e[i+7]=n[7],e[i+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}};oh.prototype.isMatrix3=!0;let dt=oh;const ad=new dt,Mf=new dt().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Pf=new dt().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function GM(){const t={enabled:!0,workingColorSpace:ml,spaces:{},convert:function(s,r,l){return this.enabled===!1||r===l||!r||!l||(this.spaces[r].transfer===Ct&&(s.r=Wn(s.r),s.g=Wn(s.g),s.b=Wn(s.b)),this.spaces[r].primaries!==this.spaces[l].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[l].fromXYZ)),this.spaces[l].transfer===Ct&&(s.r=Fr(s.r),s.g=Fr(s.g),s.b=Fr(s.b))),s},workingToColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},colorSpaceToWorking:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===fs?pl:this.spaces[s].transfer},getToneMappingMode:function(s){return this.spaces[s].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,l){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[l].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(s,r){return Zu("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(s,r)},toWorkingColorSpace:function(s,r){return Zu("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(s,r)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],n=[.3127,.329];return t.define({[ml]:{primaries:e,whitePoint:n,transfer:pl,toXYZ:Mf,fromXYZ:Pf,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ki},outputColorSpaceConfig:{drawingBufferColorSpace:ki}},[ki]:{primaries:e,whitePoint:n,transfer:Ct,toXYZ:Mf,fromXYZ:Pf,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ki}}}),t}const bt=GM();function Wn(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function Fr(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}let ir;class HM{static getDataURL(e,i="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{ir===void 0&&(ir=zo("canvas")),ir.width=e.width,ir.height=e.height;const s=ir.getContext("2d");e instanceof ImageData?s.putImageData(e,0,0):s.drawImage(e,0,0,e.width,e.height),n=ir}return n.toDataURL(i)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const i=zo("canvas");i.width=e.width,i.height=e.height;const n=i.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const s=n.getImageData(0,0,e.width,e.height),r=s.data;for(let l=0;l1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(dd).x}get height(){return this.source.getSize(dd).y}get depth(){return this.source.getSize(dd).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,i){this.updateRanges.push({start:e,count:i})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const i in e){const n=e[i];if(n===void 0){tt(`Texture.setValues(): parameter '${i}' has value of undefined.`);continue}const s=this[i];if(s===void 0){tt(`Texture.setValues(): property '${i}' does not exist.`);continue}s&&n&&s.isVector2&&n.isVector2||s&&n&&s.isVector3&&n.isVector3||s&&n&&s.isMatrix3&&n.isMatrix3?s.copy(n):this[i]=n}}toJSON(e){const i=e===void 0||typeof e=="string";if(!i&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),i||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==bg)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case No:e.x=e.x-Math.floor(e.x);break;case zn:e.x=e.x<0?0:1;break;case _u:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case No:e.y=e.y-Math.floor(e.y);break;case zn:e.y=e.y<0?0:1;break;case _u:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}ui.DEFAULT_IMAGE=null;ui.DEFAULT_MAPPING=bg;ui.DEFAULT_ANISOTROPY=1;const ah=class ah{constructor(e=0,i=0,n=0,s=1){this.x=e,this.y=i,this.z=n,this.w=s}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,i,n,s){return this.x=e,this.y=i,this.z=n,this.w=s,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;case 2:this.z=i;break;case 3:this.w=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this.z=e.z+i.z,this.w=e.w+i.w,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this.z+=e.z*i,this.w+=e.w*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this.z=e.z-i.z,this.w=e.w-i.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const i=this.x,n=this.y,s=this.z,r=this.w,l=e.elements;return this.x=l[0]*i+l[4]*n+l[8]*s+l[12]*r,this.y=l[1]*i+l[5]*n+l[9]*s+l[13]*r,this.z=l[2]*i+l[6]*n+l[10]*s+l[14]*r,this.w=l[3]*i+l[7]*n+l[11]*s+l[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const i=Math.sqrt(1-e.w*e.w);return i<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/i,this.y=e.y/i,this.z=e.z/i),this}setAxisAngleFromRotationMatrix(e){let i,n,s,r;const d=e.elements,u=d[0],h=d[4],c=d[8],f=d[1],g=d[5],y=d[9],T=d[2],_=d[6],v=d[10];if(Math.abs(h-f)<.01&&Math.abs(c-T)<.01&&Math.abs(y-_)<.01){if(Math.abs(h+f)<.1&&Math.abs(c+T)<.1&&Math.abs(y+_)<.1&&Math.abs(u+g+v-3)<.1)return this.set(1,0,0,0),this;i=Math.PI;const w=(u+1)/2,x=(g+1)/2,k=(v+1)/2,E=(h+f)/4,D=(c+T)/4,P=(y+_)/4;return w>x&&w>k?w<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(w),s=E/n,r=D/n):x>k?x<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(x),n=E/s,r=P/s):k<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(k),n=D/r,s=P/r),this.set(n,s,r,i),this}let S=Math.sqrt((_-y)*(_-y)+(c-T)*(c-T)+(f-h)*(f-h));return Math.abs(S)<.001&&(S=1),this.x=(_-y)/S,this.y=(c-T)/S,this.z=(f-h)/S,this.w=Math.acos((u+g+v-1)/2),this}setFromMatrixPosition(e){const i=e.elements;return this.x=i[12],this.y=i[13],this.z=i[14],this.w=i[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this.z=rt(this.z,e.z,i.z),this.w=rt(this.w,e.w,i.w),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this.z=rt(this.z,e,i),this.w=rt(this.w,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this.z+=(e.z-this.z)*i,this.w+=(e.w-this.w)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this.z=e.z+(i.z-e.z)*n,this.w=e.w+(i.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this.z=e[i+2],this.w=e[i+3],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e[i+2]=this.z,e[i+3]=this.w,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this.z=e.getZ(i),this.w=e.getW(i),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}};ah.prototype.isVector4=!0;let Tt=ah;class jM extends bs{constructor(e=1,i=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:vi,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=i,this.depth=n.depth,this.scissor=new Tt(0,0,e,i),this.scissorTest=!1,this.viewport=new Tt(0,0,e,i),this.textures=[];const s={width:e,height:i,depth:n.depth},r=new ui(s),l=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,e,i),this.scissor.set(0,0,e,i)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let i=0,n=e.textures.length;i>>0}enable(e){this.mask|=1<1){for(let i=0;i1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.pivot!==null&&(s.pivot=this.pivot.toArray()),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.morphTargetDictionary!==void 0&&(s.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(s.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(o=>({...o})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(e),s.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(s.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(s.boundingBox=this.boundingBox.toJSON()));function r(o,d){return o[d.uuid]===void 0&&(o[d.uuid]=d.toJSON(e)),d.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(e.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const d=o.shapes;if(Array.isArray(d))for(let u=0,h=d.length;u0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),d.length>0&&(n.materials=d),u.length>0&&(n.textures=u),h.length>0&&(n.images=h),c.length>0&&(n.shapes=c),f.length>0&&(n.skeletons=f),g.length>0&&(n.animations=g),y.length>0&&(n.nodes=y)}return n.object=s,n;function l(o){const d=[];for(const u in o){const h=o[u];delete h.metadata,d.push(h)}return d}}clone(e){return new this.constructor().copy(this,e)}copy(e,i=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot!==null?e.pivot.clone():null,this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),i===!0)for(let n=0;ng+y?(u.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!u.inputState.pinching&&f<=g-y&&(u.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else d!==null&&e.gripSpace&&(r=i.getPose(e.gripSpace,n),r!==null&&(d.matrix.fromArray(r.transform.matrix),d.matrix.decompose(d.position,d.rotation,d.scale),d.matrixWorldNeedsUpdate=!0,r.linearVelocity?(d.hasLinearVelocity=!0,d.linearVelocity.copy(r.linearVelocity)):d.hasLinearVelocity=!1,r.angularVelocity?(d.hasAngularVelocity=!0,d.angularVelocity.copy(r.angularVelocity)):d.hasAngularVelocity=!1,d.eventsEnabled&&d.dispatchEvent({type:"gripUpdated",data:e,target:this})));o!==null&&(s=i.getPose(e.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(tP)))}return o!==null&&(o.visible=s!==null),d!==null&&(d.visible=r!==null),u!==null&&(u.visible=l!==null),this}_getHandJoint(e,i){if(e.joints[i.jointName]===void 0){const n=new vn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[i.jointName]=n,e.add(n)}return e.joints[i.jointName]}}const Cg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},ns={h:0,s:0,l:0},ua={h:0,s:0,l:0};function hd(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+(e-t)*6*i:i<1/2?e:i<2/3?t+(e-t)*6*(2/3-i):t}class ze{constructor(e,i,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,i,n)}set(e,i,n){if(i===void 0&&n===void 0){const s=e;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(e,i,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,i=ki){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,bt.colorSpaceToWorking(this,i),this}setRGB(e,i,n,s=bt.workingColorSpace){return this.r=e,this.g=i,this.b=n,bt.colorSpaceToWorking(this,s),this}setHSL(e,i,n,s=bt.workingColorSpace){if(e=Vc(e,1),i=rt(i,0,1),n=rt(n,0,1),i===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+i):n+i-n*i,l=2*n-r;this.r=hd(l,r,e+1/3),this.g=hd(l,r,e),this.b=hd(l,r,e-1/3)}return bt.colorSpaceToWorking(this,s),this}setStyle(e,i=ki){function n(r){r!==void 0&&parseFloat(r)<1&&tt("Color: Alpha component of "+e+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const l=s[1],o=s[2];switch(l){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,i);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,i);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,i);break;default:tt("Color: Unknown color model "+e)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=s[1],l=r.length;if(l===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,i);if(l===6)return this.setHex(parseInt(r,16),i);tt("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,i);return this}setColorName(e,i=ki){const n=Cg[e.toLowerCase()];return n!==void 0?this.setHex(n,i):tt("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Wn(e.r),this.g=Wn(e.g),this.b=Wn(e.b),this}copyLinearToSRGB(e){return this.r=Fr(e.r),this.g=Fr(e.g),this.b=Fr(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=ki){return bt.workingToColorSpace(mi.copy(this),e),Math.round(rt(mi.r*255,0,255))*65536+Math.round(rt(mi.g*255,0,255))*256+Math.round(rt(mi.b*255,0,255))}getHexString(e=ki){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,i=bt.workingColorSpace){bt.workingToColorSpace(mi.copy(this),i);const n=mi.r,s=mi.g,r=mi.b,l=Math.max(n,s,r),o=Math.min(n,s,r);let d,u;const h=(o+l)/2;if(o===l)d=0,u=0;else{const c=l-o;switch(u=h<=.5?c/(l+o):c/(2-l-o),l){case n:d=(s-r)/c+(s0&&(i.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(i.object.backgroundIntensity=this.backgroundIntensity),i.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(i.object.environmentIntensity=this.environmentIntensity),i.object.environmentRotation=this.environmentRotation.toArray(),i}}const Ki=new V,Rn=new V,fd=new V,Dn=new V,or=new V,ar=new V,Rf=new V,md=new V,pd=new V,gd=new V,yd=new Tt,vd=new Tt,bd=new Tt;class Hi{constructor(e=new V,i=new V,n=new V){this.a=e,this.b=i,this.c=n}static getNormal(e,i,n,s){s.subVectors(n,i),Ki.subVectors(e,i),s.cross(Ki);const r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(e,i,n,s,r){Ki.subVectors(s,i),Rn.subVectors(n,i),fd.subVectors(e,i);const l=Ki.dot(Ki),o=Ki.dot(Rn),d=Ki.dot(fd),u=Rn.dot(Rn),h=Rn.dot(fd),c=l*u-o*o;if(c===0)return r.set(0,0,0),null;const f=1/c,g=(u*d-o*h)*f,y=(l*h-o*d)*f;return r.set(1-g-y,y,g)}static containsPoint(e,i,n,s){return this.getBarycoord(e,i,n,s,Dn)===null?!1:Dn.x>=0&&Dn.y>=0&&Dn.x+Dn.y<=1}static getInterpolation(e,i,n,s,r,l,o,d){return this.getBarycoord(e,i,n,s,Dn)===null?(d.x=0,d.y=0,"z"in d&&(d.z=0),"w"in d&&(d.w=0),null):(d.setScalar(0),d.addScaledVector(r,Dn.x),d.addScaledVector(l,Dn.y),d.addScaledVector(o,Dn.z),d)}static getInterpolatedAttribute(e,i,n,s,r,l){return yd.setScalar(0),vd.setScalar(0),bd.setScalar(0),yd.fromBufferAttribute(e,i),vd.fromBufferAttribute(e,n),bd.fromBufferAttribute(e,s),l.setScalar(0),l.addScaledVector(yd,r.x),l.addScaledVector(vd,r.y),l.addScaledVector(bd,r.z),l}static isFrontFacing(e,i,n,s){return Ki.subVectors(n,i),Rn.subVectors(e,i),Ki.cross(Rn).dot(s)<0}set(e,i,n){return this.a.copy(e),this.b.copy(i),this.c.copy(n),this}setFromPointsAndIndices(e,i,n,s){return this.a.copy(e[i]),this.b.copy(e[n]),this.c.copy(e[s]),this}setFromAttributeAndIndices(e,i,n,s){return this.a.fromBufferAttribute(e,i),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,s),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return Ki.subVectors(this.c,this.b),Rn.subVectors(this.a,this.b),Ki.cross(Rn).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Hi.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,i){return Hi.getBarycoord(e,this.a,this.b,this.c,i)}getInterpolation(e,i,n,s,r){return Hi.getInterpolation(e,this.a,this.b,this.c,i,n,s,r)}containsPoint(e){return Hi.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Hi.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,i){const n=this.a,s=this.b,r=this.c;let l,o;or.subVectors(s,n),ar.subVectors(r,n),md.subVectors(e,n);const d=or.dot(md),u=ar.dot(md);if(d<=0&&u<=0)return i.copy(n);pd.subVectors(e,s);const h=or.dot(pd),c=ar.dot(pd);if(h>=0&&c<=h)return i.copy(s);const f=d*c-h*u;if(f<=0&&d>=0&&h<=0)return l=d/(d-h),i.copy(n).addScaledVector(or,l);gd.subVectors(e,r);const g=or.dot(gd),y=ar.dot(gd);if(y>=0&&g<=y)return i.copy(r);const T=g*u-d*y;if(T<=0&&u>=0&&y<=0)return o=u/(u-y),i.copy(n).addScaledVector(ar,o);const _=h*y-g*c;if(_<=0&&c-h>=0&&g-y>=0)return Rf.subVectors(r,s),o=(c-h)/(c-h+(g-y)),i.copy(s).addScaledVector(Rf,o);const v=1/(_+T+f);return l=T*v,o=f*v,i.copy(n).addScaledVector(or,l).addScaledVector(ar,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}class _s{constructor(e=new V(1/0,1/0,1/0),i=new V(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=i}set(e,i){return this.min.copy(e),this.max.copy(i),this}setFromArray(e){this.makeEmpty();for(let i=0,n=e.length;i=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,i){return i.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Yi),Yi.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let i,n;return e.normal.x>0?(i=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(i=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(i+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(i+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(i+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(i+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),i<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(eo),ha.subVectors(this.max,eo),lr.subVectors(e.a,eo),dr.subVectors(e.b,eo),ur.subVectors(e.c,eo),ss.subVectors(dr,lr),rs.subVectors(ur,dr),Es.subVectors(lr,ur);let i=[0,-ss.z,ss.y,0,-rs.z,rs.y,0,-Es.z,Es.y,ss.z,0,-ss.x,rs.z,0,-rs.x,Es.z,0,-Es.x,-ss.y,ss.x,0,-rs.y,rs.x,0,-Es.y,Es.x,0];return!_d(i,lr,dr,ur,ha)||(i=[1,0,0,0,1,0,0,0,1],!_d(i,lr,dr,ur,ha))?!1:(fa.crossVectors(ss,rs),i=[fa.x,fa.y,fa.z],_d(i,lr,dr,ur,ha))}clampPoint(e,i){return i.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Yi).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Yi).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(In[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),In[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),In[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),In[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),In[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),In[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),In[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),In[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(In),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const In=[new V,new V,new V,new V,new V,new V,new V,new V],Yi=new V,ca=new _s,lr=new V,dr=new V,ur=new V,ss=new V,rs=new V,Es=new V,eo=new V,ha=new V,fa=new V,Cs=new V;function _d(t,e,i,n,s){for(let r=0,l=t.length-3;r<=l;r+=3){Cs.fromArray(t,r);const o=s.x*Math.abs(Cs.x)+s.y*Math.abs(Cs.y)+s.z*Math.abs(Cs.z),d=e.dot(Cs),u=i.dot(Cs),h=n.dot(Cs);if(Math.max(-Math.max(d,u,h),Math.min(d,u,h))>o)return!1}return!0}const Yt=new V,ma=new Ye;let iP=0;class ei extends bs{constructor(e,i,n=!1){if(super(),Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:iP++}),this.name="",this.array=e,this.itemSize=i,this.count=e!==void 0?e.length/i:0,this.normalized=n,this.usage=Ju,this.updateRanges=[],this.gpuType=_n,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,i){this.updateRanges.push({start:e,count:i})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,i,n){e*=this.itemSize,n*=i.itemSize;for(let s=0,r=this.itemSize;sthis.radius*this.radius&&(i.sub(this.center).normalize(),i.multiplyScalar(this.radius).add(this.center)),i}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;to.subVectors(e,this.center);const i=to.lengthSq();if(i>this.radius*this.radius){const n=Math.sqrt(i),s=(n-this.radius)*.5;this.center.addScaledVector(to,s/n),this.radius+=s}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Sd.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(to.copy(e.center).add(Sd)),this.expandByPoint(to.copy(e.center).sub(Sd))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}let sP=0;const $i=new At,wd=new ti,cr=new V,Ii=new _s,io=new _s,si=new V;class zt extends bs{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:sP++}),this.uuid=Hn(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(MM(e)?Lg:kg)(e,1):this.index=e,this}setIndirect(e,i=0){return this.indirect=e,this.indirectOffset=i,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,i){return this.attributes[e]=i,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,i,n=0){this.groups.push({start:e,count:i,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,i){this.drawRange.start=e,this.drawRange.count=i}applyMatrix4(e){const i=this.attributes.position;i!==void 0&&(i.applyMatrix4(e),i.needsUpdate=!0);const n=this.attributes.normal;if(n!==void 0){const r=new dt().getNormalMatrix(e);n.applyNormalMatrix(r),n.needsUpdate=!0}const s=this.attributes.tangent;return s!==void 0&&(s.transformDirection(e),s.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(e){return $i.makeRotationFromQuaternion(e),this.applyMatrix4($i),this}rotateX(e){return $i.makeRotationX(e),this.applyMatrix4($i),this}rotateY(e){return $i.makeRotationY(e),this.applyMatrix4($i),this}rotateZ(e){return $i.makeRotationZ(e),this.applyMatrix4($i),this}translate(e,i,n){return $i.makeTranslation(e,i,n),this.applyMatrix4($i),this}scale(e,i,n){return $i.makeScale(e,i,n),this.applyMatrix4($i),this}lookAt(e){return wd.lookAt(e),wd.updateMatrix(),this.applyMatrix4(wd.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(cr).negate(),this.translate(cr.x,cr.y,cr.z),this}setFromPoints(e){const i=this.getAttribute("position");if(i===void 0){const n=[];for(let s=0,r=e.length;si.count&&tt("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),i.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new _s);const e=this.attributes.position,i=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){vt("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new V(-1/0,-1/0,-1/0),new V(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),i)for(let n=0,s=i.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const d=this.parameters;for(const u in d)d[u]!==void 0&&(e[u]=d[u]);return e}e.data={attributes:{}};const i=this.index;i!==null&&(e.data.index={type:i.array.constructor.name,array:Array.prototype.slice.call(i.array)});const n=this.attributes;for(const d in n){const u=n[d];e.data.attributes[d]=u.toJSON(e.data)}const s={};let r=!1;for(const d in this.morphAttributes){const u=this.morphAttributes[d],h=[];for(let c=0,f=u.length;c0&&(s[d]=h,r=!0)}r&&(e.data.morphAttributes=s,e.data.morphTargetsRelative=this.morphTargetsRelative);const l=this.groups;l.length>0&&(e.data.groups=JSON.parse(JSON.stringify(l)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const i={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const s=e.attributes;for(const u in s){const h=s[u];this.setAttribute(u,h.clone(i))}const r=e.morphAttributes;for(const u in r){const h=[],c=r[u];for(let f=0,g=c.length;f0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const i in e){const n=e[i];if(n===void 0){tt(`Material: parameter '${i}' has value of undefined.`);continue}const s=this[i];if(s===void 0){tt(`Material: '${i}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[i]=n}}toJSON(e){const i=e===void 0||typeof e=="string";i&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ir&&(n.blending=this.blending),this.side!==Kn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==cu&&(n.blendSrc=this.blendSrc),this.blendDst!==hu&&(n.blendDst=this.blendDst),this.blendEquation!==Ns&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==zr&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==vf&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==tr&&(n.stencilFail=this.stencilFail),this.stencilZFail!==tr&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==tr&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.allowOverride===!1&&(n.allowOverride=!1),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const l=[];for(const o in r){const d=r[o];delete d.metadata,l.push(d)}return l}if(i){const r=s(e.textures),l=s(e.images);r.length>0&&(n.textures=r),l.length>0&&(n.images=l)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const i=e.clippingPlanes;let n=null;if(i!==null){const s=i.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=i[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Dg extends An{constructor(e){super(),this.isSpriteMaterial=!0,this.type="SpriteMaterial",this.color=new ze(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}}let hr;const no=new V,fr=new V,mr=new V,pr=new Ye,so=new Ye,Ig=new At,pa=new V,ro=new V,ga=new V,Df=new Ye,Md=new Ye,If=new Ye;class oP extends ti{constructor(e=new Dg){if(super(),this.isSprite=!0,this.type="Sprite",hr===void 0){hr=new zt;const i=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),n=new Rg(i,5);hr.setIndex([0,1,2,0,2,3]),hr.setAttribute("position",new wn(n,3,0,!1)),hr.setAttribute("uv",new wn(n,2,3,!1))}this.geometry=hr,this.material=e,this.center=new Ye(.5,.5),this.count=1}raycast(e,i){e.camera===null&&vt('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),fr.setFromMatrixScale(this.matrixWorld),Ig.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),mr.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&this.material.sizeAttenuation===!1&&fr.multiplyScalar(-mr.z);const n=this.material.rotation;let s,r;n!==0&&(r=Math.cos(n),s=Math.sin(n));const l=this.center;ya(pa.set(-.5,-.5,0),mr,l,fr,s,r),ya(ro.set(.5,-.5,0),mr,l,fr,s,r),ya(ga.set(.5,.5,0),mr,l,fr,s,r),Df.set(0,0),Md.set(1,0),If.set(1,1);let o=e.ray.intersectTriangle(pa,ro,ga,!1,no);if(o===null&&(ya(ro.set(-.5,.5,0),mr,l,fr,s,r),Md.set(0,1),o=e.ray.intersectTriangle(pa,ga,ro,!1,no),o===null))return;const d=e.ray.origin.distanceTo(no);de.far||i.push({distance:d,point:no.clone(),uv:Hi.getInterpolation(no,pa,ro,ga,Df,Md,If,new Ye),face:null,object:this})}copy(e,i){return super.copy(e,i),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function ya(t,e,i,n,s,r){pr.subVectors(t,i).addScalar(.5).multiply(n),s!==void 0?(so.x=r*pr.x-s*pr.y,so.y=s*pr.x+r*pr.y):so.copy(pr),t.copy(e),t.x+=so.x,t.y+=so.y,t.applyMatrix4(Ig)}const Fn=new V,Pd=new V,va=new V,os=new V,xd=new V,ba=new V,Td=new V;class Xo{constructor(e=new V,i=new V(0,0,-1)){this.origin=e,this.direction=i}set(e,i){return this.origin.copy(e),this.direction.copy(i),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,i){return i.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,Fn)),this}closestPointToPoint(e,i){i.subVectors(e,this.origin);const n=i.dot(this.direction);return n<0?i.copy(this.origin):i.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const i=Fn.subVectors(e,this.origin).dot(this.direction);return i<0?this.origin.distanceToSquared(e):(Fn.copy(this.origin).addScaledVector(this.direction,i),Fn.distanceToSquared(e))}distanceSqToSegment(e,i,n,s){Pd.copy(e).add(i).multiplyScalar(.5),va.copy(i).sub(e).normalize(),os.copy(this.origin).sub(Pd);const r=e.distanceTo(i)*.5,l=-this.direction.dot(va),o=os.dot(this.direction),d=-os.dot(va),u=os.lengthSq(),h=Math.abs(1-l*l);let c,f,g,y;if(h>0)if(c=l*d-o,f=l*o-d,y=r*h,c>=0)if(f>=-y)if(f<=y){const T=1/h;c*=T,f*=T,g=c*(c+l*f+2*o)+f*(l*c+f+2*d)+u}else f=r,c=Math.max(0,-(l*f+o)),g=-c*c+f*(f+2*d)+u;else f=-r,c=Math.max(0,-(l*f+o)),g=-c*c+f*(f+2*d)+u;else f<=-y?(c=Math.max(0,-(-l*r+o)),f=c>0?-r:Math.min(Math.max(-r,-d),r),g=-c*c+f*(f+2*d)+u):f<=y?(c=0,f=Math.min(Math.max(-r,-d),r),g=f*(f+2*d)+u):(c=Math.max(0,-(l*r+o)),f=c>0?r:Math.min(Math.max(-r,-d),r),g=-c*c+f*(f+2*d)+u);else f=l>0?-r:r,c=Math.max(0,-(l*f+o)),g=-c*c+f*(f+2*d)+u;return n&&n.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(Pd).addScaledVector(va,f),g}intersectSphere(e,i){Fn.subVectors(e.center,this.origin);const n=Fn.dot(this.direction),s=Fn.dot(Fn)-n*n,r=e.radius*e.radius;if(s>r)return null;const l=Math.sqrt(r-s),o=n-l,d=n+l;return d<0?null:o<0?this.at(d,i):this.at(o,i)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const i=e.normal.dot(this.direction);if(i===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/i;return n>=0?n:null}intersectPlane(e,i){const n=this.distanceToPlane(e);return n===null?null:this.at(n,i)}intersectsPlane(e){const i=e.distanceToPoint(this.origin);return i===0||e.normal.dot(this.direction)*i<0}intersectBox(e,i){let n,s,r,l,o,d;const u=1/this.direction.x,h=1/this.direction.y,c=1/this.direction.z,f=this.origin;return u>=0?(n=(e.min.x-f.x)*u,s=(e.max.x-f.x)*u):(n=(e.max.x-f.x)*u,s=(e.min.x-f.x)*u),h>=0?(r=(e.min.y-f.y)*h,l=(e.max.y-f.y)*h):(r=(e.max.y-f.y)*h,l=(e.min.y-f.y)*h),n>l||r>s||((r>n||isNaN(n))&&(n=r),(l=0?(o=(e.min.z-f.z)*c,d=(e.max.z-f.z)*c):(o=(e.max.z-f.z)*c,d=(e.min.z-f.z)*c),n>d||o>s)||((o>n||n!==n)&&(n=o),(d=0?n:s,i)}intersectsBox(e){return this.intersectBox(e,Fn)!==null}intersectTriangle(e,i,n,s,r){xd.subVectors(i,e),ba.subVectors(n,e),Td.crossVectors(xd,ba);let l=this.direction.dot(Td),o;if(l>0){if(s)return null;o=1}else if(l<0)o=-1,l=-l;else return null;os.subVectors(this.origin,e);const d=o*this.direction.dot(ba.crossVectors(os,ba));if(d<0)return null;const u=o*this.direction.dot(xd.cross(os));if(u<0||d+u>l)return null;const h=-o*os.dot(Td);return h<0?null:this.at(h/l,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class Os extends An{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new ze(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Tn,this.combine=Il,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ff=new At,ks=new Xo,_a=new Ss,Nf=new V,Sa=new V,wa=new V,Ma=new V,Ad=new V,Pa=new V,Of=new V,xa=new V;class $t extends ti{constructor(e=new zt,i=new Os){super(),this.isMesh=!0,this.type="Mesh",this.geometry=e,this.material=i,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,i){return super.copy(e,i),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){const i=this.geometry.morphAttributes,n=Object.keys(i);if(n.length>0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;r(e.far-e.near)**2))&&(Ff.copy(r).invert(),ks.copy(e.ray).applyMatrix4(Ff),!(n.boundingBox!==null&&ks.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,i,ks)))}_computeIntersections(e,i,n){let s;const r=this.geometry,l=this.material,o=r.index,d=r.attributes.position,u=r.attributes.uv,h=r.attributes.uv1,c=r.attributes.normal,f=r.groups,g=r.drawRange;if(o!==null)if(Array.isArray(l))for(let y=0,T=f.length;yi.far?null:{distance:u,point:xa.clone(),object:t}}function Ta(t,e,i,n,s,r,l,o,d,u){t.getVertexPosition(o,Sa),t.getVertexPosition(d,wa),t.getVertexPosition(u,Ma);const h=aP(t,e,i,n,Sa,wa,Ma,Of);if(h){const c=new V;Hi.getBarycoord(Of,Sa,wa,Ma,c),s&&(h.uv=Hi.getInterpolatedAttribute(s,o,d,u,c,new Ye)),r&&(h.uv1=Hi.getInterpolatedAttribute(r,o,d,u,c,new Ye)),l&&(h.normal=Hi.getInterpolatedAttribute(l,o,d,u,c,new V),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const f={a:o,b:d,c:u,normal:new V,materialIndex:0};Hi.getNormal(Sa,wa,Ma,f.normal),h.face=f,h.barycoord=c}return h}class lP extends ui{constructor(e=null,i=1,n=1,s,r,l,o,d,u=di,h=di,c,f){super(null,l,o,d,u,h,s,r,c,f),this.isDataTexture=!0,this.image={data:e,width:i,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Aa extends ei{constructor(e,i,n,s=1){super(e,i,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}toJSON(){const e=super.toJSON();return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}const Ed=new V,dP=new V,uP=new dt;class Un{constructor(e=new V(1,0,0),i=0){this.isPlane=!0,this.normal=e,this.constant=i}set(e,i){return this.normal.copy(e),this.constant=i,this}setComponents(e,i,n,s){return this.normal.set(e,i,n),this.constant=s,this}setFromNormalAndCoplanarPoint(e,i){return this.normal.copy(e),this.constant=-i.dot(this.normal),this}setFromCoplanarPoints(e,i,n){const s=Ed.subVectors(n,i).cross(dP.subVectors(e,i)).normalize();return this.setFromNormalAndCoplanarPoint(s,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,i){return i.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,i,n=!0){const s=e.delta(Ed),r=this.normal.dot(s);if(r===0)return this.distanceToPoint(e.start)===0?i.copy(e.start):null;const l=-(e.start.dot(this.normal)+this.constant)/r;return n===!0&&(l<0||l>1)?null:i.copy(e.start).addScaledVector(s,l)}intersectsLine(e){const i=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return i<0&&n>0||n<0&&i>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,i){const n=i||uP.getNormalMatrix(e),s=this.coplanarPoint(Ed).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Ls=new Ss,cP=new Ye(.5,.5),Ea=new V;class Wc{constructor(e=new Un,i=new Un,n=new Un,s=new Un,r=new Un,l=new Un){this.planes=[e,i,n,s,r,l]}set(e,i,n,s,r,l){const o=this.planes;return o[0].copy(e),o[1].copy(i),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(l),this}copy(e){const i=this.planes;for(let n=0;n<6;n++)i[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,i=Sn,n=!1){const s=this.planes,r=e.elements,l=r[0],o=r[1],d=r[2],u=r[3],h=r[4],c=r[5],f=r[6],g=r[7],y=r[8],T=r[9],_=r[10],v=r[11],S=r[12],w=r[13],x=r[14],k=r[15];if(s[0].setComponents(u-l,g-h,v-y,k-S).normalize(),s[1].setComponents(u+l,g+h,v+y,k+S).normalize(),s[2].setComponents(u+o,g+c,v+T,k+w).normalize(),s[3].setComponents(u-o,g-c,v-T,k-w).normalize(),n)s[4].setComponents(d,f,_,x).normalize(),s[5].setComponents(u-d,g-f,v-_,k-x).normalize();else if(s[4].setComponents(u-d,g-f,v-_,k-x).normalize(),i===Sn)s[5].setComponents(u+d,g+f,v+_,k+x).normalize();else if(i===Vo)s[5].setComponents(d,f,_,x).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+i);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),Ls.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const i=e.geometry;i.boundingSphere===null&&i.computeBoundingSphere(),Ls.copy(i.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Ls)}intersectsSprite(e){Ls.center.set(0,0,0);const i=cP.distanceTo(e.center);return Ls.radius=.7071067811865476+i,Ls.applyMatrix4(e.matrixWorld),this.intersectsSphere(Ls)}intersectsSphere(e){const i=this.planes,n=e.center,s=-e.radius;for(let r=0;r<6;r++)if(i[r].distanceToPoint(n)0?e.max.x:e.min.x,Ea.y=s.normal.y>0?e.max.y:e.min.y,Ea.z=s.normal.z>0?e.max.z:e.min.z,s.distanceToPoint(Ea)<0)return!1}return!0}containsPoint(e){const i=this.planes;for(let n=0;n<6;n++)if(i[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class Nl extends An{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new ze(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const vl=new V,bl=new V,Uf=new At,oo=new Xo,Ca=new Ss,Cd=new V,Bf=new V;class Fg extends ti{constructor(e=new zt,i=new Nl){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=i,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,i){return super.copy(e,i),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const i=e.attributes.position,n=[0];for(let s=1,r=i.count;s0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;rn)return;Cd.applyMatrix4(t.matrixWorld);const u=e.ray.origin.distanceTo(Cd);if(!(ue.far))return{distance:u,point:Bf.clone().applyMatrix4(t.matrixWorld),index:l,face:null,faceIndex:null,barycoord:null,object:t}}const Vf=new V,zf=new V;class Ng extends Fg{constructor(e,i){super(e,i),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const i=e.attributes.position,n=[];for(let s=0,r=i.count;s0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;rs.far)return;r.push({distance:u,distanceToRay:Math.sqrt(o),point:d,index:e,face:null,faceIndex:null,barycoord:null,object:l})}}class Ug extends ui{constructor(e=[],i=qs,n,s,r,l,o,d,u,h){super(e,i,n,s,r,l,o,d,u,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Bg extends ui{constructor(e,i,n,s,r,l,o,d,u){super(e,i,n,s,r,l,o,d,u),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Gr extends ui{constructor(e,i,n=Pn,s,r,l,o=di,d=di,u,h=Yn,c=1){if(h!==Yn&&h!==Vs)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const f={width:e,height:i,depth:c};super(f,s,r,l,o,d,h,n,u),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new zc(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const i=super.toJSON(e);return this.compareFunction!==null&&(i.compareFunction=this.compareFunction),i}}class hP extends Gr{constructor(e,i=Pn,n=qs,s,r,l=di,o=di,d,u=Yn){const h={width:e,height:e,depth:1},c=[h,h,h,h,h,h];super(e,e,i,n,s,r,l,o,d,u),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}}class Vg extends ui{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class Xs extends zt{constructor(e=1,i=1,n=1,s=1,r=1,l=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:i,depth:n,widthSegments:s,heightSegments:r,depthSegments:l};const o=this;s=Math.floor(s),r=Math.floor(r),l=Math.floor(l);const d=[],u=[],h=[],c=[];let f=0,g=0;y("z","y","x",-1,-1,n,i,e,l,r,0),y("z","y","x",1,-1,n,i,-e,l,r,1),y("x","z","y",1,1,e,n,i,s,l,2),y("x","z","y",1,-1,e,n,-i,s,l,3),y("x","y","z",1,-1,e,i,n,s,r,4),y("x","y","z",-1,-1,e,i,-n,s,r,5),this.setIndex(d),this.setAttribute("position",new Pt(u,3)),this.setAttribute("normal",new Pt(h,3)),this.setAttribute("uv",new Pt(c,2));function y(T,_,v,S,w,x,k,E,D,P,M){const F=x/D,I=k/P,C=x/2,z=k/2,K=E/2,$=D+1,W=P+1;let q=0,te=0;const he=new V;for(let Pe=0;Pe0?1:-1,h.push(he.x,he.y,he.z),c.push(Ie/D),c.push(1-Pe/P),q+=1}}for(let Pe=0;Pe0&&w(!0),i>0&&w(!1)),this.setIndex(h),this.setAttribute("position",new Pt(c,3)),this.setAttribute("normal",new Pt(f,3)),this.setAttribute("uv",new Pt(g,2));function S(){const x=new V,k=new V;let E=0;const D=(i-e)/n;for(let P=0;P<=r;P++){const M=[],F=P/r,I=F*(i-e)+e;for(let C=0;C<=s;C++){const z=C/s,K=z*d+o,$=Math.sin(K),W=Math.cos(K);k.x=I*$,k.y=-F*n+_,k.z=I*W,c.push(k.x,k.y,k.z),x.set($,D,W).normalize(),f.push(x.x,x.y,x.z),g.push(z,1-F),M.push(y++)}T.push(M)}for(let P=0;P0||M!==0)&&(h.push(F,I,z),E+=3),(i>0||M!==r-1)&&(h.push(I,C,z),E+=3)}u.addGroup(v,E,0),v+=E}function w(x){const k=y,E=new Ye,D=new V;let P=0;const M=x===!0?e:i,F=x===!0?1:-1;for(let C=1;C<=s;C++)c.push(0,_*F,0),f.push(0,F,0),g.push(.5,.5),y++;const I=y;for(let C=0;C<=s;C++){const K=C/s*d+o,$=Math.cos(K),W=Math.sin(K);D.x=M*W,D.y=_*F,D.z=M*$,c.push(D.x,D.y,D.z),f.push(0,F,0),E.x=$*.5+.5,E.y=W*.5*F+.5,g.push(E.x,E.y),y++}for(let C=0;C.9&&D<.1&&(w<.2&&(l[S+0]+=1),x<.2&&(l[S+2]+=1),k<.2&&(l[S+4]+=1))}}function f(S){r.push(S.x,S.y,S.z)}function g(S,w){const x=S*3;w.x=e[x+0],w.y=e[x+1],w.z=e[x+2]}function y(){const S=new V,w=new V,x=new V,k=new V,E=new Ye,D=new Ye,P=new Ye;for(let M=0,F=0;M0)d=s-1;else{d=s;break}if(s=d,n[s]===l)return s/(r-1);const h=n[s],f=n[s+1]-h,g=(l-h)/f;return(s+g)/(r-1)}getTangent(e,i){let s=e-1e-4,r=e+1e-4;s<0&&(s=0),r>1&&(r=1);const l=this.getPoint(s),o=this.getPoint(r),d=i||(l.isVector2?new Ye:new V);return d.copy(o).sub(l).normalize(),d}getTangentAt(e,i){const n=this.getUtoTmapping(e);return this.getTangent(n,i)}computeFrenetFrames(e,i=!1){const n=new V,s=[],r=[],l=[],o=new V,d=new At;for(let g=0;g<=e;g++){const y=g/e;s[g]=this.getTangentAt(y,new V)}r[0]=new V,l[0]=new V;let u=Number.MAX_VALUE;const h=Math.abs(s[0].x),c=Math.abs(s[0].y),f=Math.abs(s[0].z);h<=u&&(u=h,n.set(1,0,0)),c<=u&&(u=c,n.set(0,1,0)),f<=u&&n.set(0,0,1),o.crossVectors(s[0],n).normalize(),r[0].crossVectors(s[0],o),l[0].crossVectors(s[0],r[0]);for(let g=1;g<=e;g++){if(r[g]=r[g-1].clone(),l[g]=l[g-1].clone(),o.crossVectors(s[g-1],s[g]),o.length()>Number.EPSILON){o.normalize();const y=Math.acos(rt(s[g-1].dot(s[g]),-1,1));r[g].applyMatrix4(d.makeRotationAxis(o,y))}l[g].crossVectors(s[g],r[g])}if(i===!0){let g=Math.acos(rt(r[0].dot(r[e]),-1,1));g/=e,s[0].dot(o.crossVectors(r[0],r[e]))>0&&(g=-g);for(let y=1;y<=e;y++)r[y].applyMatrix4(d.makeRotationAxis(s[y],g*y)),l[y].crossVectors(s[y],r[y])}return{tangents:s,normals:r,binormals:l}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}function Kc(){let t=0,e=0,i=0,n=0;function s(r,l,o,d){t=r,e=o,i=-3*r+3*l-2*o-d,n=2*r-2*l+o+d}return{initCatmullRom:function(r,l,o,d,u){s(l,o,u*(o-r),u*(d-l))},initNonuniformCatmullRom:function(r,l,o,d,u,h,c){let f=(l-r)/u-(o-r)/(u+h)+(o-l)/h,g=(o-l)/h-(d-l)/(h+c)+(d-o)/c;f*=h,g*=h,s(l,o,f,g)},calc:function(r){const l=r*r,o=l*r;return t+e*r+i*l+n*o}}}const Wf=new V,qf=new V,kd=new Kc,Ld=new Kc,Rd=new Kc;class mP extends fP{constructor(e=[],i=!1,n="centripetal",s=.5){super(),this.isCatmullRomCurve3=!0,this.type="CatmullRomCurve3",this.points=e,this.closed=i,this.curveType=n,this.tension=s}getPoint(e,i=new V){const n=i,s=this.points,r=s.length,l=(r-(this.closed?0:1))*e;let o=Math.floor(l),d=l-o;this.closed?o+=o>0?0:(Math.floor(Math.abs(o)/r)+1)*r:d===0&&o===r-1&&(o=r-2,d=1);let u,h;this.closed||o>0?u=s[(o-1)%r]:(qf.subVectors(s[0],s[1]).add(s[0]),u=qf);const c=s[o%r],f=s[(o+1)%r];if(this.closed||o+20)&&g.push(w,x,E),(v!==n-1||d=0;--e)if(t[e]>=65535)return!0;return!1}function ra(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Kx(){const t=ra("canvas");return t.style.display="block",t}const dp={};function Nl(...t){const e="THREE."+t.shift();console.log(e,...t)}function My(t){const e=t[0];if(typeof e=="string"&&e.startsWith("TSL:")){const i=t[1];i&&i.isStackTrace?t[0]+=" "+i.getLocation():t[1]='Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.'}return t}function tt(...t){t=My(t);const e="THREE."+t.shift();{const i=t[0];i&&i.isStackTrace?console.warn(i.getError(e)):console.warn(e,...t)}}function bt(...t){t=My(t);const e="THREE."+t.shift();{const i=t[0];i&&i.isStackTrace?console.error(i.getError(e)):console.error(e,...t)}}function Ac(...t){const e=t.join(" ");e in dp||(dp[e]=!0,tt(...t))}function Yx(t,e,i){return new Promise(function(n,s){function r(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:s();break;case t.TIMEOUT_EXPIRED:setTimeout(r,i);break;default:n()}}setTimeout(r,i)})}const Jx={[$d]:Gd,[Hd]:jd,[Wd]:Xd,[to]:qd,[Gd]:$d,[jd]:Hd,[Xd]:Wd,[qd]:to};class As{addEventListener(e,i){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(i)===-1&&n[e].push(i)}hasEventListener(e,i){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(i)!==-1}removeEventListener(e,i){const n=this._listeners;if(n===void 0)return;const s=n[e];if(s!==void 0){const r=s.indexOf(i);r!==-1&&s.splice(r,1)}}dispatchEvent(e){const i=this._listeners;if(i===void 0)return;const n=i[e.type];if(n!==void 0){e.target=this;const s=n.slice(0);for(let r=0,l=s.length;r>8&255]+gi[t>>16&255]+gi[t>>24&255]+"-"+gi[e&255]+gi[e>>8&255]+"-"+gi[e>>16&15|64]+gi[e>>24&255]+"-"+gi[i&63|128]+gi[i>>8&255]+"-"+gi[i>>16&255]+gi[i>>24&255]+gi[n&255]+gi[n>>8&255]+gi[n>>16&255]+gi[n>>24&255]).toLowerCase()}function rt(t,e,i){return Math.max(e,Math.min(i,t))}function Ph(t,e){return(t%e+e)%e}function Zx(t,e,i,n,s){return n+(t-e)*(s-n)/(i-e)}function Qx(t,e,i){return t!==e?(i-t)/(e-t):0}function Go(t,e,i){return(1-i)*t+i*e}function eP(t,e,i,n){return Go(t,e,1-Math.exp(-i*n))}function tP(t,e=1){return e-Math.abs(Ph(t,e*2)-e)}function iP(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e),t*t*(3-2*t))}function nP(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e),t*t*t*(t*(t*6-15)+10))}function sP(t,e){return t+Math.floor(Math.random()*(e-t+1))}function rP(t,e){return t+Math.random()*(e-t)}function oP(t){return t*(.5-Math.random())}function aP(t){t!==void 0&&(cp=t);let e=cp+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function lP(t){return t*$o}function uP(t){return t*oa}function dP(t){return(t&t-1)===0&&t!==0}function cP(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function hP(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function mP(t,e,i,n,s){const r=Math.cos,l=Math.sin,o=r(i/2),u=l(i/2),c=r((e+n)/2),h=l((e+n)/2),d=r((e-n)/2),m=l((e-n)/2),g=r((n-e)/2),b=l((n-e)/2);switch(s){case"XYX":t.set(o*h,u*d,u*m,o*c);break;case"YZY":t.set(u*m,o*h,u*d,o*c);break;case"ZXZ":t.set(u*d,u*m,o*h,o*c);break;case"XZX":t.set(o*h,u*b,u*g,o*c);break;case"YXY":t.set(u*g,o*h,u*b,o*c);break;case"ZYZ":t.set(u*b,u*g,o*h,o*c);break;default:tt("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+s)}}function nn(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function kt(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(t*4294967295);case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int32Array:return Math.round(t*2147483647);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}const Ol={DEG2RAD:$o,RAD2DEG:oa,generateUUID:Yn,clamp:rt,euclideanModulo:Ph,mapLinear:Zx,inverseLerp:Qx,lerp:Go,damp:eP,pingpong:tP,smoothstep:iP,smootherstep:nP,randInt:sP,randFloat:rP,randFloatSpread:oP,seededRandom:aP,degToRad:lP,radToDeg:uP,isPowerOfTwo:dP,ceilPowerOfTwo:cP,floorPowerOfTwo:hP,setQuaternionFromProperEuler:mP,normalize:kt,denormalize:nn},$h=class $h{constructor(e=0,i=0){this.x=e,this.y=i}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,i){return this.x=e,this.y=i,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const i=this.x,n=this.y,s=e.elements;return this.x=s[0]*i+s[3]*n+s[6],this.y=s[1]*i+s[4]*n+s[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const i=Math.sqrt(this.lengthSq()*e.lengthSq());if(i===0)return Math.PI/2;const n=this.dot(e)/i;return Math.acos(rt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const i=this.x-e.x,n=this.y-e.y;return i*i+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this}rotateAround(e,i){const n=Math.cos(i),s=Math.sin(i),r=this.x-e.x,l=this.y-e.y;return this.x=r*n-l*s+e.x,this.y=r*s+l*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}};$h.prototype.isVector2=!0;let Xe=$h;class ns{constructor(e=0,i=0,n=0,s=1){this.isQuaternion=!0,this._x=e,this._y=i,this._z=n,this._w=s}static slerpFlat(e,i,n,s,r,l,o){let u=n[s+0],c=n[s+1],h=n[s+2],d=n[s+3],m=r[l+0],g=r[l+1],b=r[l+2],w=r[l+3];if(d!==w||u!==m||c!==g||h!==b){let v=u*m+c*g+h*b+d*w;v<0&&(m=-m,g=-g,b=-b,w=-w,v=-v);let y=1-o;if(v<.9995){const S=Math.acos(v),P=Math.sin(S);y=Math.sin(y*S)/P,o=Math.sin(o*S)/P,u=u*y+m*o,c=c*y+g*o,h=h*y+b*o,d=d*y+w*o}else{u=u*y+m*o,c=c*y+g*o,h=h*y+b*o,d=d*y+w*o;const S=1/Math.sqrt(u*u+c*c+h*h+d*d);u*=S,c*=S,h*=S,d*=S}}e[i]=u,e[i+1]=c,e[i+2]=h,e[i+3]=d}static multiplyQuaternionsFlat(e,i,n,s,r,l){const o=n[s],u=n[s+1],c=n[s+2],h=n[s+3],d=r[l],m=r[l+1],g=r[l+2],b=r[l+3];return e[i]=o*b+h*d+u*g-c*m,e[i+1]=u*b+h*m+c*d-o*g,e[i+2]=c*b+h*g+o*m-u*d,e[i+3]=h*b-o*d-u*m-c*g,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,i,n,s){return this._x=e,this._y=i,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,i=!0){const n=e._x,s=e._y,r=e._z,l=e._order,o=Math.cos,u=Math.sin,c=o(n/2),h=o(s/2),d=o(r/2),m=u(n/2),g=u(s/2),b=u(r/2);switch(l){case"XYZ":this._x=m*h*d+c*g*b,this._y=c*g*d-m*h*b,this._z=c*h*b+m*g*d,this._w=c*h*d-m*g*b;break;case"YXZ":this._x=m*h*d+c*g*b,this._y=c*g*d-m*h*b,this._z=c*h*b-m*g*d,this._w=c*h*d+m*g*b;break;case"ZXY":this._x=m*h*d-c*g*b,this._y=c*g*d+m*h*b,this._z=c*h*b+m*g*d,this._w=c*h*d-m*g*b;break;case"ZYX":this._x=m*h*d-c*g*b,this._y=c*g*d+m*h*b,this._z=c*h*b-m*g*d,this._w=c*h*d+m*g*b;break;case"YZX":this._x=m*h*d+c*g*b,this._y=c*g*d+m*h*b,this._z=c*h*b-m*g*d,this._w=c*h*d-m*g*b;break;case"XZY":this._x=m*h*d-c*g*b,this._y=c*g*d-m*h*b,this._z=c*h*b+m*g*d,this._w=c*h*d+m*g*b;break;default:tt("Quaternion: .setFromEuler() encountered an unknown order: "+l)}return i===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,i){const n=i/2,s=Math.sin(n);return this._x=e.x*s,this._y=e.y*s,this._z=e.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const i=e.elements,n=i[0],s=i[4],r=i[8],l=i[1],o=i[5],u=i[9],c=i[2],h=i[6],d=i[10],m=n+o+d;if(m>0){const g=.5/Math.sqrt(m+1);this._w=.25/g,this._x=(h-u)*g,this._y=(r-c)*g,this._z=(l-s)*g}else if(n>o&&n>d){const g=2*Math.sqrt(1+n-o-d);this._w=(h-u)/g,this._x=.25*g,this._y=(s+l)/g,this._z=(r+c)/g}else if(o>d){const g=2*Math.sqrt(1+o-n-d);this._w=(r-c)/g,this._x=(s+l)/g,this._y=.25*g,this._z=(u+h)/g}else{const g=2*Math.sqrt(1+d-n-o);this._w=(l-s)/g,this._x=(r+c)/g,this._y=(u+h)/g,this._z=.25*g}return this._onChangeCallback(),this}setFromUnitVectors(e,i){let n=e.dot(i)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*i.z-e.z*i.y,this._y=e.z*i.x-e.x*i.z,this._z=e.x*i.y-e.y*i.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(rt(this.dot(e),-1,1)))}rotateTowards(e,i){const n=this.angleTo(e);if(n===0)return this;const s=Math.min(1,i/n);return this.slerp(e,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,i){const n=e._x,s=e._y,r=e._z,l=e._w,o=i._x,u=i._y,c=i._z,h=i._w;return this._x=n*h+l*o+s*c-r*u,this._y=s*h+l*u+r*o-n*c,this._z=r*h+l*c+n*u-s*o,this._w=l*h-n*o-s*u-r*c,this._onChangeCallback(),this}slerp(e,i){let n=e._x,s=e._y,r=e._z,l=e._w,o=this.dot(e);o<0&&(n=-n,s=-s,r=-r,l=-l,o=-o);let u=1-i;if(o<.9995){const c=Math.acos(o),h=Math.sin(c);u=Math.sin(u*c)/h,i=Math.sin(i*c)/h,this._x=this._x*u+n*i,this._y=this._y*u+s*i,this._z=this._z*u+r*i,this._w=this._w*u+l*i,this._onChangeCallback()}else this._x=this._x*u+n*i,this._y=this._y*u+s*i,this._z=this._z*u+r*i,this._w=this._w*u+l*i,this.normalize();return this}slerpQuaternions(e,i,n){return this.copy(e).slerp(i,n)}random(){const e=2*Math.PI*Math.random(),i=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(e),s*Math.cos(e),r*Math.sin(i),r*Math.cos(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,i=0){return this._x=e[i],this._y=e[i+1],this._z=e[i+2],this._w=e[i+3],this._onChangeCallback(),this}toArray(e=[],i=0){return e[i]=this._x,e[i+1]=this._y,e[i+2]=this._z,e[i+3]=this._w,e}fromBufferAttribute(e,i){return this._x=e.getX(i),this._y=e.getY(i),this._z=e.getZ(i),this._w=e.getW(i),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}const Gh=class Gh{constructor(e=0,i=0,n=0){this.x=e,this.y=i,this.z=n}set(e,i,n){return n===void 0&&(n=this.z),this.x=e,this.y=i,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;case 2:this.z=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this.z=e.z+i.z,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this.z+=e.z*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this.z=e.z-i.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,i){return this.x=e.x*i.x,this.y=e.y*i.y,this.z=e.z*i.z,this}applyEuler(e){return this.applyQuaternion(hp.setFromEuler(e))}applyAxisAngle(e,i){return this.applyQuaternion(hp.setFromAxisAngle(e,i))}applyMatrix3(e){const i=this.x,n=this.y,s=this.z,r=e.elements;return this.x=r[0]*i+r[3]*n+r[6]*s,this.y=r[1]*i+r[4]*n+r[7]*s,this.z=r[2]*i+r[5]*n+r[8]*s,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const i=this.x,n=this.y,s=this.z,r=e.elements,l=1/(r[3]*i+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*i+r[4]*n+r[8]*s+r[12])*l,this.y=(r[1]*i+r[5]*n+r[9]*s+r[13])*l,this.z=(r[2]*i+r[6]*n+r[10]*s+r[14])*l,this}applyQuaternion(e){const i=this.x,n=this.y,s=this.z,r=e.x,l=e.y,o=e.z,u=e.w,c=2*(l*s-o*n),h=2*(o*i-r*s),d=2*(r*n-l*i);return this.x=i+u*c+l*d-o*h,this.y=n+u*h+o*c-r*d,this.z=s+u*d+r*h-l*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const i=this.x,n=this.y,s=this.z,r=e.elements;return this.x=r[0]*i+r[4]*n+r[8]*s,this.y=r[1]*i+r[5]*n+r[9]*s,this.z=r[2]*i+r[6]*n+r[10]*s,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this.z=rt(this.z,e.z,i.z),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this.z=rt(this.z,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this.z+=(e.z-this.z)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this.z=e.z+(i.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,i){const n=e.x,s=e.y,r=e.z,l=i.x,o=i.y,u=i.z;return this.x=s*u-r*o,this.y=r*l-n*u,this.z=n*o-s*l,this}projectOnVector(e){const i=e.lengthSq();if(i===0)return this.set(0,0,0);const n=e.dot(this)/i;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return ku.copy(this).projectOnVector(e),this.sub(ku)}reflect(e){return this.sub(ku.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const i=Math.sqrt(this.lengthSq()*e.lengthSq());if(i===0)return Math.PI/2;const n=this.dot(e)/i;return Math.acos(rt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const i=this.x-e.x,n=this.y-e.y,s=this.z-e.z;return i*i+n*n+s*s}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,i,n){const s=Math.sin(i)*e;return this.x=s*Math.sin(n),this.y=Math.cos(i)*e,this.z=s*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,i,n){return this.x=e*Math.sin(i),this.y=n,this.z=e*Math.cos(i),this}setFromMatrixPosition(e){const i=e.elements;return this.x=i[12],this.y=i[13],this.z=i[14],this}setFromMatrixScale(e){const i=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),s=this.setFromMatrixColumn(e,2).length();return this.x=i,this.y=n,this.z=s,this}setFromMatrixColumn(e,i){return this.fromArray(e.elements,i*4)}setFromMatrix3Column(e,i){return this.fromArray(e.elements,i*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this.z=e[i+2],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e[i+2]=this.z,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this.z=e.getZ(i),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,i=Math.random()*2-1,n=Math.sqrt(1-i*i);return this.x=n*Math.cos(e),this.y=i,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}};Gh.prototype.isVector3=!0;let B=Gh;const ku=new B,hp=new ns,Hh=class Hh{constructor(e,i,n,s,r,l,o,u,c){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,i,n,s,r,l,o,u,c)}set(e,i,n,s,r,l,o,u,c){const h=this.elements;return h[0]=e,h[1]=s,h[2]=o,h[3]=i,h[4]=r,h[5]=u,h[6]=n,h[7]=l,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const i=this.elements,n=e.elements;return i[0]=n[0],i[1]=n[1],i[2]=n[2],i[3]=n[3],i[4]=n[4],i[5]=n[5],i[6]=n[6],i[7]=n[7],i[8]=n[8],this}extractBasis(e,i,n){return e.setFromMatrix3Column(this,0),i.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const i=e.elements;return this.set(i[0],i[4],i[8],i[1],i[5],i[9],i[2],i[6],i[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,i){const n=e.elements,s=i.elements,r=this.elements,l=n[0],o=n[3],u=n[6],c=n[1],h=n[4],d=n[7],m=n[2],g=n[5],b=n[8],w=s[0],v=s[3],y=s[6],S=s[1],P=s[4],M=s[7],k=s[2],C=s[5],L=s[8];return r[0]=l*w+o*S+u*k,r[3]=l*v+o*P+u*C,r[6]=l*y+o*M+u*L,r[1]=c*w+h*S+d*k,r[4]=c*v+h*P+d*C,r[7]=c*y+h*M+d*L,r[2]=m*w+g*S+b*k,r[5]=m*v+g*P+b*C,r[8]=m*y+g*M+b*L,this}multiplyScalar(e){const i=this.elements;return i[0]*=e,i[3]*=e,i[6]*=e,i[1]*=e,i[4]*=e,i[7]*=e,i[2]*=e,i[5]*=e,i[8]*=e,this}determinant(){const e=this.elements,i=e[0],n=e[1],s=e[2],r=e[3],l=e[4],o=e[5],u=e[6],c=e[7],h=e[8];return i*l*h-i*o*c-n*r*h+n*o*u+s*r*c-s*l*u}invert(){const e=this.elements,i=e[0],n=e[1],s=e[2],r=e[3],l=e[4],o=e[5],u=e[6],c=e[7],h=e[8],d=h*l-o*c,m=o*u-h*r,g=c*r-l*u,b=i*d+n*m+s*g;if(b===0)return this.set(0,0,0,0,0,0,0,0,0);const w=1/b;return e[0]=d*w,e[1]=(s*c-h*n)*w,e[2]=(o*n-s*l)*w,e[3]=m*w,e[4]=(h*i-s*u)*w,e[5]=(s*r-o*i)*w,e[6]=g*w,e[7]=(n*u-c*i)*w,e[8]=(l*i-n*r)*w,this}transpose(){let e;const i=this.elements;return e=i[1],i[1]=i[3],i[3]=e,e=i[2],i[2]=i[6],i[6]=e,e=i[5],i[5]=i[7],i[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const i=this.elements;return e[0]=i[0],e[1]=i[3],e[2]=i[6],e[3]=i[1],e[4]=i[4],e[5]=i[7],e[6]=i[2],e[7]=i[5],e[8]=i[8],this}setUvTransform(e,i,n,s,r,l,o){const u=Math.cos(r),c=Math.sin(r);return this.set(n*u,n*c,-n*(u*l+c*o)+l+e,-s*c,s*u,-s*(-c*l+u*o)+o+i,0,0,1),this}scale(e,i){return this.premultiply(Ru.makeScale(e,i)),this}rotate(e){return this.premultiply(Ru.makeRotation(-e)),this}translate(e,i){return this.premultiply(Ru.makeTranslation(e,i)),this}makeTranslation(e,i){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,i,0,0,1),this}makeRotation(e){const i=Math.cos(e),n=Math.sin(e);return this.set(i,-n,0,n,i,0,0,0,1),this}makeScale(e,i){return this.set(e,0,0,0,i,0,0,0,1),this}equals(e){const i=this.elements,n=e.elements;for(let s=0;s<9;s++)if(i[s]!==n[s])return!1;return!0}fromArray(e,i=0){for(let n=0;n<9;n++)this.elements[n]=e[n+i];return this}toArray(e=[],i=0){const n=this.elements;return e[i]=n[0],e[i+1]=n[1],e[i+2]=n[2],e[i+3]=n[3],e[i+4]=n[4],e[i+5]=n[5],e[i+6]=n[6],e[i+7]=n[7],e[i+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}};Hh.prototype.isMatrix3=!0;let at=Hh;const Ru=new at,mp=new at().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),pp=new at().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function pP(){const t={enabled:!0,workingColorSpace:Il,spaces:{},convert:function(s,r,l){return this.enabled===!1||r===l||!r||!l||(this.spaces[r].transfer===At&&(s.r=Jn(s.r),s.g=Jn(s.g),s.b=Jn(s.b)),this.spaces[r].primaries!==this.spaces[l].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[l].fromXYZ)),this.spaces[l].transfer===At&&(s.r=Kr(s.r),s.g=Kr(s.g),s.b=Kr(s.b))),s},workingToColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},colorSpaceToWorking:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===_s?Fl:this.spaces[s].transfer},getToneMappingMode:function(s){return this.spaces[s].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,l){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[l].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(s,r){return Ac("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(s,r)},toWorkingColorSpace:function(s,r){return Ac("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(s,r)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],n=[.3127,.329];return t.define({[Il]:{primaries:e,whitePoint:n,transfer:Fl,toXYZ:mp,fromXYZ:pp,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:Ti},outputColorSpaceConfig:{drawingBufferColorSpace:Ti}},[Ti]:{primaries:e,whitePoint:n,transfer:At,toXYZ:mp,fromXYZ:pp,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:Ti}}}),t}const vt=pP();function Jn(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function Kr(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}let hr;class fP{static getDataURL(e,i="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{hr===void 0&&(hr=ra("canvas")),hr.width=e.width,hr.height=e.height;const s=hr.getContext("2d");e instanceof ImageData?s.putImageData(e,0,0):s.drawImage(e,0,0,e.width,e.height),n=hr}return n.toDataURL(i)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const i=ra("canvas");i.width=e.width,i.height=e.height;const n=i.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const s=n.getImageData(0,0,e.width,e.height),r=s.data;for(let l=0;l1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(Du).x}get height(){return this.source.getSize(Du).y}get depth(){return this.source.getSize(Du).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,i){this.updateRanges.push({start:e,count:i})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const i in e){const n=e[i];if(n===void 0){tt(`Texture.setValues(): parameter '${i}' has value of undefined.`);continue}const s=this[i];if(s===void 0){tt(`Texture.setValues(): property '${i}' does not exist.`);continue}s&&n&&s.isVector2&&n.isVector2||s&&n&&s.isVector3&&n.isVector3||s&&n&&s.isMatrix3&&n.isMatrix3?s.copy(n):this[i]=n}}toJSON(e){const i=e===void 0||typeof e=="string";if(!i&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),i||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==gy)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case ea:e.x=e.x-Math.floor(e.x);break;case sn:e.x=e.x<0?0:1;break;case Kd:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case ea:e.y=e.y-Math.floor(e.y);break;case sn:e.y=e.y<0?0:1;break;case Kd:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}mi.DEFAULT_IMAGE=null;mi.DEFAULT_MAPPING=gy;mi.DEFAULT_ANISOTROPY=1;const Wh=class Wh{constructor(e=0,i=0,n=0,s=1){this.x=e,this.y=i,this.z=n,this.w=s}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,i,n,s){return this.x=e,this.y=i,this.z=n,this.w=s,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,i){switch(e){case 0:this.x=i;break;case 1:this.y=i;break;case 2:this.z=i;break;case 3:this.w=i;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,i){return this.x=e.x+i.x,this.y=e.y+i.y,this.z=e.z+i.z,this.w=e.w+i.w,this}addScaledVector(e,i){return this.x+=e.x*i,this.y+=e.y*i,this.z+=e.z*i,this.w+=e.w*i,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,i){return this.x=e.x-i.x,this.y=e.y-i.y,this.z=e.z-i.z,this.w=e.w-i.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const i=this.x,n=this.y,s=this.z,r=this.w,l=e.elements;return this.x=l[0]*i+l[4]*n+l[8]*s+l[12]*r,this.y=l[1]*i+l[5]*n+l[9]*s+l[13]*r,this.z=l[2]*i+l[6]*n+l[10]*s+l[14]*r,this.w=l[3]*i+l[7]*n+l[11]*s+l[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const i=Math.sqrt(1-e.w*e.w);return i<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/i,this.y=e.y/i,this.z=e.z/i),this}setAxisAngleFromRotationMatrix(e){let i,n,s,r;const u=e.elements,c=u[0],h=u[4],d=u[8],m=u[1],g=u[5],b=u[9],w=u[2],v=u[6],y=u[10];if(Math.abs(h-m)<.01&&Math.abs(d-w)<.01&&Math.abs(b-v)<.01){if(Math.abs(h+m)<.1&&Math.abs(d+w)<.1&&Math.abs(b+v)<.1&&Math.abs(c+g+y-3)<.1)return this.set(1,0,0,0),this;i=Math.PI;const P=(c+1)/2,M=(g+1)/2,k=(y+1)/2,C=(h+m)/4,L=(d+w)/4,x=(b+v)/4;return P>M&&P>k?P<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(P),s=C/n,r=L/n):M>k?M<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(M),n=C/s,r=x/s):k<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(k),n=L/r,s=x/r),this.set(n,s,r,i),this}let S=Math.sqrt((v-b)*(v-b)+(d-w)*(d-w)+(m-h)*(m-h));return Math.abs(S)<.001&&(S=1),this.x=(v-b)/S,this.y=(d-w)/S,this.z=(m-h)/S,this.w=Math.acos((c+g+y-1)/2),this}setFromMatrixPosition(e){const i=e.elements;return this.x=i[12],this.y=i[13],this.z=i[14],this.w=i[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,i){return this.x=rt(this.x,e.x,i.x),this.y=rt(this.y,e.y,i.y),this.z=rt(this.z,e.z,i.z),this.w=rt(this.w,e.w,i.w),this}clampScalar(e,i){return this.x=rt(this.x,e,i),this.y=rt(this.y,e,i),this.z=rt(this.z,e,i),this.w=rt(this.w,e,i),this}clampLength(e,i){const n=this.length();return this.divideScalar(n||1).multiplyScalar(rt(n,e,i))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,i){return this.x+=(e.x-this.x)*i,this.y+=(e.y-this.y)*i,this.z+=(e.z-this.z)*i,this.w+=(e.w-this.w)*i,this}lerpVectors(e,i,n){return this.x=e.x+(i.x-e.x)*n,this.y=e.y+(i.y-e.y)*n,this.z=e.z+(i.z-e.z)*n,this.w=e.w+(i.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,i=0){return this.x=e[i],this.y=e[i+1],this.z=e[i+2],this.w=e[i+3],this}toArray(e=[],i=0){return e[i]=this.x,e[i+1]=this.y,e[i+2]=this.z,e[i+3]=this.w,e}fromBufferAttribute(e,i){return this.x=e.getX(i),this.y=e.getY(i),this.z=e.getZ(i),this.w=e.getW(i),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}};Wh.prototype.isVector4=!0;let Et=Wh;class vP extends As{constructor(e=1,i=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Si,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=i,this.depth=n.depth,this.scissor=new Et(0,0,e,i),this.scissorTest=!1,this.viewport=new Et(0,0,e,i),this.textures=[];const s={width:e,height:i,depth:n.depth},r=new mi(s),l=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,e,i),this.scissor.set(0,0,e,i)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let i=0,n=e.textures.length;i>>0}enable(e){this.mask|=1<1){for(let i=0;i1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.pivot!==null&&(s.pivot=this.pivot.toArray()),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.morphTargetDictionary!==void 0&&(s.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(s.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(o=>({...o})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(e),s.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(s.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(s.boundingBox=this.boundingBox.toJSON()));function r(o,u){return o[u.uuid]===void 0&&(o[u.uuid]=u.toJSON(e)),u.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(e.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const u=o.shapes;if(Array.isArray(u))for(let c=0,h=u.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),u.length>0&&(n.materials=u),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),m.length>0&&(n.skeletons=m),g.length>0&&(n.animations=g),b.length>0&&(n.nodes=b)}return n.object=s,n;function l(o){const u=[];for(const c in o){const h=o[c];delete h.metadata,u.push(h)}return u}}clone(e){return new this.constructor().copy(this,e)}copy(e,i=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot!==null?e.pivot.clone():null,this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),i===!0)for(let n=0;ng+b?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&m<=g-b&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else u!==null&&e.gripSpace&&(r=i.getPose(e.gripSpace,n),r!==null&&(u.matrix.fromArray(r.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,r.linearVelocity?(u.hasLinearVelocity=!0,u.linearVelocity.copy(r.linearVelocity)):u.hasLinearVelocity=!1,r.angularVelocity?(u.hasAngularVelocity=!0,u.angularVelocity.copy(r.angularVelocity)):u.hasAngularVelocity=!1,u.eventsEnabled&&u.dispatchEvent({type:"gripUpdated",data:e,target:this})));o!==null&&(s=i.getPose(e.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(TP)))}return o!==null&&(o.visible=s!==null),u!==null&&(u.visible=r!==null),c!==null&&(c.visible=l!==null),this}_getHandJoint(e,i){if(e.joints[i.jointName]===void 0){const n=new Pn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[i.jointName]=n,e.add(n)}return e.joints[i.jointName]}}const Py={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},ds={h:0,s:0,l:0},Ea={h:0,s:0,l:0};function Nu(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+(e-t)*6*i:i<1/2?e:i<2/3?t+(e-t)*6*(2/3-i):t}class Ve{constructor(e,i,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,i,n)}set(e,i,n){if(i===void 0&&n===void 0){const s=e;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(e,i,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,i=Ti){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,vt.colorSpaceToWorking(this,i),this}setRGB(e,i,n,s=vt.workingColorSpace){return this.r=e,this.g=i,this.b=n,vt.colorSpaceToWorking(this,s),this}setHSL(e,i,n,s=vt.workingColorSpace){if(e=Ph(e,1),i=rt(i,0,1),n=rt(n,0,1),i===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+i):n+i-n*i,l=2*n-r;this.r=Nu(l,r,e+1/3),this.g=Nu(l,r,e),this.b=Nu(l,r,e-1/3)}return vt.colorSpaceToWorking(this,s),this}setStyle(e,i=Ti){function n(r){r!==void 0&&parseFloat(r)<1&&tt("Color: Alpha component of "+e+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const l=s[1],o=s[2];switch(l){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,i);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,i);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,i);break;default:tt("Color: Unknown color model "+e)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=s[1],l=r.length;if(l===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,i);if(l===6)return this.setHex(parseInt(r,16),i);tt("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,i);return this}setColorName(e,i=Ti){const n=Py[e.toLowerCase()];return n!==void 0?this.setHex(n,i):tt("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Jn(e.r),this.g=Jn(e.g),this.b=Jn(e.b),this}copyLinearToSRGB(e){return this.r=Kr(e.r),this.g=Kr(e.g),this.b=Kr(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Ti){return vt.workingToColorSpace(yi.copy(this),e),Math.round(rt(yi.r*255,0,255))*65536+Math.round(rt(yi.g*255,0,255))*256+Math.round(rt(yi.b*255,0,255))}getHexString(e=Ti){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,i=vt.workingColorSpace){vt.workingToColorSpace(yi.copy(this),i);const n=yi.r,s=yi.g,r=yi.b,l=Math.max(n,s,r),o=Math.min(n,s,r);let u,c;const h=(o+l)/2;if(o===l)u=0,c=0;else{const d=l-o;switch(c=h<=.5?d/(l+o):d/(2-l-o),l){case n:u=(s-r)/d+(s0&&(i.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(i.object.backgroundIntensity=this.backgroundIntensity),i.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(i.object.environmentIntensity=this.environmentIntensity),i.object.environmentRotation=this.environmentRotation.toArray(),i}}const en=new B,Bn=new B,Ou=new B,zn=new B,gr=new B,yr=new B,wp=new B,Uu=new B,Vu=new B,Bu=new B,zu=new Et,$u=new Et,Gu=new Et;class Yi{constructor(e=new B,i=new B,n=new B){this.a=e,this.b=i,this.c=n}static getNormal(e,i,n,s){s.subVectors(n,i),en.subVectors(e,i),s.cross(en);const r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(e,i,n,s,r){en.subVectors(s,i),Bn.subVectors(n,i),Ou.subVectors(e,i);const l=en.dot(en),o=en.dot(Bn),u=en.dot(Ou),c=Bn.dot(Bn),h=Bn.dot(Ou),d=l*c-o*o;if(d===0)return r.set(0,0,0),null;const m=1/d,g=(c*u-o*h)*m,b=(l*h-o*u)*m;return r.set(1-g-b,b,g)}static containsPoint(e,i,n,s){return this.getBarycoord(e,i,n,s,zn)===null?!1:zn.x>=0&&zn.y>=0&&zn.x+zn.y<=1}static getInterpolation(e,i,n,s,r,l,o,u){return this.getBarycoord(e,i,n,s,zn)===null?(u.x=0,u.y=0,"z"in u&&(u.z=0),"w"in u&&(u.w=0),null):(u.setScalar(0),u.addScaledVector(r,zn.x),u.addScaledVector(l,zn.y),u.addScaledVector(o,zn.z),u)}static getInterpolatedAttribute(e,i,n,s,r,l){return zu.setScalar(0),$u.setScalar(0),Gu.setScalar(0),zu.fromBufferAttribute(e,i),$u.fromBufferAttribute(e,n),Gu.fromBufferAttribute(e,s),l.setScalar(0),l.addScaledVector(zu,r.x),l.addScaledVector($u,r.y),l.addScaledVector(Gu,r.z),l}static isFrontFacing(e,i,n,s){return en.subVectors(n,i),Bn.subVectors(e,i),en.cross(Bn).dot(s)<0}set(e,i,n){return this.a.copy(e),this.b.copy(i),this.c.copy(n),this}setFromPointsAndIndices(e,i,n,s){return this.a.copy(e[i]),this.b.copy(e[n]),this.c.copy(e[s]),this}setFromAttributeAndIndices(e,i,n,s){return this.a.fromBufferAttribute(e,i),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,s),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return en.subVectors(this.c,this.b),Bn.subVectors(this.a,this.b),en.cross(Bn).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Yi.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,i){return Yi.getBarycoord(e,this.a,this.b,this.c,i)}getInterpolation(e,i,n,s,r){return Yi.getInterpolation(e,this.a,this.b,this.c,i,n,s,r)}containsPoint(e){return Yi.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Yi.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,i){const n=this.a,s=this.b,r=this.c;let l,o;gr.subVectors(s,n),yr.subVectors(r,n),Uu.subVectors(e,n);const u=gr.dot(Uu),c=yr.dot(Uu);if(u<=0&&c<=0)return i.copy(n);Vu.subVectors(e,s);const h=gr.dot(Vu),d=yr.dot(Vu);if(h>=0&&d<=h)return i.copy(s);const m=u*d-h*c;if(m<=0&&u>=0&&h<=0)return l=u/(u-h),i.copy(n).addScaledVector(gr,l);Bu.subVectors(e,r);const g=gr.dot(Bu),b=yr.dot(Bu);if(b>=0&&g<=b)return i.copy(r);const w=g*c-u*b;if(w<=0&&c>=0&&b<=0)return o=c/(c-b),i.copy(n).addScaledVector(yr,o);const v=h*b-g*d;if(v<=0&&d-h>=0&&g-b>=0)return wp.subVectors(r,s),o=(d-h)/(d-h+(g-b)),i.copy(s).addScaledVector(wp,o);const y=1/(v+w+m);return l=w*y,o=m*y,i.copy(n).addScaledVector(gr,l).addScaledVector(yr,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}class Dn{constructor(e=new B(1/0,1/0,1/0),i=new B(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=i}set(e,i){return this.min.copy(e),this.max.copy(i),this}setFromArray(e){this.makeEmpty();for(let i=0,n=e.length;i=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,i){return i.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,tn),tn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let i,n;return e.normal.x>0?(i=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(i=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(i+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(i+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(i+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(i+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),i<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(po),Ra.subVectors(this.max,po),vr.subVectors(e.a,po),br.subVectors(e.b,po),_r.subVectors(e.c,po),cs.subVectors(br,vr),hs.subVectors(_r,br),Is.subVectors(vr,_r);let i=[0,-cs.z,cs.y,0,-hs.z,hs.y,0,-Is.z,Is.y,cs.z,0,-cs.x,hs.z,0,-hs.x,Is.z,0,-Is.x,-cs.y,cs.x,0,-hs.y,hs.x,0,-Is.y,Is.x,0];return!Hu(i,vr,br,_r,Ra)||(i=[1,0,0,0,1,0,0,0,1],!Hu(i,vr,br,_r,Ra))?!1:(La.crossVectors(cs,hs),i=[La.x,La.y,La.z],Hu(i,vr,br,_r,Ra))}clampPoint(e,i){return i.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,tn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(tn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:($n[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),$n[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),$n[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),$n[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),$n[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),$n[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),$n[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),$n[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints($n),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const $n=[new B,new B,new B,new B,new B,new B,new B,new B],tn=new B,ka=new Dn,vr=new B,br=new B,_r=new B,cs=new B,hs=new B,Is=new B,po=new B,Ra=new B,La=new B,Fs=new B;function Hu(t,e,i,n,s){for(let r=0,l=t.length-3;r<=l;r+=3){Fs.fromArray(t,r);const o=s.x*Math.abs(Fs.x)+s.y*Math.abs(Fs.y)+s.z*Math.abs(Fs.z),u=e.dot(Fs),c=i.dot(Fs),h=n.dot(Fs);if(Math.max(-Math.max(u,c,h),Math.min(u,c,h))>o)return!1}return!0}const ti=new B,Da=new Xe;let AP=0;class Qt extends As{constructor(e,i,n=!1){if(super(),Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:AP++}),this.name="",this.array=e,this.itemSize=i,this.count=e!==void 0?e.length/i:0,this.normalized=n,this.usage=Tc,this.updateRanges=[],this.gpuType=Gi,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,i){this.updateRanges.push({start:e,count:i})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,i,n){e*=this.itemSize,n*=i.itemSize;for(let s=0,r=this.itemSize;sthis.radius*this.radius&&(i.sub(this.center).normalize(),i.multiplyScalar(this.radius).add(this.center)),i}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;fo.subVectors(e,this.center);const i=fo.lengthSq();if(i>this.radius*this.radius){const n=Math.sqrt(i),s=(n-this.radius)*.5;this.center.addScaledVector(fo,s/n),this.radius+=s}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Wu.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(fo.copy(e.center).add(Wu)),this.expandByPoint(fo.copy(e.center).sub(Wu))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}let EP=0;const Xi=new _t,qu=new Wt,Sr=new B,Oi=new Dn,go=new Dn,ai=new B;class Bt extends As{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:EP++}),this.uuid=Yn(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(Xx(e)?Ay:Ty)(e,1):this.index=e,this}setIndirect(e,i=0){return this.indirect=e,this.indirectOffset=i,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,i){return this.attributes[e]=i,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,i,n=0){this.groups.push({start:e,count:i,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,i){this.drawRange.start=e,this.drawRange.count=i}applyMatrix4(e){const i=this.attributes.position;i!==void 0&&(i.applyMatrix4(e),i.needsUpdate=!0);const n=this.attributes.normal;if(n!==void 0){const r=new at().getNormalMatrix(e);n.applyNormalMatrix(r),n.needsUpdate=!0}const s=this.attributes.tangent;return s!==void 0&&(s.transformDirection(e),s.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(e){return Xi.makeRotationFromQuaternion(e),this.applyMatrix4(Xi),this}rotateX(e){return Xi.makeRotationX(e),this.applyMatrix4(Xi),this}rotateY(e){return Xi.makeRotationY(e),this.applyMatrix4(Xi),this}rotateZ(e){return Xi.makeRotationZ(e),this.applyMatrix4(Xi),this}translate(e,i,n){return Xi.makeTranslation(e,i,n),this.applyMatrix4(Xi),this}scale(e,i,n){return Xi.makeScale(e,i,n),this.applyMatrix4(Xi),this}lookAt(e){return qu.lookAt(e),qu.updateMatrix(),this.applyMatrix4(qu.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Sr).negate(),this.translate(Sr.x,Sr.y,Sr.z),this}setFromPoints(e){const i=this.getAttribute("position");if(i===void 0){const n=[];for(let s=0,r=e.length;si.count&&tt("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),i.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Dn);const e=this.attributes.position,i=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){bt("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new B(-1/0,-1/0,-1/0),new B(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),i)for(let n=0,s=i.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const u=this.parameters;for(const c in u)u[c]!==void 0&&(e[c]=u[c]);return e}e.data={attributes:{}};const i=this.index;i!==null&&(e.data.index={type:i.array.constructor.name,array:Array.prototype.slice.call(i.array)});const n=this.attributes;for(const u in n){const c=n[u];e.data.attributes[u]=c.toJSON(e.data)}const s={};let r=!1;for(const u in this.morphAttributes){const c=this.morphAttributes[u],h=[];for(let d=0,m=c.length;d0&&(s[u]=h,r=!0)}r&&(e.data.morphAttributes=s,e.data.morphTargetsRelative=this.morphTargetsRelative);const l=this.groups;l.length>0&&(e.data.groups=JSON.parse(JSON.stringify(l)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const i={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const s=e.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(i))}const r=e.morphAttributes;for(const c in r){const h=[],d=r[c];for(let m=0,g=d.length;m0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const i in e){const n=e[i];if(n===void 0){tt(`Material: parameter '${i}' has value of undefined.`);continue}const s=this[i];if(s===void 0){tt(`Material: '${i}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[i]=n}}toJSON(e){const i=e===void 0||typeof e=="string";i&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Xr&&(n.blending=this.blending),this.side!==ts&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Bd&&(n.blendSrc=this.blendSrc),this.blendDst!==zd&&(n.blendDst=this.blendDst),this.blendEquation!==Hs&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==to&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==ap&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==cr&&(n.stencilFail=this.stencilFail),this.stencilZFail!==cr&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==cr&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.allowOverride===!1&&(n.allowOverride=!1),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const l=[];for(const o in r){const u=r[o];delete u.metadata,l.push(u)}return l}if(i){const r=s(e.textures),l=s(e.images);r.length>0&&(n.textures=r),l.length>0&&(n.images=l)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const i=e.clippingPlanes;let n=null;if(i!==null){const s=i.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=i[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Ey extends Fn{constructor(e){super(),this.isSpriteMaterial=!0,this.type="SpriteMaterial",this.color=new Ve(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}}let wr;const yo=new B,Mr=new B,xr=new B,Pr=new Xe,vo=new Xe,ky=new _t,Ia=new B,bo=new B,Fa=new B,Mp=new Xe,ju=new Xe,xp=new Xe;class RP extends Wt{constructor(e=new Ey){if(super(),this.isSprite=!0,this.type="Sprite",wr===void 0){wr=new Bt;const i=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),n=new Cy(i,5);wr.setIndex([0,1,2,0,2,3]),wr.setAttribute("position",new Cn(n,3,0,!1)),wr.setAttribute("uv",new Cn(n,2,3,!1))}this.geometry=wr,this.material=e,this.center=new Xe(.5,.5),this.count=1}raycast(e,i){e.camera===null&&bt('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Mr.setFromMatrixScale(this.matrixWorld),ky.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),xr.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&this.material.sizeAttenuation===!1&&Mr.multiplyScalar(-xr.z);const n=this.material.rotation;let s,r;n!==0&&(r=Math.cos(n),s=Math.sin(n));const l=this.center;Na(Ia.set(-.5,-.5,0),xr,l,Mr,s,r),Na(bo.set(.5,-.5,0),xr,l,Mr,s,r),Na(Fa.set(.5,.5,0),xr,l,Mr,s,r),Mp.set(0,0),ju.set(1,0),xp.set(1,1);let o=e.ray.intersectTriangle(Ia,bo,Fa,!1,yo);if(o===null&&(Na(bo.set(-.5,.5,0),xr,l,Mr,s,r),ju.set(0,1),o=e.ray.intersectTriangle(Ia,Fa,bo,!1,yo),o===null))return;const u=e.ray.origin.distanceTo(yo);ue.far||i.push({distance:u,point:yo.clone(),uv:Yi.getInterpolation(yo,Ia,bo,Fa,Mp,ju,xp,new Xe),face:null,object:this})}copy(e,i){return super.copy(e,i),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function Na(t,e,i,n,s,r){Pr.subVectors(t,i).addScalar(.5).multiply(n),s!==void 0?(vo.x=r*Pr.x-s*Pr.y,vo.y=s*Pr.x+r*Pr.y):vo.copy(Pr),t.copy(e),t.x+=vo.x,t.y+=vo.y,t.applyMatrix4(ky)}const Gn=new B,Xu=new B,Oa=new B,ms=new B,Ku=new B,Ua=new B,Yu=new B;class ha{constructor(e=new B,i=new B(0,0,-1)){this.origin=e,this.direction=i}set(e,i){return this.origin.copy(e),this.direction.copy(i),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,i){return i.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,Gn)),this}closestPointToPoint(e,i){i.subVectors(e,this.origin);const n=i.dot(this.direction);return n<0?i.copy(this.origin):i.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const i=Gn.subVectors(e,this.origin).dot(this.direction);return i<0?this.origin.distanceToSquared(e):(Gn.copy(this.origin).addScaledVector(this.direction,i),Gn.distanceToSquared(e))}distanceSqToSegment(e,i,n,s){Xu.copy(e).add(i).multiplyScalar(.5),Oa.copy(i).sub(e).normalize(),ms.copy(this.origin).sub(Xu);const r=e.distanceTo(i)*.5,l=-this.direction.dot(Oa),o=ms.dot(this.direction),u=-ms.dot(Oa),c=ms.lengthSq(),h=Math.abs(1-l*l);let d,m,g,b;if(h>0)if(d=l*u-o,m=l*o-u,b=r*h,d>=0)if(m>=-b)if(m<=b){const w=1/h;d*=w,m*=w,g=d*(d+l*m+2*o)+m*(l*d+m+2*u)+c}else m=r,d=Math.max(0,-(l*m+o)),g=-d*d+m*(m+2*u)+c;else m=-r,d=Math.max(0,-(l*m+o)),g=-d*d+m*(m+2*u)+c;else m<=-b?(d=Math.max(0,-(-l*r+o)),m=d>0?-r:Math.min(Math.max(-r,-u),r),g=-d*d+m*(m+2*u)+c):m<=b?(d=0,m=Math.min(Math.max(-r,-u),r),g=m*(m+2*u)+c):(d=Math.max(0,-(l*r+o)),m=d>0?r:Math.min(Math.max(-r,-u),r),g=-d*d+m*(m+2*u)+c);else m=l>0?-r:r,d=Math.max(0,-(l*m+o)),g=-d*d+m*(m+2*u)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(Xu).addScaledVector(Oa,m),g}intersectSphere(e,i){Gn.subVectors(e.center,this.origin);const n=Gn.dot(this.direction),s=Gn.dot(Gn)-n*n,r=e.radius*e.radius;if(s>r)return null;const l=Math.sqrt(r-s),o=n-l,u=n+l;return u<0?null:o<0?this.at(u,i):this.at(o,i)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const i=e.normal.dot(this.direction);if(i===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/i;return n>=0?n:null}intersectPlane(e,i){const n=this.distanceToPlane(e);return n===null?null:this.at(n,i)}intersectsPlane(e){const i=e.distanceToPoint(this.origin);return i===0||e.normal.dot(this.direction)*i<0}intersectBox(e,i){let n,s,r,l,o,u;const c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,m=this.origin;return c>=0?(n=(e.min.x-m.x)*c,s=(e.max.x-m.x)*c):(n=(e.max.x-m.x)*c,s=(e.min.x-m.x)*c),h>=0?(r=(e.min.y-m.y)*h,l=(e.max.y-m.y)*h):(r=(e.max.y-m.y)*h,l=(e.min.y-m.y)*h),n>l||r>s||((r>n||isNaN(n))&&(n=r),(l=0?(o=(e.min.z-m.z)*d,u=(e.max.z-m.z)*d):(o=(e.max.z-m.z)*d,u=(e.min.z-m.z)*d),n>u||o>s)||((o>n||n!==n)&&(n=o),(u=0?n:s,i)}intersectsBox(e){return this.intersectBox(e,Gn)!==null}intersectTriangle(e,i,n,s,r){Ku.subVectors(i,e),Ua.subVectors(n,e),Yu.crossVectors(Ku,Ua);let l=this.direction.dot(Yu),o;if(l>0){if(s)return null;o=1}else if(l<0)o=-1,l=-l;else return null;ms.subVectors(this.origin,e);const u=o*this.direction.dot(Ua.crossVectors(ms,Ua));if(u<0)return null;const c=o*this.direction.dot(Ku.cross(ms));if(c<0||u+c>l)return null;const h=-o*ms.dot(Yu);return h<0?null:this.at(h/l,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class Ws extends Fn{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Ve(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ln,this.combine=tu,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Pp=new _t,Ns=new ha,Va=new In,Tp=new B,Ba=new B,za=new B,$a=new B,Ju=new B,Ga=new B,Ap=new B,Ha=new B;class Ut extends Wt{constructor(e=new Bt,i=new Ws){super(),this.isMesh=!0,this.type="Mesh",this.geometry=e,this.material=i,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,i){return super.copy(e,i),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){const i=this.geometry.morphAttributes,n=Object.keys(i);if(n.length>0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;r(e.far-e.near)**2))&&(Pp.copy(r).invert(),Ns.copy(e.ray).applyMatrix4(Pp),!(n.boundingBox!==null&&Ns.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,i,Ns)))}_computeIntersections(e,i,n){let s;const r=this.geometry,l=this.material,o=r.index,u=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,m=r.groups,g=r.drawRange;if(o!==null)if(Array.isArray(l))for(let b=0,w=m.length;bi.far?null:{distance:c,point:Ha.clone(),object:t}}function Wa(t,e,i,n,s,r,l,o,u,c){t.getVertexPosition(o,Ba),t.getVertexPosition(u,za),t.getVertexPosition(c,$a);const h=LP(t,e,i,n,Ba,za,$a,Ap);if(h){const d=new B;Yi.getBarycoord(Ap,Ba,za,$a,d),s&&(h.uv=Yi.getInterpolatedAttribute(s,o,u,c,d,new Xe)),r&&(h.uv1=Yi.getInterpolatedAttribute(r,o,u,c,d,new Xe)),l&&(h.normal=Yi.getInterpolatedAttribute(l,o,u,c,d,new B),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const m={a:o,b:u,c,normal:new B,materialIndex:0};Yi.getNormal(Ba,za,$a,m.normal),h.face=m,h.barycoord=d}return h}class kh extends mi{constructor(e=null,i=1,n=1,s,r,l,o,u,c=Zt,h=Zt,d,m){super(null,l,o,u,c,h,s,r,d,m),this.isDataTexture=!0,this.image={data:e,width:i,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Br extends Qt{constructor(e,i,n,s=1){super(e,i,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}toJSON(){const e=super.toJSON();return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}const Tr=new _t,Cp=new _t,qa=[],Ep=new Dn,DP=new _t,_o=new Ut,So=new In;class IP extends Ut{constructor(e,i,n){super(e,i),this.isInstancedMesh=!0,this.instanceMatrix=new Br(new Float32Array(n*16),16),this.previousInstanceMatrix=null,this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1)?null:i.copy(e.start).addScaledVector(s,l)}intersectsLine(e){const i=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return i<0&&n>0||n<0&&i>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,i){const n=i||NP.getNormalMatrix(e),s=this.coplanarPoint(Zu).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Os=new In,OP=new Xe(.5,.5),ja=new B;class Rh{constructor(e=new qn,i=new qn,n=new qn,s=new qn,r=new qn,l=new qn){this.planes=[e,i,n,s,r,l]}set(e,i,n,s,r,l){const o=this.planes;return o[0].copy(e),o[1].copy(i),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(l),this}copy(e){const i=this.planes;for(let n=0;n<6;n++)i[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,i=An,n=!1){const s=this.planes,r=e.elements,l=r[0],o=r[1],u=r[2],c=r[3],h=r[4],d=r[5],m=r[6],g=r[7],b=r[8],w=r[9],v=r[10],y=r[11],S=r[12],P=r[13],M=r[14],k=r[15];if(s[0].setComponents(c-l,g-h,y-b,k-S).normalize(),s[1].setComponents(c+l,g+h,y+b,k+S).normalize(),s[2].setComponents(c+o,g+d,y+w,k+P).normalize(),s[3].setComponents(c-o,g-d,y-w,k-P).normalize(),n)s[4].setComponents(u,m,v,M).normalize(),s[5].setComponents(c-u,g-m,y-v,k-M).normalize();else if(s[4].setComponents(c-u,g-m,y-v,k-M).normalize(),i===An)s[5].setComponents(c+u,g+m,y+v,k+M).normalize();else if(i===sa)s[5].setComponents(u,m,v,M).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+i);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),Os.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const i=e.geometry;i.boundingSphere===null&&i.computeBoundingSphere(),Os.copy(i.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Os)}intersectsSprite(e){Os.center.set(0,0,0);const i=OP.distanceTo(e.center);return Os.radius=.7071067811865476+i,Os.applyMatrix4(e.matrixWorld),this.intersectsSphere(Os)}intersectsSphere(e){const i=this.planes,n=e.center,s=-e.radius;for(let r=0;r<6;r++)if(i[r].distanceToPoint(n)0?e.max.x:e.min.x,ja.y=s.normal.y>0?e.max.y:e.min.y,ja.z=s.normal.z>0?e.max.z:e.min.z,s.distanceToPoint(ja)<0)return!1}return!0}containsPoint(e){const i=this.planes;for(let n=0;n<6;n++)if(i[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class su extends Fn{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Ve(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const Ul=new B,Vl=new B,kp=new _t,wo=new ha,Xa=new In,Qu=new B,Rp=new B;class Ry extends Wt{constructor(e=new Bt,i=new su){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=i,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,i){return super.copy(e,i),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const i=e.attributes.position,n=[0];for(let s=1,r=i.count;s0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;rn)return;Qu.applyMatrix4(t.matrixWorld);const c=e.ray.origin.distanceTo(Qu);if(!(ce.far))return{distance:c,point:Rp.clone().applyMatrix4(t.matrixWorld),index:l,face:null,faceIndex:null,barycoord:null,object:t}}const Lp=new B,Dp=new B;class Ly extends Ry{constructor(e,i){super(e,i),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const i=e.attributes.position,n=[];for(let s=0,r=i.count;s0){const s=i[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,l=s.length;rs.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:u,index:e,face:null,faceIndex:null,barycoord:null,object:l})}}class Iy extends mi{constructor(e=[],i=tr,n,s,r,l,o,u,c,h){super(e,i,n,s,r,l,o,u,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Fy extends mi{constructor(e,i,n,s,r,l,o,u,c){super(e,i,n,s,r,l,o,u,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class no extends mi{constructor(e,i,n=Rn,s,r,l,o=Zt,u=Zt,c,h=is,d=1){if(h!==is&&h!==Xs)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const m={width:e,height:i,depth:d};super(m,s,r,l,o,u,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new Th(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const i=super.toJSON(e);return this.compareFunction!==null&&(i.compareFunction=this.compareFunction),i}}class UP extends no{constructor(e,i=Rn,n=tr,s,r,l=Zt,o=Zt,u,c=is){const h={width:e,height:e,depth:1},d=[h,h,h,h,h,h];super(e,e,i,n,s,r,l,o,u,c),this.image=d,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}}class Ny extends mi{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class xs extends Bt{constructor(e=1,i=1,n=1,s=1,r=1,l=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:i,depth:n,widthSegments:s,heightSegments:r,depthSegments:l};const o=this;s=Math.floor(s),r=Math.floor(r),l=Math.floor(l);const u=[],c=[],h=[],d=[];let m=0,g=0;b("z","y","x",-1,-1,n,i,e,l,r,0),b("z","y","x",1,-1,n,i,-e,l,r,1),b("x","z","y",1,1,e,n,i,s,l,2),b("x","z","y",1,-1,e,n,-i,s,l,3),b("x","y","z",1,-1,e,i,n,s,r,4),b("x","y","z",-1,-1,e,i,-n,s,r,5),this.setIndex(u),this.setAttribute("position",new wt(c,3)),this.setAttribute("normal",new wt(h,3)),this.setAttribute("uv",new wt(d,2));function b(w,v,y,S,P,M,k,C,L,x,T){const F=M/L,I=k/x,E=M/2,z=k/2,Y=C/2,$=L+1,W=x+1;let q=0,te=0;const me=new B;for(let xe=0;xe0?1:-1,h.push(me.x,me.y,me.z),d.push(Fe/L),d.push(1-xe/x),q+=1}}for(let xe=0;xe0&&P(!0),i>0&&P(!1)),this.setIndex(h),this.setAttribute("position",new wt(d,3)),this.setAttribute("normal",new wt(m,3)),this.setAttribute("uv",new wt(g,2));function S(){const M=new B,k=new B;let C=0;const L=(i-e)/n;for(let x=0;x<=r;x++){const T=[],F=x/r,I=F*(i-e)+e;for(let E=0;E<=s;E++){const z=E/s,Y=z*u+o,$=Math.sin(Y),W=Math.cos(Y);k.x=I*$,k.y=-F*n+v,k.z=I*W,d.push(k.x,k.y,k.z),M.set($,L,W).normalize(),m.push(M.x,M.y,M.z),g.push(z,1-F),T.push(b++)}w.push(T)}for(let x=0;x0||T!==0)&&(h.push(F,I,z),C+=3),(i>0||T!==r-1)&&(h.push(I,E,z),C+=3)}c.addGroup(y,C,0),y+=C}function P(M){const k=b,C=new Xe,L=new B;let x=0;const T=M===!0?e:i,F=M===!0?1:-1;for(let E=1;E<=s;E++)d.push(0,v*F,0),m.push(0,F,0),g.push(.5,.5),b++;const I=b;for(let E=0;E<=s;E++){const Y=E/s*u+o,$=Math.cos(Y),W=Math.sin(Y);L.x=T*W,L.y=v*F,L.z=T*$,d.push(L.x,L.y,L.z),m.push(0,F,0),C.x=$*.5+.5,C.y=W*.5*F+.5,g.push(C.x,C.y),b++}for(let E=0;E.9&&L<.1&&(P<.2&&(l[S+0]+=1),M<.2&&(l[S+2]+=1),k<.2&&(l[S+4]+=1))}}function m(S){r.push(S.x,S.y,S.z)}function g(S,P){const M=S*3;P.x=e[M+0],P.y=e[M+1],P.z=e[M+2]}function b(){const S=new B,P=new B,M=new B,k=new B,C=new Xe,L=new Xe,x=new Xe;for(let T=0,F=0;T0)u=s-1;else{u=s;break}if(s=u,n[s]===l)return s/(r-1);const h=n[s],m=n[s+1]-h,g=(l-h)/m;return(s+g)/(r-1)}getTangent(e,i){let s=e-1e-4,r=e+1e-4;s<0&&(s=0),r>1&&(r=1);const l=this.getPoint(s),o=this.getPoint(r),u=i||(l.isVector2?new Xe:new B);return u.copy(o).sub(l).normalize(),u}getTangentAt(e,i){const n=this.getUtoTmapping(e);return this.getTangent(n,i)}computeFrenetFrames(e,i=!1){const n=new B,s=[],r=[],l=[],o=new B,u=new _t;for(let g=0;g<=e;g++){const b=g/e;s[g]=this.getTangentAt(b,new B)}r[0]=new B,l[0]=new B;let c=Number.MAX_VALUE;const h=Math.abs(s[0].x),d=Math.abs(s[0].y),m=Math.abs(s[0].z);h<=c&&(c=h,n.set(1,0,0)),d<=c&&(c=d,n.set(0,1,0)),m<=c&&n.set(0,0,1),o.crossVectors(s[0],n).normalize(),r[0].crossVectors(s[0],o),l[0].crossVectors(s[0],r[0]);for(let g=1;g<=e;g++){if(r[g]=r[g-1].clone(),l[g]=l[g-1].clone(),o.crossVectors(s[g-1],s[g]),o.length()>Number.EPSILON){o.normalize();const b=Math.acos(rt(s[g-1].dot(s[g]),-1,1));r[g].applyMatrix4(u.makeRotationAxis(o,b))}l[g].crossVectors(s[g],r[g])}if(i===!0){let g=Math.acos(rt(r[0].dot(r[e]),-1,1));g/=e,s[0].dot(o.crossVectors(r[0],r[e]))>0&&(g=-g);for(let b=1;b<=e;b++)r[b].applyMatrix4(u.makeRotationAxis(s[b],g*b)),l[b].crossVectors(s[b],r[b])}return{tangents:s,normals:r,binormals:l}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}function Fh(){let t=0,e=0,i=0,n=0;function s(r,l,o,u){t=r,e=o,i=-3*r+3*l-2*o-u,n=2*r-2*l+o+u}return{initCatmullRom:function(r,l,o,u,c){s(l,o,c*(o-r),c*(u-l))},initNonuniformCatmullRom:function(r,l,o,u,c,h,d){let m=(l-r)/c-(o-r)/(c+h)+(o-l)/h,g=(o-l)/h-(u-l)/(h+d)+(u-o)/d;m*=h,g*=h,s(l,o,m,g)},calc:function(r){const l=r*r,o=l*r;return t+e*r+i*l+n*o}}}const Np=new B,Op=new B,td=new Fh,id=new Fh,nd=new Fh;class BP extends VP{constructor(e=[],i=!1,n="centripetal",s=.5){super(),this.isCatmullRomCurve3=!0,this.type="CatmullRomCurve3",this.points=e,this.closed=i,this.curveType=n,this.tension=s}getPoint(e,i=new B){const n=i,s=this.points,r=s.length,l=(r-(this.closed?0:1))*e;let o=Math.floor(l),u=l-o;this.closed?o+=o>0?0:(Math.floor(Math.abs(o)/r)+1)*r:u===0&&o===r-1&&(o=r-2,u=1);let c,h;this.closed||o>0?c=s[(o-1)%r]:(Op.subVectors(s[0],s[1]).add(s[0]),c=Op);const d=s[o%r],m=s[(o+1)%r];if(this.closed||o+20)&&g.push(P,M,C),(y!==n-1||u0&&(i.defines=this.defines),i.vertexShader=this.vertexShader,i.fragmentShader=this.fragmentShader,i.lights=this.lights,i.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(i.extensions=n),i}}class bP extends Ai{constructor(e){super(e),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class Or extends An{constructor(e){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new ze(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ze(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Bo,this.normalScale=new Ye(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Tn,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.envMapIntensity=e.envMapIntensity,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class _P extends Or{constructor(e){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new Ye(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return rt(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(i){this.ior=(1+.4*i)/(1-.4*i)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new ze(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new ze(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new ze(1,1,1),this.specularColorMap=null,this._anisotropy=0,this._clearcoat=0,this._dispersion=0,this._iridescence=0,this._sheen=0,this._transmission=0,this.setValues(e)}get anisotropy(){return this._anisotropy}set anisotropy(e){this._anisotropy>0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class gr extends An{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new ze(16777215),this.specular=new ze(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ze(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Bo,this.normalScale=new Ye(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Tn,this.combine=Il,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class SP extends An{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new ze(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ze(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Bo,this.normalScale=new Ye(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Tn,this.combine=Il,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class wP extends An{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=mM,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class MP extends An{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}const Dd={enabled:!1,files:{},add:function(t,e){this.enabled!==!1&&(Kf(t)||(this.files[t]=e))},get:function(t){if(this.enabled!==!1&&!Kf(t))return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};function Kf(t){try{const e=t.slice(t.indexOf(":")+1);return new URL(e).protocol==="blob:"}catch{return!1}}class PP{constructor(e,i,n){const s=this;let r=!1,l=0,o=0,d;const u=[];this.onStart=void 0,this.onLoad=e,this.onProgress=i,this.onError=n,this._abortController=null,this.itemStart=function(h){o++,r===!1&&s.onStart!==void 0&&s.onStart(h,l,o),r=!0},this.itemEnd=function(h){l++,s.onProgress!==void 0&&s.onProgress(h,l,o),l===o&&(r=!1,s.onLoad!==void 0&&s.onLoad())},this.itemError=function(h){s.onError!==void 0&&s.onError(h)},this.resolveURL=function(h){return d?d(h):h},this.setURLModifier=function(h){return d=h,this},this.addHandler=function(h,c){return u.push(h,c),this},this.removeHandler=function(h){const c=u.indexOf(h);return c!==-1&&u.splice(c,2),this},this.getHandler=function(h){for(let c=0,f=u.length;c1&&(l=1,r=rt((T-y)/c,0,1))}}return i.copy(o).addScaledVector(_r,r),n.copy(d).addScaledVector(Sr,l),i.distanceToSquared(n)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class UP extends Ng{constructor(e=10,i=10,n=4473924,s=8947848){n=new ze(n),s=new ze(s);const r=i/2,l=e/i,o=e/2,d=[],u=[];for(let f=0,g=0,y=-o;f<=i;f++,y+=l){d.push(-o,0,y,o,0,y),d.push(y,0,-o,y,0,o);const T=f===r?n:s;T.toArray(u,g),g+=3,T.toArray(u,g),g+=3,T.toArray(u,g),g+=3,T.toArray(u,g),g+=3}const h=new zt;h.setAttribute("position",new Pt(d,3)),h.setAttribute("color",new Pt(u,3));const c=new Nl({vertexColors:!0,toneMapped:!1});super(h,c),this.type="GridHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}class BP extends Ng{constructor(e=1){const i=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],n=[1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],s=new zt;s.setAttribute("position",new Pt(i,3)),s.setAttribute("color",new Pt(n,3));const r=new Nl({vertexColors:!0,toneMapped:!1});super(s,r),this.type="AxesHelper"}setColors(e,i,n){const s=new ze,r=this.geometry.attributes.color.array;return s.set(e),s.toArray(r,0),s.toArray(r,3),s.set(i),s.toArray(r,6),s.toArray(r,9),s.set(n),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class VP extends bs{constructor(e,i=null){super(),this.object=e,this.domElement=i,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){tt("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function om(t,e,i,n){const s=zP(n);switch(i){case Pg:return t*e;case Tg:return t*e/s.components*s.byteLength;case Fc:return t*e/s.components*s.byteLength;case js:return t*e*2/s.components*s.byteLength;case Nc:return t*e*2/s.components*s.byteLength;case xg:return t*e*3/s.components*s.byteLength;case Zi:return t*e*4/s.components*s.byteLength;case Oc:return t*e*4/s.components*s.byteLength;case Ya:case Ja:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case Za:case Qa:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case wu:case Pu:return Math.max(t,16)*Math.max(e,8)/4;case Su:case Mu:return Math.max(t,8)*Math.max(e,8)/2;case xu:case Tu:case Eu:case Cu:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case Au:case hl:case ku:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case Lu:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case Ru:return Math.floor((t+4)/5)*Math.floor((e+3)/4)*16;case Du:return Math.floor((t+4)/5)*Math.floor((e+4)/5)*16;case Iu:return Math.floor((t+5)/6)*Math.floor((e+4)/5)*16;case Fu:return Math.floor((t+5)/6)*Math.floor((e+5)/6)*16;case Nu:return Math.floor((t+7)/8)*Math.floor((e+4)/5)*16;case Ou:return Math.floor((t+7)/8)*Math.floor((e+5)/6)*16;case Uu:return Math.floor((t+7)/8)*Math.floor((e+7)/8)*16;case Bu:return Math.floor((t+9)/10)*Math.floor((e+4)/5)*16;case Vu:return Math.floor((t+9)/10)*Math.floor((e+5)/6)*16;case zu:return Math.floor((t+9)/10)*Math.floor((e+7)/8)*16;case $u:return Math.floor((t+9)/10)*Math.floor((e+9)/10)*16;case Gu:return Math.floor((t+11)/12)*Math.floor((e+9)/10)*16;case Hu:return Math.floor((t+11)/12)*Math.floor((e+11)/12)*16;case Wu:case qu:case ju:return Math.ceil(t/4)*Math.ceil(e/4)*16;case Xu:case Ku:return Math.ceil(t/4)*Math.ceil(e/4)*8;case fl:case Yu:return Math.ceil(t/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${i} format.`)}function zP(t){switch(t){case Oi:case _g:return{byteLength:1,components:1};case Oo:case Sg:case xn:return{byteLength:2,components:1};case Dc:case Ic:return{byteLength:2,components:4};case Pn:case Rc:case _n:return{byteLength:4,components:1};case wg:case Mg:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${t}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:kc}}));typeof window<"u"&&(window.__THREE__?tt("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=kc);/** +}`;class ii extends Fn{constructor(e){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=GP,this.fragmentShader=HP,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,e!==void 0&&this.setValues(e)}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=so(e.uniforms),this.uniformsGroups=$P(e.uniformsGroups),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.fog=e.fog,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this.defaultAttributeValues=Object.assign({},e.defaultAttributeValues),this.index0AttributeName=e.index0AttributeName,this.uniformsNeedUpdate=e.uniformsNeedUpdate,this}toJSON(e){const i=super.toJSON(e);i.glslVersion=this.glslVersion,i.uniforms={};for(const s in this.uniforms){const l=this.uniforms[s].value;l&&l.isTexture?i.uniforms[s]={type:"t",value:l.toJSON(e).uuid}:l&&l.isColor?i.uniforms[s]={type:"c",value:l.getHex()}:l&&l.isVector2?i.uniforms[s]={type:"v2",value:l.toArray()}:l&&l.isVector3?i.uniforms[s]={type:"v3",value:l.toArray()}:l&&l.isVector4?i.uniforms[s]={type:"v4",value:l.toArray()}:l&&l.isMatrix3?i.uniforms[s]={type:"m3",value:l.toArray()}:l&&l.isMatrix4?i.uniforms[s]={type:"m4",value:l.toArray()}:i.uniforms[s]={value:l}}Object.keys(this.defines).length>0&&(i.defines=this.defines),i.vertexShader=this.vertexShader,i.fragmentShader=this.fragmentShader,i.lights=this.lights,i.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(i.extensions=n),i}}class Uy extends ii{constructor(e){super(e),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class Jr extends Fn{constructor(e){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new Ve(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ve(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=na,this.normalScale=new Xe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ln,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.envMapIntensity=e.envMapIntensity,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class WP extends Jr{constructor(e){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new Xe(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return rt(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(i){this.ior=(1+.4*i)/(1-.4*i)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new Ve(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new Ve(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new Ve(1,1,1),this.specularColorMap=null,this._anisotropy=0,this._clearcoat=0,this._dispersion=0,this._iridescence=0,this._sheen=0,this._transmission=0,this.setValues(e)}get anisotropy(){return this._anisotropy}set anisotropy(e){this._anisotropy>0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class Us extends Fn{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Ve(16777215),this.specular=new Ve(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ve(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=na,this.normalScale=new Xe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ln,this.combine=tu,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class qP extends Fn{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Ve(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ve(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=na,this.normalScale=new Xe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ln,this.combine=tu,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class jP extends Fn{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=Bx,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class XP extends Fn{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}const sd={enabled:!1,files:{},add:function(t,e){this.enabled!==!1&&(Bp(t)||(this.files[t]=e))},get:function(t){if(this.enabled!==!1&&!Bp(t))return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};function Bp(t){try{const e=t.slice(t.indexOf(":")+1);return new URL(e).protocol==="blob:"}catch{return!1}}class KP{constructor(e,i,n){const s=this;let r=!1,l=0,o=0,u;const c=[];this.onStart=void 0,this.onLoad=e,this.onProgress=i,this.onError=n,this._abortController=null,this.itemStart=function(h){o++,r===!1&&s.onStart!==void 0&&s.onStart(h,l,o),r=!0},this.itemEnd=function(h){l++,s.onProgress!==void 0&&s.onProgress(h,l,o),l===o&&(r=!1,s.onLoad!==void 0&&s.onLoad())},this.itemError=function(h){s.onError!==void 0&&s.onError(h)},this.resolveURL=function(h){return u?u(h):h},this.setURLModifier=function(h){return u=h,this},this.addHandler=function(h,d){return c.push(h,d),this},this.removeHandler=function(h){const d=c.indexOf(h);return d!==-1&&c.splice(d,2),this},this.getHandler=function(h){for(let d=0,m=c.length;d1&&(l=1,r=rt((w-b)/d,0,1))}}return i.copy(o).addScaledVector(kr,r),n.copy(u).addScaledVector(Rr,l),i.distanceToSquared(n)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class dT extends Ly{constructor(e=10,i=10,n=4473924,s=8947848){n=new Ve(n),s=new Ve(s);const r=i/2,l=e/i,o=e/2,u=[],c=[];for(let m=0,g=0,b=-o;m<=i;m++,b+=l){u.push(-o,0,b,o,0,b),u.push(b,0,-o,b,0,o);const w=m===r?n:s;w.toArray(c,g),g+=3,w.toArray(c,g),g+=3,w.toArray(c,g),g+=3,w.toArray(c,g),g+=3}const h=new Bt;h.setAttribute("position",new wt(u,3)),h.setAttribute("color",new wt(c,3));const d=new su({vertexColors:!0,toneMapped:!1});super(h,d),this.type="GridHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}class cT extends Ly{constructor(e=1){const i=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],n=[1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],s=new Bt;s.setAttribute("position",new wt(i,3)),s.setAttribute("color",new wt(n,3));const r=new su({vertexColors:!0,toneMapped:!1});super(s,r),this.type="AxesHelper"}setColors(e,i,n){const s=new Ve,r=this.geometry.attributes.color.array;return s.set(e),s.toArray(r,0),s.toArray(r,3),s.set(i),s.toArray(r,6),s.toArray(r,9),s.set(n),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class hT extends As{constructor(e,i=null){super(),this.object=e,this.domElement=i,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){tt("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function Yp(t,e,i,n){const s=mT(n);switch(i){case Sy:return t*e;case bh:return t*e/s.components*s.byteLength;case _h:return t*e/s.components*s.byteLength;case ir:return t*e*2/s.components*s.byteLength;case Sh:return t*e*2/s.components*s.byteLength;case wy:return t*e*3/s.components*s.byteLength;case Hi:return t*e*4/s.components*s.byteLength;case wh:return t*e*4/s.components*s.byteLength;case gl:case yl:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case vl:case bl:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case Jd:case Qd:return Math.max(t,16)*Math.max(e,8)/4;case Yd:case Zd:return Math.max(t,8)*Math.max(e,8)/2;case ec:case tc:case nc:case sc:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case ic:case Ll:case rc:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case oc:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case ac:return Math.floor((t+4)/5)*Math.floor((e+3)/4)*16;case lc:return Math.floor((t+4)/5)*Math.floor((e+4)/5)*16;case uc:return Math.floor((t+5)/6)*Math.floor((e+4)/5)*16;case dc:return Math.floor((t+5)/6)*Math.floor((e+5)/6)*16;case cc:return Math.floor((t+7)/8)*Math.floor((e+4)/5)*16;case hc:return Math.floor((t+7)/8)*Math.floor((e+5)/6)*16;case mc:return Math.floor((t+7)/8)*Math.floor((e+7)/8)*16;case pc:return Math.floor((t+9)/10)*Math.floor((e+4)/5)*16;case fc:return Math.floor((t+9)/10)*Math.floor((e+5)/6)*16;case gc:return Math.floor((t+9)/10)*Math.floor((e+7)/8)*16;case yc:return Math.floor((t+9)/10)*Math.floor((e+9)/10)*16;case vc:return Math.floor((t+11)/12)*Math.floor((e+9)/10)*16;case bc:return Math.floor((t+11)/12)*Math.floor((e+11)/12)*16;case _c:case Sc:case wc:return Math.ceil(t/4)*Math.ceil(e/4)*16;case Mc:case xc:return Math.ceil(t/4)*Math.ceil(e/4)*8;case Dl:case Pc:return Math.ceil(t/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${i} format.`)}function mT(t){switch(t){case Bi:case yy:return{byteLength:1,components:1};case ta:case vy:case Wi:return{byteLength:2,components:1};case yh:case vh:return{byteLength:2,components:4};case Rn:case gh:case Gi:return{byteLength:4,components:1};case by:case _y:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${t}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:uh}}));typeof window<"u"&&(window.__THREE__?tt("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=uh);/** * @license * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT - */function Wg(){let t=null,e=!1,i=null,n=null;function s(r,l){i(r,l),n=t.requestAnimationFrame(s)}return{start:function(){e!==!0&&i!==null&&t!==null&&(n=t.requestAnimationFrame(s),e=!0)},stop:function(){t!==null&&t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(r){i=r},setContext:function(r){t=r}}}function $P(t){const e=new WeakMap;function i(o,d){const u=o.array,h=o.usage,c=u.byteLength,f=t.createBuffer();t.bindBuffer(d,f),t.bufferData(d,u,h),o.onUploadCallback();let g;if(u instanceof Float32Array)g=t.FLOAT;else if(typeof Float16Array<"u"&&u instanceof Float16Array)g=t.HALF_FLOAT;else if(u instanceof Uint16Array)o.isFloat16BufferAttribute?g=t.HALF_FLOAT:g=t.UNSIGNED_SHORT;else if(u instanceof Int16Array)g=t.SHORT;else if(u instanceof Uint32Array)g=t.UNSIGNED_INT;else if(u instanceof Int32Array)g=t.INT;else if(u instanceof Int8Array)g=t.BYTE;else if(u instanceof Uint8Array)g=t.UNSIGNED_BYTE;else if(u instanceof Uint8ClampedArray)g=t.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+u);return{buffer:f,type:g,bytesPerElement:u.BYTES_PER_ELEMENT,version:o.version,size:c}}function n(o,d,u){const h=d.array,c=d.updateRanges;if(t.bindBuffer(u,o),c.length===0)t.bufferSubData(u,0,h);else{c.sort((g,y)=>g.start-y.start);let f=0;for(let g=1;gg.start-b.start);let m=0;for(let g=1;g 0 +#endif`,kT=`#if NUM_CLIPPING_PLANES > 0 vec4 plane; #ifdef ALPHA_TO_COVERAGE float distanceToPlane, distanceGradient; @@ -278,20 +449,20 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve if ( clipped ) discard; #endif #endif -#endif`,rx=`#if NUM_CLIPPING_PLANES > 0 +#endif`,RT=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; -#endif`,ox=`#if NUM_CLIPPING_PLANES > 0 +#endif`,LT=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; -#endif`,ax=`#if NUM_CLIPPING_PLANES > 0 +#endif`,DT=`#if NUM_CLIPPING_PLANES > 0 vClipPosition = - mvPosition.xyz; -#endif`,lx=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) +#endif`,IT=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; -#endif`,dx=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) +#endif`,FT=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) varying vec4 vColor; -#endif`,ux=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) +#endif`,NT=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) varying vec4 vColor; -#endif`,cx=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) +#endif`,OT=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) vColor = vec4( 1.0 ); #endif #ifdef USE_COLOR_ALPHA @@ -304,7 +475,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve #endif #ifdef USE_BATCHING_COLOR vColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) ); -#endif`,hx=`#define PI 3.141592653589793 +#endif`,UT=`#define PI 3.141592653589793 #define PI2 6.283185307179586 #define PI_HALF 1.5707963267948966 #define RECIPROCAL_PI 0.3183098861837907 @@ -371,7 +542,7 @@ vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`,fx=`#ifdef ENVMAP_TYPE_CUBE_UV +} // validated`,VT=`#ifdef ENVMAP_TYPE_CUBE_UV #define cubeUV_minMipLevel 4.0 #define cubeUV_minTileSize 16.0 float getFace( vec3 direction ) { @@ -464,7 +635,7 @@ float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { return vec4( mix( color0, color1, mipF ), 1.0 ); } } -#endif`,mx=`vec3 transformedNormal = objectNormal; +#endif`,BT=`vec3 transformedNormal = objectNormal; #ifdef USE_TANGENT vec3 transformedTangent = objectTangent; #endif @@ -493,21 +664,21 @@ transformedNormal = normalMatrix * transformedNormal; #ifdef FLIP_SIDED transformedTangent = - transformedTangent; #endif -#endif`,px=`#ifdef USE_DISPLACEMENTMAP +#endif`,zT=`#ifdef USE_DISPLACEMENTMAP uniform sampler2D displacementMap; uniform float displacementScale; uniform float displacementBias; -#endif`,gx=`#ifdef USE_DISPLACEMENTMAP +#endif`,$T=`#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`,yx=`#ifdef USE_EMISSIVEMAP +#endif`,GT=`#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE emissiveColor = sRGBTransferEOTF( emissiveColor ); #endif totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,vx=`#ifdef USE_EMISSIVEMAP +#endif`,HT=`#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`,bx="gl_FragColor = linearToOutputTexel( gl_FragColor );",_x=`vec4 LinearTransferOETF( in vec4 value ) { +#endif`,WT="gl_FragColor = linearToOutputTexel( gl_FragColor );",qT=`vec4 LinearTransferOETF( in vec4 value ) { return value; } vec4 sRGBTransferEOTF( in vec4 value ) { @@ -515,7 +686,7 @@ vec4 sRGBTransferEOTF( in vec4 value ) { } vec4 sRGBTransferOETF( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,Sx=`#ifdef USE_ENVMAP +}`,jT=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -542,7 +713,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif #endif -#endif`,wx=`#ifdef USE_ENVMAP +#endif`,XT=`#ifdef USE_ENVMAP uniform float envMapIntensity; uniform mat3 envMapRotation; #ifdef ENVMAP_TYPE_CUBE @@ -550,7 +721,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else uniform sampler2D envMap; #endif -#endif`,Mx=`#ifdef USE_ENVMAP +#endif`,KT=`#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS @@ -561,7 +732,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`,Px=`#ifdef USE_ENVMAP +#endif`,YT=`#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS #endif @@ -572,7 +743,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`,xx=`#ifdef USE_ENVMAP +#endif`,JT=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -589,18 +760,18 @@ vec4 sRGBTransferOETF( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`,Tx=`#ifdef USE_FOG +#endif`,ZT=`#ifdef USE_FOG vFogDepth = - mvPosition.z; -#endif`,Ax=`#ifdef USE_FOG +#endif`,QT=`#ifdef USE_FOG varying float vFogDepth; -#endif`,Ex=`#ifdef USE_FOG +#endif`,e2=`#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,Cx=`#ifdef USE_FOG +#endif`,t2=`#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -609,7 +780,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`,kx=`#ifdef USE_GRADIENTMAP +#endif`,i2=`#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -621,12 +792,12 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { vec2 fw = fwidth( coord ) * 0.5; return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); #endif -}`,Lx=`#ifdef USE_LIGHTMAP +}`,n2=`#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`,Rx=`LambertMaterial material; +#endif`,s2=`LambertMaterial material; material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`,Dx=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,r2=`varying vec3 vViewPosition; struct LambertMaterial { vec3 diffuseColor; float specularStrength; @@ -640,7 +811,7 @@ void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometr reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,Ix=`uniform bool receiveShadow; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,o2=`uniform bool receiveShadow; uniform vec3 ambientLightColor; #if defined( USE_LIGHT_PROBES ) uniform vec3 lightProbe[ 9 ]; @@ -757,7 +928,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi return irradiance; } #endif -#include `,Fx=`#ifdef USE_ENVMAP +#include `,a2=`#ifdef USE_ENVMAP vec3 getIBLIrradiance( const in vec3 normal ) { #ifdef ENVMAP_TYPE_CUBE_UV vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -790,8 +961,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi #endif } #endif -#endif`,Nx=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,Ox=`varying vec3 vViewPosition; +#endif`,l2=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,u2=`varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -803,11 +974,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPo reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Ux=`BlinnPhongMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,d2=`BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`,Bx=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,c2=`varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -824,7 +995,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geom reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,Vx=`PhysicalMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,h2=`PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb; material.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor ); material.metalness = metalnessFactor; @@ -914,7 +1085,7 @@ material.roughness = min( material.roughness, 1.0 ); material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`,zx=`uniform sampler2D dfgLUT; +#endif`,m2=`uniform sampler2D dfgLUT; struct PhysicalMaterial { vec3 diffuseColor; vec3 diffuseContribution; @@ -1274,7 +1445,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,$x=` +}`,p2=` vec3 geometryPosition = - vViewPosition; vec3 geometryNormal = normal; vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); @@ -1396,7 +1567,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,Gx=`#if defined( RE_IndirectDiffuse ) +#endif`,f2=`#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -1417,7 +1588,7 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); #endif -#endif`,Hx=`#if defined( RE_IndirectDiffuse ) +#endif`,g2=`#if defined( RE_IndirectDiffuse ) #if defined( LAMBERT ) || defined( PHONG ) irradiance += iblIrradiance; #endif @@ -1425,7 +1596,7 @@ IncidentLight directLight; #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`,Wx=`#ifdef USE_LIGHT_PROBES_GRID +#endif`,y2=`#ifdef USE_LIGHT_PROBES_GRID uniform highp sampler3D probesSH; uniform vec3 probesMin; uniform vec3 probesMax; @@ -1470,27 +1641,27 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { result += c8 * 0.429043 * ( x * x - y * y ); return max( result, vec3( 0.0 ) ); } -#endif`,qx=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`,v2=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`,jx=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`,b2=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`,Xx=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`,_2=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER varying float vFragDepth; varying float vIsPerspective; -#endif`,Kx=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`,S2=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`,Yx=`#ifdef USE_MAP +#endif`,w2=`#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vMapUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); #endif diffuseColor *= sampledDiffuseColor; -#endif`,Jx=`#ifdef USE_MAP +#endif`,M2=`#ifdef USE_MAP uniform sampler2D map; -#endif`,Zx=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`,x2=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) #if defined( USE_POINTS_UV ) vec2 uv = vUv; #else @@ -1502,7 +1673,7 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,Qx=`#if defined( USE_POINTS_UV ) +#endif`,P2=`#if defined( USE_POINTS_UV ) varying vec2 vUv; #else #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) @@ -1514,19 +1685,19 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`,eT=`float metalnessFactor = metalness; +#endif`,T2=`float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); metalnessFactor *= texelMetalness.b; -#endif`,tT=`#ifdef USE_METALNESSMAP +#endif`,A2=`#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`,iT=`#ifdef USE_INSTANCING_MORPH +#endif`,C2=`#ifdef USE_INSTANCING_MORPH float morphTargetInfluences[ MORPHTARGETS_COUNT ]; float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; } -#endif`,nT=`#if defined( USE_MORPHCOLORS ) +#endif`,E2=`#if defined( USE_MORPHCOLORS ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -1535,12 +1706,12 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`,sT=`#ifdef USE_MORPHNORMALS +#endif`,k2=`#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; } -#endif`,rT=`#ifdef USE_MORPHTARGETS +#endif`,R2=`#ifdef USE_MORPHTARGETS #ifndef USE_INSTANCING_MORPH uniform float morphTargetBaseInfluence; uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -1554,12 +1725,12 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { ivec3 morphUV = ivec3( x, y, morphTargetIndex ); return texelFetch( morphTargetsTexture, morphUV, 0 ); } -#endif`,oT=`#ifdef USE_MORPHTARGETS +#endif`,L2=`#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; } -#endif`,aT=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`,D2=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = dFdx( vViewPosition ); vec3 fdy = dFdy( vViewPosition ); @@ -1600,7 +1771,7 @@ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { tbn2[1] *= faceDirection; #endif #endif -vec3 nonPerturbedNormal = normal;`,lT=`#ifdef USE_NORMALMAP_OBJECTSPACE +vec3 nonPerturbedNormal = normal;`,I2=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -1618,25 +1789,25 @@ vec3 nonPerturbedNormal = normal;`,lT=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = normalize( tbn * mapN ); #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`,dT=`#ifndef FLAT_SHADED +#endif`,F2=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`,uT=`#ifndef FLAT_SHADED +#endif`,N2=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`,cT=`#ifndef FLAT_SHADED +#endif`,O2=`#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`,hT=`#ifdef USE_NORMALMAP +#endif`,U2=`#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -1658,13 +1829,13 @@ vec3 nonPerturbedNormal = normal;`,lT=`#ifdef USE_NORMALMAP_OBJECTSPACE float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); return mat3( T * scale, B * scale, N ); } -#endif`,fT=`#ifdef USE_CLEARCOAT +#endif`,V2=`#ifdef USE_CLEARCOAT vec3 clearcoatNormal = nonPerturbedNormal; -#endif`,mT=`#ifdef USE_CLEARCOAT_NORMALMAP +#endif`,B2=`#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`,pT=`#ifdef USE_CLEARCOATMAP +#endif`,z2=`#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP @@ -1673,18 +1844,18 @@ vec3 nonPerturbedNormal = normal;`,lT=`#ifdef USE_NORMALMAP_OBJECTSPACE #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; -#endif`,gT=`#ifdef USE_IRIDESCENCEMAP +#endif`,$2=`#ifdef USE_IRIDESCENCEMAP uniform sampler2D iridescenceMap; #endif #ifdef USE_IRIDESCENCE_THICKNESSMAP uniform sampler2D iridescenceThicknessMap; -#endif`,yT=`#ifdef OPAQUE +#endif`,G2=`#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= material.transmissionAlpha; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,vT=`vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,H2=`vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -1763,9 +1934,9 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const #else return ( near * far ) / ( ( far - near ) * depth - far ); #endif -}`,bT=`#ifdef PREMULTIPLIED_ALPHA +}`,W2=`#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`,_T=`vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`,q2=`vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING mvPosition = batchingMatrix * mvPosition; #endif @@ -1773,22 +1944,22 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`,j2=`#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,wT=`#ifdef DITHERING +#endif`,X2=`#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`,MT=`float roughnessFactor = roughness; +#endif`,K2=`float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); roughnessFactor *= texelRoughness.g; -#endif`,PT=`#ifdef USE_ROUGHNESSMAP +#endif`,Y2=`#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`,xT=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,J2=`#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -1988,7 +2159,7 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING } #endif #endif -#endif`,TT=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Z2=`#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -2029,7 +2200,7 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`,AT=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`,Q2=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) #ifdef HAS_NORMAL vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); #else @@ -2065,7 +2236,7 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`,ET=`float getShadowMask() { +#endif`,eA=`float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -2097,12 +2268,12 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING #endif #endif return shadow; -}`,CT=`#ifdef USE_SKINNING +}`,tA=`#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,kT=`#ifdef USE_SKINNING +#endif`,iA=`#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -2117,7 +2288,7 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`,LT=`#ifdef USE_SKINNING +#endif`,nA=`#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -2125,7 +2296,7 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,RT=`#ifdef USE_SKINNING +#endif`,sA=`#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -2136,17 +2307,17 @@ gl_Position = projectionMatrix * mvPosition;`,ST=`#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`,DT=`float specularStrength; +#endif`,rA=`float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`,IT=`#ifdef USE_SPECULARMAP +#endif`,oA=`#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`,FT=`#if defined( TONE_MAPPING ) +#endif`,aA=`#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,NT=`#ifndef saturate +#endif`,lA=`#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -2243,7 +2414,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`,uA=`#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -2264,7 +2435,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,UT=`#ifdef USE_TRANSMISSION +#endif`,dA=`#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -2390,7 +2561,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`,BT=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,cA=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2460,7 +2631,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,VT=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,hA=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2554,7 +2725,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,zT=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,mA=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -2625,7 +2796,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,$T=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`,pA=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -2634,12 +2805,12 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,OT=`#ifdef USE_TRANSMISS worldPosition = instanceMatrix * worldPosition; #endif worldPosition = modelMatrix * worldPosition; -#endif`;const GT=`varying vec2 vUv; +#endif`;const fA=`varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`,HT=`uniform sampler2D t2D; +}`,gA=`uniform sampler2D t2D; uniform float backgroundIntensity; varying vec2 vUv; void main() { @@ -2651,14 +2822,14 @@ void main() { gl_FragColor = texColor; #include #include -}`,WT=`varying vec3 vWorldDirection; +}`,yA=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`,qT=`#ifdef ENVMAP_TYPE_CUBE +}`,vA=`#ifdef ENVMAP_TYPE_CUBE uniform samplerCube envMap; #elif defined( ENVMAP_TYPE_CUBE_UV ) uniform sampler2D envMap; @@ -2680,14 +2851,14 @@ void main() { gl_FragColor = texColor; #include #include -}`,jT=`varying vec3 vWorldDirection; +}`,bA=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`,XT=`uniform samplerCube tCube; +}`,_A=`uniform samplerCube tCube; uniform float tFlip; uniform float opacity; varying vec3 vWorldDirection; @@ -2697,7 +2868,7 @@ void main() { gl_FragColor.a *= opacity; #include #include -}`,KT=`#include +}`,SA=`#include #include #include #include @@ -2724,7 +2895,7 @@ void main() { #include #include vHighPrecisionZW = gl_Position.zw; -}`,YT=`#if DEPTH_PACKING == 3200 +}`,wA=`#if DEPTH_PACKING == 3200 uniform float opacity; #endif #include @@ -2762,7 +2933,7 @@ void main() { #elif DEPTH_PACKING == 3203 gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); #endif -}`,JT=`#define DISTANCE +}`,MA=`#define DISTANCE varying vec3 vWorldPosition; #include #include @@ -2789,7 +2960,7 @@ void main() { #include #include vWorldPosition = worldPosition.xyz; -}`,ZT=`#define DISTANCE +}`,xA=`#define DISTANCE uniform vec3 referencePosition; uniform float nearDistance; uniform float farDistance; @@ -2812,13 +2983,13 @@ void main () { dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); gl_FragColor = vec4( dist, 0.0, 0.0, 1.0 ); -}`,QT=`varying vec3 vWorldDirection; +}`,PA=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include -}`,e2=`uniform sampler2D tEquirect; +}`,TA=`uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include void main() { @@ -2827,7 +2998,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); #include #include -}`,t2=`uniform float scale; +}`,AA=`uniform float scale; attribute float lineDistance; varying float vLineDistance; #include @@ -2849,7 +3020,7 @@ void main() { #include #include #include -}`,i2=`uniform vec3 diffuse; +}`,CA=`uniform vec3 diffuse; uniform float opacity; uniform float dashSize; uniform float totalSize; @@ -2877,7 +3048,7 @@ void main() { #include #include #include -}`,n2=`#include +}`,EA=`#include #include #include #include @@ -2909,7 +3080,7 @@ void main() { #include #include #include -}`,s2=`uniform vec3 diffuse; +}`,kA=`uniform vec3 diffuse; uniform float opacity; #ifndef FLAT_SHADED varying vec3 vNormal; @@ -2957,7 +3128,7 @@ void main() { #include #include #include -}`,r2=`#define LAMBERT +}`,RA=`#define LAMBERT varying vec3 vViewPosition; #include #include @@ -2996,7 +3167,7 @@ void main() { #include #include #include -}`,o2=`#define LAMBERT +}`,LA=`#define LAMBERT uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -3054,7 +3225,7 @@ void main() { #include #include #include -}`,a2=`#define MATCAP +}`,DA=`#define MATCAP varying vec3 vViewPosition; #include #include @@ -3088,7 +3259,7 @@ void main() { #include #include vViewPosition = - mvPosition.xyz; -}`,l2=`#define MATCAP +}`,IA=`#define MATCAP uniform vec3 diffuse; uniform float opacity; uniform sampler2D matcap; @@ -3134,7 +3305,7 @@ void main() { #include #include #include -}`,d2=`#define NORMAL +}`,FA=`#define NORMAL #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; #endif @@ -3167,7 +3338,7 @@ void main() { #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) vViewPosition = - mvPosition.xyz; #endif -}`,u2=`#define NORMAL +}`,NA=`#define NORMAL uniform float opacity; #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; @@ -3188,7 +3359,7 @@ void main() { #ifdef OPAQUE gl_FragColor.a = 1.0; #endif -}`,c2=`#define PHONG +}`,OA=`#define PHONG varying vec3 vViewPosition; #include #include @@ -3227,7 +3398,7 @@ void main() { #include #include #include -}`,h2=`#define PHONG +}`,UA=`#define PHONG uniform vec3 diffuse; uniform vec3 emissive; uniform vec3 specular; @@ -3287,7 +3458,7 @@ void main() { #include #include #include -}`,f2=`#define STANDARD +}`,VA=`#define STANDARD varying vec3 vViewPosition; #ifdef USE_TRANSMISSION varying vec3 vWorldPosition; @@ -3330,7 +3501,7 @@ void main() { #ifdef USE_TRANSMISSION vWorldPosition = worldPosition.xyz; #endif -}`,m2=`#define STANDARD +}`,BA=`#define STANDARD #ifdef PHYSICAL #define IOR #define USE_SPECULAR @@ -3455,7 +3626,7 @@ void main() { #include #include #include -}`,p2=`#define TOON +}`,zA=`#define TOON varying vec3 vViewPosition; #include #include @@ -3492,7 +3663,7 @@ void main() { #include #include #include -}`,g2=`#define TOON +}`,$A=`#define TOON uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -3544,7 +3715,7 @@ void main() { #include #include #include -}`,y2=`uniform float size; +}`,GA=`uniform float size; uniform float scale; #include #include @@ -3575,7 +3746,7 @@ void main() { #include #include #include -}`,v2=`uniform vec3 diffuse; +}`,HA=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -3600,7 +3771,7 @@ void main() { #include #include #include -}`,b2=`#include +}`,WA=`#include #include #include #include @@ -3623,7 +3794,7 @@ void main() { #include #include #include -}`,_2=`uniform vec3 color; +}`,qA=`uniform vec3 color; uniform float opacity; #include #include @@ -3639,7 +3810,7 @@ void main() { #include #include #include -}`,S2=`uniform float rotation; +}`,jA=`uniform float rotation; uniform vec2 center; #include #include @@ -3663,7 +3834,7 @@ void main() { #include #include #include -}`,w2=`uniform vec3 diffuse; +}`,XA=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -3688,7 +3859,7 @@ void main() { #include #include #include -}`,pt={alphahash_fragment:GP,alphahash_pars_fragment:HP,alphamap_fragment:WP,alphamap_pars_fragment:qP,alphatest_fragment:jP,alphatest_pars_fragment:XP,aomap_fragment:KP,aomap_pars_fragment:YP,batching_pars_vertex:JP,batching_vertex:ZP,begin_vertex:QP,beginnormal_vertex:ex,bsdfs:tx,iridescence_fragment:ix,bumpmap_pars_fragment:nx,clipping_planes_fragment:sx,clipping_planes_pars_fragment:rx,clipping_planes_pars_vertex:ox,clipping_planes_vertex:ax,color_fragment:lx,color_pars_fragment:dx,color_pars_vertex:ux,color_vertex:cx,common:hx,cube_uv_reflection_fragment:fx,defaultnormal_vertex:mx,displacementmap_pars_vertex:px,displacementmap_vertex:gx,emissivemap_fragment:yx,emissivemap_pars_fragment:vx,colorspace_fragment:bx,colorspace_pars_fragment:_x,envmap_fragment:Sx,envmap_common_pars_fragment:wx,envmap_pars_fragment:Mx,envmap_pars_vertex:Px,envmap_physical_pars_fragment:Fx,envmap_vertex:xx,fog_vertex:Tx,fog_pars_vertex:Ax,fog_fragment:Ex,fog_pars_fragment:Cx,gradientmap_pars_fragment:kx,lightmap_pars_fragment:Lx,lights_lambert_fragment:Rx,lights_lambert_pars_fragment:Dx,lights_pars_begin:Ix,lights_toon_fragment:Nx,lights_toon_pars_fragment:Ox,lights_phong_fragment:Ux,lights_phong_pars_fragment:Bx,lights_physical_fragment:Vx,lights_physical_pars_fragment:zx,lights_fragment_begin:$x,lights_fragment_maps:Gx,lights_fragment_end:Hx,lightprobes_pars_fragment:Wx,logdepthbuf_fragment:qx,logdepthbuf_pars_fragment:jx,logdepthbuf_pars_vertex:Xx,logdepthbuf_vertex:Kx,map_fragment:Yx,map_pars_fragment:Jx,map_particle_fragment:Zx,map_particle_pars_fragment:Qx,metalnessmap_fragment:eT,metalnessmap_pars_fragment:tT,morphinstance_vertex:iT,morphcolor_vertex:nT,morphnormal_vertex:sT,morphtarget_pars_vertex:rT,morphtarget_vertex:oT,normal_fragment_begin:aT,normal_fragment_maps:lT,normal_pars_fragment:dT,normal_pars_vertex:uT,normal_vertex:cT,normalmap_pars_fragment:hT,clearcoat_normal_fragment_begin:fT,clearcoat_normal_fragment_maps:mT,clearcoat_pars_fragment:pT,iridescence_pars_fragment:gT,opaque_fragment:yT,packing:vT,premultiplied_alpha_fragment:bT,project_vertex:_T,dithering_fragment:ST,dithering_pars_fragment:wT,roughnessmap_fragment:MT,roughnessmap_pars_fragment:PT,shadowmap_pars_fragment:xT,shadowmap_pars_vertex:TT,shadowmap_vertex:AT,shadowmask_pars_fragment:ET,skinbase_vertex:CT,skinning_pars_vertex:kT,skinning_vertex:LT,skinnormal_vertex:RT,specularmap_fragment:DT,specularmap_pars_fragment:IT,tonemapping_fragment:FT,tonemapping_pars_fragment:NT,transmission_fragment:OT,transmission_pars_fragment:UT,uv_pars_fragment:BT,uv_pars_vertex:VT,uv_vertex:zT,worldpos_vertex:$T,background_vert:GT,background_frag:HT,backgroundCube_vert:WT,backgroundCube_frag:qT,cube_vert:jT,cube_frag:XT,depth_vert:KT,depth_frag:YT,distance_vert:JT,distance_frag:ZT,equirect_vert:QT,equirect_frag:e2,linedashed_vert:t2,linedashed_frag:i2,meshbasic_vert:n2,meshbasic_frag:s2,meshlambert_vert:r2,meshlambert_frag:o2,meshmatcap_vert:a2,meshmatcap_frag:l2,meshnormal_vert:d2,meshnormal_frag:u2,meshphong_vert:c2,meshphong_frag:h2,meshphysical_vert:f2,meshphysical_frag:m2,meshtoon_vert:p2,meshtoon_frag:g2,points_vert:y2,points_frag:v2,shadow_vert:b2,shadow_frag:_2,sprite_vert:S2,sprite_frag:w2},Oe={common:{diffuse:{value:new ze(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new dt},alphaMap:{value:null},alphaMapTransform:{value:new dt},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new dt}},envmap:{envMap:{value:null},envMapRotation:{value:new dt},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new dt}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new dt}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new dt},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new dt},normalScale:{value:new Ye(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new dt},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new dt}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new dt}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new dt}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new ze(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null},probesSH:{value:null},probesMin:{value:new V},probesMax:{value:new V},probesResolution:{value:new V}},points:{diffuse:{value:new ze(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new dt},alphaTest:{value:0},uvTransform:{value:new dt}},sprite:{diffuse:{value:new ze(16777215)},opacity:{value:1},center:{value:new Ye(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new dt},alphaMap:{value:null},alphaMapTransform:{value:new dt},alphaTest:{value:0}}},Li={basic:{uniforms:wi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.fog]),vertexShader:pt.meshbasic_vert,fragmentShader:pt.meshbasic_frag},lambert:{uniforms:wi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,Oe.lights,{emissive:{value:new ze(0)},envMapIntensity:{value:1}}]),vertexShader:pt.meshlambert_vert,fragmentShader:pt.meshlambert_frag},phong:{uniforms:wi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,Oe.lights,{emissive:{value:new ze(0)},specular:{value:new ze(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:pt.meshphong_vert,fragmentShader:pt.meshphong_frag},standard:{uniforms:wi([Oe.common,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.roughnessmap,Oe.metalnessmap,Oe.fog,Oe.lights,{emissive:{value:new ze(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:pt.meshphysical_vert,fragmentShader:pt.meshphysical_frag},toon:{uniforms:wi([Oe.common,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.gradientmap,Oe.fog,Oe.lights,{emissive:{value:new ze(0)}}]),vertexShader:pt.meshtoon_vert,fragmentShader:pt.meshtoon_frag},matcap:{uniforms:wi([Oe.common,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,{matcap:{value:null}}]),vertexShader:pt.meshmatcap_vert,fragmentShader:pt.meshmatcap_frag},points:{uniforms:wi([Oe.points,Oe.fog]),vertexShader:pt.points_vert,fragmentShader:pt.points_frag},dashed:{uniforms:wi([Oe.common,Oe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:pt.linedashed_vert,fragmentShader:pt.linedashed_frag},depth:{uniforms:wi([Oe.common,Oe.displacementmap]),vertexShader:pt.depth_vert,fragmentShader:pt.depth_frag},normal:{uniforms:wi([Oe.common,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,{opacity:{value:1}}]),vertexShader:pt.meshnormal_vert,fragmentShader:pt.meshnormal_frag},sprite:{uniforms:wi([Oe.sprite,Oe.fog]),vertexShader:pt.sprite_vert,fragmentShader:pt.sprite_frag},background:{uniforms:{uvTransform:{value:new dt},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:pt.background_vert,fragmentShader:pt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new dt}},vertexShader:pt.backgroundCube_vert,fragmentShader:pt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:pt.cube_vert,fragmentShader:pt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:pt.equirect_vert,fragmentShader:pt.equirect_frag},distance:{uniforms:wi([Oe.common,Oe.displacementmap,{referencePosition:{value:new V},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:pt.distance_vert,fragmentShader:pt.distance_frag},shadow:{uniforms:wi([Oe.lights,Oe.fog,{color:{value:new ze(0)},opacity:{value:1}}]),vertexShader:pt.shadow_vert,fragmentShader:pt.shadow_frag}};Li.physical={uniforms:wi([Li.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new dt},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new dt},clearcoatNormalScale:{value:new Ye(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new dt},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new dt},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new dt},sheen:{value:0},sheenColor:{value:new ze(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new dt},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new dt},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new dt},transmissionSamplerSize:{value:new Ye},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new dt},attenuationDistance:{value:0},attenuationColor:{value:new ze(0)},specularColor:{value:new ze(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new dt},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new dt},anisotropyVector:{value:new Ye},anisotropyMap:{value:null},anisotropyMapTransform:{value:new dt}}]),vertexShader:pt.meshphysical_vert,fragmentShader:pt.meshphysical_frag};const Na={r:0,b:0,g:0},M2=new At,qg=new dt;qg.set(-1,0,0,0,1,0,0,0,1);function P2(t,e,i,n,s,r){const l=new ze(0);let o=s===!0?0:1,d,u,h=null,c=0,f=null;function g(S){let w=S.isScene===!0?S.background:null;if(w&&w.isTexture){const x=S.backgroundBlurriness>0;w=e.get(w,x)}return w}function y(S){let w=!1;const x=g(S);x===null?_(l,o):x&&x.isColor&&(_(x,1),w=!0);const k=t.xr.getEnvironmentBlendMode();k==="additive"?i.buffers.color.setClear(0,0,0,1,r):k==="alpha-blend"&&i.buffers.color.setClear(0,0,0,0,r),(t.autoClear||w)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil))}function T(S,w){const x=g(w);x&&(x.isCubeTexture||x.mapping===Fl)?(u===void 0&&(u=new $t(new Xs(1,1,1),new Ai({name:"BackgroundCubeMaterial",uniforms:Hr(Li.backgroundCube.uniforms),vertexShader:Li.backgroundCube.vertexShader,fragmentShader:Li.backgroundCube.fragmentShader,side:Ti,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(k,E,D){this.matrixWorld.copyPosition(D.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(u)),u.material.uniforms.envMap.value=x,u.material.uniforms.backgroundBlurriness.value=w.backgroundBlurriness,u.material.uniforms.backgroundIntensity.value=w.backgroundIntensity,u.material.uniforms.backgroundRotation.value.setFromMatrix4(M2.makeRotationFromEuler(w.backgroundRotation)).transpose(),x.isCubeTexture&&x.isRenderTargetTexture===!1&&u.material.uniforms.backgroundRotation.value.premultiply(qg),u.material.toneMapped=bt.getTransfer(x.colorSpace)!==Ct,(h!==x||c!==x.version||f!==t.toneMapping)&&(u.material.needsUpdate=!0,h=x,c=x.version,f=t.toneMapping),u.layers.enableAll(),S.unshift(u,u.geometry,u.material,0,0,null)):x&&x.isTexture&&(d===void 0&&(d=new $t(new Hs(2,2),new Ai({name:"BackgroundMaterial",uniforms:Hr(Li.background.uniforms),vertexShader:Li.background.vertexShader,fragmentShader:Li.background.fragmentShader,side:Kn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),d.geometry.deleteAttribute("normal"),Object.defineProperty(d.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(d)),d.material.uniforms.t2D.value=x,d.material.uniforms.backgroundIntensity.value=w.backgroundIntensity,d.material.toneMapped=bt.getTransfer(x.colorSpace)!==Ct,x.matrixAutoUpdate===!0&&x.updateMatrix(),d.material.uniforms.uvTransform.value.copy(x.matrix),(h!==x||c!==x.version||f!==t.toneMapping)&&(d.material.needsUpdate=!0,h=x,c=x.version,f=t.toneMapping),d.layers.enableAll(),S.unshift(d,d.geometry,d.material,0,0,null))}function _(S,w){S.getRGB(Na,zg(t)),i.buffers.color.setClear(Na.r,Na.g,Na.b,w,r)}function v(){u!==void 0&&(u.geometry.dispose(),u.material.dispose(),u=void 0),d!==void 0&&(d.geometry.dispose(),d.material.dispose(),d=void 0)}return{getClearColor:function(){return l},setClearColor:function(S,w=1){l.set(S),o=w,_(l,o)},getClearAlpha:function(){return o},setClearAlpha:function(S){o=S,_(l,o)},render:y,addToRenderList:T,dispose:v}}function x2(t,e){const i=t.getParameter(t.MAX_VERTEX_ATTRIBS),n={},s=f(null);let r=s,l=!1;function o(I,C,z,K,$){let W=!1;const q=c(I,K,z,C);r!==q&&(r=q,u(r.object)),W=g(I,K,z,$),W&&y(I,K,z,$),$!==null&&e.update($,t.ELEMENT_ARRAY_BUFFER),(W||l)&&(l=!1,x(I,C,z,K),$!==null&&t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,e.get($).buffer))}function d(){return t.createVertexArray()}function u(I){return t.bindVertexArray(I)}function h(I){return t.deleteVertexArray(I)}function c(I,C,z,K){const $=K.wireframe===!0;let W=n[C.id];W===void 0&&(W={},n[C.id]=W);const q=I.isInstancedMesh===!0?I.id:0;let te=W[q];te===void 0&&(te={},W[q]=te);let he=te[z.id];he===void 0&&(he={},te[z.id]=he);let Pe=he[$];return Pe===void 0&&(Pe=f(d()),he[$]=Pe),Pe}function f(I){const C=[],z=[],K=[];for(let $=0;$=0){const Ee=$[he];let Ie=W[he];if(Ie===void 0&&(he==="instanceMatrix"&&I.instanceMatrix&&(Ie=I.instanceMatrix),he==="instanceColor"&&I.instanceColor&&(Ie=I.instanceColor)),Ee===void 0||Ee.attribute!==Ie||Ie&&Ee.data!==Ie.data)return!0;q++}return r.attributesNum!==q||r.index!==K}function y(I,C,z,K){const $={},W=C.attributes;let q=0;const te=z.getAttributes();for(const he in te)if(te[he].location>=0){let Ee=W[he];Ee===void 0&&(he==="instanceMatrix"&&I.instanceMatrix&&(Ee=I.instanceMatrix),he==="instanceColor"&&I.instanceColor&&(Ee=I.instanceColor));const Ie={};Ie.attribute=Ee,Ee&&Ee.data&&(Ie.data=Ee.data),$[he]=Ie,q++}r.attributes=$,r.attributesNum=q,r.index=K}function T(){const I=r.newAttributes;for(let C=0,z=I.length;C=0){let Pe=$[te];if(Pe===void 0&&(te==="instanceMatrix"&&I.instanceMatrix&&(Pe=I.instanceMatrix),te==="instanceColor"&&I.instanceColor&&(Pe=I.instanceColor)),Pe!==void 0){const Ee=Pe.normalized,Ie=Pe.itemSize,qe=e.get(Pe);if(qe===void 0)continue;const mt=qe.buffer,st=qe.type,de=qe.bytesPerElement,ke=st===t.INT||st===t.UNSIGNED_INT||Pe.gpuType===Rc;if(Pe.isInterleavedBufferAttribute){const Me=Pe.data,Xe=Me.stride,et=Pe.offset;if(Me.isInstancedInterleavedBuffer){for(let Ze=0;Ze0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT).precision>0)return"highp";D="mediump"}return D==="mediump"&&t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT).precision>0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let u=i.precision!==void 0?i.precision:"highp";const h=d(u);h!==u&&(tt("WebGLRenderer:",u,"not supported, using",h,"instead."),u=h);const c=i.logarithmicDepthBuffer===!0,f=i.reversedDepthBuffer===!0&&e.has("EXT_clip_control");i.reversedDepthBuffer===!0&&f===!1&&tt("WebGLRenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer.");const g=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),y=t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),T=t.getParameter(t.MAX_TEXTURE_SIZE),_=t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE),v=t.getParameter(t.MAX_VERTEX_ATTRIBS),S=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),w=t.getParameter(t.MAX_VARYING_VECTORS),x=t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),k=t.getParameter(t.MAX_SAMPLES),E=t.getParameter(t.SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:d,textureFormatReadable:l,textureTypeReadable:o,precision:u,logarithmicDepthBuffer:c,reversedDepthBuffer:f,maxTextures:g,maxVertexTextures:y,maxTextureSize:T,maxCubemapSize:_,maxAttributes:v,maxVertexUniforms:S,maxVaryings:w,maxFragmentUniforms:x,maxSamples:k,samples:E}}function E2(t){const e=this;let i=null,n=0,s=!1,r=!1;const l=new Un,o=new dt,d={value:null,needsUpdate:!1};this.uniform=d,this.numPlanes=0,this.numIntersection=0,this.init=function(c,f){const g=c.length!==0||f||n!==0||s;return s=f,n=c.length,g},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(c,f){i=h(c,f,0)},this.setState=function(c,f,g){const y=c.clippingPlanes,T=c.clipIntersection,_=c.clipShadows,v=t.get(c);if(!s||y===null||y.length===0||r&&!_)r?h(null):u();else{const S=r?0:n,w=S*4;let x=v.clippingState||null;d.value=x,x=h(y,f,w,g);for(let k=0;k!==w;++k)x[k]=i[k];v.clippingState=x,this.numIntersection=T?this.numPlanes:0,this.numPlanes+=S}};function u(){d.value!==i&&(d.value=i,d.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(c,f,g,y){const T=c!==null?c.length:0;let _=null;if(T!==0){if(_=d.value,y!==!0||_===null){const v=g+T*4,S=f.matrixWorldInverse;o.getNormalMatrix(S),(_===null||_.length0&&this._blur(d,0,0,i),this._applyPMREM(d),this._cleanup(d),d}fromEquirectangular(e,i=null){return this._fromTexture(e,i)}fromCubemap(e,i=null){return this._fromTexture(e,i)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=cm(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=um(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?k:0,k,k),c.setRenderTarget(s),v&&c.render(T,d),c.render(e,d)}c.toneMapping=g,c.autoClear=f,e.background=S}_textureToCubeUV(e,i){const n=this._renderer,s=e.mapping===qs||e.mapping===$r;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=cm()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=um());const r=s?this._cubemapMaterial:this._equirectMaterial,l=this._lodMeshes[0];l.material=r;const o=r.uniforms;o.envMap.value=e;const d=this._cubeSize;wr(i,0,0,3*d,2*d),n.setRenderTarget(i),n.render(l,ao)}_applyPMREM(e){const i=this._renderer,n=i.autoClear;i.autoClear=!1;const s=this._lodMeshes.length;for(let r=1;ry-ms?n-y+ms:0),v=4*(this._cubeSize-T);d.envMap.value=e.texture,d.roughness.value=g,d.mipInt.value=y-i,wr(r,_,v,3*T,2*T),s.setRenderTarget(r),s.render(o,ao),d.envMap.value=r.texture,d.roughness.value=0,d.mipInt.value=y-n,wr(e,_,v,3*T,2*T),s.setRenderTarget(e),s.render(o,ao)}_blur(e,i,n,s,r){const l=this._pingPongRenderTarget;this._halfBlur(e,l,i,n,s,"latitudinal",r),this._halfBlur(l,e,n,n,s,"longitudinal",r)}_halfBlur(e,i,n,s,r,l,o){const d=this._renderer,u=this._blurMaterial;l!=="latitudinal"&&l!=="longitudinal"&&vt("blur direction must be either latitudinal or longitudinal!");const h=3,c=this._lodMeshes[s];c.material=u;const f=u.uniforms,g=this._sizeLods[n]-1,y=isFinite(r)?Math.PI/(2*g):2*Math.PI/(2*Us-1),T=r/y,_=isFinite(r)?1+Math.floor(h*T):Us;_>Us&&tt(`sigmaRadians, ${r}, is too large and will clip, as it requested ${_} samples when the maximum is set to ${Us}`);const v=[];let S=0;for(let D=0;Dw-ms?s-w+ms:0),E=4*(this._cubeSize-x);wr(i,k,E,3*x,2*x),d.setRenderTarget(i),d.render(c,ao)}}function L2(t){const e=[],i=[],n=[];let s=t;const r=t-ms+1+am.length;for(let l=0;lt-ms?d=am[l-t+ms-1]:l===0&&(d=0),i.push(d);const u=1/(o-2),h=-u,c=1+u,f=[h,h,c,h,c,c,h,h,c,c,h,c],g=6,y=6,T=3,_=2,v=1,S=new Float32Array(T*y*g),w=new Float32Array(_*y*g),x=new Float32Array(v*y*g);for(let E=0;E2?0:-1,M=[D,P,0,D+2/3,P,0,D+2/3,P+1,0,D,P,0,D+2/3,P+1,0,D,P+1,0];S.set(M,T*y*E),w.set(f,_*y*E);const F=[E,E,E,E,E,E];x.set(F,v*y*E)}const k=new zt;k.setAttribute("position",new ei(S,T)),k.setAttribute("uv",new ei(w,_)),k.setAttribute("faceIndex",new ei(x,v)),n.push(new $t(k,null)),s>ms&&s--}return{lodMeshes:n,sizeLods:e,sigmas:i}}function dm(t,e,i){const n=new tn(t,e,i);return n.texture.mapping=Fl,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function wr(t,e,i,n,s){t.viewport.set(e,i,n,s),t.scissor.set(e,i,n,s)}function R2(t,e,i){return new Ai({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:C2,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Ol(),fragmentShader:` +}`,pt={alphahash_fragment:fT,alphahash_pars_fragment:gT,alphamap_fragment:yT,alphamap_pars_fragment:vT,alphatest_fragment:bT,alphatest_pars_fragment:_T,aomap_fragment:ST,aomap_pars_fragment:wT,batching_pars_vertex:MT,batching_vertex:xT,begin_vertex:PT,beginnormal_vertex:TT,bsdfs:AT,iridescence_fragment:CT,bumpmap_pars_fragment:ET,clipping_planes_fragment:kT,clipping_planes_pars_fragment:RT,clipping_planes_pars_vertex:LT,clipping_planes_vertex:DT,color_fragment:IT,color_pars_fragment:FT,color_pars_vertex:NT,color_vertex:OT,common:UT,cube_uv_reflection_fragment:VT,defaultnormal_vertex:BT,displacementmap_pars_vertex:zT,displacementmap_vertex:$T,emissivemap_fragment:GT,emissivemap_pars_fragment:HT,colorspace_fragment:WT,colorspace_pars_fragment:qT,envmap_fragment:jT,envmap_common_pars_fragment:XT,envmap_pars_fragment:KT,envmap_pars_vertex:YT,envmap_physical_pars_fragment:a2,envmap_vertex:JT,fog_vertex:ZT,fog_pars_vertex:QT,fog_fragment:e2,fog_pars_fragment:t2,gradientmap_pars_fragment:i2,lightmap_pars_fragment:n2,lights_lambert_fragment:s2,lights_lambert_pars_fragment:r2,lights_pars_begin:o2,lights_toon_fragment:l2,lights_toon_pars_fragment:u2,lights_phong_fragment:d2,lights_phong_pars_fragment:c2,lights_physical_fragment:h2,lights_physical_pars_fragment:m2,lights_fragment_begin:p2,lights_fragment_maps:f2,lights_fragment_end:g2,lightprobes_pars_fragment:y2,logdepthbuf_fragment:v2,logdepthbuf_pars_fragment:b2,logdepthbuf_pars_vertex:_2,logdepthbuf_vertex:S2,map_fragment:w2,map_pars_fragment:M2,map_particle_fragment:x2,map_particle_pars_fragment:P2,metalnessmap_fragment:T2,metalnessmap_pars_fragment:A2,morphinstance_vertex:C2,morphcolor_vertex:E2,morphnormal_vertex:k2,morphtarget_pars_vertex:R2,morphtarget_vertex:L2,normal_fragment_begin:D2,normal_fragment_maps:I2,normal_pars_fragment:F2,normal_pars_vertex:N2,normal_vertex:O2,normalmap_pars_fragment:U2,clearcoat_normal_fragment_begin:V2,clearcoat_normal_fragment_maps:B2,clearcoat_pars_fragment:z2,iridescence_pars_fragment:$2,opaque_fragment:G2,packing:H2,premultiplied_alpha_fragment:W2,project_vertex:q2,dithering_fragment:j2,dithering_pars_fragment:X2,roughnessmap_fragment:K2,roughnessmap_pars_fragment:Y2,shadowmap_pars_fragment:J2,shadowmap_pars_vertex:Z2,shadowmap_vertex:Q2,shadowmask_pars_fragment:eA,skinbase_vertex:tA,skinning_pars_vertex:iA,skinning_vertex:nA,skinnormal_vertex:sA,specularmap_fragment:rA,specularmap_pars_fragment:oA,tonemapping_fragment:aA,tonemapping_pars_fragment:lA,transmission_fragment:uA,transmission_pars_fragment:dA,uv_pars_fragment:cA,uv_pars_vertex:hA,uv_vertex:mA,worldpos_vertex:pA,background_vert:fA,background_frag:gA,backgroundCube_vert:yA,backgroundCube_frag:vA,cube_vert:bA,cube_frag:_A,depth_vert:SA,depth_frag:wA,distance_vert:MA,distance_frag:xA,equirect_vert:PA,equirect_frag:TA,linedashed_vert:AA,linedashed_frag:CA,meshbasic_vert:EA,meshbasic_frag:kA,meshlambert_vert:RA,meshlambert_frag:LA,meshmatcap_vert:DA,meshmatcap_frag:IA,meshnormal_vert:FA,meshnormal_frag:NA,meshphong_vert:OA,meshphong_frag:UA,meshphysical_vert:VA,meshphysical_frag:BA,meshtoon_vert:zA,meshtoon_frag:$A,points_vert:GA,points_frag:HA,shadow_vert:WA,shadow_frag:qA,sprite_vert:jA,sprite_frag:XA},Oe={common:{diffuse:{value:new Ve(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new at},alphaMap:{value:null},alphaMapTransform:{value:new at},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new at}},envmap:{envMap:{value:null},envMapRotation:{value:new at},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new at}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new at}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new at},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new at},normalScale:{value:new Xe(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new at},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new at}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new at}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new at}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Ve(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null},probesSH:{value:null},probesMin:{value:new B},probesMax:{value:new B},probesResolution:{value:new B}},points:{diffuse:{value:new Ve(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new at},alphaTest:{value:0},uvTransform:{value:new at}},sprite:{diffuse:{value:new Ve(16777215)},opacity:{value:1},center:{value:new Xe(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new at},alphaMap:{value:null},alphaMapTransform:{value:new at},alphaTest:{value:0}}},Di={basic:{uniforms:Pi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.fog]),vertexShader:pt.meshbasic_vert,fragmentShader:pt.meshbasic_frag},lambert:{uniforms:Pi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,Oe.lights,{emissive:{value:new Ve(0)},envMapIntensity:{value:1}}]),vertexShader:pt.meshlambert_vert,fragmentShader:pt.meshlambert_frag},phong:{uniforms:Pi([Oe.common,Oe.specularmap,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,Oe.lights,{emissive:{value:new Ve(0)},specular:{value:new Ve(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:pt.meshphong_vert,fragmentShader:pt.meshphong_frag},standard:{uniforms:Pi([Oe.common,Oe.envmap,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.roughnessmap,Oe.metalnessmap,Oe.fog,Oe.lights,{emissive:{value:new Ve(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:pt.meshphysical_vert,fragmentShader:pt.meshphysical_frag},toon:{uniforms:Pi([Oe.common,Oe.aomap,Oe.lightmap,Oe.emissivemap,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.gradientmap,Oe.fog,Oe.lights,{emissive:{value:new Ve(0)}}]),vertexShader:pt.meshtoon_vert,fragmentShader:pt.meshtoon_frag},matcap:{uniforms:Pi([Oe.common,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,Oe.fog,{matcap:{value:null}}]),vertexShader:pt.meshmatcap_vert,fragmentShader:pt.meshmatcap_frag},points:{uniforms:Pi([Oe.points,Oe.fog]),vertexShader:pt.points_vert,fragmentShader:pt.points_frag},dashed:{uniforms:Pi([Oe.common,Oe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:pt.linedashed_vert,fragmentShader:pt.linedashed_frag},depth:{uniforms:Pi([Oe.common,Oe.displacementmap]),vertexShader:pt.depth_vert,fragmentShader:pt.depth_frag},normal:{uniforms:Pi([Oe.common,Oe.bumpmap,Oe.normalmap,Oe.displacementmap,{opacity:{value:1}}]),vertexShader:pt.meshnormal_vert,fragmentShader:pt.meshnormal_frag},sprite:{uniforms:Pi([Oe.sprite,Oe.fog]),vertexShader:pt.sprite_vert,fragmentShader:pt.sprite_frag},background:{uniforms:{uvTransform:{value:new at},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:pt.background_vert,fragmentShader:pt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new at}},vertexShader:pt.backgroundCube_vert,fragmentShader:pt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:pt.cube_vert,fragmentShader:pt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:pt.equirect_vert,fragmentShader:pt.equirect_frag},distance:{uniforms:Pi([Oe.common,Oe.displacementmap,{referencePosition:{value:new B},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:pt.distance_vert,fragmentShader:pt.distance_frag},shadow:{uniforms:Pi([Oe.lights,Oe.fog,{color:{value:new Ve(0)},opacity:{value:1}}]),vertexShader:pt.shadow_vert,fragmentShader:pt.shadow_frag}};Di.physical={uniforms:Pi([Di.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new at},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new at},clearcoatNormalScale:{value:new Xe(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new at},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new at},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new at},sheen:{value:0},sheenColor:{value:new Ve(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new at},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new at},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new at},transmissionSamplerSize:{value:new Xe},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new at},attenuationDistance:{value:0},attenuationColor:{value:new Ve(0)},specularColor:{value:new Ve(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new at},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new at},anisotropyVector:{value:new Xe},anisotropyMap:{value:null},anisotropyMapTransform:{value:new at}}]),vertexShader:pt.meshphysical_vert,fragmentShader:pt.meshphysical_frag};const tl={r:0,b:0,g:0},KA=new _t,Gy=new at;Gy.set(-1,0,0,0,1,0,0,0,1);function YA(t,e,i,n,s,r){const l=new Ve(0);let o=s===!0?0:1,u,c,h=null,d=0,m=null;function g(S){let P=S.isScene===!0?S.background:null;if(P&&P.isTexture){const M=S.backgroundBlurriness>0;P=e.get(P,M)}return P}function b(S){let P=!1;const M=g(S);M===null?v(l,o):M&&M.isColor&&(v(M,1),P=!0);const k=t.xr.getEnvironmentBlendMode();k==="additive"?i.buffers.color.setClear(0,0,0,1,r):k==="alpha-blend"&&i.buffers.color.setClear(0,0,0,0,r),(t.autoClear||P)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil))}function w(S,P){const M=g(P);M&&(M.isCubeTexture||M.mapping===nu)?(c===void 0&&(c=new Ut(new xs(1,1,1),new ii({name:"BackgroundCubeMaterial",uniforms:so(Di.backgroundCube.uniforms),vertexShader:Di.backgroundCube.vertexShader,fragmentShader:Di.backgroundCube.fragmentShader,side:Ei,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),c.geometry.deleteAttribute("uv"),c.onBeforeRender=function(k,C,L){this.matrixWorld.copyPosition(L.matrixWorld)},Object.defineProperty(c.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(c)),c.material.uniforms.envMap.value=M,c.material.uniforms.backgroundBlurriness.value=P.backgroundBlurriness,c.material.uniforms.backgroundIntensity.value=P.backgroundIntensity,c.material.uniforms.backgroundRotation.value.setFromMatrix4(KA.makeRotationFromEuler(P.backgroundRotation)).transpose(),M.isCubeTexture&&M.isRenderTargetTexture===!1&&c.material.uniforms.backgroundRotation.value.premultiply(Gy),c.material.toneMapped=vt.getTransfer(M.colorSpace)!==At,(h!==M||d!==M.version||m!==t.toneMapping)&&(c.material.needsUpdate=!0,h=M,d=M.version,m=t.toneMapping),c.layers.enableAll(),S.unshift(c,c.geometry,c.material,0,0,null)):M&&M.isTexture&&(u===void 0&&(u=new Ut(new Zs(2,2),new ii({name:"BackgroundMaterial",uniforms:so(Di.background.uniforms),vertexShader:Di.background.vertexShader,fragmentShader:Di.background.fragmentShader,side:ts,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),u.geometry.deleteAttribute("normal"),Object.defineProperty(u.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(u)),u.material.uniforms.t2D.value=M,u.material.uniforms.backgroundIntensity.value=P.backgroundIntensity,u.material.toneMapped=vt.getTransfer(M.colorSpace)!==At,M.matrixAutoUpdate===!0&&M.updateMatrix(),u.material.uniforms.uvTransform.value.copy(M.matrix),(h!==M||d!==M.version||m!==t.toneMapping)&&(u.material.needsUpdate=!0,h=M,d=M.version,m=t.toneMapping),u.layers.enableAll(),S.unshift(u,u.geometry,u.material,0,0,null))}function v(S,P){S.getRGB(tl,Oy(t)),i.buffers.color.setClear(tl.r,tl.g,tl.b,P,r)}function y(){c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0),u!==void 0&&(u.geometry.dispose(),u.material.dispose(),u=void 0)}return{getClearColor:function(){return l},setClearColor:function(S,P=1){l.set(S),o=P,v(l,o)},getClearAlpha:function(){return o},setClearAlpha:function(S){o=S,v(l,o)},render:b,addToRenderList:w,dispose:y}}function JA(t,e){const i=t.getParameter(t.MAX_VERTEX_ATTRIBS),n={},s=m(null);let r=s,l=!1;function o(I,E,z,Y,$){let W=!1;const q=d(I,Y,z,E);r!==q&&(r=q,c(r.object)),W=g(I,Y,z,$),W&&b(I,Y,z,$),$!==null&&e.update($,t.ELEMENT_ARRAY_BUFFER),(W||l)&&(l=!1,M(I,E,z,Y),$!==null&&t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,e.get($).buffer))}function u(){return t.createVertexArray()}function c(I){return t.bindVertexArray(I)}function h(I){return t.deleteVertexArray(I)}function d(I,E,z,Y){const $=Y.wireframe===!0;let W=n[E.id];W===void 0&&(W={},n[E.id]=W);const q=I.isInstancedMesh===!0?I.id:0;let te=W[q];te===void 0&&(te={},W[q]=te);let me=te[z.id];me===void 0&&(me={},te[z.id]=me);let xe=me[$];return xe===void 0&&(xe=m(u()),me[$]=xe),xe}function m(I){const E=[],z=[],Y=[];for(let $=0;$=0){const Ce=$[me];let Fe=W[me];if(Fe===void 0&&(me==="instanceMatrix"&&I.instanceMatrix&&(Fe=I.instanceMatrix),me==="instanceColor"&&I.instanceColor&&(Fe=I.instanceColor)),Ce===void 0||Ce.attribute!==Fe||Fe&&Ce.data!==Fe.data)return!0;q++}return r.attributesNum!==q||r.index!==Y}function b(I,E,z,Y){const $={},W=E.attributes;let q=0;const te=z.getAttributes();for(const me in te)if(te[me].location>=0){let Ce=W[me];Ce===void 0&&(me==="instanceMatrix"&&I.instanceMatrix&&(Ce=I.instanceMatrix),me==="instanceColor"&&I.instanceColor&&(Ce=I.instanceColor));const Fe={};Fe.attribute=Ce,Ce&&Ce.data&&(Fe.data=Ce.data),$[me]=Fe,q++}r.attributes=$,r.attributesNum=q,r.index=Y}function w(){const I=r.newAttributes;for(let E=0,z=I.length;E=0){let xe=$[te];if(xe===void 0&&(te==="instanceMatrix"&&I.instanceMatrix&&(xe=I.instanceMatrix),te==="instanceColor"&&I.instanceColor&&(xe=I.instanceColor)),xe!==void 0){const Ce=xe.normalized,Fe=xe.itemSize,qe=e.get(xe);if(qe===void 0)continue;const mt=qe.buffer,st=qe.type,de=qe.bytesPerElement,ke=st===t.INT||st===t.UNSIGNED_INT||xe.gpuType===gh;if(xe.isInterleavedBufferAttribute){const Me=xe.data,Ke=Me.stride,et=xe.offset;if(Me.isInstancedInterleavedBuffer){for(let Ze=0;Ze0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT).precision>0)return"highp";L="mediump"}return L==="mediump"&&t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT).precision>0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=i.precision!==void 0?i.precision:"highp";const h=u(c);h!==c&&(tt("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const d=i.logarithmicDepthBuffer===!0,m=i.reversedDepthBuffer===!0&&e.has("EXT_clip_control");i.reversedDepthBuffer===!0&&m===!1&&tt("WebGLRenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer.");const g=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),b=t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),w=t.getParameter(t.MAX_TEXTURE_SIZE),v=t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE),y=t.getParameter(t.MAX_VERTEX_ATTRIBS),S=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),P=t.getParameter(t.MAX_VARYING_VECTORS),M=t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),k=t.getParameter(t.MAX_SAMPLES),C=t.getParameter(t.SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:u,textureFormatReadable:l,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:d,reversedDepthBuffer:m,maxTextures:g,maxVertexTextures:b,maxTextureSize:w,maxCubemapSize:v,maxAttributes:y,maxVertexUniforms:S,maxVaryings:P,maxFragmentUniforms:M,maxSamples:k,samples:C}}function eC(t){const e=this;let i=null,n=0,s=!1,r=!1;const l=new qn,o=new at,u={value:null,needsUpdate:!1};this.uniform=u,this.numPlanes=0,this.numIntersection=0,this.init=function(d,m){const g=d.length!==0||m||n!==0||s;return s=m,n=d.length,g},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,m){i=h(d,m,0)},this.setState=function(d,m,g){const b=d.clippingPlanes,w=d.clipIntersection,v=d.clipShadows,y=t.get(d);if(!s||b===null||b.length===0||r&&!v)r?h(null):c();else{const S=r?0:n,P=S*4;let M=y.clippingState||null;u.value=M,M=h(b,m,P,g);for(let k=0;k!==P;++k)M[k]=i[k];y.clippingState=M,this.numIntersection=w?this.numPlanes:0,this.numPlanes+=S}};function c(){u.value!==i&&(u.value=i,u.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(d,m,g,b){const w=d!==null?d.length:0;let v=null;if(w!==0){if(v=u.value,b!==!0||v===null){const y=g+w*4,S=m.matrixWorldInverse;o.getNormalMatrix(S),(v===null||v.length0&&this._blur(u,0,0,i),this._applyPMREM(u),this._cleanup(u),u}fromEquirectangular(e,i=null){return this._fromTexture(e,i)}fromCubemap(e,i=null){return this._fromTexture(e,i)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=tf(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=ef(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?k:0,k,k),d.setRenderTarget(s),y&&d.render(w,u),d.render(e,u)}d.toneMapping=g,d.autoClear=m,e.background=S}_textureToCubeUV(e,i){const n=this._renderer,s=e.mapping===tr||e.mapping===io;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=tf()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=ef());const r=s?this._cubemapMaterial:this._equirectMaterial,l=this._lodMeshes[0];l.material=r;const o=r.uniforms;o.envMap.value=e;const u=this._cubeSize;Lr(i,0,0,3*u,2*u),n.setRenderTarget(i),n.render(l,Mo)}_applyPMREM(e){const i=this._renderer,n=i.autoClear;i.autoClear=!1;const s=this._lodMeshes.length;for(let r=1;rb-Ss?n-b+Ss:0),y=4*(this._cubeSize-w);u.envMap.value=e.texture,u.roughness.value=g,u.mipInt.value=b-i,Lr(r,v,y,3*w,2*w),s.setRenderTarget(r),s.render(o,Mo),u.envMap.value=r.texture,u.roughness.value=0,u.mipInt.value=b-n,Lr(e,v,y,3*w,2*w),s.setRenderTarget(e),s.render(o,Mo)}_blur(e,i,n,s,r){const l=this._pingPongRenderTarget;this._halfBlur(e,l,i,n,s,"latitudinal",r),this._halfBlur(l,e,n,n,s,"longitudinal",r)}_halfBlur(e,i,n,s,r,l,o){const u=this._renderer,c=this._blurMaterial;l!=="latitudinal"&&l!=="longitudinal"&&bt("blur direction must be either latitudinal or longitudinal!");const h=3,d=this._lodMeshes[s];d.material=c;const m=c.uniforms,g=this._sizeLods[n]-1,b=isFinite(r)?Math.PI/(2*g):2*Math.PI/(2*qs-1),w=r/b,v=isFinite(r)?1+Math.floor(h*w):qs;v>qs&&tt(`sigmaRadians, ${r}, is too large and will clip, as it requested ${v} samples when the maximum is set to ${qs}`);const y=[];let S=0;for(let L=0;LP-Ss?s-P+Ss:0),C=4*(this._cubeSize-M);Lr(i,k,C,3*M,2*M),u.setRenderTarget(i),u.render(d,Mo)}}function nC(t){const e=[],i=[],n=[];let s=t;const r=t-Ss+1+Jp.length;for(let l=0;lt-Ss?u=Jp[l-t+Ss-1]:l===0&&(u=0),i.push(u);const c=1/(o-2),h=-c,d=1+c,m=[h,h,d,h,d,d,h,h,d,d,h,d],g=6,b=6,w=3,v=2,y=1,S=new Float32Array(w*b*g),P=new Float32Array(v*b*g),M=new Float32Array(y*b*g);for(let C=0;C2?0:-1,T=[L,x,0,L+2/3,x,0,L+2/3,x+1,0,L,x,0,L+2/3,x+1,0,L,x+1,0];S.set(T,w*b*C),P.set(m,v*b*C);const F=[C,C,C,C,C,C];M.set(F,y*b*C)}const k=new Bt;k.setAttribute("position",new Qt(S,w)),k.setAttribute("uv",new Qt(P,v)),k.setAttribute("faceIndex",new Qt(M,y)),n.push(new Ut(k,null)),s>Ss&&s--}return{lodMeshes:n,sizeLods:e,sigmas:i}}function Qp(t,e,i){const n=new ki(t,e,i);return n.texture.mapping=nu,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Lr(t,e,i,n,s){t.viewport.set(e,i,n,s),t.scissor.set(e,i,n,s)}function sC(t,e,i){return new ii({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:tC,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ou(),fragmentShader:` precision highp float; precision highp int; @@ -3792,7 +3963,7 @@ void main() { gl_FragColor = vec4(prefilteredColor, 1.0); } - `,blending:Gn,depthTest:!1,depthWrite:!1})}function D2(t,e,i){const n=new Float32Array(Us),s=new V(0,1,0);return new Ai({name:"SphericalGaussianBlur",defines:{n:Us,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:Ol(),fragmentShader:` + `,blending:kn,depthTest:!1,depthWrite:!1})}function rC(t,e,i){const n=new Float32Array(qs),s=new B(0,1,0);return new ii({name:"SphericalGaussianBlur",defines:{n:qs,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:ou(),fragmentShader:` precision mediump float; precision mediump int; @@ -3852,7 +4023,7 @@ void main() { } } - `,blending:Gn,depthTest:!1,depthWrite:!1})}function um(){return new Ai({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Ol(),fragmentShader:` + `,blending:kn,depthTest:!1,depthWrite:!1})}function ef(){return new ii({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ou(),fragmentShader:` precision mediump float; precision mediump int; @@ -3871,7 +4042,7 @@ void main() { gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); } - `,blending:Gn,depthTest:!1,depthWrite:!1})}function cm(){return new Ai({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Ol(),fragmentShader:` + `,blending:kn,depthTest:!1,depthWrite:!1})}function tf(){return new ii({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ou(),fragmentShader:` precision mediump float; precision mediump int; @@ -3887,7 +4058,7 @@ void main() { gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); } - `,blending:Gn,depthTest:!1,depthWrite:!1})}function Ol(){return` + `,blending:kn,depthTest:!1,depthWrite:!1})}function ou(){return` precision mediump float; precision mediump int; @@ -3942,7 +4113,7 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}class jg extends tn{constructor(e=1,i={}){super(e,e,i),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},s=[n,n,n,n,n,n];this.texture=new Ug(s),this._setTextureOptions(i),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,i){this.texture.type=i.type,this.texture.colorSpace=i.colorSpace,this.texture.generateMipmaps=i.generateMipmaps,this.texture.minFilter=i.minFilter,this.texture.magFilter=i.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` + `}class Hy extends ki{constructor(e=1,i={}){super(e,e,i),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},s=[n,n,n,n,n,n];this.texture=new Iy(s),this._setTextureOptions(i),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,i){this.texture.type=i.type,this.texture.colorSpace=i.colorSpace,this.texture.generateMipmaps=i.generateMipmaps,this.texture.minFilter=i.minFilter,this.texture.magFilter=i.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -3977,7 +4148,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},s=new Xs(5,5,5),r=new Ai({name:"CubemapFromEquirect",uniforms:Hr(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:Ti,blending:Gn});r.uniforms.tEquirect.value=i;const l=new $t(s,r),o=i.minFilter;return i.minFilter===Bs&&(i.minFilter=vi),new LP(1,10,this).update(e,l),i.minFilter=o,l.geometry.dispose(),l.material.dispose(),this}clear(e,i=!0,n=!0,s=!0){const r=e.getRenderTarget();for(let l=0;l<6;l++)e.setRenderTarget(this,l),e.clear(i,n,s);e.setRenderTarget(r)}}function I2(t){let e=new WeakMap,i=new WeakMap,n=null;function s(f,g=!1){return f==null?null:g?l(f):r(f)}function r(f){if(f&&f.isTexture){const g=f.mapping;if(g===nd||g===sd)if(e.has(f)){const y=e.get(f).texture;return o(y,f.mapping)}else{const y=f.image;if(y&&y.height>0){const T=new jg(y.height);return T.fromEquirectangularTexture(t,f),e.set(f,T),f.addEventListener("dispose",u),o(T.texture,f.mapping)}else return null}}return f}function l(f){if(f&&f.isTexture){const g=f.mapping,y=g===nd||g===sd,T=g===qs||g===$r;if(y||T){let _=i.get(f);const v=_!==void 0?_.texture.pmremVersion:0;if(f.isRenderTargetTexture&&f.pmremVersion!==v)return n===null&&(n=new nc(t)),_=y?n.fromEquirectangular(f,_):n.fromCubemap(f,_),_.texture.pmremVersion=f.pmremVersion,i.set(f,_),_.texture;if(_!==void 0)return _.texture;{const S=f.image;return y&&S&&S.height>0||T&&S&&d(S)?(n===null&&(n=new nc(t)),_=y?n.fromEquirectangular(f):n.fromCubemap(f),_.texture.pmremVersion=f.pmremVersion,i.set(f,_),f.addEventListener("dispose",h),_.texture):null}}}return f}function o(f,g){return g===nd?f.mapping=qs:g===sd&&(f.mapping=$r),f}function d(f){let g=0;const y=6;for(let T=0;T=65535?Lg:kg)(f,1);_.version=T;const v=r.get(c);v&&e.remove(v),r.set(c,_)}function h(c){const f=r.get(c);if(f){const g=c.index;g!==null&&f.versione.maxTextureSize&&(E=Math.ceil(k/e.maxTextureSize),k=e.maxTextureSize);const D=new Float32Array(k*E*4*c),P=new Eg(D,k,E,c);P.type=_n,P.needsUpdate=!0;const M=x*4;for(let I=0;I0){const w=new Hy(b.height);return w.fromEquirectangularTexture(t,m),e.set(m,w),m.addEventListener("dispose",c),o(w.texture,m.mapping)}else return null}}return m}function l(m){if(m&&m.isTexture){const g=m.mapping,b=g===Au||g===Cu,w=g===tr||g===io;if(b||w){let v=i.get(m);const y=v!==void 0?v.texture.pmremVersion:0;if(m.isRenderTargetTexture&&m.pmremVersion!==y)return n===null&&(n=new Lc(t)),v=b?n.fromEquirectangular(m,v):n.fromCubemap(m,v),v.texture.pmremVersion=m.pmremVersion,i.set(m,v),v.texture;if(v!==void 0)return v.texture;{const S=m.image;return b&&S&&S.height>0||w&&S&&u(S)?(n===null&&(n=new Lc(t)),v=b?n.fromEquirectangular(m):n.fromCubemap(m),v.texture.pmremVersion=m.pmremVersion,i.set(m,v),m.addEventListener("dispose",h),v.texture):null}}}return m}function o(m,g){return g===Au?m.mapping=tr:g===Cu&&(m.mapping=io),m}function u(m){let g=0;const b=6;for(let w=0;w=65535?Ay:Ty)(m,1);v.version=w;const y=r.get(d);y&&e.remove(y),r.set(d,v)}function h(d){const m=r.get(d);if(m){const g=d.index;g!==null&&m.versione.maxTextureSize&&(C=Math.ceil(k/e.maxTextureSize),k=e.maxTextureSize);const L=new Float32Array(k*C*4*d),x=new xy(L,k,C,d);x.type=Gi,x.needsUpdate=!0;const T=M*4;for(let I=0;I0&&_[0].isRenderPass===!0;const w=r.width,x=r.height;for(let k=0;k<_.length;k++){const E=_[k];E.setSize&&E.setSize(w,x)}},this.begin=function(S,w){if(g||S.toneMapping===en&&_.length===0)return!1;if(T=w,w!==null){const x=w.width,k=w.height;(r.width!==x||r.height!==k)&&this.setSize(x,k)}return v===!1&&S.setRenderTarget(r),y=S.toneMapping,S.toneMapping=en,!0},this.hasRenderPass=function(){return v},this.end=function(S,w){S.toneMapping=y,g=!0;let x=r,k=l;for(let E=0;E<_.length;E++){const D=_[E];if(D.enabled!==!1&&(D.render(S,k,x,w),D.needsSwap!==!1)){const P=x;x=k,k=P}}if(c!==S.outputColorSpace||f!==S.toneMapping){c=S.outputColorSpace,f=S.toneMapping,d.defines={},bt.getTransfer(c)===Ct&&(d.defines.SRGB_TRANSFER="");const E=z2[f];E&&(d.defines[E]=""),d.needsUpdate=!0}d.uniforms.tDiffuse.value=x.texture,S.setRenderTarget(T),S.render(u,h),T=null,g=!1},this.isCompositing=function(){return g},this.dispose=function(){r.depthTexture&&r.depthTexture.dispose(),r.dispose(),l.dispose(),o.dispose(),d.dispose()}}const Xg=new ui,sc=new Gr(1,1),Kg=new Eg,Yg=new XM,Jg=new Ug,hm=[],fm=[],mm=new Float32Array(16),pm=new Float32Array(9),gm=new Float32Array(4);function Xr(t,e,i){const n=t[0];if(n<=0||n>0)return t;const s=e*i;let r=hm[s];if(r===void 0&&(r=new Float32Array(s),hm[s]=r),e!==0){n.toArray(r,0);for(let l=1,o=0;l!==e;++l)o+=i,t[l].toArray(r,o)}return r}function ii(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i0&&(this.seq=s.concat(r))}setValue(e,i,n,s){const r=this.map[i];r!==void 0&&r.setValue(e,n,s)}setOptional(e,i,n){const s=i[n];s!==void 0&&this.setValue(e,n,s)}static upload(e,i,n,s){for(let r=0,l=i.length;r!==l;++r){const o=i[r],d=n[o.id];d.needsUpdate!==!1&&o.setValue(e,d.value,s)}}static seqWithValue(e,i){const n=[];for(let s=0,r=e.length;s!==r;++s){const l=e[s];l.id in i&&n.push(l)}return n}}function vm(t,e,i){const n=t.createShader(e);return t.shaderSource(n,i),t.compileShader(n),n}const DA=37297;let IA=0;function FA(t,e){const i=t.split(` + }`,depthTest:!1,depthWrite:!1}),c=new Ut(o,u),h=new ru(-1,1,1,-1,0,1);let d=null,m=null,g=!1,b,w=null,v=[],y=!1;this.setSize=function(S,P){r.setSize(S,P),l.setSize(S,P);for(let M=0;M0&&v[0].isRenderPass===!0;const P=r.width,M=r.height;for(let k=0;k0)return t;const s=e*i;let r=nf[s];if(r===void 0&&(r=new Float32Array(s),nf[s]=r),e!==0){n.toArray(r,0);for(let l=1,o=0;l!==e;++l)o+=i,t[l].toArray(r,o)}return r}function si(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i0&&(this.seq=s.concat(r))}setValue(e,i,n,s){const r=this.map[i];r!==void 0&&r.setValue(e,n,s)}setOptional(e,i,n){const s=i[n];s!==void 0&&this.setValue(e,n,s)}static upload(e,i,n,s){for(let r=0,l=i.length;r!==l;++r){const o=i[r],u=n[o.id];u.needsUpdate!==!1&&o.setValue(e,u.value,s)}}static seqWithValue(e,i){const n=[];for(let s=0,r=e.length;s!==r;++s){const l=e[s];l.id in i&&n.push(l)}return n}}function uf(t,e,i){const n=t.createShader(e);return t.shaderSource(n,i),t.compileShader(n),n}const rE=37297;let oE=0;function aE(t,e){const i=t.split(` `),n=[],s=Math.max(e-6,0),r=Math.min(e+6,i.length);for(let l=s;l":" "} ${o}: ${i[l]}`)}return n.join(` -`)}const bm=new dt;function NA(t){bt._getMatrix(bm,bt.workingColorSpace,t);const e=`mat3( ${bm.elements.map(i=>i.toFixed(4))} )`;switch(bt.getTransfer(t)){case pl:return[e,"LinearTransferOETF"];case Ct:return[e,"sRGBTransferOETF"];default:return tt("WebGLProgram: Unsupported color space: ",t),[e,"LinearTransferOETF"]}}function _m(t,e,i){const n=t.getShaderParameter(e,t.COMPILE_STATUS),r=(t.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";const l=/ERROR: 0:(\d+)/.exec(r);if(l){const o=parseInt(l[1]);return i.toUpperCase()+` +`)}const df=new at;function lE(t){vt._getMatrix(df,vt.workingColorSpace,t);const e=`mat3( ${df.elements.map(i=>i.toFixed(4))} )`;switch(vt.getTransfer(t)){case Fl:return[e,"LinearTransferOETF"];case At:return[e,"sRGBTransferOETF"];default:return tt("WebGLProgram: Unsupported color space: ",t),[e,"LinearTransferOETF"]}}function cf(t,e,i){const n=t.getShaderParameter(e,t.COMPILE_STATUS),r=(t.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";const l=/ERROR: 0:(\d+)/.exec(r);if(l){const o=parseInt(l[1]);return i.toUpperCase()+` `+r+` -`+FA(t.getShaderSource(e),o)}else return r}function OA(t,e){const i=NA(e);return[`vec4 ${t}( vec4 value ) {`,` return ${i[1]}( vec4( value.rgb * ${i[0]}, value.a ) );`,"}"].join(` -`)}const UA={[fg]:"Linear",[mg]:"Reinhard",[pg]:"Cineon",[Lc]:"ACESFilmic",[yg]:"AgX",[vg]:"Neutral",[gg]:"Custom"};function BA(t,e){const i=UA[e];return i===void 0?(tt("WebGLProgram: Unsupported toneMapping:",e),"vec3 "+t+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}const Oa=new V;function VA(){bt.getLuminanceCoefficients(Oa);const t=Oa.x.toFixed(4),e=Oa.y.toFixed(4),i=Oa.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${t}, ${e}, ${i} );`," return dot( weights, rgb );","}"].join(` -`)}function zA(t){return[t.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",t.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(mo).join(` -`)}function $A(t){const e=[];for(const i in t){const n=t[i];n!==!1&&e.push("#define "+i+" "+n)}return e.join(` -`)}function GA(t,e){const i={},n=t.getProgramParameter(e,t.ACTIVE_ATTRIBUTES);for(let s=0;s/gm;function rc(t){return t.replace(HA,qA)}const WA=new Map;function qA(t,e){let i=pt[e];if(i===void 0){const n=WA.get(e);if(n!==void 0)i=pt[n],tt('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return rc(i)}const jA=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Mm(t){return t.replace(jA,XA)}function XA(t,e,i,n){let s="";for(let r=parseInt(e);r/gm;function Ic(t){return t.replace(gE,vE)}const yE=new Map;function vE(t,e){let i=pt[e];if(i===void 0){const n=yE.get(e);if(n!==void 0)i=pt[n],tt('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return Ic(i)}const bE=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function pf(t){return t.replace(bE,_E)}function _E(t,e,i,n){let s="";for(let r=parseInt(e);r0&&(_+=` -`),v=["#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,y].filter(mo).join(` +#define LOW_PRECISION`),e}const SE={[fl]:"SHADOWMAP_TYPE_PCF",[Eo]:"SHADOWMAP_TYPE_VSM"};function wE(t){return SE[t.shadowMapType]||"SHADOWMAP_TYPE_BASIC"}const ME={[tr]:"ENVMAP_TYPE_CUBE",[io]:"ENVMAP_TYPE_CUBE",[nu]:"ENVMAP_TYPE_CUBE_UV"};function xE(t){return t.envMap===!1?"ENVMAP_TYPE_CUBE":ME[t.envMapMode]||"ENVMAP_TYPE_CUBE"}const PE={[io]:"ENVMAP_MODE_REFRACTION"};function TE(t){return t.envMap===!1?"ENVMAP_MODE_REFLECTION":PE[t.envMapMode]||"ENVMAP_MODE_REFLECTION"}const AE={[tu]:"ENVMAP_BLENDING_MULTIPLY",[Ox]:"ENVMAP_BLENDING_MIX",[Ux]:"ENVMAP_BLENDING_ADD"};function CE(t){return t.envMap===!1?"ENVMAP_BLENDING_NONE":AE[t.combine]||"ENVMAP_BLENDING_NONE"}function EE(t){const e=t.envMapCubeUVHeight;if(e===null)return null;const i=Math.log2(e)-2,n=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,i),7*16)),texelHeight:n,maxMip:i}}function kE(t,e,i,n){const s=t.getContext(),r=i.defines;let l=i.vertexShader,o=i.fragmentShader;const u=wE(i),c=xE(i),h=TE(i),d=CE(i),m=EE(i),g=mE(i),b=pE(r),w=s.createProgram();let v,y,S=i.glslVersion?"#version "+i.glslVersion+` +`:"";i.isRawShaderMaterial?(v=["#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,b].filter(ko).join(` `),v.length>0&&(v+=` -`)):(_=[Pm(i),"#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,y,i.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",i.batching?"#define USE_BATCHING":"",i.batchingColor?"#define USE_BATCHING_COLOR":"",i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.instancingMorph?"#define USE_INSTANCING_MORPH":"",i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+h:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",i.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",i.displacementMap?"#define USE_DISPLACEMENTMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.anisotropy?"#define USE_ANISOTROPY":"",i.anisotropyMap?"#define USE_ANISOTROPYMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",i.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaHash?"#define USE_ALPHAHASH":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",i.mapUv?"#define MAP_UV "+i.mapUv:"",i.alphaMapUv?"#define ALPHAMAP_UV "+i.alphaMapUv:"",i.lightMapUv?"#define LIGHTMAP_UV "+i.lightMapUv:"",i.aoMapUv?"#define AOMAP_UV "+i.aoMapUv:"",i.emissiveMapUv?"#define EMISSIVEMAP_UV "+i.emissiveMapUv:"",i.bumpMapUv?"#define BUMPMAP_UV "+i.bumpMapUv:"",i.normalMapUv?"#define NORMALMAP_UV "+i.normalMapUv:"",i.displacementMapUv?"#define DISPLACEMENTMAP_UV "+i.displacementMapUv:"",i.metalnessMapUv?"#define METALNESSMAP_UV "+i.metalnessMapUv:"",i.roughnessMapUv?"#define ROUGHNESSMAP_UV "+i.roughnessMapUv:"",i.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+i.anisotropyMapUv:"",i.clearcoatMapUv?"#define CLEARCOATMAP_UV "+i.clearcoatMapUv:"",i.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+i.clearcoatNormalMapUv:"",i.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+i.clearcoatRoughnessMapUv:"",i.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+i.iridescenceMapUv:"",i.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+i.iridescenceThicknessMapUv:"",i.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+i.sheenColorMapUv:"",i.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+i.sheenRoughnessMapUv:"",i.specularMapUv?"#define SPECULARMAP_UV "+i.specularMapUv:"",i.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+i.specularColorMapUv:"",i.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+i.specularIntensityMapUv:"",i.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+i.transmissionMapUv:"",i.thicknessMapUv?"#define THICKNESSMAP_UV "+i.thicknessMapUv:"",i.vertexTangents&&i.flatShading===!1?"#define USE_TANGENT":"",i.vertexNormals?"#define HAS_NORMAL":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUv1s?"#define USE_UV1":"",i.vertexUv2s?"#define USE_UV2":"",i.vertexUv3s?"#define USE_UV3":"",i.pointsUvs?"#define USE_POINTS_UV":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&i.flatShading===!1?"#define USE_MORPHNORMALS":"",i.morphColors?"#define USE_MORPHCOLORS":"",i.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+i.morphTextureStride:"",i.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+d:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.numLightProbes>0?"#define USE_LIGHT_PROBES":"",i.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",i.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` -`].filter(mo).join(` -`),v=[Pm(i),"#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,y,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+u:"",i.envMap?"#define "+h:"",i.envMap?"#define "+c:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",i.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",i.packedNormalMap?"#define USE_PACKED_NORMALMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.anisotropy?"#define USE_ANISOTROPY":"",i.anisotropyMap?"#define USE_ANISOTROPYMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.dispersion?"#define USE_DISPERSION":"",i.iridescence?"#define USE_IRIDESCENCE":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",i.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.alphaHash?"#define USE_ALPHAHASH":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents&&i.flatShading===!1?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas||i.batchingColor?"#define USE_COLOR_ALPHA":"",i.vertexUv1s?"#define USE_UV1":"",i.vertexUv2s?"#define USE_UV2":"",i.vertexUv3s?"#define USE_UV3":"",i.pointsUvs?"#define USE_POINTS_UV":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+d:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.numLightProbes>0?"#define USE_LIGHT_PROBES":"",i.numLightProbeGrids>0?"#define USE_LIGHT_PROBES_GRID":"",i.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",i.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",i.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",i.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",i.toneMapping!==en?"#define TONE_MAPPING":"",i.toneMapping!==en?pt.tonemapping_pars_fragment:"",i.toneMapping!==en?BA("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.opaque?"#define OPAQUE":"",pt.colorspace_pars_fragment,OA("linearToOutputTexel",i.outputColorSpace),VA(),i.useDepthPacking?"#define DEPTH_PACKING "+i.depthPacking:"",` -`].filter(mo).join(` -`)),l=rc(l),l=Sm(l,i),l=wm(l,i),o=rc(o),o=Sm(o,i),o=wm(o,i),l=Mm(l),o=Mm(o),i.isRawShaderMaterial!==!0&&(S=`#version 300 es -`,_=[g,"#define attribute in","#define varying out","#define texture2D texture"].join(` +`),y=["#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,b].filter(ko).join(` +`),y.length>0&&(y+=` +`)):(v=[ff(i),"#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,b,i.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",i.batching?"#define USE_BATCHING":"",i.batchingColor?"#define USE_BATCHING_COLOR":"",i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.instancingMorph?"#define USE_INSTANCING_MORPH":"",i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+h:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",i.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",i.displacementMap?"#define USE_DISPLACEMENTMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.anisotropy?"#define USE_ANISOTROPY":"",i.anisotropyMap?"#define USE_ANISOTROPYMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",i.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaHash?"#define USE_ALPHAHASH":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",i.mapUv?"#define MAP_UV "+i.mapUv:"",i.alphaMapUv?"#define ALPHAMAP_UV "+i.alphaMapUv:"",i.lightMapUv?"#define LIGHTMAP_UV "+i.lightMapUv:"",i.aoMapUv?"#define AOMAP_UV "+i.aoMapUv:"",i.emissiveMapUv?"#define EMISSIVEMAP_UV "+i.emissiveMapUv:"",i.bumpMapUv?"#define BUMPMAP_UV "+i.bumpMapUv:"",i.normalMapUv?"#define NORMALMAP_UV "+i.normalMapUv:"",i.displacementMapUv?"#define DISPLACEMENTMAP_UV "+i.displacementMapUv:"",i.metalnessMapUv?"#define METALNESSMAP_UV "+i.metalnessMapUv:"",i.roughnessMapUv?"#define ROUGHNESSMAP_UV "+i.roughnessMapUv:"",i.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+i.anisotropyMapUv:"",i.clearcoatMapUv?"#define CLEARCOATMAP_UV "+i.clearcoatMapUv:"",i.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+i.clearcoatNormalMapUv:"",i.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+i.clearcoatRoughnessMapUv:"",i.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+i.iridescenceMapUv:"",i.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+i.iridescenceThicknessMapUv:"",i.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+i.sheenColorMapUv:"",i.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+i.sheenRoughnessMapUv:"",i.specularMapUv?"#define SPECULARMAP_UV "+i.specularMapUv:"",i.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+i.specularColorMapUv:"",i.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+i.specularIntensityMapUv:"",i.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+i.transmissionMapUv:"",i.thicknessMapUv?"#define THICKNESSMAP_UV "+i.thicknessMapUv:"",i.vertexTangents&&i.flatShading===!1?"#define USE_TANGENT":"",i.vertexNormals?"#define HAS_NORMAL":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUv1s?"#define USE_UV1":"",i.vertexUv2s?"#define USE_UV2":"",i.vertexUv3s?"#define USE_UV3":"",i.pointsUvs?"#define USE_POINTS_UV":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&i.flatShading===!1?"#define USE_MORPHNORMALS":"",i.morphColors?"#define USE_MORPHCOLORS":"",i.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+i.morphTextureStride:"",i.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.numLightProbes>0?"#define USE_LIGHT_PROBES":"",i.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",i.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` +`].filter(ko).join(` +`),y=[ff(i),"#define SHADER_TYPE "+i.shaderType,"#define SHADER_NAME "+i.shaderName,b,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+c:"",i.envMap?"#define "+h:"",i.envMap?"#define "+d:"",m?"#define CUBEUV_TEXEL_WIDTH "+m.texelWidth:"",m?"#define CUBEUV_TEXEL_HEIGHT "+m.texelHeight:"",m?"#define CUBEUV_MAX_MIP "+m.maxMip+".0":"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",i.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",i.packedNormalMap?"#define USE_PACKED_NORMALMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.anisotropy?"#define USE_ANISOTROPY":"",i.anisotropyMap?"#define USE_ANISOTROPYMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.dispersion?"#define USE_DISPERSION":"",i.iridescence?"#define USE_IRIDESCENCE":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",i.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.alphaHash?"#define USE_ALPHAHASH":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents&&i.flatShading===!1?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas||i.batchingColor?"#define USE_COLOR_ALPHA":"",i.vertexUv1s?"#define USE_UV1":"",i.vertexUv2s?"#define USE_UV2":"",i.vertexUv3s?"#define USE_UV3":"",i.pointsUvs?"#define USE_POINTS_UV":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.numLightProbes>0?"#define USE_LIGHT_PROBES":"",i.numLightProbeGrids>0?"#define USE_LIGHT_PROBES_GRID":"",i.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",i.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",i.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",i.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",i.toneMapping!==on?"#define TONE_MAPPING":"",i.toneMapping!==on?pt.tonemapping_pars_fragment:"",i.toneMapping!==on?cE("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.opaque?"#define OPAQUE":"",pt.colorspace_pars_fragment,uE("linearToOutputTexel",i.outputColorSpace),hE(),i.useDepthPacking?"#define DEPTH_PACKING "+i.depthPacking:"",` +`].filter(ko).join(` +`)),l=Ic(l),l=hf(l,i),l=mf(l,i),o=Ic(o),o=hf(o,i),o=mf(o,i),l=pf(l),o=pf(o),i.isRawShaderMaterial!==!0&&(S=`#version 300 es +`,v=[g,"#define attribute in","#define varying out","#define texture2D texture"].join(` `)+` -`+_,v=["#define varying in",i.glslVersion===bf?"":"layout(location = 0) out highp vec4 pc_fragColor;",i.glslVersion===bf?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` +`+v,y=["#define varying in",i.glslVersion===up?"":"layout(location = 0) out highp vec4 pc_fragColor;",i.glslVersion===up?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` `)+` -`+v);const w=S+_+l,x=S+v+o,k=vm(s,s.VERTEX_SHADER,w),E=vm(s,s.FRAGMENT_SHADER,x);s.attachShader(T,k),s.attachShader(T,E),i.index0AttributeName!==void 0?s.bindAttribLocation(T,0,i.index0AttributeName):i.morphTargets===!0&&s.bindAttribLocation(T,0,"position"),s.linkProgram(T);function D(I){if(t.debug.checkShaderErrors){const C=s.getProgramInfoLog(T)||"",z=s.getShaderInfoLog(k)||"",K=s.getShaderInfoLog(E)||"",$=C.trim(),W=z.trim(),q=K.trim();let te=!0,he=!0;if(s.getProgramParameter(T,s.LINK_STATUS)===!1)if(te=!1,typeof t.debug.onShaderError=="function")t.debug.onShaderError(s,T,k,E);else{const Pe=_m(s,k,"vertex"),Ee=_m(s,E,"fragment");vt("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(T,s.VALIDATE_STATUS)+` +`+y);const P=S+v+l,M=S+y+o,k=uf(s,s.VERTEX_SHADER,P),C=uf(s,s.FRAGMENT_SHADER,M);s.attachShader(w,k),s.attachShader(w,C),i.index0AttributeName!==void 0?s.bindAttribLocation(w,0,i.index0AttributeName):i.morphTargets===!0&&s.bindAttribLocation(w,0,"position"),s.linkProgram(w);function L(I){if(t.debug.checkShaderErrors){const E=s.getProgramInfoLog(w)||"",z=s.getShaderInfoLog(k)||"",Y=s.getShaderInfoLog(C)||"",$=E.trim(),W=z.trim(),q=Y.trim();let te=!0,me=!0;if(s.getProgramParameter(w,s.LINK_STATUS)===!1)if(te=!1,typeof t.debug.onShaderError=="function")t.debug.onShaderError(s,w,k,C);else{const xe=cf(s,k,"vertex"),Ce=cf(s,C,"fragment");bt("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(w,s.VALIDATE_STATUS)+` Material Name: `+I.name+` Material Type: `+I.type+` Program Info Log: `+$+` -`+Pe+` -`+Ee)}else $!==""?tt("WebGLProgram: Program Info Log:",$):(W===""||q==="")&&(he=!1);he&&(I.diagnostics={runnable:te,programLog:$,vertexShader:{log:W,prefix:_},fragmentShader:{log:q,prefix:v}})}s.deleteShader(k),s.deleteShader(E),P=new el(s,T),M=GA(s,T)}let P;this.getUniforms=function(){return P===void 0&&D(this),P};let M;this.getAttributes=function(){return M===void 0&&D(this),M};let F=i.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return F===!1&&(F=s.getProgramParameter(T,DA)),F},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(T),this.program=void 0},this.type=i.shaderType,this.name=i.shaderName,this.id=IA++,this.cacheKey=e,this.usedTimes=1,this.program=T,this.vertexShader=k,this.fragmentShader=E,this}let rE=0;class oE{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const i=e.vertexShader,n=e.fragmentShader,s=this._getShaderStage(i),r=this._getShaderStage(n),l=this._getShaderCacheForMaterial(e);return l.has(s)===!1&&(l.add(s),s.usedTimes++),l.has(r)===!1&&(l.add(r),r.usedTimes++),this}remove(e){const i=this.materialCache.get(e);for(const n of i)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const i=this.materialCache;let n=i.get(e);return n===void 0&&(n=new Set,i.set(e,n)),n}_getShaderStage(e){const i=this.shaderCache;let n=i.get(e);return n===void 0&&(n=new aE(e),i.set(e,n)),n}}class aE{constructor(e){this.id=rE++,this.code=e,this.usedTimes=0}}function lE(t){return t===js||t===hl||t===fl}function dE(t,e,i,n,s,r){const l=new $c,o=new oE,d=new Set,u=[],h=new Map,c=n.logarithmicDepthBuffer;let f=n.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distance",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function y(P){return d.add(P),P===0?"uv":`uv${P}`}function T(P,M,F,I,C,z){const K=I.fog,$=C.geometry,W=P.isMeshStandardMaterial||P.isMeshLambertMaterial||P.isMeshPhongMaterial?I.environment:null,q=P.isMeshStandardMaterial||P.isMeshLambertMaterial&&!P.envMap||P.isMeshPhongMaterial&&!P.envMap,te=e.get(P.envMap||W,q),he=te&&te.mapping===Fl?te.image.height:null,Pe=g[P.type];P.precision!==null&&(f=n.getMaxPrecision(P.precision),f!==P.precision&&tt("WebGLProgram.getParameters:",P.precision,"not supported, using",f,"instead."));const Ee=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,Ie=Ee!==void 0?Ee.length:0;let qe=0;$.morphAttributes.position!==void 0&&(qe=1),$.morphAttributes.normal!==void 0&&(qe=2),$.morphAttributes.color!==void 0&&(qe=3);let mt,st,de,ke;if(Pe){const ct=Li[Pe];mt=ct.vertexShader,st=ct.fragmentShader}else mt=P.vertexShader,st=P.fragmentShader,o.update(P),de=o.getVertexShaderID(P),ke=o.getFragmentShaderID(P);const Me=t.getRenderTarget(),Xe=t.state.buffers.depth.getReversed(),et=C.isInstancedMesh===!0,Ze=C.isBatchedMesh===!0,U=!!P.map,G=!!P.matcap,Q=!!te,ue=!!P.aoMap,se=!!P.lightMap,fe=!!P.bumpMap,_e=!!P.normalMap,xe=!!P.displacementMap,O=!!P.emissiveMap,me=!!P.metalnessMap,Ce=!!P.roughnessMap,Se=P.anisotropy>0,le=P.clearcoat>0,Ge=P.dispersion>0,R=P.iridescence>0,A=P.sheen>0,X=P.transmission>0,ae=Se&&!!P.anisotropyMap,ge=le&&!!P.clearcoatMap,we=le&&!!P.clearcoatNormalMap,Te=le&&!!P.clearcoatRoughnessMap,re=R&&!!P.iridescenceMap,pe=R&&!!P.iridescenceThicknessMap,Le=A&&!!P.sheenColorMap,Ue=A&&!!P.sheenRoughnessMap,Re=!!P.specularMap,Ae=!!P.specularColorMap,ot=!!P.specularIntensityMap,ft=X&&!!P.transmissionMap,St=X&&!!P.thicknessMap,j=!!P.gradientMap,De=!!P.alphaMap,ce=P.alphaTest>0,$e=!!P.alphaHash,Fe=!!P.extensions;let be=en;P.toneMapped&&(Me===null||Me.isXRRenderTarget===!0)&&(be=t.toneMapping);const Ke={shaderID:Pe,shaderType:P.type,shaderName:P.name,vertexShader:mt,fragmentShader:st,defines:P.defines,customVertexShaderID:de,customFragmentShaderID:ke,isRawShaderMaterial:P.isRawShaderMaterial===!0,glslVersion:P.glslVersion,precision:f,batching:Ze,batchingColor:Ze&&C._colorsTexture!==null,instancing:et,instancingColor:et&&C.instanceColor!==null,instancingMorph:et&&C.morphTexture!==null,outputColorSpace:Me===null?t.outputColorSpace:Me.isXRRenderTarget===!0?Me.texture.colorSpace:bt.workingColorSpace,alphaToCoverage:!!P.alphaToCoverage,map:U,matcap:G,envMap:Q,envMapMode:Q&&te.mapping,envMapCubeUVHeight:he,aoMap:ue,lightMap:se,bumpMap:fe,normalMap:_e,displacementMap:xe,emissiveMap:O,normalMapObjectSpace:_e&&P.normalMapType===pM,normalMapTangentSpace:_e&&P.normalMapType===Bo,packedNormalMap:_e&&P.normalMapType===Bo&&lE(P.normalMap.format),metalnessMap:me,roughnessMap:Ce,anisotropy:Se,anisotropyMap:ae,clearcoat:le,clearcoatMap:ge,clearcoatNormalMap:we,clearcoatRoughnessMap:Te,dispersion:Ge,iridescence:R,iridescenceMap:re,iridescenceThicknessMap:pe,sheen:A,sheenColorMap:Le,sheenRoughnessMap:Ue,specularMap:Re,specularColorMap:Ae,specularIntensityMap:ot,transmission:X,transmissionMap:ft,thicknessMap:St,gradientMap:j,opaque:P.transparent===!1&&P.blending===Ir&&P.alphaToCoverage===!1,alphaMap:De,alphaTest:ce,alphaHash:$e,combine:P.combine,mapUv:U&&y(P.map.channel),aoMapUv:ue&&y(P.aoMap.channel),lightMapUv:se&&y(P.lightMap.channel),bumpMapUv:fe&&y(P.bumpMap.channel),normalMapUv:_e&&y(P.normalMap.channel),displacementMapUv:xe&&y(P.displacementMap.channel),emissiveMapUv:O&&y(P.emissiveMap.channel),metalnessMapUv:me&&y(P.metalnessMap.channel),roughnessMapUv:Ce&&y(P.roughnessMap.channel),anisotropyMapUv:ae&&y(P.anisotropyMap.channel),clearcoatMapUv:ge&&y(P.clearcoatMap.channel),clearcoatNormalMapUv:we&&y(P.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Te&&y(P.clearcoatRoughnessMap.channel),iridescenceMapUv:re&&y(P.iridescenceMap.channel),iridescenceThicknessMapUv:pe&&y(P.iridescenceThicknessMap.channel),sheenColorMapUv:Le&&y(P.sheenColorMap.channel),sheenRoughnessMapUv:Ue&&y(P.sheenRoughnessMap.channel),specularMapUv:Re&&y(P.specularMap.channel),specularColorMapUv:Ae&&y(P.specularColorMap.channel),specularIntensityMapUv:ot&&y(P.specularIntensityMap.channel),transmissionMapUv:ft&&y(P.transmissionMap.channel),thicknessMapUv:St&&y(P.thicknessMap.channel),alphaMapUv:De&&y(P.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(_e||Se),vertexNormals:!!$.attributes.normal,vertexColors:P.vertexColors,vertexAlphas:P.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:C.isPoints===!0&&!!$.attributes.uv&&(U||De),fog:!!K,useFog:P.fog===!0,fogExp2:!!K&&K.isFogExp2,flatShading:P.wireframe===!1&&(P.flatShading===!0||$.attributes.normal===void 0&&_e===!1&&(P.isMeshLambertMaterial||P.isMeshPhongMaterial||P.isMeshStandardMaterial||P.isMeshPhysicalMaterial)),sizeAttenuation:P.sizeAttenuation===!0,logarithmicDepthBuffer:c,reversedDepthBuffer:Xe,skinning:C.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:Ie,morphTextureStride:qe,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numLightProbeGrids:z.length,numClippingPlanes:r.numPlanes,numClipIntersection:r.numIntersection,dithering:P.dithering,shadowMapEnabled:t.shadowMap.enabled&&F.length>0,shadowMapType:t.shadowMap.type,toneMapping:be,decodeVideoTexture:U&&P.map.isVideoTexture===!0&&bt.getTransfer(P.map.colorSpace)===Ct,decodeVideoTextureEmissive:O&&P.emissiveMap.isVideoTexture===!0&&bt.getTransfer(P.emissiveMap.colorSpace)===Ct,premultipliedAlpha:P.premultipliedAlpha,doubleSided:P.side===Gi,flipSided:P.side===Ti,useDepthPacking:P.depthPacking>=0,depthPacking:P.depthPacking||0,index0AttributeName:P.index0AttributeName,extensionClipCullDistance:Fe&&P.extensions.clipCullDistance===!0&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Fe&&P.extensions.multiDraw===!0||Ze)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:P.customProgramCacheKey()};return Ke.vertexUv1s=d.has(1),Ke.vertexUv2s=d.has(2),Ke.vertexUv3s=d.has(3),d.clear(),Ke}function _(P){const M=[];if(P.shaderID?M.push(P.shaderID):(M.push(P.customVertexShaderID),M.push(P.customFragmentShaderID)),P.defines!==void 0)for(const F in P.defines)M.push(F),M.push(P.defines[F]);return P.isRawShaderMaterial===!1&&(v(M,P),S(M,P),M.push(t.outputColorSpace)),M.push(P.customProgramCacheKey),M.join()}function v(P,M){P.push(M.precision),P.push(M.outputColorSpace),P.push(M.envMapMode),P.push(M.envMapCubeUVHeight),P.push(M.mapUv),P.push(M.alphaMapUv),P.push(M.lightMapUv),P.push(M.aoMapUv),P.push(M.bumpMapUv),P.push(M.normalMapUv),P.push(M.displacementMapUv),P.push(M.emissiveMapUv),P.push(M.metalnessMapUv),P.push(M.roughnessMapUv),P.push(M.anisotropyMapUv),P.push(M.clearcoatMapUv),P.push(M.clearcoatNormalMapUv),P.push(M.clearcoatRoughnessMapUv),P.push(M.iridescenceMapUv),P.push(M.iridescenceThicknessMapUv),P.push(M.sheenColorMapUv),P.push(M.sheenRoughnessMapUv),P.push(M.specularMapUv),P.push(M.specularColorMapUv),P.push(M.specularIntensityMapUv),P.push(M.transmissionMapUv),P.push(M.thicknessMapUv),P.push(M.combine),P.push(M.fogExp2),P.push(M.sizeAttenuation),P.push(M.morphTargetsCount),P.push(M.morphAttributeCount),P.push(M.numDirLights),P.push(M.numPointLights),P.push(M.numSpotLights),P.push(M.numSpotLightMaps),P.push(M.numHemiLights),P.push(M.numRectAreaLights),P.push(M.numDirLightShadows),P.push(M.numPointLightShadows),P.push(M.numSpotLightShadows),P.push(M.numSpotLightShadowsWithMaps),P.push(M.numLightProbes),P.push(M.shadowMapType),P.push(M.toneMapping),P.push(M.numClippingPlanes),P.push(M.numClipIntersection),P.push(M.depthPacking)}function S(P,M){l.disableAll(),M.instancing&&l.enable(0),M.instancingColor&&l.enable(1),M.instancingMorph&&l.enable(2),M.matcap&&l.enable(3),M.envMap&&l.enable(4),M.normalMapObjectSpace&&l.enable(5),M.normalMapTangentSpace&&l.enable(6),M.clearcoat&&l.enable(7),M.iridescence&&l.enable(8),M.alphaTest&&l.enable(9),M.vertexColors&&l.enable(10),M.vertexAlphas&&l.enable(11),M.vertexUv1s&&l.enable(12),M.vertexUv2s&&l.enable(13),M.vertexUv3s&&l.enable(14),M.vertexTangents&&l.enable(15),M.anisotropy&&l.enable(16),M.alphaHash&&l.enable(17),M.batching&&l.enable(18),M.dispersion&&l.enable(19),M.batchingColor&&l.enable(20),M.gradientMap&&l.enable(21),M.packedNormalMap&&l.enable(22),M.vertexNormals&&l.enable(23),P.push(l.mask),l.disableAll(),M.fog&&l.enable(0),M.useFog&&l.enable(1),M.flatShading&&l.enable(2),M.logarithmicDepthBuffer&&l.enable(3),M.reversedDepthBuffer&&l.enable(4),M.skinning&&l.enable(5),M.morphTargets&&l.enable(6),M.morphNormals&&l.enable(7),M.morphColors&&l.enable(8),M.premultipliedAlpha&&l.enable(9),M.shadowMapEnabled&&l.enable(10),M.doubleSided&&l.enable(11),M.flipSided&&l.enable(12),M.useDepthPacking&&l.enable(13),M.dithering&&l.enable(14),M.transmission&&l.enable(15),M.sheen&&l.enable(16),M.opaque&&l.enable(17),M.pointsUvs&&l.enable(18),M.decodeVideoTexture&&l.enable(19),M.decodeVideoTextureEmissive&&l.enable(20),M.alphaToCoverage&&l.enable(21),M.numLightProbeGrids>0&&l.enable(22),P.push(l.mask)}function w(P){const M=g[P.type];let F;if(M){const I=Li[M];F=Wr.clone(I.uniforms)}else F=P.uniforms;return F}function x(P,M){let F=h.get(M);return F!==void 0?++F.usedTimes:(F=new sE(t,M,P,s),u.push(F),h.set(M,F)),F}function k(P){if(--P.usedTimes===0){const M=u.indexOf(P);u[M]=u[u.length-1],u.pop(),h.delete(P.cacheKey),P.destroy()}}function E(P){o.remove(P)}function D(){o.dispose()}return{getParameters:T,getProgramCacheKey:_,getUniforms:w,acquireProgram:x,releaseProgram:k,releaseShaderCache:E,programs:u,dispose:D}}function uE(){let t=new WeakMap;function e(l){return t.has(l)}function i(l){let o=t.get(l);return o===void 0&&(o={},t.set(l,o)),o}function n(l){t.delete(l)}function s(l,o,d){t.get(l)[o]=d}function r(){t=new WeakMap}return{has:e,get:i,remove:n,update:s,dispose:r}}function cE(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.material.id!==e.material.id?t.material.id-e.material.id:t.materialVariant!==e.materialVariant?t.materialVariant-e.materialVariant:t.z!==e.z?t.z-e.z:t.id-e.id}function xm(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function Tm(){const t=[];let e=0;const i=[],n=[],s=[];function r(){e=0,i.length=0,n.length=0,s.length=0}function l(f){let g=0;return f.isInstancedMesh&&(g+=2),f.isSkinnedMesh&&(g+=1),g}function o(f,g,y,T,_,v){let S=t[e];return S===void 0?(S={id:f.id,object:f,geometry:g,material:y,materialVariant:l(f),groupOrder:T,renderOrder:f.renderOrder,z:_,group:v},t[e]=S):(S.id=f.id,S.object=f,S.geometry=g,S.material=y,S.materialVariant=l(f),S.groupOrder=T,S.renderOrder=f.renderOrder,S.z=_,S.group=v),e++,S}function d(f,g,y,T,_,v){const S=o(f,g,y,T,_,v);y.transmission>0?n.push(S):y.transparent===!0?s.push(S):i.push(S)}function u(f,g,y,T,_,v){const S=o(f,g,y,T,_,v);y.transmission>0?n.unshift(S):y.transparent===!0?s.unshift(S):i.unshift(S)}function h(f,g){i.length>1&&i.sort(f||cE),n.length>1&&n.sort(g||xm),s.length>1&&s.sort(g||xm)}function c(){for(let f=e,g=t.length;f=r.length?(l=new Tm,r.push(l)):l=r[s],l}function i(){t=new WeakMap}return{get:e,dispose:i}}function fE(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new V,color:new ze};break;case"SpotLight":i={position:new V,direction:new V,color:new ze,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new V,color:new ze,distance:0,decay:0};break;case"HemisphereLight":i={direction:new V,skyColor:new ze,groundColor:new ze};break;case"RectAreaLight":i={color:new ze,position:new V,halfWidth:new V,halfHeight:new V};break}return t[e.id]=i,i}}}function mE(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let i;switch(e.type){case"DirectionalLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ye};break;case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ye};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ye,shadowCameraNear:1,shadowCameraFar:1e3};break}return t[e.id]=i,i}}}let pE=0;function gE(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function yE(t){const e=new fE,i=mE(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let u=0;u<9;u++)n.probe.push(new V);const s=new V,r=new At,l=new At;function o(u){let h=0,c=0,f=0;for(let M=0;M<9;M++)n.probe[M].set(0,0,0);let g=0,y=0,T=0,_=0,v=0,S=0,w=0,x=0,k=0,E=0,D=0;u.sort(gE);for(let M=0,F=u.length;M0&&(t.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Oe.LTC_FLOAT_1,n.rectAreaLTC2=Oe.LTC_FLOAT_2):(n.rectAreaLTC1=Oe.LTC_HALF_1,n.rectAreaLTC2=Oe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=c,n.ambient[2]=f;const P=n.hash;(P.directionalLength!==g||P.pointLength!==y||P.spotLength!==T||P.rectAreaLength!==_||P.hemiLength!==v||P.numDirectionalShadows!==S||P.numPointShadows!==w||P.numSpotShadows!==x||P.numSpotMaps!==k||P.numLightProbes!==D)&&(n.directional.length=g,n.spot.length=T,n.rectArea.length=_,n.point.length=y,n.hemi.length=v,n.directionalShadow.length=S,n.directionalShadowMap.length=S,n.pointShadow.length=w,n.pointShadowMap.length=w,n.spotShadow.length=x,n.spotShadowMap.length=x,n.directionalShadowMatrix.length=S,n.pointShadowMatrix.length=w,n.spotLightMatrix.length=x+k-E,n.spotLightMap.length=k,n.numSpotLightShadowsWithMaps=E,n.numLightProbes=D,P.directionalLength=g,P.pointLength=y,P.spotLength=T,P.rectAreaLength=_,P.hemiLength=v,P.numDirectionalShadows=S,P.numPointShadows=w,P.numSpotShadows=x,P.numSpotMaps=k,P.numLightProbes=D,n.version=pE++)}function d(u,h){let c=0,f=0,g=0,y=0,T=0;const _=h.matrixWorldInverse;for(let v=0,S=u.length;v=l.length?(o=new Am(t),l.push(o)):o=l[r],o}function n(){e=new WeakMap}return{get:i,dispose:n}}const bE=`void main() { +`+xe+` +`+Ce)}else $!==""?tt("WebGLProgram: Program Info Log:",$):(W===""||q==="")&&(me=!1);me&&(I.diagnostics={runnable:te,programLog:$,vertexShader:{log:W,prefix:v},fragmentShader:{log:q,prefix:y}})}s.deleteShader(k),s.deleteShader(C),x=new _l(s,w),T=fE(s,w)}let x;this.getUniforms=function(){return x===void 0&&L(this),x};let T;this.getAttributes=function(){return T===void 0&&L(this),T};let F=i.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return F===!1&&(F=s.getProgramParameter(w,rE)),F},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(w),this.program=void 0},this.type=i.shaderType,this.name=i.shaderName,this.id=oE++,this.cacheKey=e,this.usedTimes=1,this.program=w,this.vertexShader=k,this.fragmentShader=C,this}let RE=0;class LE{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const i=e.vertexShader,n=e.fragmentShader,s=this._getShaderStage(i),r=this._getShaderStage(n),l=this._getShaderCacheForMaterial(e);return l.has(s)===!1&&(l.add(s),s.usedTimes++),l.has(r)===!1&&(l.add(r),r.usedTimes++),this}remove(e){const i=this.materialCache.get(e);for(const n of i)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const i=this.materialCache;let n=i.get(e);return n===void 0&&(n=new Set,i.set(e,n)),n}_getShaderStage(e){const i=this.shaderCache;let n=i.get(e);return n===void 0&&(n=new DE(e),i.set(e,n)),n}}class DE{constructor(e){this.id=RE++,this.code=e,this.usedTimes=0}}function IE(t){return t===ir||t===Ll||t===Dl}function FE(t,e,i,n,s,r){const l=new Ah,o=new LE,u=new Set,c=[],h=new Map,d=n.logarithmicDepthBuffer;let m=n.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distance",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function b(x){return u.add(x),x===0?"uv":`uv${x}`}function w(x,T,F,I,E,z){const Y=I.fog,$=E.geometry,W=x.isMeshStandardMaterial||x.isMeshLambertMaterial||x.isMeshPhongMaterial?I.environment:null,q=x.isMeshStandardMaterial||x.isMeshLambertMaterial&&!x.envMap||x.isMeshPhongMaterial&&!x.envMap,te=e.get(x.envMap||W,q),me=te&&te.mapping===nu?te.image.height:null,xe=g[x.type];x.precision!==null&&(m=n.getMaxPrecision(x.precision),m!==x.precision&&tt("WebGLProgram.getParameters:",x.precision,"not supported, using",m,"instead."));const Ce=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,Fe=Ce!==void 0?Ce.length:0;let qe=0;$.morphAttributes.position!==void 0&&(qe=1),$.morphAttributes.normal!==void 0&&(qe=2),$.morphAttributes.color!==void 0&&(qe=3);let mt,st,de,ke;if(xe){const ut=Di[xe];mt=ut.vertexShader,st=ut.fragmentShader}else mt=x.vertexShader,st=x.fragmentShader,o.update(x),de=o.getVertexShaderID(x),ke=o.getFragmentShaderID(x);const Me=t.getRenderTarget(),Ke=t.state.buffers.depth.getReversed(),et=E.isInstancedMesh===!0,Ze=E.isBatchedMesh===!0,V=!!x.map,H=!!x.matcap,Q=!!te,ce=!!x.aoMap,se=!!x.lightMap,pe=!!x.bumpMap,_e=!!x.normalMap,Pe=!!x.displacementMap,O=!!x.emissiveMap,fe=!!x.metalnessMap,Ee=!!x.roughnessMap,Se=x.anisotropy>0,ue=x.clearcoat>0,Ge=x.dispersion>0,D=x.iridescence>0,A=x.sheen>0,X=x.transmission>0,le=Se&&!!x.anisotropyMap,ye=ue&&!!x.clearcoatMap,we=ue&&!!x.clearcoatNormalMap,Te=ue&&!!x.clearcoatRoughnessMap,oe=D&&!!x.iridescenceMap,ge=D&&!!x.iridescenceThicknessMap,Re=A&&!!x.sheenColorMap,Ue=A&&!!x.sheenRoughnessMap,Le=!!x.specularMap,Ae=!!x.specularColorMap,ot=!!x.specularIntensityMap,ct=X&&!!x.transmissionMap,Mt=X&&!!x.thicknessMap,j=!!x.gradientMap,De=!!x.alphaMap,he=x.alphaTest>0,$e=!!x.alphaHash,Ne=!!x.extensions;let be=on;x.toneMapped&&(Me===null||Me.isXRRenderTarget===!0)&&(be=t.toneMapping);const Ye={shaderID:xe,shaderType:x.type,shaderName:x.name,vertexShader:mt,fragmentShader:st,defines:x.defines,customVertexShaderID:de,customFragmentShaderID:ke,isRawShaderMaterial:x.isRawShaderMaterial===!0,glslVersion:x.glslVersion,precision:m,batching:Ze,batchingColor:Ze&&E._colorsTexture!==null,instancing:et,instancingColor:et&&E.instanceColor!==null,instancingMorph:et&&E.morphTexture!==null,outputColorSpace:Me===null?t.outputColorSpace:Me.isXRRenderTarget===!0?Me.texture.colorSpace:vt.workingColorSpace,alphaToCoverage:!!x.alphaToCoverage,map:V,matcap:H,envMap:Q,envMapMode:Q&&te.mapping,envMapCubeUVHeight:me,aoMap:ce,lightMap:se,bumpMap:pe,normalMap:_e,displacementMap:Pe,emissiveMap:O,normalMapObjectSpace:_e&&x.normalMapType===zx,normalMapTangentSpace:_e&&x.normalMapType===na,packedNormalMap:_e&&x.normalMapType===na&&IE(x.normalMap.format),metalnessMap:fe,roughnessMap:Ee,anisotropy:Se,anisotropyMap:le,clearcoat:ue,clearcoatMap:ye,clearcoatNormalMap:we,clearcoatRoughnessMap:Te,dispersion:Ge,iridescence:D,iridescenceMap:oe,iridescenceThicknessMap:ge,sheen:A,sheenColorMap:Re,sheenRoughnessMap:Ue,specularMap:Le,specularColorMap:Ae,specularIntensityMap:ot,transmission:X,transmissionMap:ct,thicknessMap:Mt,gradientMap:j,opaque:x.transparent===!1&&x.blending===Xr&&x.alphaToCoverage===!1,alphaMap:De,alphaTest:he,alphaHash:$e,combine:x.combine,mapUv:V&&b(x.map.channel),aoMapUv:ce&&b(x.aoMap.channel),lightMapUv:se&&b(x.lightMap.channel),bumpMapUv:pe&&b(x.bumpMap.channel),normalMapUv:_e&&b(x.normalMap.channel),displacementMapUv:Pe&&b(x.displacementMap.channel),emissiveMapUv:O&&b(x.emissiveMap.channel),metalnessMapUv:fe&&b(x.metalnessMap.channel),roughnessMapUv:Ee&&b(x.roughnessMap.channel),anisotropyMapUv:le&&b(x.anisotropyMap.channel),clearcoatMapUv:ye&&b(x.clearcoatMap.channel),clearcoatNormalMapUv:we&&b(x.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Te&&b(x.clearcoatRoughnessMap.channel),iridescenceMapUv:oe&&b(x.iridescenceMap.channel),iridescenceThicknessMapUv:ge&&b(x.iridescenceThicknessMap.channel),sheenColorMapUv:Re&&b(x.sheenColorMap.channel),sheenRoughnessMapUv:Ue&&b(x.sheenRoughnessMap.channel),specularMapUv:Le&&b(x.specularMap.channel),specularColorMapUv:Ae&&b(x.specularColorMap.channel),specularIntensityMapUv:ot&&b(x.specularIntensityMap.channel),transmissionMapUv:ct&&b(x.transmissionMap.channel),thicknessMapUv:Mt&&b(x.thicknessMap.channel),alphaMapUv:De&&b(x.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(_e||Se),vertexNormals:!!$.attributes.normal,vertexColors:x.vertexColors,vertexAlphas:x.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:E.isPoints===!0&&!!$.attributes.uv&&(V||De),fog:!!Y,useFog:x.fog===!0,fogExp2:!!Y&&Y.isFogExp2,flatShading:x.wireframe===!1&&(x.flatShading===!0||$.attributes.normal===void 0&&_e===!1&&(x.isMeshLambertMaterial||x.isMeshPhongMaterial||x.isMeshStandardMaterial||x.isMeshPhysicalMaterial)),sizeAttenuation:x.sizeAttenuation===!0,logarithmicDepthBuffer:d,reversedDepthBuffer:Ke,skinning:E.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:Fe,morphTextureStride:qe,numDirLights:T.directional.length,numPointLights:T.point.length,numSpotLights:T.spot.length,numSpotLightMaps:T.spotLightMap.length,numRectAreaLights:T.rectArea.length,numHemiLights:T.hemi.length,numDirLightShadows:T.directionalShadowMap.length,numPointLightShadows:T.pointShadowMap.length,numSpotLightShadows:T.spotShadowMap.length,numSpotLightShadowsWithMaps:T.numSpotLightShadowsWithMaps,numLightProbes:T.numLightProbes,numLightProbeGrids:z.length,numClippingPlanes:r.numPlanes,numClipIntersection:r.numIntersection,dithering:x.dithering,shadowMapEnabled:t.shadowMap.enabled&&F.length>0,shadowMapType:t.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&x.map.isVideoTexture===!0&&vt.getTransfer(x.map.colorSpace)===At,decodeVideoTextureEmissive:O&&x.emissiveMap.isVideoTexture===!0&&vt.getTransfer(x.emissiveMap.colorSpace)===At,premultipliedAlpha:x.premultipliedAlpha,doubleSided:x.side===Ki,flipSided:x.side===Ei,useDepthPacking:x.depthPacking>=0,depthPacking:x.depthPacking||0,index0AttributeName:x.index0AttributeName,extensionClipCullDistance:Ne&&x.extensions.clipCullDistance===!0&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ne&&x.extensions.multiDraw===!0||Ze)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:x.customProgramCacheKey()};return Ye.vertexUv1s=u.has(1),Ye.vertexUv2s=u.has(2),Ye.vertexUv3s=u.has(3),u.clear(),Ye}function v(x){const T=[];if(x.shaderID?T.push(x.shaderID):(T.push(x.customVertexShaderID),T.push(x.customFragmentShaderID)),x.defines!==void 0)for(const F in x.defines)T.push(F),T.push(x.defines[F]);return x.isRawShaderMaterial===!1&&(y(T,x),S(T,x),T.push(t.outputColorSpace)),T.push(x.customProgramCacheKey),T.join()}function y(x,T){x.push(T.precision),x.push(T.outputColorSpace),x.push(T.envMapMode),x.push(T.envMapCubeUVHeight),x.push(T.mapUv),x.push(T.alphaMapUv),x.push(T.lightMapUv),x.push(T.aoMapUv),x.push(T.bumpMapUv),x.push(T.normalMapUv),x.push(T.displacementMapUv),x.push(T.emissiveMapUv),x.push(T.metalnessMapUv),x.push(T.roughnessMapUv),x.push(T.anisotropyMapUv),x.push(T.clearcoatMapUv),x.push(T.clearcoatNormalMapUv),x.push(T.clearcoatRoughnessMapUv),x.push(T.iridescenceMapUv),x.push(T.iridescenceThicknessMapUv),x.push(T.sheenColorMapUv),x.push(T.sheenRoughnessMapUv),x.push(T.specularMapUv),x.push(T.specularColorMapUv),x.push(T.specularIntensityMapUv),x.push(T.transmissionMapUv),x.push(T.thicknessMapUv),x.push(T.combine),x.push(T.fogExp2),x.push(T.sizeAttenuation),x.push(T.morphTargetsCount),x.push(T.morphAttributeCount),x.push(T.numDirLights),x.push(T.numPointLights),x.push(T.numSpotLights),x.push(T.numSpotLightMaps),x.push(T.numHemiLights),x.push(T.numRectAreaLights),x.push(T.numDirLightShadows),x.push(T.numPointLightShadows),x.push(T.numSpotLightShadows),x.push(T.numSpotLightShadowsWithMaps),x.push(T.numLightProbes),x.push(T.shadowMapType),x.push(T.toneMapping),x.push(T.numClippingPlanes),x.push(T.numClipIntersection),x.push(T.depthPacking)}function S(x,T){l.disableAll(),T.instancing&&l.enable(0),T.instancingColor&&l.enable(1),T.instancingMorph&&l.enable(2),T.matcap&&l.enable(3),T.envMap&&l.enable(4),T.normalMapObjectSpace&&l.enable(5),T.normalMapTangentSpace&&l.enable(6),T.clearcoat&&l.enable(7),T.iridescence&&l.enable(8),T.alphaTest&&l.enable(9),T.vertexColors&&l.enable(10),T.vertexAlphas&&l.enable(11),T.vertexUv1s&&l.enable(12),T.vertexUv2s&&l.enable(13),T.vertexUv3s&&l.enable(14),T.vertexTangents&&l.enable(15),T.anisotropy&&l.enable(16),T.alphaHash&&l.enable(17),T.batching&&l.enable(18),T.dispersion&&l.enable(19),T.batchingColor&&l.enable(20),T.gradientMap&&l.enable(21),T.packedNormalMap&&l.enable(22),T.vertexNormals&&l.enable(23),x.push(l.mask),l.disableAll(),T.fog&&l.enable(0),T.useFog&&l.enable(1),T.flatShading&&l.enable(2),T.logarithmicDepthBuffer&&l.enable(3),T.reversedDepthBuffer&&l.enable(4),T.skinning&&l.enable(5),T.morphTargets&&l.enable(6),T.morphNormals&&l.enable(7),T.morphColors&&l.enable(8),T.premultipliedAlpha&&l.enable(9),T.shadowMapEnabled&&l.enable(10),T.doubleSided&&l.enable(11),T.flipSided&&l.enable(12),T.useDepthPacking&&l.enable(13),T.dithering&&l.enable(14),T.transmission&&l.enable(15),T.sheen&&l.enable(16),T.opaque&&l.enable(17),T.pointsUvs&&l.enable(18),T.decodeVideoTexture&&l.enable(19),T.decodeVideoTextureEmissive&&l.enable(20),T.alphaToCoverage&&l.enable(21),T.numLightProbeGrids>0&&l.enable(22),x.push(l.mask)}function P(x){const T=g[x.type];let F;if(T){const I=Di[T];F=Ps.clone(I.uniforms)}else F=x.uniforms;return F}function M(x,T){let F=h.get(T);return F!==void 0?++F.usedTimes:(F=new kE(t,T,x,s),c.push(F),h.set(T,F)),F}function k(x){if(--x.usedTimes===0){const T=c.indexOf(x);c[T]=c[c.length-1],c.pop(),h.delete(x.cacheKey),x.destroy()}}function C(x){o.remove(x)}function L(){o.dispose()}return{getParameters:w,getProgramCacheKey:v,getUniforms:P,acquireProgram:M,releaseProgram:k,releaseShaderCache:C,programs:c,dispose:L}}function NE(){let t=new WeakMap;function e(l){return t.has(l)}function i(l){let o=t.get(l);return o===void 0&&(o={},t.set(l,o)),o}function n(l){t.delete(l)}function s(l,o,u){t.get(l)[o]=u}function r(){t=new WeakMap}return{has:e,get:i,remove:n,update:s,dispose:r}}function OE(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.material.id!==e.material.id?t.material.id-e.material.id:t.materialVariant!==e.materialVariant?t.materialVariant-e.materialVariant:t.z!==e.z?t.z-e.z:t.id-e.id}function gf(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function yf(){const t=[];let e=0;const i=[],n=[],s=[];function r(){e=0,i.length=0,n.length=0,s.length=0}function l(m){let g=0;return m.isInstancedMesh&&(g+=2),m.isSkinnedMesh&&(g+=1),g}function o(m,g,b,w,v,y){let S=t[e];return S===void 0?(S={id:m.id,object:m,geometry:g,material:b,materialVariant:l(m),groupOrder:w,renderOrder:m.renderOrder,z:v,group:y},t[e]=S):(S.id=m.id,S.object=m,S.geometry=g,S.material=b,S.materialVariant=l(m),S.groupOrder=w,S.renderOrder=m.renderOrder,S.z=v,S.group=y),e++,S}function u(m,g,b,w,v,y){const S=o(m,g,b,w,v,y);b.transmission>0?n.push(S):b.transparent===!0?s.push(S):i.push(S)}function c(m,g,b,w,v,y){const S=o(m,g,b,w,v,y);b.transmission>0?n.unshift(S):b.transparent===!0?s.unshift(S):i.unshift(S)}function h(m,g){i.length>1&&i.sort(m||OE),n.length>1&&n.sort(g||gf),s.length>1&&s.sort(g||gf)}function d(){for(let m=e,g=t.length;m=r.length?(l=new yf,r.push(l)):l=r[s],l}function i(){t=new WeakMap}return{get:e,dispose:i}}function VE(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new B,color:new Ve};break;case"SpotLight":i={position:new B,direction:new B,color:new Ve,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new B,color:new Ve,distance:0,decay:0};break;case"HemisphereLight":i={direction:new B,skyColor:new Ve,groundColor:new Ve};break;case"RectAreaLight":i={color:new Ve,position:new B,halfWidth:new B,halfHeight:new B};break}return t[e.id]=i,i}}}function BE(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let i;switch(e.type){case"DirectionalLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Xe};break;case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Xe};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Xe,shadowCameraNear:1,shadowCameraFar:1e3};break}return t[e.id]=i,i}}}let zE=0;function $E(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function GE(t){const e=new VE,i=BE(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new B);const s=new B,r=new _t,l=new _t;function o(c){let h=0,d=0,m=0;for(let T=0;T<9;T++)n.probe[T].set(0,0,0);let g=0,b=0,w=0,v=0,y=0,S=0,P=0,M=0,k=0,C=0,L=0;c.sort($E);for(let T=0,F=c.length;T0&&(t.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Oe.LTC_FLOAT_1,n.rectAreaLTC2=Oe.LTC_FLOAT_2):(n.rectAreaLTC1=Oe.LTC_HALF_1,n.rectAreaLTC2=Oe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=d,n.ambient[2]=m;const x=n.hash;(x.directionalLength!==g||x.pointLength!==b||x.spotLength!==w||x.rectAreaLength!==v||x.hemiLength!==y||x.numDirectionalShadows!==S||x.numPointShadows!==P||x.numSpotShadows!==M||x.numSpotMaps!==k||x.numLightProbes!==L)&&(n.directional.length=g,n.spot.length=w,n.rectArea.length=v,n.point.length=b,n.hemi.length=y,n.directionalShadow.length=S,n.directionalShadowMap.length=S,n.pointShadow.length=P,n.pointShadowMap.length=P,n.spotShadow.length=M,n.spotShadowMap.length=M,n.directionalShadowMatrix.length=S,n.pointShadowMatrix.length=P,n.spotLightMatrix.length=M+k-C,n.spotLightMap.length=k,n.numSpotLightShadowsWithMaps=C,n.numLightProbes=L,x.directionalLength=g,x.pointLength=b,x.spotLength=w,x.rectAreaLength=v,x.hemiLength=y,x.numDirectionalShadows=S,x.numPointShadows=P,x.numSpotShadows=M,x.numSpotMaps=k,x.numLightProbes=L,n.version=zE++)}function u(c,h){let d=0,m=0,g=0,b=0,w=0;const v=h.matrixWorldInverse;for(let y=0,S=c.length;y=l.length?(o=new vf(t),l.push(o)):o=l[r],o}function n(){e=new WeakMap}return{get:i,dispose:n}}const WE=`void main() { gl_Position = vec4( position, 1.0 ); -}`,_E=`uniform sampler2D shadow_pass; +}`,qE=`uniform sampler2D shadow_pass; uniform vec2 resolution; uniform float radius; void main() { @@ -4101,12 +4272,12 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) ); gl_FragColor = vec4( mean, std_dev, 0.0, 1.0 ); -}`,SE=[new V(1,0,0),new V(-1,0,0),new V(0,1,0),new V(0,-1,0),new V(0,0,1),new V(0,0,-1)],wE=[new V(0,-1,0),new V(0,-1,0),new V(0,0,1),new V(0,0,-1),new V(0,-1,0),new V(0,-1,0)],Em=new At,lo=new V,$d=new V;function ME(t,e,i){let n=new Wc;const s=new Ye,r=new Ye,l=new Tt,o=new wP,d=new MP,u={},h=i.maxTextureSize,c={[Kn]:Ti,[Ti]:Kn,[Gi]:Gi},f=new Ai({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Ye},radius:{value:4}},vertexShader:bE,fragmentShader:_E}),g=f.clone();g.defines.HORIZONTAL_PASS=1;const y=new zt;y.setAttribute("position",new ei(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const T=new $t(y,f),_=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Ka;let v=this.type;this.render=function(E,D,P){if(_.enabled===!1||_.autoUpdate===!1&&_.needsUpdate===!1||E.length===0)return;this.type===qw&&(tt("WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead."),this.type=Ka);const M=t.getRenderTarget(),F=t.getActiveCubeFace(),I=t.getActiveMipmapLevel(),C=t.state;C.setBlending(Gn),C.buffers.depth.getReversed()===!0?C.buffers.color.setClear(0,0,0,0):C.buffers.color.setClear(1,1,1,1),C.buffers.depth.setTest(!0),C.setScissorTest(!1);const z=v!==this.type;z&&D.traverse(function(K){K.material&&(Array.isArray(K.material)?K.material.forEach($=>$.needsUpdate=!0):K.material.needsUpdate=!0)});for(let K=0,$=E.length;K<$;K++){const W=E[K],q=W.shadow;if(q===void 0){tt("WebGLShadowMap:",W,"has no shadow.");continue}if(q.autoUpdate===!1&&q.needsUpdate===!1)continue;s.copy(q.mapSize);const te=q.getFrameExtents();s.multiply(te),r.copy(q.mapSize),(s.x>h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/te.x),s.x=r.x*te.x,q.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/te.y),s.y=r.y*te.y,q.mapSize.y=r.y));const he=t.state.buffers.depth.getReversed();if(q.camera._reversedDepth=he,q.map===null||z===!0){if(q.map!==null&&(q.map.depthTexture!==null&&(q.map.depthTexture.dispose(),q.map.depthTexture=null),q.map.dispose()),this.type===fo){if(W.isPointLight){tt("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}q.map=new tn(s.x,s.y,{format:js,type:xn,minFilter:vi,magFilter:vi,generateMipmaps:!1}),q.map.texture.name=W.name+".shadowMap",q.map.depthTexture=new Gr(s.x,s.y,_n),q.map.depthTexture.name=W.name+".shadowMapDepth",q.map.depthTexture.format=Yn,q.map.depthTexture.compareFunction=null,q.map.depthTexture.minFilter=di,q.map.depthTexture.magFilter=di}else W.isPointLight?(q.map=new jg(s.x),q.map.depthTexture=new hP(s.x,Pn)):(q.map=new tn(s.x,s.y),q.map.depthTexture=new Gr(s.x,s.y,Pn)),q.map.depthTexture.name=W.name+".shadowMap",q.map.depthTexture.format=Yn,this.type===Ka?(q.map.depthTexture.compareFunction=he?Bc:Uc,q.map.depthTexture.minFilter=vi,q.map.depthTexture.magFilter=vi):(q.map.depthTexture.compareFunction=null,q.map.depthTexture.minFilter=di,q.map.depthTexture.magFilter=di);q.camera.updateProjectionMatrix()}const Pe=q.map.isWebGLCubeRenderTarget?6:1;for(let Ee=0;Ee0||D.map&&D.alphaTest>0||D.alphaToCoverage===!0){const C=F.uuid,z=D.uuid;let K=u[C];K===void 0&&(K={},u[C]=K);let $=K[z];$===void 0&&($=F.clone(),K[z]=$,D.addEventListener("dispose",k)),F=$}if(F.visible=D.visible,F.wireframe=D.wireframe,M===fo?F.side=D.shadowSide!==null?D.shadowSide:D.side:F.side=D.shadowSide!==null?D.shadowSide:c[D.side],F.alphaMap=D.alphaMap,F.alphaTest=D.alphaToCoverage===!0?.5:D.alphaTest,F.map=D.map,F.clipShadows=D.clipShadows,F.clippingPlanes=D.clippingPlanes,F.clipIntersection=D.clipIntersection,F.displacementMap=D.displacementMap,F.displacementScale=D.displacementScale,F.displacementBias=D.displacementBias,F.wireframeLinewidth=D.wireframeLinewidth,F.linewidth=D.linewidth,P.isPointLight===!0&&F.isMeshDistanceMaterial===!0){const C=t.properties.get(F);C.light=P}return F}function x(E,D,P,M,F){if(E.visible===!1)return;if(E.layers.test(D.layers)&&(E.isMesh||E.isLine||E.isPoints)&&(E.castShadow||E.receiveShadow&&F===fo)&&(!E.frustumCulled||n.intersectsObject(E))){E.modelViewMatrix.multiplyMatrices(P.matrixWorldInverse,E.matrixWorld);const z=e.update(E),K=E.material;if(Array.isArray(K)){const $=z.groups;for(let W=0,q=$.length;W=1):he.indexOf("OpenGL ES")!==-1&&(te=parseFloat(/^OpenGL ES (\d)/.exec(he)[1]),q=te>=2);let Pe=null,Ee={};const Ie=t.getParameter(t.SCISSOR_BOX),qe=t.getParameter(t.VIEWPORT),mt=new Tt().fromArray(Ie),st=new Tt().fromArray(qe);function de(j,De,ce,$e){const Fe=new Uint8Array(4),be=t.createTexture();t.bindTexture(j,be),t.texParameteri(j,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(j,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let Ke=0;Ke"u"?!1:/OculusBrowser/g.test(navigator.userAgent),u=new Ye,h=new WeakMap,c=new Set;let f;const g=new WeakMap;let y=!1;try{y=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function T(R,A){return y?new OffscreenCanvas(R,A):zo("canvas")}function _(R,A,X){let ae=1;const ge=Ge(R);if((ge.width>X||ge.height>X)&&(ae=X/Math.max(ge.width,ge.height)),ae<1)if(typeof HTMLImageElement<"u"&&R instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&R instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&R instanceof ImageBitmap||typeof VideoFrame<"u"&&R instanceof VideoFrame){const we=Math.floor(ae*ge.width),Te=Math.floor(ae*ge.height);f===void 0&&(f=T(we,Te));const re=A?T(we,Te):f;return re.width=we,re.height=Te,re.getContext("2d").drawImage(R,0,0,we,Te),tt("WebGLRenderer: Texture has been resized from ("+ge.width+"x"+ge.height+") to ("+we+"x"+Te+")."),re}else return"data"in R&&tt("WebGLRenderer: Image in DataTexture is too big ("+ge.width+"x"+ge.height+")."),R;return R}function v(R){return R.generateMipmaps}function S(R){t.generateMipmap(R)}function w(R){return R.isWebGLCubeRenderTarget?t.TEXTURE_CUBE_MAP:R.isWebGL3DRenderTarget?t.TEXTURE_3D:R.isWebGLArrayRenderTarget||R.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:t.TEXTURE_2D}function x(R,A,X,ae,ge,we=!1){if(R!==null){if(t[R]!==void 0)return t[R];tt("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+R+"'")}let Te;ae&&(Te=e.get("EXT_texture_norm16"),Te||tt("WebGLRenderer: Unable to use normalized textures without EXT_texture_norm16 extension"));let re=A;if(A===t.RED&&(X===t.FLOAT&&(re=t.R32F),X===t.HALF_FLOAT&&(re=t.R16F),X===t.UNSIGNED_BYTE&&(re=t.R8),X===t.UNSIGNED_SHORT&&Te&&(re=Te.R16_EXT),X===t.SHORT&&Te&&(re=Te.R16_SNORM_EXT)),A===t.RED_INTEGER&&(X===t.UNSIGNED_BYTE&&(re=t.R8UI),X===t.UNSIGNED_SHORT&&(re=t.R16UI),X===t.UNSIGNED_INT&&(re=t.R32UI),X===t.BYTE&&(re=t.R8I),X===t.SHORT&&(re=t.R16I),X===t.INT&&(re=t.R32I)),A===t.RG&&(X===t.FLOAT&&(re=t.RG32F),X===t.HALF_FLOAT&&(re=t.RG16F),X===t.UNSIGNED_BYTE&&(re=t.RG8),X===t.UNSIGNED_SHORT&&Te&&(re=Te.RG16_EXT),X===t.SHORT&&Te&&(re=Te.RG16_SNORM_EXT)),A===t.RG_INTEGER&&(X===t.UNSIGNED_BYTE&&(re=t.RG8UI),X===t.UNSIGNED_SHORT&&(re=t.RG16UI),X===t.UNSIGNED_INT&&(re=t.RG32UI),X===t.BYTE&&(re=t.RG8I),X===t.SHORT&&(re=t.RG16I),X===t.INT&&(re=t.RG32I)),A===t.RGB_INTEGER&&(X===t.UNSIGNED_BYTE&&(re=t.RGB8UI),X===t.UNSIGNED_SHORT&&(re=t.RGB16UI),X===t.UNSIGNED_INT&&(re=t.RGB32UI),X===t.BYTE&&(re=t.RGB8I),X===t.SHORT&&(re=t.RGB16I),X===t.INT&&(re=t.RGB32I)),A===t.RGBA_INTEGER&&(X===t.UNSIGNED_BYTE&&(re=t.RGBA8UI),X===t.UNSIGNED_SHORT&&(re=t.RGBA16UI),X===t.UNSIGNED_INT&&(re=t.RGBA32UI),X===t.BYTE&&(re=t.RGBA8I),X===t.SHORT&&(re=t.RGBA16I),X===t.INT&&(re=t.RGBA32I)),A===t.RGB&&(X===t.UNSIGNED_SHORT&&Te&&(re=Te.RGB16_EXT),X===t.SHORT&&Te&&(re=Te.RGB16_SNORM_EXT),X===t.UNSIGNED_INT_5_9_9_9_REV&&(re=t.RGB9_E5),X===t.UNSIGNED_INT_10F_11F_11F_REV&&(re=t.R11F_G11F_B10F)),A===t.RGBA){const pe=we?pl:bt.getTransfer(ge);X===t.FLOAT&&(re=t.RGBA32F),X===t.HALF_FLOAT&&(re=t.RGBA16F),X===t.UNSIGNED_BYTE&&(re=pe===Ct?t.SRGB8_ALPHA8:t.RGBA8),X===t.UNSIGNED_SHORT&&Te&&(re=Te.RGBA16_EXT),X===t.SHORT&&Te&&(re=Te.RGBA16_SNORM_EXT),X===t.UNSIGNED_SHORT_4_4_4_4&&(re=t.RGBA4),X===t.UNSIGNED_SHORT_5_5_5_1&&(re=t.RGB5_A1)}return(re===t.R16F||re===t.R32F||re===t.RG16F||re===t.RG32F||re===t.RGBA16F||re===t.RGBA32F)&&e.get("EXT_color_buffer_float"),re}function k(R,A){let X;return R?A===null||A===Pn||A===Uo?X=t.DEPTH24_STENCIL8:A===_n?X=t.DEPTH32F_STENCIL8:A===Oo&&(X=t.DEPTH24_STENCIL8,tt("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):A===null||A===Pn||A===Uo?X=t.DEPTH_COMPONENT24:A===_n?X=t.DEPTH_COMPONENT32F:A===Oo&&(X=t.DEPTH_COMPONENT16),X}function E(R,A){return v(R)===!0||R.isFramebufferTexture&&R.minFilter!==di&&R.minFilter!==vi?Math.log2(Math.max(A.width,A.height))+1:R.mipmaps!==void 0&&R.mipmaps.length>0?R.mipmaps.length:R.isCompressedTexture&&Array.isArray(R.image)?A.mipmaps.length:1}function D(R){const A=R.target;A.removeEventListener("dispose",D),M(A),A.isVideoTexture&&h.delete(A),A.isHTMLTexture&&c.delete(A)}function P(R){const A=R.target;A.removeEventListener("dispose",P),I(A)}function M(R){const A=n.get(R);if(A.__webglInit===void 0)return;const X=R.source,ae=g.get(X);if(ae){const ge=ae[A.__cacheKey];ge.usedTimes--,ge.usedTimes===0&&F(R),Object.keys(ae).length===0&&g.delete(X)}n.remove(R)}function F(R){const A=n.get(R);t.deleteTexture(A.__webglTexture);const X=R.source,ae=g.get(X);delete ae[A.__cacheKey],l.memory.textures--}function I(R){const A=n.get(R);if(R.depthTexture&&(R.depthTexture.dispose(),n.remove(R.depthTexture)),R.isWebGLCubeRenderTarget)for(let ae=0;ae<6;ae++){if(Array.isArray(A.__webglFramebuffer[ae]))for(let ge=0;ge=s.maxTextures&&tt("WebGLTextures: Trying to use "+R+" texture units while this GPU supports only "+s.maxTextures),C+=1,R}function q(R){const A=[];return A.push(R.wrapS),A.push(R.wrapT),A.push(R.wrapR||0),A.push(R.magFilter),A.push(R.minFilter),A.push(R.anisotropy),A.push(R.internalFormat),A.push(R.format),A.push(R.type),A.push(R.generateMipmaps),A.push(R.premultiplyAlpha),A.push(R.flipY),A.push(R.unpackAlignment),A.push(R.colorSpace),A.join()}function te(R,A){const X=n.get(R);if(R.isVideoTexture&&Se(R),R.isRenderTargetTexture===!1&&R.isExternalTexture!==!0&&R.version>0&&X.__version!==R.version){const ae=R.image;if(ae===null)tt("WebGLRenderer: Texture marked for update but no image data found.");else if(ae.complete===!1)tt("WebGLRenderer: Texture marked for update but image is incomplete");else{Xe(X,R,A);return}}else R.isExternalTexture&&(X.__webglTexture=R.sourceTexture?R.sourceTexture:null);i.bindTexture(t.TEXTURE_2D,X.__webglTexture,t.TEXTURE0+A)}function he(R,A){const X=n.get(R);if(R.isRenderTargetTexture===!1&&R.version>0&&X.__version!==R.version){Xe(X,R,A);return}else R.isExternalTexture&&(X.__webglTexture=R.sourceTexture?R.sourceTexture:null);i.bindTexture(t.TEXTURE_2D_ARRAY,X.__webglTexture,t.TEXTURE0+A)}function Pe(R,A){const X=n.get(R);if(R.isRenderTargetTexture===!1&&R.version>0&&X.__version!==R.version){Xe(X,R,A);return}i.bindTexture(t.TEXTURE_3D,X.__webglTexture,t.TEXTURE0+A)}function Ee(R,A){const X=n.get(R);if(R.isCubeDepthTexture!==!0&&R.version>0&&X.__version!==R.version){et(X,R,A);return}i.bindTexture(t.TEXTURE_CUBE_MAP,X.__webglTexture,t.TEXTURE0+A)}const Ie={[No]:t.REPEAT,[zn]:t.CLAMP_TO_EDGE,[_u]:t.MIRRORED_REPEAT},qe={[di]:t.NEAREST,[fM]:t.NEAREST_MIPMAP_NEAREST,[oa]:t.NEAREST_MIPMAP_LINEAR,[vi]:t.LINEAR,[rd]:t.LINEAR_MIPMAP_NEAREST,[Bs]:t.LINEAR_MIPMAP_LINEAR},mt={[gM]:t.NEVER,[SM]:t.ALWAYS,[yM]:t.LESS,[Uc]:t.LEQUAL,[vM]:t.EQUAL,[Bc]:t.GEQUAL,[bM]:t.GREATER,[_M]:t.NOTEQUAL};function st(R,A){if(A.type===_n&&e.has("OES_texture_float_linear")===!1&&(A.magFilter===vi||A.magFilter===rd||A.magFilter===oa||A.magFilter===Bs||A.minFilter===vi||A.minFilter===rd||A.minFilter===oa||A.minFilter===Bs)&&tt("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),t.texParameteri(R,t.TEXTURE_WRAP_S,Ie[A.wrapS]),t.texParameteri(R,t.TEXTURE_WRAP_T,Ie[A.wrapT]),(R===t.TEXTURE_3D||R===t.TEXTURE_2D_ARRAY)&&t.texParameteri(R,t.TEXTURE_WRAP_R,Ie[A.wrapR]),t.texParameteri(R,t.TEXTURE_MAG_FILTER,qe[A.magFilter]),t.texParameteri(R,t.TEXTURE_MIN_FILTER,qe[A.minFilter]),A.compareFunction&&(t.texParameteri(R,t.TEXTURE_COMPARE_MODE,t.COMPARE_REF_TO_TEXTURE),t.texParameteri(R,t.TEXTURE_COMPARE_FUNC,mt[A.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(A.magFilter===di||A.minFilter!==oa&&A.minFilter!==Bs||A.type===_n&&e.has("OES_texture_float_linear")===!1)return;if(A.anisotropy>1||n.get(A).__currentAnisotropy){const X=e.get("EXT_texture_filter_anisotropic");t.texParameterf(R,X.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(A.anisotropy,s.getMaxAnisotropy())),n.get(A).__currentAnisotropy=A.anisotropy}}}function de(R,A){let X=!1;R.__webglInit===void 0&&(R.__webglInit=!0,A.addEventListener("dispose",D));const ae=A.source;let ge=g.get(ae);ge===void 0&&(ge={},g.set(ae,ge));const we=q(A);if(we!==R.__cacheKey){ge[we]===void 0&&(ge[we]={texture:t.createTexture(),usedTimes:0},l.memory.textures++,X=!0),ge[we].usedTimes++;const Te=ge[R.__cacheKey];Te!==void 0&&(ge[R.__cacheKey].usedTimes--,Te.usedTimes===0&&F(A)),R.__cacheKey=we,R.__webglTexture=ge[we].texture}return X}function ke(R,A,X){return Math.floor(Math.floor(R/X)/A)}function Me(R,A,X,ae){const we=R.updateRanges;if(we.length===0)i.texSubImage2D(t.TEXTURE_2D,0,0,0,A.width,A.height,X,ae,A.data);else{we.sort((Ue,Re)=>Ue.start-Re.start);let Te=0;for(let Ue=1;Ue0){ft&&St&&i.texStorage2D(t.TEXTURE_2D,De,Re,ot[0].width,ot[0].height);for(let ce=0,$e=ot.length;ce<$e;ce++)Ae=ot[ce],ft?j&&i.texSubImage2D(t.TEXTURE_2D,ce,0,0,Ae.width,Ae.height,Le,Ue,Ae.data):i.texImage2D(t.TEXTURE_2D,ce,Re,Ae.width,Ae.height,0,Le,Ue,Ae.data);A.generateMipmaps=!1}else ft?(St&&i.texStorage2D(t.TEXTURE_2D,De,Re,pe.width,pe.height),j&&Me(A,pe,Le,Ue)):i.texImage2D(t.TEXTURE_2D,0,Re,pe.width,pe.height,0,Le,Ue,pe.data);else if(A.isCompressedTexture)if(A.isCompressedArrayTexture){ft&&St&&i.texStorage3D(t.TEXTURE_2D_ARRAY,De,Re,ot[0].width,ot[0].height,pe.depth);for(let ce=0,$e=ot.length;ce<$e;ce++)if(Ae=ot[ce],A.format!==Zi)if(Le!==null)if(ft){if(j)if(A.layerUpdates.size>0){const Fe=om(Ae.width,Ae.height,A.format,A.type);for(const be of A.layerUpdates){const Ke=Ae.data.subarray(be*Fe/Ae.data.BYTES_PER_ELEMENT,(be+1)*Fe/Ae.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,ce,0,0,be,Ae.width,Ae.height,1,Le,Ke)}A.clearLayerUpdates()}else i.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,ce,0,0,0,Ae.width,Ae.height,pe.depth,Le,Ae.data)}else i.compressedTexImage3D(t.TEXTURE_2D_ARRAY,ce,Re,Ae.width,Ae.height,pe.depth,0,Ae.data,0,0);else tt("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else ft?j&&i.texSubImage3D(t.TEXTURE_2D_ARRAY,ce,0,0,0,Ae.width,Ae.height,pe.depth,Le,Ue,Ae.data):i.texImage3D(t.TEXTURE_2D_ARRAY,ce,Re,Ae.width,Ae.height,pe.depth,0,Le,Ue,Ae.data)}else{ft&&St&&i.texStorage2D(t.TEXTURE_2D,De,Re,ot[0].width,ot[0].height);for(let ce=0,$e=ot.length;ce<$e;ce++)Ae=ot[ce],A.format!==Zi?Le!==null?ft?j&&i.compressedTexSubImage2D(t.TEXTURE_2D,ce,0,0,Ae.width,Ae.height,Le,Ae.data):i.compressedTexImage2D(t.TEXTURE_2D,ce,Re,Ae.width,Ae.height,0,Ae.data):tt("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):ft?j&&i.texSubImage2D(t.TEXTURE_2D,ce,0,0,Ae.width,Ae.height,Le,Ue,Ae.data):i.texImage2D(t.TEXTURE_2D,ce,Re,Ae.width,Ae.height,0,Le,Ue,Ae.data)}else if(A.isDataArrayTexture)if(ft){if(St&&i.texStorage3D(t.TEXTURE_2D_ARRAY,De,Re,pe.width,pe.height,pe.depth),j)if(A.layerUpdates.size>0){const ce=om(pe.width,pe.height,A.format,A.type);for(const $e of A.layerUpdates){const Fe=pe.data.subarray($e*ce/pe.data.BYTES_PER_ELEMENT,($e+1)*ce/pe.data.BYTES_PER_ELEMENT);i.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,$e,pe.width,pe.height,1,Le,Ue,Fe)}A.clearLayerUpdates()}else i.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,0,pe.width,pe.height,pe.depth,Le,Ue,pe.data)}else i.texImage3D(t.TEXTURE_2D_ARRAY,0,Re,pe.width,pe.height,pe.depth,0,Le,Ue,pe.data);else if(A.isData3DTexture)ft?(St&&i.texStorage3D(t.TEXTURE_3D,De,Re,pe.width,pe.height,pe.depth),j&&i.texSubImage3D(t.TEXTURE_3D,0,0,0,0,pe.width,pe.height,pe.depth,Le,Ue,pe.data)):i.texImage3D(t.TEXTURE_3D,0,Re,pe.width,pe.height,pe.depth,0,Le,Ue,pe.data);else if(A.isFramebufferTexture){if(St)if(ft)i.texStorage2D(t.TEXTURE_2D,De,Re,pe.width,pe.height);else{let ce=pe.width,$e=pe.height;for(let Fe=0;Fe>=1,$e>>=1}}else if(A.isHTMLTexture){if("texElementImage2D"in t){const ce=t.canvas;if(ce.hasAttribute("layoutsubtree")||ce.setAttribute("layoutsubtree","true"),pe.parentNode!==ce){ce.appendChild(pe),c.add(A),ce.onpaint=ct=>{const Wt=ct.changedElements;for(const Lt of c)Wt.includes(Lt.image)&&(Lt.needsUpdate=!0)},ce.requestPaint();return}const $e=0,Fe=t.RGBA,be=t.RGBA,Ke=t.UNSIGNED_BYTE;t.texElementImage2D(t.TEXTURE_2D,$e,Fe,be,Ke,pe),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)}}else if(ot.length>0){if(ft&&St){const ce=Ge(ot[0]);i.texStorage2D(t.TEXTURE_2D,De,Re,ce.width,ce.height)}for(let ce=0,$e=ot.length;ce<$e;ce++)Ae=ot[ce],ft?j&&i.texSubImage2D(t.TEXTURE_2D,ce,0,0,Le,Ue,Ae):i.texImage2D(t.TEXTURE_2D,ce,Re,Le,Ue,Ae);A.generateMipmaps=!1}else if(ft){if(St){const ce=Ge(pe);i.texStorage2D(t.TEXTURE_2D,De,Re,ce.width,ce.height)}j&&i.texSubImage2D(t.TEXTURE_2D,0,0,0,Le,Ue,pe)}else i.texImage2D(t.TEXTURE_2D,0,Re,Le,Ue,pe);v(A)&&S(ae),Te.__version=we.version,A.onUpdate&&A.onUpdate(A)}R.__version=A.version}function et(R,A,X){if(A.image.length!==6)return;const ae=de(R,A),ge=A.source;i.bindTexture(t.TEXTURE_CUBE_MAP,R.__webglTexture,t.TEXTURE0+X);const we=n.get(ge);if(ge.version!==we.__version||ae===!0){i.activeTexture(t.TEXTURE0+X);const Te=bt.getPrimaries(bt.workingColorSpace),re=A.colorSpace===fs?null:bt.getPrimaries(A.colorSpace),pe=A.colorSpace===fs||Te===re?t.NONE:t.BROWSER_DEFAULT_WEBGL;i.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,A.flipY),i.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,A.premultiplyAlpha),i.pixelStorei(t.UNPACK_ALIGNMENT,A.unpackAlignment),i.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,pe);const Le=A.isCompressedTexture||A.image[0].isCompressedTexture,Ue=A.image[0]&&A.image[0].isDataTexture,Re=[];for(let be=0;be<6;be++)!Le&&!Ue?Re[be]=_(A.image[be],!0,s.maxCubemapSize):Re[be]=Ue?A.image[be].image:A.image[be],Re[be]=le(A,Re[be]);const Ae=Re[0],ot=r.convert(A.format,A.colorSpace),ft=r.convert(A.type),St=x(A.internalFormat,ot,ft,A.normalized,A.colorSpace),j=A.isVideoTexture!==!0,De=we.__version===void 0||ae===!0,ce=ge.dataReady;let $e=E(A,Ae);st(t.TEXTURE_CUBE_MAP,A);let Fe;if(Le){j&&De&&i.texStorage2D(t.TEXTURE_CUBE_MAP,$e,St,Ae.width,Ae.height);for(let be=0;be<6;be++){Fe=Re[be].mipmaps;for(let Ke=0;Ke0&&$e++;const be=Ge(Re[0]);i.texStorage2D(t.TEXTURE_CUBE_MAP,$e,St,be.width,be.height)}for(let be=0;be<6;be++)if(Ue){j?ce&&i.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+be,0,0,0,Re[be].width,Re[be].height,ot,ft,Re[be].data):i.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+be,0,St,Re[be].width,Re[be].height,0,ot,ft,Re[be].data);for(let Ke=0;Ke>we),Ae=Math.max(1,A.height>>we);ge===t.TEXTURE_3D||ge===t.TEXTURE_2D_ARRAY?i.texImage3D(ge,we,pe,Re,Ae,A.depth,0,Te,re,null):i.texImage2D(ge,we,pe,Re,Ae,0,Te,re,null)}i.bindFramebuffer(t.FRAMEBUFFER,R),Ce(A)?o.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,ae,ge,Ue.__webglTexture,0,me(A)):(ge===t.TEXTURE_2D||ge>=t.TEXTURE_CUBE_MAP_POSITIVE_X&&ge<=t.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&t.framebufferTexture2D(t.FRAMEBUFFER,ae,ge,Ue.__webglTexture,we),i.bindFramebuffer(t.FRAMEBUFFER,null)}function U(R,A,X){if(t.bindRenderbuffer(t.RENDERBUFFER,R),A.depthBuffer){const ae=A.depthTexture,ge=ae&&ae.isDepthTexture?ae.type:null,we=k(A.stencilBuffer,ge),Te=A.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT;Ce(A)?o.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,me(A),we,A.width,A.height):X?t.renderbufferStorageMultisample(t.RENDERBUFFER,me(A),we,A.width,A.height):t.renderbufferStorage(t.RENDERBUFFER,we,A.width,A.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,Te,t.RENDERBUFFER,R)}else{const ae=A.textures;for(let ge=0;ge{delete A.__boundDepthTexture,delete A.__depthDisposeCallback,ae.removeEventListener("dispose",ge)};ae.addEventListener("dispose",ge),A.__depthDisposeCallback=ge}A.__boundDepthTexture=ae}if(R.depthTexture&&!A.__autoAllocateDepthBuffer)if(X)for(let ae=0;ae<6;ae++)G(A.__webglFramebuffer[ae],R,ae);else{const ae=R.texture.mipmaps;ae&&ae.length>0?G(A.__webglFramebuffer[0],R,0):G(A.__webglFramebuffer,R,0)}else if(X){A.__webglDepthbuffer=[];for(let ae=0;ae<6;ae++)if(i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer[ae]),A.__webglDepthbuffer[ae]===void 0)A.__webglDepthbuffer[ae]=t.createRenderbuffer(),U(A.__webglDepthbuffer[ae],R,!1);else{const ge=R.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,we=A.__webglDepthbuffer[ae];t.bindRenderbuffer(t.RENDERBUFFER,we),t.framebufferRenderbuffer(t.FRAMEBUFFER,ge,t.RENDERBUFFER,we)}}else{const ae=R.texture.mipmaps;if(ae&&ae.length>0?i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer[0]):i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer),A.__webglDepthbuffer===void 0)A.__webglDepthbuffer=t.createRenderbuffer(),U(A.__webglDepthbuffer,R,!1);else{const ge=R.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,we=A.__webglDepthbuffer;t.bindRenderbuffer(t.RENDERBUFFER,we),t.framebufferRenderbuffer(t.FRAMEBUFFER,ge,t.RENDERBUFFER,we)}}i.bindFramebuffer(t.FRAMEBUFFER,null)}function ue(R,A,X){const ae=n.get(R);A!==void 0&&Ze(ae.__webglFramebuffer,R,R.texture,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,0),X!==void 0&&Q(R)}function se(R){const A=R.texture,X=n.get(R),ae=n.get(A);R.addEventListener("dispose",P);const ge=R.textures,we=R.isWebGLCubeRenderTarget===!0,Te=ge.length>1;if(Te||(ae.__webglTexture===void 0&&(ae.__webglTexture=t.createTexture()),ae.__version=A.version,l.memory.textures++),we){X.__webglFramebuffer=[];for(let re=0;re<6;re++)if(A.mipmaps&&A.mipmaps.length>0){X.__webglFramebuffer[re]=[];for(let pe=0;pe0){X.__webglFramebuffer=[];for(let re=0;re0&&Ce(R)===!1){X.__webglMultisampledFramebuffer=t.createFramebuffer(),X.__webglColorRenderbuffer=[],i.bindFramebuffer(t.FRAMEBUFFER,X.__webglMultisampledFramebuffer);for(let re=0;re0)for(let pe=0;pe0)for(let pe=0;pe0){if(Ce(R)===!1){const A=R.textures,X=R.width,ae=R.height;let ge=t.COLOR_BUFFER_BIT;const we=R.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,Te=n.get(R),re=A.length>1;if(re)for(let Le=0;Le0?i.bindFramebuffer(t.DRAW_FRAMEBUFFER,Te.__webglFramebuffer[0]):i.bindFramebuffer(t.DRAW_FRAMEBUFFER,Te.__webglFramebuffer);for(let Le=0;Le0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&A.__useRenderToTexture!==!1}function Se(R){const A=l.render.frame;h.get(R)!==A&&(h.set(R,A),R.update())}function le(R,A){const X=R.colorSpace,ae=R.format,ge=R.type;return R.isCompressedTexture===!0||R.isVideoTexture===!0||X!==ml&&X!==fs&&(bt.getTransfer(X)===Ct?(ae!==Zi||ge!==Oi)&&tt("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):vt("WebGLTextures: Unsupported texture color space:",X)),A}function Ge(R){return typeof HTMLImageElement<"u"&&R instanceof HTMLImageElement?(u.width=R.naturalWidth||R.width,u.height=R.naturalHeight||R.height):typeof VideoFrame<"u"&&R instanceof VideoFrame?(u.width=R.displayWidth,u.height=R.displayHeight):(u.width=R.width,u.height=R.height),u}this.allocateTextureUnit=W,this.resetTextureUnits=z,this.getTextureUnits=K,this.setTextureUnits=$,this.setTexture2D=te,this.setTexture2DArray=he,this.setTexture3D=Pe,this.setTextureCube=Ee,this.rebindTextures=ue,this.setupRenderTarget=se,this.updateRenderTargetMipmap=fe,this.updateMultisampleRenderTarget=O,this.setupDepthRenderbuffer=Q,this.setupFrameBufferTexture=Ze,this.useMultisampledRTT=Ce,this.isReversedDepthBuffer=function(){return i.buffers.depth.getReversed()}}function TE(t,e){function i(n,s=fs){let r;const l=bt.getTransfer(s);if(n===Oi)return t.UNSIGNED_BYTE;if(n===Dc)return t.UNSIGNED_SHORT_4_4_4_4;if(n===Ic)return t.UNSIGNED_SHORT_5_5_5_1;if(n===wg)return t.UNSIGNED_INT_5_9_9_9_REV;if(n===Mg)return t.UNSIGNED_INT_10F_11F_11F_REV;if(n===_g)return t.BYTE;if(n===Sg)return t.SHORT;if(n===Oo)return t.UNSIGNED_SHORT;if(n===Rc)return t.INT;if(n===Pn)return t.UNSIGNED_INT;if(n===_n)return t.FLOAT;if(n===xn)return t.HALF_FLOAT;if(n===Pg)return t.ALPHA;if(n===xg)return t.RGB;if(n===Zi)return t.RGBA;if(n===Yn)return t.DEPTH_COMPONENT;if(n===Vs)return t.DEPTH_STENCIL;if(n===Tg)return t.RED;if(n===Fc)return t.RED_INTEGER;if(n===js)return t.RG;if(n===Nc)return t.RG_INTEGER;if(n===Oc)return t.RGBA_INTEGER;if(n===Ya||n===Ja||n===Za||n===Qa)if(l===Ct)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Ya)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Ja)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Za)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Qa)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Ya)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Ja)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Za)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Qa)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===Su||n===wu||n===Mu||n===Pu)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===Su)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===wu)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Mu)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Pu)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===xu||n===Tu||n===Au||n===Eu||n===Cu||n===hl||n===ku)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===xu||n===Tu)return l===Ct?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Au)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC;if(n===Eu)return r.COMPRESSED_R11_EAC;if(n===Cu)return r.COMPRESSED_SIGNED_R11_EAC;if(n===hl)return r.COMPRESSED_RG11_EAC;if(n===ku)return r.COMPRESSED_SIGNED_RG11_EAC}else return null;if(n===Lu||n===Ru||n===Du||n===Iu||n===Fu||n===Nu||n===Ou||n===Uu||n===Bu||n===Vu||n===zu||n===$u||n===Gu||n===Hu)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Lu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Ru)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Du)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===Iu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Fu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Nu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Ou)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Uu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Bu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Vu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===zu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===$u)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Gu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Hu)return l===Ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Wu||n===qu||n===ju)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Wu)return l===Ct?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===qu)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===ju)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Xu||n===Ku||n===fl||n===Yu)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===Xu)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Ku)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===fl)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Yu)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===Uo?t.UNSIGNED_INT_24_8:t[n]!==void 0?t[n]:null}return{convert:i}}const AE=` +}`,jE=[new B(1,0,0),new B(-1,0,0),new B(0,1,0),new B(0,-1,0),new B(0,0,1),new B(0,0,-1)],XE=[new B(0,-1,0),new B(0,-1,0),new B(0,0,1),new B(0,0,-1),new B(0,-1,0),new B(0,-1,0)],bf=new _t,xo=new B,pd=new B;function KE(t,e,i){let n=new Rh;const s=new Xe,r=new Xe,l=new Et,o=new jP,u=new XP,c={},h=i.maxTextureSize,d={[ts]:Ei,[Ei]:ts,[Ki]:Ki},m=new ii({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Xe},radius:{value:4}},vertexShader:WE,fragmentShader:qE}),g=m.clone();g.defines.HORIZONTAL_PASS=1;const b=new Bt;b.setAttribute("position",new Qt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const w=new Ut(b,m),v=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=fl;let y=this.type;this.render=function(C,L,x){if(v.enabled===!1||v.autoUpdate===!1&&v.needsUpdate===!1||C.length===0)return;this.type===vx&&(tt("WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead."),this.type=fl);const T=t.getRenderTarget(),F=t.getActiveCubeFace(),I=t.getActiveMipmapLevel(),E=t.state;E.setBlending(kn),E.buffers.depth.getReversed()===!0?E.buffers.color.setClear(0,0,0,0):E.buffers.color.setClear(1,1,1,1),E.buffers.depth.setTest(!0),E.setScissorTest(!1);const z=y!==this.type;z&&L.traverse(function(Y){Y.material&&(Array.isArray(Y.material)?Y.material.forEach($=>$.needsUpdate=!0):Y.material.needsUpdate=!0)});for(let Y=0,$=C.length;Y<$;Y++){const W=C[Y],q=W.shadow;if(q===void 0){tt("WebGLShadowMap:",W,"has no shadow.");continue}if(q.autoUpdate===!1&&q.needsUpdate===!1)continue;s.copy(q.mapSize);const te=q.getFrameExtents();s.multiply(te),r.copy(q.mapSize),(s.x>h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/te.x),s.x=r.x*te.x,q.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/te.y),s.y=r.y*te.y,q.mapSize.y=r.y));const me=t.state.buffers.depth.getReversed();if(q.camera._reversedDepth=me,q.map===null||z===!0){if(q.map!==null&&(q.map.depthTexture!==null&&(q.map.depthTexture.dispose(),q.map.depthTexture=null),q.map.dispose()),this.type===Eo){if(W.isPointLight){tt("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}q.map=new ki(s.x,s.y,{format:ir,type:Wi,minFilter:Si,magFilter:Si,generateMipmaps:!1}),q.map.texture.name=W.name+".shadowMap",q.map.depthTexture=new no(s.x,s.y,Gi),q.map.depthTexture.name=W.name+".shadowMapDepth",q.map.depthTexture.format=is,q.map.depthTexture.compareFunction=null,q.map.depthTexture.minFilter=Zt,q.map.depthTexture.magFilter=Zt}else W.isPointLight?(q.map=new Hy(s.x),q.map.depthTexture=new UP(s.x,Rn)):(q.map=new ki(s.x,s.y),q.map.depthTexture=new no(s.x,s.y,Rn)),q.map.depthTexture.name=W.name+".shadowMap",q.map.depthTexture.format=is,this.type===fl?(q.map.depthTexture.compareFunction=me?xh:Mh,q.map.depthTexture.minFilter=Si,q.map.depthTexture.magFilter=Si):(q.map.depthTexture.compareFunction=null,q.map.depthTexture.minFilter=Zt,q.map.depthTexture.magFilter=Zt);q.camera.updateProjectionMatrix()}const xe=q.map.isWebGLCubeRenderTarget?6:1;for(let Ce=0;Ce0||L.map&&L.alphaTest>0||L.alphaToCoverage===!0){const E=F.uuid,z=L.uuid;let Y=c[E];Y===void 0&&(Y={},c[E]=Y);let $=Y[z];$===void 0&&($=F.clone(),Y[z]=$,L.addEventListener("dispose",k)),F=$}if(F.visible=L.visible,F.wireframe=L.wireframe,T===Eo?F.side=L.shadowSide!==null?L.shadowSide:L.side:F.side=L.shadowSide!==null?L.shadowSide:d[L.side],F.alphaMap=L.alphaMap,F.alphaTest=L.alphaToCoverage===!0?.5:L.alphaTest,F.map=L.map,F.clipShadows=L.clipShadows,F.clippingPlanes=L.clippingPlanes,F.clipIntersection=L.clipIntersection,F.displacementMap=L.displacementMap,F.displacementScale=L.displacementScale,F.displacementBias=L.displacementBias,F.wireframeLinewidth=L.wireframeLinewidth,F.linewidth=L.linewidth,x.isPointLight===!0&&F.isMeshDistanceMaterial===!0){const E=t.properties.get(F);E.light=x}return F}function M(C,L,x,T,F){if(C.visible===!1)return;if(C.layers.test(L.layers)&&(C.isMesh||C.isLine||C.isPoints)&&(C.castShadow||C.receiveShadow&&F===Eo)&&(!C.frustumCulled||n.intersectsObject(C))){C.modelViewMatrix.multiplyMatrices(x.matrixWorldInverse,C.matrixWorld);const z=e.update(C),Y=C.material;if(Array.isArray(Y)){const $=z.groups;for(let W=0,q=$.length;W=1):me.indexOf("OpenGL ES")!==-1&&(te=parseFloat(/^OpenGL ES (\d)/.exec(me)[1]),q=te>=2);let xe=null,Ce={};const Fe=t.getParameter(t.SCISSOR_BOX),qe=t.getParameter(t.VIEWPORT),mt=new Et().fromArray(Fe),st=new Et().fromArray(qe);function de(j,De,he,$e){const Ne=new Uint8Array(4),be=t.createTexture();t.bindTexture(j,be),t.texParameteri(j,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(j,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let Ye=0;Ye"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new Xe,h=new WeakMap,d=new Set;let m;const g=new WeakMap;let b=!1;try{b=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function w(D,A){return b?new OffscreenCanvas(D,A):ra("canvas")}function v(D,A,X){let le=1;const ye=Ge(D);if((ye.width>X||ye.height>X)&&(le=X/Math.max(ye.width,ye.height)),le<1)if(typeof HTMLImageElement<"u"&&D instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&D instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&D instanceof ImageBitmap||typeof VideoFrame<"u"&&D instanceof VideoFrame){const we=Math.floor(le*ye.width),Te=Math.floor(le*ye.height);m===void 0&&(m=w(we,Te));const oe=A?w(we,Te):m;return oe.width=we,oe.height=Te,oe.getContext("2d").drawImage(D,0,0,we,Te),tt("WebGLRenderer: Texture has been resized from ("+ye.width+"x"+ye.height+") to ("+we+"x"+Te+")."),oe}else return"data"in D&&tt("WebGLRenderer: Image in DataTexture is too big ("+ye.width+"x"+ye.height+")."),D;return D}function y(D){return D.generateMipmaps}function S(D){t.generateMipmap(D)}function P(D){return D.isWebGLCubeRenderTarget?t.TEXTURE_CUBE_MAP:D.isWebGL3DRenderTarget?t.TEXTURE_3D:D.isWebGLArrayRenderTarget||D.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:t.TEXTURE_2D}function M(D,A,X,le,ye,we=!1){if(D!==null){if(t[D]!==void 0)return t[D];tt("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+D+"'")}let Te;le&&(Te=e.get("EXT_texture_norm16"),Te||tt("WebGLRenderer: Unable to use normalized textures without EXT_texture_norm16 extension"));let oe=A;if(A===t.RED&&(X===t.FLOAT&&(oe=t.R32F),X===t.HALF_FLOAT&&(oe=t.R16F),X===t.UNSIGNED_BYTE&&(oe=t.R8),X===t.UNSIGNED_SHORT&&Te&&(oe=Te.R16_EXT),X===t.SHORT&&Te&&(oe=Te.R16_SNORM_EXT)),A===t.RED_INTEGER&&(X===t.UNSIGNED_BYTE&&(oe=t.R8UI),X===t.UNSIGNED_SHORT&&(oe=t.R16UI),X===t.UNSIGNED_INT&&(oe=t.R32UI),X===t.BYTE&&(oe=t.R8I),X===t.SHORT&&(oe=t.R16I),X===t.INT&&(oe=t.R32I)),A===t.RG&&(X===t.FLOAT&&(oe=t.RG32F),X===t.HALF_FLOAT&&(oe=t.RG16F),X===t.UNSIGNED_BYTE&&(oe=t.RG8),X===t.UNSIGNED_SHORT&&Te&&(oe=Te.RG16_EXT),X===t.SHORT&&Te&&(oe=Te.RG16_SNORM_EXT)),A===t.RG_INTEGER&&(X===t.UNSIGNED_BYTE&&(oe=t.RG8UI),X===t.UNSIGNED_SHORT&&(oe=t.RG16UI),X===t.UNSIGNED_INT&&(oe=t.RG32UI),X===t.BYTE&&(oe=t.RG8I),X===t.SHORT&&(oe=t.RG16I),X===t.INT&&(oe=t.RG32I)),A===t.RGB_INTEGER&&(X===t.UNSIGNED_BYTE&&(oe=t.RGB8UI),X===t.UNSIGNED_SHORT&&(oe=t.RGB16UI),X===t.UNSIGNED_INT&&(oe=t.RGB32UI),X===t.BYTE&&(oe=t.RGB8I),X===t.SHORT&&(oe=t.RGB16I),X===t.INT&&(oe=t.RGB32I)),A===t.RGBA_INTEGER&&(X===t.UNSIGNED_BYTE&&(oe=t.RGBA8UI),X===t.UNSIGNED_SHORT&&(oe=t.RGBA16UI),X===t.UNSIGNED_INT&&(oe=t.RGBA32UI),X===t.BYTE&&(oe=t.RGBA8I),X===t.SHORT&&(oe=t.RGBA16I),X===t.INT&&(oe=t.RGBA32I)),A===t.RGB&&(X===t.UNSIGNED_SHORT&&Te&&(oe=Te.RGB16_EXT),X===t.SHORT&&Te&&(oe=Te.RGB16_SNORM_EXT),X===t.UNSIGNED_INT_5_9_9_9_REV&&(oe=t.RGB9_E5),X===t.UNSIGNED_INT_10F_11F_11F_REV&&(oe=t.R11F_G11F_B10F)),A===t.RGBA){const ge=we?Fl:vt.getTransfer(ye);X===t.FLOAT&&(oe=t.RGBA32F),X===t.HALF_FLOAT&&(oe=t.RGBA16F),X===t.UNSIGNED_BYTE&&(oe=ge===At?t.SRGB8_ALPHA8:t.RGBA8),X===t.UNSIGNED_SHORT&&Te&&(oe=Te.RGBA16_EXT),X===t.SHORT&&Te&&(oe=Te.RGBA16_SNORM_EXT),X===t.UNSIGNED_SHORT_4_4_4_4&&(oe=t.RGBA4),X===t.UNSIGNED_SHORT_5_5_5_1&&(oe=t.RGB5_A1)}return(oe===t.R16F||oe===t.R32F||oe===t.RG16F||oe===t.RG32F||oe===t.RGBA16F||oe===t.RGBA32F)&&e.get("EXT_color_buffer_float"),oe}function k(D,A){let X;return D?A===null||A===Rn||A===ia?X=t.DEPTH24_STENCIL8:A===Gi?X=t.DEPTH32F_STENCIL8:A===ta&&(X=t.DEPTH24_STENCIL8,tt("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):A===null||A===Rn||A===ia?X=t.DEPTH_COMPONENT24:A===Gi?X=t.DEPTH_COMPONENT32F:A===ta&&(X=t.DEPTH_COMPONENT16),X}function C(D,A){return y(D)===!0||D.isFramebufferTexture&&D.minFilter!==Zt&&D.minFilter!==Si?Math.log2(Math.max(A.width,A.height))+1:D.mipmaps!==void 0&&D.mipmaps.length>0?D.mipmaps.length:D.isCompressedTexture&&Array.isArray(D.image)?A.mipmaps.length:1}function L(D){const A=D.target;A.removeEventListener("dispose",L),T(A),A.isVideoTexture&&h.delete(A),A.isHTMLTexture&&d.delete(A)}function x(D){const A=D.target;A.removeEventListener("dispose",x),I(A)}function T(D){const A=n.get(D);if(A.__webglInit===void 0)return;const X=D.source,le=g.get(X);if(le){const ye=le[A.__cacheKey];ye.usedTimes--,ye.usedTimes===0&&F(D),Object.keys(le).length===0&&g.delete(X)}n.remove(D)}function F(D){const A=n.get(D);t.deleteTexture(A.__webglTexture);const X=D.source,le=g.get(X);delete le[A.__cacheKey],l.memory.textures--}function I(D){const A=n.get(D);if(D.depthTexture&&(D.depthTexture.dispose(),n.remove(D.depthTexture)),D.isWebGLCubeRenderTarget)for(let le=0;le<6;le++){if(Array.isArray(A.__webglFramebuffer[le]))for(let ye=0;ye=s.maxTextures&&tt("WebGLTextures: Trying to use "+D+" texture units while this GPU supports only "+s.maxTextures),E+=1,D}function q(D){const A=[];return A.push(D.wrapS),A.push(D.wrapT),A.push(D.wrapR||0),A.push(D.magFilter),A.push(D.minFilter),A.push(D.anisotropy),A.push(D.internalFormat),A.push(D.format),A.push(D.type),A.push(D.generateMipmaps),A.push(D.premultiplyAlpha),A.push(D.flipY),A.push(D.unpackAlignment),A.push(D.colorSpace),A.join()}function te(D,A){const X=n.get(D);if(D.isVideoTexture&&Se(D),D.isRenderTargetTexture===!1&&D.isExternalTexture!==!0&&D.version>0&&X.__version!==D.version){const le=D.image;if(le===null)tt("WebGLRenderer: Texture marked for update but no image data found.");else if(le.complete===!1)tt("WebGLRenderer: Texture marked for update but image is incomplete");else{Ke(X,D,A);return}}else D.isExternalTexture&&(X.__webglTexture=D.sourceTexture?D.sourceTexture:null);i.bindTexture(t.TEXTURE_2D,X.__webglTexture,t.TEXTURE0+A)}function me(D,A){const X=n.get(D);if(D.isRenderTargetTexture===!1&&D.version>0&&X.__version!==D.version){Ke(X,D,A);return}else D.isExternalTexture&&(X.__webglTexture=D.sourceTexture?D.sourceTexture:null);i.bindTexture(t.TEXTURE_2D_ARRAY,X.__webglTexture,t.TEXTURE0+A)}function xe(D,A){const X=n.get(D);if(D.isRenderTargetTexture===!1&&D.version>0&&X.__version!==D.version){Ke(X,D,A);return}i.bindTexture(t.TEXTURE_3D,X.__webglTexture,t.TEXTURE0+A)}function Ce(D,A){const X=n.get(D);if(D.isCubeDepthTexture!==!0&&D.version>0&&X.__version!==D.version){et(X,D,A);return}i.bindTexture(t.TEXTURE_CUBE_MAP,X.__webglTexture,t.TEXTURE0+A)}const Fe={[ea]:t.REPEAT,[sn]:t.CLAMP_TO_EDGE,[Kd]:t.MIRRORED_REPEAT},qe={[Zt]:t.NEAREST,[Vx]:t.NEAREST_MIPMAP_NEAREST,[Pa]:t.NEAREST_MIPMAP_LINEAR,[Si]:t.LINEAR,[Eu]:t.LINEAR_MIPMAP_NEAREST,[js]:t.LINEAR_MIPMAP_LINEAR},mt={[$x]:t.NEVER,[jx]:t.ALWAYS,[Gx]:t.LESS,[Mh]:t.LEQUAL,[Hx]:t.EQUAL,[xh]:t.GEQUAL,[Wx]:t.GREATER,[qx]:t.NOTEQUAL};function st(D,A){if(A.type===Gi&&e.has("OES_texture_float_linear")===!1&&(A.magFilter===Si||A.magFilter===Eu||A.magFilter===Pa||A.magFilter===js||A.minFilter===Si||A.minFilter===Eu||A.minFilter===Pa||A.minFilter===js)&&tt("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),t.texParameteri(D,t.TEXTURE_WRAP_S,Fe[A.wrapS]),t.texParameteri(D,t.TEXTURE_WRAP_T,Fe[A.wrapT]),(D===t.TEXTURE_3D||D===t.TEXTURE_2D_ARRAY)&&t.texParameteri(D,t.TEXTURE_WRAP_R,Fe[A.wrapR]),t.texParameteri(D,t.TEXTURE_MAG_FILTER,qe[A.magFilter]),t.texParameteri(D,t.TEXTURE_MIN_FILTER,qe[A.minFilter]),A.compareFunction&&(t.texParameteri(D,t.TEXTURE_COMPARE_MODE,t.COMPARE_REF_TO_TEXTURE),t.texParameteri(D,t.TEXTURE_COMPARE_FUNC,mt[A.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(A.magFilter===Zt||A.minFilter!==Pa&&A.minFilter!==js||A.type===Gi&&e.has("OES_texture_float_linear")===!1)return;if(A.anisotropy>1||n.get(A).__currentAnisotropy){const X=e.get("EXT_texture_filter_anisotropic");t.texParameterf(D,X.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(A.anisotropy,s.getMaxAnisotropy())),n.get(A).__currentAnisotropy=A.anisotropy}}}function de(D,A){let X=!1;D.__webglInit===void 0&&(D.__webglInit=!0,A.addEventListener("dispose",L));const le=A.source;let ye=g.get(le);ye===void 0&&(ye={},g.set(le,ye));const we=q(A);if(we!==D.__cacheKey){ye[we]===void 0&&(ye[we]={texture:t.createTexture(),usedTimes:0},l.memory.textures++,X=!0),ye[we].usedTimes++;const Te=ye[D.__cacheKey];Te!==void 0&&(ye[D.__cacheKey].usedTimes--,Te.usedTimes===0&&F(A)),D.__cacheKey=we,D.__webglTexture=ye[we].texture}return X}function ke(D,A,X){return Math.floor(Math.floor(D/X)/A)}function Me(D,A,X,le){const we=D.updateRanges;if(we.length===0)i.texSubImage2D(t.TEXTURE_2D,0,0,0,A.width,A.height,X,le,A.data);else{we.sort((Ue,Le)=>Ue.start-Le.start);let Te=0;for(let Ue=1;Ue0){ct&&Mt&&i.texStorage2D(t.TEXTURE_2D,De,Le,ot[0].width,ot[0].height);for(let he=0,$e=ot.length;he<$e;he++)Ae=ot[he],ct?j&&i.texSubImage2D(t.TEXTURE_2D,he,0,0,Ae.width,Ae.height,Re,Ue,Ae.data):i.texImage2D(t.TEXTURE_2D,he,Le,Ae.width,Ae.height,0,Re,Ue,Ae.data);A.generateMipmaps=!1}else ct?(Mt&&i.texStorage2D(t.TEXTURE_2D,De,Le,ge.width,ge.height),j&&Me(A,ge,Re,Ue)):i.texImage2D(t.TEXTURE_2D,0,Le,ge.width,ge.height,0,Re,Ue,ge.data);else if(A.isCompressedTexture)if(A.isCompressedArrayTexture){ct&&Mt&&i.texStorage3D(t.TEXTURE_2D_ARRAY,De,Le,ot[0].width,ot[0].height,ge.depth);for(let he=0,$e=ot.length;he<$e;he++)if(Ae=ot[he],A.format!==Hi)if(Re!==null)if(ct){if(j)if(A.layerUpdates.size>0){const Ne=Yp(Ae.width,Ae.height,A.format,A.type);for(const be of A.layerUpdates){const Ye=Ae.data.subarray(be*Ne/Ae.data.BYTES_PER_ELEMENT,(be+1)*Ne/Ae.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,he,0,0,be,Ae.width,Ae.height,1,Re,Ye)}A.clearLayerUpdates()}else i.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,he,0,0,0,Ae.width,Ae.height,ge.depth,Re,Ae.data)}else i.compressedTexImage3D(t.TEXTURE_2D_ARRAY,he,Le,Ae.width,Ae.height,ge.depth,0,Ae.data,0,0);else tt("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else ct?j&&i.texSubImage3D(t.TEXTURE_2D_ARRAY,he,0,0,0,Ae.width,Ae.height,ge.depth,Re,Ue,Ae.data):i.texImage3D(t.TEXTURE_2D_ARRAY,he,Le,Ae.width,Ae.height,ge.depth,0,Re,Ue,Ae.data)}else{ct&&Mt&&i.texStorage2D(t.TEXTURE_2D,De,Le,ot[0].width,ot[0].height);for(let he=0,$e=ot.length;he<$e;he++)Ae=ot[he],A.format!==Hi?Re!==null?ct?j&&i.compressedTexSubImage2D(t.TEXTURE_2D,he,0,0,Ae.width,Ae.height,Re,Ae.data):i.compressedTexImage2D(t.TEXTURE_2D,he,Le,Ae.width,Ae.height,0,Ae.data):tt("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):ct?j&&i.texSubImage2D(t.TEXTURE_2D,he,0,0,Ae.width,Ae.height,Re,Ue,Ae.data):i.texImage2D(t.TEXTURE_2D,he,Le,Ae.width,Ae.height,0,Re,Ue,Ae.data)}else if(A.isDataArrayTexture)if(ct){if(Mt&&i.texStorage3D(t.TEXTURE_2D_ARRAY,De,Le,ge.width,ge.height,ge.depth),j)if(A.layerUpdates.size>0){const he=Yp(ge.width,ge.height,A.format,A.type);for(const $e of A.layerUpdates){const Ne=ge.data.subarray($e*he/ge.data.BYTES_PER_ELEMENT,($e+1)*he/ge.data.BYTES_PER_ELEMENT);i.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,$e,ge.width,ge.height,1,Re,Ue,Ne)}A.clearLayerUpdates()}else i.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,0,ge.width,ge.height,ge.depth,Re,Ue,ge.data)}else i.texImage3D(t.TEXTURE_2D_ARRAY,0,Le,ge.width,ge.height,ge.depth,0,Re,Ue,ge.data);else if(A.isData3DTexture)ct?(Mt&&i.texStorage3D(t.TEXTURE_3D,De,Le,ge.width,ge.height,ge.depth),j&&i.texSubImage3D(t.TEXTURE_3D,0,0,0,0,ge.width,ge.height,ge.depth,Re,Ue,ge.data)):i.texImage3D(t.TEXTURE_3D,0,Le,ge.width,ge.height,ge.depth,0,Re,Ue,ge.data);else if(A.isFramebufferTexture){if(Mt)if(ct)i.texStorage2D(t.TEXTURE_2D,De,Le,ge.width,ge.height);else{let he=ge.width,$e=ge.height;for(let Ne=0;Ne>=1,$e>>=1}}else if(A.isHTMLTexture){if("texElementImage2D"in t){const he=t.canvas;if(he.hasAttribute("layoutsubtree")||he.setAttribute("layoutsubtree","true"),ge.parentNode!==he){he.appendChild(ge),d.add(A),he.onpaint=ut=>{const Kt=ut.changedElements;for(const Lt of d)Kt.includes(Lt.image)&&(Lt.needsUpdate=!0)},he.requestPaint();return}const $e=0,Ne=t.RGBA,be=t.RGBA,Ye=t.UNSIGNED_BYTE;t.texElementImage2D(t.TEXTURE_2D,$e,Ne,be,Ye,ge),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)}}else if(ot.length>0){if(ct&&Mt){const he=Ge(ot[0]);i.texStorage2D(t.TEXTURE_2D,De,Le,he.width,he.height)}for(let he=0,$e=ot.length;he<$e;he++)Ae=ot[he],ct?j&&i.texSubImage2D(t.TEXTURE_2D,he,0,0,Re,Ue,Ae):i.texImage2D(t.TEXTURE_2D,he,Le,Re,Ue,Ae);A.generateMipmaps=!1}else if(ct){if(Mt){const he=Ge(ge);i.texStorage2D(t.TEXTURE_2D,De,Le,he.width,he.height)}j&&i.texSubImage2D(t.TEXTURE_2D,0,0,0,Re,Ue,ge)}else i.texImage2D(t.TEXTURE_2D,0,Le,Re,Ue,ge);y(A)&&S(le),Te.__version=we.version,A.onUpdate&&A.onUpdate(A)}D.__version=A.version}function et(D,A,X){if(A.image.length!==6)return;const le=de(D,A),ye=A.source;i.bindTexture(t.TEXTURE_CUBE_MAP,D.__webglTexture,t.TEXTURE0+X);const we=n.get(ye);if(ye.version!==we.__version||le===!0){i.activeTexture(t.TEXTURE0+X);const Te=vt.getPrimaries(vt.workingColorSpace),oe=A.colorSpace===_s?null:vt.getPrimaries(A.colorSpace),ge=A.colorSpace===_s||Te===oe?t.NONE:t.BROWSER_DEFAULT_WEBGL;i.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,A.flipY),i.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,A.premultiplyAlpha),i.pixelStorei(t.UNPACK_ALIGNMENT,A.unpackAlignment),i.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,ge);const Re=A.isCompressedTexture||A.image[0].isCompressedTexture,Ue=A.image[0]&&A.image[0].isDataTexture,Le=[];for(let be=0;be<6;be++)!Re&&!Ue?Le[be]=v(A.image[be],!0,s.maxCubemapSize):Le[be]=Ue?A.image[be].image:A.image[be],Le[be]=ue(A,Le[be]);const Ae=Le[0],ot=r.convert(A.format,A.colorSpace),ct=r.convert(A.type),Mt=M(A.internalFormat,ot,ct,A.normalized,A.colorSpace),j=A.isVideoTexture!==!0,De=we.__version===void 0||le===!0,he=ye.dataReady;let $e=C(A,Ae);st(t.TEXTURE_CUBE_MAP,A);let Ne;if(Re){j&&De&&i.texStorage2D(t.TEXTURE_CUBE_MAP,$e,Mt,Ae.width,Ae.height);for(let be=0;be<6;be++){Ne=Le[be].mipmaps;for(let Ye=0;Ye0&&$e++;const be=Ge(Le[0]);i.texStorage2D(t.TEXTURE_CUBE_MAP,$e,Mt,be.width,be.height)}for(let be=0;be<6;be++)if(Ue){j?he&&i.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+be,0,0,0,Le[be].width,Le[be].height,ot,ct,Le[be].data):i.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+be,0,Mt,Le[be].width,Le[be].height,0,ot,ct,Le[be].data);for(let Ye=0;Ye>we),Ae=Math.max(1,A.height>>we);ye===t.TEXTURE_3D||ye===t.TEXTURE_2D_ARRAY?i.texImage3D(ye,we,ge,Le,Ae,A.depth,0,Te,oe,null):i.texImage2D(ye,we,ge,Le,Ae,0,Te,oe,null)}i.bindFramebuffer(t.FRAMEBUFFER,D),Ee(A)?o.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,le,ye,Ue.__webglTexture,0,fe(A)):(ye===t.TEXTURE_2D||ye>=t.TEXTURE_CUBE_MAP_POSITIVE_X&&ye<=t.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&t.framebufferTexture2D(t.FRAMEBUFFER,le,ye,Ue.__webglTexture,we),i.bindFramebuffer(t.FRAMEBUFFER,null)}function V(D,A,X){if(t.bindRenderbuffer(t.RENDERBUFFER,D),A.depthBuffer){const le=A.depthTexture,ye=le&&le.isDepthTexture?le.type:null,we=k(A.stencilBuffer,ye),Te=A.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT;Ee(A)?o.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,fe(A),we,A.width,A.height):X?t.renderbufferStorageMultisample(t.RENDERBUFFER,fe(A),we,A.width,A.height):t.renderbufferStorage(t.RENDERBUFFER,we,A.width,A.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,Te,t.RENDERBUFFER,D)}else{const le=A.textures;for(let ye=0;ye{delete A.__boundDepthTexture,delete A.__depthDisposeCallback,le.removeEventListener("dispose",ye)};le.addEventListener("dispose",ye),A.__depthDisposeCallback=ye}A.__boundDepthTexture=le}if(D.depthTexture&&!A.__autoAllocateDepthBuffer)if(X)for(let le=0;le<6;le++)H(A.__webglFramebuffer[le],D,le);else{const le=D.texture.mipmaps;le&&le.length>0?H(A.__webglFramebuffer[0],D,0):H(A.__webglFramebuffer,D,0)}else if(X){A.__webglDepthbuffer=[];for(let le=0;le<6;le++)if(i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer[le]),A.__webglDepthbuffer[le]===void 0)A.__webglDepthbuffer[le]=t.createRenderbuffer(),V(A.__webglDepthbuffer[le],D,!1);else{const ye=D.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,we=A.__webglDepthbuffer[le];t.bindRenderbuffer(t.RENDERBUFFER,we),t.framebufferRenderbuffer(t.FRAMEBUFFER,ye,t.RENDERBUFFER,we)}}else{const le=D.texture.mipmaps;if(le&&le.length>0?i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer[0]):i.bindFramebuffer(t.FRAMEBUFFER,A.__webglFramebuffer),A.__webglDepthbuffer===void 0)A.__webglDepthbuffer=t.createRenderbuffer(),V(A.__webglDepthbuffer,D,!1);else{const ye=D.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,we=A.__webglDepthbuffer;t.bindRenderbuffer(t.RENDERBUFFER,we),t.framebufferRenderbuffer(t.FRAMEBUFFER,ye,t.RENDERBUFFER,we)}}i.bindFramebuffer(t.FRAMEBUFFER,null)}function ce(D,A,X){const le=n.get(D);A!==void 0&&Ze(le.__webglFramebuffer,D,D.texture,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,0),X!==void 0&&Q(D)}function se(D){const A=D.texture,X=n.get(D),le=n.get(A);D.addEventListener("dispose",x);const ye=D.textures,we=D.isWebGLCubeRenderTarget===!0,Te=ye.length>1;if(Te||(le.__webglTexture===void 0&&(le.__webglTexture=t.createTexture()),le.__version=A.version,l.memory.textures++),we){X.__webglFramebuffer=[];for(let oe=0;oe<6;oe++)if(A.mipmaps&&A.mipmaps.length>0){X.__webglFramebuffer[oe]=[];for(let ge=0;ge0){X.__webglFramebuffer=[];for(let oe=0;oe0&&Ee(D)===!1){X.__webglMultisampledFramebuffer=t.createFramebuffer(),X.__webglColorRenderbuffer=[],i.bindFramebuffer(t.FRAMEBUFFER,X.__webglMultisampledFramebuffer);for(let oe=0;oe0)for(let ge=0;ge0)for(let ge=0;ge0){if(Ee(D)===!1){const A=D.textures,X=D.width,le=D.height;let ye=t.COLOR_BUFFER_BIT;const we=D.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,Te=n.get(D),oe=A.length>1;if(oe)for(let Re=0;Re0?i.bindFramebuffer(t.DRAW_FRAMEBUFFER,Te.__webglFramebuffer[0]):i.bindFramebuffer(t.DRAW_FRAMEBUFFER,Te.__webglFramebuffer);for(let Re=0;Re0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&A.__useRenderToTexture!==!1}function Se(D){const A=l.render.frame;h.get(D)!==A&&(h.set(D,A),D.update())}function ue(D,A){const X=D.colorSpace,le=D.format,ye=D.type;return D.isCompressedTexture===!0||D.isVideoTexture===!0||X!==Il&&X!==_s&&(vt.getTransfer(X)===At?(le!==Hi||ye!==Bi)&&tt("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):bt("WebGLTextures: Unsupported texture color space:",X)),A}function Ge(D){return typeof HTMLImageElement<"u"&&D instanceof HTMLImageElement?(c.width=D.naturalWidth||D.width,c.height=D.naturalHeight||D.height):typeof VideoFrame<"u"&&D instanceof VideoFrame?(c.width=D.displayWidth,c.height=D.displayHeight):(c.width=D.width,c.height=D.height),c}this.allocateTextureUnit=W,this.resetTextureUnits=z,this.getTextureUnits=Y,this.setTextureUnits=$,this.setTexture2D=te,this.setTexture2DArray=me,this.setTexture3D=xe,this.setTextureCube=Ce,this.rebindTextures=ce,this.setupRenderTarget=se,this.updateRenderTargetMipmap=pe,this.updateMultisampleRenderTarget=O,this.setupDepthRenderbuffer=Q,this.setupFrameBufferTexture=Ze,this.useMultisampledRTT=Ee,this.isReversedDepthBuffer=function(){return i.buffers.depth.getReversed()}}function ZE(t,e){function i(n,s=_s){let r;const l=vt.getTransfer(s);if(n===Bi)return t.UNSIGNED_BYTE;if(n===yh)return t.UNSIGNED_SHORT_4_4_4_4;if(n===vh)return t.UNSIGNED_SHORT_5_5_5_1;if(n===by)return t.UNSIGNED_INT_5_9_9_9_REV;if(n===_y)return t.UNSIGNED_INT_10F_11F_11F_REV;if(n===yy)return t.BYTE;if(n===vy)return t.SHORT;if(n===ta)return t.UNSIGNED_SHORT;if(n===gh)return t.INT;if(n===Rn)return t.UNSIGNED_INT;if(n===Gi)return t.FLOAT;if(n===Wi)return t.HALF_FLOAT;if(n===Sy)return t.ALPHA;if(n===wy)return t.RGB;if(n===Hi)return t.RGBA;if(n===is)return t.DEPTH_COMPONENT;if(n===Xs)return t.DEPTH_STENCIL;if(n===bh)return t.RED;if(n===_h)return t.RED_INTEGER;if(n===ir)return t.RG;if(n===Sh)return t.RG_INTEGER;if(n===wh)return t.RGBA_INTEGER;if(n===gl||n===yl||n===vl||n===bl)if(l===At)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===gl)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===yl)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===vl)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===bl)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===gl)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===yl)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===vl)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===bl)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===Yd||n===Jd||n===Zd||n===Qd)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===Yd)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===Jd)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Zd)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Qd)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===ec||n===tc||n===ic||n===nc||n===sc||n===Ll||n===rc)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===ec||n===tc)return l===At?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===ic)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC;if(n===nc)return r.COMPRESSED_R11_EAC;if(n===sc)return r.COMPRESSED_SIGNED_R11_EAC;if(n===Ll)return r.COMPRESSED_RG11_EAC;if(n===rc)return r.COMPRESSED_SIGNED_RG11_EAC}else return null;if(n===oc||n===ac||n===lc||n===uc||n===dc||n===cc||n===hc||n===mc||n===pc||n===fc||n===gc||n===yc||n===vc||n===bc)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===oc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===ac)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===lc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===uc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===dc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===cc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===hc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===mc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===pc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===fc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===gc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===yc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===vc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===bc)return l===At?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===_c||n===Sc||n===wc)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===_c)return l===At?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Sc)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===wc)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Mc||n===xc||n===Dl||n===Pc)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===Mc)return r.COMPRESSED_RED_RGTC1_EXT;if(n===xc)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Dl)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Pc)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===ia?t.UNSIGNED_INT_24_8:t[n]!==void 0?t[n]:null}return{convert:i}}const QE=` void main() { gl_Position = vec4( position, 1.0 ); -}`,EE=` +}`,ek=` uniform sampler2DArray depthColor; uniform float depthWidth; uniform float depthHeight; @@ -4125,7 +4296,7 @@ void main() { } -}`;class CE{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,i){if(this.texture===null){const n=new Vg(e.texture);(e.depthNear!==i.depthNear||e.depthFar!==i.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){const i=e.cameras[0].viewport,n=new Ai({vertexShader:AE,fragmentShader:EE,uniforms:{depthColor:{value:this.texture},depthWidth:{value:i.z},depthHeight:{value:i.w}}});this.mesh=new $t(new Hs(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class kE extends bs{constructor(e,i){super();const n=this;let s=null,r=1,l=null,o="local-floor",d=1,u=null,h=null,c=null,f=null,g=null,y=null;const T=typeof XRWebGLBinding<"u",_=new CE,v={},S=i.getContextAttributes();let w=null,x=null;const k=[],E=[],D=new Ye;let P=null;const M=new Pi;M.viewport=new Tt;const F=new Pi;F.viewport=new Tt;const I=[M,F],C=new RP;let z=null,K=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(de){let ke=k[de];return ke===void 0&&(ke=new cd,k[de]=ke),ke.getTargetRaySpace()},this.getControllerGrip=function(de){let ke=k[de];return ke===void 0&&(ke=new cd,k[de]=ke),ke.getGripSpace()},this.getHand=function(de){let ke=k[de];return ke===void 0&&(ke=new cd,k[de]=ke),ke.getHandSpace()};function $(de){const ke=E.indexOf(de.inputSource);if(ke===-1)return;const Me=k[ke];Me!==void 0&&(Me.update(de.inputSource,de.frame,u||l),Me.dispatchEvent({type:de.type,data:de.inputSource}))}function W(){s.removeEventListener("select",$),s.removeEventListener("selectstart",$),s.removeEventListener("selectend",$),s.removeEventListener("squeeze",$),s.removeEventListener("squeezestart",$),s.removeEventListener("squeezeend",$),s.removeEventListener("end",W),s.removeEventListener("inputsourceschange",q);for(let de=0;de=0&&(E[Xe]=null,k[Xe].disconnect(Me))}for(let ke=0;ke=E.length){E.push(Me),Xe=Ze;break}else if(E[Ze]===null){E[Ze]=Me,Xe=Ze;break}if(Xe===-1)break}const et=k[Xe];et&&et.connect(Me)}}const te=new V,he=new V;function Pe(de,ke,Me){te.setFromMatrixPosition(ke.matrixWorld),he.setFromMatrixPosition(Me.matrixWorld);const Xe=te.distanceTo(he),et=ke.projectionMatrix.elements,Ze=Me.projectionMatrix.elements,U=et[14]/(et[10]-1),G=et[14]/(et[10]+1),Q=(et[9]+1)/et[5],ue=(et[9]-1)/et[5],se=(et[8]-1)/et[0],fe=(Ze[8]+1)/Ze[0],_e=U*se,xe=U*fe,O=Xe/(-se+fe),me=O*-se;if(ke.matrixWorld.decompose(de.position,de.quaternion,de.scale),de.translateX(me),de.translateZ(O),de.matrixWorld.compose(de.position,de.quaternion,de.scale),de.matrixWorldInverse.copy(de.matrixWorld).invert(),et[10]===-1)de.projectionMatrix.copy(ke.projectionMatrix),de.projectionMatrixInverse.copy(ke.projectionMatrixInverse);else{const Ce=U+O,Se=G+O,le=_e-me,Ge=xe+(Xe-me),R=Q*G/Se*Ce,A=ue*G/Se*Ce;de.projectionMatrix.makePerspective(le,Ge,R,A,Ce,Se),de.projectionMatrixInverse.copy(de.projectionMatrix).invert()}}function Ee(de,ke){ke===null?de.matrixWorld.copy(de.matrix):de.matrixWorld.multiplyMatrices(ke.matrixWorld,de.matrix),de.matrixWorldInverse.copy(de.matrixWorld).invert()}this.updateCamera=function(de){if(s===null)return;let ke=de.near,Me=de.far;_.texture!==null&&(_.depthNear>0&&(ke=_.depthNear),_.depthFar>0&&(Me=_.depthFar)),C.near=F.near=M.near=ke,C.far=F.far=M.far=Me,(z!==C.near||K!==C.far)&&(s.updateRenderState({depthNear:C.near,depthFar:C.far}),z=C.near,K=C.far),C.layers.mask=de.layers.mask|6,M.layers.mask=C.layers.mask&-5,F.layers.mask=C.layers.mask&-3;const Xe=de.parent,et=C.cameras;Ee(C,Xe);for(let Ze=0;Ze0&&(_.alphaTest.value=v.alphaTest);const S=e.get(v),w=S.envMap,x=S.envMapRotation;w&&(_.envMap.value=w,_.envMapRotation.value.setFromMatrix4(LE.makeRotationFromEuler(x)).transpose(),w.isCubeTexture&&w.isRenderTargetTexture===!1&&_.envMapRotation.value.premultiply(Zg),_.reflectivity.value=v.reflectivity,_.ior.value=v.ior,_.refractionRatio.value=v.refractionRatio),v.lightMap&&(_.lightMap.value=v.lightMap,_.lightMapIntensity.value=v.lightMapIntensity,i(v.lightMap,_.lightMapTransform)),v.aoMap&&(_.aoMap.value=v.aoMap,_.aoMapIntensity.value=v.aoMapIntensity,i(v.aoMap,_.aoMapTransform))}function l(_,v){_.diffuse.value.copy(v.color),_.opacity.value=v.opacity,v.map&&(_.map.value=v.map,i(v.map,_.mapTransform))}function o(_,v){_.dashSize.value=v.dashSize,_.totalSize.value=v.dashSize+v.gapSize,_.scale.value=v.scale}function d(_,v,S,w){_.diffuse.value.copy(v.color),_.opacity.value=v.opacity,_.size.value=v.size*S,_.scale.value=w*.5,v.map&&(_.map.value=v.map,i(v.map,_.uvTransform)),v.alphaMap&&(_.alphaMap.value=v.alphaMap,i(v.alphaMap,_.alphaMapTransform)),v.alphaTest>0&&(_.alphaTest.value=v.alphaTest)}function u(_,v){_.diffuse.value.copy(v.color),_.opacity.value=v.opacity,_.rotation.value=v.rotation,v.map&&(_.map.value=v.map,i(v.map,_.mapTransform)),v.alphaMap&&(_.alphaMap.value=v.alphaMap,i(v.alphaMap,_.alphaMapTransform)),v.alphaTest>0&&(_.alphaTest.value=v.alphaTest)}function h(_,v){_.specular.value.copy(v.specular),_.shininess.value=Math.max(v.shininess,1e-4)}function c(_,v){v.gradientMap&&(_.gradientMap.value=v.gradientMap)}function f(_,v){_.metalness.value=v.metalness,v.metalnessMap&&(_.metalnessMap.value=v.metalnessMap,i(v.metalnessMap,_.metalnessMapTransform)),_.roughness.value=v.roughness,v.roughnessMap&&(_.roughnessMap.value=v.roughnessMap,i(v.roughnessMap,_.roughnessMapTransform)),v.envMap&&(_.envMapIntensity.value=v.envMapIntensity)}function g(_,v,S){_.ior.value=v.ior,v.sheen>0&&(_.sheenColor.value.copy(v.sheenColor).multiplyScalar(v.sheen),_.sheenRoughness.value=v.sheenRoughness,v.sheenColorMap&&(_.sheenColorMap.value=v.sheenColorMap,i(v.sheenColorMap,_.sheenColorMapTransform)),v.sheenRoughnessMap&&(_.sheenRoughnessMap.value=v.sheenRoughnessMap,i(v.sheenRoughnessMap,_.sheenRoughnessMapTransform))),v.clearcoat>0&&(_.clearcoat.value=v.clearcoat,_.clearcoatRoughness.value=v.clearcoatRoughness,v.clearcoatMap&&(_.clearcoatMap.value=v.clearcoatMap,i(v.clearcoatMap,_.clearcoatMapTransform)),v.clearcoatRoughnessMap&&(_.clearcoatRoughnessMap.value=v.clearcoatRoughnessMap,i(v.clearcoatRoughnessMap,_.clearcoatRoughnessMapTransform)),v.clearcoatNormalMap&&(_.clearcoatNormalMap.value=v.clearcoatNormalMap,i(v.clearcoatNormalMap,_.clearcoatNormalMapTransform),_.clearcoatNormalScale.value.copy(v.clearcoatNormalScale),v.side===Ti&&_.clearcoatNormalScale.value.negate())),v.dispersion>0&&(_.dispersion.value=v.dispersion),v.iridescence>0&&(_.iridescence.value=v.iridescence,_.iridescenceIOR.value=v.iridescenceIOR,_.iridescenceThicknessMinimum.value=v.iridescenceThicknessRange[0],_.iridescenceThicknessMaximum.value=v.iridescenceThicknessRange[1],v.iridescenceMap&&(_.iridescenceMap.value=v.iridescenceMap,i(v.iridescenceMap,_.iridescenceMapTransform)),v.iridescenceThicknessMap&&(_.iridescenceThicknessMap.value=v.iridescenceThicknessMap,i(v.iridescenceThicknessMap,_.iridescenceThicknessMapTransform))),v.transmission>0&&(_.transmission.value=v.transmission,_.transmissionSamplerMap.value=S.texture,_.transmissionSamplerSize.value.set(S.width,S.height),v.transmissionMap&&(_.transmissionMap.value=v.transmissionMap,i(v.transmissionMap,_.transmissionMapTransform)),_.thickness.value=v.thickness,v.thicknessMap&&(_.thicknessMap.value=v.thicknessMap,i(v.thicknessMap,_.thicknessMapTransform)),_.attenuationDistance.value=v.attenuationDistance,_.attenuationColor.value.copy(v.attenuationColor)),v.anisotropy>0&&(_.anisotropyVector.value.set(v.anisotropy*Math.cos(v.anisotropyRotation),v.anisotropy*Math.sin(v.anisotropyRotation)),v.anisotropyMap&&(_.anisotropyMap.value=v.anisotropyMap,i(v.anisotropyMap,_.anisotropyMapTransform))),_.specularIntensity.value=v.specularIntensity,_.specularColor.value.copy(v.specularColor),v.specularColorMap&&(_.specularColorMap.value=v.specularColorMap,i(v.specularColorMap,_.specularColorMapTransform)),v.specularIntensityMap&&(_.specularIntensityMap.value=v.specularIntensityMap,i(v.specularIntensityMap,_.specularIntensityMapTransform))}function y(_,v){v.matcap&&(_.matcap.value=v.matcap)}function T(_,v){const S=e.get(v).light;_.referencePosition.value.setFromMatrixPosition(S.matrixWorld),_.nearDistance.value=S.shadow.camera.near,_.farDistance.value=S.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function DE(t,e,i,n){let s={},r={},l=[];const o=t.getParameter(t.MAX_UNIFORM_BUFFER_BINDINGS);function d(S,w){const x=w.program;n.uniformBlockBinding(S,x)}function u(S,w){let x=s[S.id];x===void 0&&(y(S),x=h(S),s[S.id]=x,S.addEventListener("dispose",_));const k=w.program;n.updateUBOMapping(S,k);const E=e.render.frame;r[S.id]!==E&&(f(S),r[S.id]=E)}function h(S){const w=c();S.__bindingPointIndex=w;const x=t.createBuffer(),k=S.__size,E=S.usage;return t.bindBuffer(t.UNIFORM_BUFFER,x),t.bufferData(t.UNIFORM_BUFFER,k,E),t.bindBuffer(t.UNIFORM_BUFFER,null),t.bindBufferBase(t.UNIFORM_BUFFER,w,x),x}function c(){for(let S=0;S0&&(x+=k-E),S.__size=x,S.__cache={},this}function T(S){const w={boundary:0,storage:0};return typeof S=="number"||typeof S=="boolean"?(w.boundary=4,w.storage=4):S.isVector2?(w.boundary=8,w.storage=8):S.isVector3||S.isColor?(w.boundary=16,w.storage=12):S.isVector4?(w.boundary=16,w.storage=16):S.isMatrix3?(w.boundary=48,w.storage=48):S.isMatrix4?(w.boundary=64,w.storage=64):S.isTexture?tt("WebGLRenderer: Texture samplers can not be part of an uniforms group."):ArrayBuffer.isView(S)?(w.boundary=16,w.storage=S.byteLength):tt("WebGLRenderer: Unsupported uniform value type.",S),w}function _(S){const w=S.target;w.removeEventListener("dispose",_);const x=l.indexOf(w.__bindingPointIndex);l.splice(x,1),t.deleteBuffer(s[w.id]),delete s[w.id],delete r[w.id]}function v(){for(const S in s)t.deleteBuffer(s[S]);l=[],s={},r={}}return{bind:d,update:u,dispose:v}}const IE=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let hn=null;function FE(){return hn===null&&(hn=new lP(IE,16,16,js,xn),hn.name="DFG_LUT",hn.minFilter=vi,hn.magFilter=vi,hn.wrapS=zn,hn.wrapT=zn,hn.generateMipmaps=!1,hn.needsUpdate=!0),hn}class Qg{constructor(e={}){const{canvas:i=PM(),context:n=null,depth:s=!0,stencil:r=!1,alpha:l=!1,antialias:o=!1,premultipliedAlpha:d=!0,preserveDrawingBuffer:u=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:c=!1,reversedDepthBuffer:f=!1,outputBufferType:g=Oi}=e;this.isWebGLRenderer=!0;let y;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");y=n.getContextAttributes().alpha}else y=l;const T=g,_=new Set([Oc,Nc,Fc]),v=new Set([Oi,Pn,Oo,Uo,Dc,Ic]),S=new Uint32Array(4),w=new Int32Array(4),x=new V;let k=null,E=null;const D=[],P=[];let M=null;this.domElement=i,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=en,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const F=this;let I=!1,C=null;this._outputColorSpace=ki;let z=0,K=0,$=null,W=-1,q=null;const te=new Tt,he=new Tt;let Pe=null;const Ee=new ze(0);let Ie=0,qe=i.width,mt=i.height,st=1,de=null,ke=null;const Me=new Tt(0,0,qe,mt),Xe=new Tt(0,0,qe,mt);let et=!1;const Ze=new Wc;let U=!1,G=!1;const Q=new At,ue=new V,se=new Tt,fe={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let _e=!1;function xe(){return $===null?st:1}let O=n;function me(L,Y){return i.getContext(L,Y)}try{const L={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:d,preserveDrawingBuffer:u,powerPreference:h,failIfMajorPerformanceCaveat:c};if("setAttribute"in i&&i.setAttribute("data-engine",`three.js r${kc}`),i.addEventListener("webglcontextlost",be,!1),i.addEventListener("webglcontextrestored",Ke,!1),i.addEventListener("webglcontextcreationerror",ct,!1),O===null){const Y="webgl2";if(O=me(Y,L),O===null)throw me(Y)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(L){throw vt("WebGLRenderer: "+L.message),L}let Ce,Se,le,Ge,R,A,X,ae,ge,we,Te,re,pe,Le,Ue,Re,Ae,ot,ft,St,j,De,ce;function $e(){Ce=new F2(O),Ce.init(),j=new TE(O,Ce),Se=new A2(O,Ce,e,j),le=new PE(O,Ce),Se.reversedDepthBuffer&&f&&le.buffers.depth.setReversed(!0),Ge=new U2(O),R=new uE,A=new xE(O,Ce,le,R,Se,j,Ge),X=new I2(F),ae=new $P(O),De=new x2(O,ae),ge=new N2(O,ae,Ge,De),we=new V2(O,ge,ae,De,Ge),ot=new B2(O,Se,A),Ue=new E2(R),Te=new dE(F,X,Ce,Se,De,Ue),re=new RE(F,R),pe=new hE,Le=new vE(Ce),Ae=new P2(F,X,le,we,y,d),Re=new ME(F,we,Se),ce=new DE(O,Ge,Se,le),ft=new T2(O,Ce,Ge),St=new O2(O,Ce,Ge),Ge.programs=Te.programs,F.capabilities=Se,F.extensions=Ce,F.properties=R,F.renderLists=pe,F.shadowMap=Re,F.state=le,F.info=Ge}$e(),T!==Oi&&(M=new $2(T,i.width,i.height,s,r));const Fe=new kE(F,O);this.xr=Fe,this.getContext=function(){return O},this.getContextAttributes=function(){return O.getContextAttributes()},this.forceContextLoss=function(){const L=Ce.get("WEBGL_lose_context");L&&L.loseContext()},this.forceContextRestore=function(){const L=Ce.get("WEBGL_lose_context");L&&L.restoreContext()},this.getPixelRatio=function(){return st},this.setPixelRatio=function(L){L!==void 0&&(st=L,this.setSize(qe,mt,!1))},this.getSize=function(L){return L.set(qe,mt)},this.setSize=function(L,Y,ne=!0){if(Fe.isPresenting){tt("WebGLRenderer: Can't change size while VR device is presenting.");return}qe=L,mt=Y,i.width=Math.floor(L*st),i.height=Math.floor(Y*st),ne===!0&&(i.style.width=L+"px",i.style.height=Y+"px"),M!==null&&M.setSize(i.width,i.height),this.setViewport(0,0,L,Y)},this.getDrawingBufferSize=function(L){return L.set(qe*st,mt*st).floor()},this.setDrawingBufferSize=function(L,Y,ne){qe=L,mt=Y,st=ne,i.width=Math.floor(L*ne),i.height=Math.floor(Y*ne),this.setViewport(0,0,L,Y)},this.setEffects=function(L){if(T===Oi){vt("THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.");return}if(L){for(let Y=0;Y{function Ve(){if(Z.forEach(function(We){R.get(We).currentProgram.isReady()&&Z.delete(We)}),Z.size===0){ee(L);return}setTimeout(Ve,10)}Ce.get("KHR_parallel_shader_compile")!==null?Ve():setTimeout(Ve,10)})};let Vl=null;function hy(L){Vl&&Vl(L)}function dh(){ws.stop()}function uh(){ws.start()}const ws=new Wg;ws.setAnimationLoop(hy),typeof self<"u"&&ws.setContext(self),this.setAnimationLoop=function(L){Vl=L,Fe.setAnimationLoop(L),L===null?ws.stop():ws.start()},Fe.addEventListener("sessionstart",dh),Fe.addEventListener("sessionend",uh),this.render=function(L,Y){if(Y!==void 0&&Y.isCamera!==!0){vt("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(I===!0)return;C!==null&&C.renderStart(L,Y);const ne=Fe.enabled===!0&&Fe.isPresenting===!0,Z=M!==null&&($===null||ne)&&M.begin(F,$);if(L.matrixWorldAutoUpdate===!0&&L.updateMatrixWorld(),Y.parent===null&&Y.matrixWorldAutoUpdate===!0&&Y.updateMatrixWorld(),Fe.enabled===!0&&Fe.isPresenting===!0&&(M===null||M.isCompositing()===!1)&&(Fe.cameraAutoUpdate===!0&&Fe.updateCamera(Y),Y=Fe.getCamera()),L.isScene===!0&&L.onBeforeRender(F,L,Y,$),E=Le.get(L,P.length),E.init(Y),E.state.textureUnits=A.getTextureUnits(),P.push(E),Q.multiplyMatrices(Y.projectionMatrix,Y.matrixWorldInverse),Ze.setFromProjectionMatrix(Q,Sn,Y.reversedDepth),G=this.localClippingEnabled,U=Ue.init(this.clippingPlanes,G),k=pe.get(L,D.length),k.init(),D.push(k),Fe.enabled===!0&&Fe.isPresenting===!0){const We=F.xr.getDepthSensingMesh();We!==null&&zl(We,Y,-1/0,F.sortObjects)}zl(L,Y,0,F.sortObjects),k.finish(),F.sortObjects===!0&&k.sort(de,ke),_e=Fe.enabled===!1||Fe.isPresenting===!1||Fe.hasDepthSensing()===!1,_e&&Ae.addToRenderList(k,L),this.info.render.frame++,U===!0&&Ue.beginShadows();const ee=E.state.shadowsArray;if(Re.render(ee,L,Y),U===!0&&Ue.endShadows(),this.info.autoReset===!0&&this.info.reset(),(Z&&M.hasRenderPass())===!1){const We=k.opaque,Be=k.transmissive;if(E.setupLights(),Y.isArrayCamera){const je=Y.cameras;if(Be.length>0)for(let Je=0,ht=je.length;Je0&&hh(We,Be,L,Y),_e&&Ae.render(L),ch(k,L,Y)}$!==null&&K===0&&(A.updateMultisampleRenderTarget($),A.updateRenderTargetMipmap($)),Z&&M.end(F),L.isScene===!0&&L.onAfterRender(F,L,Y),De.resetDefaultState(),W=-1,q=null,P.pop(),P.length>0?(E=P[P.length-1],A.setTextureUnits(E.state.textureUnits),U===!0&&Ue.setGlobalState(F.clippingPlanes,E.state.camera)):E=null,D.pop(),D.length>0?k=D[D.length-1]:k=null,C!==null&&C.renderEnd()};function zl(L,Y,ne,Z){if(L.visible===!1)return;if(L.layers.test(Y.layers)){if(L.isGroup)ne=L.renderOrder;else if(L.isLOD)L.autoUpdate===!0&&L.update(Y);else if(L.isLightProbeGrid)E.pushLightProbeGrid(L);else if(L.isLight)E.pushLight(L),L.castShadow&&E.pushShadow(L);else if(L.isSprite){if(!L.frustumCulled||Ze.intersectsSprite(L)){Z&&se.setFromMatrixPosition(L.matrixWorld).applyMatrix4(Q);const We=we.update(L),Be=L.material;Be.visible&&k.push(L,We,Be,ne,se.z,null)}}else if((L.isMesh||L.isLine||L.isPoints)&&(!L.frustumCulled||Ze.intersectsObject(L))){const We=we.update(L),Be=L.material;if(Z&&(L.boundingSphere!==void 0?(L.boundingSphere===null&&L.computeBoundingSphere(),se.copy(L.boundingSphere.center)):(We.boundingSphere===null&&We.computeBoundingSphere(),se.copy(We.boundingSphere.center)),se.applyMatrix4(L.matrixWorld).applyMatrix4(Q)),Array.isArray(Be)){const je=We.groups;for(let Je=0,ht=je.length;Je0&&Ko(ee,Y,ne),Ve.length>0&&Ko(Ve,Y,ne),We.length>0&&Ko(We,Y,ne),le.buffers.depth.setTest(!0),le.buffers.depth.setMask(!0),le.buffers.color.setMask(!0),le.setPolygonOffset(!1)}function hh(L,Y,ne,Z){if((ne.isScene===!0?ne.overrideMaterial:null)!==null)return;if(E.state.transmissionRenderTarget[Z.id]===void 0){const Qe=Ce.has("EXT_color_buffer_half_float")||Ce.has("EXT_color_buffer_float");E.state.transmissionRenderTarget[Z.id]=new tn(1,1,{generateMipmaps:!0,type:Qe?xn:Oi,minFilter:Bs,samples:Math.max(4,Se.samples),stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:bt.workingColorSpace})}const Ve=E.state.transmissionRenderTarget[Z.id],We=Z.viewport||te;Ve.setSize(We.z*F.transmissionResolutionScale,We.w*F.transmissionResolutionScale);const Be=F.getRenderTarget(),je=F.getActiveCubeFace(),Je=F.getActiveMipmapLevel();F.setRenderTarget(Ve),F.getClearColor(Ee),Ie=F.getClearAlpha(),Ie<1&&F.setClearColor(16777215,.5),F.clear(),_e&&Ae.render(ne);const ht=F.toneMapping;F.toneMapping=en;const gt=Z.viewport;if(Z.viewport!==void 0&&(Z.viewport=void 0),E.setupLightsView(Z),U===!0&&Ue.setGlobalState(F.clippingPlanes,Z),Ko(L,ne,Z),A.updateMultisampleRenderTarget(Ve),A.updateRenderTargetMipmap(Ve),Ce.has("WEBGL_multisampled_render_to_texture")===!1){let Qe=!1;for(let Rt=0,qt=Y.length;Rt0,Z.currentProgram=gt,Z.uniformsList=null,gt}function mh(L){if(L.uniformsList===null){const Y=L.currentProgram.getUniforms();L.uniformsList=el.seqWithValue(Y.seq,L.uniforms)}return L.uniformsList}function ph(L,Y){const ne=R.get(L);ne.outputColorSpace=Y.outputColorSpace,ne.batching=Y.batching,ne.batchingColor=Y.batchingColor,ne.instancing=Y.instancing,ne.instancingColor=Y.instancingColor,ne.instancingMorph=Y.instancingMorph,ne.skinning=Y.skinning,ne.morphTargets=Y.morphTargets,ne.morphNormals=Y.morphNormals,ne.morphColors=Y.morphColors,ne.morphTargetsCount=Y.morphTargetsCount,ne.numClippingPlanes=Y.numClippingPlanes,ne.numIntersection=Y.numClipIntersection,ne.vertexAlphas=Y.vertexAlphas,ne.vertexTangents=Y.vertexTangents,ne.toneMapping=Y.toneMapping}function fy(L,Y){if(L.length===0)return null;if(L.length===1)return L[0].texture!==null?L[0]:null;x.setFromMatrixPosition(Y.matrixWorld);for(let ne=0,Z=L.length;ne0),Qe=!!ne.morphAttributes.position,Rt=!!ne.morphAttributes.normal,qt=!!ne.morphAttributes.color;let Ht=en;Z.toneMapped&&($===null||$.isXRRenderTarget===!0)&&(Ht=F.toneMapping);const Nt=ne.morphAttributes.position||ne.morphAttributes.normal||ne.morphAttributes.color,hi=Nt!==void 0?Nt.length:0,He=R.get(Z),Ri=E.state.lights;if(U===!0&&(G===!0||L!==q)){const Bt=L===q&&Z.id===W;Ue.setState(Z,L,Bt)}let _t=!1;Z.version===He.__version?(He.needsLights&&He.lightsStateVersion!==Ri.state.version||He.outputColorSpace!==Be||ee.isBatchedMesh&&He.batching===!1||!ee.isBatchedMesh&&He.batching===!0||ee.isBatchedMesh&&He.batchingColor===!0&&ee.colorTexture===null||ee.isBatchedMesh&&He.batchingColor===!1&&ee.colorTexture!==null||ee.isInstancedMesh&&He.instancing===!1||!ee.isInstancedMesh&&He.instancing===!0||ee.isSkinnedMesh&&He.skinning===!1||!ee.isSkinnedMesh&&He.skinning===!0||ee.isInstancedMesh&&He.instancingColor===!0&&ee.instanceColor===null||ee.isInstancedMesh&&He.instancingColor===!1&&ee.instanceColor!==null||ee.isInstancedMesh&&He.instancingMorph===!0&&ee.morphTexture===null||ee.isInstancedMesh&&He.instancingMorph===!1&&ee.morphTexture!==null||He.envMap!==Je||Z.fog===!0&&He.fog!==Ve||He.numClippingPlanes!==void 0&&(He.numClippingPlanes!==Ue.numPlanes||He.numIntersection!==Ue.numIntersection)||He.vertexAlphas!==ht||He.vertexTangents!==gt||He.morphTargets!==Qe||He.morphNormals!==Rt||He.morphColors!==qt||He.toneMapping!==Ht||He.morphTargetsCount!==hi||!!He.lightProbeGrid!=E.state.lightProbeGridArray.length>0)&&(_t=!0):(_t=!0,He.__version=Z.version);let Vi=He.currentProgram;_t===!0&&(Vi=Yo(Z,Y,ee),C&&Z.isNodeMaterial&&C.onUpdateProgram(Z,Vi,He));let an=!1,Zn=!1,Ks=!1;const Ot=Vi.getUniforms(),jt=He.uniforms;if(le.useProgram(Vi.program)&&(an=!0,Zn=!0,Ks=!0),Z.id!==W&&(W=Z.id,Zn=!0),He.needsLights){const Bt=fy(E.state.lightProbeGridArray,ee);He.lightProbeGrid!==Bt&&(He.lightProbeGrid=Bt,Zn=!0)}if(an||q!==L){le.buffers.depth.getReversed()&&L.reversedDepth!==!0&&(L._reversedDepth=!0,L.updateProjectionMatrix()),Ot.setValue(O,"projectionMatrix",L.projectionMatrix),Ot.setValue(O,"viewMatrix",L.matrixWorldInverse);const es=Ot.map.cameraPosition;es!==void 0&&es.setValue(O,ue.setFromMatrixPosition(L.matrixWorld)),Se.logarithmicDepthBuffer&&Ot.setValue(O,"logDepthBufFC",2/(Math.log(L.far+1)/Math.LN2)),(Z.isMeshPhongMaterial||Z.isMeshToonMaterial||Z.isMeshLambertMaterial||Z.isMeshBasicMaterial||Z.isMeshStandardMaterial||Z.isShaderMaterial)&&Ot.setValue(O,"isOrthographic",L.isOrthographicCamera===!0),q!==L&&(q=L,Zn=!0,Ks=!0)}if(He.needsLights&&(Ri.state.directionalShadowMap.length>0&&Ot.setValue(O,"directionalShadowMap",Ri.state.directionalShadowMap,A),Ri.state.spotShadowMap.length>0&&Ot.setValue(O,"spotShadowMap",Ri.state.spotShadowMap,A),Ri.state.pointShadowMap.length>0&&Ot.setValue(O,"pointShadowMap",Ri.state.pointShadowMap,A)),ee.isSkinnedMesh){Ot.setOptional(O,ee,"bindMatrix"),Ot.setOptional(O,ee,"bindMatrixInverse");const Bt=ee.skeleton;Bt&&(Bt.boneTexture===null&&Bt.computeBoneTexture(),Ot.setValue(O,"boneTexture",Bt.boneTexture,A))}ee.isBatchedMesh&&(Ot.setOptional(O,ee,"batchingTexture"),Ot.setValue(O,"batchingTexture",ee._matricesTexture,A),Ot.setOptional(O,ee,"batchingIdTexture"),Ot.setValue(O,"batchingIdTexture",ee._indirectTexture,A),Ot.setOptional(O,ee,"batchingColorTexture"),ee._colorsTexture!==null&&Ot.setValue(O,"batchingColorTexture",ee._colorsTexture,A));const Qn=ne.morphAttributes;if((Qn.position!==void 0||Qn.normal!==void 0||Qn.color!==void 0)&&ot.update(ee,ne,Vi),(Zn||He.receiveShadow!==ee.receiveShadow)&&(He.receiveShadow=ee.receiveShadow,Ot.setValue(O,"receiveShadow",ee.receiveShadow)),(Z.isMeshStandardMaterial||Z.isMeshLambertMaterial||Z.isMeshPhongMaterial)&&Z.envMap===null&&Y.environment!==null&&(jt.envMapIntensity.value=Y.environmentIntensity),jt.dfgLUT!==void 0&&(jt.dfgLUT.value=FE()),Zn){if(Ot.setValue(O,"toneMappingExposure",F.toneMappingExposure),He.needsLights&&py(jt,Ks),Ve&&Z.fog===!0&&re.refreshFogUniforms(jt,Ve),re.refreshMaterialUniforms(jt,Z,st,mt,E.state.transmissionRenderTarget[L.id]),He.needsLights&&He.lightProbeGrid){const Bt=He.lightProbeGrid;jt.probesSH.value=Bt.texture,jt.probesMin.value.copy(Bt.boundingBox.min),jt.probesMax.value.copy(Bt.boundingBox.max),jt.probesResolution.value.copy(Bt.resolution)}el.upload(O,mh(He),jt,A)}if(Z.isShaderMaterial&&Z.uniformsNeedUpdate===!0&&(el.upload(O,mh(He),jt,A),Z.uniformsNeedUpdate=!1),Z.isSpriteMaterial&&Ot.setValue(O,"center",ee.center),Ot.setValue(O,"modelViewMatrix",ee.modelViewMatrix),Ot.setValue(O,"normalMatrix",ee.normalMatrix),Ot.setValue(O,"modelMatrix",ee.matrixWorld),Z.uniformsGroups!==void 0){const Bt=Z.uniformsGroups;for(let es=0,Ys=Bt.length;es0&&A.useMultisampledRTT(L)===!1?Z=R.get(L).__webglMultisampledFramebuffer:Array.isArray(Je)?Z=Je[ne]:Z=Je,te.copy(L.viewport),he.copy(L.scissor),Pe=L.scissorTest}else te.copy(Me).multiplyScalar(st).floor(),he.copy(Xe).multiplyScalar(st).floor(),Pe=et;if(ne!==0&&(Z=yy),le.bindFramebuffer(O.FRAMEBUFFER,Z)&&le.drawBuffers(L,Z),le.viewport(te),le.scissor(he),le.setScissorTest(Pe),ee){const Be=R.get(L.texture);O.framebufferTexture2D(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,O.TEXTURE_CUBE_MAP_POSITIVE_X+Y,Be.__webglTexture,ne)}else if(Ve){const Be=Y;for(let je=0;je1&&O.readBuffer(O.COLOR_ATTACHMENT0+Be),!Se.textureFormatReadable(ht)){vt("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!Se.textureTypeReadable(gt)){vt("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}Y>=0&&Y<=L.width-Z&&ne>=0&&ne<=L.height-ee&&O.readPixels(Y,ne,Z,ee,j.convert(ht),j.convert(gt),Ve)}finally{const Je=$!==null?R.get($).__webglFramebuffer:null;le.bindFramebuffer(O.FRAMEBUFFER,Je)}}},this.readRenderTargetPixelsAsync=async function(L,Y,ne,Z,ee,Ve,We,Be=0){if(!(L&&L.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let je=R.get(L).__webglFramebuffer;if(L.isWebGLCubeRenderTarget&&We!==void 0&&(je=je[We]),je)if(Y>=0&&Y<=L.width-Z&&ne>=0&&ne<=L.height-ee){le.bindFramebuffer(O.FRAMEBUFFER,je);const Je=L.textures[Be],ht=Je.format,gt=Je.type;if(L.textures.length>1&&O.readBuffer(O.COLOR_ATTACHMENT0+Be),!Se.textureFormatReadable(ht))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!Se.textureTypeReadable(gt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const Qe=O.createBuffer();O.bindBuffer(O.PIXEL_PACK_BUFFER,Qe),O.bufferData(O.PIXEL_PACK_BUFFER,Ve.byteLength,O.STREAM_READ),O.readPixels(Y,ne,Z,ee,j.convert(ht),j.convert(gt),0);const Rt=$!==null?R.get($).__webglFramebuffer:null;le.bindFramebuffer(O.FRAMEBUFFER,Rt);const qt=O.fenceSync(O.SYNC_GPU_COMMANDS_COMPLETE,0);return O.flush(),await xM(O,qt,4),O.bindBuffer(O.PIXEL_PACK_BUFFER,Qe),O.getBufferSubData(O.PIXEL_PACK_BUFFER,0,Ve),O.deleteBuffer(Qe),O.deleteSync(qt),Ve}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(L,Y=null,ne=0){const Z=Math.pow(2,-ne),ee=Math.floor(L.image.width*Z),Ve=Math.floor(L.image.height*Z),We=Y!==null?Y.x:0,Be=Y!==null?Y.y:0;A.setTexture2D(L,0),O.copyTexSubImage2D(O.TEXTURE_2D,ne,0,0,We,Be,ee,Ve),le.unbindTexture()};const vy=O.createFramebuffer(),by=O.createFramebuffer();this.copyTextureToTexture=function(L,Y,ne=null,Z=null,ee=0,Ve=0){let We,Be,je,Je,ht,gt,Qe,Rt,qt;const Ht=L.isCompressedTexture?L.mipmaps[Ve]:L.image;if(ne!==null)We=ne.max.x-ne.min.x,Be=ne.max.y-ne.min.y,je=ne.isBox3?ne.max.z-ne.min.z:1,Je=ne.min.x,ht=ne.min.y,gt=ne.isBox3?ne.min.z:0;else{const jt=Math.pow(2,-ee);We=Math.floor(Ht.width*jt),Be=Math.floor(Ht.height*jt),L.isDataArrayTexture?je=Ht.depth:L.isData3DTexture?je=Math.floor(Ht.depth*jt):je=1,Je=0,ht=0,gt=0}Z!==null?(Qe=Z.x,Rt=Z.y,qt=Z.z):(Qe=0,Rt=0,qt=0);const Nt=j.convert(Y.format),hi=j.convert(Y.type);let He;Y.isData3DTexture?(A.setTexture3D(Y,0),He=O.TEXTURE_3D):Y.isDataArrayTexture||Y.isCompressedArrayTexture?(A.setTexture2DArray(Y,0),He=O.TEXTURE_2D_ARRAY):(A.setTexture2D(Y,0),He=O.TEXTURE_2D),le.activeTexture(O.TEXTURE0),le.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,Y.flipY),le.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Y.premultiplyAlpha),le.pixelStorei(O.UNPACK_ALIGNMENT,Y.unpackAlignment);const Ri=le.getParameter(O.UNPACK_ROW_LENGTH),_t=le.getParameter(O.UNPACK_IMAGE_HEIGHT),Vi=le.getParameter(O.UNPACK_SKIP_PIXELS),an=le.getParameter(O.UNPACK_SKIP_ROWS),Zn=le.getParameter(O.UNPACK_SKIP_IMAGES);le.pixelStorei(O.UNPACK_ROW_LENGTH,Ht.width),le.pixelStorei(O.UNPACK_IMAGE_HEIGHT,Ht.height),le.pixelStorei(O.UNPACK_SKIP_PIXELS,Je),le.pixelStorei(O.UNPACK_SKIP_ROWS,ht),le.pixelStorei(O.UNPACK_SKIP_IMAGES,gt);const Ks=L.isDataArrayTexture||L.isData3DTexture,Ot=Y.isDataArrayTexture||Y.isData3DTexture;if(L.isDepthTexture){const jt=R.get(L),Qn=R.get(Y),Bt=R.get(jt.__renderTarget),es=R.get(Qn.__renderTarget);le.bindFramebuffer(O.READ_FRAMEBUFFER,Bt.__webglFramebuffer),le.bindFramebuffer(O.DRAW_FRAMEBUFFER,es.__webglFramebuffer);for(let Ys=0;Ys=0&&(C[Ke]=null,k[Ke].disconnect(Me))}for(let ke=0;ke=C.length){C.push(Me),Ke=Ze;break}else if(C[Ze]===null){C[Ze]=Me,Ke=Ze;break}if(Ke===-1)break}const et=k[Ke];et&&et.connect(Me)}}const te=new B,me=new B;function xe(de,ke,Me){te.setFromMatrixPosition(ke.matrixWorld),me.setFromMatrixPosition(Me.matrixWorld);const Ke=te.distanceTo(me),et=ke.projectionMatrix.elements,Ze=Me.projectionMatrix.elements,V=et[14]/(et[10]-1),H=et[14]/(et[10]+1),Q=(et[9]+1)/et[5],ce=(et[9]-1)/et[5],se=(et[8]-1)/et[0],pe=(Ze[8]+1)/Ze[0],_e=V*se,Pe=V*pe,O=Ke/(-se+pe),fe=O*-se;if(ke.matrixWorld.decompose(de.position,de.quaternion,de.scale),de.translateX(fe),de.translateZ(O),de.matrixWorld.compose(de.position,de.quaternion,de.scale),de.matrixWorldInverse.copy(de.matrixWorld).invert(),et[10]===-1)de.projectionMatrix.copy(ke.projectionMatrix),de.projectionMatrixInverse.copy(ke.projectionMatrixInverse);else{const Ee=V+O,Se=H+O,ue=_e-fe,Ge=Pe+(Ke-fe),D=Q*H/Se*Ee,A=ce*H/Se*Ee;de.projectionMatrix.makePerspective(ue,Ge,D,A,Ee,Se),de.projectionMatrixInverse.copy(de.projectionMatrix).invert()}}function Ce(de,ke){ke===null?de.matrixWorld.copy(de.matrix):de.matrixWorld.multiplyMatrices(ke.matrixWorld,de.matrix),de.matrixWorldInverse.copy(de.matrixWorld).invert()}this.updateCamera=function(de){if(s===null)return;let ke=de.near,Me=de.far;v.texture!==null&&(v.depthNear>0&&(ke=v.depthNear),v.depthFar>0&&(Me=v.depthFar)),E.near=F.near=T.near=ke,E.far=F.far=T.far=Me,(z!==E.near||Y!==E.far)&&(s.updateRenderState({depthNear:E.near,depthFar:E.far}),z=E.near,Y=E.far),E.layers.mask=de.layers.mask|6,T.layers.mask=E.layers.mask&-5,F.layers.mask=E.layers.mask&-3;const Ke=de.parent,et=E.cameras;Ce(E,Ke);for(let Ze=0;Ze0&&(v.alphaTest.value=y.alphaTest);const S=e.get(y),P=S.envMap,M=S.envMapRotation;P&&(v.envMap.value=P,v.envMapRotation.value.setFromMatrix4(nk.makeRotationFromEuler(M)).transpose(),P.isCubeTexture&&P.isRenderTargetTexture===!1&&v.envMapRotation.value.premultiply(Ky),v.reflectivity.value=y.reflectivity,v.ior.value=y.ior,v.refractionRatio.value=y.refractionRatio),y.lightMap&&(v.lightMap.value=y.lightMap,v.lightMapIntensity.value=y.lightMapIntensity,i(y.lightMap,v.lightMapTransform)),y.aoMap&&(v.aoMap.value=y.aoMap,v.aoMapIntensity.value=y.aoMapIntensity,i(y.aoMap,v.aoMapTransform))}function l(v,y){v.diffuse.value.copy(y.color),v.opacity.value=y.opacity,y.map&&(v.map.value=y.map,i(y.map,v.mapTransform))}function o(v,y){v.dashSize.value=y.dashSize,v.totalSize.value=y.dashSize+y.gapSize,v.scale.value=y.scale}function u(v,y,S,P){v.diffuse.value.copy(y.color),v.opacity.value=y.opacity,v.size.value=y.size*S,v.scale.value=P*.5,y.map&&(v.map.value=y.map,i(y.map,v.uvTransform)),y.alphaMap&&(v.alphaMap.value=y.alphaMap,i(y.alphaMap,v.alphaMapTransform)),y.alphaTest>0&&(v.alphaTest.value=y.alphaTest)}function c(v,y){v.diffuse.value.copy(y.color),v.opacity.value=y.opacity,v.rotation.value=y.rotation,y.map&&(v.map.value=y.map,i(y.map,v.mapTransform)),y.alphaMap&&(v.alphaMap.value=y.alphaMap,i(y.alphaMap,v.alphaMapTransform)),y.alphaTest>0&&(v.alphaTest.value=y.alphaTest)}function h(v,y){v.specular.value.copy(y.specular),v.shininess.value=Math.max(y.shininess,1e-4)}function d(v,y){y.gradientMap&&(v.gradientMap.value=y.gradientMap)}function m(v,y){v.metalness.value=y.metalness,y.metalnessMap&&(v.metalnessMap.value=y.metalnessMap,i(y.metalnessMap,v.metalnessMapTransform)),v.roughness.value=y.roughness,y.roughnessMap&&(v.roughnessMap.value=y.roughnessMap,i(y.roughnessMap,v.roughnessMapTransform)),y.envMap&&(v.envMapIntensity.value=y.envMapIntensity)}function g(v,y,S){v.ior.value=y.ior,y.sheen>0&&(v.sheenColor.value.copy(y.sheenColor).multiplyScalar(y.sheen),v.sheenRoughness.value=y.sheenRoughness,y.sheenColorMap&&(v.sheenColorMap.value=y.sheenColorMap,i(y.sheenColorMap,v.sheenColorMapTransform)),y.sheenRoughnessMap&&(v.sheenRoughnessMap.value=y.sheenRoughnessMap,i(y.sheenRoughnessMap,v.sheenRoughnessMapTransform))),y.clearcoat>0&&(v.clearcoat.value=y.clearcoat,v.clearcoatRoughness.value=y.clearcoatRoughness,y.clearcoatMap&&(v.clearcoatMap.value=y.clearcoatMap,i(y.clearcoatMap,v.clearcoatMapTransform)),y.clearcoatRoughnessMap&&(v.clearcoatRoughnessMap.value=y.clearcoatRoughnessMap,i(y.clearcoatRoughnessMap,v.clearcoatRoughnessMapTransform)),y.clearcoatNormalMap&&(v.clearcoatNormalMap.value=y.clearcoatNormalMap,i(y.clearcoatNormalMap,v.clearcoatNormalMapTransform),v.clearcoatNormalScale.value.copy(y.clearcoatNormalScale),y.side===Ei&&v.clearcoatNormalScale.value.negate())),y.dispersion>0&&(v.dispersion.value=y.dispersion),y.iridescence>0&&(v.iridescence.value=y.iridescence,v.iridescenceIOR.value=y.iridescenceIOR,v.iridescenceThicknessMinimum.value=y.iridescenceThicknessRange[0],v.iridescenceThicknessMaximum.value=y.iridescenceThicknessRange[1],y.iridescenceMap&&(v.iridescenceMap.value=y.iridescenceMap,i(y.iridescenceMap,v.iridescenceMapTransform)),y.iridescenceThicknessMap&&(v.iridescenceThicknessMap.value=y.iridescenceThicknessMap,i(y.iridescenceThicknessMap,v.iridescenceThicknessMapTransform))),y.transmission>0&&(v.transmission.value=y.transmission,v.transmissionSamplerMap.value=S.texture,v.transmissionSamplerSize.value.set(S.width,S.height),y.transmissionMap&&(v.transmissionMap.value=y.transmissionMap,i(y.transmissionMap,v.transmissionMapTransform)),v.thickness.value=y.thickness,y.thicknessMap&&(v.thicknessMap.value=y.thicknessMap,i(y.thicknessMap,v.thicknessMapTransform)),v.attenuationDistance.value=y.attenuationDistance,v.attenuationColor.value.copy(y.attenuationColor)),y.anisotropy>0&&(v.anisotropyVector.value.set(y.anisotropy*Math.cos(y.anisotropyRotation),y.anisotropy*Math.sin(y.anisotropyRotation)),y.anisotropyMap&&(v.anisotropyMap.value=y.anisotropyMap,i(y.anisotropyMap,v.anisotropyMapTransform))),v.specularIntensity.value=y.specularIntensity,v.specularColor.value.copy(y.specularColor),y.specularColorMap&&(v.specularColorMap.value=y.specularColorMap,i(y.specularColorMap,v.specularColorMapTransform)),y.specularIntensityMap&&(v.specularIntensityMap.value=y.specularIntensityMap,i(y.specularIntensityMap,v.specularIntensityMapTransform))}function b(v,y){y.matcap&&(v.matcap.value=y.matcap)}function w(v,y){const S=e.get(y).light;v.referencePosition.value.setFromMatrixPosition(S.matrixWorld),v.nearDistance.value=S.shadow.camera.near,v.farDistance.value=S.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function rk(t,e,i,n){let s={},r={},l=[];const o=t.getParameter(t.MAX_UNIFORM_BUFFER_BINDINGS);function u(S,P){const M=P.program;n.uniformBlockBinding(S,M)}function c(S,P){let M=s[S.id];M===void 0&&(b(S),M=h(S),s[S.id]=M,S.addEventListener("dispose",v));const k=P.program;n.updateUBOMapping(S,k);const C=e.render.frame;r[S.id]!==C&&(m(S),r[S.id]=C)}function h(S){const P=d();S.__bindingPointIndex=P;const M=t.createBuffer(),k=S.__size,C=S.usage;return t.bindBuffer(t.UNIFORM_BUFFER,M),t.bufferData(t.UNIFORM_BUFFER,k,C),t.bindBuffer(t.UNIFORM_BUFFER,null),t.bindBufferBase(t.UNIFORM_BUFFER,P,M),M}function d(){for(let S=0;S0&&(M+=k-C),S.__size=M,S.__cache={},this}function w(S){const P={boundary:0,storage:0};return typeof S=="number"||typeof S=="boolean"?(P.boundary=4,P.storage=4):S.isVector2?(P.boundary=8,P.storage=8):S.isVector3||S.isColor?(P.boundary=16,P.storage=12):S.isVector4?(P.boundary=16,P.storage=16):S.isMatrix3?(P.boundary=48,P.storage=48):S.isMatrix4?(P.boundary=64,P.storage=64):S.isTexture?tt("WebGLRenderer: Texture samplers can not be part of an uniforms group."):ArrayBuffer.isView(S)?(P.boundary=16,P.storage=S.byteLength):tt("WebGLRenderer: Unsupported uniform value type.",S),P}function v(S){const P=S.target;P.removeEventListener("dispose",v);const M=l.indexOf(P.__bindingPointIndex);l.splice(M,1),t.deleteBuffer(s[P.id]),delete s[P.id],delete r[P.id]}function y(){for(const S in s)t.deleteBuffer(s[S]);l=[],s={},r={}}return{bind:u,update:c,dispose:y}}const ok=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let vn=null;function ak(){return vn===null&&(vn=new kh(ok,16,16,ir,Wi),vn.name="DFG_LUT",vn.minFilter=Si,vn.magFilter=Si,vn.wrapS=sn,vn.wrapT=sn,vn.generateMipmaps=!1,vn.needsUpdate=!0),vn}class Yy{constructor(e={}){const{canvas:i=Kx(),context:n=null,depth:s=!0,stencil:r=!1,alpha:l=!1,antialias:o=!1,premultipliedAlpha:u=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:d=!1,reversedDepthBuffer:m=!1,outputBufferType:g=Bi}=e;this.isWebGLRenderer=!0;let b;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");b=n.getContextAttributes().alpha}else b=l;const w=g,v=new Set([wh,Sh,_h]),y=new Set([Bi,Rn,ta,ia,yh,vh]),S=new Uint32Array(4),P=new Int32Array(4),M=new B;let k=null,C=null;const L=[],x=[];let T=null;this.domElement=i,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=on,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const F=this;let I=!1,E=null;this._outputColorSpace=Ti;let z=0,Y=0,$=null,W=-1,q=null;const te=new Et,me=new Et;let xe=null;const Ce=new Ve(0);let Fe=0,qe=i.width,mt=i.height,st=1,de=null,ke=null;const Me=new Et(0,0,qe,mt),Ke=new Et(0,0,qe,mt);let et=!1;const Ze=new Rh;let V=!1,H=!1;const Q=new _t,ce=new B,se=new Et,pe={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let _e=!1;function Pe(){return $===null?st:1}let O=n;function fe(R,J){return i.getContext(R,J)}try{const R={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:u,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if("setAttribute"in i&&i.setAttribute("data-engine",`three.js r${uh}`),i.addEventListener("webglcontextlost",be,!1),i.addEventListener("webglcontextrestored",Ye,!1),i.addEventListener("webglcontextcreationerror",ut,!1),O===null){const J="webgl2";if(O=fe(J,R),O===null)throw fe(J)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(R){throw bt("WebGLRenderer: "+R.message),R}let Ee,Se,ue,Ge,D,A,X,le,ye,we,Te,oe,ge,Re,Ue,Le,Ae,ot,ct,Mt,j,De,he;function $e(){Ee=new aC(O),Ee.init(),j=new ZE(O,Ee),Se=new QA(O,Ee,e,j),ue=new YE(O,Ee),Se.reversedDepthBuffer&&m&&ue.buffers.depth.setReversed(!0),Ge=new dC(O),D=new NE,A=new JE(O,Ee,ue,D,Se,j,Ge),X=new oC(F),le=new pT(O),De=new JA(O,le),ye=new lC(O,le,Ge,De),we=new hC(O,ye,le,De,Ge),ot=new cC(O,Se,A),Ue=new eC(D),Te=new FE(F,X,Ee,Se,De,Ue),oe=new sk(F,D),ge=new UE,Re=new HE(Ee),Ae=new YA(F,X,ue,we,b,u),Le=new KE(F,we,Se),he=new rk(O,Ge,Se,ue),ct=new ZA(O,Ee,Ge),Mt=new uC(O,Ee,Ge),Ge.programs=Te.programs,F.capabilities=Se,F.extensions=Ee,F.properties=D,F.renderLists=ge,F.shadowMap=Le,F.state=ue,F.info=Ge}$e(),w!==Bi&&(T=new pC(w,i.width,i.height,s,r));const Ne=new ik(F,O);this.xr=Ne,this.getContext=function(){return O},this.getContextAttributes=function(){return O.getContextAttributes()},this.forceContextLoss=function(){const R=Ee.get("WEBGL_lose_context");R&&R.loseContext()},this.forceContextRestore=function(){const R=Ee.get("WEBGL_lose_context");R&&R.restoreContext()},this.getPixelRatio=function(){return st},this.setPixelRatio=function(R){R!==void 0&&(st=R,this.setSize(qe,mt,!1))},this.getSize=function(R){return R.set(qe,mt)},this.setSize=function(R,J,ne=!0){if(Ne.isPresenting){tt("WebGLRenderer: Can't change size while VR device is presenting.");return}qe=R,mt=J,i.width=Math.floor(R*st),i.height=Math.floor(J*st),ne===!0&&(i.style.width=R+"px",i.style.height=J+"px"),T!==null&&T.setSize(i.width,i.height),this.setViewport(0,0,R,J)},this.getDrawingBufferSize=function(R){return R.set(qe*st,mt*st).floor()},this.setDrawingBufferSize=function(R,J,ne){qe=R,mt=J,st=ne,i.width=Math.floor(R*ne),i.height=Math.floor(J*ne),this.setViewport(0,0,R,J)},this.setEffects=function(R){if(w===Bi){bt("THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.");return}if(R){for(let J=0;J{function ze(){if(Z.forEach(function(We){D.get(We).currentProgram.isReady()&&Z.delete(We)}),Z.size===0){ee(R);return}setTimeout(ze,10)}Ee.get("KHR_parallel_shader_compile")!==null?ze():setTimeout(ze,10)})};let du=null;function lv(R){du&&du(R)}function jh(){Cs.stop()}function Xh(){Cs.start()}const Cs=new $y;Cs.setAnimationLoop(lv),typeof self<"u"&&Cs.setContext(self),this.setAnimationLoop=function(R){du=R,Ne.setAnimationLoop(R),R===null?Cs.stop():Cs.start()},Ne.addEventListener("sessionstart",jh),Ne.addEventListener("sessionend",Xh),this.render=function(R,J){if(J!==void 0&&J.isCamera!==!0){bt("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(I===!0)return;E!==null&&E.renderStart(R,J);const ne=Ne.enabled===!0&&Ne.isPresenting===!0,Z=T!==null&&($===null||ne)&&T.begin(F,$);if(R.matrixWorldAutoUpdate===!0&&R.updateMatrixWorld(),J.parent===null&&J.matrixWorldAutoUpdate===!0&&J.updateMatrixWorld(),Ne.enabled===!0&&Ne.isPresenting===!0&&(T===null||T.isCompositing()===!1)&&(Ne.cameraAutoUpdate===!0&&Ne.updateCamera(J),J=Ne.getCamera()),R.isScene===!0&&R.onBeforeRender(F,R,J,$),C=Re.get(R,x.length),C.init(J),C.state.textureUnits=A.getTextureUnits(),x.push(C),Q.multiplyMatrices(J.projectionMatrix,J.matrixWorldInverse),Ze.setFromProjectionMatrix(Q,An,J.reversedDepth),H=this.localClippingEnabled,V=Ue.init(this.clippingPlanes,H),k=ge.get(R,L.length),k.init(),L.push(k),Ne.enabled===!0&&Ne.isPresenting===!0){const We=F.xr.getDepthSensingMesh();We!==null&&cu(We,J,-1/0,F.sortObjects)}cu(R,J,0,F.sortObjects),k.finish(),F.sortObjects===!0&&k.sort(de,ke),_e=Ne.enabled===!1||Ne.isPresenting===!1||Ne.hasDepthSensing()===!1,_e&&Ae.addToRenderList(k,R),this.info.render.frame++,V===!0&&Ue.beginShadows();const ee=C.state.shadowsArray;if(Le.render(ee,R,J),V===!0&&Ue.endShadows(),this.info.autoReset===!0&&this.info.reset(),(Z&&T.hasRenderPass())===!1){const We=k.opaque,Be=k.transmissive;if(C.setupLights(),J.isArrayCamera){const je=J.cameras;if(Be.length>0)for(let Je=0,dt=je.length;Je0&&Yh(We,Be,R,J),_e&&Ae.render(R),Kh(k,R,J)}$!==null&&Y===0&&(A.updateMultisampleRenderTarget($),A.updateRenderTargetMipmap($)),Z&&T.end(F),R.isScene===!0&&R.onAfterRender(F,R,J),De.resetDefaultState(),W=-1,q=null,x.pop(),x.length>0?(C=x[x.length-1],A.setTextureUnits(C.state.textureUnits),V===!0&&Ue.setGlobalState(F.clippingPlanes,C.state.camera)):C=null,L.pop(),L.length>0?k=L[L.length-1]:k=null,E!==null&&E.renderEnd()};function cu(R,J,ne,Z){if(R.visible===!1)return;if(R.layers.test(J.layers)){if(R.isGroup)ne=R.renderOrder;else if(R.isLOD)R.autoUpdate===!0&&R.update(J);else if(R.isLightProbeGrid)C.pushLightProbeGrid(R);else if(R.isLight)C.pushLight(R),R.castShadow&&C.pushShadow(R);else if(R.isSprite){if(!R.frustumCulled||Ze.intersectsSprite(R)){Z&&se.setFromMatrixPosition(R.matrixWorld).applyMatrix4(Q);const We=we.update(R),Be=R.material;Be.visible&&k.push(R,We,Be,ne,se.z,null)}}else if((R.isMesh||R.isLine||R.isPoints)&&(!R.frustumCulled||Ze.intersectsObject(R))){const We=we.update(R),Be=R.material;if(Z&&(R.boundingSphere!==void 0?(R.boundingSphere===null&&R.computeBoundingSphere(),se.copy(R.boundingSphere.center)):(We.boundingSphere===null&&We.computeBoundingSphere(),se.copy(We.boundingSphere.center)),se.applyMatrix4(R.matrixWorld).applyMatrix4(Q)),Array.isArray(Be)){const je=We.groups;for(let Je=0,dt=je.length;Je0&&pa(ee,J,ne),ze.length>0&&pa(ze,J,ne),We.length>0&&pa(We,J,ne),ue.buffers.depth.setTest(!0),ue.buffers.depth.setMask(!0),ue.buffers.color.setMask(!0),ue.setPolygonOffset(!1)}function Yh(R,J,ne,Z){if((ne.isScene===!0?ne.overrideMaterial:null)!==null)return;if(C.state.transmissionRenderTarget[Z.id]===void 0){const Qe=Ee.has("EXT_color_buffer_half_float")||Ee.has("EXT_color_buffer_float");C.state.transmissionRenderTarget[Z.id]=new ki(1,1,{generateMipmaps:!0,type:Qe?Wi:Bi,minFilter:js,samples:Math.max(4,Se.samples),stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:vt.workingColorSpace})}const ze=C.state.transmissionRenderTarget[Z.id],We=Z.viewport||te;ze.setSize(We.z*F.transmissionResolutionScale,We.w*F.transmissionResolutionScale);const Be=F.getRenderTarget(),je=F.getActiveCubeFace(),Je=F.getActiveMipmapLevel();F.setRenderTarget(ze),F.getClearColor(Ce),Fe=F.getClearAlpha(),Fe<1&&F.setClearColor(16777215,.5),F.clear(),_e&&Ae.render(ne);const dt=F.toneMapping;F.toneMapping=on;const gt=Z.viewport;if(Z.viewport!==void 0&&(Z.viewport=void 0),C.setupLightsView(Z),V===!0&&Ue.setGlobalState(F.clippingPlanes,Z),pa(R,ne,Z),A.updateMultisampleRenderTarget(ze),A.updateRenderTargetMipmap(ze),Ee.has("WEBGL_multisampled_render_to_texture")===!1){let Qe=!1;for(let Dt=0,Yt=J.length;Dt0,Z.currentProgram=gt,Z.uniformsList=null,gt}function Zh(R){if(R.uniformsList===null){const J=R.currentProgram.getUniforms();R.uniformsList=_l.seqWithValue(J.seq,R.uniforms)}return R.uniformsList}function Qh(R,J){const ne=D.get(R);ne.outputColorSpace=J.outputColorSpace,ne.batching=J.batching,ne.batchingColor=J.batchingColor,ne.instancing=J.instancing,ne.instancingColor=J.instancingColor,ne.instancingMorph=J.instancingMorph,ne.skinning=J.skinning,ne.morphTargets=J.morphTargets,ne.morphNormals=J.morphNormals,ne.morphColors=J.morphColors,ne.morphTargetsCount=J.morphTargetsCount,ne.numClippingPlanes=J.numClippingPlanes,ne.numIntersection=J.numClipIntersection,ne.vertexAlphas=J.vertexAlphas,ne.vertexTangents=J.vertexTangents,ne.toneMapping=J.toneMapping}function uv(R,J){if(R.length===0)return null;if(R.length===1)return R[0].texture!==null?R[0]:null;M.setFromMatrixPosition(J.matrixWorld);for(let ne=0,Z=R.length;ne0),Qe=!!ne.morphAttributes.position,Dt=!!ne.morphAttributes.normal,Yt=!!ne.morphAttributes.color;let Xt=on;Z.toneMapped&&($===null||$.isXRRenderTarget===!0)&&(Xt=F.toneMapping);const Nt=ne.morphAttributes.position||ne.morphAttributes.normal||ne.morphAttributes.color,fi=Nt!==void 0?Nt.length:0,He=D.get(Z),Fi=C.state.lights;if(V===!0&&(H===!0||R!==q)){const zt=R===q&&Z.id===W;Ue.setState(Z,R,zt)}let St=!1;Z.version===He.__version?(He.needsLights&&He.lightsStateVersion!==Fi.state.version||He.outputColorSpace!==Be||ee.isBatchedMesh&&He.batching===!1||!ee.isBatchedMesh&&He.batching===!0||ee.isBatchedMesh&&He.batchingColor===!0&&ee.colorTexture===null||ee.isBatchedMesh&&He.batchingColor===!1&&ee.colorTexture!==null||ee.isInstancedMesh&&He.instancing===!1||!ee.isInstancedMesh&&He.instancing===!0||ee.isSkinnedMesh&&He.skinning===!1||!ee.isSkinnedMesh&&He.skinning===!0||ee.isInstancedMesh&&He.instancingColor===!0&&ee.instanceColor===null||ee.isInstancedMesh&&He.instancingColor===!1&&ee.instanceColor!==null||ee.isInstancedMesh&&He.instancingMorph===!0&&ee.morphTexture===null||ee.isInstancedMesh&&He.instancingMorph===!1&&ee.morphTexture!==null||He.envMap!==Je||Z.fog===!0&&He.fog!==ze||He.numClippingPlanes!==void 0&&(He.numClippingPlanes!==Ue.numPlanes||He.numIntersection!==Ue.numIntersection)||He.vertexAlphas!==dt||He.vertexTangents!==gt||He.morphTargets!==Qe||He.morphNormals!==Dt||He.morphColors!==Yt||He.toneMapping!==Xt||He.morphTargetsCount!==fi||!!He.lightProbeGrid!=C.state.lightProbeGridArray.length>0)&&(St=!0):(St=!0,He.__version=Z.version);let qi=He.currentProgram;St===!0&&(qi=fa(Z,J,ee),E&&Z.isNodeMaterial&&E.onUpdateProgram(Z,qi,He));let cn=!1,rs=!1,sr=!1;const Ot=qi.getUniforms(),Jt=He.uniforms;if(ue.useProgram(qi.program)&&(cn=!0,rs=!0,sr=!0),Z.id!==W&&(W=Z.id,rs=!0),He.needsLights){const zt=uv(C.state.lightProbeGridArray,ee);He.lightProbeGrid!==zt&&(He.lightProbeGrid=zt,rs=!0)}if(cn||q!==R){ue.buffers.depth.getReversed()&&R.reversedDepth!==!0&&(R._reversedDepth=!0,R.updateProjectionMatrix()),Ot.setValue(O,"projectionMatrix",R.projectionMatrix),Ot.setValue(O,"viewMatrix",R.matrixWorldInverse);const as=Ot.map.cameraPosition;as!==void 0&&as.setValue(O,ce.setFromMatrixPosition(R.matrixWorld)),Se.logarithmicDepthBuffer&&Ot.setValue(O,"logDepthBufFC",2/(Math.log(R.far+1)/Math.LN2)),(Z.isMeshPhongMaterial||Z.isMeshToonMaterial||Z.isMeshLambertMaterial||Z.isMeshBasicMaterial||Z.isMeshStandardMaterial||Z.isShaderMaterial)&&Ot.setValue(O,"isOrthographic",R.isOrthographicCamera===!0),q!==R&&(q=R,rs=!0,sr=!0)}if(He.needsLights&&(Fi.state.directionalShadowMap.length>0&&Ot.setValue(O,"directionalShadowMap",Fi.state.directionalShadowMap,A),Fi.state.spotShadowMap.length>0&&Ot.setValue(O,"spotShadowMap",Fi.state.spotShadowMap,A),Fi.state.pointShadowMap.length>0&&Ot.setValue(O,"pointShadowMap",Fi.state.pointShadowMap,A)),ee.isSkinnedMesh){Ot.setOptional(O,ee,"bindMatrix"),Ot.setOptional(O,ee,"bindMatrixInverse");const zt=ee.skeleton;zt&&(zt.boneTexture===null&&zt.computeBoneTexture(),Ot.setValue(O,"boneTexture",zt.boneTexture,A))}ee.isBatchedMesh&&(Ot.setOptional(O,ee,"batchingTexture"),Ot.setValue(O,"batchingTexture",ee._matricesTexture,A),Ot.setOptional(O,ee,"batchingIdTexture"),Ot.setValue(O,"batchingIdTexture",ee._indirectTexture,A),Ot.setOptional(O,ee,"batchingColorTexture"),ee._colorsTexture!==null&&Ot.setValue(O,"batchingColorTexture",ee._colorsTexture,A));const os=ne.morphAttributes;if((os.position!==void 0||os.normal!==void 0||os.color!==void 0)&&ot.update(ee,ne,qi),(rs||He.receiveShadow!==ee.receiveShadow)&&(He.receiveShadow=ee.receiveShadow,Ot.setValue(O,"receiveShadow",ee.receiveShadow)),(Z.isMeshStandardMaterial||Z.isMeshLambertMaterial||Z.isMeshPhongMaterial)&&Z.envMap===null&&J.environment!==null&&(Jt.envMapIntensity.value=J.environmentIntensity),Jt.dfgLUT!==void 0&&(Jt.dfgLUT.value=ak()),rs){if(Ot.setValue(O,"toneMappingExposure",F.toneMappingExposure),He.needsLights&&cv(Jt,sr),ze&&Z.fog===!0&&oe.refreshFogUniforms(Jt,ze),oe.refreshMaterialUniforms(Jt,Z,st,mt,C.state.transmissionRenderTarget[R.id]),He.needsLights&&He.lightProbeGrid){const zt=He.lightProbeGrid;Jt.probesSH.value=zt.texture,Jt.probesMin.value.copy(zt.boundingBox.min),Jt.probesMax.value.copy(zt.boundingBox.max),Jt.probesResolution.value.copy(zt.resolution)}_l.upload(O,Zh(He),Jt,A)}if(Z.isShaderMaterial&&Z.uniformsNeedUpdate===!0&&(_l.upload(O,Zh(He),Jt,A),Z.uniformsNeedUpdate=!1),Z.isSpriteMaterial&&Ot.setValue(O,"center",ee.center),Ot.setValue(O,"modelViewMatrix",ee.modelViewMatrix),Ot.setValue(O,"normalMatrix",ee.normalMatrix),Ot.setValue(O,"modelMatrix",ee.matrixWorld),Z.uniformsGroups!==void 0){const zt=Z.uniformsGroups;for(let as=0,rr=zt.length;as0&&A.useMultisampledRTT(R)===!1?Z=D.get(R).__webglMultisampledFramebuffer:Array.isArray(Je)?Z=Je[ne]:Z=Je,te.copy(R.viewport),me.copy(R.scissor),xe=R.scissorTest}else te.copy(Me).multiplyScalar(st).floor(),me.copy(Ke).multiplyScalar(st).floor(),xe=et;if(ne!==0&&(Z=mv),ue.bindFramebuffer(O.FRAMEBUFFER,Z)&&ue.drawBuffers(R,Z),ue.viewport(te),ue.scissor(me),ue.setScissorTest(xe),ee){const Be=D.get(R.texture);O.framebufferTexture2D(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,O.TEXTURE_CUBE_MAP_POSITIVE_X+J,Be.__webglTexture,ne)}else if(ze){const Be=J;for(let je=0;je1&&O.readBuffer(O.COLOR_ATTACHMENT0+Be),!Se.textureFormatReadable(dt)){bt("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!Se.textureTypeReadable(gt)){bt("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}J>=0&&J<=R.width-Z&&ne>=0&&ne<=R.height-ee&&O.readPixels(J,ne,Z,ee,j.convert(dt),j.convert(gt),ze)}finally{const Je=$!==null?D.get($).__webglFramebuffer:null;ue.bindFramebuffer(O.FRAMEBUFFER,Je)}}},this.readRenderTargetPixelsAsync=async function(R,J,ne,Z,ee,ze,We,Be=0){if(!(R&&R.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let je=D.get(R).__webglFramebuffer;if(R.isWebGLCubeRenderTarget&&We!==void 0&&(je=je[We]),je)if(J>=0&&J<=R.width-Z&&ne>=0&&ne<=R.height-ee){ue.bindFramebuffer(O.FRAMEBUFFER,je);const Je=R.textures[Be],dt=Je.format,gt=Je.type;if(R.textures.length>1&&O.readBuffer(O.COLOR_ATTACHMENT0+Be),!Se.textureFormatReadable(dt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!Se.textureTypeReadable(gt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const Qe=O.createBuffer();O.bindBuffer(O.PIXEL_PACK_BUFFER,Qe),O.bufferData(O.PIXEL_PACK_BUFFER,ze.byteLength,O.STREAM_READ),O.readPixels(J,ne,Z,ee,j.convert(dt),j.convert(gt),0);const Dt=$!==null?D.get($).__webglFramebuffer:null;ue.bindFramebuffer(O.FRAMEBUFFER,Dt);const Yt=O.fenceSync(O.SYNC_GPU_COMMANDS_COMPLETE,0);return O.flush(),await Yx(O,Yt,4),O.bindBuffer(O.PIXEL_PACK_BUFFER,Qe),O.getBufferSubData(O.PIXEL_PACK_BUFFER,0,ze),O.deleteBuffer(Qe),O.deleteSync(Yt),ze}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(R,J=null,ne=0){const Z=Math.pow(2,-ne),ee=Math.floor(R.image.width*Z),ze=Math.floor(R.image.height*Z),We=J!==null?J.x:0,Be=J!==null?J.y:0;A.setTexture2D(R,0),O.copyTexSubImage2D(O.TEXTURE_2D,ne,0,0,We,Be,ee,ze),ue.unbindTexture()};const pv=O.createFramebuffer(),fv=O.createFramebuffer();this.copyTextureToTexture=function(R,J,ne=null,Z=null,ee=0,ze=0){let We,Be,je,Je,dt,gt,Qe,Dt,Yt;const Xt=R.isCompressedTexture?R.mipmaps[ze]:R.image;if(ne!==null)We=ne.max.x-ne.min.x,Be=ne.max.y-ne.min.y,je=ne.isBox3?ne.max.z-ne.min.z:1,Je=ne.min.x,dt=ne.min.y,gt=ne.isBox3?ne.min.z:0;else{const Jt=Math.pow(2,-ee);We=Math.floor(Xt.width*Jt),Be=Math.floor(Xt.height*Jt),R.isDataArrayTexture?je=Xt.depth:R.isData3DTexture?je=Math.floor(Xt.depth*Jt):je=1,Je=0,dt=0,gt=0}Z!==null?(Qe=Z.x,Dt=Z.y,Yt=Z.z):(Qe=0,Dt=0,Yt=0);const Nt=j.convert(J.format),fi=j.convert(J.type);let He;J.isData3DTexture?(A.setTexture3D(J,0),He=O.TEXTURE_3D):J.isDataArrayTexture||J.isCompressedArrayTexture?(A.setTexture2DArray(J,0),He=O.TEXTURE_2D_ARRAY):(A.setTexture2D(J,0),He=O.TEXTURE_2D),ue.activeTexture(O.TEXTURE0),ue.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,J.flipY),ue.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,J.premultiplyAlpha),ue.pixelStorei(O.UNPACK_ALIGNMENT,J.unpackAlignment);const Fi=ue.getParameter(O.UNPACK_ROW_LENGTH),St=ue.getParameter(O.UNPACK_IMAGE_HEIGHT),qi=ue.getParameter(O.UNPACK_SKIP_PIXELS),cn=ue.getParameter(O.UNPACK_SKIP_ROWS),rs=ue.getParameter(O.UNPACK_SKIP_IMAGES);ue.pixelStorei(O.UNPACK_ROW_LENGTH,Xt.width),ue.pixelStorei(O.UNPACK_IMAGE_HEIGHT,Xt.height),ue.pixelStorei(O.UNPACK_SKIP_PIXELS,Je),ue.pixelStorei(O.UNPACK_SKIP_ROWS,dt),ue.pixelStorei(O.UNPACK_SKIP_IMAGES,gt);const sr=R.isDataArrayTexture||R.isData3DTexture,Ot=J.isDataArrayTexture||J.isData3DTexture;if(R.isDepthTexture){const Jt=D.get(R),os=D.get(J),zt=D.get(Jt.__renderTarget),as=D.get(os.__renderTarget);ue.bindFramebuffer(O.READ_FRAMEBUFFER,zt.__webglFramebuffer),ue.bindFramebuffer(O.DRAW_FRAMEBUFFER,as.__webglFramebuffer);for(let rr=0;rr #include #include @@ -4494,7 +4665,7 @@ void main() { #include } - `};class ih extends Ai{constructor(e){super({type:"LineMaterial",uniforms:Wr.clone(Li.line.uniforms),vertexShader:Li.line.vertexShader,fragmentShader:Li.line.fragmentShader,clipping:!0}),this.isLineMaterial=!0,this.setValues(e)}get color(){return this.uniforms.diffuse.value}set color(e){this.uniforms.diffuse.value=e}get worldUnits(){return"WORLD_UNITS"in this.defines}set worldUnits(e){e===!0!==this.worldUnits&&(this.needsUpdate=!0),e===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}get linewidth(){return this.uniforms.linewidth.value}set linewidth(e){this.uniforms.linewidth&&(this.uniforms.linewidth.value=e)}get dashed(){return"USE_DASH"in this.defines}set dashed(e){e===!0!==this.dashed&&(this.needsUpdate=!0),e===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}get dashScale(){return this.uniforms.dashScale.value}set dashScale(e){this.uniforms.dashScale.value=e}get dashSize(){return this.uniforms.dashSize.value}set dashSize(e){this.uniforms.dashSize.value=e}get dashOffset(){return this.uniforms.dashOffset.value}set dashOffset(e){this.uniforms.dashOffset.value=e}get gapSize(){return this.uniforms.gapSize.value}set gapSize(e){this.uniforms.gapSize.value=e}get opacity(){return this.uniforms.opacity.value}set opacity(e){this.uniforms&&(this.uniforms.opacity.value=e)}get resolution(){return this.uniforms.resolution.value}set resolution(e){this.uniforms.resolution.value.copy(e)}get alphaToCoverage(){return"USE_ALPHA_TO_COVERAGE"in this.defines}set alphaToCoverage(e){this.defines&&(e===!0!==this.alphaToCoverage&&(this.needsUpdate=!0),e===!0?this.defines.USE_ALPHA_TO_COVERAGE="":delete this.defines.USE_ALPHA_TO_COVERAGE)}}const Gd=new Tt,km=new V,Lm=new V,ri=new Tt,oi=new Tt,fn=new Tt,Hd=new V,Wd=new At,ai=new OP,Rm=new V,Ba=new _s,Va=new Ss,mn=new Tt;let bn,Ws;function Dm(t,e,i){return mn.set(0,0,-e,1).applyMatrix4(t.projectionMatrix),mn.multiplyScalar(1/mn.w),mn.x=Ws/i.width,mn.y=Ws/i.height,mn.applyMatrix4(t.projectionMatrixInverse),mn.multiplyScalar(1/mn.w),Math.abs(Math.max(mn.x,mn.y))}function NE(t,e){const i=t.matrixWorld,n=t.geometry,s=n.attributes.instanceStart,r=n.attributes.instanceEnd,l=Math.min(n.instanceCount,s.count);for(let o=0,d=l;oc&&oi.z>c)continue;if(ri.z>c){const w=ri.z-oi.z,x=(ri.z-c)/w;ri.lerp(oi,x)}else if(oi.z>c){const w=oi.z-ri.z,x=(oi.z-c)/w;oi.lerp(ri,x)}ri.applyMatrix4(n),oi.applyMatrix4(n),ri.multiplyScalar(1/ri.w),oi.multiplyScalar(1/oi.w),ri.x*=r.x/2,ri.y*=r.y/2,oi.x*=r.x/2,oi.y*=r.y/2,ai.start.copy(ri),ai.start.z=0,ai.end.copy(oi),ai.end.z=0;const T=ai.closestPointToPointParameter(Hd,!0);ai.at(T,Rm);const _=yl.lerp(ri.z,oi.z,T),v=_>=-1&&_<=1,S=Hd.distanceTo(Rm)this.size-1&&(W=this.size-1);let q=Math.floor(z-I);q<1&&(q=1);let te=Math.floor(z+I);te>this.size-1&&(te=this.size-1);let he=Math.floor(K-I);he<1&&(he=1);let Pe=Math.floor(K+I);Pe>this.size-1&&(Pe=this.size-1);let Ee,Ie,qe,mt,st,de,ke,Me,Xe,et,Ze;for(qe=$;qe0){this.field[mt+Ee]+=Ze*P;const U=Math.sqrt((Ee-K)*(Ee-K)+(Ie-z)*(Ie-z)+(qe-C)*(qe-C))/I,G=1-U*U*U*(U*(U*6-15)+10);this.palette[(mt+Ee)*3+0]+=F.r*G,this.palette[(mt+Ee)*3+1]+=F.g*G,this.palette[(mt+Ee)*3+2]+=F.b*G}},this.addPlaneX=function(S,w){const x=this.size,k=this.yd,E=this.zd,D=this.field;let P,M,F,I,C,z,K,$=x*Math.sqrt(S/w);for($>x&&($=x),P=0;P<$;P++)if(z=P/x,I=z*z,C=S/(1e-4+I)-w,C>0)for(M=0;Mx&&(W=x),M=0;M0)for(K=M*k,P=0;Px&&(W=x),F=0;F0)for(K=E*F,M=0;M=k))for(let $=-1;$<=1;$+=2){const W=$+P;if(!(W<0||W>=k))for(let q=-1;q<=1;q+=2){const te=q+M;if(te<0||te>=k)continue;const he=E*te+k*W+K,Pe=x[he];C++,I+=S*(Pe-I)/C}}}w[F]=I}},this.reset=function(){for(let S=0;Sr&&console.warn("THREE.MarchingCubes: Geometry buffers too small for rendering. Please create an instance with a higher poly count.")},this.init(e)}}const BE=new Int32Array([0,265,515,778,1030,1295,1541,1804,2060,2309,2575,2822,3082,3331,3593,3840,400,153,915,666,1430,1183,1941,1692,2460,2197,2975,2710,3482,3219,3993,3728,560,825,51,314,1590,1855,1077,1340,2620,2869,2111,2358,3642,3891,3129,3376,928,681,419,170,1958,1711,1445,1196,2988,2725,2479,2214,4010,3747,3497,3232,1120,1385,1635,1898,102,367,613,876,3180,3429,3695,3942,2154,2403,2665,2912,1520,1273,2035,1786,502,255,1013,764,3580,3317,4095,3830,2554,2291,3065,2800,1616,1881,1107,1370,598,863,85,348,3676,3925,3167,3414,2650,2899,2137,2384,1984,1737,1475,1226,966,719,453,204,4044,3781,3535,3270,3018,2755,2505,2240,2240,2505,2755,3018,3270,3535,3781,4044,204,453,719,966,1226,1475,1737,1984,2384,2137,2899,2650,3414,3167,3925,3676,348,85,863,598,1370,1107,1881,1616,2800,3065,2291,2554,3830,4095,3317,3580,764,1013,255,502,1786,2035,1273,1520,2912,2665,2403,2154,3942,3695,3429,3180,876,613,367,102,1898,1635,1385,1120,3232,3497,3747,4010,2214,2479,2725,2988,1196,1445,1711,1958,170,419,681,928,3376,3129,3891,3642,2358,2111,2869,2620,1340,1077,1855,1590,314,51,825,560,3728,3993,3219,3482,2710,2975,2197,2460,1692,1941,1183,1430,666,915,153,400,3840,3593,3331,3082,2822,2575,2309,2060,1804,1541,1295,1030,778,515,265,0]),za=new Int32Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,9,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,10,0,2,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,8,3,2,10,8,10,9,8,-1,-1,-1,-1,-1,-1,-1,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,8,11,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,11,2,1,9,11,9,8,11,-1,-1,-1,-1,-1,-1,-1,3,10,1,11,10,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,10,1,0,8,10,8,11,10,-1,-1,-1,-1,-1,-1,-1,3,9,0,3,11,9,11,10,9,-1,-1,-1,-1,-1,-1,-1,9,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,7,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,1,9,4,7,1,7,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,4,7,3,0,4,1,2,10,-1,-1,-1,-1,-1,-1,-1,9,2,10,9,0,2,8,4,7,-1,-1,-1,-1,-1,-1,-1,2,10,9,2,9,7,2,7,3,7,9,4,-1,-1,-1,-1,8,4,7,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,4,7,11,2,4,2,0,4,-1,-1,-1,-1,-1,-1,-1,9,0,1,8,4,7,2,3,11,-1,-1,-1,-1,-1,-1,-1,4,7,11,9,4,11,9,11,2,9,2,1,-1,-1,-1,-1,3,10,1,3,11,10,7,8,4,-1,-1,-1,-1,-1,-1,-1,1,11,10,1,4,11,1,0,4,7,11,4,-1,-1,-1,-1,4,7,8,9,0,11,9,11,10,11,0,3,-1,-1,-1,-1,4,7,11,4,11,9,9,11,10,-1,-1,-1,-1,-1,-1,-1,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,4,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,5,4,8,3,5,3,1,5,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,10,4,9,5,-1,-1,-1,-1,-1,-1,-1,5,2,10,5,4,2,4,0,2,-1,-1,-1,-1,-1,-1,-1,2,10,5,3,2,5,3,5,4,3,4,8,-1,-1,-1,-1,9,5,4,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,0,8,11,4,9,5,-1,-1,-1,-1,-1,-1,-1,0,5,4,0,1,5,2,3,11,-1,-1,-1,-1,-1,-1,-1,2,1,5,2,5,8,2,8,11,4,8,5,-1,-1,-1,-1,10,3,11,10,1,3,9,5,4,-1,-1,-1,-1,-1,-1,-1,4,9,5,0,8,1,8,10,1,8,11,10,-1,-1,-1,-1,5,4,0,5,0,11,5,11,10,11,0,3,-1,-1,-1,-1,5,4,8,5,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,9,7,8,5,7,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,3,0,9,5,3,5,7,3,-1,-1,-1,-1,-1,-1,-1,0,7,8,0,1,7,1,5,7,-1,-1,-1,-1,-1,-1,-1,1,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,7,8,9,5,7,10,1,2,-1,-1,-1,-1,-1,-1,-1,10,1,2,9,5,0,5,3,0,5,7,3,-1,-1,-1,-1,8,0,2,8,2,5,8,5,7,10,5,2,-1,-1,-1,-1,2,10,5,2,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,7,9,5,7,8,9,3,11,2,-1,-1,-1,-1,-1,-1,-1,9,5,7,9,7,2,9,2,0,2,7,11,-1,-1,-1,-1,2,3,11,0,1,8,1,7,8,1,5,7,-1,-1,-1,-1,11,2,1,11,1,7,7,1,5,-1,-1,-1,-1,-1,-1,-1,9,5,8,8,5,7,10,1,3,10,3,11,-1,-1,-1,-1,5,7,0,5,0,9,7,11,0,1,0,10,11,10,0,-1,11,10,0,11,0,3,10,5,0,8,0,7,5,7,0,-1,11,10,5,7,11,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,0,1,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,1,9,8,5,10,6,-1,-1,-1,-1,-1,-1,-1,1,6,5,2,6,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,6,5,1,2,6,3,0,8,-1,-1,-1,-1,-1,-1,-1,9,6,5,9,0,6,0,2,6,-1,-1,-1,-1,-1,-1,-1,5,9,8,5,8,2,5,2,6,3,2,8,-1,-1,-1,-1,2,3,11,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,0,8,11,2,0,10,6,5,-1,-1,-1,-1,-1,-1,-1,0,1,9,2,3,11,5,10,6,-1,-1,-1,-1,-1,-1,-1,5,10,6,1,9,2,9,11,2,9,8,11,-1,-1,-1,-1,6,3,11,6,5,3,5,1,3,-1,-1,-1,-1,-1,-1,-1,0,8,11,0,11,5,0,5,1,5,11,6,-1,-1,-1,-1,3,11,6,0,3,6,0,6,5,0,5,9,-1,-1,-1,-1,6,5,9,6,9,11,11,9,8,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,4,7,3,6,5,10,-1,-1,-1,-1,-1,-1,-1,1,9,0,5,10,6,8,4,7,-1,-1,-1,-1,-1,-1,-1,10,6,5,1,9,7,1,7,3,7,9,4,-1,-1,-1,-1,6,1,2,6,5,1,4,7,8,-1,-1,-1,-1,-1,-1,-1,1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1,8,4,7,9,0,5,0,6,5,0,2,6,-1,-1,-1,-1,7,3,9,7,9,4,3,2,9,5,9,6,2,6,9,-1,3,11,2,7,8,4,10,6,5,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,2,4,2,0,2,7,11,-1,-1,-1,-1,0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1,9,2,1,9,11,2,9,4,11,7,11,4,5,10,6,-1,8,4,7,3,11,5,3,5,1,5,11,6,-1,-1,-1,-1,5,1,11,5,11,6,1,0,11,7,11,4,0,4,11,-1,0,5,9,0,6,5,0,3,6,11,6,3,8,4,7,-1,6,5,9,6,9,11,4,7,9,7,11,9,-1,-1,-1,-1,10,4,9,6,4,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,10,6,4,9,10,0,8,3,-1,-1,-1,-1,-1,-1,-1,10,0,1,10,6,0,6,4,0,-1,-1,-1,-1,-1,-1,-1,8,3,1,8,1,6,8,6,4,6,1,10,-1,-1,-1,-1,1,4,9,1,2,4,2,6,4,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,9,2,4,9,2,6,4,-1,-1,-1,-1,0,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,3,2,8,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,10,4,9,10,6,4,11,2,3,-1,-1,-1,-1,-1,-1,-1,0,8,2,2,8,11,4,9,10,4,10,6,-1,-1,-1,-1,3,11,2,0,1,6,0,6,4,6,1,10,-1,-1,-1,-1,6,4,1,6,1,10,4,8,1,2,1,11,8,11,1,-1,9,6,4,9,3,6,9,1,3,11,6,3,-1,-1,-1,-1,8,11,1,8,1,0,11,6,1,9,1,4,6,4,1,-1,3,11,6,3,6,0,0,6,4,-1,-1,-1,-1,-1,-1,-1,6,4,8,11,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,10,6,7,8,10,8,9,10,-1,-1,-1,-1,-1,-1,-1,0,7,3,0,10,7,0,9,10,6,7,10,-1,-1,-1,-1,10,6,7,1,10,7,1,7,8,1,8,0,-1,-1,-1,-1,10,6,7,10,7,1,1,7,3,-1,-1,-1,-1,-1,-1,-1,1,2,6,1,6,8,1,8,9,8,6,7,-1,-1,-1,-1,2,6,9,2,9,1,6,7,9,0,9,3,7,3,9,-1,7,8,0,7,0,6,6,0,2,-1,-1,-1,-1,-1,-1,-1,7,3,2,6,7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,11,10,6,8,10,8,9,8,6,7,-1,-1,-1,-1,2,0,7,2,7,11,0,9,7,6,7,10,9,10,7,-1,1,8,0,1,7,8,1,10,7,6,7,10,2,3,11,-1,11,2,1,11,1,7,10,6,1,6,7,1,-1,-1,-1,-1,8,9,6,8,6,7,9,1,6,11,6,3,1,3,6,-1,0,9,1,11,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,8,0,7,0,6,3,11,0,11,6,0,-1,-1,-1,-1,7,11,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,1,9,8,3,1,11,7,6,-1,-1,-1,-1,-1,-1,-1,10,1,2,6,11,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,8,6,11,7,-1,-1,-1,-1,-1,-1,-1,2,9,0,2,10,9,6,11,7,-1,-1,-1,-1,-1,-1,-1,6,11,7,2,10,3,10,8,3,10,9,8,-1,-1,-1,-1,7,2,3,6,2,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,0,8,7,6,0,6,2,0,-1,-1,-1,-1,-1,-1,-1,2,7,6,2,3,7,0,1,9,-1,-1,-1,-1,-1,-1,-1,1,6,2,1,8,6,1,9,8,8,7,6,-1,-1,-1,-1,10,7,6,10,1,7,1,3,7,-1,-1,-1,-1,-1,-1,-1,10,7,6,1,7,10,1,8,7,1,0,8,-1,-1,-1,-1,0,3,7,0,7,10,0,10,9,6,10,7,-1,-1,-1,-1,7,6,10,7,10,8,8,10,9,-1,-1,-1,-1,-1,-1,-1,6,8,4,11,8,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,6,11,3,0,6,0,4,6,-1,-1,-1,-1,-1,-1,-1,8,6,11,8,4,6,9,0,1,-1,-1,-1,-1,-1,-1,-1,9,4,6,9,6,3,9,3,1,11,3,6,-1,-1,-1,-1,6,8,4,6,11,8,2,10,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,11,0,6,11,0,4,6,-1,-1,-1,-1,4,11,8,4,6,11,0,2,9,2,10,9,-1,-1,-1,-1,10,9,3,10,3,2,9,4,3,11,3,6,4,6,3,-1,8,2,3,8,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,0,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,4,2,4,6,4,3,8,-1,-1,-1,-1,1,9,4,1,4,2,2,4,6,-1,-1,-1,-1,-1,-1,-1,8,1,3,8,6,1,8,4,6,6,10,1,-1,-1,-1,-1,10,1,0,10,0,6,6,0,4,-1,-1,-1,-1,-1,-1,-1,4,6,3,4,3,8,6,10,3,0,3,9,10,9,3,-1,10,9,4,6,10,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,5,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,5,11,7,6,-1,-1,-1,-1,-1,-1,-1,5,0,1,5,4,0,7,6,11,-1,-1,-1,-1,-1,-1,-1,11,7,6,8,3,4,3,5,4,3,1,5,-1,-1,-1,-1,9,5,4,10,1,2,7,6,11,-1,-1,-1,-1,-1,-1,-1,6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1,7,6,11,5,4,10,4,2,10,4,0,2,-1,-1,-1,-1,3,4,8,3,5,4,3,2,5,10,5,2,11,7,6,-1,7,2,3,7,6,2,5,4,9,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,6,0,6,2,6,8,7,-1,-1,-1,-1,3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1,6,2,8,6,8,7,2,1,8,4,8,5,1,5,8,-1,9,5,4,10,1,6,1,7,6,1,3,7,-1,-1,-1,-1,1,6,10,1,7,6,1,0,7,8,7,0,9,5,4,-1,4,0,10,4,10,5,0,3,10,6,10,7,3,7,10,-1,7,6,10,7,10,8,5,4,10,4,8,10,-1,-1,-1,-1,6,9,5,6,11,9,11,8,9,-1,-1,-1,-1,-1,-1,-1,3,6,11,0,6,3,0,5,6,0,9,5,-1,-1,-1,-1,0,11,8,0,5,11,0,1,5,5,6,11,-1,-1,-1,-1,6,11,3,6,3,5,5,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,11,9,11,8,11,5,6,-1,-1,-1,-1,0,11,3,0,6,11,0,9,6,5,6,9,1,2,10,-1,11,8,5,11,5,6,8,0,5,10,5,2,0,2,5,-1,6,11,3,6,3,5,2,10,3,10,5,3,-1,-1,-1,-1,5,8,9,5,2,8,5,6,2,3,8,2,-1,-1,-1,-1,9,5,6,9,6,0,0,6,2,-1,-1,-1,-1,-1,-1,-1,1,5,8,1,8,0,5,6,8,3,8,2,6,2,8,-1,1,5,6,2,1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,6,1,6,10,3,8,6,5,6,9,8,9,6,-1,10,1,0,10,0,6,9,5,0,5,6,0,-1,-1,-1,-1,0,3,8,5,6,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,7,5,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,11,7,5,8,3,0,-1,-1,-1,-1,-1,-1,-1,5,11,7,5,10,11,1,9,0,-1,-1,-1,-1,-1,-1,-1,10,7,5,10,11,7,9,8,1,8,3,1,-1,-1,-1,-1,11,1,2,11,7,1,7,5,1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,7,1,7,5,7,2,11,-1,-1,-1,-1,9,7,5,9,2,7,9,0,2,2,11,7,-1,-1,-1,-1,7,5,2,7,2,11,5,9,2,3,2,8,9,8,2,-1,2,5,10,2,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,8,2,0,8,5,2,8,7,5,10,2,5,-1,-1,-1,-1,9,0,1,5,10,3,5,3,7,3,10,2,-1,-1,-1,-1,9,8,2,9,2,1,8,7,2,10,2,5,7,5,2,-1,1,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,7,0,7,1,1,7,5,-1,-1,-1,-1,-1,-1,-1,9,0,3,9,3,5,5,3,7,-1,-1,-1,-1,-1,-1,-1,9,8,7,5,9,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,8,4,5,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,5,0,4,5,11,0,5,10,11,11,3,0,-1,-1,-1,-1,0,1,9,8,4,10,8,10,11,10,4,5,-1,-1,-1,-1,10,11,4,10,4,5,11,3,4,9,4,1,3,1,4,-1,2,5,1,2,8,5,2,11,8,4,5,8,-1,-1,-1,-1,0,4,11,0,11,3,4,5,11,2,11,1,5,1,11,-1,0,2,5,0,5,9,2,11,5,4,5,8,11,8,5,-1,9,4,5,2,11,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,5,10,3,5,2,3,4,5,3,8,4,-1,-1,-1,-1,5,10,2,5,2,4,4,2,0,-1,-1,-1,-1,-1,-1,-1,3,10,2,3,5,10,3,8,5,4,5,8,0,1,9,-1,5,10,2,5,2,4,1,9,2,9,4,2,-1,-1,-1,-1,8,4,5,8,5,3,3,5,1,-1,-1,-1,-1,-1,-1,-1,0,4,5,1,0,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,4,5,8,5,3,9,0,5,0,3,5,-1,-1,-1,-1,9,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,11,7,4,9,11,9,10,11,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,7,9,11,7,9,10,11,-1,-1,-1,-1,1,10,11,1,11,4,1,4,0,7,4,11,-1,-1,-1,-1,3,1,4,3,4,8,1,10,4,7,4,11,10,11,4,-1,4,11,7,9,11,4,9,2,11,9,1,2,-1,-1,-1,-1,9,7,4,9,11,7,9,1,11,2,11,1,0,8,3,-1,11,7,4,11,4,2,2,4,0,-1,-1,-1,-1,-1,-1,-1,11,7,4,11,4,2,8,3,4,3,2,4,-1,-1,-1,-1,2,9,10,2,7,9,2,3,7,7,4,9,-1,-1,-1,-1,9,10,7,9,7,4,10,2,7,8,7,0,2,0,7,-1,3,7,10,3,10,2,7,4,10,1,10,0,4,0,10,-1,1,10,2,8,7,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,7,1,3,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,0,8,1,8,7,1,-1,-1,-1,-1,4,0,3,7,4,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,8,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,11,9,10,-1,-1,-1,-1,-1,-1,-1,0,1,10,0,10,8,8,10,11,-1,-1,-1,-1,-1,-1,-1,3,1,10,11,3,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,11,1,11,9,9,11,8,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,1,2,9,2,11,9,-1,-1,-1,-1,0,2,11,8,0,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,10,8,9,-1,-1,-1,-1,-1,-1,-1,9,10,2,0,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,0,1,8,1,10,8,-1,-1,-1,-1,1,10,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]);class VE extends $t{constructor(e,i={}){super(e),this.isWater=!0;const n=this,s=i.textureWidth!==void 0?i.textureWidth:512,r=i.textureHeight!==void 0?i.textureHeight:512,l=i.clipBias!==void 0?i.clipBias:0,o=i.alpha!==void 0?i.alpha:1,d=i.time!==void 0?i.time:0,u=i.waterNormals!==void 0?i.waterNormals:null,h=i.sunDirection!==void 0?i.sunDirection:new V(.70707,.70707,0),c=new ze(i.sunColor!==void 0?i.sunColor:16777215),f=new ze(i.waterColor!==void 0?i.waterColor:8355711),g=i.eye!==void 0?i.eye:new V(0,0,0),y=i.distortionScale!==void 0?i.distortionScale:20,T=i.side!==void 0?i.side:Kn,_=i.fog!==void 0?i.fog:!1,v=new Un,S=new V,w=new V,x=new V,k=new At,E=new V(0,0,-1),D=new Tt,P=new V,M=new V,F=new Tt,I=new At,C=new Pi,z=new tn(s,r,{type:xn}),K={name:"MirrorShader",uniforms:Wr.merge([Oe.fog,Oe.lights,{normalSampler:{value:null},mirrorSampler:{value:null},alpha:{value:1},time:{value:0},size:{value:1},distortionScale:{value:20},textureMatrix:{value:new At},sunColor:{value:new ze(8355711)},sunDirection:{value:new V(.70707,.70707,0)},eye:{value:new V},waterColor:{value:new ze(5592405)}}]),vertexShader:` + `};class Bh extends ii{constructor(e){super({type:"LineMaterial",uniforms:Ps.clone(Di.line.uniforms),vertexShader:Di.line.vertexShader,fragmentShader:Di.line.fragmentShader,clipping:!0}),this.isLineMaterial=!0,this.setValues(e)}get color(){return this.uniforms.diffuse.value}set color(e){this.uniforms.diffuse.value=e}get worldUnits(){return"WORLD_UNITS"in this.defines}set worldUnits(e){e===!0!==this.worldUnits&&(this.needsUpdate=!0),e===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}get linewidth(){return this.uniforms.linewidth.value}set linewidth(e){this.uniforms.linewidth&&(this.uniforms.linewidth.value=e)}get dashed(){return"USE_DASH"in this.defines}set dashed(e){e===!0!==this.dashed&&(this.needsUpdate=!0),e===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}get dashScale(){return this.uniforms.dashScale.value}set dashScale(e){this.uniforms.dashScale.value=e}get dashSize(){return this.uniforms.dashSize.value}set dashSize(e){this.uniforms.dashSize.value=e}get dashOffset(){return this.uniforms.dashOffset.value}set dashOffset(e){this.uniforms.dashOffset.value=e}get gapSize(){return this.uniforms.gapSize.value}set gapSize(e){this.uniforms.gapSize.value=e}get opacity(){return this.uniforms.opacity.value}set opacity(e){this.uniforms&&(this.uniforms.opacity.value=e)}get resolution(){return this.uniforms.resolution.value}set resolution(e){this.uniforms.resolution.value.copy(e)}get alphaToCoverage(){return"USE_ALPHA_TO_COVERAGE"in this.defines}set alphaToCoverage(e){this.defines&&(e===!0!==this.alphaToCoverage&&(this.needsUpdate=!0),e===!0?this.defines.USE_ALPHA_TO_COVERAGE="":delete this.defines.USE_ALPHA_TO_COVERAGE)}}const fd=new Et,Sf=new B,wf=new B,ui=new Et,di=new Et,bn=new Et,gd=new B,yd=new _t,ci=new uT,Mf=new B,sl=new Dn,rl=new In,_n=new Et;let Tn,Qs;function xf(t,e,i){return _n.set(0,0,-e,1).applyMatrix4(t.projectionMatrix),_n.multiplyScalar(1/_n.w),_n.x=Qs/i.width,_n.y=Qs/i.height,_n.applyMatrix4(t.projectionMatrixInverse),_n.multiplyScalar(1/_n.w),Math.abs(Math.max(_n.x,_n.y))}function lk(t,e){const i=t.matrixWorld,n=t.geometry,s=n.attributes.instanceStart,r=n.attributes.instanceEnd,l=Math.min(n.instanceCount,s.count);for(let o=0,u=l;od&&di.z>d)continue;if(ui.z>d){const P=ui.z-di.z,M=(ui.z-d)/P;ui.lerp(di,M)}else if(di.z>d){const P=di.z-ui.z,M=(di.z-d)/P;di.lerp(ui,M)}ui.applyMatrix4(n),di.applyMatrix4(n),ui.multiplyScalar(1/ui.w),di.multiplyScalar(1/di.w),ui.x*=r.x/2,ui.y*=r.y/2,di.x*=r.x/2,di.y*=r.y/2,ci.start.copy(ui),ci.start.z=0,ci.end.copy(di),ci.end.z=0;const w=ci.closestPointToPointParameter(gd,!0);ci.at(w,Mf);const v=Ol.lerp(ui.z,di.z,w),y=v>=-1&&v<=1,S=gd.distanceTo(Mf)this.size-1&&(W=this.size-1);let q=Math.floor(z-I);q<1&&(q=1);let te=Math.floor(z+I);te>this.size-1&&(te=this.size-1);let me=Math.floor(Y-I);me<1&&(me=1);let xe=Math.floor(Y+I);xe>this.size-1&&(xe=this.size-1);let Ce,Fe,qe,mt,st,de,ke,Me,Ke,et,Ze;for(qe=$;qe0){this.field[mt+Ce]+=Ze*x;const V=Math.sqrt((Ce-Y)*(Ce-Y)+(Fe-z)*(Fe-z)+(qe-E)*(qe-E))/I,H=1-V*V*V*(V*(V*6-15)+10);this.palette[(mt+Ce)*3+0]+=F.r*H,this.palette[(mt+Ce)*3+1]+=F.g*H,this.palette[(mt+Ce)*3+2]+=F.b*H}},this.addPlaneX=function(S,P){const M=this.size,k=this.yd,C=this.zd,L=this.field;let x,T,F,I,E,z,Y,$=M*Math.sqrt(S/P);for($>M&&($=M),x=0;x<$;x++)if(z=x/M,I=z*z,E=S/(1e-4+I)-P,E>0)for(T=0;TM&&(W=M),T=0;T0)for(Y=T*k,x=0;xM&&(W=M),F=0;F0)for(Y=C*F,T=0;T=k))for(let $=-1;$<=1;$+=2){const W=$+x;if(!(W<0||W>=k))for(let q=-1;q<=1;q+=2){const te=q+T;if(te<0||te>=k)continue;const me=C*te+k*W+Y,xe=M[me];E++,I+=S*(xe-I)/E}}}P[F]=I}},this.reset=function(){for(let S=0;Sr&&console.warn("THREE.MarchingCubes: Geometry buffers too small for rendering. Please create an instance with a higher poly count.")},this.init(e)}}const ck=new Int32Array([0,265,515,778,1030,1295,1541,1804,2060,2309,2575,2822,3082,3331,3593,3840,400,153,915,666,1430,1183,1941,1692,2460,2197,2975,2710,3482,3219,3993,3728,560,825,51,314,1590,1855,1077,1340,2620,2869,2111,2358,3642,3891,3129,3376,928,681,419,170,1958,1711,1445,1196,2988,2725,2479,2214,4010,3747,3497,3232,1120,1385,1635,1898,102,367,613,876,3180,3429,3695,3942,2154,2403,2665,2912,1520,1273,2035,1786,502,255,1013,764,3580,3317,4095,3830,2554,2291,3065,2800,1616,1881,1107,1370,598,863,85,348,3676,3925,3167,3414,2650,2899,2137,2384,1984,1737,1475,1226,966,719,453,204,4044,3781,3535,3270,3018,2755,2505,2240,2240,2505,2755,3018,3270,3535,3781,4044,204,453,719,966,1226,1475,1737,1984,2384,2137,2899,2650,3414,3167,3925,3676,348,85,863,598,1370,1107,1881,1616,2800,3065,2291,2554,3830,4095,3317,3580,764,1013,255,502,1786,2035,1273,1520,2912,2665,2403,2154,3942,3695,3429,3180,876,613,367,102,1898,1635,1385,1120,3232,3497,3747,4010,2214,2479,2725,2988,1196,1445,1711,1958,170,419,681,928,3376,3129,3891,3642,2358,2111,2869,2620,1340,1077,1855,1590,314,51,825,560,3728,3993,3219,3482,2710,2975,2197,2460,1692,1941,1183,1430,666,915,153,400,3840,3593,3331,3082,2822,2575,2309,2060,1804,1541,1295,1030,778,515,265,0]),ol=new Int32Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,9,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,10,0,2,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,8,3,2,10,8,10,9,8,-1,-1,-1,-1,-1,-1,-1,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,8,11,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,11,2,1,9,11,9,8,11,-1,-1,-1,-1,-1,-1,-1,3,10,1,11,10,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,10,1,0,8,10,8,11,10,-1,-1,-1,-1,-1,-1,-1,3,9,0,3,11,9,11,10,9,-1,-1,-1,-1,-1,-1,-1,9,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,7,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,1,9,4,7,1,7,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,4,7,3,0,4,1,2,10,-1,-1,-1,-1,-1,-1,-1,9,2,10,9,0,2,8,4,7,-1,-1,-1,-1,-1,-1,-1,2,10,9,2,9,7,2,7,3,7,9,4,-1,-1,-1,-1,8,4,7,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,4,7,11,2,4,2,0,4,-1,-1,-1,-1,-1,-1,-1,9,0,1,8,4,7,2,3,11,-1,-1,-1,-1,-1,-1,-1,4,7,11,9,4,11,9,11,2,9,2,1,-1,-1,-1,-1,3,10,1,3,11,10,7,8,4,-1,-1,-1,-1,-1,-1,-1,1,11,10,1,4,11,1,0,4,7,11,4,-1,-1,-1,-1,4,7,8,9,0,11,9,11,10,11,0,3,-1,-1,-1,-1,4,7,11,4,11,9,9,11,10,-1,-1,-1,-1,-1,-1,-1,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,4,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,5,4,8,3,5,3,1,5,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,10,4,9,5,-1,-1,-1,-1,-1,-1,-1,5,2,10,5,4,2,4,0,2,-1,-1,-1,-1,-1,-1,-1,2,10,5,3,2,5,3,5,4,3,4,8,-1,-1,-1,-1,9,5,4,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,0,8,11,4,9,5,-1,-1,-1,-1,-1,-1,-1,0,5,4,0,1,5,2,3,11,-1,-1,-1,-1,-1,-1,-1,2,1,5,2,5,8,2,8,11,4,8,5,-1,-1,-1,-1,10,3,11,10,1,3,9,5,4,-1,-1,-1,-1,-1,-1,-1,4,9,5,0,8,1,8,10,1,8,11,10,-1,-1,-1,-1,5,4,0,5,0,11,5,11,10,11,0,3,-1,-1,-1,-1,5,4,8,5,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,9,7,8,5,7,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,3,0,9,5,3,5,7,3,-1,-1,-1,-1,-1,-1,-1,0,7,8,0,1,7,1,5,7,-1,-1,-1,-1,-1,-1,-1,1,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,7,8,9,5,7,10,1,2,-1,-1,-1,-1,-1,-1,-1,10,1,2,9,5,0,5,3,0,5,7,3,-1,-1,-1,-1,8,0,2,8,2,5,8,5,7,10,5,2,-1,-1,-1,-1,2,10,5,2,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,7,9,5,7,8,9,3,11,2,-1,-1,-1,-1,-1,-1,-1,9,5,7,9,7,2,9,2,0,2,7,11,-1,-1,-1,-1,2,3,11,0,1,8,1,7,8,1,5,7,-1,-1,-1,-1,11,2,1,11,1,7,7,1,5,-1,-1,-1,-1,-1,-1,-1,9,5,8,8,5,7,10,1,3,10,3,11,-1,-1,-1,-1,5,7,0,5,0,9,7,11,0,1,0,10,11,10,0,-1,11,10,0,11,0,3,10,5,0,8,0,7,5,7,0,-1,11,10,5,7,11,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,0,1,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,1,9,8,5,10,6,-1,-1,-1,-1,-1,-1,-1,1,6,5,2,6,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,6,5,1,2,6,3,0,8,-1,-1,-1,-1,-1,-1,-1,9,6,5,9,0,6,0,2,6,-1,-1,-1,-1,-1,-1,-1,5,9,8,5,8,2,5,2,6,3,2,8,-1,-1,-1,-1,2,3,11,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,0,8,11,2,0,10,6,5,-1,-1,-1,-1,-1,-1,-1,0,1,9,2,3,11,5,10,6,-1,-1,-1,-1,-1,-1,-1,5,10,6,1,9,2,9,11,2,9,8,11,-1,-1,-1,-1,6,3,11,6,5,3,5,1,3,-1,-1,-1,-1,-1,-1,-1,0,8,11,0,11,5,0,5,1,5,11,6,-1,-1,-1,-1,3,11,6,0,3,6,0,6,5,0,5,9,-1,-1,-1,-1,6,5,9,6,9,11,11,9,8,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,4,7,3,6,5,10,-1,-1,-1,-1,-1,-1,-1,1,9,0,5,10,6,8,4,7,-1,-1,-1,-1,-1,-1,-1,10,6,5,1,9,7,1,7,3,7,9,4,-1,-1,-1,-1,6,1,2,6,5,1,4,7,8,-1,-1,-1,-1,-1,-1,-1,1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1,8,4,7,9,0,5,0,6,5,0,2,6,-1,-1,-1,-1,7,3,9,7,9,4,3,2,9,5,9,6,2,6,9,-1,3,11,2,7,8,4,10,6,5,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,2,4,2,0,2,7,11,-1,-1,-1,-1,0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1,9,2,1,9,11,2,9,4,11,7,11,4,5,10,6,-1,8,4,7,3,11,5,3,5,1,5,11,6,-1,-1,-1,-1,5,1,11,5,11,6,1,0,11,7,11,4,0,4,11,-1,0,5,9,0,6,5,0,3,6,11,6,3,8,4,7,-1,6,5,9,6,9,11,4,7,9,7,11,9,-1,-1,-1,-1,10,4,9,6,4,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,10,6,4,9,10,0,8,3,-1,-1,-1,-1,-1,-1,-1,10,0,1,10,6,0,6,4,0,-1,-1,-1,-1,-1,-1,-1,8,3,1,8,1,6,8,6,4,6,1,10,-1,-1,-1,-1,1,4,9,1,2,4,2,6,4,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,9,2,4,9,2,6,4,-1,-1,-1,-1,0,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,3,2,8,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,10,4,9,10,6,4,11,2,3,-1,-1,-1,-1,-1,-1,-1,0,8,2,2,8,11,4,9,10,4,10,6,-1,-1,-1,-1,3,11,2,0,1,6,0,6,4,6,1,10,-1,-1,-1,-1,6,4,1,6,1,10,4,8,1,2,1,11,8,11,1,-1,9,6,4,9,3,6,9,1,3,11,6,3,-1,-1,-1,-1,8,11,1,8,1,0,11,6,1,9,1,4,6,4,1,-1,3,11,6,3,6,0,0,6,4,-1,-1,-1,-1,-1,-1,-1,6,4,8,11,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,10,6,7,8,10,8,9,10,-1,-1,-1,-1,-1,-1,-1,0,7,3,0,10,7,0,9,10,6,7,10,-1,-1,-1,-1,10,6,7,1,10,7,1,7,8,1,8,0,-1,-1,-1,-1,10,6,7,10,7,1,1,7,3,-1,-1,-1,-1,-1,-1,-1,1,2,6,1,6,8,1,8,9,8,6,7,-1,-1,-1,-1,2,6,9,2,9,1,6,7,9,0,9,3,7,3,9,-1,7,8,0,7,0,6,6,0,2,-1,-1,-1,-1,-1,-1,-1,7,3,2,6,7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,11,10,6,8,10,8,9,8,6,7,-1,-1,-1,-1,2,0,7,2,7,11,0,9,7,6,7,10,9,10,7,-1,1,8,0,1,7,8,1,10,7,6,7,10,2,3,11,-1,11,2,1,11,1,7,10,6,1,6,7,1,-1,-1,-1,-1,8,9,6,8,6,7,9,1,6,11,6,3,1,3,6,-1,0,9,1,11,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,8,0,7,0,6,3,11,0,11,6,0,-1,-1,-1,-1,7,11,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,1,9,8,3,1,11,7,6,-1,-1,-1,-1,-1,-1,-1,10,1,2,6,11,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,8,6,11,7,-1,-1,-1,-1,-1,-1,-1,2,9,0,2,10,9,6,11,7,-1,-1,-1,-1,-1,-1,-1,6,11,7,2,10,3,10,8,3,10,9,8,-1,-1,-1,-1,7,2,3,6,2,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,0,8,7,6,0,6,2,0,-1,-1,-1,-1,-1,-1,-1,2,7,6,2,3,7,0,1,9,-1,-1,-1,-1,-1,-1,-1,1,6,2,1,8,6,1,9,8,8,7,6,-1,-1,-1,-1,10,7,6,10,1,7,1,3,7,-1,-1,-1,-1,-1,-1,-1,10,7,6,1,7,10,1,8,7,1,0,8,-1,-1,-1,-1,0,3,7,0,7,10,0,10,9,6,10,7,-1,-1,-1,-1,7,6,10,7,10,8,8,10,9,-1,-1,-1,-1,-1,-1,-1,6,8,4,11,8,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,6,11,3,0,6,0,4,6,-1,-1,-1,-1,-1,-1,-1,8,6,11,8,4,6,9,0,1,-1,-1,-1,-1,-1,-1,-1,9,4,6,9,6,3,9,3,1,11,3,6,-1,-1,-1,-1,6,8,4,6,11,8,2,10,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,11,0,6,11,0,4,6,-1,-1,-1,-1,4,11,8,4,6,11,0,2,9,2,10,9,-1,-1,-1,-1,10,9,3,10,3,2,9,4,3,11,3,6,4,6,3,-1,8,2,3,8,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,0,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,4,2,4,6,4,3,8,-1,-1,-1,-1,1,9,4,1,4,2,2,4,6,-1,-1,-1,-1,-1,-1,-1,8,1,3,8,6,1,8,4,6,6,10,1,-1,-1,-1,-1,10,1,0,10,0,6,6,0,4,-1,-1,-1,-1,-1,-1,-1,4,6,3,4,3,8,6,10,3,0,3,9,10,9,3,-1,10,9,4,6,10,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,5,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,5,11,7,6,-1,-1,-1,-1,-1,-1,-1,5,0,1,5,4,0,7,6,11,-1,-1,-1,-1,-1,-1,-1,11,7,6,8,3,4,3,5,4,3,1,5,-1,-1,-1,-1,9,5,4,10,1,2,7,6,11,-1,-1,-1,-1,-1,-1,-1,6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1,7,6,11,5,4,10,4,2,10,4,0,2,-1,-1,-1,-1,3,4,8,3,5,4,3,2,5,10,5,2,11,7,6,-1,7,2,3,7,6,2,5,4,9,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,6,0,6,2,6,8,7,-1,-1,-1,-1,3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1,6,2,8,6,8,7,2,1,8,4,8,5,1,5,8,-1,9,5,4,10,1,6,1,7,6,1,3,7,-1,-1,-1,-1,1,6,10,1,7,6,1,0,7,8,7,0,9,5,4,-1,4,0,10,4,10,5,0,3,10,6,10,7,3,7,10,-1,7,6,10,7,10,8,5,4,10,4,8,10,-1,-1,-1,-1,6,9,5,6,11,9,11,8,9,-1,-1,-1,-1,-1,-1,-1,3,6,11,0,6,3,0,5,6,0,9,5,-1,-1,-1,-1,0,11,8,0,5,11,0,1,5,5,6,11,-1,-1,-1,-1,6,11,3,6,3,5,5,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,11,9,11,8,11,5,6,-1,-1,-1,-1,0,11,3,0,6,11,0,9,6,5,6,9,1,2,10,-1,11,8,5,11,5,6,8,0,5,10,5,2,0,2,5,-1,6,11,3,6,3,5,2,10,3,10,5,3,-1,-1,-1,-1,5,8,9,5,2,8,5,6,2,3,8,2,-1,-1,-1,-1,9,5,6,9,6,0,0,6,2,-1,-1,-1,-1,-1,-1,-1,1,5,8,1,8,0,5,6,8,3,8,2,6,2,8,-1,1,5,6,2,1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,6,1,6,10,3,8,6,5,6,9,8,9,6,-1,10,1,0,10,0,6,9,5,0,5,6,0,-1,-1,-1,-1,0,3,8,5,6,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,7,5,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,11,7,5,8,3,0,-1,-1,-1,-1,-1,-1,-1,5,11,7,5,10,11,1,9,0,-1,-1,-1,-1,-1,-1,-1,10,7,5,10,11,7,9,8,1,8,3,1,-1,-1,-1,-1,11,1,2,11,7,1,7,5,1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,7,1,7,5,7,2,11,-1,-1,-1,-1,9,7,5,9,2,7,9,0,2,2,11,7,-1,-1,-1,-1,7,5,2,7,2,11,5,9,2,3,2,8,9,8,2,-1,2,5,10,2,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,8,2,0,8,5,2,8,7,5,10,2,5,-1,-1,-1,-1,9,0,1,5,10,3,5,3,7,3,10,2,-1,-1,-1,-1,9,8,2,9,2,1,8,7,2,10,2,5,7,5,2,-1,1,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,7,0,7,1,1,7,5,-1,-1,-1,-1,-1,-1,-1,9,0,3,9,3,5,5,3,7,-1,-1,-1,-1,-1,-1,-1,9,8,7,5,9,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,8,4,5,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,5,0,4,5,11,0,5,10,11,11,3,0,-1,-1,-1,-1,0,1,9,8,4,10,8,10,11,10,4,5,-1,-1,-1,-1,10,11,4,10,4,5,11,3,4,9,4,1,3,1,4,-1,2,5,1,2,8,5,2,11,8,4,5,8,-1,-1,-1,-1,0,4,11,0,11,3,4,5,11,2,11,1,5,1,11,-1,0,2,5,0,5,9,2,11,5,4,5,8,11,8,5,-1,9,4,5,2,11,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,5,10,3,5,2,3,4,5,3,8,4,-1,-1,-1,-1,5,10,2,5,2,4,4,2,0,-1,-1,-1,-1,-1,-1,-1,3,10,2,3,5,10,3,8,5,4,5,8,0,1,9,-1,5,10,2,5,2,4,1,9,2,9,4,2,-1,-1,-1,-1,8,4,5,8,5,3,3,5,1,-1,-1,-1,-1,-1,-1,-1,0,4,5,1,0,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,4,5,8,5,3,9,0,5,0,3,5,-1,-1,-1,-1,9,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,11,7,4,9,11,9,10,11,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,7,9,11,7,9,10,11,-1,-1,-1,-1,1,10,11,1,11,4,1,4,0,7,4,11,-1,-1,-1,-1,3,1,4,3,4,8,1,10,4,7,4,11,10,11,4,-1,4,11,7,9,11,4,9,2,11,9,1,2,-1,-1,-1,-1,9,7,4,9,11,7,9,1,11,2,11,1,0,8,3,-1,11,7,4,11,4,2,2,4,0,-1,-1,-1,-1,-1,-1,-1,11,7,4,11,4,2,8,3,4,3,2,4,-1,-1,-1,-1,2,9,10,2,7,9,2,3,7,7,4,9,-1,-1,-1,-1,9,10,7,9,7,4,10,2,7,8,7,0,2,0,7,-1,3,7,10,3,10,2,7,4,10,1,10,0,4,0,10,-1,1,10,2,8,7,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,7,1,3,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,0,8,1,8,7,1,-1,-1,-1,-1,4,0,3,7,4,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,8,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,11,9,10,-1,-1,-1,-1,-1,-1,-1,0,1,10,0,10,8,8,10,11,-1,-1,-1,-1,-1,-1,-1,3,1,10,11,3,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,11,1,11,9,9,11,8,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,1,2,9,2,11,9,-1,-1,-1,-1,0,2,11,8,0,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,10,8,9,-1,-1,-1,-1,-1,-1,-1,9,10,2,0,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,0,1,8,1,10,8,-1,-1,-1,-1,1,10,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]);class hk extends Ut{constructor(e,i={}){super(e),this.isWater=!0;const n=this,s=i.textureWidth!==void 0?i.textureWidth:512,r=i.textureHeight!==void 0?i.textureHeight:512,l=i.clipBias!==void 0?i.clipBias:0,o=i.alpha!==void 0?i.alpha:1,u=i.time!==void 0?i.time:0,c=i.waterNormals!==void 0?i.waterNormals:null,h=i.sunDirection!==void 0?i.sunDirection:new B(.70707,.70707,0),d=new Ve(i.sunColor!==void 0?i.sunColor:16777215),m=new Ve(i.waterColor!==void 0?i.waterColor:8355711),g=i.eye!==void 0?i.eye:new B(0,0,0),b=i.distortionScale!==void 0?i.distortionScale:20,w=i.side!==void 0?i.side:ts,v=i.fog!==void 0?i.fog:!1,y=new qn,S=new B,P=new B,M=new B,k=new _t,C=new B(0,0,-1),L=new Et,x=new B,T=new B,F=new Et,I=new _t,E=new li,z=new ki(s,r,{type:Wi}),Y={name:"MirrorShader",uniforms:Ps.merge([Oe.fog,Oe.lights,{normalSampler:{value:null},mirrorSampler:{value:null},alpha:{value:1},time:{value:0},size:{value:1},distortionScale:{value:20},textureMatrix:{value:new _t},sunColor:{value:new Ve(8355711)},sunDirection:{value:new B(.70707,.70707,0)},eye:{value:new B},waterColor:{value:new Ve(5592405)}}]),vertexShader:` uniform mat4 textureMatrix; uniform float time; @@ -4590,7 +4761,7 @@ void main() { #include #include #include - }`},$=new Ai({name:K.name,uniforms:Wr.clone(K.uniforms),vertexShader:K.vertexShader,fragmentShader:K.fragmentShader,lights:!0,side:T,fog:_});$.uniforms.mirrorSampler.value=z.texture,$.uniforms.textureMatrix.value=I,$.uniforms.alpha.value=o,$.uniforms.time.value=d,$.uniforms.normalSampler.value=u,$.uniforms.sunColor.value=c,$.uniforms.waterColor.value=f,$.uniforms.sunDirection.value=h,$.uniforms.distortionScale.value=y,$.uniforms.eye.value=g,n.material=$,n.onBeforeRender=function(W,q,te){if(w.setFromMatrixPosition(n.matrixWorld),x.setFromMatrixPosition(te.matrixWorld),k.extractRotation(n.matrixWorld),S.set(0,0,1),S.applyMatrix4(k),P.subVectors(w,x),P.dot(S)>0)return;P.reflect(S).negate(),P.add(w),k.extractRotation(te.matrixWorld),E.set(0,0,-1),E.applyMatrix4(k),E.add(x),M.subVectors(w,E),M.reflect(S).negate(),M.add(w),C.position.copy(P),C.up.set(0,1,0),C.up.applyMatrix4(k),C.up.reflect(S),C.lookAt(M),C.far=te.far,C.updateMatrixWorld(),C.projectionMatrix.copy(te.projectionMatrix),I.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),I.multiply(C.projectionMatrix),I.multiply(C.matrixWorldInverse),v.setFromNormalAndCoplanarPoint(S,w),v.applyMatrix4(C.matrixWorldInverse),D.set(v.normal.x,v.normal.y,v.normal.z,v.constant);const he=C.projectionMatrix;F.x=(Math.sign(D.x)+he.elements[8])/he.elements[0],F.y=(Math.sign(D.y)+he.elements[9])/he.elements[5],F.z=-1,F.w=(1+he.elements[10])/he.elements[14],D.multiplyScalar(2/D.dot(F)),he.elements[2]=D.x,he.elements[6]=D.y,he.elements[10]=D.z+1-l,he.elements[14]=D.w,g.setFromMatrixPosition(te.matrixWorld);const Pe=W.getRenderTarget(),Ee=W.xr.enabled,Ie=W.shadowMap.autoUpdate;n.visible=!1,W.xr.enabled=!1,W.shadowMap.autoUpdate=!1,W.setRenderTarget(z),W.state.buffers.depth.setMask(!0),W.autoClear===!1&&W.clear(),W.render(q,C),n.visible=!0,W.xr.enabled=Ee,W.shadowMap.autoUpdate=Ie,W.setRenderTarget(Pe);const qe=te.viewport;qe!==void 0&&W.state.viewport(qe)}}}class Bl extends $t{constructor(){const e=Bl.SkyShader,i=new Ai({name:e.name,uniforms:Wr.clone(e.uniforms),vertexShader:e.vertexShader,fragmentShader:e.fragmentShader,side:Ti,depthWrite:!1});super(new Xs(1,1,1),i),this.isSky=!0}}Bl.SkyShader={name:"SkyShader",uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new V},up:{value:new V(0,1,0)},cloudScale:{value:2e-4},cloudSpeed:{value:1e-4},cloudCoverage:{value:.4},cloudDensity:{value:.4},cloudElevation:{value:.5},showSunDisc:{value:1},time:{value:0}},vertexShader:` + }`},$=new ii({name:Y.name,uniforms:Ps.clone(Y.uniforms),vertexShader:Y.vertexShader,fragmentShader:Y.fragmentShader,lights:!0,side:w,fog:v});$.uniforms.mirrorSampler.value=z.texture,$.uniforms.textureMatrix.value=I,$.uniforms.alpha.value=o,$.uniforms.time.value=u,$.uniforms.normalSampler.value=c,$.uniforms.sunColor.value=d,$.uniforms.waterColor.value=m,$.uniforms.sunDirection.value=h,$.uniforms.distortionScale.value=b,$.uniforms.eye.value=g,n.material=$,n.onBeforeRender=function(W,q,te){if(P.setFromMatrixPosition(n.matrixWorld),M.setFromMatrixPosition(te.matrixWorld),k.extractRotation(n.matrixWorld),S.set(0,0,1),S.applyMatrix4(k),x.subVectors(P,M),x.dot(S)>0)return;x.reflect(S).negate(),x.add(P),k.extractRotation(te.matrixWorld),C.set(0,0,-1),C.applyMatrix4(k),C.add(M),T.subVectors(P,C),T.reflect(S).negate(),T.add(P),E.position.copy(x),E.up.set(0,1,0),E.up.applyMatrix4(k),E.up.reflect(S),E.lookAt(T),E.far=te.far,E.updateMatrixWorld(),E.projectionMatrix.copy(te.projectionMatrix),I.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),I.multiply(E.projectionMatrix),I.multiply(E.matrixWorldInverse),y.setFromNormalAndCoplanarPoint(S,P),y.applyMatrix4(E.matrixWorldInverse),L.set(y.normal.x,y.normal.y,y.normal.z,y.constant);const me=E.projectionMatrix;F.x=(Math.sign(L.x)+me.elements[8])/me.elements[0],F.y=(Math.sign(L.y)+me.elements[9])/me.elements[5],F.z=-1,F.w=(1+me.elements[10])/me.elements[14],L.multiplyScalar(2/L.dot(F)),me.elements[2]=L.x,me.elements[6]=L.y,me.elements[10]=L.z+1-l,me.elements[14]=L.w,g.setFromMatrixPosition(te.matrixWorld);const xe=W.getRenderTarget(),Ce=W.xr.enabled,Fe=W.shadowMap.autoUpdate;n.visible=!1,W.xr.enabled=!1,W.shadowMap.autoUpdate=!1,W.setRenderTarget(z),W.state.buffers.depth.setMask(!0),W.autoClear===!1&&W.clear(),W.render(q,E),n.visible=!0,W.xr.enabled=Ce,W.shadowMap.autoUpdate=Fe,W.setRenderTarget(xe);const qe=te.viewport;qe!==void 0&&W.state.viewport(qe)}}}class lu extends Ut{constructor(){const e=lu.SkyShader,i=new ii({name:e.name,uniforms:Ps.clone(e.uniforms),vertexShader:e.vertexShader,fragmentShader:e.fragmentShader,side:Ei,depthWrite:!1});super(new xs(1,1,1),i),this.isSky=!0}}lu.SkyShader={name:"SkyShader",uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new B},up:{value:new B(0,1,0)},cloudScale:{value:2e-4},cloudSpeed:{value:1e-4},cloudCoverage:{value:.4},cloudDensity:{value:.4},cloudElevation:{value:.5},showSunDisc:{value:1},time:{value:0}},vertexShader:` uniform vec3 sunPosition; uniform float rayleigh; uniform float turbidity; @@ -4810,7 +4981,198 @@ void main() { #include #include - }`};function Jt(t){const e=Number(t);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}function Zt(t,e,i){return Math.max(e,Math.min(i,t))}function zE(){const t=getComputedStyle(document.documentElement),e=i=>t.getPropertyValue(i).trim();return[e("--accent"),e("--cyan"),e("--warn"),e("--b-group"),e("--live"),e("--accent-text")]}const qd=5e4,$E=` + }`};const mk={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`,fragmentShader:` + + uniform float opacity; + + uniform sampler2D tDiffuse; + + varying vec2 vUv; + + void main() { + + vec4 texel = texture2D( tDiffuse, vUv ); + gl_FragColor = opacity * texel; + + + }`};class ma{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const pk=new ru(-1,1,1,-1,0,1);class fk extends Bt{constructor(){super(),this.setAttribute("position",new wt([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new wt([0,2,0,0,2,0],2))}}const gk=new fk;class uu{constructor(e){this._mesh=new Ut(gk,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,pk)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class yk extends ma{constructor(e,i="tDiffuse"){super(),this.textureID=i,this.uniforms=null,this.material=null,e instanceof ii?(this.uniforms=e.uniforms,this.material=e):e&&(this.uniforms=Ps.clone(e.uniforms),this.material=new ii({name:e.name!==void 0?e.name:"unspecified",defines:Object.assign({},e.defines),uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader})),this._fsQuad=new uu(this.material)}render(e,i,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this._fsQuad.material=this.material,this.renderToScreen?(e.setRenderTarget(null),this._fsQuad.render(e)):(e.setRenderTarget(i),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this._fsQuad.render(e))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}class Tf extends ma{constructor(e,i){super(),this.scene=e,this.camera=i,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(e,i,n){const s=e.getContext(),r=e.state;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0);let l,o;this.inverse?(l=0,o=1):(l=1,o=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(s.REPLACE,s.REPLACE,s.REPLACE),r.buffers.stencil.setFunc(s.ALWAYS,l,4294967295),r.buffers.stencil.setClear(o),r.buffers.stencil.setLocked(!0),e.setRenderTarget(n),this.clear&&e.clear(),e.render(this.scene,this.camera),e.setRenderTarget(i),this.clear&&e.clear(),e.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.color.setMask(!0),r.buffers.depth.setMask(!0),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(s.EQUAL,1,4294967295),r.buffers.stencil.setOp(s.KEEP,s.KEEP,s.KEEP),r.buffers.stencil.setLocked(!0)}}class vk extends ma{constructor(){super(),this.needsSwap=!1}render(e){e.state.buffers.stencil.setLocked(!1),e.state.buffers.stencil.setTest(!1)}}class bk{constructor(e,i){if(this.renderer=e,this._pixelRatio=e.getPixelRatio(),i===void 0){const n=e.getSize(new Xe);this._width=n.width,this._height=n.height,i=new ki(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:Wi}),i.texture.name="EffectComposer.rt1"}else this._width=i.width,this._height=i.height;this.renderTarget1=i,this.renderTarget2=i.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new yk(mk),this.copyPass.material.blending=kn,this.timer=new nT}swapBuffers(){const e=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=e}addPass(e){this.passes.push(e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(e,i){this.passes.splice(i,0,e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(e){const i=this.passes.indexOf(e);i!==-1&&this.passes.splice(i,1)}isLastEnabledPass(e){for(let i=e+1;i + #include + + varying vec2 vUv; + + void main() { + + gl_FragColor = texture2D( tDiffuse, vUv ); + + // tone mapping + + #ifdef LINEAR_TONE_MAPPING + + gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb ); + + #elif defined( REINHARD_TONE_MAPPING ) + + gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb ); + + #elif defined( CINEON_TONE_MAPPING ) + + gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb ); + + #elif defined( ACES_FILMIC_TONE_MAPPING ) + + gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + + #elif defined( AGX_TONE_MAPPING ) + + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + + #elif defined( NEUTRAL_TONE_MAPPING ) + + gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb ); + + #elif defined( CUSTOM_TONE_MAPPING ) + + gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb ); + + #endif + + // color space + + #ifdef SRGB_TRANSFER + + gl_FragColor = sRGBTransferOETF( gl_FragColor ); + + #endif + + }`};class Sk extends ma{constructor(){super(),this.isOutputPass=!0,this.uniforms=Ps.clone(al.uniforms),this.material=new Uy({name:al.name,uniforms:this.uniforms,vertexShader:al.vertexShader,fragmentShader:al.fragmentShader}),this._fsQuad=new uu(this.material),this._outputColorSpace=null,this._toneMapping=null}render(e,i,n){this.uniforms.tDiffuse.value=n.texture,this.uniforms.toneMappingExposure.value=e.toneMappingExposure,(this._outputColorSpace!==e.outputColorSpace||this._toneMapping!==e.toneMapping)&&(this._outputColorSpace=e.outputColorSpace,this._toneMapping=e.toneMapping,this.material.defines={},vt.getTransfer(this._outputColorSpace)===At&&(this.material.defines.SRGB_TRANSFER=""),this._toneMapping===dh?this.material.defines.LINEAR_TONE_MAPPING="":this._toneMapping===ch?this.material.defines.REINHARD_TONE_MAPPING="":this._toneMapping===hh?this.material.defines.CINEON_TONE_MAPPING="":this._toneMapping===iu?this.material.defines.ACES_FILMIC_TONE_MAPPING="":this._toneMapping===ph?this.material.defines.AGX_TONE_MAPPING="":this._toneMapping===fh?this.material.defines.NEUTRAL_TONE_MAPPING="":this._toneMapping===mh&&(this.material.defines.CUSTOM_TONE_MAPPING=""),this.material.needsUpdate=!0),this.renderToScreen===!0?(e.setRenderTarget(null),this._fsQuad.render(e)):(e.setRenderTarget(i),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this._fsQuad.render(e))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}class wk{constructor(e,i,n){this.variables=[],this.currentTextureIndex=0;let s=Gi;const r={passThruTexture:{value:null}},l=c(d(),r),o=new uu(l);this.setDataType=function(m){return s=m,this},this.addVariable=function(m,g,b){const w=this.createShaderMaterial(g),v={name:m,initialValueTexture:b,material:w,dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:Zt,magFilter:Zt};return this.variables.push(v),v},this.setVariableDependencies=function(m,g){m.dependencies=g},this.init=function(){if(n.capabilities.maxVertexTextures===0)return"No support for vertex shader textures.";for(let m=0;m=1?1:t<.5?2**(20*t-10)/2:(2-2**(-20*t+10))/2}function Ek(){if(typeof document>"u"||document.getElementById(Nc))return;const t=document.createElement("style");t.id=Nc,t.textContent=` +.defora-pt-element { + width: 120px; + height: 160px; + box-shadow: 0 0 12px rgba(0,255,255,0.45); + border: 1px solid rgba(127,255,255,0.28); + font-family: Helvetica, Arial, sans-serif; + text-align: center; + line-height: normal; + cursor: default; + pointer-events: none; + user-select: none; + position: relative; + box-sizing: border-box; +} +.defora-pt-element .defora-pt-number { + position: absolute; + top: 20px; + right: 20px; + font-size: 12px; + color: rgba(127,255,255,0.75); +} +.defora-pt-element .defora-pt-symbol { + position: absolute; + top: 40px; + left: 0; + right: 0; + font-size: 60px; + font-weight: bold; + color: rgba(255,255,255,0.75); + text-shadow: 0 0 10px rgba(0,255,255,0.95); +} +.defora-pt-element .defora-pt-details { + position: absolute; + bottom: 15px; + left: 0; + right: 0; + font-size: 12px; + color: rgba(127,255,255,0.75); +} +`,document.head.appendChild(t)}function kk(){var t;typeof document>"u"||(t=document.getElementById(Nc))==null||t.remove()}function Zy(t,e,i=0){const n=Ak(t*(.55+i%7*.08),.12,.9),s=Math.round(30+e*40),r=Math.round(100+e*80),l=Math.round(120+(1-e)*60);return`rgba(${s},${r},${l},${n})`}function Rk(t,e={}){const i=t*5,n=er[i],s=er[i+1],r=er[i+2],l=e.opacity??.45,o=e.hue??.5,u=e.scale??1,c=document.createElement("div");c.className="defora-pt-element",c.style.backgroundColor=Zy(l,o,t),c.style.width=`${Math.round(120*u)}px`,c.style.height=`${Math.round(160*u)}px`;const h=document.createElement("div");h.className="defora-pt-number",h.textContent=String(t+1),c.appendChild(h);const d=document.createElement("div");d.className="defora-pt-symbol",d.textContent=n,c.appendChild(d);const m=document.createElement("div");return m.className="defora-pt-details",m.innerHTML=`${s}
${r}`,c.appendChild(m),c}function Ef(t,e=1){const i=[],n=[],s=[],r=[],l=new B;for(let o=0;o{const o=r==null?void 0:r.element;o&&(o.style.backgroundColor=Zy(i,n,l),o.style.width=`${Math.round(120*s)}px`,o.style.height=`${Math.round(160*s)}px`)})}function $t(t){const e=Number(t);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}function qt(t,e,i){return Math.max(e,Math.min(i,t))}function Nk(){const t=getComputedStyle(document.documentElement),e=i=>t.getPropertyValue(i).trim();return[e("--accent"),e("--cyan"),e("--warn"),e("--b-group"),e("--live"),e("--accent-text")]}const vd=5e4,Dr=6,kf=2e3,Ok=` attribute vec3 offset; attribute vec4 color; attribute vec4 orientationStart; @@ -4831,7 +5193,7 @@ void main() { vColor = color; gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0); } -`,GE=` +`,Uk=` uniform float time; uniform float hueShift; uniform float shimmer; @@ -4847,7 +5209,7 @@ void main() { color.a = max(color.a, 0.85); gl_FragColor = color; } -`;function uo(){return{mode:"instancing",instCount:12e3,beamCount:7,speed:.75,spread:.68,glow:.78,hue:.6,pulse:.36,drift:.44,mist:.58,orbit:.52,lineType:"segments",lineWidth:2.4,lineThreshold:.8,lineTranslation:0,lineWorldUnits:!0,lineVisualizeThreshold:!1,lineAlphaToCoverage:!0,lineAnimate:!0,mcMaterial:"shiny",mcNumBlobs:10,mcResolution:28,mcIsolation:80,mcFloor:!0,mcWallX:!1,mcWallZ:!1,ocElevation:2,ocAzimuth:180,ocExposure:.1,ocDistortion:3.7,ocSize:1,ocCloudCoverage:.4,ocCloudDensity:.5,ocCloudElevation:.5}}function HE(){return[new ze(16736109),new ze(16761713),new ze(15269754),new ze(5307003),new ze(6080767),new ze(8353757),new ze(16742615)]}function WE(t,e){const i=document.createElement("canvas");i.width=256,i.height=256;const n=i.getContext("2d"),s=n.createRadialGradient(128,128,12,128,128,128);s.addColorStop(0,`rgba(255,255,255,${t})`),s.addColorStop(.22,`rgba(255,255,255,${t*.85})`),s.addColorStop(.68,`rgba(255,255,255,${e})`),s.addColorStop(1,"rgba(255,255,255,0)"),n.fillStyle=s,n.fillRect(0,0,256,256);const r=new Bg(i);return r.needsUpdate=!0,r}function qE(){const t=document.createElement("canvas");t.width=128,t.height=512;const e=t.getContext("2d"),i=e.createLinearGradient(0,0,0,512);i.addColorStop(0,"rgba(255,255,255,0)"),i.addColorStop(.18,"rgba(255,255,255,0.12)"),i.addColorStop(.52,"rgba(255,255,255,0.9)"),i.addColorStop(.82,"rgba(255,255,255,0.18)"),i.addColorStop(1,"rgba(255,255,255,0)"),e.fillStyle=i,e.fillRect(0,0,128,512);const n=new Bg(t);return n.needsUpdate=!0,n}const jE={name:"ThreeBackground",props:{lfos:{type:Array,default:()=>[]},audioMetrics:{type:Object,default:()=>({active:!1,level:0,bass:0,mid:0,treble:0,pulse:0})},activeTab:{type:String,default:"LIVE"},morph:{type:Number,default:.5},settings:{type:Object,default:()=>uo()}},data(){return{dragState:null,marchingResolution:28,marchingMaterialKey:"shiny",oceanSettingsKey:"",baseRendererToneMapping:null,baseRendererExposure:1}},created(){this.renderer=null,this.scene=null,this.camera=null,this.clock=null,this.rafId=null,this.resizeObserver=null,this.particleSystem=null,this.particleBase=null,this.haloMesh=null,this.beamMeshes=[],this.fogSprites=[],this.beamMap=null,this.mistMap=null,this.lfoGroups=[],this.fatLineRoot=null,this.fatLine=null,this.fatThresholdLine=null,this.fatSegments=null,this.fatThresholdSegments=null,this.marchingRoot=null,this.marchingEffect=null,this.marchingMaterials=null,this.oceanRoot=null,this.oceanSky=null,this.oceanWater=null,this.oceanMesh=null,this.oceanSun=null,this.oceanPmrem=null,this.oceanPmremTarget=null,this.oceanNormalsTexture=null,this.instancingRoot=null,this.instancingMesh=null,this.customLightsRoot=null,this.customLightsMaterial=null,this.customLightsLights=[],this.customLightsGlows=[],this.deforumBackdropMesh=null,this.deforumBackdropTexture=null,this.deforumBackdropUrl="",this.deforumBackdropOpacity=0},mounted(){typeof window>"u"||(this.scheduleStartup(),typeof document<"u"&&(this._visibilityHandler=()=>{document.visibilityState==="visible"&&this.ensureRunning()},document.addEventListener("visibilitychange",this._visibilityHandler)))},beforeUnmount(){typeof document<"u"&&this._visibilityHandler&&document.removeEventListener("visibilitychange",this._visibilityHandler);const t=this.$refs.host;t&&this._onPointerMove&&t.removeEventListener("pointermove",this._onPointerMove),this.teardownScene()},methods:{scheduleStartup(){this.$nextTick(()=>{requestAnimationFrame(()=>this.startWhenReady())})},startWhenReady(t=0){const e=this.$refs.host;if(!e){t<90&&requestAnimationFrame(()=>this.startWhenReady(t+1));return}const i=e.clientWidth||0,n=e.clientHeight||0;if((i<2||n<2)&&t<90){requestAnimationFrame(()=>this.startWhenReady(t+1));return}this.renderer?this.ensureRunning():this.initScene()},ensureRunning(){if(!this.renderer||!this.scene||!this.camera||!this.clock){this.scheduleStartup();return}this.handleResize(),this.rafId==null&&this.animate()},createDeforumBackdrop(){if(!this.scene||this.deforumBackdropMesh)return;const t=new Hs(36,20),e=new Os({color:16777215,transparent:!0,opacity:0,depthWrite:!1,side:Gi});this.deforumBackdropMesh=new $t(t,e),this.deforumBackdropMesh.position.z=-14,this.deforumBackdropMesh.renderOrder=-200,this.deforumBackdropMesh.visible=!1,this.scene.add(this.deforumBackdropMesh)},updateDeforumBackdropOpacity(t){const e=Jt(t);if(this.deforumBackdropOpacity=e,!this.deforumBackdropMesh)return;const i=this.deforumBackdropMesh.material;i.opacity=e,this.deforumBackdropMesh.visible=e>.001&&!!i.map},setDeforumBackdropFromUrl(t,{opacity:e=.35}={}){if(!t||!this.scene)return;this.deforumBackdropMesh||this.createDeforumBackdrop();const i=Jt(e);if(this.deforumBackdropUrl===t&&this.deforumBackdropTexture){this.updateDeforumBackdropOpacity(i);return}new Yf().load(t,s=>{s.colorSpace=ki,this.deforumBackdropTexture&&this.deforumBackdropTexture.dispose(),this.deforumBackdropTexture=s,this.deforumBackdropUrl=t,this.deforumBackdropMesh.material.map=s,this.deforumBackdropMesh.material.needsUpdate=!0,this.updateDeforumBackdropOpacity(i)},void 0,()=>{})},clearDeforumBackdrop(){var t;this.deforumBackdropUrl="",this.updateDeforumBackdropOpacity(0),this.deforumBackdropTexture&&(this.deforumBackdropTexture.dispose(),this.deforumBackdropTexture=null),(t=this.deforumBackdropMesh)!=null&&t.material&&(this.deforumBackdropMesh.material.map=null)},initScene(){const t=this.$refs.host;if(!t)return;this.scene=new Qu,this.scene.fog=new Gc(329485,.045),this.clock=new IP,this.camera=new Pi(45,1,.1,100),this.camera.position.set(0,0,18),this.renderer=new Qg({antialias:!0,alpha:!0,powerPreference:"high-performance"}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,1.5)),this.renderer.setClearColor(0,0),this.renderer.outputColorSpace=ki,this.baseRendererToneMapping=this.renderer.toneMapping,this.baseRendererExposure=this.renderer.toneMappingExposure,t.appendChild(this.renderer.domElement),this.scene.add(new Hg(16777215,.28));const e=new Fd(9404671,2.1,60);e.position.set(6,5,14),this.scene.add(e);const i=new Fd(3007231,1.35,60);i.position.set(-6,-4,12),this.scene.add(i);const n=new Fd(16742615,1,50);n.position.set(0,-3,10),this.scene.add(n),this.beamMap=qE(),this.mistMap=WE(.55,.12),this.createDeforumBackdrop(),this.createParticles(),this.createHalo(),this.createVolumeBeams(),this.createFogSprites(),this.createFatLines(),this.createMarchingField(),this.createOceanScene(),this.createInstancingField(),this.createInteractivePointsScene(),this.createInteractiveRaycastScene(),this.createLensflaresScene(),this.createLfoGroups(),this.raycaster=new DP,this.bindPointerHandlers(),this.handleResize(),window.addEventListener("resize",this.handleResize),typeof ResizeObserver=="function"&&(this.resizeObserver=new ResizeObserver(()=>this.handleResize()),this.resizeObserver.observe(t)),this.animate()},createParticles(){const e=new Float32Array(3300);this.particleBase=new Float32Array(1100*3);for(let s=0;s<1100;s+=1){const r=5+Math.random()*15,l=Math.random()*Math.PI*2,o=Math.acos(2*Math.random()-1),d=r*Math.sin(o)*Math.cos(l),u=r*Math.sin(o)*Math.sin(l),h=(Math.random()-.5)*18;e[s*3]=d,e[s*3+1]=u,e[s*3+2]=h,this.particleBase[s*3]=d,this.particleBase[s*3+1]=u,this.particleBase[s*3+2]=h}const i=new zt;i.setAttribute("position",new ei(e,3));const n=new Og({color:12175103,size:.085,transparent:!0,opacity:.42,blending:Fs,depthWrite:!1});this.particleSystem=new Gf(i,n),this.scene.add(this.particleSystem)},createHalo(){const t=new Yc(4.6,2),e=new gr({color:8419583,emissive:3089008,shininess:70,transparent:!0,opacity:.08,wireframe:!0});this.haloMesh=new $t(t,e),this.scene.add(this.haloMesh)},createVolumeBeams(){const t=new Hs(1,1,1,1);this.beamMeshes=Array.from({length:12}).map(()=>{const e=new Os({map:this.beamMap,color:16777215,transparent:!0,opacity:.4,blending:Fs,depthWrite:!1,side:Gi}),i=new $t(t,e);return i.visible=!1,this.scene.add(i),i})},createFogSprites(){this.fogSprites=Array.from({length:4}).map((t,e)=>{const i=new Dg({map:this.mistMap,color:new ze().setHSL((.54+e*.08)%1,.72,.65),transparent:!0,opacity:.18,blending:Fs,depthWrite:!1}),n=new oP(i);return this.scene.add(n),n})},createFatLines(){const t=[],e=[],i=[];for(let h=-32;h<32;h+=1){const c=h/2.8;t.push(new V(c*Math.sin(1.8*c)*.72,c*.56,c*Math.cos(1.8*c)*.72))}const n=new mP(t),s=Math.max(96,Math.round(t.length*3.5)),r=new V,l=new ze;for(let h=0;hnew ih({color:16777215,linewidth:h?3:2.4,worldUnits:!0,vertexColors:!h,transparent:h,opacity:h?.18:.94,depthTest:!h,alphaToCoverage:!0});this.fatLineRoot=new vn,this.fatLineRoot.visible=!1,this.scene.add(this.fatLineRoot),this.fatLine=new Im(o,u()),this.fatLine.computeLineDistances(),this.fatLineRoot.add(this.fatLine),this.fatThresholdLine=new Im(o,u({threshold:!0})),this.fatThresholdLine.computeLineDistances(),this.fatThresholdLine.visible=!1,this.fatLineRoot.add(this.fatThresholdLine),this.fatSegments=new oc(d,u()),this.fatSegments.computeLineDistances(),this.fatSegments.visible=!1,this.fatLineRoot.add(this.fatSegments),this.fatThresholdSegments=new oc(d,u({threshold:!0})),this.fatThresholdSegments.computeLineDistances(),this.fatThresholdSegments.visible=!1,this.fatLineRoot.add(this.fatThresholdSegments)},createMarchingMaterials(){return{shiny:new Or({color:10686762,roughness:.12,metalness:.85,emissive:2491664}),chrome:new Or({color:15199487,roughness:.06,metalness:1}),liquid:new _P({color:8050687,roughness:.04,transmission:.15,thickness:.8,metalness:.05}),matte:new gr({color:13089279,specular:2761035,shininess:12}),flat:new SP({color:10150911,flatShading:!0}),plastic:new gr({color:16777215,specular:12698049,shininess:220}),colors:new gr({color:16777215,specular:16777215,shininess:32,vertexColors:!0}),multiColors:new gr({color:16777215,specular:16777215,shininess:64,vertexColors:!0})}},createMarchingField(){this.marchingMaterials=this.createMarchingMaterials(),this.marchingRoot=new vn,this.marchingRoot.visible=!1,this.scene.add(this.marchingRoot),this.marchingEffect=new UE(28,this.marchingMaterials.shiny,!1,!1,2e4),this.marchingEffect.position.set(0,0,0),this.marchingEffect.scale.set(8.2,8.2,8.2),this.marchingEffect.isolation=80,this.marchingRoot.add(this.marchingEffect),this.marchingResolution=28,this.marchingMaterialKey="shiny"},createOceanScene(){this.oceanRoot=new vn,this.oceanRoot.visible=!1,this.scene.add(this.oceanRoot),this.oceanSun=new V;const t=new Bl;t.scale.setScalar(1e4),this.oceanSky=t;const e=t.material.uniforms;e.turbidity.value=10,e.rayleigh.value=2,e.mieCoefficient.value=.005,e.mieDirectionalG.value=.8,this.oceanRoot.add(t);const i=new $t(new Xs(8,8,8),new Or({color:15199487,roughness:0,metalness:.15}));i.position.set(0,5,0),this.oceanMesh=i,this.oceanRoot.add(i),this.oceanPmrem=new nc(this.renderer),new Yf().load("/textures/waternormals.jpg",s=>{if(!this.oceanRoot){s.dispose();return}s.wrapS=No,s.wrapT=No,this.oceanNormalsTexture=s;const r=new Hs(500,500,1,1);this.oceanWater=new VE(r,{textureWidth:512,textureHeight:512,waterNormals:s,sunDirection:new V,sunColor:16777215,waterColor:7695,distortionScale:3.7,fog:!1}),this.oceanWater.rotation.x=-Math.PI/2,this.oceanRoot.add(this.oceanWater),this.syncOceanSettings(this.resolvedSettings())})},oceanSettingsSignature(t){return[t.ocElevation,t.ocAzimuth,t.ocExposure,t.ocDistortion,t.ocSize,t.ocCloudCoverage,t.ocCloudDensity,t.ocCloudElevation].join("|")},syncOceanSettings(t){if(!this.oceanSky||!this.oceanWater)return;const e=this.oceanSettingsSignature(t);if(this.oceanSettingsKey===e)return;this.oceanSettingsKey=e;const i=yl.degToRad(90-t.ocElevation),n=yl.degToRad(t.ocAzimuth);this.oceanSun.setFromSphericalCoords(1,i,n);const s=this.oceanSky.material.uniforms;s.sunPosition.value.copy(this.oceanSun),s.cloudCoverage.value=t.ocCloudCoverage,s.cloudDensity.value=t.ocCloudDensity,s.cloudElevation.value=t.ocCloudElevation;const r=this.oceanWater.material.uniforms;r.sunDirection.value.copy(this.oceanSun).normalize(),r.distortionScale.value=t.ocDistortion,r.size.value=t.ocSize,this.oceanPmremTarget&&(this.oceanPmremTarget.dispose(),this.oceanPmremTarget=null);const l=new Qu;l.add(this.oceanSky),this.oceanPmremTarget=this.oceanPmrem.fromScene(l),this.oceanRoot.add(this.oceanSky),this.scene.environment=this.oceanPmremTarget.texture},updateOceanScene(t,e,i){if(!this.oceanRoot||!this.oceanWater||!this.oceanSky||!this.oceanMesh)return;this.oceanRoot.visible=!0,this.syncOceanSettings(e);const n=Math.max(.1,Number(e.speed)||.75),s=performance.now()*.001;this.oceanWater.material.uniforms.time.value+=i*n,this.oceanSky.material.uniforms.time.value=s,this.oceanMesh.position.y=Math.sin(s*n)*4+5,this.oceanMesh.rotation.x=s*.5*n,this.oceanMesh.rotation.z=s*.51*n,this.renderer&&(this.renderer.toneMapping=Lc,this.renderer.toneMappingExposure=e.ocExposure)},restoreRendererToneMapping(){this.renderer&&(this.renderer.toneMapping=this.baseRendererToneMapping??en,this.renderer.toneMappingExposure=this.baseRendererExposure??1)},createInstancingField(){const t=new Tt,e=[],i=[],n=[],s=[];for(let d=0;d[]},audioMetrics:{type:Object,default:()=>({active:!1,level:0,bass:0,mid:0,treble:0,pulse:0})},activeTab:{type:String,default:"LIVE"},morph:{type:Number,default:.5},settings:{type:Object,default:()=>Ir()}},data(){return{dragState:null,marchingResolution:28,marchingMaterialKey:"shiny",oceanSettingsKey:"",baseRendererToneMapping:null,baseRendererExposure:1}},created(){this.renderer=null,this.scene=null,this.camera=null,this.clock=null,this.rafId=null,this.resizeObserver=null,this.particleSystem=null,this.particleBase=null,this.haloMesh=null,this.beamMeshes=[],this.fogSprites=[],this.beamMap=null,this.mistMap=null,this.lfoGroups=[],this.fatLineRoot=null,this.fatLine=null,this.fatThresholdLine=null,this.fatSegments=null,this.fatThresholdSegments=null,this.marchingRoot=null,this.marchingEffect=null,this.marchingMaterials=null,this.oceanRoot=null,this.oceanSky=null,this.oceanWater=null,this.oceanMesh=null,this.oceanSun=null,this.oceanPmrem=null,this.oceanPmremTarget=null,this.oceanNormalsTexture=null,this.instancingRoot=null,this.instancingMesh=null,this.customLightsRoot=null,this.customLightsMaterial=null,this.customLightsLights=[],this.customLightsGlows=[],this.deforumBackdropMesh=null,this.deforumBackdropTexture=null,this.deforumBackdropUrl="",this.deforumBackdropOpacity=0,this.transitionComposer=null,this.transitionRenderPass=null,this.transitionTextures=[],this.transitionFxA=null,this.transitionFxB=null,this.transitionAnimPhase=0,this.transitionLastMix=-1,this.transitionRuntimeMix=.5,this.transitionCycleTextureIndex=0,this.protoplanetScene=null,this.protoplanetCamera=null,this.protoplanetParticles=null,this.protoplanetGpuCompute=null,this.protoplanetVelocityVariable=null,this.protoplanetPositionVariable=null,this.protoplanetVelocityUniforms=null,this.protoplanetParticleUniforms=null,this.protoplanetInitError=null,this.protoplanetStaticSignature="",this.protoplanetLastRestartSerial=-1,this.periodicScene=null,this.periodicCamera=null,this.periodicCss3dRenderer=null,this.periodicObjects=[],this.periodicTargets=null,this.periodicTweens=[],this.periodicLastLayout="",this.periodicLastSpacing=-1,this.periodicStyleKey="",this.periodicAutoCycleTimer=0,this.periodicAutoCycleLayoutIndex=0},mounted(){typeof window>"u"||(this.scheduleStartup(),typeof document<"u"&&(this._visibilityHandler=()=>{document.visibilityState==="visible"&&this.ensureRunning()},document.addEventListener("visibilitychange",this._visibilityHandler)))},beforeUnmount(){typeof document<"u"&&this._visibilityHandler&&document.removeEventListener("visibilitychange",this._visibilityHandler);const t=this.$refs.host;t&&this._onPointerMove&&t.removeEventListener("pointermove",this._onPointerMove),this.teardownScene()},methods:{scheduleStartup(){this.$nextTick(()=>{requestAnimationFrame(()=>this.startWhenReady())})},startWhenReady(t=0){const e=this.$refs.host;if(!e){t<90&&requestAnimationFrame(()=>this.startWhenReady(t+1));return}const i=e.clientWidth||0,n=e.clientHeight||0;if((i<2||n<2)&&t<90){requestAnimationFrame(()=>this.startWhenReady(t+1));return}this.renderer?this.ensureRunning():this.initScene()},ensureRunning(){if(!this.renderer||!this.scene||!this.camera||!this.clock){this.scheduleStartup();return}this.handleResize(),this.rafId==null&&this.animate()},createDeforumBackdrop(){if(!this.scene||this.deforumBackdropMesh)return;const t=new Zs(36,20),e=new Ws({color:16777215,transparent:!0,opacity:0,depthWrite:!1,side:Ki});this.deforumBackdropMesh=new Ut(t,e),this.deforumBackdropMesh.position.z=-14,this.deforumBackdropMesh.renderOrder=-200,this.deforumBackdropMesh.visible=!1,this.scene.add(this.deforumBackdropMesh)},updateDeforumBackdropOpacity(t){const e=$t(t);if(this.deforumBackdropOpacity=e,!this.deforumBackdropMesh)return;const i=this.deforumBackdropMesh.material;i.opacity=e,this.deforumBackdropMesh.visible=e>.001&&!!i.map},setDeforumBackdropFromUrl(t,{opacity:e=.35}={}){if(!t||!this.scene)return;this.deforumBackdropMesh||this.createDeforumBackdrop();const i=$t(e);if(this.deforumBackdropUrl===t&&this.deforumBackdropTexture){this.updateDeforumBackdropOpacity(i);return}new rd().load(t,s=>{s.colorSpace=Ti,this.deforumBackdropTexture&&this.deforumBackdropTexture.dispose(),this.deforumBackdropTexture=s,this.deforumBackdropUrl=t,this.deforumBackdropMesh.material.map=s,this.deforumBackdropMesh.material.needsUpdate=!0,this.updateDeforumBackdropOpacity(i)},void 0,()=>{})},clearDeforumBackdrop(){var t;this.deforumBackdropUrl="",this.updateDeforumBackdropOpacity(0),this.deforumBackdropTexture&&(this.deforumBackdropTexture.dispose(),this.deforumBackdropTexture=null),(t=this.deforumBackdropMesh)!=null&&t.material&&(this.deforumBackdropMesh.material.map=null)},initScene(){const t=this.$refs.host;if(!t)return;this.scene=new Ur,this.scene.fog=new Ch(329485,.045),this.clock=new oT,this.camera=new li(45,1,.1,100),this.camera.position.set(0,0,18),this.renderer=new Yy({antialias:!0,alpha:!0,powerPreference:"high-performance"}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,1.5)),this.renderer.setClearColor(0,0),this.renderer.outputColorSpace=Ti,this.baseRendererToneMapping=this.renderer.toneMapping,this.baseRendererExposure=this.renderer.toneMappingExposure,t.appendChild(this.renderer.domElement),this.scene.add(new Ec(16777215,.28));const e=new ad(9404671,2.1,60);e.position.set(6,5,14),this.scene.add(e);const i=new ad(3007231,1.35,60);i.position.set(-6,-4,12),this.scene.add(i);const n=new ad(16742615,1,50);n.position.set(0,-3,10),this.scene.add(n),this.beamMap=zk(),this.mistMap=Bk(.55,.12),this.createDeforumBackdrop(),this.createParticles(),this.createHalo(),this.createVolumeBeams(),this.createFogSprites(),this.createFatLines(),this.createMarchingField(),this.createOceanScene(),this.createInstancingField(),this.createInteractivePointsScene(),this.createInteractiveRaycastScene(),this.createLensflaresScene(),this.createTransitionPostprocess(),this.createProtoplanetScene(),this.createPeriodicTableScene(),this.createLfoGroups(),this.raycaster=new rT,this.bindPointerHandlers(),this.handleResize(),window.addEventListener("resize",this.handleResize),typeof ResizeObserver=="function"&&(this.resizeObserver=new ResizeObserver(()=>this.handleResize()),this.resizeObserver.observe(t)),this.animate()},createParticles(){const e=new Float32Array(3300);this.particleBase=new Float32Array(1100*3);for(let s=0;s<1100;s+=1){const r=5+Math.random()*15,l=Math.random()*Math.PI*2,o=Math.acos(2*Math.random()-1),u=r*Math.sin(o)*Math.cos(l),c=r*Math.sin(o)*Math.sin(l),h=(Math.random()-.5)*18;e[s*3]=u,e[s*3+1]=c,e[s*3+2]=h,this.particleBase[s*3]=u,this.particleBase[s*3+1]=c,this.particleBase[s*3+2]=h}const i=new Bt;i.setAttribute("position",new Qt(e,3));const n=new Dy({color:12175103,size:.085,transparent:!0,opacity:.42,blending:Gs,depthWrite:!1});this.particleSystem=new ed(i,n),this.scene.add(this.particleSystem)},createHalo(){const t=new Bl(4.6,2),e=new Us({color:8419583,emissive:3089008,shininess:70,transparent:!0,opacity:.08,wireframe:!0});this.haloMesh=new Ut(t,e),this.scene.add(this.haloMesh)},createVolumeBeams(){const t=new Zs(1,1,1,1);this.beamMeshes=Array.from({length:12}).map(()=>{const e=new Ws({map:this.beamMap,color:16777215,transparent:!0,opacity:.4,blending:Gs,depthWrite:!1,side:Ki}),i=new Ut(t,e);return i.visible=!1,this.scene.add(i),i})},createFogSprites(){this.fogSprites=Array.from({length:4}).map((t,e)=>{const i=new Ey({map:this.mistMap,color:new Ve().setHSL((.54+e*.08)%1,.72,.65),transparent:!0,opacity:.18,blending:Gs,depthWrite:!1}),n=new RP(i);return this.scene.add(n),n})},createFatLines(){const t=[],e=[],i=[];for(let h=-32;h<32;h+=1){const d=h/2.8;t.push(new B(d*Math.sin(1.8*d)*.72,d*.56,d*Math.cos(1.8*d)*.72))}const n=new BP(t),s=Math.max(96,Math.round(t.length*3.5)),r=new B,l=new Ve;for(let h=0;hnew Bh({color:16777215,linewidth:h?3:2.4,worldUnits:!0,vertexColors:!h,transparent:h,opacity:h?.18:.94,depthTest:!h,alphaToCoverage:!0});this.fatLineRoot=new Pn,this.fatLineRoot.visible=!1,this.scene.add(this.fatLineRoot),this.fatLine=new Pf(o,c()),this.fatLine.computeLineDistances(),this.fatLineRoot.add(this.fatLine),this.fatThresholdLine=new Pf(o,c({threshold:!0})),this.fatThresholdLine.computeLineDistances(),this.fatThresholdLine.visible=!1,this.fatLineRoot.add(this.fatThresholdLine),this.fatSegments=new Fc(u,c()),this.fatSegments.computeLineDistances(),this.fatSegments.visible=!1,this.fatLineRoot.add(this.fatSegments),this.fatThresholdSegments=new Fc(u,c({threshold:!0})),this.fatThresholdSegments.computeLineDistances(),this.fatThresholdSegments.visible=!1,this.fatLineRoot.add(this.fatThresholdSegments)},createMarchingMaterials(){return{shiny:new Jr({color:10686762,roughness:.12,metalness:.85,emissive:2491664}),chrome:new Jr({color:15199487,roughness:.06,metalness:1}),liquid:new WP({color:8050687,roughness:.04,transmission:.15,thickness:.8,metalness:.05}),matte:new Us({color:13089279,specular:2761035,shininess:12}),flat:new qP({color:10150911,flatShading:!0}),plastic:new Us({color:16777215,specular:12698049,shininess:220}),colors:new Us({color:16777215,specular:16777215,shininess:32,vertexColors:!0}),multiColors:new Us({color:16777215,specular:16777215,shininess:64,vertexColors:!0})}},createMarchingField(){this.marchingMaterials=this.createMarchingMaterials(),this.marchingRoot=new Pn,this.marchingRoot.visible=!1,this.scene.add(this.marchingRoot),this.marchingEffect=new dk(28,this.marchingMaterials.shiny,!1,!1,2e4),this.marchingEffect.position.set(0,0,0),this.marchingEffect.scale.set(8.2,8.2,8.2),this.marchingEffect.isolation=80,this.marchingRoot.add(this.marchingEffect),this.marchingResolution=28,this.marchingMaterialKey="shiny"},createOceanScene(){this.oceanRoot=new Pn,this.oceanRoot.visible=!1,this.scene.add(this.oceanRoot),this.oceanSun=new B;const t=new lu;t.scale.setScalar(1e4),this.oceanSky=t;const e=t.material.uniforms;e.turbidity.value=10,e.rayleigh.value=2,e.mieCoefficient.value=.005,e.mieDirectionalG.value=.8,this.oceanRoot.add(t);const i=new Ut(new xs(8,8,8),new Jr({color:15199487,roughness:0,metalness:.15}));i.position.set(0,5,0),this.oceanMesh=i,this.oceanRoot.add(i),this.oceanPmrem=new Lc(this.renderer),new rd().load("/textures/waternormals.jpg",s=>{if(!this.oceanRoot){s.dispose();return}s.wrapS=ea,s.wrapT=ea,this.oceanNormalsTexture=s;const r=new Zs(500,500,1,1);this.oceanWater=new hk(r,{textureWidth:512,textureHeight:512,waterNormals:s,sunDirection:new B,sunColor:16777215,waterColor:7695,distortionScale:3.7,fog:!1}),this.oceanWater.rotation.x=-Math.PI/2,this.oceanRoot.add(this.oceanWater),this.syncOceanSettings(this.resolvedSettings())})},oceanSettingsSignature(t){return[t.ocElevation,t.ocAzimuth,t.ocExposure,t.ocDistortion,t.ocSize,t.ocCloudCoverage,t.ocCloudDensity,t.ocCloudElevation].join("|")},syncOceanSettings(t){if(!this.oceanSky||!this.oceanWater)return;const e=this.oceanSettingsSignature(t);if(this.oceanSettingsKey===e)return;this.oceanSettingsKey=e;const i=Ol.degToRad(90-t.ocElevation),n=Ol.degToRad(t.ocAzimuth);this.oceanSun.setFromSphericalCoords(1,i,n);const s=this.oceanSky.material.uniforms;s.sunPosition.value.copy(this.oceanSun),s.cloudCoverage.value=t.ocCloudCoverage,s.cloudDensity.value=t.ocCloudDensity,s.cloudElevation.value=t.ocCloudElevation;const r=this.oceanWater.material.uniforms;r.sunDirection.value.copy(this.oceanSun).normalize(),r.distortionScale.value=t.ocDistortion,r.size.value=t.ocSize,this.oceanPmremTarget&&(this.oceanPmremTarget.dispose(),this.oceanPmremTarget=null);const l=new Ur;l.add(this.oceanSky),this.oceanPmremTarget=this.oceanPmrem.fromScene(l),this.oceanRoot.add(this.oceanSky),this.scene.environment=this.oceanPmremTarget.texture},updateOceanScene(t,e,i){if(!this.oceanRoot||!this.oceanWater||!this.oceanSky||!this.oceanMesh)return;this.oceanRoot.visible=!0,this.syncOceanSettings(e);const n=Math.max(.1,Number(e.speed)||.75),s=performance.now()*.001;this.oceanWater.material.uniforms.time.value+=i*n,this.oceanSky.material.uniforms.time.value=s,this.oceanMesh.position.y=Math.sin(s*n)*4+5,this.oceanMesh.rotation.x=s*.5*n,this.oceanMesh.rotation.z=s*.51*n,this.renderer&&(this.renderer.toneMapping=iu,this.renderer.toneMappingExposure=e.ocExposure)},restoreRendererToneMapping(){this.renderer&&(this.renderer.toneMapping=this.baseRendererToneMapping??on,this.renderer.toneMappingExposure=this.baseRendererExposure??1)},createInstancingField(){const t=new Et,e=[],i=[],n=[],s=[];for(let u=0;u{const o=new $t(s,new Os({color:l}));return this.customLightsRoot.add(o),o}),this.customLightsLights=[new V,new V,new V]},updateCustomLightsScene(t,e){if(!this.customLightsRoot||!this.customLightsMaterial)return;this.customLightsRoot.visible=!0;const i=t,n=.55+Jt(Number(e.spread)||.68)*.3,s=Math.max(.1,Number(e.speed)||.75),r=i*s,l=this.customLightsLights[0],o=this.customLightsLights[1],d=this.customLightsLights[2];l.set(Math.sin(r*.7)*n,Math.cos(r*.5)*n,Math.cos(r*.3)*n),o.set(Math.cos(r*.3)*n,Math.sin(r*.5)*n,Math.sin(r*.7)*n),d.set(Math.sin(r*.7)*n,Math.cos(r*.3)*n,Math.sin(r*.5)*n);const u=this.customLightsMaterial.uniforms;u.uL1.value.copy(l),u.uL2.value.copy(o),u.uL3.value.copy(d),u.uRadius.value=.85+Jt(Number(e.glow)||.78)*.55,this.customLightsGlows[0].position.copy(l),this.customLightsGlows[1].position.copy(o),this.customLightsGlows[2].position.copy(d),this.customLightsRoot.rotation.y=r*.1},createLfoGroups(){this.lfoGroups=Array.from({length:6}).map((t,e)=>{const i=zE(),n=new ze(i[e%i.length]),s=new vn,r=new $t(new Jc(.8,.08,16,72),new gr({color:n,emissive:n.clone().multiplyScalar(.55),transparent:!0,opacity:.5}));s.add(r);const l=new $t(new Nr(.22,20,20),new Os({color:n,transparent:!0,opacity:.95}));s.add(l);const o=new $t(new Nr(.58,18,18),new Os({color:n,transparent:!0,opacity:.14}));return s.add(o),s.userData={ring:r,core:l,aura:o,color:n},s.visible=!1,this.scene.add(s),s})},resolvedSettings(){const t={...uo(),...this.settings||{}};return{mode:["instancing","volume","orbital","nebula","raycast","marching","ocean","customlights"].includes(t.mode)?t.mode:"instancing",instCount:Zt(Math.round(Number(t.instCount)||uo().instCount),1e3,qd),beamCount:Zt(Math.round(Number(t.beamCount)||7),3,12),speed:Zt(Number(t.speed)||.75,.1,2.5),spread:Zt(Number(t.spread)||.68,.2,2.5),glow:Zt(Number(t.glow)||.78,.1,1.4),hue:Jt(t.hue==null?.6:Number(t.hue)),pulse:Jt(t.pulse==null?.36:Number(t.pulse)),drift:Jt(t.drift==null?.44:Number(t.drift)),mist:Jt(t.mist==null?.58:Number(t.mist)),orbit:Jt(t.orbit==null?.52:Number(t.orbit)),lineType:t.lineType==="line"?"line":"segments",lineWidth:Zt(Number(t.lineWidth)||2.4,1,10),lineThreshold:Zt(t.lineThreshold==null?.8:Number(t.lineThreshold),0,10),lineTranslation:Zt(t.lineTranslation==null?0:Number(t.lineTranslation),0,10),lineWorldUnits:t.lineWorldUnits!==!1,lineVisualizeThreshold:!!t.lineVisualizeThreshold,lineAlphaToCoverage:t.lineAlphaToCoverage!==!1,lineAnimate:t.lineAnimate!==!1,mcMaterial:["shiny","chrome","liquid","matte","flat","plastic","colors","multiColors"].includes(t.mcMaterial)?t.mcMaterial:"shiny",mcNumBlobs:Zt(Math.round(Number(t.mcNumBlobs)||10),1,50),mcResolution:Zt(Math.round(Number(t.mcResolution)||28),14,100),mcIsolation:Zt(Math.round(Number(t.mcIsolation)||80),10,300),mcFloor:t.mcFloor!==!1,mcWallX:!!t.mcWallX,mcWallZ:!!t.mcWallZ,ocElevation:Zt(Number(t.ocElevation)||2,0,90),ocAzimuth:Zt(Number(t.ocAzimuth)||180,-180,180),ocExposure:Zt(Number(t.ocExposure)||.1,0,1),ocDistortion:Zt(Number(t.ocDistortion)||3.7,0,8),ocSize:Zt(Number(t.ocSize)||1,.1,10),ocCloudCoverage:Jt(t.ocCloudCoverage==null?.4:Number(t.ocCloudCoverage)),ocCloudDensity:Jt(t.ocCloudDensity==null?.5:Number(t.ocCloudDensity)),ocCloudElevation:Jt(t.ocCloudElevation==null?.5:Number(t.ocCloudElevation))}},handleResize(){if(!this.renderer||!this.camera||!this.$refs.host)return;const t=Math.max(1,this.$refs.host.clientWidth||0),e=Math.max(1,this.$refs.host.clientHeight||0);this.camera.aspect=t/e,this.camera.updateProjectionMatrix(),this.renderer.setSize(t,e,!1)},shapeSample(t,e){const i=e%(Math.PI*2);return t==="Square"?Math.sin(i)>=0?1:-1:t==="Saw"?i/Math.PI-1:t==="Triangle"?2*Math.asin(Math.sin(i))/Math.PI:Math.sin(i)},updateParticles(t,e,i){if(!this.particleSystem||!this.particleBase)return;const n=this.particleSystem.geometry.getAttribute("position"),s=n.array,r=.08+e*.5+i*.25;for(let l=0;l{if(d.visible=u{s.visible=!0;const l=t*(.08+n.speed*.08)+r*1.3,o=1.4+n.spread*2.2+r*.35,d=-4+r*1.35,u=5+n.glow*7+i*2+r*1.3,h=(n.hue+r*.06+t*.01)%1;s.position.set(Math.cos(l)*o,Math.sin(l*1.2)*(1.4+n.drift*1.8),d),s.scale.setScalar(u),s.material.color.setHSL(h,.78,.64),s.material.opacity=.06+n.glow*.08+e*.08})},updateRaycastLines(t,e,i,n){if(!this.fatLineRoot||!this.fatLine||!this.fatSegments||!this.fatThresholdLine||!this.fatThresholdSegments)return;const s=n.lineType==="line",r=n.lineWidth+n.lineThreshold,l=n.lineTranslation-5;this.fatLineRoot.visible=!0,this.fatLineRoot.position.set(l,0,0),this.fatLineRoot.rotation.y=n.lineAnimate?t*.18:.65,this.fatLineRoot.rotation.x=n.lineAnimate?Math.sin(t*.17)*.14:-.16,this.fatLineRoot.rotation.z=n.lineAnimate?Math.cos(t*.11)*.06:0,this.fatLine.visible=s,this.fatSegments.visible=!s,this.fatThresholdLine.visible=n.lineVisualizeThreshold&&s,this.fatThresholdSegments.visible=n.lineVisualizeThreshold&&!s,[this.fatLine.material,this.fatSegments.material].forEach(o=>{o.worldUnits=n.lineWorldUnits,o.linewidth=n.lineWidth,o.alphaToCoverage=n.lineAlphaToCoverage,o.opacity=.88+e*.08+i*.04,o.needsUpdate=!0}),[this.fatThresholdLine.material,this.fatThresholdSegments.material].forEach(o=>{o.worldUnits=n.lineWorldUnits,o.linewidth=r,o.alphaToCoverage=n.lineAlphaToCoverage,o.opacity=.12+e*.06,o.visible=n.lineVisualizeThreshold,o.needsUpdate=!0})},updateMarchingField(t,e){if(!this.marchingRoot||!this.marchingEffect||!this.marchingMaterials)return;const i=this.marchingMaterials[e.mcMaterial]||this.marchingMaterials.shiny;(this.marchingMaterialKey!==e.mcMaterial||this.marchingEffect.material!==i)&&(this.marchingEffect.material=i,this.marchingMaterialKey=e.mcMaterial),this.marchingEffect.enableColors!==["colors","multiColors"].includes(e.mcMaterial)&&(this.marchingEffect.enableColors=["colors","multiColors"].includes(e.mcMaterial)),this.marchingEffect.enableUvs&&(this.marchingEffect.enableUvs=!1),this.marchingResolution!==e.mcResolution&&(this.marchingEffect.init(Math.floor(e.mcResolution)),this.marchingResolution=e.mcResolution),this.marchingEffect.isolation!==e.mcIsolation&&(this.marchingEffect.isolation=e.mcIsolation),this.marchingRoot.visible=!0,this.marchingRoot.rotation.y=t*.18,this.marchingRoot.rotation.x=Math.sin(t*.11)*.08,this.marchingEffect.reset();const n=HE(),s=1.2/((Math.sqrt(e.mcNumBlobs)-1)/4+1),r=12,l=t*e.speed*.5;for(let o=0;o{const d=r[o],u=!!(d&&d.on);if(l.visible=u,!u)return;const h=Math.max(.1,Number(d.speed)||1),c=Jt(d.depth==null?.2:d.depth),f=Number(d.phase)||0,g=t*(.35+h*.25),y=f+g,T=2.4+o*.78+c*1.6+e*.35,_=this.shapeSample(d.shape,y)*(.35+c*1.2+s*.25);l.position.set(Math.cos(y+o*.65)*T*.88,_+Math.sin(y*.45)*(.25+i*.2),Math.sin(y*.8+o)*(1.1+n*1.1)),l.rotation.x+=.005+h*.0025,l.rotation.y+=.008+h*.003,l.rotation.z=y*.75;const{ring:v,core:S,aura:w,color:x}=l.userData,k=.75+c*1.8+e*.6,E=.65+c*.8+i*.9,D=1.15+c*1.4+s*.8;v.scale.setScalar(k),S.scale.setScalar(E),w.scale.setScalar(D),v.material.opacity=.28+c*.35+e*.2,w.material.opacity=.08+e*.18+s*.1,S.material.opacity=.7+i*.25,v.material.emissive.copy(x).multiplyScalar(.4+e*.8)})},updateCamera(t,e){if(this.camera){if(e.mode==="raycast")this.camera.position.set(-18+Math.sin(t*.12)*2.5,0,30);else if(e.mode==="marching")this.camera.position.set(-14,12,26);else if(e.mode==="ocean"){this.camera.position.set(24+Math.sin(t*.08)*2,16+Math.cos(t*.06)*1.5,38),this.camera.lookAt(0,6,0);return}else if(e.mode==="interactive_points"){this.camera.position.set(0,0,12+e.orbit*4),this.camera.lookAt(0,0,0);return}else if(e.mode==="interactive_raycast_points"){this._raycastCameraSeeded||(this.camera.position.set(8,8,8),this.camera.lookAt(0,0,0),this._raycastCameraSeeded=!0);return}else if(e.mode==="lensflares"){const i=t*(.05+e.speed*.08),n=18+e.orbit*4;this.camera.position.set(Math.cos(i)*n,6+Math.sin(t*.12)*2,Math.sin(i)*n),this.camera.lookAt(0,0,0);return}else if(e.mode==="instancing"){this.camera.fov!==50&&(this.camera.fov=50,this.camera.near=.5,this.camera.far=20,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,3.2+e.orbit*.8),this.camera.lookAt(0,0,0);return}else if(e.mode==="customlights"){this.camera.fov!==70&&(this.camera.fov=70,this.camera.near=.1,this.camera.far=10,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,1.5),this.camera.lookAt(0,0,0);return}else this.camera.fov!==45&&(this.camera.fov=45,this.camera.near=.1,this.camera.far=100,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,18-e.orbit*2);this.camera.lookAt(0,0,0)}},animate(){if(!this.renderer||!this.scene||!this.camera||!this.clock)return;const t=()=>{var S;const e=this.clock.getElapsedTime(),i=this.audioMetrics||{},n=Jt(i.level),s=Jt(i.bass),r=Jt(i.mid),l=Jt(i.treble),o=Jt(i.pulse),d=Jt(this.morph),u=this.resolvedSettings(),h=this.activeTab==="LIVE"?1:.65,c=u.mode==="raycast",f=u.mode==="marching",g=u.mode==="ocean",y=u.mode==="instancing",T=u.mode==="customlights",_=c||f||g||y||T,v=this.clock.getDelta();if((S=this.scene)!=null&&S.fog&&(this.scene.fog.density=y||T?0:.045),this.particleSystem&&(this.particleSystem.visible=!_),this.haloMesh&&(this.haloMesh.visible=!_),this.beamMeshes.forEach(w=>{w.visible=!_&&w.visible}),this.fogSprites.forEach(w=>{w.visible=!_}),T?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.initCustomLightsScene(),this.updateCustomLightsScene(e,u)):this.customLightsRoot&&(this.customLightsRoot.visible=!1),c?(this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.customLightsRoot&&(this.customLightsRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateRaycastLines(e,n*h,s,u)):f?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateMarchingField(e,u)):g?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateOceanScene(e,u,v)):y?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateInstancingScene(e,u,n*h)):interactivePointsMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateInteractivePoints(e,u,n*h)):interactiveRaycastMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateInteractiveRaycastPoints(e,u,v,n*h)):lensflaresMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lfoGroups.forEach(w=>{w.visible=!1}),this.updateLensflares(e,u)):(this.instancingRoot&&(this.instancingRoot.visible=!1),this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.applyLensflareSceneStyle(!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.updateParticles(e,n*h,o),this.updateHalo(e,n*h,s,d,u),this.updateVolumeBeams(e,n*h,s,l,u),this.updateFogSprites(e,n*h,o,u),this.updateLfoGroups(e,n*h,s,r,l)),this.updateCamera(e,u),this.$refs.host){const w=this.$refs.host.clientWidth||0,x=this.$refs.host.clientHeight||0,k=this.renderer.domElement;w>=2&&x>=2&&k&&(k.width<2||k.height<2)&&this.handleResize()}this.renderer.render(this.scene,this.camera),this.rafId=requestAnimationFrame(t)};this.rafId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(t)},teardownScene(){if(typeof window<"u"&&window.removeEventListener("resize",this.handleResize),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.rafId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this.rafId),this.rafId=null,this.scene&&this.scene.traverse(t=>{t.geometry&&typeof t.geometry.dispose=="function"&&t.geometry.dispose(),t.material&&(Array.isArray(t.material)?t.material:[t.material]).forEach(i=>{i&&typeof i.dispose=="function"&&i.dispose()})}),this.renderer){this.renderer.dispose();const t=this.renderer.domElement;t&&t.parentNode&&t.parentNode.removeChild(t)}this.beamMap&&this.beamMap.dispose(),this.mistMap&&this.mistMap.dispose(),this.marchingMaterials&&Object.values(this.marchingMaterials).forEach(t=>{t&&typeof t.dispose=="function"&&t.dispose()}),this.oceanPmremTarget&&this.oceanPmremTarget.dispose(),this.oceanPmrem&&this.oceanPmrem.dispose(),this.oceanNormalsTexture&&this.oceanNormalsTexture.dispose(),this.oceanWater&&(this.oceanWater.geometry&&this.oceanWater.geometry.dispose(),this.oceanWater.material&&this.oceanWater.material.dispose()),this.oceanSky&&this.oceanSky.material&&this.oceanSky.material.dispose(),this.oceanMesh&&(this.oceanMesh.geometry&&this.oceanMesh.geometry.dispose(),this.oceanMesh.material&&this.oceanMesh.material.dispose()),this.instancingMesh&&(this.instancingMesh.geometry&&this.instancingMesh.geometry.dispose(),this.instancingMesh.material&&this.instancingMesh.material.dispose()),this.deforumBackdropTexture&&this.deforumBackdropTexture.dispose(),this.deforumBackdropMesh&&(this.deforumBackdropMesh.geometry&&this.deforumBackdropMesh.geometry.dispose(),this.deforumBackdropMesh.material&&this.deforumBackdropMesh.material.dispose()),this.renderer=null,this.scene=null,this.camera=null,this.clock=null,this.particleSystem=null,this.particleBase=null,this.haloMesh=null,this.beamMeshes=[],this.fogSprites=[],this.beamMap=null,this.mistMap=null,this.lfoGroups=[],this.fatLineRoot=null,this.fatLine=null,this.fatThresholdLine=null,this.fatSegments=null,this.fatThresholdSegments=null,this.marchingRoot=null,this.marchingEffect=null,this.marchingMaterials=null,this.marchingResolution=28,this.marchingMaterialKey="shiny",this.oceanRoot=null,this.oceanSky=null,this.oceanWater=null,this.oceanMesh=null,this.oceanSun=null,this.oceanPmrem=null,this.oceanPmremTarget=null,this.oceanNormalsTexture=null,this.oceanSettingsKey="",this.instancingRoot=null,this.instancingMesh=null,this.deforumBackdropMesh=null,this.deforumBackdropTexture=null,this.deforumBackdropUrl="",this.deforumBackdropOpacity=0}}},XE={ref:"host",class:"three-background"};function KE(t,e,i,n,s,r){return m(),p("div",XE,null,512)}const YE=nt(jE,[["render",KE],["__scopeId","data-v-6dbfbc00"]]),JE={name:"LiveView",props:{app:{type:Object,required:!0}},setup(t){return Et(t)},methods:{openDeforumParameters(){this.liveEngineDrawerOpen=!0,this.promoteToDeforum(),this.paramPanelOpen=!0,this.saveSessionState()},openEngineWebglLayer(){this.liveEngineDrawerOpen=!0,this.selectVideoLayer("webgl"),this.saveSessionState()}}},ZE={class:"live-view","data-testid":"live-view"},QE={class:"live-view__scroll"},eC={class:"framesync-panel live-view__summary","data-testid":"live-context-summary"},tC={class:"live-view__summary-grid"},iC={class:"live-view__summary-row"},nC={class:"live-view__summary-value"},sC={class:"live-view__summary-row"},rC={class:"live-view__summary-value"},oC={key:0,class:"live-view__summary-row"},aC={class:"live-view__summary-value"},lC={key:0,class:"live-view__param-list"},dC={class:"live-view__param-list-meta"},uC={key:1,class:"framesync-subtitle live-view__summary-empty"},cC={class:"framesync-panel live-view__shortcuts"},hC={class:"live-view__shortcut-actions"};function fC(t,e,i,n,s,r){return m(),p("div",ZE,[a("div",QE,[a("div",eC,[e[6]||(e[6]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Live "),a("span",{class:"framesync-accent"},"summary")])],-1)),a("div",tC,[a("div",iC,[e[3]||(e[3]=a("span",{class:"framesync-subtitle"},"Preview layer",-1)),a("strong",nC,b(t.liveActiveLayerLabel),1)]),a("div",sC,[e[4]||(e[4]=a("span",{class:"framesync-subtitle"},"Deforum",-1)),a("strong",rC,b(t.deforumPlaying?"Animating":"Ready"),1)]),t.prompts&&t.prompts.morphOn?(m(),p("div",oC,[e[5]||(e[5]=a("span",{class:"framesync-subtitle"},"Morph",-1)),a("strong",aC," A "+b(Math.round((1-t.performance.crossfader)*100))+"% · B "+b(Math.round(t.performance.crossfader*100))+"% ",1)])):N("",!0)]),t.liveContextSummaryParams.length?(m(),p("ul",lC,[(m(!0),p(H,null,oe(t.liveContextSummaryParams,l=>(m(),p("li",{key:"live-sum-"+l.key,class:"live-view__param-list-item"},[a("span",null,b(l.label),1),a("span",dC,b(l.source)+" · "+b(Number(l.val).toFixed(2)),1)]))),128))])):(m(),p("p",uC," Pin parameters from the panel below, or route LFO / audio in Modulation. "))]),a("div",cC,[e[7]||(e[7]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Engine "),a("span",{class:"framesync-accent"},"shortcuts")])],-1)),e[8]||(e[8]=a("p",{class:"framesync-subtitle live-view__shortcuts-copy"}," Full Deforum schedules (sampler, ControlNet, motion strings) live in the Engine drawer. ",-1)),a("div",hC,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"live-open-deforum-parameters",onClick:e[0]||(e[0]=(...l)=>r.openDeforumParameters&&r.openDeforumParameters(...l))}," Deforum settings "),a("button",{type:"button",class:"framesync-button","data-testid":"live-open-deforum-prompts",onClick:e[1]||(e[1]=l=>t.openEngineDeforumSettingsTab("prompts"))}," Prompt schedules "),a("button",{type:"button",class:"framesync-button","data-testid":"live-open-engine-webgl",onClick:e[2]||(e[2]=(...l)=>r.openEngineWebglLayer&&r.openEngineWebglLayer(...l))}," WebGL visual ")])])])])}const mC=nt(JE,[["render",fC]]),pC=[{id:"webgl",label:"WebGL",layerKind:"webgl",layerId:"webgl",backend:"webgl",builtin:!0,mixable:!0,panel:"WebGLPluginPanel"},{id:"deforum",label:"Deforum",layerKind:"deforum",layerId:"deforum",backend:"forge-deforum",builtin:!0,mixable:!0,panel:"DeforumPluginPanel"},{id:"wan",label:"WAN Video",layerKind:"wan",layerId:"wan",backend:"forge-wan",builtin:!0,mixable:!0,panel:"WanPluginPanel"},{id:"animatelcm",label:"AnimateLCM",layerKind:"animatelcm",layerId:"animatelcm",backend:"forge-animatelcm",builtin:!0,mixable:!0,panel:"AnimateLcmPluginPanel"}];function gC(t){return pC.find(e=>e.id===t)||null}const yC={name:"CommonVisualStrip",props:{app:{type:Object,required:!0},pluginId:{type:String,default:""}},setup(t){return Et(t)},computed:{resolvedPluginId(){return this.pluginId||this.activeAnimationPluginId||""},resolvedPlugin(){return gC(this.resolvedPluginId)},stripItems(){return this.commonVisualItemsForPlugin(this.resolvedPluginId)}}},vC={class:"common-visual-strip","data-testid":"common-visual-strip"},bC={class:"deforum-control-panel__section-head"},_C={key:0,class:"common-visual-strip__plugin"},SC={class:"deforum-macro-knobs__grid"},wC=["data-testid"],MC={class:"deforum-macro-knob__label"},PC=["min","max","step","value","disabled","onInput"],xC={class:"deforum-macro-knob__readout"};function TC(t,e,i,n,s,r){return m(),p("section",vC,[a("div",bC,[e[0]||(e[0]=a("span",{class:"framesync-subtitle deforum-control-panel__section-title"},"Common visuals",-1)),r.resolvedPlugin?(m(),p("span",_C,b(r.resolvedPlugin.label),1)):N("",!0)]),a("div",SC,[(m(!0),p(H,null,oe(r.stripItems,l=>(m(),p("label",{key:"common-visual-"+l.paramId,class:B(["deforum-macro-knob",{"deforum-macro-knob--disabled":l.disabled}]),"data-testid":"common-visual-"+l.paramId},[a("span",MC,b(l.label),1),a("input",{type:"range",class:"framesync-input deforum-macro-knob__input",min:l.min,max:l.max,step:l.step,value:l.value,disabled:l.disabled,onInput:o=>t.onCommonVisualInput(l.paramId,o.target.value,r.resolvedPluginId)},null,40,PC),a("code",xC,b(l.readout),1)],10,wC))),128))])])}const AC=nt(yC,[["render",TC]]),EC={name:"PresetSelectorBar",props:{app:{type:Object,default:null}},setup(t){const e=kr("deforaApp",null),i=t.app||e;return Et({app:i})},mounted(){this.availablePresets.length||this.refreshPresets()},methods:{onPresetChange(t){t&&this.loadPreset(t)}}},CC={class:"preset-selector-bar","data-testid":"preset-selector-bar"},kC={class:"preset-selector-bar__row"},LC=["value"],RC=["value"],DC=["disabled"],IC={key:0,class:"framesync-subtitle preset-selector-bar__status"};function FC(t,e,i,n,s,r){return m(),p("div",CC,[e[5]||(e[5]=a("div",{class:"framesync-subtitle preset-selector-bar__label"},"Preset",-1)),a("div",kC,[a("select",{class:"framesync-select preset-selector-bar__select","data-testid":"preset-select",value:t.currentPreset||"",onChange:e[0]||(e[0]=l=>r.onPresetChange(l.target.value))},[e[4]||(e[4]=a("option",{value:""},"— select —",-1)),(m(!0),p(H,null,oe(t.availablePresets,l=>(m(),p("option",{key:"preset-opt-"+l,value:l},b(l),9,RC))),128))],40,LC),J(a("input",{class:"framesync-input preset-selector-bar__name","data-testid":"preset-name-input","onUpdate:modelValue":e[1]||(e[1]=l=>t.newPresetName=l),placeholder:"New name"},null,512),[[ye,t.newPresetName]]),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"preset-add",title:"Save current state as preset",onClick:e[2]||(e[2]=(...l)=>t.saveCurrentPreset&&t.saveCurrentPreset(...l))}," + Add "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--danger","data-testid":"preset-delete",title:"Delete selected preset",disabled:!t.currentPreset,onClick:e[3]||(e[3]=l=>t.deletePreset(t.currentPreset))}," Delete ",8,DC)]),t.presetStatus?(m(),p("div",IC,b(t.presetStatus),1)):N("",!0)])}const NC=nt(EC,[["render",FC]]),OC={name:"LiveEngineControls",components:{PresetSelectorBar:NC},props:{app:{type:Object,default:null},compact:{type:Boolean,default:!1},forceWebgl:{type:Boolean,default:!1},forcePerformance:{type:Boolean,default:!1},showCompositor:{type:Boolean,default:!0},showWebgl:{type:Boolean,default:!0}},setup(t){const e=kr("deforaApp",null),i=t.app||e;return Et({app:i,compact:t.compact,forceWebgl:t.forceWebgl,forcePerformance:t.forcePerformance,showCompositor:t.showCompositor,showWebgl:t.showWebgl})}},UC={key:1,class:"live-engine-controls__section live-engine-controls__section--compositor","data-testid":"preview-compositor-controls"},BC={class:"live-engine-controls__toggle"},VC=["checked"],zC={class:"live-engine-controls__toggle"},$C=["checked"],GC={class:"slider-row"},HC={class:"live-engine-controls__compositor-row","data-testid":"compositor-lfo-links"},WC=["data-testid","onClick"],qC={key:2,class:"live-engine-controls__section live-engine-controls__section--webgl","data-testid":"live-webgl-controls"},jC={class:"live-engine-controls__section-head"},XC=["value"],KC={class:"slider-row"},YC={class:"slider-row"},JC={class:"slider-row"},ZC={class:"slider-row"},QC={class:"slider-row"},ek={class:"slider-row"},tk={class:"slider-row"},ik={class:"slider-row"},nk={class:"slider-row"},sk={key:2,class:"slider-row"},rk={key:3,class:"slider-row"},ok={key:4,class:"slider-row"},ak={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},lk={class:"slider-row"},dk={class:"slider-row"},uk={class:"slider-row"},ck={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},hk={class:"chips"},fk={key:2,class:"framesync-stack",style:{"margin-top":"10px"}},mk={class:"chips"},pk={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},gk={class:"slider-row"},yk={class:"slider-row"},vk={class:"slider-row"},bk={class:"slider-row"},_k={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},Sk={class:"chips"},wk={class:"slider-row"},Mk={class:"slider-row"},Pk={class:"slider-row"},xk={class:"slider-row"},Tk={class:"slider-row"},Ak={key:0,class:"slider-row"},Ek={key:1,class:"slider-row"},Ck={key:2,class:"slider-row"},kk={class:"slider-row"},Lk={class:"slider-row"},Rk={class:"slider-row"},Dk={class:"slider-row"},Ik={class:"slider-row"},Fk={class:"slider-row"},Nk={key:3,class:"live-engine-controls__section live-engine-controls__section--composite","data-testid":"forge-overlay-controls"},Ok={class:"slider-row"};function Uk(t,e,i,n,s,r){const l=Ne("PresetSelectorBar");return m(),p("div",{class:B(["live-engine-controls",{"live-engine-controls--compact":i.compact}]),"data-testid":"live-engine-controls"},[i.showWebgl&&!i.compact?(m(),at(l,{key:0,app:i.app},null,8,["app"])):N("",!0),i.showCompositor?(m(),p("div",UC,[e[92]||(e[92]=a("div",{class:"live-engine-controls__section-head"},[a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"Preview compositor")],-1)),a("label",BC,[a("input",{type:"checkbox",checked:t.defaultAnimation.autoTransitionToDeforum!==!1,"data-testid":"auto-transition-deforum",onChange:e[0]||(e[0]=o=>{t.defaultAnimation.autoTransitionToDeforum=o.target.checked,t.onDefaultAnimationInput()})},null,40,VC),e[88]||(e[88]=a("span",null,"Auto-switch to Deforum when frames arrive",-1))]),a("label",zC,[a("input",{type:"checkbox",checked:!!t.defaultAnimation.rememberCompositorLayerOnStartup,"data-testid":"remember-compositor-layer",onChange:e[1]||(e[1]=o=>{t.defaultAnimation.rememberCompositorLayerOnStartup=o.target.checked,t.onDefaultAnimationInput()})},null,40,$C),e[89]||(e[89]=a("span",null,"Remember last preview layer on reload",-1))]),a("div",GC,[e[90]||(e[90]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Crossfade duration",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"5000",step:"50","onUpdate:modelValue":e[2]||(e[2]=o=>t.defaultAnimation.previewCompositorCrossfadeMs=o),"data-testid":"preview-compositor-crossfade-ms",onInput:e[3]||(e[3]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.previewCompositorCrossfadeMs,void 0,{number:!0}]])]),t.defaultAnimation.autoTransitionToDeforum===!1?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact","data-testid":"promote-to-deforum",onClick:e[4]||(e[4]=o=>t.promoteToDeforum())}," Promote to Deforum now ")):N("",!0),a("div",HC,[e[91]||(e[91]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge mix LFO",-1)),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{active:!t.defaultAnimation.forgeLayerOpacityLfoLink}]),onClick:e[5]||(e[5]=o=>t.setForgeLayerOpacityLfoLink(null))}," Manual ",2),(m(!0),p(H,null,oe(t.lfos.slice(0,6),o=>(m(),p("button",{key:"compositor-lfo-"+o.id,type:"button",class:B(["framesync-button framesync-button--compact",{active:t.defaultAnimation.forgeLayerOpacityLfoLink===o.id}]),"data-testid":"compositor-lfo-link-"+o.id,onClick:d=>t.setForgeLayerOpacityLfoLink(o.id)},b("LFO "+o.id),11,WC))),128))]),e[93]||(e[93]=a("p",{class:"framesync-subtitle live-engine-controls__hint"}," LFO modulates forge opacity on WebGL + Deforum (Both). Use MODULATION to route audio into LFO depth. ",-1))])):N("",!0),i.showWebgl&&(i.forceWebgl||!i.forcePerformance&&(t.isWebglLayerActive||t.isBlendLayerActive))?(m(),p("div",qC,[a("div",jC,[e[94]||(e[94]=a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"WebGL visual",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"reset-webgl-visual",onClick:e[6]||(e[6]=(...o)=>t.resetDefaultAnimationSettings&&t.resetDefaultAnimationSettings(...o))}," ↺ Reset visual ")]),a("div",{class:"framesync-stack",style:Mt(i.compact?"margin-top:6px;":"margin-top:10px;")},[e[96]||(e[96]=a("div",{class:"framesync-subtitle"},"Animation style",-1)),a("select",{class:"framesync-select",value:t.defaultAnimation.mode,onChange:e[7]||(e[7]=o=>t.setDefaultAnimationMode(o.target.value))},[...e[95]||(e[95]=[Bi('',8)])],40,XC)],4),t.defaultAnimation.mode==="instancing"?(m(),p(H,{key:0},[a("div",KC,[e[97]||(e[97]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Instance count",-1)),J(a("input",{class:"framesync-input",type:"range",min:"1000",max:"50000",step:"500","onUpdate:modelValue":e[8]||(e[8]=o=>t.defaultAnimation.instCount=o),onInput:e[9]||(e[9]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.instCount,void 0,{number:!0}]])]),a("div",YC,[e[98]||(e[98]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Spread",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"2.5",step:"0.01","onUpdate:modelValue":e[10]||(e[10]=o=>t.defaultAnimation.spread=o),onInput:e[11]||(e[11]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.spread,void 0,{number:!0}]])]),a("div",JC,[e[99]||(e[99]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Motion rate",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[12]||(e[12]=o=>t.defaultAnimation.speed=o),onInput:e[13]||(e[13]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",ZC,[e[100]||(e[100]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Color shift",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[14]||(e[14]=o=>t.defaultAnimation.hue=o),onInput:e[15]||(e[15]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.hue,void 0,{number:!0}]])]),a("div",QC,[e[101]||(e[101]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Shimmer",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[16]||(e[16]=o=>t.defaultAnimation.glow=o),onInput:e[17]||(e[17]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",ek,[e[102]||(e[102]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera depth",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[18]||(e[18]=o=>t.defaultAnimation.orbit=o),onInput:e[19]||(e[19]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.orbit,void 0,{number:!0}]])])],64)):t.defaultAnimation.mode==="customlights"?(m(),p(H,{key:1},[a("div",tk,[e[103]||(e[103]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[20]||(e[20]=o=>t.defaultAnimation.speed=o),onInput:e[21]||(e[21]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",ik,[e[104]||(e[104]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Light radius",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[22]||(e[22]=o=>t.defaultAnimation.glow=o),onInput:e[23]||(e[23]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",nk,[e[105]||(e[105]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Orbit spread",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"2.5",step:"0.01","onUpdate:modelValue":e[24]||(e[24]=o=>t.defaultAnimation.spread=o),onInput:e[25]||(e[25]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.spread,void 0,{number:!0}]])])],64)):t.defaultAnimation.mode==="volume"?(m(),p("div",sk,[e[106]||(e[106]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Beam count",-1)),J(a("input",{class:"framesync-input",type:"range",min:"3",max:"12",step:"1","onUpdate:modelValue":e[26]||(e[26]=o=>t.defaultAnimation.beamCount=o),onInput:e[27]||(e[27]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.beamCount,void 0,{number:!0}]])])):t.defaultAnimation.mode==="orbital"?(m(),p("div",rk,[e[107]||(e[107]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Orbit size",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.0",step:"0.01","onUpdate:modelValue":e[28]||(e[28]=o=>t.defaultAnimation.orbit=o),onInput:e[29]||(e[29]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.orbit,void 0,{number:!0}]])])):t.defaultAnimation.mode==="nebula"?(m(),p("div",ok,[e[108]||(e[108]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Mist",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[30]||(e[30]=o=>t.defaultAnimation.mist=o),onInput:e[31]||(e[31]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.mist,void 0,{number:!0}]])])):t.defaultAnimation.mode==="raycast"?(m(),p(H,{key:5},[i.compact?N("",!0):(m(),p("div",ak,[e[110]||(e[110]=a("div",{class:"framesync-subtitle"},"Line type",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[32]||(e[32]=o=>t.defaultAnimation.lineType=o),onChange:e[33]||(e[33]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},[...e[109]||(e[109]=[a("option",{value:"segments"},"LineSegmentsGeometry",-1),a("option",{value:"line"},"LineGeometry",-1)])],544),[[Dt,t.defaultAnimation.lineType]])])),a("div",lk,[e[111]||(e[111]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Width",-1)),J(a("input",{class:"framesync-input",type:"range",min:"1",max:"10",step:"0.1","onUpdate:modelValue":e[34]||(e[34]=o=>t.defaultAnimation.lineWidth=o),onInput:e[35]||(e[35]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.lineWidth,void 0,{number:!0}]])]),a("div",dk,[e[112]||(e[112]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Threshold",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"10",step:"0.1","onUpdate:modelValue":e[36]||(e[36]=o=>t.defaultAnimation.lineThreshold=o),onInput:e[37]||(e[37]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.lineThreshold,void 0,{number:!0}]])]),a("div",uk,[e[113]||(e[113]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Translation",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"10",step:"0.1","onUpdate:modelValue":e[38]||(e[38]=o=>t.defaultAnimation.lineTranslation=o),onInput:e[39]||(e[39]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.lineTranslation,void 0,{number:!0}]])]),i.compact?N("",!0):(m(),p("div",ck,[e[114]||(e[114]=a("div",{class:"framesync-subtitle"},"Line material",-1)),a("div",hk,[a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.lineWorldUnits}]),onClick:e[40]||(e[40]=o=>{t.defaultAnimation.lineWorldUnits=!0,t.onDefaultAnimationInput()})},"World units",2),a("button",{type:"button",class:B(["chip",{active:!t.defaultAnimation.lineWorldUnits}]),onClick:e[41]||(e[41]=o=>{t.defaultAnimation.lineWorldUnits=!1,t.onDefaultAnimationInput()})},"Pixels",2),a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.lineAlphaToCoverage}]),onClick:e[42]||(e[42]=o=>{t.defaultAnimation.lineAlphaToCoverage=!t.defaultAnimation.lineAlphaToCoverage,t.onDefaultAnimationInput()})},"Alpha coverage",2)])])),i.compact?N("",!0):(m(),p("div",fk,[e[115]||(e[115]=a("div",{class:"framesync-subtitle"},"Behavior",-1)),a("div",mk,[a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.lineVisualizeThreshold}]),onClick:e[43]||(e[43]=o=>{t.defaultAnimation.lineVisualizeThreshold=!t.defaultAnimation.lineVisualizeThreshold,t.onDefaultAnimationInput()})},"Visualize threshold",2),a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.lineAnimate}]),onClick:e[44]||(e[44]=o=>{t.defaultAnimation.lineAnimate=!t.defaultAnimation.lineAnimate,t.onDefaultAnimationInput()})},"Animate",2)])]))],64)):t.defaultAnimation.mode==="marching"?(m(),p(H,{key:6},[i.compact?N("",!0):(m(),p("div",pk,[e[117]||(e[117]=a("div",{class:"framesync-subtitle"},"Material",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[45]||(e[45]=o=>t.defaultAnimation.mcMaterial=o),onChange:e[46]||(e[46]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},[...e[116]||(e[116]=[Bi('',8)])],544),[[Dt,t.defaultAnimation.mcMaterial]])])),a("div",gk,[e[118]||(e[118]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"8",step:"0.05","onUpdate:modelValue":e[47]||(e[47]=o=>t.defaultAnimation.speed=o),onInput:e[48]||(e[48]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",yk,[e[119]||(e[119]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Blob count",-1)),J(a("input",{class:"framesync-input",type:"range",min:"1",max:"50",step:"1","onUpdate:modelValue":e[49]||(e[49]=o=>t.defaultAnimation.mcNumBlobs=o),onInput:e[50]||(e[50]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.mcNumBlobs,void 0,{number:!0}]])]),a("div",vk,[e[120]||(e[120]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Resolution",-1)),J(a("input",{class:"framesync-input",type:"range",min:"14",max:"100",step:"1","onUpdate:modelValue":e[51]||(e[51]=o=>t.defaultAnimation.mcResolution=o),onInput:e[52]||(e[52]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.mcResolution,void 0,{number:!0}]])]),a("div",bk,[e[121]||(e[121]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Isolation",-1)),J(a("input",{class:"framesync-input",type:"range",min:"10",max:"300",step:"1","onUpdate:modelValue":e[53]||(e[53]=o=>t.defaultAnimation.mcIsolation=o),onInput:e[54]||(e[54]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.mcIsolation,void 0,{number:!0}]])]),i.compact?N("",!0):(m(),p("div",_k,[e[122]||(e[122]=a("div",{class:"framesync-subtitle"},"Field helpers",-1)),a("div",Sk,[a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.mcFloor}]),onClick:e[55]||(e[55]=o=>{t.defaultAnimation.mcFloor=!t.defaultAnimation.mcFloor,t.onDefaultAnimationInput()})},"Floor",2),a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.mcWallX}]),onClick:e[56]||(e[56]=o=>{t.defaultAnimation.mcWallX=!t.defaultAnimation.mcWallX,t.onDefaultAnimationInput()})},"Wall X",2),a("button",{type:"button",class:B(["chip",{active:t.defaultAnimation.mcWallZ}]),onClick:e[57]||(e[57]=o=>{t.defaultAnimation.mcWallZ=!t.defaultAnimation.mcWallZ,t.onDefaultAnimationInput()})},"Wall Z",2)])]))],64)):t.defaultAnimation.mode==="ocean"?(m(),p(H,{key:7},[a("div",wk,[e[123]||(e[123]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Sun elevation",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"90",step:"0.1","onUpdate:modelValue":e[58]||(e[58]=o=>t.defaultAnimation.ocElevation=o),onInput:e[59]||(e[59]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocElevation,void 0,{number:!0}]])]),a("div",Mk,[e[124]||(e[124]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Sun azimuth",-1)),J(a("input",{class:"framesync-input",type:"range",min:"-180",max:"180",step:"0.1","onUpdate:modelValue":e[60]||(e[60]=o=>t.defaultAnimation.ocAzimuth=o),onInput:e[61]||(e[61]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocAzimuth,void 0,{number:!0}]])]),a("div",Pk,[e[125]||(e[125]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Exposure",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.0001","onUpdate:modelValue":e[62]||(e[62]=o=>t.defaultAnimation.ocExposure=o),onInput:e[63]||(e[63]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocExposure,void 0,{number:!0}]])]),a("div",xk,[e[126]||(e[126]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Distortion scale",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"8",step:"0.1","onUpdate:modelValue":e[64]||(e[64]=o=>t.defaultAnimation.ocDistortion=o),onInput:e[65]||(e[65]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocDistortion,void 0,{number:!0}]])]),a("div",Tk,[e[127]||(e[127]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Wave size",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"10",step:"0.1","onUpdate:modelValue":e[66]||(e[66]=o=>t.defaultAnimation.ocSize=o),onInput:e[67]||(e[67]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocSize,void 0,{number:!0}]])]),i.compact?N("",!0):(m(),p("div",Ak,[e[128]||(e[128]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud coverage",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[68]||(e[68]=o=>t.defaultAnimation.ocCloudCoverage=o),onInput:e[69]||(e[69]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocCloudCoverage,void 0,{number:!0}]])])),i.compact?N("",!0):(m(),p("div",Ek,[e[129]||(e[129]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud density",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[70]||(e[70]=o=>t.defaultAnimation.ocCloudDensity=o),onInput:e[71]||(e[71]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocCloudDensity,void 0,{number:!0}]])])),i.compact?N("",!0):(m(),p("div",Ck,[e[130]||(e[130]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud elevation",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[72]||(e[72]=o=>t.defaultAnimation.ocCloudElevation=o),onInput:e[73]||(e[73]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.ocCloudElevation,void 0,{number:!0}]])]))],64)):["raycast","marching","ocean","instancing","interactive_points","interactive_raycast_points","lensflares"].includes(t.defaultAnimation.mode)?N("",!0):(m(),p(H,{key:8},[a("div",kk,[e[131]||(e[131]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[74]||(e[74]=o=>t.defaultAnimation.speed=o),onInput:e[75]||(e[75]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",Lk,[e[132]||(e[132]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Spread",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"1.4",step:"0.01","onUpdate:modelValue":e[76]||(e[76]=o=>t.defaultAnimation.spread=o),onInput:e[77]||(e[77]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.spread,void 0,{number:!0}]])]),a("div",Rk,[e[133]||(e[133]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Glow",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[78]||(e[78]=o=>t.defaultAnimation.glow=o),onInput:e[79]||(e[79]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",Dk,[e[134]||(e[134]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Hue",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[80]||(e[80]=o=>t.defaultAnimation.hue=o),onInput:e[81]||(e[81]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.hue,void 0,{number:!0}]])]),a("div",Ik,[e[135]||(e[135]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Pulse",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[82]||(e[82]=o=>t.defaultAnimation.pulse=o),onInput:e[83]||(e[83]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.pulse,void 0,{number:!0}]])]),a("div",Fk,[e[136]||(e[136]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Drift",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[84]||(e[84]=o=>t.defaultAnimation.drift=o),onInput:e[85]||(e[85]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.drift,void 0,{number:!0}]])])],64))])):N("",!0),i.showCompositor&&!i.forcePerformance&&t.showForgeOverWebgl?(m(),p("div",Nk,[e[138]||(e[138]=a("div",{class:"live-engine-controls__section-head"},[a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"Layer over WebGL")],-1)),a("div",Ok,[e[137]||(e[137]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge opacity",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[86]||(e[86]=o=>t.defaultAnimation.forgeLayerOpacity=o),"data-testid":"forge-layer-opacity",onInput:e[87]||(e[87]=o=>{t.defaultAnimation.forgeLayerOpacityLfoBase=t.defaultAnimation.forgeLayerOpacity,t.onDefaultAnimationInput()})},null,544),[[ye,t.defaultAnimation.forgeLayerOpacity,void 0,{number:!0}]])]),e[139]||(e[139]=a("p",{class:"framesync-subtitle live-engine-controls__hint"}," Set to 0 to hide Deforum/WAN preview frames over the WebGL stage. Blend mode uses screen compositing. ",-1))])):N("",!0)],2)}const Bk=nt(OC,[["render",Uk]]),Vk={name:"WebGLPluginPanel",components:{LiveEngineControls:Bk},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}};function zk(t,e,i,n,s,r){const l=Ne("LiveEngineControls");return m(),at(l,{app:i.app,"show-compositor":!1,"show-webgl":!0,"force-webgl":""},null,8,["app"])}const $k=nt(Vk,[["render",zk]]),Gk={name:"LiveParametersPanel",components:{UiIcon:Kt},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},Hk={class:"rack param-drawer live-parameters-panel","data-testid":"live-parameters-panel"},Wk={class:"param-drawer-label"},qk={class:"param-drawer-body"},jk={key:0,class:"param-group param-group--pinned"},Xk={class:"framesync-subtitle param-group__pinned-label"},Kk={class:"param-group-grid"},Yk={class:"framesync-subtitle",style:{"font-size":"10px",display:"flex","align-items":"center",gap:"4px"}},Jk=["onClick"],Zk=["title","onClick"],Qk=["min","max","step","value","disabled","onInput"],eL={class:"framesync-subtitle"},tL={class:"param-group-grid"},iL={class:"framesync-subtitle",style:{"font-size":"10px",display:"flex","align-items":"center",gap:"4px"}},nL=["onClick"],sL=["title","onClick"],rL=["min","max","step","value","disabled","onInput"],oL={class:"framesync-footer",style:{"margin-top":"10px"}};function aL(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",Hk,[a("button",{type:"button",class:"param-drawer-toggle",onClick:e[0]||(e[0]=o=>{t.paramPanelOpen=!t.paramPanelOpen,t.saveSessionState()})},[a("span",Wk,[ve(l,{class:"param-drawer-label-icon",name:"sliders"}),e[3]||(e[3]=a("span",null,"Parameters",-1))]),ve(l,{class:"param-drawer-chevron",name:t.paramPanelOpen?"chevron-up":"chevron-down"},null,8,["name"])]),J(a("div",qk,[t.pinnedParamItems.length?(m(),p("div",jk,[a("div",Xk,[ve(l,{name:"pin",class:"param-group__pinned-icon"}),e[4]||(e[4]=a("span",null,"Pinned",-1))]),a("div",Kk,[(m(!0),p(H,null,oe(t.pinnedParamItems,o=>(m(),p("div",{class:B(["framesync-stack",{"param-locked":t.isParamLocked(o.key)}]),key:"pin-"+o.key},[a("div",Yk,[a("span",null,b(o.label),1),a("button",{type:"button",class:"param-pin-btn active",title:"Unpin",onClick:lt(d=>t.toggleParamPin(o.key),["stop"])},[ve(l,{name:"pin"})],8,Jk),a("button",{type:"button",class:B(["param-lock-btn",{active:t.isParamLockedByMe(o.key)}]),title:t.paramLockTitle(o.key),onClick:lt(d=>t.toggleParamLock(o.key),["stop"])},[ve(l,{name:"lock"})],10,Zk)]),a("input",{type:"range",min:o.min,max:o.max,step:o.step,value:o.val,disabled:t.isParamLocked(o.key)&&!t.isParamLockedByMe(o.key),onInput:d=>t.updateParam(o,d),class:"framesync-input"},null,40,Qk)],2))),128))])])):N("",!0),(m(!0),p(H,null,oe(t.paramPanelGroups,o=>(m(),p("div",{key:o.label,class:"param-group"},[a("div",eL,b(o.label),1),a("div",tL,[(m(!0),p(H,null,oe(o.items,d=>(m(),p("div",{class:B(["framesync-stack",{"param-locked":t.isParamLocked(d.key)}]),key:d.key},[a("div",iL,[a("span",null,b(d.label),1),a("button",{type:"button",class:B(["param-pin-btn",{active:t.isParamPinned(d.key)}]),title:"Pin to top",onClick:lt(u=>t.toggleParamPin(d.key),["stop"])},[ve(l,{name:"pin"})],10,nL),a("button",{type:"button",class:B(["param-lock-btn",{active:t.isParamLockedByMe(d.key)}]),title:t.paramLockTitle(d.key),onClick:lt(u=>t.toggleParamLock(d.key),["stop"])},[ve(l,{name:"lock"})],10,sL)]),a("input",{type:"range",min:d.min,max:d.max,step:d.step,value:d.val,disabled:t.isParamLocked(d.key)&&!t.isParamLockedByMe(d.key),onInput:u=>t.updateParam(d,u),class:"framesync-input"},null,40,rL)],2))),128))])]))),128)),a("div",oL,[a("button",{class:"framesync-button",onClick:e[1]||(e[1]=(...o)=>t.resetVibeParams&&t.resetVibeParams(...o))},"↺ Reset vibe"),a("button",{class:"framesync-button",onClick:e[2]||(e[2]=(...o)=>t.resetCameraParams&&t.resetCameraParams(...o))},"↺ Reset camera")])],512),[[Wi,t.paramPanelOpen]])])}const lL=nt(Gk,[["render",aL]]),dL={translation_x:{key:"translation_x",label:"Pan X",shortLabel:"X",icon:"arrow-right",range:null},translation_y:{key:"translation_y",label:"Pan Y",shortLabel:"Y",icon:"chevron-up",range:null},translation_z:{key:"translation_z",label:"Depth Z",shortLabel:"Z",icon:"panel-bottom",range:10},angle:{key:"angle",label:"Angle",shortLabel:"Ang",icon:"rotate-ccw",range:1},zoom:{key:"zoom",label:"Zoom",shortLabel:"Zm",icon:"size-full",range:1},rotation_z:{key:"rotation_z",label:"Tilt",shortLabel:"Tlt",icon:"rotate-ccw",range:180}};function Fm(t){return dL[t]||null}function uL(t,e,i){const n=(i||[]).map(r=>r.key).filter(Boolean);if(!n.length)return t;let s=Math.max(0,n.indexOf(t));for(let r=0;r[]},variant:{type:String,default:"move"},testId:{type:String,default:"xy-controller"},showReadout:{type:Boolean,default:!0},compact:{type:Boolean,default:!0},springBack:{type:Boolean,default:!0},springDurationMs:{type:Number,default:280}},emits:["input","drag-start","release","update:xAxis","update:yAxis"],data(){return{normX:0,normY:0,dragging:!1,springing:!1,_springRaf:null,_activePointerId:null}},computed:{xAxisMeta(){return Fm(this.xAxis)||{label:this.xAxis,icon:"sliders"}},yAxisMeta(){return Fm(this.yAxis)||{label:this.yAxis,icon:"sliders"}},xAxisLabel(){return this.xAxisMeta.label||this.xAxis},yAxisLabel(){return this.yAxisMeta.label||this.yAxis},xAxisIcon(){return this.xAxisMeta.icon||"sliders"},yAxisIcon(){return this.yAxisMeta.icon||"sliders"},puckStyle(){const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1),i=this.dragging||this.springing?this.normX*t:Number(this.x)||0,n=this.dragging||this.springing?this.normY*e:Number(this.y)||0,s=(i/t+1)*50,r=(1-(n/e+1)*.5)*100;return{left:Math.min(100,Math.max(0,s))+"%",top:Math.min(100,Math.max(0,r))+"%"}},readoutText(){const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1),i=this.dragging||this.springing?this.normX*t:Number(this.x)||0,n=this.dragging||this.springing?this.normY*e:Number(this.y)||0;return i.toFixed(2)+", "+n.toFixed(2)}},watch:{x(){this.syncFromProps()},y(){this.syncFromProps()},rangeX(){this.syncFromProps()},rangeY(){this.syncFromProps()},xAxis(){this.syncFromProps()},yAxis(){this.syncFromProps()}},mounted(){this.syncFromProps()},beforeUnmount(){this.cancelSpring()},methods:{cycleAxis(t){const e=t==="x"?this.xAxis:this.yAxis,i=t==="x"?this.yAxis:this.xAxis,n=uL(e,i,this.axisOptions);n!==e&&this.$emit(t==="x"?"update:xAxis":"update:yAxis",n)},syncFromProps(){if(this.dragging||this.springing)return;const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1);this.normX=this.clampNorm((Number(this.x)||0)/t),this.normY=this.clampNorm((Number(this.y)||0)/e)},clampNorm(t){const e=Number(t);return Number.isFinite(e)?Math.max(-1,Math.min(1,e)):0},padRect(){const t=this.$refs.padEl;return t?t.getBoundingClientRect():{left:0,top:0,width:1,height:1}},pointerToNorm(t,e){const i=this.padRect(),n=i.width||1,s=i.height||1,r=Math.max(0,Math.min(n,t-i.left)),l=Math.max(0,Math.min(s,e-i.top));return{normX:this.clampNorm(r/n*2-1),normY:this.clampNorm(1-l/s*2)}},emitValues(){const t=Number(this.rangeX)||1,e=Number(this.rangeY)||1;this.$emit("input",{x:this.normX*t,y:this.normY*e,normX:this.normX,normY:this.normY,xAxis:this.xAxis,yAxis:this.yAxis,dragging:this.dragging,springing:this.springing})},cancelSpring(){this._springRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._springRaf),this._springRaf=null,this.springing=!1},startSpringBack(){if(!this.springBack){this.emitValues();return}this.cancelSpring(),this.springing=!0;const t=this.normX,e=this.normY;if(Math.abs(t)<.001&&Math.abs(e)<.001){this.normX=0,this.normY=0,this.springing=!1,this.emitValues();return}const i=performance.now(),n=Math.max(80,Number(this.springDurationMs)||280),s=r=>{const l=Math.min(1,(r-i)/n),o=1-Math.pow(1-l,2.6);if(this.normX=t*(1-o),this.normY=e*(1-o),this.emitValues(),l<1){this._springRaf=requestAnimationFrame(s);return}this.normX=0,this.normY=0,this.springing=!1,this._springRaf=null,this.emitValues()};this._springRaf=requestAnimationFrame(s)},onPointerDown(t){if(this._activePointerId!=null)return;this.cancelSpring(),this.dragging=!0,this._activePointerId=t.pointerId;try{t.currentTarget.setPointerCapture(t.pointerId)}catch{}const{normX:e,normY:i}=this.pointerToNorm(t.clientX,t.clientY);this.normX=e,this.normY=i,this.$emit("drag-start"),this.emitValues(),t.preventDefault()},onPointerMove(t){if(!this.dragging||t.pointerId!==this._activePointerId)return;const{normX:e,normY:i}=this.pointerToNorm(t.clientX,t.clientY);this.normX=e,this.normY=i,this.emitValues(),t.preventDefault()},onPointerUp(t){t.pointerId===this._activePointerId&&this.finishDrag(t.currentTarget,t.pointerId)},onPointerLeave(t){!this.dragging||t.pointerId!==this._activePointerId||this.finishDrag(t.currentTarget,t.pointerId)},finishDrag(t,e){if(this.dragging){try{t.releasePointerCapture(e)}catch{}this.dragging=!1,this._activePointerId=null,this.$emit("release"),this.startSpringBack()}}}},hL=["data-testid"],fL={class:"xy-controller__chrome"},mL=["title","data-testid"],pL={key:0,class:"xy-controller__readout motion-readout"},gL=["title","data-testid"],yL={key:0,class:"motion-pad-hero__readout motion-readout"};function vL(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",{class:B(["xy-controller",["xy-controller--"+(i.compact?"compact":"regular"),"xy-controller--"+i.variant,{"xy-controller--dragging":s.dragging,"xy-controller--spring":s.springing,"xy-controller--latched":!i.springBack}]]),"data-testid":i.testId},[a("div",fL,[a("button",{type:"button",class:"xy-controller__axis-btn xy-controller__axis-btn--x",title:"X axis: "+r.xAxisLabel+" — click to change","data-testid":i.testId+"-axis-x",onClick:e[0]||(e[0]=o=>r.cycleAxis("x"))},[ve(l,{name:r.xAxisIcon},null,8,["name"]),e[7]||(e[7]=a("span",{class:"xy-controller__axis-tag"},"X",-1))],8,mL),i.compact&&i.showReadout?(m(),p("code",pL,b(r.readoutText),1)):N("",!0),a("button",{type:"button",class:"xy-controller__axis-btn xy-controller__axis-btn--y",title:"Y axis: "+r.yAxisLabel+" — click to change","data-testid":i.testId+"-axis-y",onClick:e[1]||(e[1]=o=>r.cycleAxis("y"))},[ve(l,{name:r.yAxisIcon},null,8,["name"]),e[8]||(e[8]=a("span",{class:"xy-controller__axis-tag"},"Y",-1))],8,gL)]),a("div",{ref:"padEl",class:B(["xy-controller__pad motion-pad-hero","motion-pad-hero--"+i.variant]),onPointerdown:e[2]||(e[2]=(...o)=>r.onPointerDown&&r.onPointerDown(...o)),onPointermove:e[3]||(e[3]=(...o)=>r.onPointerMove&&r.onPointerMove(...o)),onPointerup:e[4]||(e[4]=(...o)=>r.onPointerUp&&r.onPointerUp(...o)),onPointercancel:e[5]||(e[5]=(...o)=>r.onPointerUp&&r.onPointerUp(...o)),onPointerleave:e[6]||(e[6]=(...o)=>r.onPointerLeave&&r.onPointerLeave(...o))},[e[9]||(e[9]=a("div",{class:"motion-pad-hero__crosshair motion-pad-hero__crosshair--x"},null,-1)),e[10]||(e[10]=a("div",{class:"motion-pad-hero__crosshair motion-pad-hero__crosshair--y"},null,-1)),a("div",{class:B(["motion-pad-hero__puck",{"motion-pad-hero__puck--look":i.variant==="look"}]),style:Mt(r.puckStyle)},null,6),!i.compact&&i.showReadout?(m(),p("code",yL,b(r.readoutText),1)):N("",!0)],34)],10,hL)}const bL=nt(cL,[["render",vL]]),_L={name:"DeforumMotionPads",components:{XYController:bL,UiIcon:Kt},props:{app:{type:Object,required:!0},hero:{type:Boolean,default:!1},compact:{type:Boolean,default:!0},showReadout:{type:Boolean,default:!0},showAxisSliders:{type:Boolean,default:!0}},setup(t){return Et(t)}},SL={key:0,class:"deforum-control-panel__section-head"},wL={key:0,class:"deforum-motion-pads__readout motion-readout"},ML={class:"deforum-motion-pads__mode-row"},PL=["title"],xL={class:"motion-controls-compact","data-testid":"motion-controls-compact"},TL={key:1,class:"motion-axis-sliders motion-axis-sliders--2d"},AL={class:"motion-axis-slider"},EL=["value"],CL={class:"motion-axis-slider__value motion-readout"},kL={class:"motion-axis-slider"},LL=["value"],RL={class:"motion-axis-slider__value motion-readout"},DL={key:2,class:"motion-axis-sliders"},IL={class:"motion-axis-slider"},FL=["value"],NL={class:"motion-axis-slider__value motion-readout"},OL={class:"motion-axis-slider"},UL=["value"],BL={class:"motion-axis-slider__value motion-readout"},VL={class:"motion-axis-slider"},zL=["value"],$L={class:"motion-axis-slider__value motion-readout"};function GL(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("XYController");return m(),p("section",{class:B(["deforum-motion-pads",{"deforum-motion-pads--hero":i.hero,"deforum-motion-pads--compact":i.compact}]),"data-testid":"deforum-motion-pads"},[i.compact?N("",!0):(m(),p("div",SL,[e[11]||(e[11]=a("span",{class:"framesync-subtitle deforum-control-panel__section-title"},"Camera XY",-1)),i.showReadout&&!i.hero?(m(),p("code",wL,[t.isDeforumMotion2d?(m(),p(H,{key:0},[ie(" Move "+b(t.motionPadReadout.x.toFixed(2))+", "+b(t.motionPadReadout.y.toFixed(2))+", Zoom "+b(t.motionPadReadout.zoom.toFixed(2))+", Tilt "+b(t.motionPadReadout.lookX.toFixed(2)),1)],64)):(m(),p(H,{key:1},[ie(" X "+b(t.motionPadReadout.x.toFixed(2))+", Y "+b(t.motionPadReadout.y.toFixed(2))+", Z "+b(t.motionPadReadout.z.toFixed(2))+", Zoom "+b(t.motionPadReadout.zoom.toFixed(2))+", Tilt "+b(t.motionPadReadout.tilt.toFixed(2)),1)],64))])):N("",!0)])),a("div",ML,[e[12]||(e[12]=a("span",{class:"deforum-motion-pads__mode-label"},"XY pad",-1)),a("button",{type:"button",class:B(["framesync-button framesync-button--compact deforum-motion-pads__mode-btn",{"framesync-button--live":!t.motionPadSpringBack}]),"data-testid":"motion-pad-latch-toggle",title:t.motionPadSpringBack?"Spring: puck returns to center when you let go":"Latch: puck stays where you leave it",onClick:e[0]||(e[0]=d=>t.toggleMotionPadSpringBack())},[ve(l,{name:t.motionPadSpringBack?"move":"lock"},null,8,["name"]),ie(" "+b(t.motionPadSpringBack?"Spring":"Latch"),1)],10,PL)]),a("div",xL,[(m(!0),p(H,null,oe(t.motionXYPadSlots,d=>(m(),at(o,{key:d.id,compact:"","spring-back":t.motionPadSpringBack,x:t.motionAxisTargetValue(d.xAxis),y:t.motionAxisTargetValue(d.yAxis),"range-x":t.motionAxisRangeForKey(d.xAxis),"range-y":t.motionAxisRangeForKey(d.yAxis),"x-axis":d.xAxis,"y-axis":d.yAxis,"axis-options":t.motionAxisOptionsList,variant:d.id==="look"?"look":"move","test-id":d.id==="primary"?"motion-pad-move":d.id==="look"?"motion-pad-look":"motion-pad-"+d.id,"onUpdate:xAxis":u=>t.setMotionXYPadAxis(d.id,"x",u),"onUpdate:yAxis":u=>t.setMotionXYPadAxis(d.id,"y",u),onDragStart:u=>t.motionPadDragStart(d.id),onInput:u=>t.applyMotionPadAxisValues(u.xAxis||d.xAxis,u.yAxis||d.yAxis,u.x,u.y,{previewOnly:u.dragging&&t.motionSmoothnessActive()}),onRelease:u=>t.motionPadMouseUp(d.id)},null,8,["spring-back","x","y","range-x","range-y","x-axis","y-axis","axis-options","variant","test-id","onUpdate:xAxis","onUpdate:yAxis","onDragStart","onInput","onRelease"]))),128))]),i.showAxisSliders&&t.isDeforumMotion2d?(m(),p("div",TL,[a("label",AL,[e[13]||(e[13]=a("span",{class:"motion-axis-slider__label"},"Zoom",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-1",max:"1",step:"0.01","data-testid":"motion-zoom-slider",value:t.motionAxisTargetValue("zoom"),onInput:e[1]||(e[1]=d=>t.motionSmoothnessActive()?t.previewMotionAxis("zoom",d.target.value):t.setMotionAxis("zoom",d.target.value)),onChange:e[2]||(e[2]=d=>t.motionSmoothnessActive()&&t.setMotionAxis("zoom",d.target.value))},null,40,EL),a("code",CL,b(t.motionAxisTargetValue("zoom").toFixed(2)),1)]),a("label",kL,[e[14]||(e[14]=a("span",{class:"motion-axis-slider__label"},"Tilt",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-1",max:"1",step:"0.01","data-testid":"motion-tilt-slider",value:t.motionAxisTargetValue("angle"),onInput:e[3]||(e[3]=d=>t.motionSmoothnessActive()?t.previewMotionAxis("angle",d.target.value):t.setMotionAxis("angle",d.target.value)),onChange:e[4]||(e[4]=d=>t.motionSmoothnessActive()&&t.setMotionAxis("angle",d.target.value))},null,40,LL),a("code",RL,b(t.motionAxisTargetValue("angle").toFixed(2)),1)])])):i.showAxisSliders?(m(),p("div",DL,[a("label",IL,[e[15]||(e[15]=a("span",{class:"motion-axis-slider__label"},"Z",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-10",max:"10",step:"0.05",value:t.motionAxisTargetValue("translation_z"),onInput:e[5]||(e[5]=d=>t.motionSmoothnessActive()?t.previewMotionAxis("translation_z",d.target.value):t.setMotionAxis("translation_z",d.target.value)),onChange:e[6]||(e[6]=d=>t.motionSmoothnessActive()&&t.setMotionAxis("translation_z",d.target.value))},null,40,FL),a("code",NL,b(t.motionAxisTargetValue("translation_z").toFixed(2)),1)]),a("label",OL,[e[16]||(e[16]=a("span",{class:"motion-axis-slider__label"},"Zoom",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"0.5",max:"2",step:"0.01","data-testid":"motion-zoom-slider",value:t.motionAxisTargetValue("zoom"),onInput:e[7]||(e[7]=d=>t.motionSmoothnessActive()?t.previewMotionAxis("zoom",d.target.value):t.setMotionAxis("zoom",d.target.value)),onChange:e[8]||(e[8]=d=>t.motionSmoothnessActive()&&t.setMotionAxis("zoom",d.target.value))},null,40,UL),a("code",BL,b(t.motionAxisTargetValue("zoom").toFixed(2)),1)]),a("label",VL,[e[17]||(e[17]=a("span",{class:"motion-axis-slider__label"},"Tilt",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-180",max:"180",step:"0.5","data-testid":"motion-tilt-slider",value:t.motionAxisTargetValue("rotation_z"),onInput:e[9]||(e[9]=d=>t.motionSmoothnessActive()?t.previewMotionAxis("rotation_z",d.target.value):t.setMotionAxis("rotation_z",d.target.value)),onChange:e[10]||(e[10]=d=>t.motionSmoothnessActive()&&t.setMotionAxis("rotation_z",d.target.value))},null,40,zL),a("code",$L,b(t.motionAxisTargetValue("rotation_z").toFixed(2)),1)])])):N("",!0)],2)}const ty=nt(_L,[["render",GL]]),Nm={type:"change"},nh={type:"start"},iy={type:"end"},$a=new Xo,Om=new Un,HL=Math.cos(70*yl.DEG2RAD),Qt=new V,Ei=2*Math.PI,It={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},jd=1e-6;class WL extends VP{constructor(e,i=null){super(e,i),this.state=It.NONE,this.target=new V,this.cursor=new V,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Dr.ROTATE,MIDDLE:Dr.DOLLY,RIGHT:Dr.PAN},this.touches={ONE:Tr.ROTATE,TWO:Tr.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._cursorStyle="auto",this._domElementKeyEvents=null,this._lastPosition=new V,this._lastQuaternion=new ys,this._lastTargetPosition=new V,this._quat=new ys().setFromUnitVectors(e.up,new V(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new nm,this._sphericalDelta=new nm,this._scale=1,this._panOffset=new V,this._rotateStart=new Ye,this._rotateEnd=new Ye,this._rotateDelta=new Ye,this._panStart=new Ye,this._panEnd=new Ye,this._panDelta=new Ye,this._dollyStart=new Ye,this._dollyEnd=new Ye,this._dollyDelta=new Ye,this._dollyDirection=new V,this._mouse=new Ye,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=jL.bind(this),this._onPointerDown=qL.bind(this),this._onPointerUp=XL.bind(this),this._onContextMenu=tR.bind(this),this._onMouseWheel=JL.bind(this),this._onKeyDown=ZL.bind(this),this._onTouchStart=QL.bind(this),this._onTouchMove=eR.bind(this),this._onMouseDown=KL.bind(this),this._onMouseMove=YL.bind(this),this._interceptControlDown=iR.bind(this),this._interceptControlUp=nR.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}set cursorStyle(e){this._cursorStyle=e,e==="grab"?this.domElement.style.cursor="grab":this.domElement.style.cursor="auto"}get cursorStyle(){return this._cursorStyle}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction=""}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(Nm),this.update(),this.state=It.NONE}pan(e,i){this._pan(e,i),this.update()}dollyIn(e){this._dollyIn(e),this.update()}dollyOut(e){this._dollyOut(e),this.update()}rotateLeft(e){this._rotateLeft(e),this.update()}rotateUp(e){this._rotateUp(e),this.update()}update(e=null){const i=this.object.position;Qt.copy(i).sub(this.target),Qt.applyQuaternion(this._quat),this._spherical.setFromVector3(Qt),this.autoRotate&&this.state===It.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Ei:n>Math.PI&&(n-=Ei),s<-Math.PI?s+=Ei:s>Math.PI&&(s-=Ei),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const l=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=l!=this._spherical.radius}if(Qt.setFromSpherical(this._spherical),Qt.applyQuaternion(this._quatInverse),i.copy(this.target).add(Qt),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let l=null;if(this.object.isPerspectiveCamera){const o=Qt.length();l=this._clampDistance(o*this._scale);const d=o-l;this.object.position.addScaledVector(this._dollyDirection,d),this.object.updateMatrixWorld(),r=!!d}else if(this.object.isOrthographicCamera){const o=new V(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const d=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=d!==this.object.zoom;const u=new V(this._mouse.x,this._mouse.y,0);u.unproject(this.object),this.object.position.sub(u).add(o),this.object.updateMatrixWorld(),l=Qt.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;l!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(l).add(this.object.position):($a.origin.copy(this.object.position),$a.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot($a.direction))jd||8*(1-this._lastQuaternion.dot(this.object.quaternion))>jd||this._lastTargetPosition.distanceToSquared(this.target)>jd?(this.dispatchEvent(Nm),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?Ei/60*this.autoRotateSpeed*e:Ei/60/60*this.autoRotateSpeed}_getZoomScale(e){const i=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*i)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,i){Qt.setFromMatrixColumn(i,0),Qt.multiplyScalar(-e),this._panOffset.add(Qt)}_panUp(e,i){this.screenSpacePanning===!0?Qt.setFromMatrixColumn(i,1):(Qt.setFromMatrixColumn(i,0),Qt.crossVectors(this.object.up,Qt)),Qt.multiplyScalar(e),this._panOffset.add(Qt)}_pan(e,i){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;Qt.copy(s).sub(this.target);let r=Qt.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*i*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(i*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,i){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=e-n.left,r=i-n.top,l=n.width,o=n.height;this._mouse.x=s/l*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const i=this.domElement;this._rotateLeft(Ei*this._rotateDelta.x/i.clientHeight),this._rotateUp(Ei*this._rotateDelta.y/i.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let i=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(Ei*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),i=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-Ei*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),i=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(Ei*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),i=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-Ei*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),i=!0;break}i&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._panStart.set(n,s)}}_handleTouchStartDolly(e){const i=this._getSecondPointerPosition(e),n=e.pageX-i.x,s=e.pageY-i.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),s=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const i=this.domElement;this._rotateLeft(Ei*this._rotateDelta.x/i.clientHeight),this._rotateUp(Ei*this._rotateDelta.y/i.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const i=this._getSecondPointerPosition(e),n=e.pageX-i.x,s=e.pageY-i.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const l=(e.pageX+i.x)*.5,o=(e.pageY+i.y)*.5;this._updateZoomParameters(l,o)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let i=0;ir.frame-l.frame),i}function Mr(t,e){if(!Array.isArray(t)||!t.length)return 0;const i=Number(e)||0;if(i<=t[0].frame)return t[0].value;for(let n=1;n({})},motionValues:{type:Object,default:()=>({})},preferLiveValues:{type:Boolean,default:!0},playing:{type:Boolean,default:!0}},data(){return{playheadFrame:0,displayFrame:0,displayPoint:{x:0,y:0,z:0},totalFrames:120,_raf:0,_lastTs:0,_pathPoints:[]}},computed:{liveMotionOverrides(){if(!this.preferLiveValues)return{};const t=this.motionValues||{},e={};return["translation_x","translation_y","translation_z","rotation_3d_x","rotation_3d_y","rotation_3d_z"].forEach(i=>{t[i]!=null&&Number.isFinite(Number(t[i]))&&(e[i]=Number(t[i]))}),e},previewFrameCount(){var e;const t=Number((e=this.deforumSettings)==null?void 0:e.max_frames)||120;return Math.max(24,Math.min(240,t))},previewFps(){var e;const t=Number((e=this.deforumSettings)==null?void 0:e.fps)||24;return Math.max(8,Math.min(60,t))}},watch:{deforumSettings:{deep:!0,handler(){this.rebuildPath()}},motionValues:{deep:!0,handler(){this.rebuildPath()}},preferLiveValues(){this.rebuildPath()},playing(t){t?this.startLoop():this.stopLoop()}},mounted(){this.initScene(),this.rebuildPath(),this.playing&&this.startLoop(),this._onResize=()=>this.resize(),window.addEventListener("resize",this._onResize)},beforeUnmount(){this.stopLoop(),window.removeEventListener("resize",this._onResize),this.disposeScene()},methods:{initScene(){const t=this.$refs.host;if(!t)return;this.scene=new Qu,this.scene.background=new ze(395536),this.scene.fog=new Hc(395536,40,220);const e=t.clientWidth||640,i=t.clientHeight||220;this.viewCamera=new Pi(48,e/i,.1,500),this.viewCamera.position.set(28,22,34),this.renderer=new Qg({antialias:!0,alpha:!1}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),this.renderer.setSize(e,i,!1),t.appendChild(this.renderer.domElement),this.controls=new WL(this.viewCamera,this.renderer.domElement),this.controls.enableDamping=!0,this.controls.target.set(0,0,0);const n=new UP(80,40,3007231,1713208);n.position.y=-.01,this.scene.add(n);const s=new BP(8);this.scene.add(s),this.pathMaterial=new Nl({color:8353757,linewidth:1}),this.pathGeometry=new zt,this.pathLine=new Fg(this.pathGeometry,this.pathMaterial),this.scene.add(this.pathLine),this.playheadMaterial=new Or({color:3007231,emissive:667712,metalness:.2,roughness:.35}),this.playheadMesh=new $t(new Nr(.55,16,16),this.playheadMaterial),this.scene.add(this.playheadMesh);const r=new jc(.35,1.2,12);this.facingMaterial=new Or({color:15235504,emissive:3149856}),this.facingMesh=new $t(r,this.facingMaterial),this.facingMesh.rotation.x=Math.PI/2,this.playheadMesh.add(this.facingMesh);const l=new CP(16777215,1.1);l.position.set(12,24,16),this.scene.add(l),this.scene.add(new Hg(4478310,.65))},resize(){const t=this.$refs.host;if(!t||!this.renderer||!this.viewCamera)return;const e=t.clientWidth||640,i=t.clientHeight||220;this.renderer.setSize(e,i,!1),this.viewCamera.aspect=e/i,this.viewCamera.updateProjectionMatrix()},rebuildPath(){this.totalFrames=this.previewFrameCount,this._pathPoints=oR({settings:this.deforumSettings||{},live:this.liveMotionOverrides,frameCount:this.totalFrames}),this.updatePathGeometry(),this.playheadFrame=Math.min(this.playheadFrame,this.totalFrames),this.applyPlayhead(this.playheadFrame)},updatePathGeometry(){if(!this.pathGeometry)return;const t=this._pathPoints,e=new Float32Array(t.length*3);if(t.forEach((i,n)=>{e[n*3]=i.x,e[n*3+1]=i.y,e[n*3+2]=i.z}),this.pathGeometry.setAttribute("position",new ei(e,3)),this.pathGeometry.computeBoundingSphere(),t.length>1&&this.controls){let i=1/0,n=-1/0,s=1/0,r=-1/0,l=1/0,o=-1/0;t.forEach(f=>{i=Math.min(i,f.x),n=Math.max(n,f.x),s=Math.min(s,f.y),r=Math.max(r,f.y),l=Math.min(l,f.z),o=Math.max(o,f.z)});const d=(i+n)/2,u=(s+r)/2,h=(l+o)/2,c=Math.max(n-i,r-s,o-l,6);this.controls.target.set(d,u,h),this.viewCamera.position.set(d+c*1.4,u+c*.9,h+c*1.4)}},applyPlayhead(t){const e=this._pathPoints;if(!e.length||!this.playheadMesh)return;const i=Math.max(0,Math.min(e.length-1,Math.round(t))),n=e[i];this.displayFrame=n.frame,this.displayPoint={x:n.x,y:n.y,z:n.z},this.playheadMesh.position.set(n.x,n.y,n.z),this.playheadMesh.rotation.set(n.pitch||0,n.yaw||0,n.roll||0)},startLoop(){this.stopLoop(),this._lastTs=0;const t=e=>{if(this._raf=requestAnimationFrame(t),!this.playing)return;this._lastTs||(this._lastTs=e);const i=(e-this._lastTs)/1e3;this._lastTs=e,this.playheadFrame+=i*this.previewFps,this.playheadFrame>this.totalFrames&&(this.playheadFrame=0),this.applyPlayhead(this.playheadFrame),this.controls&&this.controls.update(),this.renderer&&this.scene&&this.viewCamera&&this.renderer.render(this.scene,this.viewCamera)};this._raf=requestAnimationFrame(t)},stopLoop(){this._raf&&cancelAnimationFrame(this._raf),this._raf=0,this._lastTs=0},disposeScene(){this.stopLoop(),this.controls&&this.controls.dispose(),this.pathGeometry&&this.pathGeometry.dispose(),this.pathMaterial&&this.pathMaterial.dispose(),this.playheadMaterial&&this.playheadMaterial.dispose(),this.facingMaterial&&this.facingMaterial.dispose(),this.renderer&&(this.renderer.dispose(),this.renderer.domElement&&this.renderer.domElement.parentNode&&this.renderer.domElement.parentNode.removeChild(this.renderer.domElement)),this.scene=null}}},lR={class:"motion-path-preview","data-testid":"motion-path-preview"},dR={class:"motion-path-preview__header"},uR={class:"motion-path-preview__readout motion-readout"},cR={ref:"host",class:"motion-path-preview__stage"};function hR(t,e,i,n,s,r){return m(),p("div",lR,[a("div",dR,[e[0]||(e[0]=a("div",{class:"framesync-subtitle motion-path-preview__title"},"3D motion preview",-1)),a("code",uR," Frame "+b(s.displayFrame)+" / "+b(s.totalFrames)+", X "+b(s.displayPoint.x.toFixed(1))+", Y "+b(s.displayPoint.y.toFixed(1))+", Z "+b(s.displayPoint.z.toFixed(1)),1)]),a("div",cR,null,512)])}const ny=nt(aR,[["render",hR]]),fR={name:"DeforumSettingsBody",components:{MotionPathPreview:ny},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},mR={class:"deforum-settings-body-wrap","data-testid":"deforum-settings-body"},pR={class:"deforum-settings-groups"},gR={class:"deforum-mode-toggle",role:"group","aria-label":"Deforum animation mode","data-testid":"deforum-mode-toggle"},yR={key:0,class:"deforum-mode-toggle__hint"},vR={class:"sub-pills deforum-settings-tabs"},bR=["disabled","onClick"],_R={key:1,class:"framesync-panel deforum-settings-panel"},SR={class:"deforum-settings-grid"},wR={class:"deforum-field-head"},MR={class:"deforum-field-label"},PR={key:0,class:"deforum-field-toggle"},xR=["onClick"],TR={key:0,class:"deforum-field-slider"},AR=["min","max","step","value","disabled","onInput"],ER={class:"deforum-field-slider__value"},CR=["data-testid","value","disabled","onChange"],kR=["value"],LR={key:2,class:"deforum-seed-control","data-testid":"deforum-seed-control"},RR=["disabled"],DR=["max","step","value","disabled"],IR={key:1,class:"deforum-seed-control__hint"},FR=["data-testid","min","max","step","value","disabled","onInput"],NR={key:4,class:"chips deforum-field-bool"},OR=["disabled","onClick"],UR=["disabled","onClick"],BR=["rows","value","disabled","onInput"],VR=["value","disabled","onInput"];function zR(t,e,i,n,s,r){const l=Ne("MotionPathPreview");return m(),p("section",mR,[e[4]||(e[4]=a("p",{class:"deforum-settings-body-wrap__intro framesync-subtitle"}," Sampler, schedules, canvas, motion, and ControlNet units (CN1–CN5). ",-1)),a("div",pR,[a("div",gR,[a("button",{type:"button",class:B(["deforum-mode-toggle__btn",{active:t.deforumMode2d3d==="2D"}]),"data-testid":"deforum-mode-2d",onClick:e[0]||(e[0]=o=>t.setDeforumMode2d3d("2D"))}," 2D ",2),a("button",{type:"button",class:B(["deforum-mode-toggle__btn",{active:t.deforumMode2d3d==="3D"}]),"data-testid":"deforum-mode-3d",onClick:e[1]||(e[1]=o=>t.setDeforumMode2d3d("3D"))}," 3D ",2)]),t.deforumMode3dActive?N("",!0):(m(),p("p",yR," 3D motion schedules are disabled in 2D mode. ")),a("div",vR,[(m(!0),p(H,null,oe(t.deforumFieldGroups,o=>(m(),p("button",{key:"deforum-tab-"+o.id,type:"button",class:B(["sub-pill",{active:t.deforumActiveTab===o.id,"sub-pill--disabled":t.isDeforumFieldGroupDisabledByAnimationMode(o.id)}]),disabled:t.isDeforumFieldGroupDisabledByAnimationMode(o.id),onClick:d=>{t.deforumActiveTab=o.id,t.saveSessionState()}},b(o.label),11,bR))),128))]),t.activeDeforumFieldGroup?(m(),p("div",_R,[t.deforumMode3dActive&&(t.deforumActiveTab==="motion"||t.deforumActiveTab==="motion3d")?(m(),at(l,{key:0,"deforum-settings":t.deforumSettings,"motion-values":{},"prefer-live-values":!1},null,8,["deforum-settings"])):N("",!0),a("div",SR,[(m(!0),p(H,null,oe(t.activeDeforumFieldGroup.fields,o=>(m(),p(H,{key:o.key},[o.key!=="sd_model_name"?(m(),p("label",{key:0,class:B(["deforum-field",["deforum-field-"+(o.type||"text"),{"deforum-field--disabled":!t.isDeforumFieldEnabled(o.key),"deforum-field--mode-locked":t.isDeforumFieldDisabledByAnimationMode(o.key)}]])},[a("span",wR,[a("span",MR,b(o.label),1),t.isDeforumFieldToggleable(o.key)?(m(),p("span",PR,[a("button",{type:"button",class:B(["chip chip--compact",{active:t.isDeforumFieldEnabled(o.key)}]),onClick:lt(d=>t.setDeforumFieldEnabled(o.key,!t.isDeforumFieldEnabled(o.key)),["prevent"])},b(t.isDeforumFieldEnabled(o.key)?"On":"Off"),11,xR)])):N("",!0)]),o.type==="slider"?(m(),p("div",TR,[a("input",{type:"range",class:"framesync-input",min:o.min,max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:d=>t.onDeforumFieldInput(o.key,d.target.value,"number")},null,40,AR),a("span",ER,b(t.formatDeforumFieldValue(o,t.getDeforumField(o.key))),1)])):o.type==="select"?(m(),p("select",{key:1,class:"framesync-select","data-testid":"deforum-field-"+o.key,value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onChange:d=>t.onDeforumSelectInput(o,d.target.value)},[(m(!0),p(H,null,oe(t.deforumFieldOptions(o),d=>(m(),p("option",{key:o.key+"-opt-"+d,value:d},b(d),9,kR))),128))],40,CR)):o.key==="seed"?(m(),p("div",LR,[a("button",{type:"button",class:B(["chip chip--compact",{active:t.seedRandomEnabled}]),disabled:!t.isDeforumFieldEnabled(o.key),"data-testid":"seed-random-toggle",onClick:e[2]||(e[2]=d=>t.setSeedRandomEnabled(!t.seedRandomEnabled))}," Random ",10,RR),t.seedRandomEnabled?(m(),p("span",IR,"Random (−1)")):(m(),p("input",{key:0,type:"number",class:"framesync-input deforum-seed-control__input","data-testid":"deforum-field-seed",min:"0",max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:e[3]||(e[3]=d=>t.onDeforumSeedInput(d.target.value))},null,40,DR))])):o.type==="number"?(m(),p("input",{key:3,type:"number",class:"framesync-input","data-testid":"deforum-field-"+o.key,min:o.min,max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:d=>t.onDeforumFieldInput(o.key,d.target.value,"number")},null,40,FR)):o.type==="bool"?(m(),p("div",NR,[a("button",{type:"button",class:B(["chip",{active:!!t.getDeforumField(o.key)}]),disabled:!t.isDeforumFieldEnabled(o.key),onClick:d=>t.onDeforumFieldInput(o.key,!0,"bool")},"On",10,OR),a("button",{type:"button",class:B(["chip",{active:!t.getDeforumField(o.key)}]),disabled:!t.isDeforumFieldEnabled(o.key),onClick:d=>t.onDeforumFieldInput(o.key,!1,"bool")},"Off",10,UR)])):o.type==="textarea"?(m(),p("textarea",{key:5,class:"framesync-input",rows:o.rows||3,value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onInput:d=>t.onDeforumFieldInput(o.key,d.target.value,"text")},null,40,BR)):(m(),p("input",{key:6,type:"text",class:"framesync-input",value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onInput:d=>t.onDeforumFieldInput(o.key,d.target.value,"text")},null,40,VR))],2)):N("",!0)],64))),128))])])):N("",!0)])])}const $R=nt(fR,[["render",zR]]),GR={name:"DeforumControlPanel",components:{CommonVisualStrip:AC,DeforumMotionPads:ty,DeforumSettingsBody:$R},props:{app:{type:Object,required:!0},visualPluginId:{type:String,default:""},showMacroKnobs:{type:Boolean,default:!0},showMotionPads:{type:Boolean,default:!0},showSettings:{type:Boolean,default:!0},motionPadsShowReadout:{type:Boolean,default:!1},motionPadsShowAxisSliders:{type:Boolean,default:!0}},setup(t){return Et(t)}},HR={class:"deforum-control-panel","data-testid":"deforum-control-panel"};function WR(t,e,i,n,s,r){const l=Ne("CommonVisualStrip"),o=Ne("DeforumMotionPads"),d=Ne("DeforumSettingsBody");return m(),p("div",HR,[i.showMacroKnobs?(m(),at(l,{key:0,app:i.app,"plugin-id":i.visualPluginId},null,8,["app","plugin-id"])):N("",!0),i.showMotionPads?(m(),at(o,{key:1,app:i.app,"show-readout":i.motionPadsShowReadout,"show-axis-sliders":i.motionPadsShowAxisSliders},null,8,["app","show-readout","show-axis-sliders"])):N("",!0),i.showSettings?(m(),at(d,{key:2,app:i.app},null,8,["app"])):N("",!0)])}const sy=nt(GR,[["render",WR]]),qR={name:"DeforumJobPanel",components:{UiIcon:Kt,LiveParametersPanel:lL,DeforumControlPanel:sy},props:{app:{type:Object,required:!0},engineMode:{type:Boolean,default:!1}},setup(t){return Et(t)}},jR={class:"rack deforum-job-panel","data-testid":"deforum-settings-panel"},XR={class:"framesync-panel deforum-job-panel__head"},KR={class:"framesync-header"},YR={class:"framesync-title"},JR={class:"framesync-subtitle deforum-job-panel__summary"},ZR={class:"deforum-job-panel__transport"},QR={key:0,class:"framesync-subtitle deforum-job-panel__status"},e3={class:"param-drawer-body deforum-settings-body"},t3={class:"deforum-settings-toolbar"},i3=["disabled"],n3={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},s3=["disabled"],r3={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},o3=["disabled"],a3={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},l3={class:"deforum-advanced-toggle"},d3={key:0,class:"deforum-advanced-json"},u3={key:0,class:"deforum-json-error"},c3={key:1,class:"deforum-verify-results","data-testid":"deforum-verify-results"},h3={class:"deforum-verify-results__head"},f3={class:"deforum-verify-results__counts"},m3={key:0,class:"deforum-verify-results__badge deforum-verify-results__badge--error"},p3={key:1,class:"deforum-verify-results__badge deforum-verify-results__badge--warn"},g3={key:0,class:"deforum-verify-results__list deforum-verify-results__list--error"},y3={key:0,class:"deforum-verify-results__hint"},v3={key:1,class:"deforum-verify-results__list deforum-verify-results__list--warn"},b3={key:0,class:"deforum-verify-results__hint"},_3={key:2,class:"deforum-verify-results deforum-verify-results--ok","data-testid":"deforum-verify-results"},S3={key:3,class:"deforum-settings-stack"};function w3(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("DeforumControlPanel"),d=Ne("LiveParametersPanel");return m(),p("div",jR,[a("div",XR,[a("div",KR,[a("div",YR,[ve(l,{class:"framesync-title-icon",name:"film"}),e[9]||(e[9]=a("span",{class:"framesync-accent"},"Deforum",-1))]),a("span",{class:B(["perf-mode-badge",t.deforumPlaying?"mode-animate":"mode-preview"])},b(t.deforumPlaying?"Animating":"Ready"),3)]),a("p",JR,[e[10]||(e[10]=ie(" Batch ",-1)),a("strong",null,b(t.deforumSettings.batch_name||"—"),1),ie(" · "+b(t.deforumSettings.max_frames||0)+" frames @ "+b(t.deforumSettings.fps||24)+" fps ",1)]),a("div",ZR,[a("button",{type:"button",class:B(["framesync-button",{active:t.deforumPlaying}]),onClick:e[0]||(e[0]=(...u)=>t.toggleDeforumPlay&&t.toggleDeforumPlay(...u))},b(t.deforumPlaying?"Pause job":"Play job"),3),a("button",{type:"button",class:"framesync-button",onClick:e[1]||(e[1]=(...u)=>t.stopDeforumPlay&&t.stopDeforumPlay(...u))},"Stop")]),t.deforumSettingsStatus?(m(),p("div",QR,b(t.deforumSettingsStatus),1)):N("",!0)]),a("div",e3,[a("div",t3,[a("button",{type:"button",class:"framesync-button",disabled:t.deforumSettingsLoading,onClick:e[2]||(e[2]=(...u)=>t.loadDeforumSettings&&t.loadDeforumSettings(...u))},[t.deforumSettingsLoading?(m(),p("span",n3,[...e[11]||(e[11]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Reload",-1)])])):(m(),p(H,{key:1},[ie("↻ Reload")],64))],8,i3),a("button",{type:"button",class:"framesync-button",disabled:t.deforumSettingsSaving,onClick:e[3]||(e[3]=(...u)=>t.saveDeforumSettings&&t.saveDeforumSettings(...u))},[t.deforumSettingsSaving?(m(),p("span",r3,[...e[12]||(e[12]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Save",-1)])])):(m(),p(H,{key:1},[ie("💾 Save")],64))],8,s3),a("button",{type:"button",class:B(["framesync-button",{"framesync-button--loading":t.previewGenerating}]),disabled:t.previewGenerating,onClick:e[4]||(e[4]=(...u)=>t.generateDeforumPreviewFrame&&t.generateDeforumPreviewFrame(...u))},[t.previewGenerating?(m(),p("span",a3,[...e[13]||(e[13]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Regenerate frame",-1)])])):(m(),p(H,{key:1},[ie("🖼 Regenerate frame")],64))],10,o3),a("label",l3,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[5]||(e[5]=u=>t.deforumAdvancedOpen=u)},null,512),[[xi,t.deforumAdvancedOpen]]),e[14]||(e[14]=ie(" JSON ",-1))]),a("button",{type:"button",class:"framesync-button","data-testid":"deforum-settings-verify",title:"Check settings for errors and optimization hints",onClick:e[6]||(e[6]=(...u)=>t.runDeforumSettingsVerify&&t.runDeforumSettingsVerify(...u))}," Verify ")]),t.deforumAdvancedOpen?(m(),p("div",d3,[J(a("textarea",{class:"framesync-input deforum-json-editor","onUpdate:modelValue":e[7]||(e[7]=u=>t.deforumSettingsJson=u),rows:"12",spellcheck:"false",onBlur:e[8]||(e[8]=(...u)=>t.applyDeforumSettingsJson&&t.applyDeforumSettingsJson(...u))},null,544),[[ye,t.deforumSettingsJson]]),t.deforumSettingsJsonError?(m(),p("p",u3,b(t.deforumSettingsJsonError),1)):N("",!0)])):t.deforumVerifyResults&&(t.deforumVerifyResults.errors.length||t.deforumVerifyResults.warnings.length)?(m(),p("div",c3,[a("div",h3,[e[15]||(e[15]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Verification",-1)),a("span",f3,[t.deforumVerifyResults.errors.length?(m(),p("span",m3,b(t.deforumVerifyResults.errors.length)+" error"+b(t.deforumVerifyResults.errors.length===1?"":"s"),1)):N("",!0),t.deforumVerifyResults.warnings.length?(m(),p("span",p3,b(t.deforumVerifyResults.warnings.length)+" hint"+b(t.deforumVerifyResults.warnings.length===1?"":"s"),1)):N("",!0)])]),t.deforumVerifyResults.errors.length?(m(),p("ul",g3,[(m(!0),p(H,null,oe(t.deforumVerifyResults.errors,(u,h)=>(m(),p("li",{key:"deforum-verr-"+h},[a("strong",null,b(u.field),1),ie(" — "+b(u.message)+" ",1),u.hint?(m(),p("span",y3,b(u.hint),1)):N("",!0)]))),128))])):N("",!0),t.deforumVerifyResults.warnings.length?(m(),p("ul",v3,[(m(!0),p(H,null,oe(t.deforumVerifyResults.warnings,(u,h)=>(m(),p("li",{key:"deforum-vwarn-"+h},[a("strong",null,b(u.field),1),ie(" — "+b(u.message)+" ",1),u.hint?(m(),p("span",b3,b(u.hint),1)):N("",!0)]))),128))])):N("",!0)])):t.deforumVerifyResults&&!t.deforumVerifyResults.errors.length&&!t.deforumVerifyResults.warnings.length?(m(),p("p",_3," Settings look good — no issues found. ")):(m(),p("div",S3,[ve(o,{app:i.app,"visual-plugin-id":"deforum","show-macro-knobs":!i.engineMode,"show-motion-pads":!i.engineMode,"show-settings":!0},null,8,["app","show-macro-knobs","show-motion-pads"]),i.engineMode?(m(),at(d,{key:0,app:i.app},null,8,["app"])):N("",!0)]))])])}const M3=nt(qR,[["render",w3]]),P3={name:"DeforumPluginPanel",components:{DeforumJobPanel:M3},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}};function x3(t,e,i,n,s,r){const l=Ne("DeforumJobPanel");return m(),at(l,{app:i.app,"engine-mode":""},null,8,["app"])}const T3=nt(P3,[["render",x3]]),A3={name:"WanPluginPanel",props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},E3={class:"wan-engine-controls animation-plugin-panel","data-testid":"wan-plugin-panel"},C3={class:"wan-engine-controls__speed"},k3={class:"chips"},L3=["data-testid","onClick"],R3={class:"wan-engine-controls__motion"},D3={class:"motion-preset-row"},I3=["data-testid","onClick"],F3={class:"animatelcm-plugin-panel__motion-loras wan-engine-controls__loras"},N3={class:"chips"},O3=["data-testid","title","onClick"],U3={key:0,class:"animatelcm-plugin-panel__lora-weight"},B3=["value"],V3={class:"wan-engine-controls__init","data-testid":"wan-init-section"},z3={class:"wan-engine-controls__toggle"},$3=["checked","disabled"],G3={key:0,class:"img2img-dropzone__preview"},H3=["src"],W3={key:1,class:"img2img-dropzone__empty"},q3={class:"wan-engine-controls__init-actions"},j3=["disabled"],X3=["disabled"],K3={key:0,class:"wan-engine-controls__init-i2v"},Y3={class:"framesync-stack wan-engine-controls__field"},J3=["value"],Z3=["value"],Q3={class:"framesync-stack wan-engine-controls__field"},eD=["value"],tD={class:"wan-engine-controls__download","data-testid":"wan-download-section"},iD={class:"wan-engine-controls__download-row"},nD=["disabled","data-testid","title","onClick"],sD={class:"wan-engine-controls__toggle"},rD=["checked"],oD={class:"wan-engine-controls__toggle"},aD=["checked"],lD={key:0,class:"framesync-subtitle wan-engine-controls__download-status","data-testid":"wan-download-status"},dD={class:"wan-engine-controls__advanced"},uD={class:"wan-engine-controls__grid"},cD={key:0,class:"wan-engine-controls__toggle"},hD=["checked","data-testid","onChange"],fD={key:1,class:"framesync-stack wan-engine-controls__field"},mD={class:"framesync-subtitle"},pD=["data-testid","value","onChange"],gD=["value"],yD=["data-testid","min","max","step","value","onInput"],vD=["data-testid","value","onInput"];function bD(t,e,i,n,s,r){return m(),p("div",E3,[e[26]||(e[26]=a("div",{class:"framesync-subtitle"},"WAN Video · steer generation",-1)),e[27]||(e[27]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"},[ie(" Uses Deforum "),a("code",null,"animation_mode: Wan Video"),ie(" on Forge. Prompts come from the Prompts tab; models download on Forge when auto-download is enabled. ")],-1)),a("div",C3,[e[11]||(e[11]=a("div",{class:"framesync-subtitle"},"Speed preset",-1)),a("div",k3,[(m(!0),p(H,null,oe(t.wanSpeedPresetNames,l=>(m(),p("button",{key:"wan-speed-"+l,type:"button",class:B(["chip",{active:t.wanEngine.wan_speed_preset===l,"chip--live":l==="Turbo"||l==="Fast"}]),"data-testid":"wan-speed-preset-"+l,onClick:o=>t.applyWanSpeedPreset(l)},b(l),11,L3))),128))]),e[12]||(e[12]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"}," Turbo/Fast use fewer inference steps + flash attention (similar to LCM-style quick passes). ",-1))]),a("div",R3,[e[13]||(e[13]=a("div",{class:"framesync-subtitle"},"Motion preset",-1)),a("div",D3,[(m(!0),p(H,null,oe(t.wanMotionPresetNames,l=>(m(),p("button",{key:"wan-motion-"+l,type:"button",class:B(["chip",{active:t.wanEngine.wan_motion_preset===l}]),"data-testid":"wan-motion-preset-"+l,onClick:o=>t.applyWanMotionPreset(l)},b(l),11,I3))),128))])]),a("div",F3,[e[15]||(e[15]=a("div",{class:"framesync-subtitle"},"Motion LoRA (prompt tags)",-1)),a("div",N3,[(m(!0),p(H,null,oe(t.wanMotionLoras,l=>(m(),p("button",{key:"wan-lora-"+l.id,type:"button",class:B(["chip",{active:t.activeWanMotionLoras.includes(l.id)}]),"data-testid":"wan-motion-lora-"+l.id,title:l.id,onClick:o=>t.toggleWanMotionLora(l.id)},b(l.label),11,O3))),128))]),t.activeWanMotionLoras.length>0?(m(),p("div",U3,[e[14]||(e[14]=a("div",{class:"framesync-subtitle"},"LoRA weight",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"wan-motion-lora-weight",min:"0",max:"1.5",step:"0.05",value:t.wanEngine.motion_lora_weight,onInput:e[0]||(e[0]=l=>t.onWanEngineFieldChange("motion_lora_weight",l.target.value,"number"))},null,40,B3)])):N("",!0)]),a("div",V3,[e[20]||(e[20]=a("div",{class:"framesync-subtitle"},"Image init (I2V)",-1)),e[21]||(e[21]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"},[ie(" Start the first clip from a still image. Forge uses Deforum "),a("code",null,"use_init"),ie(" + I2V chaining for later clips. ")],-1)),a("label",z3,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_use_init_image,disabled:!t.wanEngine.wan_init_image,"data-testid":"wan-field-wan_use_init_image",onChange:e[1]||(e[1]=l=>t.onWanEngineFieldChange("wan_use_init_image",l.target.checked,"boolean"))},null,40,$3),e[16]||(e[16]=a("span",null,"Use init image for first frame",-1))]),a("div",{class:B(["img2img-dropzone wan-engine-controls__init-drop",{"img2img-dropzone--filled":!!t.wanEngine.wan_init_image}]),"data-testid":"wan-init-dropzone",onDragover:e[3]||(e[3]=lt(()=>{},["prevent"])),onDrop:e[4]||(e[4]=lt((...l)=>t.handleWanInitImageDrop&&t.handleWanInitImageDrop(...l),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input","data-testid":"wan-init-file-input",onChange:e[2]||(e[2]=(...l)=>t.handleWanInitImageFile&&t.handleWanInitImageFile(...l))},null,32),t.wanEngine.wan_init_image?(m(),p("div",G3,[a("img",{src:t.wanEngine.wan_init_image,alt:"Wan init preview",class:"img2img-dropzone__image"},null,8,H3)])):(m(),p("div",W3,[...e[17]||(e[17]=[a("div",{class:"img2img-dropzone__title"},"Init image",-1),a("div",{class:"img2img-dropzone__hint"},"Drag and drop or click to browse",-1)])]))],34),a("div",q3,[a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.img2img.dataUrl,"data-testid":"wan-init-from-img2img",onClick:e[5]||(e[5]=(...l)=>t.useImg2imgAsWanInit&&t.useImg2imgAsWanInit(...l))}," Use Prompts → IMAGE input ",8,j3),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.wanEngine.wan_init_image,"data-testid":"wan-init-clear",onClick:e[6]||(e[6]=(...l)=>t.clearWanInitImage&&t.clearWanInitImage(...l))}," Clear init ",8,X3)]),t.wanEngine.wan_init_image?(m(),p("div",K3,[a("div",Y3,[e[18]||(e[18]=a("div",{class:"framesync-subtitle"},"I2V model (first frame + chaining)",-1)),a("select",{class:"framesync-select","data-testid":"wan-field-wan_i2v_model",value:t.wanEngine.wan_i2v_model,onChange:e[7]||(e[7]=l=>t.onWanEngineFieldChange("wan_i2v_model",l.target.value,"select"))},[(m(!0),p(H,null,oe(t.wanI2vModelOptions,l=>(m(),p("option",{key:"wan-i2v-"+l,value:l},b(l),9,Z3))),128))],40,J3)]),a("div",Q3,[e[19]||(e[19]=a("div",{class:"framesync-subtitle"},"Init strength (I2V conditioning)",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"wan-field-wan_i2v_init_strength",min:"0",max:"1",step:"0.05",value:t.wanEngine.wan_i2v_init_strength,onInput:e[8]||(e[8]=l=>t.onWanEngineFieldChange("wan_i2v_init_strength",l.target.value,"number"))},null,40,eD)])])):N("",!0)]),a("div",tD,[e[24]||(e[24]=a("div",{class:"framesync-subtitle"},"Models on Forge",-1)),a("div",iD,[(m(!0),p(H,null,oe(t.wanDownloadPackages,l=>(m(),p("button",{key:"wan-dl-"+l.id,type:"button",class:"framesync-button framesync-button--compact",disabled:t.wanDownloadBusy,"data-testid":"wan-download-"+l.id,title:l.hfCommand,onClick:o=>t.requestWanModelDownload(l.id)},b(t.wanDownloadBusy?"…":"↓")+" "+b(l.label),9,nD))),128))]),a("label",sD,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_auto_download,"data-testid":"wan-field-wan_auto_download",onChange:e[9]||(e[9]=l=>t.onWanEngineFieldChange("wan_auto_download",l.target.checked,"boolean"))},null,40,rD),e[22]||(e[22]=a("span",null,"Auto-download missing Wan models on Forge",-1))]),a("label",oD,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_qwen_auto_download,"data-testid":"wan-field-wan_qwen_auto_download",onChange:e[10]||(e[10]=l=>t.onWanEngineFieldChange("wan_qwen_auto_download",l.target.checked,"boolean"))},null,40,aD),e[23]||(e[23]=a("span",null,"Auto-download Qwen enhancer models",-1))]),t.wanDownloadStatus?(m(),p("p",lD,b(t.wanDownloadStatus),1)):N("",!0)]),a("details",dD,[e[25]||(e[25]=a("summary",{class:"framesync-subtitle"},"Advanced Wan settings",-1)),a("div",uD,[(m(!0),p(H,null,oe(t.wanEngineControlFields,l=>(m(),p(H,{key:"wan-field-"+l.key},[l.type==="boolean"?(m(),p("div",cD,[a("label",null,[a("input",{type:"checkbox",checked:!!t.wanEngine[l.key],"data-testid":"wan-field-"+l.key,onChange:o=>t.onWanEngineFieldChange(l.key,o.target.checked,"boolean")},null,40,hD),a("span",null,b(l.label),1)])])):(m(),p("div",fD,[a("div",mD,b(l.label),1),l.type==="select"?(m(),p("select",{key:0,class:"framesync-select","data-testid":"wan-field-"+l.key,value:t.wanEngine[l.key],onChange:o=>t.onWanEngineFieldChange(l.key,o.target.value,"select")},[(m(!0),p(H,null,oe(l.options,o=>(m(),p("option",{key:l.key+"-"+o,value:o},b(o),9,gD))),128))],40,pD)):l.type==="number"?(m(),p("input",{key:1,type:"number",class:"framesync-input","data-testid":"wan-field-"+l.key,min:l.min,max:l.max,step:l.step,value:t.wanEngine[l.key],onInput:o=>t.onWanEngineFieldChange(l.key,o.target.value,"number")},null,40,yD)):(m(),p("input",{key:2,type:"text",class:"framesync-input","data-testid":"wan-field-"+l.key,value:t.wanEngine[l.key],onInput:o=>t.onWanEngineFieldChange(l.key,o.target.value,"text")},null,40,vD))]))],64))),128))])])])}const _D=nt(A3,[["render",bD]]),SD={name:"AnimateLcmPluginPanel",props:{app:{type:Object,required:!0}},setup(t){return Et(t)},computed:{motionQuickPresets(){return["Static","Orbit","Tunnel","Handheld","Chaos"]},activeMotionLoras(){var t;return Array.isArray((t=this.animateLcmEngine)==null?void 0:t.motion_loras)?this.animateLcmEngine.motion_loras:[]}}},wD={class:"animatelcm-plugin-panel animation-plugin-panel","data-testid":"animatelcm-plugin-panel"},MD={class:"animatelcm-plugin-panel__motion-type"},PD={class:"chips"},xD=["data-testid","onClick"],TD={class:"motion-preset-row"},AD=["onClick"],ED={class:"animatelcm-plugin-panel__motion-loras"},CD={class:"chips"},kD=["data-testid","title","onClick"],LD={key:0,class:"animatelcm-plugin-panel__lora-weight"},RD=["value"],DD={class:"wan-engine-controls__grid"},ID={key:0},FD={key:1,class:"framesync-stack wan-engine-controls__field"},ND={class:"framesync-subtitle"},OD=["data-testid","min","max","step","value","onInput"];function UD(t,e,i,n,s,r){return m(),p("div",wD,[e[4]||(e[4]=a("div",{class:"framesync-subtitle"},"AnimateLCM · fast temporal generation",-1)),e[5]||(e[5]=a("p",{class:"framesync-subtitle animatelcm-plugin-panel__hint"}," Runs as its own Forge animation mode. Independent from Settings → LCM Engine (global sampling shortcut). ",-1)),a("div",MD,[e[1]||(e[1]=a("div",{class:"framesync-subtitle"},"Motion type",-1)),a("div",PD,[(m(!0),p(H,null,oe(t.animateLcmMotionTypes,l=>(m(),p("button",{key:"alcm-type-"+l.id,type:"button",class:B(["chip",{active:t.animateLcmEngine.motion_type===l.id}]),"data-testid":"animatelcm-motion-type-"+l.id,onClick:o=>t.setAnimateLcmMotionType(l.id)},b(l.label),11,xD))),128))])]),a("div",TD,[(m(!0),p(H,null,oe(r.motionQuickPresets,l=>(m(),p("button",{key:"alcm-preset-"+l,type:"button",class:B(["chip",{active:t.animateLcmEngine.motion_preset===l}]),onClick:o=>t.applyAnimateLcmMotionPreset(l)},b(l),11,AD))),128))]),a("div",ED,[e[3]||(e[3]=a("div",{class:"framesync-subtitle"},"Motion LoRA",-1)),a("div",CD,[(m(!0),p(H,null,oe(t.animateLcmMotionLoras,l=>(m(),p("button",{key:"alcm-lora-"+l.id,type:"button",class:B(["chip",{active:r.activeMotionLoras.includes(l.id)}]),"data-testid":"animatelcm-motion-lora-"+l.id,title:l.id,onClick:o=>t.toggleAnimateLcmMotionLora(l.id)},b(l.label),11,kD))),128))]),r.activeMotionLoras.length>0?(m(),p("div",LD,[e[2]||(e[2]=a("div",{class:"framesync-subtitle"},"LoRA weight",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"animatelcm-motion-lora-weight",min:"0",max:"1.5",step:"0.05",value:t.animateLcmEngine.motion_lora_weight,onInput:e[0]||(e[0]=l=>t.onAnimateLcmFieldChange("motion_lora_weight",l.target.value,"number"))},null,40,RD)])):N("",!0)]),a("div",DD,[(m(!0),p(H,null,oe(t.animateLcmControlFields,l=>(m(),p(H,{key:"alcm-field-"+l.key},[l.key==="motion_type"||l.key==="motion_preset"||l.key==="motion_lora_weight"?(m(),p("div",ID)):(m(),p("div",FD,[a("div",ND,b(l.label),1),a("input",{type:"number",class:"framesync-input","data-testid":"animatelcm-field-"+l.key,min:l.min,max:l.max,step:l.step,value:t.animateLcmEngine[l.key],onInput:o=>t.onAnimateLcmFieldChange(l.key,o.target.value,"number")},null,40,OD)]))],64))),128))])])}const BD=nt(SD,[["render",UD]]),VD={name:"CompositorControls",components:{UiIcon:Kt},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},zD={class:"compositor-panel","data-testid":"preview-compositor-controls"},$D={class:"compositor-panel__head"},GD={class:"compositor-panel__cards"},HD={class:"compositor-card"},WD={class:"compositor-card__row"},qD=["aria-pressed"],jD={class:"compositor-big-toggle__label"},XD={class:"compositor-card"},KD={class:"compositor-card__row"},YD=["aria-pressed"],JD={class:"compositor-big-toggle__label"},ZD={class:"compositor-card compositor-card--slider"},QD={class:"compositor-card__slider-head"},eI={class:"compositor-card__value"},tI={key:0,class:"compositor-card compositor-card--action"},iI={class:"compositor-card","data-testid":"compositor-deforum-backdrop"},nI={class:"compositor-card__row"},sI={class:"compositor-card__toggle"},rI=["checked"],oI={key:0,class:"compositor-card__slider-row"},aI={class:"compositor-card__hint"},lI={class:"compositor-card compositor-card--lfo","data-testid":"compositor-lfo-links"},dI={class:"compositor-lfo-grid"},uI=["data-testid","onClick"];function cI(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("section",zD,[a("header",$D,[ve(l,{class:"compositor-panel__icon",name:"film","aria-hidden":"true"}),e[9]||(e[9]=a("div",{class:"compositor-panel__head-copy"},[a("h3",{class:"compositor-panel__title"},"Preview compositor"),a("p",{class:"compositor-panel__subtitle"},"Crossfade, auto-switch, and forge mix routing")],-1))]),a("div",GD,[a("article",HD,[a("div",WD,[e[11]||(e[11]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Auto-switch to Deforum"),a("span",{class:"compositor-card__hint"},"Jump preview to Deforum when new frames arrive")],-1)),a("button",{type:"button",class:B(["compositor-big-toggle",{"compositor-big-toggle--on":t.defaultAnimation.autoTransitionToDeforum!==!1}]),"data-testid":"auto-transition-deforum","aria-pressed":t.defaultAnimation.autoTransitionToDeforum!==!1?"true":"false",onClick:e[0]||(e[0]=o=>{t.defaultAnimation.autoTransitionToDeforum=t.defaultAnimation.autoTransitionToDeforum===!1,t.onDefaultAnimationInput()})},[e[10]||(e[10]=a("span",{class:"compositor-big-toggle__track","aria-hidden":"true"},[a("span",{class:"compositor-big-toggle__thumb"})],-1)),a("span",jD,b(t.defaultAnimation.autoTransitionToDeforum!==!1?"On":"Off"),1)],10,qD)])]),a("article",XD,[a("div",KD,[e[13]||(e[13]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Remember preview layer"),a("span",{class:"compositor-card__hint"},"Restore last active layer after reload")],-1)),a("button",{type:"button",class:B(["compositor-big-toggle",{"compositor-big-toggle--on":!!t.defaultAnimation.rememberCompositorLayerOnStartup}]),"data-testid":"remember-compositor-layer","aria-pressed":t.defaultAnimation.rememberCompositorLayerOnStartup?"true":"false",onClick:e[1]||(e[1]=o=>{t.defaultAnimation.rememberCompositorLayerOnStartup=!t.defaultAnimation.rememberCompositorLayerOnStartup,t.onDefaultAnimationInput()})},[e[12]||(e[12]=a("span",{class:"compositor-big-toggle__track","aria-hidden":"true"},[a("span",{class:"compositor-big-toggle__thumb"})],-1)),a("span",JD,b(t.defaultAnimation.rememberCompositorLayerOnStartup?"On":"Off"),1)],10,YD)])]),a("article",ZD,[a("div",QD,[e[14]||(e[14]=a("span",{class:"compositor-card__label"},"Crossfade duration",-1)),a("span",eI,b(t.defaultAnimation.previewCompositorCrossfadeMs?t.defaultAnimation.previewCompositorCrossfadeMs>=1e3?(t.defaultAnimation.previewCompositorCrossfadeMs/1e3).toFixed(t.defaultAnimation.previewCompositorCrossfadeMs%1e3===0?0:1)+"s":Math.round(t.defaultAnimation.previewCompositorCrossfadeMs)+"ms":"Instant"),1)]),J(a("input",{class:"framesync-input compositor-card__range",type:"range",min:"0",max:"5000",step:"50","onUpdate:modelValue":e[2]||(e[2]=o=>t.defaultAnimation.previewCompositorCrossfadeMs=o),"data-testid":"preview-compositor-crossfade-ms",onInput:e[3]||(e[3]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ye,t.defaultAnimation.previewCompositorCrossfadeMs,void 0,{number:!0}]])]),t.defaultAnimation.autoTransitionToDeforum===!1?(m(),p("article",tI,[a("button",{type:"button",class:"framesync-button compositor-panel__promote","data-testid":"promote-to-deforum",onClick:e[4]||(e[4]=o=>t.promoteToDeforum())}," Promote to Deforum now ")])):N("",!0),a("article",iI,[a("div",nI,[e[15]||(e[15]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Deforum frame in WebGL"),a("span",{class:"compositor-card__hint"},"Latest generated frame as standby background")],-1)),a("label",sI,[a("input",{type:"checkbox",checked:t.defaultAnimation.deforumBackdropEnabled!==!1,"data-testid":"deforum-backdrop-enabled",onChange:e[5]||(e[5]=o=>{t.defaultAnimation.deforumBackdropEnabled=o.target.checked,t.onDefaultAnimationInput(),t.syncDeforumBackdropToWebGL()})},null,40,rI)])]),t.defaultAnimation.deforumBackdropEnabled!==!1?(m(),p("div",oI,[a("span",aI,"Backdrop mix "+b(Math.round((t.defaultAnimation.deforumBackdropMix||0)*100))+"%",1),J(a("input",{class:"framesync-input compositor-card__range",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[6]||(e[6]=o=>t.defaultAnimation.deforumBackdropMix=o),"data-testid":"deforum-backdrop-mix",onInput:e[7]||(e[7]=o=>{t.onDefaultAnimationInput(),t.syncDeforumBackdropToWebGL()})},null,544),[[ye,t.defaultAnimation.deforumBackdropMix,void 0,{number:!0}]])])):N("",!0)]),a("article",lI,[e[16]||(e[16]=a("span",{class:"compositor-card__label"},"Forge mix LFO",-1)),e[17]||(e[17]=a("p",{class:"compositor-card__hint compositor-card__hint--block"}," LFO modulates forge opacity on WebGL + Deforum (Both). Route audio into LFO depth from MODULATION. ",-1)),a("div",dI,[a("button",{type:"button",class:B(["compositor-lfo-chip",{active:!t.defaultAnimation.forgeLayerOpacityLfoLink}]),onClick:e[8]||(e[8]=o=>t.setForgeLayerOpacityLfoLink(null))}," Manual ",2),(m(!0),p(H,null,oe(t.lfos.slice(0,6),o=>(m(),p("button",{key:"compositor-lfo-"+o.id,type:"button",class:B(["compositor-lfo-chip",{active:t.defaultAnimation.forgeLayerOpacityLfoLink===o.id}]),"data-testid":"compositor-lfo-link-"+o.id,onClick:d=>t.setForgeLayerOpacityLfoLink(o.id)}," LFO "+b(o.id),11,uI))),128))])])])])}const hI=nt(VD,[["render",cI]]),fI={name:"EngineLayerControls",components:{WebGLPluginPanel:$k,DeforumPluginPanel:T3,WanPluginPanel:_D,AnimateLcmPluginPanel:BD},props:{app:{type:Object,required:!0},layerId:{type:String,required:!0}},setup(t){return Et(t)}},mI=["data-testid"],pI={key:4,class:"engine-layer-controls__blend"},gI={class:"slider-row"},yI={key:5,class:"engine-layer-controls__input"};function vI(t,e,i,n,s,r){var h,c,f,g,y,T;const l=Ne("WebGLPluginPanel"),o=Ne("DeforumPluginPanel"),d=Ne("WanPluginPanel"),u=Ne("AnimateLcmPluginPanel");return m(),p("div",{class:"engine-layer-controls","data-testid":"engine-layer-controls-"+i.layerId},[((h=t.findVideoLayer(i.layerId))==null?void 0:h.kind)==="webgl"?(m(),at(l,{key:0,app:i.app},null,8,["app"])):((c=t.findVideoLayer(i.layerId))==null?void 0:c.kind)==="deforum"?(m(),at(o,{key:1,app:i.app},null,8,["app"])):((f=t.findVideoLayer(i.layerId))==null?void 0:f.kind)==="wan"?(m(),at(d,{key:2,app:i.app},null,8,["app"])):((g=t.findVideoLayer(i.layerId))==null?void 0:g.kind)==="animatelcm"?(m(),at(u,{key:3,app:i.app},null,8,["app"])):((y=t.findVideoLayer(i.layerId))==null?void 0:y.kind)==="blend"?(m(),p("div",pI,[e[3]||(e[3]=a("p",{class:"framesync-subtitle engine-layer-controls__hint"}," Composites WebGL under a Forge layer using screen blend. ",-1)),a("div",gI,[e[2]||(e[2]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge opacity",-1)),J(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[0]||(e[0]=_=>t.defaultAnimation.forgeLayerOpacity=_),"data-testid":"forge-layer-opacity",onInput:e[1]||(e[1]=_=>{t.defaultAnimation.forgeLayerOpacityLfoBase=t.defaultAnimation.forgeLayerOpacity,t.onDefaultAnimationInput()})},null,544),[[ye,t.defaultAnimation.forgeLayerOpacity,void 0,{number:!0}]])])])):((T=t.findVideoLayer(i.layerId))==null?void 0:T.kind)==="input"?(m(),p("div",yI,[...e[4]||(e[4]=[a("p",{class:"framesync-subtitle engine-layer-controls__hint"},[ie(" Link a library or cloud video source from "),a("strong",null,"Add source"),ie(" below. ")],-1)])])):N("",!0)],8,mI)}const bI=nt(fI,[["render",vI]]),_I={name:"AnimationEnginePanel",components:{UiIcon:Kt,EngineLayerControls:bI,CompositorControls:hI},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},SI={class:"animation-engine-panel","data-testid":"animation-engine-panel"},wI={key:0,class:"live-frame-processing-banner","data-testid":"live-frame-processing-banner","aria-live":"polite"},MI={class:"lazy-loading-indicator lazy-loading-indicator--inline"},PI={class:"live-frame-processing-banner__hint"},xI={class:"animation-engine-panel__head"},TI={class:"animation-engine-panel__title-block"},AI={class:"framesync-title"},EI={class:"animation-engine-panel__head-actions"},CI={class:"animation-engine-layer-list","data-testid":"animation-engine-layer-list"},kI=["data-testid"],LI={class:"animation-engine-layer-row__top"},RI={class:"animation-engine-layer-row__main"},DI=["aria-pressed","data-testid","onClick"],II={class:"animation-engine-layer-row__label"},FI={class:"animation-engine-layer-row__status"},NI={class:"animation-engine-layer-row__mix"},OI={class:"animation-engine-layer-row__mix-head"},UI={class:"animation-engine-layer-row__opacity-value"},BI=["value","disabled","data-testid","onInput"],VI=["title","aria-pressed","data-testid","onClick"],zI={class:"animation-engine-layer-row__visibility-label"},$I=["data-testid","open"],GI={class:"animation-engine-layer-row__controls-summary"},HI={class:"animation-engine-layer-row__controls-body"},WI={class:"animation-engine-panel__compositor-section","data-testid":"animation-engine-compositor-section"},qI={class:"animation-engine-panel__compositor-summary"},jI={class:"animation-engine-panel__compositor-body"};function XI(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("EngineLayerControls"),d=Ne("CompositorControls");return m(),p("div",SI,[t.showFrameProcessingInChrome?(m(),p("div",wI,[a("span",MI,[e[1]||(e[1]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",null,b(t.frameProcessingLabel),1),e[2]||(e[2]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))]),a("span",PI,b(t.frameProcessingHint),1)])):N("",!0),a("div",xI,[a("div",TI,[a("div",AI,[ve(l,{class:"framesync-title-icon",name:"film"}),e[3]||(e[3]=a("span",{class:"framesync-accent"},"All layers",-1))]),e[4]||(e[4]=a("span",{class:"framesync-subtitle animation-engine-panel__subtitle"},"Compositor & per-layer controls",-1))]),a("div",EI,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"animation-engine-promote-deforum",title:"Switch preview to Deforum layer",onClick:e[0]||(e[0]=u=>t.promoteToDeforum())}," Deforum → ")])]),a("ul",CI,[(m(!0),p(H,null,oe(t.builtinEngineLayers,u=>(m(),p("li",{key:"engine-layer-row-"+u.id,class:B(["animation-engine-layer-row",{"animation-engine-layer-row--active":t.activeVideoLayerId===u.id,"animation-engine-layer-row--hidden":!t.isVideoLayerPreviewVisible(u)}]),"data-testid":"animation-engine-row-"+u.id},[a("div",LI,[a("div",RI,[a("button",{type:"button",class:B(["animation-engine-layer-row__select",{"animation-engine-layer-row__select--active":t.activeVideoLayerId===u.id}]),"aria-pressed":t.activeVideoLayerId===u.id?"true":"false","data-testid":"animation-engine-"+u.id,onClick:h=>t.selectVideoLayer(u.id)},[a("span",{class:B(["animation-engine-card__dot","animation-engine-card__dot--"+t.layerStatus(u)]),"aria-hidden":"true"},null,2),a("span",II,b(u.label),1),a("span",FI,b(t.videoLayerStatusShort(u)),1)],10,DI),a("div",NI,[a("div",OI,[e[5]||(e[5]=a("span",{class:"animation-engine-layer-row__mix-label"},"Opacity",-1)),a("span",UI,b(Math.round(t.readVideoLayerOpacity(u)*100))+"% ",1)]),a("input",{type:"range",min:"0",max:"1",step:"0.01",class:"animation-engine-layer-row__opacity-slider framesync-input",value:t.readVideoLayerOpacity(u),disabled:!t.isVideoLayerPreviewVisible(u),"data-testid":"animation-engine-opacity-"+u.id,onInput:h=>t.setVideoLayerOpacity(u.id,h.target.value)},null,40,BI)])]),a("button",{type:"button",class:B(["animation-engine-layer-row__visibility-toggle",{"animation-engine-layer-row__visibility-toggle--on":t.isVideoLayerPreviewVisible(u)}]),title:t.isVideoLayerPreviewVisible(u)?"Hide layer in preview":"Show layer in preview","aria-pressed":t.isVideoLayerPreviewVisible(u)?"true":"false","data-testid":"animation-engine-visibility-"+u.id,onClick:lt(h=>t.toggleVideoLayerPreview(u.id),["stop"])},[ve(l,{class:"animation-engine-layer-row__visibility-icon",name:t.isVideoLayerPreviewVisible(u)?"eye":"eye-off","aria-hidden":"true"},null,8,["name"]),a("span",zI,b(t.isVideoLayerPreviewVisible(u)?"On":"Off"),1)],10,VI)]),a("details",{class:"animation-engine-layer-row__controls","data-testid":"animation-engine-controls-"+u.id,open:u.kind==="webgl"||u.kind==="deforum"},[a("summary",GI,[e[6]||(e[6]=a("span",{class:"animation-engine-layer-row__controls-label"},"Controls",-1)),ve(l,{class:"animation-engine-layer-row__controls-chevron",name:"chevron-down","aria-hidden":"true"})]),a("div",HI,[ve(o,{app:i.app,"layer-id":u.id},null,8,["app","layer-id"])])],8,$I)],10,kI))),128))]),a("details",WI,[a("summary",qI,[e[7]||(e[7]=a("span",{class:"animation-engine-panel__compositor-label"},"Compositor",-1)),ve(l,{class:"animation-engine-panel__compositor-chevron",name:"chevron-down","aria-hidden":"true"})]),a("div",jI,[ve(d,{app:i.app},null,8,["app"])])])])}const KI=nt(_I,[["render",XI]]),YI={name:"LibraryMediaCard",components:{UiIcon:Kt},props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},hovered:{type:Boolean,default:!1},showVideoPreview:{type:Boolean,default:!1},showActions:{type:Boolean,default:!0},cardTestId:{type:String,default:"library-media-card"},badges:{type:Array,default:()=>[]}},emits:["click","dblclick","watch","edit","mouseenter","mouseleave","video-ref"],data(){return{mediaLoading:!0}},watch:{"item.id"(){this.mediaLoading=!0},showVideoPreview(){this.mediaLoading=!0}},methods:{setVideoRef(t){this.$emit("video-ref",{id:this.item.id,el:t})},onMediaReady(){this.mediaLoading=!1},onMediaError(){this.mediaLoading=!1}}},JI=["data-testid","data-item-id","data-video-path"],ZI={class:"library-browser__media"},QI={key:0,class:"library-browser__media-loading lazy-loading-indicator lazy-loading-indicator--overlay","aria-hidden":"true"},eF=["src"],tF=["src","alt"],iF=["src"],nF={key:4,class:"library-browser__placeholder","aria-hidden":"true"},sF={key:5,class:"library-browser__badges"},rF={class:"library-browser__copy"},oF={class:"library-browser__title"},aF={key:0,class:"library-browser__meta"},lF={key:0,class:"library-browser__card-actions"};function dF(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("article",{class:B(["library-browser__card",{"library-browser__card--selected":i.selected,"library-browser__card--hover":i.hovered}]),"data-testid":i.cardTestId,"data-item-id":i.item.id,"data-video-path":i.item.videoPath||void 0,onMouseenter:e[8]||(e[8]=o=>t.$emit("mouseenter")),onMouseleave:e[9]||(e[9]=o=>t.$emit("mouseleave")),onClick:e[10]||(e[10]=o=>t.$emit("click",i.item)),onDblclick:e[11]||(e[11]=o=>t.$emit("dblclick",i.item))},[a("div",ZI,[s.mediaLoading?(m(),p("div",QI,[...e[12]||(e[12]=[a("span",{class:"lazy-loading-indicator__spinner"},null,-1)])])):N("",!0),i.showVideoPreview&&i.item.videoUrl?(m(),p("video",{key:1,ref:r.setVideoRef,class:"library-browser__video",muted:"",loop:"",playsinline:"",preload:"metadata",src:i.item.videoUrl,onLoadeddata:e[0]||(e[0]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[1]||(e[1]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,eF)):i.item.thumbUrl?(m(),p("img",{key:2,class:"library-browser__thumb",src:i.item.thumbUrl,alt:i.item.title,loading:"lazy",onLoad:e[2]||(e[2]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[3]||(e[3]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,tF)):i.item.videoUrl?(m(),p("video",{key:3,class:"library-browser__video library-browser__video--poster",muted:"",playsinline:"",preload:"metadata",src:i.item.videoUrl,onLoadeddata:e[4]||(e[4]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[5]||(e[5]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,iF)):(m(),p("div",nF,[ve(l,{name:"film"})])),i.badges.length?(m(),p("div",sF,[(m(!0),p(H,null,oe(i.badges,(o,d)=>(m(),p("span",{key:"badge-"+d,class:B(["library-browser__badge",o.variant?`library-browser__badge--${o.variant}`:null])},b(o.label),3))),128))])):N("",!0)]),a("div",rF,[a("h3",oF,b(i.item.title),1),i.item.meta?(m(),p("p",aF,b(i.item.meta),1)):N("",!0)]),i.showActions&&i.item.videoUrl?(m(),p("div",lF,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[6]||(e[6]=lt(o=>t.$emit("watch",i.item),["stop"]))}," Watch "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[7]||(e[7]=lt(o=>t.$emit("edit",i.item),["stop"]))}," Edit ")])):N("",!0)],42,JI)}const ry=nt(YI,[["render",dF]]),uF={name:"ProjectsBrowser",components:{LibraryMediaCard:ry},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{projects:[],loading:!1,status:"",selectedId:null,hoveredId:null,fullscreenProject:null,previewVideos:{},dropzoneActive:!1,dropzoneDepth:0}},mounted(){this.active&&this.loadProjects(),document.addEventListener("keydown",this.onFullscreenKey)},beforeUnmount(){document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllPreviewVideos()},methods:{async loadProjects(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/projects"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load projects");this.projects=(Array.isArray(e.projects)?e.projects:[]).map(i=>({...i,meta:this.formatProjectMeta(i)}))}catch(t){this.status=t.message||"Projects unavailable",this.projects=[]}finally{this.loading=!1}},projectBadges(t){const e=[];return t.frameCount>0&&e.push({label:`${t.frameCount} frame${t.frameCount===1?"":"s"}`}),t.hasVideo&&e.push({label:"Video",variant:"video"}),e},formatProjectMeta(t){const e=[];if(t.frameCount>0&&e.push(`${t.frameCount} frame${t.frameCount===1?"":"s"}`),t.hasVideo&&e.push("video ready"),t.updatedAt){const i=new Date(t.updatedAt);Number.isNaN(i.getTime())||e.push(i.toLocaleDateString(void 0,{month:"short",day:"numeric"}))}return e.join(" · ")||"Empty project"},shouldPreviewVideo(t){return!!(t.hasVideo&&t.videoUrl&&(this.hoveredId===t.id||this.selectedId===t.id))},onPreviewVideoRef({id:t,el:e}){e?this.previewVideos[t]=e:delete this.previewVideos[t]},pauseAllPreviewVideos(){Object.values(this.previewVideos).forEach(t=>{try{t.pause()}catch{}})},selectProject(t){this.selectedId=(t==null?void 0:t.id)||null;const e=t?{...t,meta:this.formatProjectMeta(t)}:null;this.app.librarySelectedProject=e,this.app.librarySelectedVideo=e,t!=null&&t.hasVideo&&(t!=null&&t.videoUrl)&&this.$nextTick(()=>{var i,n;(n=(i=this.previewVideos[t.id])==null?void 0:i.play)==null||n.call(i).catch(()=>{})})},openProject(t){!(t!=null&&t.hasVideo)||!t.videoUrl||(this.fullscreenProject=t,this.$nextTick(()=>{var e,i;(i=(e=this.$refs.modalVideoEl)==null?void 0:e.play)==null||i.call(e).catch(()=>{})}))},closeFullscreen(){this.fullscreenProject=null},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeFullscreen()},onFullscreenKey(t){this.fullscreenProject&&t.key==="Escape"&&(t.stopPropagation(),this.closeFullscreen())},openProjectInEditor(t){if(!(t!=null&&t.videoPath)){this.status="This project has no video yet";return}this.app.openInVideoEditor({path:t.videoPath,rootId:t.rootId||"uploads",name:t.title,url:t.videoUrl})},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadVideoFile(t){if(!t)return;const e=String(t.name||"upload.mp4"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(i)){this.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await t.arrayBuffer(),r=new URLSearchParams({name:e,dir:"projects"}),l=await fetch(`/api/video-swarm/upload?${r.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":e},body:s}),o=await l.json();if(!l.ok)throw new Error(o.error||"Upload failed");this.status="Video added to Projects",await this.loadProjects();const d=this.projects.find(u=>u.videoPath===o.path);d&&this.selectProject(d)}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadVideoFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).forEach(s=>{this.uploadVideoFile(s)})}},watch:{active(t){t&&!this.projects.length&&!this.loading&&this.loadProjects()},hoveredId(t){this.$nextTick(()=>{Object.entries(this.previewVideos).forEach(([e,i])=>{var n;i&&(e===t||e===this.selectedId?(n=i.play)==null||n.call(i).catch(()=>{}):(i.pause(),i.currentTime=0))})})}}},cF={class:"library-browser__panel projects-browser","data-testid":"projects-browser"},hF={class:"library-browser__toolbar framesync-panel"},fF={class:"library-browser__actions"},mF=["disabled"],pF=["disabled"],gF={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},yF={key:0,class:"framesync-subtitle library-browser__status"},vF={key:0,class:"library-browser__dropzone-hint"},bF={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading projects"},_F={key:2,class:"library-browser__empty"},SF={key:3,class:"library-browser__grid"},wF={class:"library-browser__modal-inner"},MF={class:"library-browser__modal-head"},PF={class:"library-browser__modal-actions"},xF=["src"];function TF(t,e,i,n,s,r){const l=Ne("LibraryMediaCard");return m(),p("div",cF,[a("div",hF,[e[12]||(e[12]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Generations grouped by session — frame counts, previews, and exports. ")],-1)),a("div",fF,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"projects-upload-video",title:"Upload video to a new project",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Video ",8,mF),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"projects-refresh",onClick:e[1]||(e[1]=o=>r.loadProjects())},[s.loading?(m(),p("span",gF)):N("",!0),e[11]||(e[11]=ie(" Refresh ",-1))],10,pF),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"library-browser__upload-input","data-testid":"projects-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(m(),p("div",yF,b(s.status),1)):N("",!0)]),a("div",{class:B(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"projects-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(m(),p("div",vF," Drop video files to add a project ")):N("",!0),s.loading?(m(),p("div",bF,[(m(),p(H,null,oe(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[13]||(e[13]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.projects.length?(m(),p("div",SF,[(m(!0),p(H,null,oe(s.projects,o=>(m(),at(l,{key:o.id,"card-test-id":"project-card",item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"show-video-preview":r.shouldPreviewVideo(o),"show-actions":o.hasVideo,badges:r.projectBadges(o),onMouseenter:d=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=d=>s.hoveredId=null),onClick:r.selectProject,onDblclick:r.openProject,onWatch:r.openProject,onEdit:r.openProjectInEditor,onVideoRef:r.onPreviewVideoRef},null,8,["item","selected","hovered","show-video-preview","show-actions","badges","onMouseenter","onClick","onDblclick","onWatch","onEdit","onVideoRef"]))),128))])):(m(),p("div",_F," No projects yet — generate frames on LIVE or upload a video with + Video. "))],34),s.fullscreenProject?(m(),p("div",{key:0,class:"library-browser__modal","data-testid":"projects-fullscreen",onClick:e[10]||(e[10]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",wF,[a("div",MF,[a("strong",null,b(s.fullscreenProject.title),1),a("div",PF,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=o=>r.openProjectInEditor(s.fullscreenProject))}," Open in editor "),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"library-fullscreen-close",onClick:e[9]||(e[9]=(...o)=>r.closeFullscreen&&r.closeFullscreen(...o))}," Close ")])]),s.fullscreenProject.videoUrl?(m(),p("video",{key:0,ref:"modalVideoEl",class:"library-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:s.fullscreenProject.videoUrl},null,8,xF)):N("",!0)])])):N("",!0)])}const AF=nt(uF,[["render",TF]]),EF={name:"VideosBrowser",components:{LibraryMediaCard:ry},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{videos:[],loading:!1,status:"",selectedId:null,hoveredId:null,fullscreenVideo:null,previewVideos:{},dropzoneActive:!1,dropzoneDepth:0}},mounted(){this.active&&this.loadVideos(),document.addEventListener("keydown",this.onFullscreenKey)},beforeUnmount(){document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllPreviewVideos()},methods:{async loadVideos(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/videos"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load videos");this.videos=Array.isArray(e.videos)?e.videos:[]}catch(t){this.status=t.message||"Videos unavailable",this.videos=[]}finally{this.loading=!1}},videoBadges(t){const e=[{label:"Video",variant:"video"}];return t.source==="recording"&&e.push({label:"Recording",variant:"recording"}),t.source==="run"&&e.push({label:"Run",variant:"run"}),e},shouldPreviewVideo(t){return this.hoveredId===t.id||this.selectedId===t.id},onPreviewVideoRef({id:t,el:e}){e?this.previewVideos[t]=e:delete this.previewVideos[t]},pauseAllPreviewVideos(){Object.values(this.previewVideos).forEach(t=>{try{t.pause()}catch{}})},selectVideo(t){this.selectedId=(t==null?void 0:t.id)||null,this.app.librarySelectedVideo=t||null,this.app.librarySelectedProject=t||null,t!=null&&t.videoUrl&&this.$nextTick(()=>{var e,i;(i=(e=this.previewVideos[t.id])==null?void 0:e.play)==null||i.call(e).catch(()=>{})})},openVideo(t){t!=null&&t.videoUrl&&(this.fullscreenVideo=t,this.$nextTick(()=>{var e,i;(i=(e=this.$refs.modalVideoEl)==null?void 0:e.play)==null||i.call(e).catch(()=>{})}))},closeFullscreen(){this.fullscreenVideo=null},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeFullscreen()},onFullscreenKey(t){this.fullscreenVideo&&t.key==="Escape"&&(t.stopPropagation(),this.closeFullscreen())},openVideoInEditor(t){if(!(t!=null&&t.videoPath)){this.status="No video file for this item";return}this.app.openInVideoEditor({path:t.videoPath,rootId:t.rootId||"uploads",name:t.title,url:t.videoUrl})},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadVideoFile(t){if(!t)return;const e=String(t.name||"upload.mp4"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(i)){this.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await t.arrayBuffer(),r=new URLSearchParams({name:e,dir:"projects"}),l=await fetch(`/api/video-swarm/upload?${r.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":e},body:s}),o=await l.json();if(!l.ok)throw new Error(o.error||"Upload failed");this.status="Video added",await this.loadVideos();const d=this.videos.find(u=>u.videoPath===o.path);d&&this.selectVideo(d)}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadVideoFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).forEach(s=>{this.uploadVideoFile(s)})}},watch:{active(t){t&&!this.videos.length&&!this.loading&&this.loadVideos()},hoveredId(t){this.$nextTick(()=>{Object.entries(this.previewVideos).forEach(([e,i])=>{var n;i&&(e===t||e===this.selectedId?(n=i.play)==null||n.call(i).catch(()=>{}):(i.pause(),i.currentTime=0))})})}}},CF={class:"library-browser__panel videos-browser","data-testid":"videos-browser"},kF={class:"library-browser__toolbar framesync-panel"},LF={class:"library-browser__actions"},RF=["disabled"],DF=["disabled"],IF={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},FF={key:0,class:"framesync-subtitle library-browser__status"},NF={key:0,class:"library-browser__dropzone-hint"},OF={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading videos"},UF={key:2,class:"library-browser__empty"},BF={key:3,class:"library-browser__grid"},VF={class:"library-browser__modal-inner"},zF={class:"library-browser__modal-head"},$F={class:"library-browser__modal-actions"},GF=["src"];function HF(t,e,i,n,s,r){const l=Ne("LibraryMediaCard");return m(),p("div",CF,[a("div",kF,[e[12]||(e[12]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Every export, recording, and upload — thumbnails update as files appear. ")],-1)),a("div",LF,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"videos-upload-video",title:"Upload a video",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Video ",8,RF),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"videos-refresh",onClick:e[1]||(e[1]=o=>r.loadVideos())},[s.loading?(m(),p("span",IF)):N("",!0),e[11]||(e[11]=ie(" Refresh ",-1))],10,DF),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"library-browser__upload-input","data-testid":"videos-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(m(),p("div",FF,b(s.status),1)):N("",!0)]),a("div",{class:B(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"videos-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(m(),p("div",NF," Drop video files here ")):N("",!0),s.loading?(m(),p("div",OF,[(m(),p(H,null,oe(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[13]||(e[13]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.videos.length?(m(),p("div",BF,[(m(!0),p(H,null,oe(s.videos,o=>(m(),at(l,{key:o.id,"card-test-id":"video-card",item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"show-video-preview":r.shouldPreviewVideo(o),badges:r.videoBadges(o),onMouseenter:d=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=d=>s.hoveredId=null),onClick:r.selectVideo,onDblclick:r.openVideo,onWatch:r.openVideo,onEdit:r.openVideoInEditor,onVideoRef:r.onPreviewVideoRef},null,8,["item","selected","hovered","show-video-preview","badges","onMouseenter","onClick","onDblclick","onWatch","onEdit","onVideoRef"]))),128))])):(m(),p("div",UF," No videos yet — record on LIVE, export a run, or upload with + Video. "))],34),s.fullscreenVideo?(m(),p("div",{key:0,class:"library-browser__modal","data-testid":"videos-fullscreen",onClick:e[10]||(e[10]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",VF,[a("div",zF,[a("strong",null,b(s.fullscreenVideo.title),1),a("div",$F,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=o=>r.openVideoInEditor(s.fullscreenVideo))}," Open in editor "),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"library-fullscreen-close",onClick:e[9]||(e[9]=(...o)=>r.closeFullscreen&&r.closeFullscreen(...o))}," Close ")])]),s.fullscreenVideo.videoUrl?(m(),p("video",{key:0,ref:"modalVideoEl",class:"library-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:s.fullscreenVideo.videoUrl},null,8,GF)):N("",!0)])])):N("",!0)])}const WF=nt(EF,[["render",HF]]),qF={name:"LibraryAudioCard",components:{UiIcon:Kt},props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},hovered:{type:Boolean,default:!1},useLabel:{type:String,default:"Use in session"}},emits:["click","use","mouseenter","mouseleave","preview-state"],data(){return{mediaLoading:!0,playing:!1,durationSec:null}},computed:{durationLabel(){if(!this.durationSec||!Number.isFinite(this.durationSec))return"";const t=Math.floor(this.durationSec/60),e=Math.floor(this.durationSec%60);return t>0?`${t}:${String(e).padStart(2,"0")}`:`${e}s`}},watch:{"item.id"(){this.mediaLoading=!0,this.playing=!1,this.durationSec=null,this.pausePreview()},selected(t){t||this.pausePreview()},playing(t){this.$emit("preview-state",{id:this.item.id,playing:t})}},beforeUnmount(){this.pausePreview()},methods:{onMediaReady(){this.mediaLoading=!1;const t=this.$refs.audioEl;t&&Number.isFinite(t.duration)&&t.duration>0&&(this.durationSec=t.duration)},onMediaError(){this.mediaLoading=!1},togglePreview(){var e;const t=this.$refs.audioEl;t&&(this.playing?t.pause():(e=t.play)==null||e.call(t).catch(()=>{}))},pausePreview(){const t=this.$refs.audioEl;if(t){try{t.pause()}catch{}this.playing=!1}}}},jF=["data-item-id","data-audio-path"],XF={class:"library-audio-card__media library-browser__media"},KF={key:0,class:"library-browser__media-loading lazy-loading-indicator lazy-loading-indicator--overlay","aria-hidden":"true"},YF=["src"],JF={class:"library-browser__badges"},ZF={key:0,class:"library-browser__badge"},QF={class:"library-browser__copy"},eN={class:"library-browser__title"},tN={key:0,class:"library-browser__meta"},iN={class:"library-browser__card-actions"};function nN(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("article",{class:B(["library-browser__card library-audio-card",{"library-browser__card--selected":i.selected,"library-browser__card--hover":i.hovered,"library-audio-card--playing":s.playing}]),"data-testid":"audio-card","data-item-id":i.item.id,"data-audio-path":i.item.audioPath||void 0,onMouseenter:e[7]||(e[7]=o=>t.$emit("mouseenter")),onMouseleave:e[8]||(e[8]=o=>t.$emit("mouseleave")),onClick:e[9]||(e[9]=o=>t.$emit("click",i.item))},[a("div",XF,[s.mediaLoading?(m(),p("div",KF,[...e[10]||(e[10]=[a("span",{class:"lazy-loading-indicator__spinner"},null,-1)])])):N("",!0),a("div",{class:B(["library-audio-card__wave",{"library-audio-card__wave--active":s.playing||i.selected}]),"aria-hidden":"true"},[(m(),p(H,null,oe(16,o=>a("span",{key:"bar-"+o,class:"library-audio-card__bar",style:Mt({animationDelay:`${o%5*.08}s`})},null,4)),64))],2),ve(l,{class:"library-audio-card__icon",name:"mic"}),a("audio",{ref:"audioEl",class:"library-audio-card__audio",preload:"metadata",src:i.item.audioUrl,onLoadedmetadata:e[0]||(e[0]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[1]||(e[1]=(...o)=>r.onMediaError&&r.onMediaError(...o)),onPlay:e[2]||(e[2]=o=>s.playing=!0),onPause:e[3]||(e[3]=o=>s.playing=!1),onEnded:e[4]||(e[4]=o=>s.playing=!1)},null,40,YF),a("div",JF,[e[11]||(e[11]=a("span",{class:"library-browser__badge library-browser__badge--audio"},"Audio",-1)),r.durationLabel?(m(),p("span",ZF,b(r.durationLabel),1)):N("",!0)])]),a("div",QF,[a("h3",eN,b(i.item.title),1),i.item.meta?(m(),p("p",tN,b(i.item.meta),1)):N("",!0)]),a("div",iN,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=lt((...o)=>r.togglePreview&&r.togglePreview(...o),["stop"]))},b(s.playing?"Pause":"Preview"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"audio-use-in-session",onClick:e[6]||(e[6]=lt(o=>t.$emit("use",i.item),["stop"]))},b(i.useLabel),1)])],42,jF)}const sN=nt(qF,[["render",nN]]),rN={name:"AudioBrowser",components:{LibraryAudioCard:sN},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{tracks:[],loading:!1,status:"",selectedId:null,hoveredId:null,dropzoneActive:!1,dropzoneDepth:0,playingId:null}},computed:{libraryUseLabel(){var t;return(t=this.app)!=null&&t.librarySourceMode?"Use as source":"Use in session"}},mounted(){this.active&&this.loadAudio()},methods:{async loadAudio(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/audio"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load audio");this.tracks=Array.isArray(e.audio)?e.audio:[]}catch(t){this.status=t.message||"Audio unavailable",this.tracks=[]}finally{this.loading=!1}},selectTrack(t){this.selectedId=(t==null?void 0:t.id)||null,this.app.librarySelectedAudio=t||null},useTrackInSession(t){if(!(t!=null&&t.audioPath)){this.status="No audio file for this item";return}if(typeof this.app.useLibraryAudio=="function"){const e=!!this.app.librarySourceMode;this.app.useLibraryAudio(t,{webgl:e}),this.status=e?"Driving WebGL visualizer":"Loaded into session — open AUDIO tab to react"}else this.status="Session audio handoff unavailable"},onPreviewState({id:t,playing:e}){this.playingId=e?t:this.playingId===t?null:this.playingId},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadAudioFile(t){if(!t)return;const e=String(t.name||"upload.wav"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".wav",".mp3",".ogg",".flac",".m4a"].includes(i)){this.status="Unsupported file type (use wav, mp3, ogg, flac, m4a)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await new Promise((d,u)=>{const h=new FileReader;h.onload=()=>d(h.result),h.onerror=()=>u(h.error||new Error("Could not read file")),h.readAsDataURL(t)}),r=await fetch("/api/audio-upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,data:s})}),l=await r.json();if(!r.ok||l.error)throw new Error(l.error||"Upload failed");this.status="Audio added",await this.loadAudio();const o=this.tracks.find(d=>d.audioPath===l.path);o&&(this.selectTrack(o),this.app.librarySourceMode&&this.useTrackInSession(o))}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadAudioFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).filter(s=>{const r=String(s.name||"").toLowerCase();return/\.(wav|mp3|ogg|flac|m4a)$/.test(r)||String(s.type||"").startsWith("audio/")}).forEach(s=>{this.uploadAudioFile(s)})}},watch:{active(t){t&&!this.tracks.length&&!this.loading&&this.loadAudio()}}},oN={class:"library-browser__panel audio-browser","data-testid":"audio-browser"},aN={class:"library-browser__toolbar framesync-panel"},lN={class:"library-browser__actions"},dN=["disabled"],uN=["disabled"],cN={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},hN={key:0,class:"framesync-subtitle library-browser__status"},fN={key:0,class:"library-browser__dropzone-hint"},mN={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading audio"},pN={key:2,class:"library-browser__empty"},gN={key:3,class:"library-browser__grid"};function yN(t,e,i,n,s,r){const l=Ne("LibraryAudioCard");return m(),p("div",oN,[a("div",aN,[e[9]||(e[9]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Uploaded and generated audio — preview tracks and load them into the reactive session. ")],-1)),a("div",lN,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"audio-upload",title:"Upload audio file",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Audio ",8,dN),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"audio-refresh",onClick:e[1]||(e[1]=o=>r.loadAudio())},[s.loading?(m(),p("span",cN)):N("",!0),e[8]||(e[8]=ie(" Refresh ",-1))],10,uN),a("input",{ref:"uploadInputEl",type:"file",accept:"audio/wav,audio/mpeg,audio/ogg,audio/flac,audio/mp4,audio/x-m4a,.wav,.mp3,.ogg,.flac,.m4a",multiple:"",class:"library-browser__upload-input","data-testid":"audio-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(m(),p("div",hN,b(s.status),1)):N("",!0)]),a("div",{class:B(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"audio-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(m(),p("div",fN," Drop audio files here ")):N("",!0),s.loading?(m(),p("div",mN,[(m(),p(H,null,oe(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[10]||(e[10]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.tracks.length?(m(),p("div",gN,[(m(!0),p(H,null,oe(s.tracks,o=>(m(),at(l,{key:o.id,item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"use-label":r.libraryUseLabel,onMouseenter:d=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=d=>s.hoveredId=null),onClick:r.selectTrack,onUse:r.useTrackInSession,onPreviewState:r.onPreviewState},null,8,["item","selected","hovered","use-label","onMouseenter","onClick","onUse","onPreviewState"]))),128))])):(m(),p("div",pN," No audio yet — upload on AUDIO tab or drop a file here with + Audio. "))],34)])}const vN=nt(rN,[["render",yN]]),bN=24,_N={name:"VideoSwarmBrowser",components:{UiIcon:Kt},props:{app:{type:Object,required:!0}},computed:{systemFiles(){return this.app.systemFiles},videoSwarmIsCloudRoot(){return this.app.videoSwarmIsCloudRoot},videoSwarmIsVideosOnly(){return this.app.videoSwarmIsVideosOnly},videoSwarmCloudPathLabel(){return this.app.videoSwarmCloudPathLabel},videoSwarmDisplayFolders(){return this.app.videoSwarmDisplayFolders},videoSwarmDisplayVideos(){return this.app.videoSwarmDisplayVideos},videoSwarmFullscreenVideo(){return this.app.videoSwarmFullscreenVideo},videoSwarmVisibleStart:{get(){return this.app.videoSwarmVisibleStart},set(t){this.app.videoSwarmVisibleStart=t}},videoSwarmVisibleEnd:{get(){return this.app.videoSwarmVisibleEnd},set(t){this.app.videoSwarmVisibleEnd=t}},libraryOutputHint(){var s,r;const t=String(((s=this.systemFiles)==null?void 0:s.rootId)||"frames"),i=(((r=this.systemFiles)==null?void 0:r.roots)||[]).find(l=>l.id===t);return(i==null?void 0:i.kind)==="cloud"?"Cloud-linked folder — open the drive link, then add direct video URLs for playback.":{uploads:"Converted outputs: img2img / txt2img (preview_*.png), stage recordings (defora_rec_*.mp4), demo-output.mp4, uploaded audio — also at /uploads/…",frames:"Live Deforum preview frames (frame_*.png) as they render; also in RUNS → Frames rail.",runs:"One folder per job (run.json, defora-job.json). Exported MP4s may sit inside the run folder or under Uploads.",hls:"HLS encoder output — .m3u8 playlist and .ts segments for stream preview (Settings → Output).",videoswarm:"Manual exports and editor handoff staging — use + Folder / + Video or Open in editor."}[t]||"Browse folders and videos under the selected library root."}},data(){return{hoveredPath:null,contextMenu:{open:!1,x:0,y:0,video:null,index:-1},tileVideos:{},modalVideoEl:null,dropzoneActive:!1,dropzoneDepth:0}},watch:{"systemFiles.videos"(){this.videoSwarmVisibleStart=0,this.videoSwarmVisibleEnd=48,this.$nextTick(()=>this.updateVisibleWindow())},"systemFiles.fullscreenIndex"(t){document.removeEventListener("keydown",this.onFullscreenKey),!(t<0)&&(this.$nextTick(()=>{var i;const e=this.$refs.modalVideoEl;e&&((i=e.play)==null||i.call(e).catch(()=>{}))}),document.addEventListener("keydown",this.onFullscreenKey))}},mounted(){this.initSystemFilesBrowser(),document.addEventListener("click",this.closeContextMenu)},beforeUnmount(){document.removeEventListener("click",this.closeContextMenu),document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllTileVideos()},methods:{initSystemFilesBrowser(...t){return this.app.initSystemFilesBrowser(...t)},browseSystemFiles(...t){return this.app.browseSystemFiles(...t)},refreshSystemFilesBrowse(...t){return this.app.refreshSystemFilesBrowse(...t)},openNewFolderDialog(...t){return this.app.openNewFolderDialog(...t)},createSystemFolder(...t){return this.app.createSystemFolder(...t)},cancelNewFolderDialog(...t){return this.app.cancelNewFolderDialog(...t)},uploadSystemVideoFiles(...t){return this.app.uploadSystemVideoFiles(...t)},toggleSystemFilesRecursive(...t){return this.app.toggleSystemFilesRecursive(...t)},toggleSystemFilesShowNames(...t){return this.app.toggleSystemFilesShowNames(...t)},toggleSystemFilesVideosOnly(...t){return this.app.toggleSystemFilesVideosOnly(...t)},setSystemFilesSort(...t){return this.app.setSystemFilesSort(...t)},setSystemFilesZoom(...t){return this.app.setSystemFilesZoom(...t)},connectCloudStorage(...t){return this.app.connectCloudStorage(...t)},cloudProviderLabel(...t){return this.app.cloudProviderLabel(...t)},openCloudStorageLink(...t){return this.app.openCloudStorageLink(...t)},disconnectCloudStorage(...t){return this.app.disconnectCloudStorage(...t)},addCloudStorageVideo(...t){return this.app.addCloudStorageVideo(...t)},openInVideoEditor(...t){return this.app.openInVideoEditor(...t)},deleteSystemFile(...t){return this.app.deleteSystemFile(...t)},copySystemFilePath(...t){return this.app.copySystemFilePath(...t)},openSystemFileFullscreen(...t){return this.app.openSystemFileFullscreen(...t)},closeSystemFileFullscreen(...t){return this.app.closeSystemFileFullscreen(...t)},stepSystemFileFullscreen(...t){return this.app.stepSystemFileFullscreen(...t)},toggleSystemFileSelection(...t){return this.app.toggleSystemFileSelection(...t)},systemFileMediaUrl(...t){return this.app.systemFileMediaUrl(...t)},formatVideoSwarmFileSize(...t){return this.app.formatVideoSwarmFileSize(...t)},saveSessionState(...t){return this.app.saveSessionState(...t)},setViewMode(t){t==="videos-only"&&this.videoSwarmIsCloudRoot||this.systemFiles.viewMode!==t&&(this.systemFiles.viewMode=t,this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState())},openUploadPicker(){if(this.videoSwarmIsCloudRoot)return;const t=this.$refs.uploadInputEl;t&&t.click()},onUploadInputChange(t){var i;const e=(i=t.target)==null?void 0:i.files;this.uploadSystemVideoFiles(e),t.target&&(t.target.value="")},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneDepth+=1,this.dropzoneActive=!0)},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneActive=!0)},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1))},onDropFiles(t){var i,n;if((i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,this.videoSwarmIsCloudRoot)return;const e=(n=t.dataTransfer)==null?void 0:n.files;this.uploadSystemVideoFiles(e)},onRootChange(t){const e=(this.systemFiles.roots||[]).find(i=>i.id===t);if(e){if(e.kind==="cloud"){this.browseSystemFiles("",{rootId:e.id});return}this.browseSystemFiles(e.path,{rootId:e.id})}},selectCloudRoot(t){!t||!t.id||(this.systemFiles.cloudConnectOpen=!1,this.browseSystemFiles("",{rootId:`cloud:${t.id}`}))},openSystemFolder(t){!t||!t.path||this.browseSystemFiles(t.path,{rootId:t.rootId||this.systemFiles.rootId})},onGridScroll(){this.updateVisibleWindow()},updateVisibleWindow(){const t=this.$refs.gridEl,e=(this.systemFiles.videos||[]).length;if(!t||!e){this.videoSwarmVisibleStart=0,this.videoSwarmVisibleEnd=48;return}const i=t.querySelector(".video-swarm-browser__tile"),n=i?i.offsetHeight+10:180,s=Math.max(1,Math.floor(t.clientWidth/Math.max((i==null?void 0:i.offsetWidth)||200,120))),r=Math.ceil(t.clientHeight/n)+2,l=Math.max(0,Math.floor(t.scrollTop/n)-1),o=Math.max(0,l*s),d=Math.min(e,o+r*s+bN);this.videoSwarmVisibleStart=o,this.videoSwarmVisibleEnd=d},shouldLoadVideo(t){return!!(t&&(this.hoveredPath===t.path||this.systemFiles.selectedPaths.includes(t.path)))},registerTileVideo(t,e){e?this.tileVideos[t]=e:delete this.tileVideos[t]},onTileEnter(t){this.hoveredPath=t.path,this.$nextTick(()=>{var i;const e=this.tileVideos[t.path];e&&((i=e.play)==null||i.call(e).catch(()=>{}))})},onTileLeave(t){this.hoveredPath===t.path&&(this.hoveredPath=null);const e=this.tileVideos[t.path];e&&(e.pause(),e.currentTime=0)},pauseAllTileVideos(){Object.values(this.tileVideos).forEach(t=>{try{t.pause()}catch{}})},onVideoLoaded(t){var e;if(this.hoveredPath===t){const i=this.tileVideos[t];(e=i==null?void 0:i.play)==null||e.call(i).catch(()=>{})}},onTileClick(t,e){if(t.ctrlKey||t.metaKey){this.toggleSystemFileSelection(e.path);return}this.systemFiles.selectedPaths=[e.path]},onTileDblClick(t,e){var i;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.openSystemFileFullscreen(e)},onTileContextMenu(t,e){var i;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.openTileMenu(t,e)},openTileMenu(t,e){const n=(this.systemFiles.videos||[]).findIndex(s=>s.path===e.path);this.contextMenu={open:!0,x:t.clientX,y:t.clientY,video:e,index:n}},closeContextMenu(){this.contextMenu.open=!1},openContextFullscreen(){this.contextMenu.index>=0&&this.openSystemFileFullscreen(this.contextMenu.index),this.closeContextMenu()},deleteContextVideo(){this.contextMenu.video&&this.deleteSystemFile(this.contextMenu.video.path),this.closeContextMenu()},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeSystemFileFullscreen()},onFullscreenKey(t){if(!(this.systemFiles.fullscreenIndex<0)&&(t.key==="Escape"&&this.closeSystemFileFullscreen(),t.key==="ArrowLeft"&&this.stepSystemFileFullscreen(-1),t.key==="ArrowRight"&&this.stepSystemFileFullscreen(1),t.key===" ")){t.preventDefault();const e=this.$refs.modalVideoEl;if(!e)return;e.paused?e.play():e.pause()}}}},SN={class:"video-swarm-browser","data-testid":"video-swarm-browser"},wN={class:"video-swarm-browser__toolbar framesync-panel"},MN={class:"video-swarm-browser__toolbar-row"},PN={class:"video-swarm-browser__roots"},xN=["value","disabled"],TN=["value"],AN=["disabled"],EN=["disabled"],CN=["disabled"],kN={class:"video-swarm-browser__chips chips"},LN=["disabled"],RN=["disabled"],DN=["disabled"],IN=["disabled"],FN=["value","disabled"],NN={class:"video-swarm-browser__zoom"},ON=["value","disabled"],UN=["disabled"],BN={key:0,class:"video-swarm-browser__cloud-connect","data-testid":"video-swarm-cloud-connect"},VN={class:"video-swarm-browser__cloud-connect-row"},zN={key:0,class:"video-swarm-browser__cloud-list"},$N=["onClick"],GN=["onClick"],HN=["onClick"],WN={key:1,class:"video-swarm-browser__newfolder","data-testid":"video-swarm-new-folder-dialog"},qN={class:"video-swarm-browser__path"},jN={key:0},XN={key:1},KN={key:2,class:"video-swarm-browser__count"},YN={key:3,class:"video-swarm-browser__count"},JN={key:4,class:"video-swarm-browser__count"},ZN={key:2,class:"video-swarm-browser__outputs-hint framesync-subtitle","data-testid":"video-swarm-outputs-hint"},QN={key:3,class:"framesync-subtitle video-swarm-browser__status"},eO={key:0,class:"video-swarm-browser__cloud-panel framesync-panel","data-testid":"video-swarm-cloud-panel"},tO={class:"framesync-header"},iO={class:"framesync-title"},nO={class:"framesync-accent"},sO={class:"video-swarm-browser__cloud-panel-actions"},rO={class:"framesync-subtitle"},oO={class:"video-swarm-browser__cloud-video-form"},aO={key:0,class:"video-swarm-browser__dropzone-hint"},lO={key:1,class:"video-swarm-browser__empty"},dO={key:2,class:"video-swarm-browser__empty"},uO=["data-folder-path","title","onClick"],cO={key:0,class:"video-swarm-browser__label"},hO=["data-video-path","onClick","onDblclick","onContextmenu","onMouseenter","onMouseleave"],fO=["src","onLoadeddata"],mO={key:2,class:"video-swarm-browser__label"},pO={class:"video-swarm-browser__meta"},gO={class:"video-swarm-browser__modal-inner"},yO={class:"video-swarm-browser__modal-head"},vO={class:"video-swarm-browser__modal-actions"},bO=["src"];function _O(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",SN,[a("div",wN,[a("div",MN,[a("div",PN,[a("select",{class:"framesync-select",value:r.systemFiles.rootId,disabled:r.systemFiles.loading,"data-testid":"video-swarm-root-select",onChange:e[0]||(e[0]=o=>r.onRootChange(o.target.value))},[(m(!0),p(H,null,oe(r.systemFiles.roots,o=>(m(),p("option",{key:"vfs-root-"+o.id,value:o.id},b(o.label),9,TN))),128))],40,xN),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!r.systemFiles.parent||r.systemFiles.loading||r.videoSwarmIsCloudRoot||r.videoSwarmIsVideosOnly,title:"Parent folder",onClick:e[1]||(e[1]=o=>r.browseSystemFiles(r.systemFiles.parent))}," ↑ Up ",8,AN),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-new-folder",title:"New folder",onClick:e[2]||(e[2]=o=>r.openNewFolderDialog())}," + Folder ",8,EN),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-upload-video",title:"Upload video file",onClick:e[3]||(e[3]=o=>r.openUploadPicker())}," + Video ",8,CN),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"video-swarm-browser__upload-input","data-testid":"video-swarm-upload-input",onChange:e[4]||(e[4]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),a("div",kN,[a("button",{type:"button",class:B(["chip",{active:!r.videoSwarmIsVideosOnly}]),disabled:r.systemFiles.loading,"data-testid":"video-swarm-view-browse",onClick:e[5]||(e[5]=o=>r.setViewMode("browse"))}," Browse ",10,LN),a("button",{type:"button",class:B(["chip",{active:r.videoSwarmIsVideosOnly}]),disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-view-videos-only",onClick:e[6]||(e[6]=o=>r.setViewMode("videos-only"))}," Videos only ",10,RN),a("button",{type:"button",class:B(["chip",{active:r.systemFiles.recursive}]),disabled:r.systemFiles.loading||r.videoSwarmIsVideosOnly||r.videoSwarmIsCloudRoot,onClick:e[7]||(e[7]=(...o)=>r.toggleSystemFilesRecursive&&r.toggleSystemFilesRecursive(...o))}," Subfolders ",10,DN),a("button",{type:"button",class:B(["chip",{active:r.systemFiles.showFilenames}]),disabled:r.systemFiles.loading,onClick:e[8]||(e[8]=(...o)=>r.toggleSystemFilesShowNames&&r.toggleSystemFilesShowNames(...o))}," Names ",10,IN)]),a("select",{class:"framesync-select video-swarm-browser__sort",value:r.systemFiles.sortKey,disabled:r.systemFiles.loading,onChange:e[9]||(e[9]=o=>r.setSystemFilesSort(o.target.value))},[...e[43]||(e[43]=[Bi('',6)])],40,FN),a("label",NN,[e[44]||(e[44]=a("span",{class:"framesync-subtitle"},"Zoom",-1)),a("input",{type:"range",min:"0",max:"4",step:"1",value:r.systemFiles.zoomLevel,disabled:r.systemFiles.loading,onInput:e[10]||(e[10]=o=>r.setSystemFilesZoom(Number(o.target.value)))},null,40,ON)]),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{active:r.systemFiles.cloudConnectOpen}]),"data-testid":"video-swarm-connect-cloud",onClick:e[11]||(e[11]=o=>r.systemFiles.cloudConnectOpen=!r.systemFiles.cloudConnectOpen)}," Connect cloud ",2),a("button",{type:"button",class:"framesync-button",disabled:r.systemFiles.loading,onClick:e[12]||(e[12]=o=>r.refreshSystemFilesBrowse(!0))}," Refresh ",8,UN)]),r.systemFiles.cloudConnectOpen?(m(),p("div",BN,[e[46]||(e[46]=a("div",{class:"video-swarm-browser__cloud-connect-title"},"Connect cloud storage",-1)),a("div",VN,[J(a("select",{"onUpdate:modelValue":e[13]||(e[13]=o=>t.cloudDriveDraft.provider=o),class:"framesync-select"},[...e[45]||(e[45]=[a("option",{value:"google_drive"},"Google Drive",-1),a("option",{value:"dropbox"},"Dropbox",-1),a("option",{value:"onedrive"},"OneDrive",-1),a("option",{value:"other"},"Other",-1)])],512),[[Dt,t.cloudDriveDraft.provider]]),J(a("input",{"onUpdate:modelValue":e[14]||(e[14]=o=>t.cloudDriveDraft.url=o),type:"url",class:"framesync-input",placeholder:"https://drive.google.com/… folder or file share link","data-testid":"video-swarm-cloud-url",onKeyup:e[15]||(e[15]=Ql(o=>r.connectCloudStorage(),["enter"]))},null,544),[[ye,t.cloudDriveDraft.url,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[16]||(e[16]=o=>r.connectCloudStorage())},"Connect")]),e[47]||(e[47]=a("div",{class:"framesync-subtitle video-swarm-browser__cloud-hint"}," Saves the share link in the browser. Open the drive in a new tab, then add direct video URLs below for playback. ",-1)),(r.systemFiles.cloudSources||[]).length?(m(),p("div",zN,[(m(!0),p(H,null,oe(r.systemFiles.cloudSources,o=>(m(),p("div",{key:"cloud-src-"+o.id,class:"video-swarm-browser__cloud-item"},[a("button",{type:"button",class:"video-swarm-browser__cloud-item-main",onClick:d=>r.selectCloudRoot(o)},[a("strong",null,b(r.cloudProviderLabel(o.provider)),1),a("span",null,b(o.label),1)],8,$N),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:d=>r.openCloudStorageLink(o)},"Open",8,GN),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:d=>r.disconnectCloudStorage(o.id)},"Remove",8,HN)]))),128))])):N("",!0)])):N("",!0),r.systemFiles.newFolderOpen?(m(),p("div",WN,[J(a("input",{"onUpdate:modelValue":e[17]||(e[17]=o=>r.systemFiles.newFolderName=o),type:"text",class:"framesync-input",placeholder:"New folder name","data-testid":"video-swarm-new-folder-name",onKeyup:e[18]||(e[18]=Ql(o=>r.createSystemFolder(),["enter"]))},null,544),[[ye,r.systemFiles.newFolderName,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[19]||(e[19]=o=>r.createSystemFolder())},"Create"),a("button",{type:"button",class:"framesync-button",onClick:e[20]||(e[20]=o=>r.cancelNewFolderDialog())},"Cancel")])):N("",!0),a("div",qN,[r.videoSwarmIsCloudRoot?(m(),p("code",XN,b(r.videoSwarmCloudPathLabel),1)):(m(),p("code",jN,b(r.systemFiles.currentPath||"—"),1)),r.videoSwarmIsVideosOnly?(m(),p("span",KN,"Videos only · all subfolders")):r.systemFiles.folderCount!=null&&r.systemFiles.folderCount>0?(m(),p("span",YN,b(r.systemFiles.folderCount)+" folders ",1)):N("",!0),r.systemFiles.videoCount!=null?(m(),p("span",JN,b(r.systemFiles.videoCount)+" videos ",1)):N("",!0)]),r.libraryOutputHint?(m(),p("div",ZN,b(r.libraryOutputHint),1)):N("",!0),r.systemFiles.status?(m(),p("div",QN,b(r.systemFiles.status),1)):N("",!0)]),r.videoSwarmIsCloudRoot&&r.systemFiles.cloudSource?(m(),p("div",eO,[a("div",tO,[a("div",iO,[a("span",nO,b(r.cloudProviderLabel(r.systemFiles.cloudSource.provider)),1)]),a("div",sO,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[21]||(e[21]=o=>r.openCloudStorageLink(r.systemFiles.cloudSource))},"Open in browser"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[22]||(e[22]=o=>r.disconnectCloudStorage(r.systemFiles.cloudSource.id))},"Disconnect")])]),a("div",rO,b(r.systemFiles.cloudSource.url),1),a("div",oO,[J(a("input",{"onUpdate:modelValue":e[23]||(e[23]=o=>r.systemFiles.cloudVideoDraft.name=o),type:"text",class:"framesync-input",placeholder:"Label (optional)"},null,512),[[ye,r.systemFiles.cloudVideoDraft.name,void 0,{trim:!0}]]),J(a("input",{"onUpdate:modelValue":e[24]||(e[24]=o=>r.systemFiles.cloudVideoDraft.url=o),type:"url",class:"framesync-input",placeholder:"Direct video URL (https://…mp4)","data-testid":"video-swarm-cloud-video-url",onKeyup:e[25]||(e[25]=Ql(o=>r.addCloudStorageVideo(r.systemFiles.cloudSource.id),["enter"]))},null,544),[[ye,r.systemFiles.cloudVideoDraft.url,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button",onClick:e[26]||(e[26]=o=>r.addCloudStorageVideo(r.systemFiles.cloudSource.id))},"Add video")])])):N("",!0),a("div",{class:B(["video-swarm-browser__dropzone",{"video-swarm-browser__dropzone--active":s.dropzoneActive,"video-swarm-browser__dropzone--disabled":r.videoSwarmIsCloudRoot}]),"data-testid":"video-swarm-dropzone",onDragenter:e[28]||(e[28]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[29]||(e[29]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[30]||(e[30]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[31]||(e[31]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive&&!r.videoSwarmIsCloudRoot?(m(),p("div",aO," Drop video files to upload ")):N("",!0),r.systemFiles.loading?(m(),p("div",lO,"Scanning folder…")):!r.videoSwarmDisplayFolders.length&&!r.videoSwarmDisplayVideos.length?(m(),p("div",dO,b(r.videoSwarmIsCloudRoot?"No videos linked yet — add a direct URL above.":"No folders or videos — use + Video or drag files here."),1)):(m(),p("div",{key:3,ref:"gridEl",class:B(["video-swarm-browser__grid","video-swarm-browser__grid--zoom-"+r.systemFiles.zoomLevel]),onScroll:e[27]||(e[27]=(...o)=>r.onGridScroll&&r.onGridScroll(...o))},[(m(!0),p(H,null,oe(r.videoSwarmDisplayFolders,o=>(m(),p("button",{key:"folder-"+o.path,type:"button",class:"video-swarm-browser__tile video-swarm-browser__tile--folder","data-testid":"video-swarm-folder","data-folder-path":o.path,title:o.name,onClick:d=>r.openSystemFolder(o)},[ve(l,{class:"video-swarm-browser__folder-icon",name:"folder","aria-hidden":"true"}),r.systemFiles.showFilenames?(m(),p("div",cO,b(o.name),1)):N("",!0)],8,uO))),128)),(m(!0),p(H,null,oe(r.videoSwarmDisplayVideos,(o,d)=>(m(),p("button",{key:o.path,type:"button",class:B(["video-swarm-browser__tile",{"video-swarm-browser__tile--selected":r.systemFiles.selectedPaths.includes(o.path),"video-swarm-browser__tile--hover":s.hoveredPath===o.path}]),"data-video-path":o.path,onClick:u=>r.onTileClick(u,o,d),onDblclick:u=>r.onTileDblClick(u,d),onContextmenu:u=>r.onTileContextMenu(u,o),onMouseenter:u=>r.onTileEnter(o),onMouseleave:u=>r.onTileLeave(o)},[r.shouldLoadVideo(o)?(m(),p("video",{key:0,ref_for:!0,ref:u=>r.registerTileVideo(o.path,u),class:"video-swarm-browser__video",muted:"",loop:"",playsinline:"",preload:"metadata",src:r.systemFileMediaUrl(o.path),onLoadeddata:u=>r.onVideoLoaded(o.path)},null,40,fO)):(m(),at(l,{key:1,class:"video-swarm-browser__placeholder",name:"play","aria-hidden":"true"})),r.systemFiles.showFilenames?(m(),p("div",mO,b(o.name),1)):N("",!0),a("div",pO,b(r.formatVideoSwarmFileSize(o.size)),1)],42,hO))),128))],34))],34),r.systemFiles.fullscreenIndex>=0&&r.videoSwarmFullscreenVideo?(m(),p("div",{key:1,class:"video-swarm-browser__modal","data-testid":"video-swarm-fullscreen",onClick:e[38]||(e[38]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",gO,[a("div",yO,[a("strong",null,b(r.videoSwarmFullscreenVideo.name),1),a("div",vO,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[32]||(e[32]=o=>r.stepSystemFileFullscreen(-1))},"← Prev"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[33]||(e[33]=o=>r.stepSystemFileFullscreen(1))},"Next →"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[34]||(e[34]=o=>r.copySystemFilePath(r.videoSwarmFullscreenVideo.path))},"Copy path"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[35]||(e[35]=o=>r.openInVideoEditor(r.videoSwarmFullscreenVideo))},"Open in editor"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[36]||(e[36]=o=>r.deleteSystemFile(r.videoSwarmFullscreenVideo.path))},"Delete"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[37]||(e[37]=(...o)=>r.closeSystemFileFullscreen&&r.closeSystemFileFullscreen(...o))},"Close")])]),a("video",{ref:"modalVideoEl",class:"video-swarm-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:r.systemFileMediaUrl(r.videoSwarmFullscreenVideo.path)},null,8,bO)])])):N("",!0),s.contextMenu.open?(m(),p("div",{key:2,class:"video-swarm-browser__menu",style:Mt({top:s.contextMenu.y+"px",left:s.contextMenu.x+"px"})},[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[39]||(e[39]=(...o)=>r.openContextFullscreen&&r.openContextFullscreen(...o))},"Open"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[40]||(e[40]=o=>r.openInVideoEditor(s.contextMenu.video))},"Open in editor"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[41]||(e[41]=o=>{var d;return r.copySystemFilePath((d=s.contextMenu.video)==null?void 0:d.path)})},"Copy path"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[42]||(e[42]=(...o)=>r.deleteContextVideo&&r.deleteContextVideo(...o))},"Delete")],4)):N("",!0)])}const SO=nt(_N,[["render",_O]]),wO={name:"LibraryBrowserShell",components:{UiIcon:Kt,ProjectsBrowser:AF,VideosBrowser:WF,AudioBrowser:vN,VideoSwarmBrowser:SO},props:{app:{type:Object,required:!0},initialTab:{type:String,default:"projects"}},data(){return{activeTab:["projects","videos","audio","files"].includes(this.initialTab)?this.initialTab:"projects"}},methods:{setTab(t){this.activeTab=["projects","videos","audio","files"].includes(t)?t:"projects"}}},MO={class:"library-browser","data-testid":"library-browser"},PO={class:"library-browser__tabs sub-pills",role:"tablist","aria-label":"Library collections","data-testid":"library-browser-tabs"},xO=["aria-selected"],TO=["aria-selected"],AO=["aria-selected"],EO=["aria-selected"];function CO(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("ProjectsBrowser"),d=Ne("VideosBrowser"),u=Ne("AudioBrowser"),h=Ne("VideoSwarmBrowser");return m(),p("div",MO,[a("div",PO,[a("button",{type:"button",role:"tab",class:B(["sub-pill library-browser__tab",{active:s.activeTab==="projects"}]),"aria-selected":s.activeTab==="projects"?"true":"false","data-testid":"library-tab-projects",onClick:e[0]||(e[0]=c=>r.setTab("projects"))},[ve(l,{name:"folder"}),e[4]||(e[4]=a("span",null,"Projects",-1))],10,xO),a("button",{type:"button",role:"tab",class:B(["sub-pill library-browser__tab",{active:s.activeTab==="videos"}]),"aria-selected":s.activeTab==="videos"?"true":"false","data-testid":"library-tab-videos",onClick:e[1]||(e[1]=c=>r.setTab("videos"))},[ve(l,{name:"film"}),e[5]||(e[5]=a("span",null,"Videos",-1))],10,TO),a("button",{type:"button",role:"tab",class:B(["sub-pill library-browser__tab",{active:s.activeTab==="audio"}]),"aria-selected":s.activeTab==="audio"?"true":"false","data-testid":"library-tab-audio",onClick:e[2]||(e[2]=c=>r.setTab("audio"))},[ve(l,{name:"mic"}),e[6]||(e[6]=a("span",null,"Audio",-1))],10,AO),a("button",{type:"button",role:"tab",class:B(["sub-pill library-browser__tab",{active:s.activeTab==="files"}]),"aria-selected":s.activeTab==="files"?"true":"false","data-testid":"library-tab-files",onClick:e[3]||(e[3]=c=>r.setTab("files"))},[ve(l,{name:"folder"}),e[7]||(e[7]=a("span",null,"Files",-1))],10,EO)]),J(ve(o,{class:"library-browser__pane",app:i.app,active:s.activeTab==="projects"},null,8,["app","active"]),[[Wi,s.activeTab==="projects"]]),J(ve(d,{class:"library-browser__pane",app:i.app,active:s.activeTab==="videos"},null,8,["app","active"]),[[Wi,s.activeTab==="videos"]]),J(ve(u,{class:"library-browser__pane",app:i.app,active:s.activeTab==="audio"},null,8,["app","active"]),[[Wi,s.activeTab==="audio"]]),J(ve(h,{class:"library-browser__pane library-browser__pane--files",app:i.app},null,8,["app"]),[[Wi,s.activeTab==="files"]])])}const kO=nt(wO,[["render",CO]]),LO={name:"LibraryView",components:{UiIcon:Kt,LibraryBrowserShell:kO},props:{app:{type:Object,required:!0},workspace:{type:Boolean,default:!1}},setup(t){return Et(t)}},RO={class:"framesync-panel library-storage-browser"},DO={key:0,class:"framesync-header library-storage-browser__header"},IO={class:"framesync-title"},FO={class:"library-storage-browser__actions"};function NO(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("LibraryBrowserShell");return m(),p("div",{class:B(["library-shell",{"library-shell--fullscreen":t.libraryFullscreen&&!i.workspace,"library-shell--workspace":i.workspace}])},[a("div",RO,[i.workspace?N("",!0):(m(),p("div",DO,[a("div",IO,[ve(l,{class:"framesync-title-icon",name:"folder"}),e[2]||(e[2]=a("span",{class:"framesync-accent"},"Library",-1))]),e[3]||(e[3]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Projects, videos, and audio — browse, preview, open in the editor",-1))])),a("div",FO,[i.workspace&&t.librarySourceMode?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"use-library-as-source",onClick:e[0]||(e[0]=d=>t.applyLibrarySelectionAsSource())}," Use as source ")):N("",!0),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"open-in-video-editor",onClick:e[1]||(e[1]=d=>t.openInVideoEditor())}," Open in editor ")]),ve(o,{app:i.app},null,8,["app"])])],2)}const OO=nt(LO,[["render",NO],["__scopeId","data-v-73077ca3"]]),UO={name:"EditorShell",props:{title:{type:String,default:"Editor"},titleAccent:{type:String,default:""},titleRest:{type:String,default:""},subtitle:{type:String,default:""},status:{type:String,default:""},statusLive:{type:Boolean,default:!1},testId:{type:String,default:""}}},BO=["data-testid"],VO={class:"framesync-header editor-shell__header"},zO={class:"editor-shell__titles"},$O={class:"framesync-title"},GO={key:0},HO={key:1,class:"framesync-accent"},WO={key:2,class:"framesync-accent"},qO={key:0,class:"framesync-subtitle editor-shell__subtitle"},jO={key:0,class:"editor-shell__actions"},XO={key:0,class:"editor-shell__pills sub-pills"},KO={class:"editor-shell__body"};function YO(t,e,i,n,s,r){return m(),p("div",{class:"editor-shell framesync-panel","data-testid":i.testId||"editor-shell"},[a("div",VO,[a("div",zO,[a("div",$O,[i.titleAccent?(m(),p("span",GO,b(i.titleAccent),1)):N("",!0),i.titleAccent?(m(),p("span",HO,b(i.titleRest),1)):(m(),p("span",WO,b(i.title),1))]),i.subtitle?(m(),p("span",qO,b(i.subtitle),1)):N("",!0)]),t.$slots.actions?(m(),p("div",jO,[_o(t.$slots,"actions")])):N("",!0)]),t.$slots.pills?(m(),p("div",XO,[_o(t.$slots,"pills")])):N("",!0),i.status?(m(),p("div",{key:1,class:B(["editor-shell__status",{"editor-shell__status--live":i.statusLive}])},b(i.status),3)):N("",!0),a("div",KO,[_o(t.$slots,"default")])],8,BO)}const JO=nt(UO,[["render",YO]]);function oy(t="/freecut"){return String(t||"/freecut").replace(/\/+$/,"")||"/freecut"}function ay(t="/freecut"){return`${oy(t)}/projects`}function ZO(t,e="/freecut"){const i=oy(e),n=String(t||"").trim();return n?`${i}/editor/${encodeURIComponent(n)}`:ay(i)}function QO(t,e,i){const n=String(e||"").trim();if(!n)return"";const s=new URLSearchParams({path:n});return i&&s.set("rootId",String(i)),`${String(t||"").replace(/\/+$/,"")}/api/video-swarm/file?${s.toString()}`}function e4(t){const e=String(t||"").trim();return e?{type:"defora:import-url",url:e}:null}const t4={name:"EditorView",components:{EditorShell:JO},props:{app:{type:Object,required:!0}},setup(t){return Et(t)},computed:{freecutFrameSrc(){const t=String(this.editorFreecutRoute||"projects").trim();if(t.startsWith("editor/")){const e=t.slice(7);return ZO(e)}return ay()},editorImportUrl(){const t=String(this.editorPendingImportUrl||"").trim();if(t)return t;const e=String(this.editorPendingImportPath||"").trim();if(!e)return"";const i=typeof window<"u"?window.location.origin:"";return QO(i,e,this.editorPendingImportRootId)}},methods:{navigateFreecut(t){this.editorFreecutRoute=t==="projects"?"projects":String(t||"projects"),this.editorStatus=t==="projects"?"Browsing projects":"Opening editor",this.saveSessionState()},openFreecutNewTab(){typeof window>"u"||window.open(this.freecutFrameSrc,"_blank","noopener,noreferrer")},onFreecutLoad(){this.editorStatus="FreeCut ready",this.editorStatusLive=!0,this.editorImportUrl&&this.postImportToFreecut()},postImportToFreecut(){const t=this.$refs.freecutFrame,e=e4(this.editorImportUrl);if(!(!t||!t.contentWindow||!e))try{t.contentWindow.postMessage(e,window.location.origin),this.editorStatus="Sent import URL to FreeCut"}catch{this.editorStatus="Copy the import URL into FreeCut media library"}},importFromLibrary(){if(!this.editorImportUrl){this.editorStatus="Select a video in Library first";return}this.postImportToFreecut(),this.editorPendingImportPath="",this.editorPendingImportRootId="",this.editorPendingImportUrl=this.editorImportUrl,this.saveSessionState()},async copyImportUrl(){if(this.editorImportUrl)try{await navigator.clipboard.writeText(this.editorImportUrl),this.editorStatus="Import URL copied"}catch{this.editorStatus="Could not copy URL — select and copy manually"}}}},i4={class:"editor-view","data-testid":"editor-view"},n4=["disabled"],s4=["disabled"],r4={key:0,class:"editor-view__import"},o4={class:"editor-view__import-url"},a4=["src"];function l4(t,e,i,n,s,r){const l=Ne("EditorShell");return m(),p("div",i4,[ve(l,{"title-accent":"Video","title-rest":"Editor",subtitle:"FreeCut — multi-track timeline, keyframes, WebGPU preview, and export",status:t.editorStatus,"status-live":t.editorStatusLive,"test-id":"video-editor-shell"},{actions:Ni(()=>[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[0]||(e[0]=o=>r.navigateFreecut("projects"))}," Projects "),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=(...o)=>r.openFreecutNewTab&&r.openFreecutNewTab(...o))}," Open tab "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:!r.editorImportUrl,onClick:e[2]||(e[2]=(...o)=>r.copyImportUrl&&r.copyImportUrl(...o))}," Copy import URL ",8,n4),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!r.editorImportUrl,onClick:e[3]||(e[3]=(...o)=>r.importFromLibrary&&r.importFromLibrary(...o))}," Import from library ",8,s4)]),default:Ni(()=>[r.editorImportUrl?(m(),p("div",r4,[e[5]||(e[5]=a("span",{class:"framesync-subtitle"},"Library handoff",-1)),a("code",o4,b(r.editorImportUrl),1),e[6]||(e[6]=a("span",{class:"framesync-subtitle editor-view__import-hint"}," Paste into FreeCut media library → Import from URL, or use Import from library once the editor is ready. ",-1))])):N("",!0),a("iframe",{ref:"freecutFrame",class:"editor-view__frame","data-testid":"freecut-editor-frame",src:r.freecutFrameSrc,title:"FreeCut video editor",allow:"clipboard-write; storage-access *",onLoad:e[4]||(e[4]=(...o)=>r.onFreecutLoad&&r.onFreecutLoad(...o))},null,40,a4)]),_:1},8,["status","status-live"])])}const ly=nt(t4,[["render",l4]]),d4={name:"LibraryWorkspaceOverlay",components:{UiIcon:Kt,LibraryView:OO,EditorView:ly},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},u4={key:0,class:"library-workspace","data-testid":"library-workspace",role:"dialog","aria-modal":"true","aria-label":"Library and video editor"},c4={class:"library-workspace__chrome"},h4={class:"library-workspace__tabs",role:"tablist"},f4=["aria-selected"],m4=["aria-selected"],p4={class:"library-workspace__body"},g4={class:"library-workspace__pane library-workspace__pane--editor","data-testid":"editor-workspace"};function y4(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("LibraryView"),d=Ne("EditorView");return m(),at(Pb,{name:"library-workspace-slide"},{default:Ni(()=>[t.libraryWorkspaceOpen?(m(),p("div",u4,[a("div",c4,[a("div",h4,[a("button",{type:"button",role:"tab",class:B(["library-workspace__tab",{"library-workspace__tab--active":t.libraryWorkspacePane==="browser"}]),"aria-selected":t.libraryWorkspacePane==="browser"?"true":"false","data-testid":"library-workspace-tab-browser",onClick:e[0]||(e[0]=u=>t.setLibraryWorkspacePane("browser"))},[ve(l,{name:"folder"}),e[3]||(e[3]=a("span",null,"Library",-1))],10,f4),a("button",{type:"button",role:"tab",class:B(["library-workspace__tab",{"library-workspace__tab--active":t.libraryWorkspacePane==="editor"}]),"aria-selected":t.libraryWorkspacePane==="editor"?"true":"false","data-testid":"library-workspace-tab-editor",onClick:e[1]||(e[1]=u=>t.setLibraryWorkspacePane("editor"))},[ve(l,{name:"film"}),e[4]||(e[4]=a("span",null,"Video editor",-1))],10,m4)]),a("button",{type:"button",class:"library-workspace__close framesync-button framesync-button--compact","data-testid":"close-library-workspace",title:"Close library",onClick:e[2]||(e[2]=u=>t.closeLibraryWorkspace())},[ve(l,{name:"chevron-up"}),e[5]||(e[5]=a("span",null,"Close",-1))])]),a("div",p4,[J(ve(o,{class:"library-workspace__pane",app:i.app,workspace:""},null,8,["app"]),[[Wi,t.libraryWorkspacePane==="browser"]]),J(a("div",g4,[ve(d,{app:i.app},null,8,["app"])],512),[[Wi,t.libraryWorkspacePane==="editor"]])])])):N("",!0)]),_:1})}const v4=nt(d4,[["render",y4]]),b4={name:"ModelSourcePill",props:{source:{type:String,default:""}},computed:{tone(){const t=String(this.source||"").toLowerCase();return t==="sd-forge"?"forge":t==="cache"?"cache":t==="placeholder"?"placeholder":"other"},label(){const t=String(this.source||"").toLowerCase();return t==="sd-forge"?"Forge":t==="cache"?"Cache":t==="placeholder"?"Placeholder":this.source||"Unknown"}}},_4={class:"model-source-pill__label"};function S4(t,e,i,n,s,r){return m(),p("span",{class:B(["model-source-pill",`model-source-pill--${r.tone}`])},[e[0]||(e[0]=a("span",{class:"model-source-pill__dot","aria-hidden":"true"},null,-1)),a("span",_4,b(r.label),1)],2)}const w4=nt(b4,[["render",S4]]),M4={name:"PromptsView",components:{ModelSourcePill:w4},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},P4={class:"sub-pills"},x4={key:0},T4={class:"rack"},A4={class:"framesync-panel prompt-style-bar","data-testid":"prompt-style-bar"},E4={class:"framesync-header"},C4={class:"prompt-style-bar__row"},k4=["value"],L4=["value"],R4={class:"framesync-checkbox prompt-style-bar__auto"},D4={key:0,class:"framesync-subtitle prompt-style-bar__hint"},I4={key:0},F4={key:1},N4={class:"rack"},O4={class:"framesync-panel prompts-schedule-hint","data-testid":"prompts-schedule-hint"},U4={class:"rack"},B4={class:"framesync-panel"},V4={class:"framesync-header"},z4={class:"prompt-toolbar"},$4={key:0,class:"morph-live-hint","data-testid":"prompt-morph-live-hint"},G4={class:"framesync-subtitle morph-live-hint__copy"},H4={key:0},W4={key:1},q4={key:0,class:"morph-slot-weights",style:{"margin-top":"12px"}},j4={class:"morph-slot-head"},X4={class:"framesync-checkbox morph-slot-weight-name"},K4=["onUpdate:modelValue"],Y4={class:"morph-slot-meta"},J4={class:"morph-slot-chip morph-slot-chip--range"},Z4={class:"morph-slot-chip morph-slot-chip--weight"},Q4={class:"morph-slot-flow"},e5={class:"morph-slot-lane morph-slot-lane--a"},t5=["onUpdate:modelValue","disabled","onInput"],i5={class:"morph-slot-flow__bridge"},n5={class:"morph-slot-flow__readout"},s5={class:"morph-slot-flow__mix"},r5={class:"morph-slot-flow__preview"},o5={class:"morph-slot-flow__mix morph-slot-flow__mix--b"},a5=["onUpdate:modelValue","disabled","onInput"],l5={class:"morph-slot-lane morph-slot-lane--b"},d5=["onUpdate:modelValue","disabled","onInput"],u5={class:"morph-slot-preview"},c5={key:1},h5={class:"rack"},f5={class:"framesync-panel"},m5={class:"framesync-header"},p5={key:0,class:"img2img-panel"},g5={class:"img2img-dropgrid"},y5={key:0,class:"img2img-dropzone__preview"},v5=["src"],b5={key:1,class:"img2img-dropzone__empty"},_5={key:0,class:"img2img-dropzone__preview"},S5=["src"],w5={key:1,class:"img2img-dropzone__empty"},M5={class:"img2img-dropgrid__actions"},P5=["disabled"],x5=["disabled"],T5={class:"img2img-controls-grid"},A5={class:"img2img-control-card img2img-control-card--primary"},E5={class:"img2img-control-card__value"},C5=["value"],k5={class:"img2img-control-card"},L5={class:"img2img-control-card"},R5={key:0,class:"img2img-control-card"},D5={class:"img2img-control-card__value"},I5=["value"],F5={key:1,class:"img2img-control-card"},N5={key:2,class:"img2img-control-card"},O5={class:"framesync-buttons"},U5={class:"framesync-footer img2img-panel__actions"},B5={key:0,class:"framesync-subtitle img2img-panel__status"},V5={key:1,class:"framesync-subtitle img2img-panel__output"},z5=["href"],$5={key:2},G5={class:"rack generate-story"},H5={class:"framesync-panel"},W5={class:"framesync-header"},q5={class:"generate-story__ollama-row"},j5={class:"generate-sequencer__hero-grid"},X5={class:"generate-sequencer__hero-card"},K5={class:"generate-sequencer__hero-value"},Y5={class:"generate-sequencer__hero-meta"},J5={class:"generate-sequencer__hero-card"},Z5={class:"generate-sequencer__hero-value"},Q5={class:"generate-sequencer__hero-meta"},eU={class:"generate-sequencer__hero-card"},tU={class:"generate-sequencer__hero-value generate-sequencer__hero-value--compact"},iU={class:"generate-sequencer__hero-card"},nU={class:"generate-sequencer__hero-value generate-sequencer__hero-value--status generate-sequencer__hero-value--compact"},sU={class:"generate-sequencer__hero-meta"},rU={class:"generate-story__config"},oU={class:"framesync-stack generate-story__theme-field"},aU={class:"img2img-controls-grid generate-story__controls-grid"},lU={class:"img2img-control-card img2img-control-card--primary"},dU={key:0,class:"img2img-control-card"},uU={class:"img2img-control-card"},cU={class:"img2img-control-card__value"},hU=["value"],fU={class:"img2img-control-card"},mU={class:"img2img-control-card"},pU={class:"prompt-toolbar generate-story__actions"},gU=["disabled"],yU=["disabled"],vU={key:0,class:"generate-sequencer__status-text"},bU={key:1,class:"generate-story__story-result"},_U={class:"framesync-header"},SU={key:0,class:"pill"},wU={class:"generate-story__story-text"},MU={class:"prompt-toolbar generate-story__actions"},PU={key:2,class:"generate-story__preview"},xU={class:"framesync-header"},TU={key:0,class:"generate-story__image-wrap"},AU=["src"],EU={key:3},CU={class:"rack"},kU={class:"framesync-panel"},LU={class:"framesync-header"},RU={class:"prompt-toolbar"},DU={class:"lora-family-pill"},IU={key:0,class:"lora-picker-panel"},FU={class:"framesync-subtitle lora-browser-summary"},NU={key:0},OU={key:1},UU={class:"lora-picker-families"},BU={class:"lora-picker-family__title"},VU={class:"lora-picker-list"},zU={class:"lora-picker-row__copy"},$U={class:"lora-picker-row__name"},GU={class:"lora-picker-row__path"},HU={class:"lora-picker-row__actions"},WU=["onClick"],qU=["onClick"],jU=["onClick"],XU=["onClick"],KU={key:0,class:"lora-picker-empty"},YU={key:0},JU={key:1},ZU={class:"lora-active-groups"},QU={class:"lora-active-group lora-active-group--common"},eB={class:"lora-active-group__title"},tB={class:"lora-active-group__body"},iB={class:"lora-active-group__copy"},nB={class:"lora-active-group__name"},sB={class:"lora-active-group__value"},rB=["value","onInput"],oB=["onClick"],aB={key:0,class:"lora-active-group__empty"},lB={class:"lora-active-group lora-active-group--a"},dB={class:"lora-active-group__title"},uB={class:"lora-active-group__body"},cB={class:"lora-active-group__copy"},hB={class:"lora-active-group__name"},fB={class:"lora-active-group__value"},mB=["value","onInput"],pB=["onClick"],gB={key:0,class:"lora-active-group__empty"},yB={class:"lora-active-group lora-active-group--b"},vB={class:"lora-active-group__title"},bB={class:"lora-active-group__body"},_B={class:"lora-active-group__copy"},SB={class:"lora-active-group__name"},wB={class:"lora-active-group__value"},MB=["value","onInput"],PB=["onClick"],xB={key:0,class:"lora-active-group__empty"},TB={class:"lora-crossfader-hint","data-testid":"lora-crossfader-hint"},AB={class:"framesync-footer",style:{"margin-top":"12px"}},EB={key:4},CB={class:"rack"},kB={class:"framesync-panel"},LB={class:"framesync-header"},RB={class:"prompt-toolbar"},DB={class:"controlnet-slot-strip",style:{"margin-top":"12px",display:"flex","flex-direction":"column",gap:"6px"}},IB=["onClick"],FB=["onClick"],NB={class:"rack"},OB={class:"framesync-panel"},UB={class:"framesync-header"},BB={class:"framesync-title"},VB={class:"framesync-accent"},zB={class:"framesync-stack",style:{"margin-top":"12px"}},$B=["value"],GB={class:"framesync-subtitle",style:{"margin-top":"4px"}},HB={class:"framesync-stack",style:{"margin-top":"12px"}},WB={style:{display:"flex",gap:"8px","flex-wrap":"wrap"}},qB={key:0,class:"framesync-stack",style:{"margin-top":"12px"}},jB={ref:"webcamVideo",autoplay:"",playsinline:"",style:{width:"100%","max-width":"320px","border-radius":"6px",border:"1px solid var(--border)",display:"none"}},XB={ref:"webcamCanvas",style:{display:"none"}},KB={style:{display:"flex",gap:"8px","margin-top":"8px"}},YB={key:1,class:"framesync-stack",style:{"margin-top":"12px"}},JB={class:"framesync-footer",style:{"margin-top":"10px"}},ZB={class:"framesync-stack",style:{"margin-top":"12px"}},QB={style:{display:"flex","justify-content":"space-between","align-items":"center"}},e8={style:{color:"var(--text-primary)","font-size":"12px"}},t8={class:"controlnet-weight-card",style:{"margin-top":"4px","font-size":"11px",color:"var(--text-secondary)"}},i8={class:"framesync-stack",style:{"margin-top":"12px"}},n8={style:{display:"flex","justify-content":"space-between","align-items":"center"}},s8={style:{color:"var(--text-primary)","font-size":"12px"}},r8={class:"framesync-stack",style:{"margin-top":"12px"}},o8={style:{display:"flex","justify-content":"space-between","align-items":"center"}},a8={style:{color:"var(--text-primary)","font-size":"12px"}};function l8(t,e,i,n,s,r){const l=Ne("ModelSourcePill");return m(),p("div",null,[a("div",P4,[a("button",{class:B(["sub-pill",{active:t.currentSubTab.PROMPTS==="PROMPTS"}]),onClick:e[0]||(e[0]=o=>t.switchSubTab("PROMPTS","PROMPTS"))},"PROMPTS",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.PROMPTS==="IMAGE"}]),onClick:e[1]||(e[1]=o=>t.switchSubTab("PROMPTS","IMAGE"))},"IMAGE",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.PROMPTS==="LORA"}]),onClick:e[2]||(e[2]=o=>t.switchSubTab("PROMPTS","LORA"))},"LORA",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.PROMPTS==="CONTROLNET"}]),onClick:e[3]||(e[3]=o=>t.switchSubTab("PROMPTS","CONTROLNET"))},"CONTROLNET",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.PROMPTS==="STORY"}]),onClick:e[4]||(e[4]=o=>t.switchSubTab("PROMPTS","STORY"))},"STORY",2)]),t.currentSubTab.PROMPTS==="PROMPTS"?(m(),p("div",x4,[a("div",T4,[a("div",A4,[a("div",E4,[e[69]||(e[69]=a("div",{class:"framesync-title"},[ie("Style "),a("span",{class:"framesync-accent"},"modifier")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=o=>{t.switchTab("SETTINGS"),t.switchSubTab("SETTINGS","STYLES")})}," Manage styles ")]),a("div",C4,[a("select",{class:"framesync-select prompt-style-bar__select","data-testid":"prompt-style-select",value:t.activePromptStyleId||"",onChange:e[6]||(e[6]=o=>t.selectActivePromptStyle(o.target.value||null))},[e[70]||(e[70]=a("option",{value:""},"No style (base prompts only)",-1)),(m(!0),p(H,null,oe(t.promptStyles,o=>(m(),p("option",{key:"prompt-style-opt-"+o.id,value:o.id},b(o.name),9,L4))),128))],40,k4),a("label",R4,[J(a("input",{"onUpdate:modelValue":e[7]||(e[7]=o=>t.promptStyleAutoExample=o),type:"checkbox",onChange:e[8]||(e[8]=o=>t.saveSessionState())},null,544),[[xi,t.promptStyleAutoExample]]),e[71]||(e[71]=ie(" Save preview as style example ",-1))])]),t.activePromptStyle?(m(),p("p",D4,[e[72]||(e[72]=ie(" Appends to prompts: ",-1)),t.activePromptStyle.positive?(m(),p("span",I4,"+"+b(t.activePromptStyle.positive.slice(0,120))+b(t.activePromptStyle.positive.length>120?"…":""),1)):N("",!0),t.activePromptStyle.negative?(m(),p("span",F4," · neg +"+b(t.activePromptStyle.negative.slice(0,80))+b(t.activePromptStyle.negative.length>80?"…":""),1)):N("",!0)])):N("",!0)])]),a("div",N4,[a("div",O4,[e[73]||(e[73]=a("p",{class:"framesync-subtitle prompts-schedule-hint__copy"}," Frame-by-frame prompt and negative schedules are edited in the Engine drawer (Deforum → Prompts tab), not here. ",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"prompts-open-engine-schedules",onClick:e[9]||(e[9]=o=>t.openEngineDeforumSettingsTab("prompts"))}," Open prompt schedules ")])]),a("div",U4,[a("div",B4,[a("div",V4,[e[74]||(e[74]=a("div",{class:"framesync-title"},[ie("Prompt "),a("span",{class:"framesync-accent"},"Morphing")],-1)),a("div",z4,[a("button",{class:B(["framesync-button",{"framesync-button--live":t.prompts.morphOn}]),onClick:e[10]||(e[10]=o=>t.setMorph(!0))},"Enabled",2),a("button",{class:B(["framesync-button",{active:!t.prompts.morphOn}]),onClick:e[11]||(e[11]=o=>t.setMorph(!1))},"Disabled",2),t.prompts.morphOn?(m(),p("button",{key:0,class:"framesync-button",onClick:e[12]||(e[12]=o=>{t.morphCollapsed=!t.morphCollapsed,t.saveSessionState()})},b(t.morphCollapsed?"Edit morph slots":"Collapse slots"),1)):N("",!0)])]),t.prompts.morphOn?(m(),p("div",$4,[a("div",G4,[e[75]||(e[75]=ie(" Prompt morph blend is on the ",-1)),e[76]||(e[76]=a("strong",null,"LIVE",-1)),ie(" stage (Morph HUD, bottom-right). A/B mix: "+b(Math.round((1-t.prompts.morphBlend)*100))+"% · "+b(Math.round(t.prompts.morphBlend*100))+"% ",1),t.promptMorphBlendLinkStatus?(m(),p("span",H4," · "+b(t.promptMorphBlendLinkStatus),1)):N("",!0)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[13]||(e[13]=o=>t.switchTab("LIVE"))}," Open LIVE morph ")])):N("",!0),t.prompts.morphOn&&!t.morphCollapsed?(m(),p("div",W4,[t.prompts.morphOn?(m(),p("div",q4,[(m(!0),p(H,null,oe(t.morphSlots,o=>(m(),p("div",{key:"mw-"+o.id,class:B(["morph-slot-weight-row",{inactive:!o.on,"morph-slot-weight-row--flowing":o.on&&t.morphSlotInRange(o),"morph-slot-weight-row--waiting":o.on&&!t.morphSlotInRange(o)}]),style:Mt({"--morph-flow-progress":`${(t.morphBlendInSlotRange(o)*100).toFixed(1)}%`})},[a("div",j4,[a("label",X4,[J(a("input",{type:"checkbox","onUpdate:modelValue":d=>o.on=d,onChange:e[14]||(e[14]=(...d)=>t.applyPromptMorphing&&t.applyPromptMorphing(...d))},null,40,K4),[[xi,o.on]]),ie(" "+b(o.name),1)]),a("div",Y4,[a("span",J4,b(o.range),1),a("span",Z4,"Weight "+b(o.weight.toFixed(2)),1),a("span",{class:B(["morph-slot-chip",o.on&&t.morphSlotInRange(o)?"morph-slot-chip--active":"morph-slot-chip--idle"])},b(o.on?t.morphSlotInRange(o)?"Flowing":"Waiting":"Muted"),3)])]),a("div",Q4,[a("label",e5,[e[77]||(e[77]=a("span",{class:"morph-slot-editor__label"},"A phrase",-1)),J(a("input",{type:"text","onUpdate:modelValue":d=>o.a=d,class:"framesync-input morph-slot-editor__input",disabled:!o.on,onInput:d=>t.onMorphSlotPhraseInput(o)},null,40,t5),[[ye,o.a,void 0,{trim:!0}]])]),a("div",i5,[e[78]||(e[78]=a("div",{class:"morph-slot-flow__track"},[a("span",{class:"morph-slot-flow__glow"}),a("span",{class:"morph-slot-flow__marker"})],-1)),a("div",n5,[a("span",s5,"A "+b(((1-t.prompts.morphBlend)*100).toFixed(0))+"%",1),a("span",r5,b(t.morphSlotPreview(o)),1),a("span",o5,"B "+b((t.prompts.morphBlend*100).toFixed(0))+"%",1)]),J(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":d=>o.weight=d,class:"framesync-input morph-slot-weight-slider",disabled:!o.on,onInput:d=>t.onMorphSlotWeightInput(o)},null,40,a5),[[ye,o.weight,void 0,{number:!0}]])]),a("label",l5,[e[79]||(e[79]=a("span",{class:"morph-slot-editor__label"},"B phrase",-1)),J(a("input",{type:"text","onUpdate:modelValue":d=>o.b=d,class:"framesync-input morph-slot-editor__input",disabled:!o.on,onInput:d=>t.onMorphSlotPhraseInput(o)},null,40,d5),[[ye,o.b,void 0,{trim:!0}]])])]),a("code",u5,b(t.morphSlotPreview(o)),1)],6))),128))])):N("",!0)])):N("",!0)])])])):t.currentSubTab.PROMPTS==="IMAGE"?(m(),p("div",c5,[a("div",h5,[a("div",f5,[a("div",m5,[e[80]||(e[80]=a("div",{class:"framesync-title"},[ie("img2img "),a("span",{class:"framesync-accent"},"(Forge)")],-1)),a("button",{class:"framesync-button",onClick:e[15]||(e[15]=o=>t.img2img.show=!t.img2img.show)},b(t.img2img.show?"Hide":"Show"),1)]),t.img2img.show?(m(),p("div",p5,[e[91]||(e[91]=a("div",{class:"framesync-subtitle img2img-panel__summary"},[ie(" Use an "),a("strong",null,"input image"),ie(" with optional "),a("strong",null,"mask"),ie(" for inpainting. Drag files into the boxes below or click to browse. ")],-1)),a("div",g5,[a("label",{class:B(["img2img-dropzone",{"img2img-dropzone--filled":!!t.img2img.dataUrl}]),onDragover:e[17]||(e[17]=lt(()=>{},["prevent"])),onDragenter:e[18]||(e[18]=lt(()=>{},["prevent"])),onDrop:e[19]||(e[19]=lt(o=>t.handleImg2imgDrop(o,"input"),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input",onChange:e[16]||(e[16]=(...o)=>t.handleImg2imgFile&&t.handleImg2imgFile(...o))},null,32),t.img2img.dataUrl?(m(),p("div",y5,[a("img",{src:t.img2img.dataUrl,alt:"Input preview",class:"img2img-dropzone__image"},null,8,v5)])):(m(),p("div",b5,[...e[81]||(e[81]=[a("div",{class:"img2img-dropzone__title"},"Input image",-1),a("div",{class:"img2img-dropzone__hint"},"Drag and drop an image here",-1),a("div",{class:"img2img-dropzone__meta"},"or click to browse",-1)])]))],34),a("label",{class:B(["img2img-dropzone img2img-dropzone--mask",{"img2img-dropzone--filled":!!t.img2img.maskDataUrl}]),onDragover:e[21]||(e[21]=lt(()=>{},["prevent"])),onDragenter:e[22]||(e[22]=lt(()=>{},["prevent"])),onDrop:e[23]||(e[23]=lt(o=>t.handleImg2imgDrop(o,"mask"),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input",onChange:e[20]||(e[20]=(...o)=>t.handleImg2imgMask&&t.handleImg2imgMask(...o))},null,32),t.img2img.maskDataUrl?(m(),p("div",_5,[a("img",{src:t.img2img.maskDataUrl,alt:"Mask preview",class:"img2img-dropzone__image"},null,8,S5)])):(m(),p("div",w5,[...e[82]||(e[82]=[a("div",{class:"img2img-dropzone__title"},"Mask image",-1),a("div",{class:"img2img-dropzone__hint"},"Optional inpaint mask",-1),a("div",{class:"img2img-dropzone__meta"},"white repaints, black keeps",-1)])]))],34)]),a("div",M5,[a("button",{class:"framesync-button",disabled:!t.img2img.dataUrl,onClick:e[24]||(e[24]=(...o)=>t.clearImg2imgInput&&t.clearImg2imgInput(...o))},"Clear input",8,P5),a("button",{class:"framesync-button",disabled:!t.img2img.maskDataUrl,onClick:e[25]||(e[25]=(...o)=>t.clearImg2imgMask&&t.clearImg2imgMask(...o))},"Clear mask",8,x5)]),a("div",T5,[a("div",A5,[e[83]||(e[83]=a("div",{class:"framesync-subtitle"},"Denoising strength",-1)),a("div",E5,b(t.img2img.denoisingStrength.toFixed(2)),1),a("input",{type:"range",min:"0",max:"1",step:"0.01",value:t.img2img.denoisingStrength,class:"framesync-input img2img-control-card__slider",onInput:e[26]||(e[26]=o=>t.img2img.denoisingStrength=parseFloat(o.target.value))},null,40,C5)]),a("div",k5,[e[84]||(e[84]=a("div",{class:"framesync-subtitle"},"Width",-1)),J(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[27]||(e[27]=o=>t.img2img.width=o),min:"64",max:"2048",step:"64"},null,512),[[ye,t.img2img.width,void 0,{number:!0}]])]),a("div",L5,[e[85]||(e[85]=a("div",{class:"framesync-subtitle"},"Height",-1)),J(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[28]||(e[28]=o=>t.img2img.height=o),min:"64",max:"2048",step:"64"},null,512),[[ye,t.img2img.height,void 0,{number:!0}]])]),t.img2img.maskDataUrl?(m(),p("div",R5,[e[86]||(e[86]=a("div",{class:"framesync-subtitle"},"Mask blur",-1)),a("div",D5,b(t.img2img.maskBlur),1),a("input",{type:"range",min:"0",max:"64",step:"1",value:t.img2img.maskBlur,class:"framesync-input img2img-control-card__slider",onInput:e[29]||(e[29]=o=>t.img2img.maskBlur=parseInt(o.target.value,10))},null,40,I5)])):N("",!0),t.img2img.maskDataUrl?(m(),p("div",F5,[e[88]||(e[88]=a("div",{class:"framesync-subtitle"},"Inpainting fill",-1)),J(a("select",{class:"framesync-select img2img-control-card__input","onUpdate:modelValue":e[30]||(e[30]=o=>t.img2img.inpaintingFill=o)},[...e[87]||(e[87]=[a("option",{value:"0"},"Fill",-1),a("option",{value:"1"},"Original",-1),a("option",{value:"2"},"Latent noise",-1),a("option",{value:"3"},"Latent nothing",-1)])],512),[[Dt,t.img2img.inpaintingFill,void 0,{number:!0}]])])):N("",!0),t.img2img.maskDataUrl?(m(),p("div",N5,[e[89]||(e[89]=a("div",{class:"framesync-subtitle"},"Masked area",-1)),a("div",O5,[a("button",{class:B(["framesync-button",{active:t.img2img.inpaintFullRes}]),onClick:e[31]||(e[31]=o=>t.img2img.inpaintFullRes=!0)},"Full res",2),a("button",{class:B(["framesync-button",{active:!t.img2img.inpaintFullRes}]),onClick:e[32]||(e[32]=o=>t.img2img.inpaintFullRes=!1)},"Whole image",2)])])):N("",!0)]),a("div",U5,[a("button",{class:"framesync-button",onClick:e[33]||(e[33]=(...o)=>t.runImg2img&&t.runImg2img(...o))},b(t.img2img.loading?"Running…":"Run img2img"),1)]),t.img2img.status?(m(),p("div",B5,b(t.img2img.status),1)):N("",!0),t.img2img.lastPath?(m(),p("div",V5,[e[90]||(e[90]=ie(" Output: ",-1)),a("a",{href:t.img2img.lastPath,target:"_blank",style:{color:"var(--warn)"}},b(t.img2img.lastPath),9,z5)])):N("",!0)])):N("",!0)])])])):t.currentSubTab.PROMPTS==="STORY"?(m(),p("div",$5,[a("div",G5,[a("div",H5,[a("div",W5,[e[92]||(e[92]=a("div",{class:"framesync-title"},[ie("Story "),a("span",{class:"framesync-accent"},"Generator")],-1)),a("span",{class:B(["generate-sequencer__status",{"generate-sequencer__status--live":t.storyGeneratorStatusLive}])},b(t.storyGeneratorStatusLabel),3)]),a("div",q5,[a("span",{class:B(["generate-story__ollama-status",{"generate-story__ollama-status--ready":t.storyOllamaStatusTone==="ready","generate-story__ollama-status--warn":t.storyOllamaStatusTone==="warn","generate-story__ollama-status--off":t.storyOllamaStatusTone==="off"}])},b(t.storyOllamaStatusLabel),3),t.storyOllamaNeedsConfigure?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",onClick:e[34]||(e[34]=(...o)=>t.openGpuSettings&&t.openGpuSettings(...o))}," Configure ")):N("",!0)]),a("div",j5,[a("div",X5,[e[93]||(e[93]=a("div",{class:"framesync-subtitle"},"Scenes",-1)),a("div",K5,b(t.storyGeneratorSceneCount),1),a("div",Y5,b(t.storyGeneratorSceneMeta),1)]),a("div",J5,[e[94]||(e[94]=a("div",{class:"framesync-subtitle"},"Frames",-1)),a("div",Z5,b(t.storyGeneratorFrameCount),1),a("div",Q5,b(t.storyGeneratorTimelineMeta),1)]),a("div",eU,[e[95]||(e[95]=a("div",{class:"framesync-subtitle"},"Resolution",-1)),a("div",tU,b(t.storyGeneratorResolutionLabel),1),e[96]||(e[96]=a("div",{class:"generate-sequencer__hero-meta"},"From Deforum timeline settings",-1))]),a("div",iU,[e[97]||(e[97]=a("div",{class:"framesync-subtitle"},"Engine",-1)),a("div",nU,b(t.storyGeneratorSourceLabel),1),a("div",sU,b(t.availableOllamaNodes.length?`${t.availableOllamaNodes.length} Ollama node(s) ready`:"Local template fallback"),1)])]),a("div",rU,[a("label",oU,[e[98]||(e[98]=a("div",{class:"framesync-subtitle"},"Theme / story concept",-1)),J(a("input",{class:"framesync-input generate-story__theme-input","onUpdate:modelValue":e[35]||(e[35]=o=>t.generator.theme=o),placeholder:"e.g. A Space Traveler, Ancient Forest, Cyberpunk City…"},null,512),[[ye,t.generator.theme]])]),a("div",aU,[a("div",lU,[e[100]||(e[100]=a("div",{class:"framesync-subtitle"},"Style preset",-1)),J(a("select",{class:"framesync-select img2img-control-card__input","onUpdate:modelValue":e[36]||(e[36]=o=>t.generator.stylePreset=o)},[...e[99]||(e[99]=[Bi('',7)])],512),[[Dt,t.generator.stylePreset]])]),t.generator.stylePreset==="custom"?(m(),p("div",dU,[e[101]||(e[101]=a("div",{class:"framesync-subtitle"},"Custom style",-1)),J(a("input",{class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[37]||(e[37]=o=>t.generator.customStyle=o),placeholder:"Your style keywords"},null,512),[[ye,t.generator.customStyle]])])):N("",!0),a("div",uU,[e[102]||(e[102]=a("div",{class:"framesync-subtitle"},"Scene count",-1)),a("div",cU,b(t.storyGeneratorSceneCount),1),a("input",{type:"range",min:"2",max:"12",step:"1",value:t.generator.numScenes,class:"framesync-input img2img-control-card__slider",onInput:e[38]||(e[38]=o=>t.generator.numScenes=parseInt(o.target.value,10))},null,40,hU)]),a("div",fU,[e[103]||(e[103]=a("div",{class:"framesync-subtitle"},"FPS",-1)),J(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[39]||(e[39]=o=>t.generator.fps=o),min:"1",max:"60",step:"1"},null,512),[[ye,t.generator.fps,void 0,{number:!0}]])]),a("div",mU,[e[104]||(e[104]=a("div",{class:"framesync-subtitle"},"Total frames",-1)),J(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[40]||(e[40]=o=>t.generator.totalFrames=o),min:"24",max:"9999",step:"1"},null,512),[[ye,t.generator.totalFrames,void 0,{number:!0}]])])])]),a("div",pU,[a("button",{type:"button",class:"framesync-button framesync-button--live",disabled:t.generator.isGenerating,onClick:e[41]||(e[41]=(...o)=>t.generateStory&&t.generateStory(...o))},b(t.generator.isGenerating?"Generating…":"Generate Story"),9,gU),a("button",{type:"button",class:"framesync-button",disabled:t.generator.isGenerating,onClick:e[42]||(e[42]=(...o)=>t.generateImage&&t.generateImage(...o))},"Generate Image",8,yU)]),t.generator.status?(m(),p("div",vU,b(t.generator.status),1)):N("",!0),t.generator.result?(m(),p("div",bU,[a("div",_U,[e[105]||(e[105]=a("div",{class:"framesync-subtitle generate-story__section-title"},"Story plan",-1)),t.generator.result.source&&t.generator.result.source.model?(m(),p("span",SU,b(t.generator.result.source.model),1)):N("",!0)]),a("pre",wU,b(t.generator.result.formatted),1),a("div",MU,[a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[43]||(e[43]=(...o)=>t.approveStory&&t.approveStory(...o))},"Apply to prompts"),a("button",{type:"button",class:"framesync-button",onClick:e[44]||(e[44]=(...o)=>t.rejectStory&&t.rejectStory(...o))},"Discard")])])):N("",!0),t.generator.lastPath?(m(),p("div",PU,[a("div",xU,[e[106]||(e[106]=a("div",{class:"framesync-subtitle generate-story__section-title"},"Preview image",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[45]||(e[45]=o=>t.storyResultCollapsed=!t.storyResultCollapsed)},b(t.storyResultCollapsed?"Show":"Hide"),1)]),t.storyResultCollapsed?N("",!0):(m(),p("div",TU,[a("img",{src:t.generator.lastPath,alt:"Story preview",class:"generate-story__image"},null,8,AU)]))])):N("",!0)])])])):t.currentSubTab.PROMPTS==="LORA"?(m(),p("div",EU,[a("div",CU,[a("div",kU,[a("div",LU,[e[107]||(e[107]=a("div",{class:"framesync-title"},[ie("Active "),a("span",{class:"framesync-accent"},"LoRAs")],-1)),a("div",RU,[a("span",DU,b(t.currentLoraModelFamilyLabel),1),t.loras.source?(m(),at(l,{key:0,source:t.loras.source},null,8,["source"])):N("",!0),a("button",{class:"framesync-button",onClick:e[46]||(e[46]=(...o)=>t.refreshLoras&&t.refreshLoras(...o))},"Refresh"),a("button",{class:"framesync-button lora-picker-trigger",onClick:e[47]||(e[47]=o=>t.loraPickerOpen=!t.loraPickerOpen)},b(t.loraPickerOpen?"Close":"+"),1)])]),t.loraPickerOpen?(m(),p("div",IU,[a("div",FU,[t.currentLoraModelFamily?(m(),p("span",NU,"Select from "+b(t.currentLoraModelFamilyLabel)+"-compatible LoRAs and assign them to Common, A, or B.",1)):(m(),p("span",OU,"Select from the compatible LoRA list and assign them to Common, A, or B."))]),a("div",UU,[(m(!0),p(H,null,oe(t.compatibleLoraFamilies,o=>(m(),p("section",{key:"picker-"+o.key,class:"lora-picker-family"},[a("div",BU,b(o.label),1),a("div",VU,[(m(!0),p(H,null,oe(o.items,d=>(m(),p("div",{key:d.id,class:"lora-picker-row"},[a("div",zU,[a("div",$U,b(d.name),1),a("div",GU,b(d.path),1)]),a("div",HU,[a("button",{class:B(["framesync-button prompt-group-button prompt-group-button--common",{active:d.group==="COMMON"}]),onClick:lt(u=>t.assignLoraToGroup(d,"COMMON"),["stop"])},"Common",10,WU),a("button",{class:B(["framesync-button prompt-group-button prompt-group-button--a",{active:d.group==="A"}]),onClick:lt(u=>t.assignLoraToGroup(d,"A"),["stop"])},"A",10,qU),a("button",{class:B(["framesync-button prompt-group-button prompt-group-button--b",{active:d.group==="B"}]),onClick:lt(u=>t.assignLoraToGroup(d,"B"),["stop"])},"B",10,jU),d.group?(m(),p("button",{key:0,class:"framesync-button",onClick:lt(u=>t.unassignLora(d),["stop"])},"Remove",8,XU)):N("",!0)])]))),128))])]))),128))]),t.compatibleLoraFamilies.length?N("",!0):(m(),p("div",KU,[t.currentLoraModelFamily?(m(),p("span",YU,"No "+b(t.currentLoraModelFamilyLabel)+" LoRAs found. Refresh or check SD-Forge connection.",1)):(m(),p("span",JU,"No LoRA models found. Refresh or check SD-Forge connection."))]))])):N("",!0),a("div",ZU,[a("div",QU,[a("div",eB,"Common Group ("+b(t.loras.common.length)+")",1),a("div",tB,[(m(!0),p(H,null,oe(t.loras.common,o=>(m(),p("div",{key:o.id,class:"lora-active-group__row"},[a("div",iB,[a("span",nB,b(o.name),1),a("span",sB,b(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:d=>t.updateGroupedLoraStrength("COMMON",o,d.target.value)},null,40,rB),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:d=>t.unassignLora(o)},"Remove",8,oB)]))),128)),t.loras.common.length===0?(m(),p("div",aB," No LoRAs in Common group ")):N("",!0)])]),a("div",lB,[a("div",dB,"A Group ("+b(t.loras.groupA.length)+")",1),a("div",uB,[(m(!0),p(H,null,oe(t.loras.groupA,o=>(m(),p("div",{key:o.id,class:"lora-active-group__row"},[a("div",cB,[a("span",hB,b(o.name),1),a("span",fB,b(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:d=>t.updateGroupedLoraStrength("A",o,d.target.value)},null,40,mB),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:d=>t.unassignLora(o)},"Remove",8,pB)]))),128)),t.loras.groupA.length===0?(m(),p("div",gB," No LoRAs in A group ")):N("",!0)])]),a("div",yB,[a("div",vB,"B Group ("+b(t.loras.groupB.length)+")",1),a("div",bB,[(m(!0),p(H,null,oe(t.loras.groupB,o=>(m(),p("div",{key:o.id,class:"lora-active-group__row"},[a("div",_B,[a("span",SB,b(o.name),1),a("span",wB,b(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:d=>t.updateGroupedLoraStrength("B",o,d.target.value)},null,40,MB),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:d=>t.unassignLora(o)},"Remove",8,PB)]))),128)),t.loras.groupB.length===0?(m(),p("div",xB," No LoRAs in B group ")):N("",!0)])])]),a("div",TB,[e[108]||(e[108]=a("div",{class:"framesync-subtitle lora-crossfader-hint__copy"},[ie(" LoRA morph blend is on the "),a("strong",null,"LIVE"),ie(" stage (Morph HUD, bottom-right). Assign LoRAs to Common, A, and B below — crossfade weights are controlled from LIVE. ")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[48]||(e[48]=o=>{t.switchTab("LIVE"),t.setLiveBottomDrawerTab("CROSSFADER")})}," Open crossfader ")]),a("div",AB,[a("button",{class:"framesync-button",onClick:e[49]||(e[49]=(...o)=>t.applyLoras&&t.applyLoras(...o))},"Apply LoRAs"),a("button",{class:"framesync-button",onClick:e[50]||(e[50]=(...o)=>t.exportLoraPreset&&t.exportLoraPreset(...o))},"Export preset")])])])])):t.currentSubTab.PROMPTS==="CONTROLNET"?(m(),p("div",EB,[a("div",CB,[a("div",kB,[a("div",LB,[e[109]||(e[109]=a("div",{class:"framesync-title"},[ie("ControlNet "),a("span",{class:"framesync-accent"},"Slots")],-1)),a("div",RB,[t.cn.source?(m(),at(l,{key:0,source:t.cn.source},null,8,["source"])):N("",!0),a("button",{class:"framesync-button",onClick:e[51]||(e[51]=(...o)=>t.loadControlNetModels&&t.loadControlNetModels(...o))},"Refresh")])]),a("div",DB,[(m(!0),p(H,null,oe(t.cn.slots,o=>(m(),p("div",{key:o.id,class:"controlnet-slot-row",style:{display:"flex",gap:"6px","align-items":"center"}},[a("button",{class:B(["framesync-button",{active:t.cn.active===o.id}]),style:{flex:"1"},onClick:d=>t.cn.active=o.id},b(o.label),11,IB),a("button",{class:B(["framesync-button controlnet-slot-row__toggle",{active:o.enabled}]),onClick:d=>{o.enabled=!o.enabled,t.updateControlNet(o)}},b(o.enabled?"On":"Off"),11,FB)]))),128))])])]),a("div",NB,[a("div",OB,[a("div",UB,[a("div",BB,[a("span",VB,b(t.activeSlot.label),1),e[110]||(e[110]=ie(" Settings",-1))])]),a("div",zB,[e[111]||(e[111]=a("div",{class:"framesync-subtitle"},"Model",-1)),J(a("select",{class:"framesync-select","data-testid":"controlnet-model-select","onUpdate:modelValue":e[52]||(e[52]=o=>t.activeSlot.model=o),onChange:e[53]||(e[53]=o=>t.updateControlNet(t.activeSlot))},[(m(!0),p(H,null,oe(t.activeControlNetModelChoices,o=>(m(),p("option",{key:o.id,value:o.name},b(o.name)+b(o.current&&o.incompatible?" (current, incompatible)":o.current?" (current)":""),9,$B))),128))],544),[[Dt,t.activeSlot.model]]),a("div",GB,b(t.controlNetModelSummary),1)]),a("div",HB,[e[112]||(e[112]=a("div",{class:"framesync-subtitle"},"Image source",-1)),a("div",WB,[a("button",{type:"button",class:B(["framesync-button",{active:t.activeSlot.imageSource==="file"}]),onClick:e[54]||(e[54]=o=>t.activeSlot.imageSource="file")},"File",2),a("button",{type:"button",class:B(["framesync-button",{active:t.activeSlot.imageSource==="webcam"}]),onClick:e[55]||(e[55]=o=>t.activeSlot.imageSource="webcam")},"Webcam",2),a("button",{type:"button",class:B(["framesync-button",{active:t.activeSlot.imageSource==="screen"}]),onClick:e[56]||(e[56]=o=>t.activeSlot.imageSource="screen")},"Screen",2)]),a("input",{ref:"cnImageInput",type:"file",accept:"image/*",style:{display:"none"},onChange:e[57]||(e[57]=(...o)=>t.onControlNetFileSelected&&t.onControlNetFileSelected(...o))},null,544)]),t.activeSlot.imageSource==="webcam"?(m(),p("div",qB,[e[114]||(e[114]=a("div",{class:"framesync-subtitle"},"Webcam input",-1)),a("video",jB,null,512),a("canvas",XB,null,512),a("div",KB,[a("button",{type:"button",class:B(["framesync-button",{active:t.cn.webcamActive}]),onClick:e[58]||(e[58]=(...o)=>t.toggleWebcam&&t.toggleWebcam(...o))},b(t.cn.webcamActive?"Stop":"Start")+" Webcam",3),J(a("select",{class:"framesync-input","onUpdate:modelValue":e[59]||(e[59]=o=>t.webcamCaptureRate=o),style:{"max-width":"120px","font-size":"11px"}},[...e[113]||(e[113]=[a("option",{value:1e3},"1 fps",-1),a("option",{value:500},"2 fps",-1),a("option",{value:200},"5 fps",-1),a("option",{value:100},"10 fps",-1)])],512),[[Dt,t.webcamCaptureRate,void 0,{number:!0}]])])])):N("",!0),t.activeSlot.imageSource==="screen"?(m(),p("div",YB,[e[115]||(e[115]=a("div",{class:"framesync-subtitle"},"Screen capture",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[60]||(e[60]=(...o)=>t.startScreenCapture&&t.startScreenCapture(...o))},"Start screen capture")])):N("",!0),a("div",JB,[a("button",{type:"button",class:"framesync-button",onClick:e[61]||(e[61]=o=>t.uploadControlNetImage(t.activeSlot))},"Upload image"),a("button",{type:"button",class:B(["framesync-button",{active:t.activeSlot.enabled}]),onClick:e[62]||(e[62]=o=>{t.activeSlot.enabled=!t.activeSlot.enabled,t.updateControlNet(t.activeSlot)})},b(t.activeSlot.enabled?"Enabled":"Disabled"),3)]),a("div",ZB,[a("div",QB,[e[116]||(e[116]=a("div",{class:"framesync-subtitle"},"Weight",-1)),a("span",e8,b(t.activeSlot.weight.toFixed(2)),1)]),J(a("input",{type:"range",min:"0",max:"2",step:"0.01","onUpdate:modelValue":e[63]||(e[63]=o=>t.activeSlot.weight=o),onInput:e[64]||(e[64]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ye,t.activeSlot.weight,void 0,{number:!0}]]),a("div",t8,b(t.controlNetWeightLabel),1)]),a("div",i8,[a("div",n8,[e[117]||(e[117]=a("div",{class:"framesync-subtitle"},"Start step",-1)),a("span",s8,b(t.activeSlot.start.toFixed(2)),1)]),J(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[65]||(e[65]=o=>t.activeSlot.start=o),onInput:e[66]||(e[66]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ye,t.activeSlot.start,void 0,{number:!0}]])]),a("div",r8,[a("div",o8,[e[118]||(e[118]=a("div",{class:"framesync-subtitle"},"End step",-1)),a("span",a8,b(t.activeSlot.end.toFixed(2)),1)]),J(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[67]||(e[67]=o=>t.activeSlot.end=o),onInput:e[68]||(e[68]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ye,t.activeSlot.end,void 0,{number:!0}]])])])])])):N("",!0)])}const d8=nt(M4,[["render",l8]]),u8={name:"GenerateView",components:{UiIcon:Kt},props:{app:{type:Object,required:!0},storyOnly:{type:Boolean,default:!1}},data(){return{storyStripOpen:!1}},setup(t){return Et(t)}},c8={key:0,class:"generate-story-strip"},h8=["aria-expanded"],f8={key:0,class:"generate-story-strip__pill"},m8={key:1,class:"generate-story-strip__pill generate-story-strip__pill--dim"},p8={key:0,class:"generate-story-strip__body"},g8={key:0,class:"generate-story-strip__line"},y8={key:1,class:"generate-story-strip__text"},v8={key:1,class:"rack generate-view generate-view--dock","data-testid":"generate-view-dock"},b8={class:"framesync-panel generate-dock-panel"},_8={class:"framesync-header"},S8={class:"generate-dock-sync","data-testid":"generate-dock-sync"},w8={class:"generate-dock-sync__metric"},M8={class:"generate-dock-sync__value motion-readout"},P8={class:"generate-dock-sync__metric"},x8={class:"generate-dock-sync__value motion-readout"},T8={class:"generate-dock-sync__metric"},A8={class:"generate-dock-sync__value motion-readout"},E8={class:"generate-dock-sync__metric"},C8={class:"generate-dock-sync__value motion-readout"},k8={class:"generate-dock-actions"};function L8(t,e,i,n,s,r){const l=Ne("UiIcon");return i.storyOnly?(m(),p("div",c8,[a("button",{type:"button",class:"generate-story-strip__toggle","aria-expanded":s.storyStripOpen?"true":"false",onClick:e[0]||(e[0]=o=>s.storyStripOpen=!s.storyStripOpen)},[e[4]||(e[4]=a("span",null,"Story",-1)),t.generator.result&&t.generator.result.source&&t.generator.result.source.model?(m(),p("span",f8,b(t.generator.result.source.model),1)):t.generator.status?(m(),p("span",m8,b(t.generator.status),1)):N("",!0),ve(l,{class:"generate-story-strip__chevron",name:s.storyStripOpen?"chevron-up":"chevron-down"},null,8,["name"])],8,h8),s.storyStripOpen?(m(),p("div",p8,[t.generator.status?(m(),p("div",g8,b(t.generator.status),1)):N("",!0),t.generator.result&&t.generator.result.formatted?(m(),p("pre",y8,b(t.generator.result.formatted),1)):N("",!0),t.generator.result?N("",!0):(m(),p("button",{key:2,type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=o=>{t.switchTab("PROMPTS"),t.switchSubTab("PROMPTS","STORY")})}," Open Story Generator "))])):N("",!0)])):(m(),p("div",v8,[a("div",b8,[a("div",_8,[e[5]||(e[5]=a("div",{class:"framesync-title"},[ie("Animation "),a("span",{class:"framesync-accent"},"Sequencer")],-1)),a("span",{class:B(["generate-sequencer__status",{"generate-sequencer__status--live":t.sequencerPlaying}])},b(t.sequencerPlaying?"Playing":"Stopped"),3)]),a("div",S8,[a("div",w8,[e[6]||(e[6]=a("span",{class:"generate-dock-sync__label"},"Playhead",-1)),a("code",M8,b(t.sequencerPlayhead.toFixed(2))+"s",1)]),a("div",P8,[e[7]||(e[7]=a("span",{class:"generate-dock-sync__label"},"Duration",-1)),a("code",x8,b(Number(t.sequencer.durationSec||0).toFixed(2))+"s",1)]),a("div",T8,[e[8]||(e[8]=a("span",{class:"generate-dock-sync__label"},"Frame",-1)),a("code",A8,b(t.sequencerJobFrameNumber)+"/"+b(t.sequencerJobTotalFrames),1)]),a("div",E8,[e[9]||(e[9]=a("span",{class:"generate-dock-sync__label"},"FPS",-1)),a("code",C8,b(t.masterFps),1)])]),e[10]||(e[10]=a("p",{class:"generate-sequencer__live-hint"},[ie(" Preview stays above the timeline dock. Transport, scrubber, and tracks share one playhead — open "),a("strong",null,"Edit"),ie(" on the dock for clip details. ")],-1)),a("div",k8,[a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{active:t.motionSequencerSideOpen}]),"data-testid":"generate-open-sequencer-editor",onClick:e[2]||(e[2]=o=>{t.motionSequencerSideOpen=!t.motionSequencerSideOpen,t.saveSessionState()})},b(t.motionSequencerSideOpen?"Hide editor":"Open editor"),3),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[3]||(e[3]=o=>t.switchTab("MOTION"))}," Motion controls ")])])]))}const dy=nt(u8,[["render",L8]]),R8={name:"MotionView",components:{UiIcon:Kt,MotionPathPreview:ny,DeforumControlPanel:sy,DeforumMotionPads:ty,GenerateView:dy},props:{app:{type:Object,required:!0}},setup(t){return Et(t)},computed:{motionQuickPresets(){return["Static","Orbit","Tunnel","Handheld","Chaos"]},motionPathLiveValues(){var t,e,i;return{translation_x:Number((t=this.motionPadValues)==null?void 0:t.translation_x)||0,translation_y:Number((e=this.motionPadValues)==null?void 0:e.translation_y)||0,translation_z:Number((i=this.motionPadValues)==null?void 0:i.translation_z)||0}}}},D8={class:"rack motion-view motion-view--hero","data-testid":"motion-controls-panel"},I8={class:"framesync-panel motion-panel"},F8={class:"framesync-header"},N8={class:"motion-panel__header-actions"},O8={class:"motion-preset-row motion-preset-row--hero"},U8=["onClick"],B8={class:"motion-preset-toolbar motion-preset-toolbar--compact"},V8={label:"Built-in"},z8=["value"],$8={key:0,label:"Saved"},G8=["value"],H8={class:"motion-hero-stage","data-testid":"motion-hero-stage"},W8=["open"],q8={class:"motion-smoothness","data-testid":"motion-smoothness"},j8={class:"motion-smoothness__toggle"},X8={key:0,class:"motion-smoothness__frames"},K8=["value"],Y8={key:1,class:"motion-smoothness__hint"};function J8(t,e,i,n,s,r){const l=Ne("UiIcon"),o=Ne("DeforumMotionPads"),d=Ne("DeforumControlPanel"),u=Ne("MotionPathPreview"),h=Ne("GenerateView");return m(),p("div",D8,[a("div",I8,[a("div",F8,[e[8]||(e[8]=a("div",{class:"framesync-title"},[ie("Motion "),a("span",{class:"framesync-accent"},"Performance")],-1)),a("div",N8,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"reset-motion-default",title:"Reset all motion axes to zero",onClick:e[0]||(e[0]=(...c)=>t.resetMotionToDefault&&t.resetMotionToDefault(...c))}," ↺ Reset to default ")])]),a("div",O8,[(m(!0),p(H,null,oe(r.motionQuickPresets,c=>(m(),p("button",{key:c,type:"button",class:B(["chip",{active:t.motionSelectedPreset===c}]),onClick:f=>t.applyMotionPresetAndSelect(c)},b(c),11,U8))),128))]),a("div",B8,[J(a("select",{class:"framesync-select motion-preset-select","onUpdate:modelValue":e[1]||(e[1]=c=>t.motionSelectedPreset=c)},[a("optgroup",V8,[(m(!0),p(H,null,oe(Object.keys(t.motionPresets),c=>(m(),p("option",{key:c,value:c},b(c),9,z8))),128))]),t.savedMotionPresetNames.length?(m(),p("optgroup",$8,[(m(!0),p(H,null,oe(t.savedMotionPresetNames,c=>(m(),p("option",{key:`saved-${c}`,value:c},b(c),9,G8))),128))])):N("",!0)],512),[[Dt,t.motionSelectedPreset]]),a("button",{type:"button",class:"framesync-button motion-preset-icon-btn",title:"Load preset","aria-label":"Load preset",onClick:e[2]||(e[2]=(...c)=>t.loadSelectedMotionPreset&&t.loadSelectedMotionPreset(...c))},[ve(l,{name:"load"})]),a("button",{type:"button",class:"framesync-button motion-preset-icon-btn",title:"Save current motion","aria-label":"Save current motion",onClick:e[3]||(e[3]=(...c)=>t.saveCurrentMotionStyle&&t.saveCurrentMotionStyle(...c))},[ve(l,{name:"save"})])]),a("div",H8,[ve(o,{app:i.app,hero:"","show-readout":"","show-axis-sliders":t.motionFineTuneOpen},null,8,["app","show-axis-sliders"])]),a("button",{type:"button",class:B(["framesync-button framesync-button--compact motion-fine-tune-toggle",{active:t.motionFineTuneOpen}]),"data-testid":"motion-fine-tune-toggle",onClick:e[4]||(e[4]=c=>{t.motionFineTuneOpen=!t.motionFineTuneOpen,t.saveSessionState()})},b(t.motionFineTuneOpen?"Hide axis sliders":"Fine-tune axes"),3),ve(d,{app:i.app,"show-settings":!1,"show-motion-pads":!1,"motion-pads-show-readout":""},null,8,["app"]),a("details",{class:"motion-advanced-panel",open:!t.isDeforumMotion2d},[e[11]||(e[11]=a("summary",{class:"motion-advanced-panel__summary"},"Smoothness & path preview",-1)),a("div",q8,[a("label",j8,[J(a("input",{type:"checkbox","data-testid":"motion-smoothness-enabled","onUpdate:modelValue":e[5]||(e[5]=c=>t.motionSmoothness.enabled=c),onChange:e[6]||(e[6]=(...c)=>t.saveSessionState&&t.saveSessionState(...c))},null,544),[[xi,t.motionSmoothness.enabled]]),e[9]||(e[9]=a("span",null,"Smoothness",-1))]),t.motionSmoothness.enabled?(m(),p("label",X8,[e[10]||(e[10]=a("span",null,"Frames",-1)),a("input",{class:"framesync-input motion-smoothness__frames-input",type:"number",min:"1",max:"999",step:"1","data-testid":"motion-smoothness-frames",value:t.motionSmoothness.frames,onChange:e[7]||(e[7]=c=>t.onMotionSmoothnessFramesChange(c.target.value))},null,40,K8)])):N("",!0),t.motionSmoothness.enabled?(m(),p("span",Y8," Ramp schedule changes over the frame count from the current playhead or selected frame. ")):N("",!0)]),t.isDeforumMotion2d?N("",!0):(m(),at(u,{key:0,"deforum-settings":t.deforumSettings,"motion-values":r.motionPathLiveValues,"prefer-live-values":!0},null,8,["deforum-settings","motion-values"]))],8,W8)]),ve(h,{app:i.app},null,8,["app"])])}const Z8=nt(R8,[["render",J8]]),Um={sine:t=>Math.sin(t),triangle:t=>{const e=(t/(Math.PI*2)%1+1)%1;return e<.5?4*e-1:3-4*e},saw:t=>2*((t/(Math.PI*2)%1+1)%1)-1,square:t=>Math.sin(t)>=0?1:-1},Q8={name:"Waveform",props:{shape:{type:String,default:"Sine"},phase:{type:Number,default:0},depth:{type:Number,default:.8},active:{type:Boolean,default:!1},width:{type:Number,default:80},height:{type:Number,default:30},cycles:{type:Number,default:2}},computed:{strokeColor(){return this.active?"var(--live)":"var(--text-dim)"},points(){const{width:t,height:e,shape:i,phase:n,depth:s,cycles:r}=this,l=e/2,o=(e/2-2)*Math.min(1,Math.max(0,s)),d=(i||"sine").toLowerCase(),u=Um[d]||Um.sine,h=[],c=t;if(d==="noise")for(let f=0;f<=c;f++){const g=l+Math.sin(f*.8+n)*Math.cos(f*1.3+n*.7)*o;h.push(`${f},${g.toFixed(1)}`)}else for(let f=0;f<=c;f++){const g=f/c*Math.PI*2*r+(n||0),y=l-u(g)*o;h.push(`${f},${y.toFixed(1)}`)}return h.join(" ")}}},eV=["width","height","viewBox"],tV=["points","stroke"];function iV(t,e,i,n,s,r){return m(),p("svg",{width:i.width,height:i.height,viewBox:`0 0 ${i.width} ${i.height}`,class:B(["waveform",{"waveform--active":i.active}]),"aria-hidden":"true"},[a("polyline",{points:r.points,fill:"none",stroke:r.strokeColor,"stroke-width":"1.5","stroke-linejoin":"round","stroke-linecap":"round"},null,8,tV)],10,eV)}const nV=nt(Q8,[["render",iV],["__scopeId","data-v-fb4eb07f"]]),sV={name:"TargetCell",emits:["toggle"],props:{label:{type:String,required:!0},paramKey:{type:String,required:!0},owners:{type:Array,default:()=>[]},selected:{type:Boolean,default:!1},focused:{type:Boolean,default:!1}},computed:{tooltip(){return this.owners.length?`${this.label} ← ${this.owners.join(", ")}`:this.label}}},rV=["title"],oV={class:"target-cell-label"},aV={key:0,class:"target-cell-owners"},lV={key:0,class:"target-cell-extra"};function dV(t,e,i,n,s,r){return m(),p("button",{class:B(["target-cell",{"target-cell--routed":i.owners.length>0,"target-cell--selected":i.selected,"target-cell--focused":i.focused}]),title:r.tooltip,onClick:e[0]||(e[0]=l=>t.$emit("toggle",i.paramKey)),type:"button"},[a("span",oV,b(i.label),1),i.owners.length?(m(),p("div",aV,[(m(!0),p(H,null,oe(i.owners.slice(0,3),l=>(m(),p("span",{key:l,class:"target-cell-owner"},b(l),1))),128)),i.owners.length>3?(m(),p("span",lV,"+"+b(i.owners.length-3),1)):N("",!0)])):N("",!0)],10,rV)}const uV=nt(sV,[["render",dV],["__scopeId","data-v-6d546a48"]]),Go=20,zs=16e3;function ls(t,e=Go,i=zs){const n=Number(t);return Number.isFinite(n)?Math.min(i,Math.max(e,n)):e}function co(t,e=Go,i=zs){const n=ls(t,e,i);return(Math.log(n)-Math.log(e))/(Math.log(i)-Math.log(e))}function Bm(t,e=Go,i=zs){const n=Math.max(0,Math.min(1,Number(t)||0));return Math.exp(Math.log(e)+n*(Math.log(i)-Math.log(e)))}function uy(t,e,i,n,{barColor:s,bgColor:r}={}){const l=Math.max(1,Math.floor(i)),o=Math.max(1,Math.floor(n));if(t.fillStyle=r||"rgb(8, 9, 13)",t.fillRect(0,0,l,o),!e||!e.length)return;const d=Math.min(96,Math.max(32,Math.floor(l/4))),u=Math.max(1,Math.floor(e.length/d)),h=1,c=Math.max(2,(l-h*(d-1))/d);for(let f=0;f[]},levels:{type:Array,default:()=>[]},activeIndex:{type:Number,default:0},previewIndex:{type:Number,default:-1},spectrumBins:{type:Array,default:()=>[]},live:{type:Boolean,default:!1},bandLabels:{type:Array,default:()=>["Low","Mid","High"]},bandColors:{type:Array,default:()=>[]},canvasWidth:{type:Number,default:640},canvasHeight:{type:Number,default:120}},emits:["select-band","update-band"],data(){return{dragState:null}},watch:{spectrumBins:{handler(){this.paint()},deep:!0},levels:{handler(){this.paint()},deep:!0},mappings:{handler(){this.paint()},deep:!0},live(){this.paint()}},mounted(){this.paint()},methods:{cssVar(t,e=""){try{return getComputedStyle(document.documentElement).getPropertyValue(t).trim()||e}catch{return e}},toRgba(t,e){const i=Number(e);if(!Number.isFinite(i))return String(t||"");const n=String(t||"").trim();if(n.startsWith("#")&&(n.length===7||n.length===4)){const s=n.length===4?`#${n[1]}${n[1]}${n[2]}${n[2]}${n[3]}${n[3]}`:n,r=parseInt(s.slice(1,3),16),l=parseInt(s.slice(3,5),16),o=parseInt(s.slice(5,7),16);if([r,l,o].every(d=>Number.isFinite(d)))return`rgba(${r}, ${l}, ${o}, ${i})`}return n},bandLabel(t){return this.bandLabels[t]||`Band ${t+1}`},bandLevel(t){return Math.max(0,Math.min(1,Number(this.levels[t])||0))},bandLevelPct(t){return Math.round(this.bandLevel(t)*100)},bandMeterPct(t){return Math.max(4,this.bandLevel(t)*100)},bandStyle(t,e){const i=Go,n=zs,s=co(t&&t.freq_min,i,n)*100,r=co(t&&t.freq_max,i,n)*100,l=e??this.mappings.indexOf(t),o=[this.cssVar("--band-low"),this.cssVar("--band-mid"),this.cssVar("--band-high")],d=this.bandColors[l]||o[l]||this.cssVar("--live")||"var(--live)",u=this.bandLevel(l);return{left:`${Math.min(s,r)}%`,width:`${Math.max(2,Math.abs(r-s))}%`,"--band-color":d,"--band-level":String(u)}},paint(){const t=this.$refs.canvasEl;if(!t||!t.getContext)return;const e=t.getContext("2d"),i=this.live&&this.spectrumBins.length?this.spectrumBins:null;uy(e,i,t.width,t.height,{bgColor:this.cssVar("--bg-0")||"rgb(8, 9, 13)",barColor:this.toRgba(this.cssVar("--band-high")||this.cssVar("--success"),.9)})},canvasRect(){const t=this.$refs.canvasEl;return t?t.getBoundingClientRect():{width:1,left:0}},xToHz(t){const e=this.canvasRect(),n=(t-e.left)/Math.max(1,e.width);return Bm(n)},hitTest(t,e){const i=this.canvasRect(),n=(t-i.left)/Math.max(1,i.width)*100,r=10/Math.max(1,i.width)*100;for(let l=this.mappings.length-1;l>=0;l-=1){const o=this.mappings[l];if(!o)continue;const d=co(o.freq_min)*100,u=co(o.freq_max)*100,h=Math.min(d,u),c=Math.max(d,u);if(!(nc+1))return Math.abs(n-h)<=r?{index:l,mode:"left"}:Math.abs(n-c)<=r?{index:l,mode:"right"}:{index:l,mode:"move"}}return null},onPointerDown(t){const e=this.hitTest(t.clientX,t.clientY);if(!e)return;const i=this.mappings[e.index];if(!i)return;this.$emit("select-band",e.index);const n=this.canvasRect();this.dragState={index:e.index,mode:e.mode,startX:t.clientX,startRatio:(t.clientX-n.left)/Math.max(1,n.width),startMin:Number(i.freq_min)||Go,startMax:Number(i.freq_max)||zs,pointerId:t.pointerId},t.currentTarget.setPointerCapture(t.pointerId),t.preventDefault()},onPointerMove(t){if(!this.dragState||this.dragState.pointerId!==t.pointerId||!this.mappings[this.dragState.index])return;const i=this.canvasRect(),s=(t.clientX-i.left)/Math.max(1,i.width)-this.dragState.startRatio;let r=this.dragState.startMin,l=this.dragState.startMax;const o=20;if(this.dragState.mode==="left")r=ls(this.xToHz(t.clientX)),l=ls(Math.max(r+o,this.dragState.startMax));else if(this.dragState.mode==="right")l=ls(this.xToHz(t.clientX)),r=ls(Math.min(l-o,this.dragState.startMin));else{const d=this.dragState.startMax-this.dragState.startMin;r=ls(Bm(co(this.dragState.startMin)+s)),l=ls(r+d),l>=zs&&(l=zs,r=ls(l-d))}this.$emit("update-band",{index:this.dragState.index,freq_min:Math.round(r),freq_max:Math.round(l)}),t.preventDefault()},onPointerUp(t){if(!(!this.dragState||t.pointerId!=null&&this.dragState.pointerId!==t.pointerId)){try{t.currentTarget.releasePointerCapture(this.dragState.pointerId)}catch{}this.dragState=null}}}},hV=["width","height"],fV={class:"audio-spectrum-editor__bands","aria-hidden":"true"},mV={class:"audio-spectrum-editor__band-label"},pV={key:0,class:"audio-spectrum-editor__band-level"},gV={key:0,class:"audio-spectrum-editor__hint"};function yV(t,e,i,n,s,r){return m(),p("div",{class:B(["audio-spectrum-editor",{"audio-spectrum-editor--live":i.live,"audio-spectrum-editor--dragging":s.dragState}])},[a("canvas",{ref:"canvasEl",class:"audio-spectrum-editor__canvas",width:i.canvasWidth,height:i.canvasHeight,onPointerdown:e[0]||(e[0]=(...l)=>r.onPointerDown&&r.onPointerDown(...l)),onPointermove:e[1]||(e[1]=(...l)=>r.onPointerMove&&r.onPointerMove(...l)),onPointerup:e[2]||(e[2]=(...l)=>r.onPointerUp&&r.onPointerUp(...l)),onPointercancel:e[3]||(e[3]=(...l)=>r.onPointerUp&&r.onPointerUp(...l)),onPointerleave:e[4]||(e[4]=(...l)=>r.onPointerUp&&r.onPointerUp(...l))},null,40,hV),a("div",fV,[(m(!0),p(H,null,oe(i.mappings,(l,o)=>(m(),p("div",{key:"audio-band-"+o,class:B(["audio-spectrum-editor__band",{"audio-spectrum-editor__band--active":o===i.activeIndex,"audio-spectrum-editor__band--dragging":s.dragState&&s.dragState.index===o,"audio-spectrum-editor__band--preview":o===i.previewIndex,"audio-spectrum-editor__band--reactive":i.live&&(i.levels[o]||0)>.04}]),style:Mt(r.bandStyle(l,o))},[a("div",{class:"audio-spectrum-editor__band-meter",style:Mt({height:r.bandMeterPct(o)+"%"})},null,4),a("span",mV,b(r.bandLabel(o)),1),i.live?(m(),p("span",pV,b(r.bandLevelPct(o))+"%",1)):N("",!0)],6))),128))]),i.live?N("",!0):(m(),p("div",gV,"Upload and play audio to see the live spectrum."))],2)}const vV=nt(cV,[["render",yV]]),bV={name:"ModulationMappingsPanel",props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},_V={class:"modulation-mappings"},SV={class:"modulation-mappings__toolbar"},wV={class:"framesync-checkbox modulation-mappings__filter"},MV={key:0,class:"live-hud-empty"},PV={key:0,class:"sub-pills modulation-mappings__group-tabs"},xV=["onClick"],TV={key:1,class:"modulation-mappings__rows"},AV={class:"modulation-mapping-row__head"},EV={class:"modulation-mapping-row__label"},CV={key:0,class:"modulation-mapping-row__badges"},kV={class:"modulation-mapping-row__control"},LV=["min","max","step","value","onInput"],RV={class:"modulation-mapping-row__value"},DV={class:"modulation-mapping-row__actions"},IV=["onClick"],FV=["onClick"],NV={class:"modulation-map-picker__dialog framesync-panel"},OV={class:"framesync-header"},UV={class:"framesync-title"},BV={class:"framesync-accent"},VV={class:"modulation-map-picker__lfo-list"},zV=["onClick"],$V={class:"modulation-map-picker__lfo-title"},GV={class:"modulation-map-picker__lfo-meta"},HV={key:0,class:"modulation-route-pill"},WV={class:"modulation-map-picker__slots"},qV=["onClick"];function jV(t,e,i,n,s,r){return m(),p("div",_V,[a("div",SV,[a("label",wV,[J(a("input",{type:"checkbox","data-testid":"mappings-active-only","onUpdate:modelValue":e[0]||(e[0]=l=>t.mappingsActiveOnly=l)},null,512),[[xi,t.mappingsActiveOnly]]),e[5]||(e[5]=ie(" Active only ",-1))])]),(t.modulationMappingsVisibleGroups||[]).length?(m(),p(H,{key:1},[(t.modulationMappingsVisibleGroups||[]).length>1?(m(),p("div",PV,[(m(!0),p(H,null,oe(t.modulationMappingsVisibleGroups||[],l=>(m(),p("button",{key:"map-grp-"+l.label,type:"button",class:B(["sub-pill",{active:t.mappingsActiveGroupLabel===l.label}]),onClick:o=>t.mappingsGroupTab=l.label},b(l.shortLabel||l.label),11,xV))),128))])):N("",!0),t.mappingsActiveGroup?(m(),p("div",TV,[(m(!0),p(H,null,oe(t.mappingsActiveGroup.items,l=>(m(),p("div",{key:"map-row-"+l.key,class:B(["modulation-mapping-row",{"modulation-mapping-row--mapped":t.paramHasActiveMapping(l.key)}])},[a("div",AV,[a("span",EV,b(l.label),1),t.paramMappingLabels(l.key).length?(m(),p("div",CV,[(m(!0),p(H,null,oe(t.paramMappingLabels(l.key),(o,d)=>(m(),p("span",{key:"map-badge-"+l.key+"-"+d,class:"modulation-route-pill"},b(o),1))),128))])):N("",!0)]),a("div",kV,[a("input",{type:"range",class:"framesync-input modulation-mapping-row__slider",min:t.paramControlMeta(l.key).min,max:t.paramControlMeta(l.key).max,step:t.paramControlMeta(l.key).step,value:t.paramControlMeta(l.key).value,onInput:o=>t.setLiveModValue(l.key,o.target.value)},null,40,LV),a("code",RV,b(t.formatMappingParamValue(l.key)),1)]),a("div",DV,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"modulation-map-btn",onClick:o=>t.openModulationMapPicker(l.key)}," Map ",8,IV),t.paramHasActiveMapping(l.key)?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",title:"Clear mappings",onClick:o=>t.clearParamMapping(l.key)}," Clear ",8,FV)):N("",!0)])],2))),128))])):N("",!0)],64)):(m(),p("div",MV,b(t.mappingsActiveOnly?"No active mappings in this view":"No parameters"),1)),t.modulationMapPicker&&t.modulationMapPicker.paramKey?(m(),p("div",{key:2,class:"modulation-map-picker","data-testid":"modulation-map-picker",onClick:e[4]||(e[4]=(...l)=>t.onModulationMapPickerBackdropClick&&t.onModulationMapPickerBackdropClick(...l))},[a("div",NV,[a("div",OV,[a("div",UV,[e[6]||(e[6]=ie(" Map ",-1)),a("span",BV,b(t.modulationMapPickerParamLabel),1)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=(...l)=>t.closeModulationMapPicker&&t.closeModulationMapPicker(...l))}," Close ")]),t.modulationMapPicker.step==="lfo"?(m(),p(H,{key:0},[e[7]||(e[7]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}},"Choose an LFO to route this parameter.",-1)),a("div",VV,[(m(!0),p(H,null,oe(t.lfos,l=>(m(),p("button",{key:"map-lfo-"+l.id,type:"button",class:B(["modulation-map-picker__lfo",{"modulation-map-picker__lfo--on":l.on}]),onClick:o=>t.mapModulationParamToLfo(l.id)},[a("span",$V,"LFO "+b(l.id),1),a("span",GV,b(l.on?"On":"Off")+" · "+b(l.shape)+" · "+b(l.bpm)+" BPM · ×"+b(l.speed),1),(l.targets||[]).includes(t.modulationMapPicker.paramKey)?(m(),p("span",HV,"routed")):N("",!0)],10,zV))),128))]),a("button",{type:"button",class:"framesync-button",style:{"margin-top":"10px"},onClick:e[2]||(e[2]=l=>t.modulationMapPicker.step="choose")}," Back ")],64)):(m(),p(H,{key:1},[e[8]||(e[8]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}},"Assign to a live control in the bottom modulation drawer.",-1)),a("div",WV,[(m(!0),p(H,null,oe(t.liveModSlotPickerOptions,l=>(m(),p("button",{key:"map-slot-"+l.index,type:"button",class:B(["framesync-button modulation-map-picker__slot",{active:t.paramLiveModSlotIndex(t.modulationMapPicker.paramKey)===l.index}]),onClick:o=>t.assignModulationMapToSlot(l.index)},b(l.label),11,qV))),128))]),a("button",{type:"button",class:"framesync-button",style:{"margin-top":"12px"},onClick:e[3]||(e[3]=l=>t.modulationMapPicker.step="lfo")}," Map to LFO… ")],64))])])):N("",!0)])}const XV=nt(bV,[["render",jV]]),KV={name:"ModulationView",components:{Waveform:nV,TargetCell:uV,AudioSpectrumEditor:vV,ModulationMappingsPanel:XV,GlassPanel:Cc},props:{app:{type:Object,required:!0}},setup(t){return Et(t)},computed:{isAudioTab(){return this.currentTab==="AUDIO"},modulationPane(){return this.isAudioTab?"AUDIO_REACTIVE":this.currentSubTab&&this.currentSubTab.MODULATION||"LFO"},modulationMappingMiniBars(){const t=this.audioSpectrumBins,e=8,i=22050;return(this.audioMappings||[]).map(n=>{if(!t||!t.length)return Array(e).fill(0);const s=t.length,r=Math.max(0,Math.floor(n.freq_min/i*s)),l=Math.min(s-1,Math.ceil(n.freq_max/i*s)),d=Math.max(1,l-r+1)/e,u=[];for(let h=0;hi.key===t.param))==null?void 0:e.label)||t.param:"Unmapped"},activeBandOutputPreview(){const t=this.activeAudioMapping;if(!t)return"—";const e=Math.max(0,Math.min(1,Number(this.audioMappingLevels[this.activeAudioMappingIndex])||0)),i=Number(t.out_min)||0,n=Number(t.out_max)||1,s=i+(n-i)*e,r=Math.abs(n-i)>10?1:.01;return Number.isFinite(s)?s.toFixed(r>=1?0:2):"—"}},methods:{openAudioTab(){typeof this.switchTab=="function"?this.switchTab("AUDIO"):this.switchSubTab("MODULATION","AUDIO_REACTIVE")}}},YV={class:"rack modulation-view"},JV={class:"framesync-panel modulation-panel"},ZV={key:0,class:"framesync-header"},QV={class:"modulation-summary"},e6={key:1,class:"sub-pills modulation-subtabs"},t6={class:"modulation-panel__actions modulation-panel__actions--section"},i6={class:"modulation-lfo-grid"},n6=["onClick"],s6={class:"modulation-lfo-card__header"},r6={class:"switch modulation-lfo-card__switch"},o6=["onUpdate:modelValue"],a6={class:"modulation-lfo-card__title"},l6={class:"modulation-lfo-card__meta"},d6={key:0,class:"modulation-lfo-card__compact"},u6={class:"modulation-lfo-card__controls"},c6={class:"modulation-lfo-card__control"},h6=["onUpdate:modelValue"],f6=["value"],m6={class:"modulation-lfo-card__control"},p6=["onUpdate:modelValue"],g6={class:"modulation-lfo-card__control"},y6=["onUpdate:modelValue"],v6={class:"modulation-lfo-card__control"},b6=["onUpdate:modelValue"],_6={class:"modulation-lfo-card__footer"},S6={key:1,class:"modulation-route-pill modulation-route-pill--idle"},w6=["onClick"],M6={class:"modulation-target-board"},P6={class:"modulation-target-board__header"},x6={key:0,class:"modulation-target-board__hint"},T6={class:"modulation-target-board__grid"},A6={key:4,class:"framesync-panel modulation-audio-panel"},E6={class:"modulation-audio-dropzone__title"},C6={class:"modulation-audio-dropzone__hint"},k6={class:"framesync-checkbox",style:{"margin-top":"14px"}},L6=["disabled"],R6={key:0,class:"modulation-audio-sync-settings"},D6={class:"modulation-audio-sync-settings__lead"},I6={key:0,class:"framesync-panel modulation-audio-panel modulation-audio-panel--audio-tab","data-testid":"audio-tab-reference-upload"},F6={class:"modulation-audio-dropzone__title"},N6={class:"modulation-audio-dropzone__hint"},O6={class:"framesync-checkbox modulation-audio-panel__sync-toggle"},U6=["disabled"],B6={class:"framesync-panel audio-reactive-panel"},V6={key:0,class:"framesync-title"},z6={class:"framesync-subtitle audio-reactive-panel__intro"},$6={key:0},G6={key:0,class:"audio-band-presets audio-band-presets--hero"},H6=["onClick"],W6={class:"audio-reactive-mappings"},q6=["onClick"],j6={class:"audio-reactive-mapping-card__head"},X6={class:"audio-map-card__target-name"},K6={class:"modulation-lfo-card__meta"},Y6=["x","y","height"],J6={class:"audio-reactive-mapping-card__level"},Z6={key:1,class:"audio-reactive-detail"},Q6={class:"audio-band-presets audio-band-presets--detail"},ez=["onClick"],tz={class:"audio-band-reactivity__head"},iz=["disabled"],nz={class:"audio-band-reactivity__viz"},sz=["x","y","height"],rz={class:"audio-band-reactivity__meter-wrap"},oz={class:"audio-band-reactivity__meter"},az={class:"audio-band-reactivity__meter-value"},lz={key:0,class:"audio-band-reactivity__output"},dz={class:"audio-band-reactivity__output-label"},uz={class:"audio-band-reactivity__output-value"},cz={class:"modulation-lfo-card__controls modulation-audio-band-card__controls modulation-audio-band-card__controls--compact"},hz={class:"modulation-lfo-card__control modulation-audio-band-card__control--wide"},fz=["value"],mz={class:"modulation-lfo-card__control"},pz={class:"audio-reactive-hz-pair"},gz={class:"modulation-lfo-card__control"},yz={class:"audio-reactive-hz-pair"},vz={key:2,class:"audio-reactive-panel__status"},bz={class:"framesync-header modulation-macros__header"},_z={class:"modulation-panel__actions"},Sz=["disabled"],wz=["disabled"],Mz={key:0,class:"framesync-subtitle modulation-macros__hint"},Pz={key:1,class:"modulation-macro-strip"},xz={class:"switch modulation-macro-pill__switch"},Tz=["onUpdate:modelValue"],Az=["onUpdate:modelValue"],Ez=["value"],Cz=["onUpdate:modelValue"],kz=["value"],Lz=["onUpdate:modelValue"],Rz=["onUpdate:modelValue"];function Dz(t,e,i,n,s,r){const l=Ne("Waveform"),o=Ne("TargetCell"),d=Ne("ModulationMappingsPanel"),u=Ne("AudioSpectrumEditor"),h=Ne("GlassPanel");return m(),p("div",YV,[ve(h,{size:"lg",class:"modulation-panel-glass"},{default:Ni(()=>[a("div",JV,[r.isAudioTab?N("",!0):(m(),p("div",ZV,[e[30]||(e[30]=a("div",{class:"framesync-title"},[ie(" Modulation "),a("span",{class:"framesync-accent"},"Patch Bay")],-1)),a("span",QV,b(t.modulationSubtabSummary),1)])),r.isAudioTab?N("",!0):(m(),p("div",e6,[a("button",{class:B(["sub-pill",{active:r.modulationPane==="LFO"}]),onClick:e[0]||(e[0]=c=>t.switchSubTab("MODULATION","LFO"))},"LFO",2),a("button",{class:B(["sub-pill",{active:r.modulationPane==="AV_SYNC"}]),onClick:e[1]||(e[1]=c=>t.switchSubTab("MODULATION","AV_SYNC"))},"Audio",2),a("button",{class:B(["sub-pill",{active:r.modulationPane==="AUDIO_REACTIVE"}]),onClick:e[2]||(e[2]=c=>r.openAudioTab())},"Reactive",2),a("button",{class:B(["sub-pill",{active:r.modulationPane==="BEAT_MACROS"}]),onClick:e[3]||(e[3]=c=>t.switchSubTab("MODULATION","BEAT_MACROS"))},"Beat",2),a("button",{class:B(["sub-pill",{active:r.modulationPane==="MAPPINGS"}]),onClick:e[4]||(e[4]=c=>t.switchSubTab("MODULATION","MAPPINGS"))},"Mappings",2)])),r.modulationPane==="LFO"?(m(),p(H,{key:2},[a("div",t6,[a("button",{class:B(["framesync-button",{active:t.lfoOn}]),onClick:e[5]||(e[5]=c=>t.lfoOn=!t.lfoOn)},b(t.lfoOn?"On":"Off"),3),a("button",{class:"framesync-button",onClick:e[6]||(e[6]=(...c)=>t.resetLfos&&t.resetLfos(...c))},"Reset")]),a("div",i6,[(m(!0),p(H,null,oe(t.lfos,c=>(m(),p("div",{key:"lfo-"+c.id,class:B(["modulation-lfo-card",{"modulation-lfo-card--active":c.on,"modulation-lfo-card--selected":t.selectedModulationLfo&&t.selectedModulationLfo.id===c.id}]),onClick:f=>t.modulationSelectedLfoId=c.id},[a("div",s6,[a("label",r6,[J(a("input",{type:"checkbox","onUpdate:modelValue":f=>c.on=f},null,8,o6),[[xi,c.on]]),a("span",a6,[e[31]||(e[31]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,"LFO "+b(c.id),1)])]),a("code",l6,b(c.shape)+" · "+b(c.bpm),1)]),ve(l,{shape:c.shape,phase:c.renderPhase!=null?c.renderPhase:c.phase,depth:c.depth,active:c.on,width:240,height:t.selectedModulationLfo&&t.selectedModulationLfo.id===c.id?88:64,class:"modulation-lfo-card__waveform"},null,8,["shape","phase","depth","active","height"]),t.selectedModulationLfo&&t.selectedModulationLfo.id===c.id?N("",!0):(m(),p("div",d6,b(c.bpm)+" BPM · depth "+b(Number(c.depth).toFixed(2))+" · "+b((c.targets||[]).length?(c.targets||[]).length+" route"+((c.targets||[]).length===1?"":"s"):"no routes"),1)),J(a("div",u6,[a("label",c6,[e[32]||(e[32]=a("span",{class:"framesync-subtitle"},"Shape",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":f=>c.shape=f},[(m(!0),p(H,null,oe(t.lfoShapes,f=>(m(),p("option",{key:f,value:f},b(f),9,f6))),128))],8,h6),[[Dt,c.shape]])]),a("label",m6,[e[33]||(e[33]=a("span",{class:"framesync-subtitle"},"BPM",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":f=>c.bpm=f,min:"20",max:"300"},null,8,p6),[[ye,c.bpm,void 0,{number:!0}]])]),a("label",g6,[e[34]||(e[34]=a("span",{class:"framesync-subtitle"},"Speed",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":f=>c.speed=f,min:"0.1",max:"10",step:"0.1"},null,8,y6),[[ye,c.speed,void 0,{number:!0}]])]),a("label",v6,[e[35]||(e[35]=a("span",{class:"framesync-subtitle"},"Depth",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":f=>c.depth=f,min:"0",max:"1",step:"0.01"},null,8,b6),[[ye,c.depth,void 0,{number:!0}]])])],512),[[Wi,t.selectedModulationLfo&&t.selectedModulationLfo.id===c.id]]),a("div",_6,[(c.targets||[]).length?(m(!0),p(H,{key:0},oe(c.targets||[],f=>{var g;return m(),p("span",{class:"modulation-route-pill",key:"lfo-route-"+c.id+"-"+f},b(((g=t.sequencerParamMetaMap[f])==null?void 0:g.label)||f),1)}),128)):(m(),p("span",S6,"off")),a("button",{type:"button",class:"framesync-button modulation-lfo-card__route-button",onClick:f=>t.onLfoRouteButtonClick(c.id)},"+ route",8,w6)])],10,n6))),128))]),a("div",M6,[a("div",P6,[a("div",null,[e[36]||(e[36]=a("div",{class:"framesync-subtitle"},"Targets",-1)),t.selectedModulationLfo?(m(),p("div",x6," Armed: LFO "+b(t.selectedModulationLfo.id)+". Click a target to toggle its route. Standby / Three.js targets drive the WebGL animation engine (not Deforum). ",1)):N("",!0)])]),a("div",T6,[(m(!0),p(H,null,oe(t.modulationTargets,c=>(m(),at(o,{key:"shared-target-"+c.key,label:c.label,"param-key":c.key,selected:t.selectedModulationLfo?t.selectedModulationLfo.targets.includes(c.key):!1,focused:t.modulationRouteFocusKey===c.key,owners:t.targetOwners[c.key]||[],onToggle:f=>t.selectedModulationLfo&&t.toggleLfoTarget(t.selectedModulationLfo,c.key)},null,8,["label","param-key","selected","focused","owners","onToggle"]))),128))])])],64)):r.modulationPane==="MAPPINGS"?(m(),at(d,{key:3,app:i.app},null,8,["app"])):r.modulationPane==="AV_SYNC"?(m(),p("div",A6,[e[43]||(e[43]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Reference "),a("span",{class:"framesync-accent"},"Audio")])],-1)),e[44]||(e[44]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}}," Upload the track you use for modulation. Enable sync to lock playback to the HLS clock. ",-1)),a("div",{class:B(["modulation-audio-dropzone",{"modulation-audio-dropzone--filled":t.audio.objectUrl}]),"data-testid":"audio-dropzone",onDragover:e[9]||(e[9]=(...c)=>t.onModulationAudioDragover&&t.onModulationAudioDragover(...c)),onDrop:e[10]||(e[10]=(...c)=>t.onModulationAudioDrop&&t.onModulationAudioDrop(...c)),onClick:e[11]||(e[11]=c=>t.$refs.audioFileInput&&t.$refs.audioFileInput.click())},[a("input",{ref:"audioFileInput",type:"file",accept:"audio/*",class:"modulation-audio-dropzone__input",onChange:e[7]||(e[7]=(...c)=>t.onAudioUpload&&t.onAudioUpload(...c))},null,544),t.audio.uploadedFile?(m(),p(H,{key:0},[a("span",E6,b(t.audio.uploadedFile),1),a("span",C6,b(t.audioStatus||"Ready"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=(...c)=>t.clearAudioFile&&t.clearAudioFile(...c))},"Remove")],64)):(m(),p(H,{key:1},[e[37]||(e[37]=a("span",{class:"modulation-audio-dropzone__title"},"Drop audio here",-1)),e[38]||(e[38]=a("span",{class:"modulation-audio-dropzone__hint"},"or click to browse · max 50MB",-1))],64))],34),a("label",k6,[J(a("input",{type:"checkbox","data-testid":"av-sync-enable","onUpdate:modelValue":e[12]||(e[12]=c=>t.avSyncEnabled=c),disabled:!t.audio.objectUrl},null,8,L6),[[xi,t.avSyncEnabled]]),e[39]||(e[39]=ie(" Enable sync ",-1))]),t.avSyncEnabled&&t.audio.objectUrl?(m(),p("div",R6,[e[41]||(e[41]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" If the music feels "),a("em",null,"ahead"),ie(" of the pictures (normal for live HLS + encoder delay), raise "),a("strong",null,"Video lead"),ie(" until it lines up. ")],-1)),a("label",D6,[e[40]||(e[40]=a("span",{class:"framesync-subtitle"},"Video lead (sec)",-1)),J(a("input",{type:"number","data-testid":"av-sync-lead",class:"framesync-input","onUpdate:modelValue":e[13]||(e[13]=c=>t.avSyncLeadSec=c),min:"0",max:"120",step:"0.25"},null,512),[[ye,t.avSyncLeadSec,void 0,{number:!0}]])]),e[42]||(e[42]=a("div",{class:"framesync-subtitle",style:{"margin-top":"4px","font-size":"10px"}},"≈ encoder buffer + HLS fragments (often 2–10s).",-1))])):N("",!0)])):r.modulationPane==="AUDIO_REACTIVE"?(m(),p(H,{key:5},[r.isAudioTab?(m(),p("div",I6,[e[48]||(e[48]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Reference "),a("span",{class:"framesync-accent"},"Audio")])],-1)),e[49]||(e[49]=a("div",{class:"framesync-subtitle modulation-audio-panel__intro"}," Upload the track for band analysis and AV sync. Same file as Modulation → Audio. ",-1)),a("div",{class:B(["modulation-audio-dropzone",{"modulation-audio-dropzone--filled":t.audio.objectUrl}]),"data-testid":"audio-dropzone",onDragover:e[16]||(e[16]=(...c)=>t.onModulationAudioDragover&&t.onModulationAudioDragover(...c)),onDrop:e[17]||(e[17]=(...c)=>t.onModulationAudioDrop&&t.onModulationAudioDrop(...c)),onClick:e[18]||(e[18]=c=>t.$refs.audioTabFileInput&&t.$refs.audioTabFileInput.click())},[a("input",{ref:"audioTabFileInput",type:"file",accept:"audio/*",class:"modulation-audio-dropzone__input",onChange:e[14]||(e[14]=(...c)=>t.onAudioUpload&&t.onAudioUpload(...c))},null,544),t.audio.uploadedFile?(m(),p(H,{key:0},[a("span",F6,b(t.audio.uploadedFile),1),a("span",N6,b(t.audioStatus||"Ready"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[15]||(e[15]=lt((...c)=>t.clearAudioFile&&t.clearAudioFile(...c),["stop"]))},"Remove")],64)):(m(),p(H,{key:1},[e[45]||(e[45]=a("span",{class:"modulation-audio-dropzone__title"},"Drop audio here",-1)),e[46]||(e[46]=a("span",{class:"modulation-audio-dropzone__hint"},"or click to browse · max 50MB",-1))],64))],34),a("label",O6,[J(a("input",{type:"checkbox","data-testid":"av-sync-enable","onUpdate:modelValue":e[19]||(e[19]=c=>t.avSyncEnabled=c),disabled:!t.audio.objectUrl},null,8,U6),[[xi,t.avSyncEnabled]]),e[47]||(e[47]=ie(" Enable AV sync (HLS clock) ",-1))])])):N("",!0),a("div",B6,[a("div",{class:B(["framesync-header audio-reactive-panel__header",{"audio-reactive-panel__header--toolbar":r.isAudioTab}])},[r.isAudioTab?N("",!0):(m(),p("div",V6,[...e[50]||(e[50]=[ie("Audio ",-1),a("span",{class:"framesync-accent"},"Reactive",-1)])])),a("button",{type:"button",class:B(["framesync-button",{"framesync-button--live":t.audioReactiveActive}]),onClick:e[20]||(e[20]=(...c)=>t.startAudioStream&&t.startAudioStream(...c))},b(t.audioReactiveActive?"Running":"Start"),3)],2),a("div",z6,[e[51]||(e[51]=ie(" Map frequency bands to live parameters. Meters animate from real audio analysis — drag bands on the spectrum to retune. ",-1)),r.isAudioTab?(m(),p("span",$6," Upload reference audio under Modulation → Audio.")):N("",!0)]),t.activeAudioMapping||t.audioMappings.length?(m(),p("div",G6,[e[52]||(e[52]=a("span",{class:"audio-band-presets__label"},"Quick bands",-1)),(m(!0),p(H,null,oe(t.audioBandChips,c=>(m(),p("button",{key:"audio-preset-hero-"+c.key,type:"button",class:"chip",onClick:f=>t.applyAudioBandPreset(t.activeAudioMappingIndex>=0?t.activeAudioMappingIndex:0,c.key)},b(c.label),9,H6))),128)),a("button",{type:"button",class:"chip chip--ghost",onClick:e[21]||(e[21]=(...c)=>t.addAudioMapping&&t.addAudioMapping(...c))},"+ map")])):N("",!0),ve(u,{class:"audio-reactive-panel__spectrum audio-reactive-panel__spectrum--hero","canvas-height":148,mappings:t.audioMappings,levels:t.audioMappingLevels,"active-index":t.activeAudioMappingIndex,"preview-index":t.audioBandPreviewIndex,"spectrum-bins":t.audioSpectrumBins,live:t.audioSpectrumEditorLive,"band-labels":t.audioSpectrumBandLabels,"band-colors":t.audioSpectrumBandColors,onSelectBand:t.onAudioSpectrumSelectBand,onUpdateBand:t.updateAudioMappingBand},null,8,["mappings","levels","active-index","preview-index","spectrum-bins","live","band-labels","band-colors","onSelectBand","onUpdateBand"]),a("div",W6,[(m(!0),p(H,null,oe(t.audioMappings,(c,f)=>{var g,y;return m(),p("button",{key:"audio-meter-"+f,type:"button",class:B(["audio-reactive-mapping-card",{"audio-reactive-mapping-card--active":t.activeAudioMappingIndex===f,"audio-reactive-mapping-card--live":t.audioSpectrumPlaying||t.audioReactiveActive,"audio-reactive-mapping-card--preview":t.audioBandPreviewIndex===f}]),onClick:T=>t.onAudioSpectrumSelectBand(f)},[a("div",j6,[a("span",X6,b(c.param?((g=t.lfoTargets.find(T=>T.key===c.param))==null?void 0:g.label)||c.param:"Unmapped"),1),a("code",K6,b(c.freq_min)+"–"+b(c.freq_max)+" Hz",1)]),(m(),p("svg",{class:B(["audio-mini-bars",{"audio-mini-bars--live":t.audioSpectrumPlaying||t.audioReactiveActive}]),viewBox:"0 0 88 28",preserveAspectRatio:"none","aria-hidden":"true"},[(m(!0),p(H,null,oe(r.modulationMappingMiniBars[f],(T,_)=>(m(),p("rect",{key:_,x:_*11,y:28-Math.max(2,T*26),width:"9",height:Math.max(2,T*26),class:B(["audio-mini-bars__bar",{"audio-mini-bars__bar--on":T>.04}]),rx:"1.5"},null,10,Y6))),128))],2)),a("div",J6,b(Math.round((t.audioMappingLevels[f]||0)*100))+"% · "+b(((y=t.audioBandTabDefs[f])==null?void 0:y.label)||"Band"),1)],10,q6)}),128))]),t.activeAudioMapping?(m(),p("div",Z6,[a("div",Q6,[(m(!0),p(H,null,oe(t.audioBandChips,c=>(m(),p("button",{key:"audio-preset-"+c.key,type:"button",class:"chip",onClick:f=>t.applyAudioBandPreset(t.activeAudioMappingIndex,c.key)},b(c.label),9,ez))),128))]),a("div",{class:B(["audio-band-reactivity",{"audio-band-reactivity--live":t.audioSpectrumPlaying||t.audioReactiveActive,"audio-band-reactivity--preview":t.audioBandPreviewIndex===t.activeAudioMappingIndex}])},[a("div",tz,[e[53]||(e[53]=a("div",null,[a("div",{class:"framesync-subtitle"},"Band reactivity"),a("div",{class:"audio-band-reactivity__hint"}," Live level from the current audio in this bandwidth — output shows mapped parameter value. ")],-1)),a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{"framesync-button--live":t.audioBandPreviewIndex===t.activeAudioMappingIndex}]),disabled:!t.audio.objectUrl,"data-testid":"audio-band-preview",onClick:e[22]||(e[22]=c=>t.toggleAudioBandPreview(t.activeAudioMappingIndex))},b(t.audioBandPreviewIndex===t.activeAudioMappingIndex?"Stop preview":"Preview band"),11,iz)]),a("div",nz,[(m(),p("svg",{class:B(["audio-band-reactivity__spectrum",{"audio-band-reactivity__spectrum--live":t.audioSpectrumPlaying||t.audioReactiveActive}]),viewBox:"0 0 88 36",preserveAspectRatio:"none","aria-hidden":"true"},[(m(!0),p(H,null,oe(r.activeBandMiniBars,(c,f)=>(m(),p("rect",{key:"react-bar-"+f,x:f*11,y:36-Math.max(2,c*32),width:"9",height:Math.max(2,c*32),class:B(["audio-band-reactivity__spectrum-bar",{"audio-band-reactivity__spectrum-bar--on":c>.04}]),rx:"1.5"},null,10,sz))),128))],2)),a("div",rz,[e[54]||(e[54]=a("div",{class:"audio-band-reactivity__meter-label"},"Input",-1)),a("div",oz,[a("div",{class:"audio-band-reactivity__meter-fill",style:Mt({width:r.activeBandLevelPct+"%"})},null,4)]),a("div",az,b(r.activeBandLevelPct)+"%",1)]),t.activeAudioMapping.param?(m(),p("div",lz,[a("span",dz,"→ "+b(r.activeBandTargetLabel),1),a("span",uz,b(r.activeBandOutputPreview),1)])):N("",!0)])],2),a("div",{class:B(["modulation-lfo-card modulation-audio-band-card",{"modulation-lfo-card--active":t.audioReactiveActive||t.audioSpectrumPlaying}])},[a("div",cz,[a("label",hz,[e[56]||(e[56]=a("span",{class:"framesync-subtitle"},"Target",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[23]||(e[23]=c=>t.activeAudioMapping.param=c)},[e[55]||(e[55]=a("option",{value:""},"Select target…",-1)),(m(!0),p(H,null,oe(t.lfoTargets,c=>(m(),p("option",{key:"audio-target-"+t.activeAudioMappingIndex+"-"+c.key,value:c.key},b(c.label),9,fz))),128))],512),[[Dt,t.activeAudioMapping.param]])]),a("label",mz,[e[58]||(e[58]=a("span",{class:"framesync-subtitle"},"Hz",-1)),a("span",pz,[J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[24]||(e[24]=c=>t.activeAudioMapping.freq_min=c),min:"20",max:"20000",step:"1","aria-label":"Min Hz"},null,512),[[ye,t.activeAudioMapping.freq_min,void 0,{number:!0}]]),e[57]||(e[57]=a("span",{class:"audio-reactive-hz-pair__sep"},"–",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[25]||(e[25]=c=>t.activeAudioMapping.freq_max=c),min:"20",max:"20000",step:"1","aria-label":"Max Hz"},null,512),[[ye,t.activeAudioMapping.freq_max,void 0,{number:!0}]])])]),a("label",gz,[e[60]||(e[60]=a("span",{class:"framesync-subtitle"},"Out",-1)),a("span",yz,[J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[26]||(e[26]=c=>t.activeAudioMapping.out_min=c),step:"any","aria-label":"Out min"},null,512),[[ye,t.activeAudioMapping.out_min,void 0,{number:!0}]]),e[59]||(e[59]=a("span",{class:"audio-reactive-hz-pair__sep"},"–",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[27]||(e[27]=c=>t.activeAudioMapping.out_max=c),step:"any","aria-label":"Out max"},null,512),[[ye,t.activeAudioMapping.out_max,void 0,{number:!0}]])])])])],2)])):N("",!0),t.audioStatus?(m(),p("div",vz,b(t.audioStatus),1)):N("",!0)])],64)):r.modulationPane==="BEAT_MACROS"?(m(),p("div",{key:6,class:B(["framesync-panel modulation-macros modulation-macros--audio",{"modulation-macros--disabled":!t.audio.objectUrl}])},[a("div",bz,[e[61]||(e[61]=a("div",{class:"framesync-title"},[ie("Beat "),a("span",{class:"framesync-accent"},"Macros")],-1)),a("div",_z,[a("button",{class:B(["framesync-button",{active:t.beatMacroOn}]),onClick:e[28]||(e[28]=c=>t.beatMacroOn=!t.beatMacroOn),disabled:!t.audio.objectUrl},b(t.beatMacroOn?"On":"Off"),11,Sz),t.macrosRack.length<6?(m(),p("button",{key:0,class:"framesync-button",onClick:e[29]||(e[29]=(...c)=>t.addMacro&&t.addMacro(...c)),disabled:!t.audio.objectUrl},"+ Add Macro",8,wz)):N("",!0)])]),t.audio.objectUrl?(m(),p("div",Pz,[(m(!0),p(H,null,oe(t.macrosRack,(c,f)=>(m(),p("div",{key:"macro-"+f,class:B(["modulation-macro-pill",{"modulation-macro-pill--active":c.on}]),style:Mt(c.on?{"--macro-beat-dur":(60/(c.bpm||120)).toFixed(3)+"s"}:{})},[a("label",xz,[J(a("input",{type:"checkbox","onUpdate:modelValue":g=>c.on=g},null,8,Tz),[[xi,c.on]]),ie(" Macro "+b(f+1),1)]),J(a("select",{class:"framesync-select modulation-macro-pill__select","onUpdate:modelValue":g=>c.target=g},[e[62]||(e[62]=a("option",{value:""},"None",-1)),(m(!0),p(H,null,oe(t.modulationTargets,g=>(m(),p("option",{key:"macro-target-"+f+"-"+g.key,value:g.key},b(g.label),9,Ez))),128))],8,Az),[[Dt,c.target]]),J(a("select",{class:"framesync-select modulation-macro-pill__select","onUpdate:modelValue":g=>c.shape=g},[(m(!0),p(H,null,oe([...t.lfoShapes,"Noise"],g=>(m(),p("option",{key:"macro-shape-"+f+"-"+g,value:g},b(g),9,kz))),128))],8,Cz),[[Dt,c.shape]]),J(a("input",{type:"number",class:"framesync-input modulation-macro-pill__input","onUpdate:modelValue":g=>c.bpm=g,min:"20",max:"300"},null,8,Lz),[[ye,c.bpm,void 0,{number:!0}]]),J(a("input",{type:"number",class:"framesync-input modulation-macro-pill__input","onUpdate:modelValue":g=>c.depth=g,min:"0",max:"1",step:"0.01"},null,8,Rz),[[ye,c.depth,void 0,{number:!0}]])],6))),128))])):(m(),p("div",Mz," Upload an audio file on the Audio tab to unlock beat macros. "))],2)):N("",!0)])]),_:1})])}const Iz=nt(KV,[["render",Dz]]),Fz={name:"FrameRailPanel",props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},Nz={class:"frame-rail frame-rail--embedded","data-testid":"runs-browser-frames"},Oz={class:"frame-rail__header"},Uz={class:"frame-rail__title-wrap"},Bz={key:0,class:"frame-rail__meta"},Vz={key:2,class:"frame-rail__live-tag"},zz={key:1,class:"frame-rail__meta"},$z={class:"frame-rail__actions"},Gz={key:0,class:"frame-rail__controls"},Hz=["disabled"],Wz=["max","value"],qz=["disabled"],jz={key:0,ref:"frameRail",class:"frame-rail__list","data-testid":"runs-browser-frames-rail"},Xz=["data-frame-index","onClick"],Kz={class:"frame-rail__thumb-wrap"},Yz=["src","alt","onLoad","onError"],Jz={key:0,class:"frame-rail__thumb-loading","aria-hidden":"true"},Zz={class:"frame-rail__label"},Qz={key:0,class:"frame-rail__item frame-rail__item--pending","data-testid":"frame-rail-pending","aria-hidden":"true"},e$={key:1,class:"frame-rail__empty"},t$={class:"lazy-loading-indicator"},i$={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},n$={key:1,class:"lazy-loading-indicator__dots","aria-hidden":"true"},s$={class:"framesync-subtitle",style:{"margin-top":"6px"}};function r$(t,e,i,n,s,r){return m(),p("div",Nz,[a("div",Oz,[a("div",Uz,[e[3]||(e[3]=a("span",{class:"frame-rail__title"},"Frames",-1)),t.frameStripThumbs.length?(m(),p("span",Bz,[ie(b(t.selectedFrameLabel)+" · "+b(t.frameStripThumbs.length)+" ",1),t.frameRailSourceLabel?(m(),p(H,{key:0},[ie(" from "+b(t.frameRailSourceLabel),1)],64)):(m(),p(H,{key:1},[ie(" generated")],64)),t.deforumPlaying&&t.frameRailFollowLatest&&!t.frameRailSourceLabel?(m(),p("span",Vz,"Live")):N("",!0)])):(m(),p("span",zz,"Waiting for rendered frames…"))]),a("div",$z,[t.frameStripThumbs.length?(m(),p("div",Gz,[a("button",{type:"button",class:"frame-rail__step",onClick:e[0]||(e[0]=l=>t.stepFrameSelection(-1)),disabled:t.selectedFrameIndex<=0},"Prev",8,Hz),a("input",{class:"frame-rail__scrubber",type:"range",min:"0",max:Math.max(0,t.frameStripThumbs.length-1),value:Math.max(0,t.selectedFrameIndex),onInput:e[1]||(e[1]=l=>t.selectFrame(Number(l.target.value),{userInitiated:!0}))},null,40,Wz),a("button",{type:"button",class:"frame-rail__step",onClick:e[2]||(e[2]=l=>t.stepFrameSelection(1)),disabled:t.selectedFrameIndex>=t.frameStripThumbs.length-1},"Next",8,qz)])):N("",!0)])]),t.frameStripThumbs.length?(m(),p("div",jz,[(m(!0),p(H,null,oe(t.frameStripThumbs,(l,o)=>(m(),p("button",{key:"frame-rail-"+(l.name||o),type:"button",class:B(["frame-rail__item",{"frame-rail__item--active":o===t.selectedFrameIndex,"frame-rail__item--loading":t.isFrameThumbLoading(l)}]),"data-frame-index":o,"data-testid":"frame-rail-item",onClick:d=>t.selectFrame(o,{userInitiated:!0})},[a("div",Kz,[a("img",{class:"frame-rail__thumb",src:l.src||l.url,alt:l.name||"Frame "+o,onLoad:d=>t.onFrameThumbImageLoad(l),onError:d=>t.onFrameThumbImageError(l)},null,40,Yz),t.isFrameThumbLoading(l)?(m(),p("div",Jz,[...e[4]||(e[4]=[a("span",{class:"lazy-loading-indicator lazy-loading-indicator--thumb"},[a("span",{class:"lazy-loading-indicator__spinner"})],-1)])])):N("",!0)]),a("span",Zz,b(t.frameLabel(l)),1)],10,Xz))),128)),t.deforumPlaying&&t.frameRailFollowLatest?(m(),p("div",Qz,[...e[5]||(e[5]=[Bi('
Next…',2)])])):N("",!0)],512)):(m(),p("div",e$,[a("span",t$,[t.framesEmptyStatus.kind==="loading"?(m(),p("span",i$)):N("",!0),a("span",null,b(t.framesEmptyStatus.label),1),t.framesEmptyStatus.kind==="loading"?(m(),p("span",n$,[...e[6]||(e[6]=[a("span",null,null,-1),a("span",null,null,-1),a("span",null,null,-1)])])):N("",!0)]),a("div",s$,b(t.framesEmptyStatus.detail),1)]))])}const o$=nt(Fz,[["render",r$]]),a$={name:"RunsBrowserPanel",props:{app:{type:Object,required:!0}},components:{FrameRailPanel:o$,UiIcon:Kt},setup(t){return Et(t)}},l$={class:"rack runs-browser","data-testid":"runs-browser"},d$={class:"framesync-panel runs-browser__panel"},u$={class:"framesync-header"},c$={class:"runs-browser__meta"},h$={class:"runs-browser__count"},f$={key:0,class:"runs-monitor__refreshed"},m$=["disabled"],p$={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},g$={class:"runs-browser__main-tabs sub-pills","data-testid":"runs-browser-main-tabs"},y$={key:0,class:"runs-browser__tab-badge"},v$={key:0,class:"runs-browser__tab-badge"},b$={key:0,class:"runs-browser__tab-badge runs-browser__tab-badge--dim"},_$={key:0,class:"runs-browser__frames-pane","data-testid":"runs-browser-frames-pane"},S$={class:"runs-monitor-bar"},w$=["disabled"],M$={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},P$={class:"framesync-checkbox runs-monitor__auto"},x$={class:"runs-activity-summary","data-testid":"runs-activity-summary"},T$={class:"runs-activity-summary__label"},A$={key:0,class:"runs-active-jobs__warn"},E$={key:1,class:"runs-active-jobs__status"},C$={class:"runs-job-log","data-testid":"runs-job-log"},k$={class:"runs-job-log__time"},L$={class:"runs-job-log__msg"},R$={key:0,class:"runs-job-log__empty"},D$={class:"runs-browser__table-wrap runs-browser__table-wrap--active","data-testid":"runs-active-jobs"},I$={class:"runs-browser__table runs-browser__table--compact"},F$=["onClick"],N$={class:"runs-browser__preview"},O$=["src","alt"],U$={key:1,class:"runs-browser__thumb runs-browser__thumb--empty"},B$={class:"runs-browser__run-id"},V$={class:"runs-browser__worker"},z$={class:"runs-browser__live-frames"},$$={class:"runs-browser__progress"},G$={class:"runs-browser__progress-label"},H$=["title"],W$={class:"runs-browser__eta"},q$={class:"runs-browser__actions"},j$=["onClick"],X$={key:0},K$={class:"runs-browser__filters runs-browser__filters--compact"},Y$={class:"runs-browser__sortbar runs-browser__sortbar--compact"},J$={class:"runs-browser__table-wrap"},Z$={class:"runs-browser__table runs-browser__table--compact"},Q$=["onClick"],e9={class:"runs-browser__preview"},t9=["src","alt"],i9={key:1,class:"runs-browser__thumb runs-browser__thumb--empty"},n9={class:"runs-browser__run-id"},s9={class:"runs-browser__model"},r9={class:"runs-browser__progress"},o9={class:"runs-browser__progress-label"},a9=["title"],l9={class:"runs-browser__date"},d9={class:"runs-browser__actions"},u9=["onClick"],c9=["onClick"],h9=["onClick"],f9={key:0},m9={key:0,class:"runs-detail-card","data-testid":"runs-detail-card"},p9={class:"runs-detail-card__header"},g9={class:"framesync-title"},y9={class:"runs-detail-card__id"},v9={class:"runs-detail-card__header-actions"},b9={class:"runs-detail-card__tabs sub-pills"},_9={key:0,class:"runs-detail-json__diff-badge"},S9={key:0,class:"runs-detail-card__outputs","data-testid":"runs-detail-outputs"},w9={key:0,class:"runs-detail-card__video-wrap"},M9=["src"],P9={class:"runs-detail-card__output-links"},x9=["href"],T9=["href"],A9={key:1,class:"runs-detail-card__outputs runs-detail-card__outputs--empty"},E9={class:"runs-detail-card__grid runs-detail-card__grid--compact"},C9={class:"runs-browser__seed"},k9={class:"runs-detail-card__full"},L9={class:"runs-detail-card__prompt"},R9={class:"runs-detail-card__full"},D9={class:"runs-detail-card__prompt"},I9={class:"runs-detail-card__full"},F9={key:2,class:"runs-detail-card__frames"},N9={class:"framesync-subtitle"},O9={class:"runs-detail-card__frames-list"},U9=["href"],B9=["src","alt"],V9={key:1,class:"runs-detail-json","data-testid":"runs-detail-json"},z9={class:"runs-detail-json__toolbar"},$9={class:"framesync-checkbox runs-detail-json__filter"},G9={key:0,class:"runs-detail-json__diff-hint"},H9={class:"runs-detail-json__table-wrap"},W9={class:"runs-detail-json__table"},q9={class:"runs-detail-json__key"},j9={class:"runs-detail-json__value"},X9={class:"runs-detail-json__current"},K9={key:0},Y9={key:1,class:"runs-detail-json__na"},J9={key:2,class:"runs-detail-json__changed",title:"Differs from current UI value"},Z9={key:0},Q9={colspan:"3",class:"runs-detail-json__empty"},e7={class:"runs-detail-json__raw"},t7={class:"runs-detail-json__pre"},i7={key:1,class:"runs-compare-card"},n7={class:"runs-compare-card__header"},s7={class:"framesync-title"},r7={class:"runs-compare-card__actions"},o7={class:"runs-compare-card__table-wrap"},a7={class:"runs-compare-card__table"},l7={key:0,class:"runs-prompt-diff","data-testid":"runs-prompt-diff"},d7={class:"framesync-subtitle"},u7={class:"framesync-subtitle runs-prompt-diff__label"},c7={class:"runs-prompt-diff__columns"},h7={class:"runs-prompt-diff__col"},f7={class:"runs-prompt-diff__col"};function m7(t,e,i,n,s,r){const l=Ne("FrameRailPanel"),o=Ne("UiIcon");return m(),p("div",l$,[a("div",d$,[a("div",u$,[e[35]||(e[35]=a("div",{class:"framesync-title"},[ie("Runs "),a("span",{class:"framesync-accent"},"Monitor")],-1)),a("div",c$,[a("span",h$,[t.runsBrowserTab==="active"?(m(),p(H,{key:0},[ie(b(t.runsActiveList.length)+" active",1)],64)):t.runsBrowserTab==="frames"?(m(),p(H,{key:1},[ie(b(t.frameStripThumbs.length)+" frames",1)],64)):(m(),p(H,{key:2},[ie(b(t.runsFiltered.length)+" / "+b(t.runsPastCount),1)],64))]),t.runsLastRefreshedLabel?(m(),p("span",f$,b(t.runsLastRefreshedLabel),1)):N("",!0),a("button",{class:"framesync-button",disabled:t.runsLoading,onClick:e[0]||(e[0]=d=>t.refreshRuns())},[t.runsLoading?(m(),p("span",p$,[...e[34]||(e[34]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,m$)])]),a("div",g$,[a("button",{type:"button",class:B(["sub-pill",{active:t.runsBrowserTab==="active"}]),"data-testid":"runs-browser-tab-active",onClick:e[1]||(e[1]=d=>t.setRunsBrowserTab("active"))},[e[36]||(e[36]=ie(" Runs ",-1)),t.runsActiveList.length?(m(),p("span",y$,b(t.runsActiveList.length),1)):N("",!0)],2),a("button",{type:"button",class:B(["sub-pill",{active:t.runsBrowserTab==="frames"}]),"data-testid":"runs-browser-tab-frames",onClick:e[2]||(e[2]=d=>t.setRunsBrowserTab("frames"))},[e[37]||(e[37]=ie(" Frames ",-1)),t.frameStripThumbs.length?(m(),p("span",v$,b(t.frameStripThumbs.length),1)):N("",!0)],2),a("button",{type:"button",class:B(["sub-pill",{active:t.runsBrowserTab==="past"}]),"data-testid":"runs-browser-tab-past",onClick:e[3]||(e[3]=d=>t.setRunsBrowserTab("past"))},[e[38]||(e[38]=ie(" Past runs ",-1)),t.runsPastCount?(m(),p("span",b$,b(t.runsPastCount),1)):N("",!0)],2)]),t.runsBrowserTab==="frames"?(m(),p("div",_$,[ve(l,{app:i.app},null,8,["app"])])):t.runsBrowserTab==="active"?(m(),p(H,{key:1},[a("div",S$,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"runs-launch-test",disabled:t.runsLaunching,onClick:e[4]||(e[4]=(...d)=>t.launchTestRun&&t.launchTestRun(...d))},[t.runsLaunching?(m(),p("span",M$,[...e[39]||(e[39]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Launch test job",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Launch test job")],64))],8,w$),a("label",P$,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[5]||(e[5]=d=>t.runsAutoRefresh=d),onChange:e[6]||(e[6]=(...d)=>t.onRunsAutoRefreshChange&&t.onRunsAutoRefreshChange(...d))},null,544),[[xi,t.runsAutoRefresh]]),ie(" Auto-refresh ("+b(t.runsPollIntervalSec)+"s) ",1)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[7]||(e[7]=(...d)=>t.clearRunsJobLog&&t.clearRunsJobLog(...d))},"Clear log")]),a("div",x$,[a("span",T$,b(t.runsActiveSummaryLabel),1),t.deforumBatchesStatus?(m(),p("span",A$,b(t.deforumBatchesStatus),1)):N("",!0),t.runsStatus?(m(),p("span",E$,b(t.runsStatus),1)):N("",!0)]),a("div",C$,[(m(!0),p(H,null,oe(t.runsJobLog,d=>(m(),p("div",{key:d.id,class:B(["runs-job-log__line","runs-job-log__line--"+(d.level||"info")])},[a("time",k$,b(t.formatRunsLogTime(d.ts)),1),a("span",L$,b(d.message),1)],2))),128)),t.runsJobLog.length?N("",!0):(m(),p("p",R$,"No log entries yet — launch a test job to see activity."))]),a("div",D$,[a("table",I$,[e[41]||(e[41]=a("thead",null,[a("tr",null,[a("th"),a("th",null,"Job"),a("th",null,"Status"),a("th",null,"Worker"),a("th",null,"Frames"),a("th",null,"Progress"),a("th",null,"ETA"),a("th")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(t.runsActiveList,d=>(m(),p("tr",{key:d.run_id,class:B({"runs-row-active":t.runsDetailView&&t.runsDetailView.run_id===d.run_id}),onClick:u=>t.onRunRowClick(d,u)},[a("td",N$,[t.runListingThumbUrl(d)?(m(),p("img",{key:0,src:t.runListingThumbUrl(d),class:"runs-browser__thumb",alt:d.run_id},null,8,O$)):(m(),p("div",U$,"—"))]),a("td",B$,b(t.runListingId(d)),1),a("td",null,[a("span",{class:B(["runs-status-pill","runs-status-pill--"+d.status])},b(d.status),3)]),a("td",V$,b(t.runWorkerName(d)),1),a("td",z$,b(t.runLiveFramesLabel(d)),1),a("td",$$,[a("div",G$,b(t.runFrameProgressLabel(d)),1),t.runFrameProgressPct(d)!=null?(m(),p("div",{key:0,class:"runs-browser__progress-bar",title:t.runFrameProgressLabel(d)},[a("span",{class:"runs-browser__progress-fill",style:Mt({width:t.runFrameProgressPct(d)+"%"})},null,4)],8,H$)):N("",!0)]),a("td",W$,b(t.runEtaLabel(d)),1),a("td",null,[a("div",q$,[t.canKillQueuedRun(d)?(m(),p("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact runs-browser__action runs-browser__action--danger",onClick:u=>t.killQueuedRun(d),title:"Cancel queued batch"},"Kill",8,j$)):N("",!0)])])],10,F$))),128)),t.runsActiveList.length===0?(m(),p("tr",X$,[...e[40]||(e[40]=[a("td",{colspan:"8",class:"runs-browser__empty"}," No active jobs. Launch a test job or start a Deforum batch. ",-1)])])):N("",!0)])])])],64)):(m(),p(H,{key:2},[a("div",K$,[J(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[8]||(e[8]=d=>t.runsFilter.search=d),placeholder:"Search…",onInput:e[9]||(e[9]=(...d)=>t.applyRunsFilters&&t.applyRunsFilters(...d))},null,544),[[ye,t.runsFilter.search,void 0,{trim:!0}]]),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[10]||(e[10]=d=>t.runsFilter.status=d),onChange:e[11]||(e[11]=(...d)=>t.applyRunsFilters&&t.applyRunsFilters(...d))},[...e[42]||(e[42]=[Bi('',5)])],544),[[Dt,t.runsFilter.status]]),J(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[12]||(e[12]=d=>t.runsFilter.tag=d),placeholder:"Tag",onInput:e[13]||(e[13]=(...d)=>t.applyRunsFilters&&t.applyRunsFilters(...d))},null,544),[[ye,t.runsFilter.tag,void 0,{trim:!0}]]),J(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[14]||(e[14]=d=>t.runsFilter.model=d),placeholder:"Model",onInput:e[15]||(e[15]=(...d)=>t.applyRunsFilters&&t.applyRunsFilters(...d))},null,544),[[ye,t.runsFilter.model,void 0,{trim:!0}]])]),a("div",Y$,[e[44]||(e[44]=a("span",{class:"runs-browser__sort-label"},"Sort:",-1)),J(a("select",{class:"framesync-select runs-browser__sort-select","onUpdate:modelValue":e[16]||(e[16]=d=>t.runsSort.field=d),onChange:e[17]||(e[17]=(...d)=>t.applyRunsFilters&&t.applyRunsFilters(...d))},[...e[43]||(e[43]=[Bi('',5)])],544),[[Dt,t.runsSort.field]]),a("button",{class:"framesync-button runs-browser__sort-order",onClick:e[18]||(e[18]=d=>{t.runsSort.order=t.runsSort.order==="desc"?"asc":"desc",t.applyRunsFilters()})},b(t.runsSort.order==="desc"?"Desc":"Asc"),1),e[45]||(e[45]=a("span",{class:"runs-browser__hint"},"Ctrl+click row to compare",-1)),e[46]||(e[46]=a("div",{class:"runs-browser__spacer"},null,-1)),a("button",{class:"framesync-button runs-browser__export",onClick:e[19]||(e[19]=d=>t.exportRuns("json"))},"JSON"),a("button",{class:"framesync-button runs-browser__export",onClick:e[20]||(e[20]=d=>t.exportRuns("csv"))},"CSV")]),a("div",J$,[a("table",Z$,[e[48]||(e[48]=a("thead",null,[a("tr",null,[a("th"),a("th",null,"Run ID"),a("th",null,"Status"),a("th",null,"Model"),a("th",null,"Progress"),a("th",null,"Date"),a("th")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(t.runsFiltered,d=>(m(),p("tr",{key:d.run_id,class:B({"runs-row-selected":t.runsSelected.includes(d.run_id),"runs-row-active":t.runsDetailView&&t.runsDetailView.run_id===d.run_id}),onClick:u=>t.onRunRowClick(d,u)},[a("td",e9,[t.runListingThumbUrl(d)?(m(),p("img",{key:0,src:t.runListingThumbUrl(d),class:"runs-browser__thumb",alt:d.run_id},null,8,t9)):(m(),p("div",i9,"—"))]),a("td",n9,b(d.run_id),1),a("td",null,[a("span",{class:B(["runs-status-pill","runs-status-pill--"+d.status])},b(d.status),3)]),a("td",s9,b(d.model||"-"),1),a("td",r9,[a("div",o9,b(t.runFrameProgressLabel(d)),1),t.runFrameProgressPct(d)!=null?(m(),p("div",{key:0,class:"runs-browser__progress-bar",title:t.runFrameProgressLabel(d)},[a("span",{class:"runs-browser__progress-fill",style:Mt({width:t.runFrameProgressPct(d)+"%"})},null,4)],8,a9)):N("",!0)]),a("td",l9,b(t.formatDate(d.started_at)),1),a("td",null,[a("div",d9,[t.canKillQueuedRun(d)?(m(),p("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact runs-browser__action runs-browser__action--danger",onClick:u=>t.killQueuedRun(d),title:"Cancel queued batch"},"Kill",8,u9)):N("",!0),d._isBatch?N("",!0):(m(),p("button",{key:1,class:"framesync-button runs-browser__action",onClick:u=>t.rerunRun(d),title:"Rerun"},"↻",8,c9)),d._isBatch?N("",!0):(m(),p("button",{key:2,type:"button",class:"framesync-icon-button runs-browser__action",onClick:u=>t.deleteRun(d),title:"Delete","aria-label":"Delete run"},[ve(o,{name:"close"})],8,h9))])])],10,Q$))),128)),t.runsFiltered.length===0?(m(),p("tr",f9,[...e[47]||(e[47]=[a("td",{colspan:"7",class:"runs-browser__empty"}," No past runs found. Adjust filters or complete a job. ",-1)])])):N("",!0)])])])],64))]),t.runsDetailView?(m(),p("div",m9,[a("div",p9,[a("div",g9,[e[49]||(e[49]=ie("Run ",-1)),a("span",y9,b(t.runsDetailView.run_id),1)]),a("div",v9,[t.canKillQueuedRun(t.runsDetailView)?(m(),p("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[21]||(e[21]=d=>t.killQueuedRun(t.runsDetailView))},"Kill")):N("",!0),a("button",{class:"framesync-button framesync-button--compact",onClick:e[22]||(e[22]=d=>t.closeRunsDetailView())},"Close")])]),a("div",b9,[a("button",{type:"button",class:B(["sub-pill",{active:t.runsDetailTab==="summary"}]),onClick:e[23]||(e[23]=d=>t.runsDetailTab="summary")},"Summary",2),a("button",{type:"button",class:B(["sub-pill",{active:t.runsDetailTab==="json"}]),"data-testid":"runs-detail-json-tab",onClick:e[24]||(e[24]=d=>t.runsDetailTab="json")},[e[50]||(e[50]=ie(" JSON ",-1)),t.runDetailJsonDiffCount(t.runsDetailView)?(m(),p("span",_9,b(t.runDetailJsonDiffCount(t.runsDetailView)),1)):N("",!0)],2)]),t.runsDetailTab==="summary"?(m(),p(H,{key:0},[t.runHasOutputMaterial(t.runsDetailView)?(m(),p("div",S9,[e[51]||(e[51]=a("div",{class:"framesync-subtitle"},"Output",-1)),t.runPrimaryVideoUrl(t.runsDetailView)?(m(),p("div",w9,[a("video",{class:"runs-detail-card__video",controls:"",playsinline:"",preload:"metadata",src:t.runPrimaryVideoUrl(t.runsDetailView)},null,8,M9)])):N("",!0),a("div",P9,[t.runPrimaryVideoUrl(t.runsDetailView)?(m(),p("a",{key:0,class:"framesync-button framesync-button--compact",href:t.runPrimaryVideoUrl(t.runsDetailView),target:"_blank",rel:"noopener"},"Open video",8,x9)):N("",!0),t.runPrimaryVideoUrl(t.runsDetailView)?(m(),p("button",{key:1,type:"button",class:"framesync-button framesync-button--compact",onClick:e[25]||(e[25]=d=>t.openRunVideoInEditor(t.runsDetailView))},"Open in editor")):N("",!0),t.runsDetailView.frames_browse_url||t.runsDetailView.frames&&t.runsDetailView.frames.length?(m(),p("button",{key:2,type:"button",class:"framesync-button framesync-button--compact",onClick:e[26]||(e[26]=d=>t.openRunMaterialInBrowser(t.runsDetailView))},"Browse frames"+b(t.runsDetailView.frames&&t.runsDetailView.frames.length?` (${t.runsDetailView.frames.length})`:""),1)):N("",!0),(m(!0),p(H,null,oe((t.runsDetailView.outputs||[]).filter(d=>d.kind==="preview_frame"&&d.url),d=>(m(),p("a",{key:d.url,class:"framesync-button framesync-button--compact",href:d.url,target:"_blank",rel:"noopener"},"Preview frame",8,T9))),128))])])):(m(),p("div",A9,[...e[52]||(e[52]=[a("span",{class:"framesync-subtitle"},"Output",-1),a("span",{class:"runs-detail-card__no-output"},"No video or frames yet",-1)])])),a("div",E9,[a("div",null,[e[53]||(e[53]=a("div",{class:"framesync-subtitle"},"Status",-1)),a("span",{class:B(["runs-status-pill","runs-status-pill--"+t.runsDetailView.status])},b(t.runsDetailView.status),3)]),a("div",null,[e[54]||(e[54]=a("div",{class:"framesync-subtitle"},"Model",-1)),a("div",null,b(t.runsDetailView.model||"-"),1)]),a("div",null,[e[55]||(e[55]=a("div",{class:"framesync-subtitle"},"Frames",-1)),a("div",null,b(t.runFrameProgressLabel(t.runsDetailView)),1)]),a("div",null,[e[56]||(e[56]=a("div",{class:"framesync-subtitle"},"Seed",-1)),a("div",C9,b(t.runsDetailView.seed||"-"),1)]),a("div",null,[e[57]||(e[57]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("div",null,b(t.runsDetailView.steps||"-"),1)]),a("div",null,[e[58]||(e[58]=a("div",{class:"framesync-subtitle"},"Strength",-1)),a("div",null,b(t.runsDetailView.strength||"-"),1)]),a("div",null,[e[59]||(e[59]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("div",null,b(t.runsDetailView.cfg||"-"),1)]),a("div",null,[e[60]||(e[60]=a("div",{class:"framesync-subtitle"},"Tag",-1)),a("div",null,b(t.runsDetailView.tag||"-"),1)]),a("div",null,[e[61]||(e[61]=a("div",{class:"framesync-subtitle"},"GPU",-1)),a("div",null,b(t.runsDetailView._gpu||t.runsDetailView._batchNode&&t.runsDetailView._batchNode.name||"-"),1)]),a("div",k9,[e[62]||(e[62]=a("div",{class:"framesync-subtitle"},"Positive Prompt",-1)),a("div",L9,b(t.runsDetailView.prompt_positive||"-"),1)]),a("div",R9,[e[63]||(e[63]=a("div",{class:"framesync-subtitle"},"Negative Prompt",-1)),a("div",D9,b(t.runsDetailView.prompt_negative||"-"),1)]),a("div",I9,[e[64]||(e[64]=a("div",{class:"framesync-subtitle"},"Notes",-1)),J(a("textarea",{class:"framesync-input runs-detail-card__notes","onUpdate:modelValue":e[27]||(e[27]=d=>t.runsDetailView.notes=d),placeholder:"Add notes..."},null,512),[[ye,t.runsDetailView.notes]]),a("button",{class:"framesync-button runs-detail-card__save",onClick:e[28]||(e[28]=d=>t.saveRunNotes(t.runsDetailView))},"Save notes")])]),t.runsDetailView.frames&&t.runsDetailView.frames.length?(m(),p("div",F9,[a("div",N9,"Frames ("+b(t.runsDetailView.frames.length)+")",1),a("div",O9,[(m(!0),p(H,null,oe(t.runsDetailView.frames.slice(0,24),d=>(m(),p("a",{key:d,href:`/api/runs/${t.runsDetailView.run_id}/frames/${d}`,target:"_blank",rel:"noopener",class:"runs-detail-card__frame-link"},[a("img",{src:`/api/runs/${t.runsDetailView.run_id}/frames/${d}`,class:"runs-detail-card__frame",alt:d},null,8,B9)],8,U9))),128))])])):N("",!0)],64)):(m(),p("div",V9,[a("div",z9,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[29]||(e[29]=d=>t.copyRunDetailJson(t.runsDetailView))},"Copy JSON"),a("label",$9,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[30]||(e[30]=d=>t.runsDetailJsonShowDiffOnly=d)},null,512),[[xi,t.runsDetailJsonShowDiffOnly]]),e[65]||(e[65]=ie(" Show differences only ",-1))]),t.runDetailJsonDiffCount(t.runsDetailView)?(m(),p("span",G9,b(t.runDetailJsonDiffCount(t.runsDetailView))+" value(s) differ from current UI settings ",1)):N("",!0)]),a("div",H9,[a("table",W9,[e[66]||(e[66]=a("thead",null,[a("tr",null,[a("th",null,"Key"),a("th",null,"Run value"),a("th",null,"Current")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(t.runDetailJsonRows(t.runsDetailView),d=>(m(),p("tr",{key:d.path,class:B({"runs-detail-json__row--diff":d.differs})},[a("td",q9,b(d.path),1),a("td",j9,b(d.displayValue),1),a("td",X9,[d.hasCurrent?(m(),p("span",K9,b(d.displayCurrent),1)):(m(),p("span",Y9,"—")),d.differs?(m(),p("span",J9,"≠")):N("",!0)])],2))),128)),t.runDetailJsonRows(t.runsDetailView).length===0?(m(),p("tr",Z9,[a("td",Q9,b(t.runsDetailJsonShowDiffOnly?"No differences from current settings":"No values"),1)])):N("",!0)])])]),a("details",e7,[e[67]||(e[67]=a("summary",null,"Raw JSON",-1)),a("pre",t7,b(t.runDetailJsonPretty(t.runsDetailView)),1)])]))])):N("",!0),t.runsSelected.length>=2?(m(),p("div",i7,[a("div",n7,[a("div",s7,"Compare Runs ("+b(t.runsSelected.length)+")",1),a("div",r7,[a("button",{class:"framesync-button runs-browser__export",onClick:e[31]||(e[31]=d=>t.exportRunComparison("json"))},"JSON"),a("button",{class:"framesync-button runs-browser__export",onClick:e[32]||(e[32]=d=>t.exportRunComparison("csv"))},"CSV"),a("button",{class:"framesync-button",onClick:e[33]||(e[33]=d=>t.runsSelected=[])},"Clear")])]),a("div",o7,[a("table",a7,[a("thead",null,[a("tr",null,[e[68]||(e[68]=a("th",null,"Property",-1)),(m(!0),p(H,null,oe(t.runsSelected,d=>(m(),p("th",{key:d,class:"runs-browser__seed"},b(d),1))),128))])]),a("tbody",null,[(m(!0),p(H,null,oe(t.runsCompareFields,d=>(m(),p("tr",{key:d},[a("td",null,b(d),1),(m(!0),p(H,null,oe(t.runsSelected,u=>(m(),p("td",{key:u,class:"runs-browser__seed"},b(t.getRunProp(u,d)),1))),128))]))),128))])])]),t.runsSelected.length===2&&t.runsPromptDiff?(m(),p("div",l7,[a("div",d7,"Prompt diff ("+b(t.runsPromptDiff.runA)+" vs "+b(t.runsPromptDiff.runB)+")",1),(m(),p(H,null,oe(["positive","negative"],d=>a("div",{key:d,class:"runs-prompt-diff__block"},[a("div",u7,b(d==="positive"?"Positive":"Negative"),1),a("div",c7,[a("div",h7,[(m(!0),p(H,null,oe(t.runsPromptDiff[d],(u,h)=>(m(),p("div",{key:d+"-l-"+h,class:B(["runs-prompt-diff__line","runs-prompt-diff__line--"+u.kind])},b(u.left||" "),3))),128))]),a("div",f7,[(m(!0),p(H,null,oe(t.runsPromptDiff[d],(u,h)=>(m(),p("div",{key:d+"-r-"+h,class:B(["runs-prompt-diff__line","runs-prompt-diff__line--"+u.kind])},b(u.right||" "),3))),128))])])])),64))])):N("",!0)])):N("",!0)])}const cy=nt(a$,[["render",m7]]),p7={name:"StreamView",components:{UiIcon:Kt},props:{app:{type:Object,required:!0}},setup(t){const e=Et(t),i=Qo(null),n=Qo(!1),s=Qo(!1),r=Qo(null);let l=null,o=null,d=null;const u=qa(()=>(Array.isArray(e.streaming&&e.streaming.destinations)?e.streaming.destinations:[]).filter(z=>z&&String(z.target||"").trim())),h=C=>{n.value=!!C,typeof e.setHlsPreviewStreamValid=="function"?e.setHlsPreviewStreamValid(C):e.hlsPreviewStreamValid=!!C},c=qa(()=>{const C=String(e.streaming&&e.streaming.activeStatus||"unknown");return C==="running"?"live":C==="error"?"error":C==="stopped"?"idle":"dim"}),f=qa(()=>{const C=String(e.streaming&&e.streaming.activeStatus||"unknown");return C==="running"?"Streaming":C==="error"?"Error":C==="stopped"?"Stopped":"Standby"}),g=C=>!!(C&&e.streaming&&e.streaming.activeStatus==="running"&&e.streaming.activeDestinationId===C.id),y=C=>C==="srt"?"srt://host:port?streamid=publish:demo":C==="whip"?"https://example.com/whip/endpoint":"rtmp://host/app/stream-key",T=(C="rtmp")=>typeof e.newStreamDestination=="function"?{...e.newStreamDestination(C)}:{id:`stream_draft_${Date.now()}`,name:"Custom Stream",protocol:C||"rtmp",target:"",fps:24,resolution:"1024x576",overlay:"",transition:"",kbps:null,health:"idle"},_=(C="rtmp")=>{r.value=T(C),s.value=!0},v=()=>{s.value=!1,r.value=null},S=()=>{const C=r.value;if(!C||!String(C.target||"").trim())return;const z=typeof e.normalizeStreamDestination=="function"?e.normalizeStreamDestination(C,(e.streaming.destinations||[]).length):C;e.streaming.destinations.push(z),typeof e.saveSessionState=="function"&&e.saveSessionState(),v()},w=C=>typeof e.streamDestinationViewUrl=="function"?e.streamDestinationViewUrl(C):String(C&&C.target||"#"),x=C=>{const z=C&&C.kbps;return Number.isFinite(Number(z))?`${Math.round(Number(z))}`:"—"},k=C=>{const z=C&&C.fps;return Number.isFinite(Number(z))?String(Math.round(Number(z))):"—"},E=C=>{const z=String(C&&C.health||"idle").toLowerCase();return z==="healthy"?"live":z==="degraded"?"warn":z==="error"||z==="offline"?"error":g(C)?"live":"dim"},D=C=>{const z=String(C&&C.health||"").toLowerCase();return z==="healthy"?"Healthy":z==="degraded"?"Degraded":z==="error"?"Error":z==="offline"?"Offline":g(C)?"Live":"Idle"},P=()=>{o&&(clearInterval(o),o=null),l&&typeof l.destroy=="function"&&l.destroy(),l=null;const C=i.value;C&&(typeof C.pause=="function"&&C.pause(),C.removeAttribute("src"),typeof C.load=="function"&&C.load())},M=async()=>{await _c();const C=i.value;if(!C)return;h(!1),l&&typeof l.destroy=="function"&&l.destroy(),l=null;const z=String(e.hlsStreamHref||"/hls/live/deforum.m3u8"),K=z.includes("?")?`${z}&t=${Date.now()}`:`${z}?t=${Date.now()}`,$=()=>h(!0),W=()=>h(!1);if(C.oncanplay=$,C.onplaying=$,C.onerror=W,C.canPlayType("application/vnd.apple.mpegurl")){C.src=K,C.load(),typeof e.autoplayVideo=="function"&&e.autoplayVideo(C);return}const q=typeof window<"u"?window.Hls:null;if(q&&typeof q.isSupported=="function"&&q.isSupported()){const te=q.Events||{MANIFEST_PARSED:"manifest_parsed",ERROR:"error"};l=new q({liveSyncDurationCount:3}),l.loadSource(K),l.attachMedia(C),typeof l.on=="function"&&(l.on(te.MANIFEST_PARSED,()=>{h(!0),typeof e.autoplayVideo=="function"&&e.autoplayVideo(C)}),l.on(te.ERROR,W));return}C.src=K,C.load(),typeof e.autoplayVideo=="function"&&e.autoplayVideo(C)},F=()=>{o&&clearInterval(o),o=setInterval(()=>{n.value||M()},5e3)},I=()=>{d&&clearInterval(d),d=setInterval(()=>{typeof e.refreshStreamStatus=="function"&&e.refreshStreamStatus()},4e3)};return wc(()=>{M(),F(),I(),typeof e.refreshStreamStatus=="function"&&e.refreshStreamStatus()}),Mc(()=>{P(),h(!1),d&&(clearInterval(d),d=null)}),vo(()=>e.hlsStreamHref,()=>{M()}),vo(()=>e.streamSrc,()=>{M()}),{app:e,previewEl:i,previewValid:n,addDestinationOpen:s,draft:r,activeDestinations:u,statusTone:c,streamStatusLabel:f,isActive:g,placeholderFor:y,openAddDestinationForm:_,closeAddDestinationForm:v,saveDestination:S,viewUrlFor:w,formatKbps:x,formatFps:k,healthTone:E,healthLabel:D}}},g7={class:"stream-shell"},y7={class:"framesync-panel stream-card stream-card--preview"},v7={class:"framesync-header"},b7={class:"stream-hls-controls"},_7={key:0,class:"framesync-subtitle",style:{margin:"0"}},S7={class:"stream-preview","data-testid":"stream-hls-preview"},w7={ref:"previewEl",class:"stream-preview__video",muted:"",autoplay:"",playsinline:"",controls:""},M7={class:"stream-endpoints"},P7=["href"],x7={class:"stream-endpoint__value"},T7=["href"],A7={class:"stream-endpoint__value"},E7={key:0,class:"stream-card__status"},C7={class:"stream-active-section"},k7={class:"stream-active-header"},L7={key:0,class:"stream-empty","data-testid":"stream-active-empty"},R7={key:1,class:"stream-active-list","data-testid":"stream-active-list"},D7={class:"stream-active-row__main"},I7={class:"stream-active-row__title"},F7={class:"stream-active-row__target"},N7={class:"stream-active-row__metrics"},O7={class:"stream-metric"},U7={class:"stream-metric"},B7={class:"stream-metric"},V7={class:"stream-active-row__actions"},z7=["href"],$7=["onClick"],G7=["disabled"],H7=["onClick"],W7={key:0,class:"framesync-panel stream-card stream-card--destinations","data-testid":"stream-destination-form"},q7={class:"framesync-header"},j7={class:"stream-quick-add"},X7={class:"stream-destination__grid"},K7={class:"stream-field stream-field--wide"},Y7={class:"stream-field stream-field--wide"},J7=["placeholder"],Z7={class:"stream-field"},Q7={class:"stream-field"},eG={class:"stream-field"},tG={class:"stream-field stream-field--wide"},iG={class:"stream-destination__actions"},nG=["disabled"];function sG(t,e,i,n,s,r){const l=Ne("UiIcon");return m(),p("div",g7,[a("div",y7,[a("div",v7,[e[13]||(e[13]=a("div",{class:"framesync-title"},[ie("Stream "),a("span",{class:"framesync-accent"},"Preview")],-1)),a("span",{class:B(["stream-status-pill",`stream-status-pill--${n.statusTone}`])},b(n.streamStatusLabel),3)]),e[16]||(e[16]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" Configure the live HLS feed and enable main-stage streaming from "),a("strong",null,"Settings → Output"),ie(" or the status strip once the preview is valid. ")],-1)),a("div",b7,[a("span",{class:B(["stream-preview-status",n.previewValid?"stream-preview-status--live":"stream-preview-status--idle"]),"data-testid":"stream-preview-status"},b(n.previewValid?"HLS feed ready":"Waiting for HLS feed…"),3),n.app.hlsWatchEnabled?(m(),p("span",_7," Main stage is showing the live HLS feed. ")):N("",!0)]),a("div",S7,[a("video",w7,null,512)]),a("div",M7,[a("a",{class:"stream-endpoint",href:n.app.hlsStreamHref,target:"_blank",rel:"noreferrer"},[ve(l,{class:"stream-endpoint__icon",name:"broadcast"}),e[14]||(e[14]=a("span",{class:"stream-endpoint__label"},"HLS",-1)),a("code",x7,b(n.app.hlsStreamHref),1)],8,P7),a("a",{class:"stream-endpoint",href:n.app.rtmpStreamHref,target:"_blank",rel:"noreferrer"},[ve(l,{class:"stream-endpoint__icon",name:"broadcast"}),e[15]||(e[15]=a("span",{class:"stream-endpoint__label"},"RTMP",-1)),a("code",A7,b(n.app.rtmpStreamHref),1)],8,T7)]),n.app.streaming.status?(m(),p("div",E7,b(n.app.streaming.status),1)):N("",!0)]),a("div",C7,[a("div",k7,[e[17]||(e[17]=a("div",{class:"framesync-title"},[ie("Active "),a("span",{class:"framesync-accent"},"streams")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"stream-add-destination-btn",onClick:e[0]||(e[0]=o=>n.openAddDestinationForm())}," Add destination ")]),!n.activeDestinations.length&&!n.addDestinationOpen?(m(),p("div",L7," No destinations yet. Add one to forward the live feed. ")):N("",!0),n.activeDestinations.length?(m(),p("div",R7,[(m(!0),p(H,null,oe(n.activeDestinations,o=>(m(),p("div",{key:o.id,class:B(["stream-active-row",{"stream-active-row--live":n.isActive(o)}])},[a("div",D7,[a("div",I7,b(o.name||"Stream"),1),a("code",F7,b(o.target||"—"),1)]),a("div",N7,[a("div",O7,[e[18]||(e[18]=a("span",{class:"stream-metric__label"},"kbps",-1)),a("strong",null,b(n.formatKbps(o)),1)]),a("div",U7,[e[19]||(e[19]=a("span",{class:"stream-metric__label"},"fps",-1)),a("strong",null,b(n.formatFps(o)),1)]),a("div",B7,[e[20]||(e[20]=a("span",{class:"stream-metric__label"},"health",-1)),a("span",{class:B(["stream-health-pill",`stream-health-pill--${n.healthTone(o)}`])},b(n.healthLabel(o)),3)])]),a("div",V7,[a("a",{class:"framesync-button stream-view-link",href:n.viewUrlFor(o),target:"_blank",rel:"noreferrer","data-testid":"stream-view-link"}," View ",8,z7),a("button",{type:"button",class:"framesync-button",onClick:d=>n.app.startStreamDestination(o.id)},b(n.isActive(o)?"Restart":"Start"),9,$7),a("button",{type:"button",class:"framesync-button",disabled:!n.isActive(o),onClick:e[1]||(e[1]=d=>n.app.stopOutboundStream())}," Stop ",8,G7),a("button",{type:"button",class:"framesync-button",onClick:d=>n.app.removeStreamDestination(o.id)}," Remove ",8,H7)])],2))),128))])):N("",!0)]),n.addDestinationOpen?(m(),p("div",W7,[a("div",q7,[e[21]||(e[21]=a("div",{class:"framesync-title"},[ie("Possible "),a("span",{class:"framesync-accent"},"destinations")],-1)),a("button",{type:"button",class:"framesync-button",onClick:e[2]||(e[2]=o=>n.closeAddDestinationForm())},"Cancel")]),a("div",j7,[e[22]||(e[22]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Protocol",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[3]||(e[3]=o=>n.draft.protocol="rtmp")},"RTMP"),a("button",{type:"button",class:"framesync-button",onClick:e[4]||(e[4]=o=>n.draft.protocol="srt")},"SRT"),a("button",{type:"button",class:"framesync-button",onClick:e[5]||(e[5]=o=>n.draft.protocol="whip")},"WHIP")]),a("div",X7,[a("label",K7,[e[23]||(e[23]=a("span",{class:"framesync-subtitle"},"Name",-1)),J(a("input",{"onUpdate:modelValue":e[6]||(e[6]=o=>n.draft.name=o),class:"framesync-input",type:"text",placeholder:"Destination name"},null,512),[[ye,n.draft.name]])]),a("label",Y7,[e[24]||(e[24]=a("span",{class:"framesync-subtitle"},"Target URL",-1)),J(a("input",{"onUpdate:modelValue":e[7]||(e[7]=o=>n.draft.target=o),class:"framesync-input",type:"text",placeholder:n.placeholderFor(n.draft.protocol)},null,8,J7),[[ye,n.draft.target]])]),a("label",Z7,[e[25]||(e[25]=a("span",{class:"framesync-subtitle"},"FPS",-1)),J(a("input",{"onUpdate:modelValue":e[8]||(e[8]=o=>n.draft.fps=o),class:"framesync-input",type:"number",min:"1",max:"60",step:"1"},null,512),[[ye,n.draft.fps,void 0,{number:!0}]])]),a("label",Q7,[e[26]||(e[26]=a("span",{class:"framesync-subtitle"},"Resolution",-1)),J(a("input",{"onUpdate:modelValue":e[9]||(e[9]=o=>n.draft.resolution=o),class:"framesync-input",type:"text",placeholder:"1024x576"},null,512),[[ye,n.draft.resolution]])]),a("label",eG,[e[28]||(e[28]=a("span",{class:"framesync-subtitle"},"Transition",-1)),J(a("select",{"onUpdate:modelValue":e[10]||(e[10]=o=>n.draft.transition=o),class:"framesync-select"},[...e[27]||(e[27]=[a("option",{value:""},"None",-1),a("option",{value:"fade"},"Fade",-1),a("option",{value:"wipe"},"Wipe",-1),a("option",{value:"dissolve"},"Dissolve",-1)])],512),[[Dt,n.draft.transition]])]),a("label",tG,[e[29]||(e[29]=a("span",{class:"framesync-subtitle"},"Overlay image path",-1)),J(a("input",{"onUpdate:modelValue":e[11]||(e[11]=o=>n.draft.overlay=o),class:"framesync-input",type:"text",placeholder:"/absolute/path/to/overlay.png"},null,512),[[ye,n.draft.overlay]])])]),a("div",iG,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"stream-save-destination",disabled:!String(n.draft.target||"").trim(),onClick:e[12]||(e[12]=o=>n.saveDestination())}," Save destination ",8,nG)])])):N("",!0)])}const rG=nt(p7,[["render",sG],["__scopeId","data-v-090e0a6b"]]),oG={name:"StylesSettingsPanel",props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},aG={class:"styles-settings","data-testid":"styles-settings-panel"},lG={class:"rack"},dG={class:"framesync-panel"},uG={class:"framesync-header"},cG={class:"styles-settings__header-actions"},hG={class:"styles-settings__count"},fG=["disabled"],mG={key:0,class:"framesync-subtitle styles-settings__status"},pG={class:"styles-settings__body"},gG={class:"styles-settings__list rack"},yG=["data-testid","onClick"],vG={key:0,class:"styles-settings__thumb"},bG=["src","alt"],_G={key:1,class:"styles-settings__thumb styles-settings__thumb--generating","aria-label":"Generating preview"},SG={key:2,class:"styles-settings__thumb styles-settings__thumb--empty","aria-hidden":"true"},wG={class:"styles-settings__item-copy"},MG={class:"styles-settings__item-title"},PG={class:"styles-settings__item-meta"},xG={key:3,class:"styles-settings__active-tag"},TG={key:0,class:"styles-settings__editor rack"},AG={class:"framesync-panel"},EG={class:"framesync-header"},CG={class:"styles-settings__header-actions"},kG={key:0,class:"styles-settings__example-preview styles-settings__example-preview--generating"},LG={class:"framesync-subtitle"},RG={key:1,class:"styles-settings__example-preview"},DG=["src","alt"],IG={key:2,class:"styles-settings__example-preview styles-settings__example-preview--empty"},FG={class:"styles-settings__field"},NG={class:"styles-settings__field"},OG={class:"styles-settings__field"},UG={class:"styles-settings__field"},BG={class:"styles-settings__field"},VG={class:"framesync-footer styles-settings__editor-actions"},zG=["disabled"],$G=["disabled"],GG={class:"framesync-button styles-settings__upload"};function HG(t,e,i,n,s,r){return m(),p("div",aG,[a("div",lG,[a("div",dG,[a("div",uG,[e[17]||(e[17]=a("div",{class:"framesync-title"},[ie("Prompt "),a("span",{class:"framesync-accent"},"Styles")],-1)),a("div",cG,[a("span",hG,b(t.filteredPromptStyles.length)+" / "+b(t.promptStyles.length),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.promptStylesLoading||t.promptStylesImporting,"data-testid":"prompt-styles-import-forge",onClick:e[0]||(e[0]=l=>t.importPromptStylesFromForge())},b(t.promptStylesImporting?"Importing…":"Import from Forge"),9,fG),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=l=>t.startNewPromptStyle())}," + New style ")])]),e[18]||(e[18]=a("p",{class:"framesync-subtitle styles-settings__intro"}," Select a style to edit its name, description, preview scene, and prompt modifiers. Missing preview images are generated with txt2img using the preview scene plus this style’s append text. ",-1)),t.promptStylesStatus?(m(),p("div",mG,b(t.promptStylesStatus),1)):N("",!0),J(a("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>t.promptStyleSearch=l),type:"search",class:"framesync-input styles-settings__search",placeholder:"Search styles…","data-testid":"prompt-styles-search"},null,512),[[ye,t.promptStyleSearch,void 0,{trim:!0}]])])]),a("div",pG,[a("div",gG,[(m(!0),p(H,null,oe(t.filteredPromptStyles,l=>(m(),p("button",{key:l.id,type:"button",class:B(["styles-settings__item",{active:t.promptStyleEditorId===l.id,selected:t.activePromptStyleId===l.id}]),"data-testid":"prompt-style-item-"+l.id,onClick:o=>t.openPromptStyleEditor(l.id)},[l.exampleImage?(m(),p("div",vG,[a("img",{src:l.exampleImage,alt:l.name,loading:"lazy"},null,8,bG)])):t.promptStylePreviewGeneratingId===l.id?(m(),p("div",_G,[...e[19]||(e[19]=[a("span",{class:"styles-settings__thumb-label"},"Generating…",-1)])])):(m(),p("div",SG)),a("div",wG,[a("div",MG,b(l.name),1),a("div",PG,b(l.description||l.source||"custom"),1)]),t.activePromptStyleId===l.id?(m(),p("span",xG,"Active")):N("",!0)],10,yG))),128))]),t.promptStyleDraft?(m(),p("div",TG,[a("div",AG,[a("div",EG,[e[20]||(e[20]=a("div",{class:"framesync-title"},[ie("Style "),a("span",{class:"framesync-accent"},"editor")],-1)),a("div",CG,[a("button",{type:"button",class:B(["framesync-button framesync-button--compact",{"framesync-button--live":t.activePromptStyleId===t.promptStyleDraft.id}]),"data-testid":"prompt-style-use-active",onClick:e[3]||(e[3]=l=>t.selectActivePromptStyle(t.promptStyleDraft.id))},b(t.activePromptStyleId===t.promptStyleDraft.id?"Active on Prompts":"Use on Prompts"),3),t.activePromptStyleId===t.promptStyleDraft.id?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",onClick:e[4]||(e[4]=l=>t.selectActivePromptStyle(null))}," Clear active ")):N("",!0)])]),t.promptStylePreviewGeneratingId===t.promptStyleDraft.id?(m(),p("div",kG,[a("span",LG,"Generating preview with “"+b(t.promptStyleDraftPreviewPrompt)+"”…",1)])):t.promptStyleDraft.exampleImage?(m(),p("div",RG,[a("img",{src:t.promptStyleDraft.exampleImage,alt:t.promptStyleDraft.name+" example"},null,8,DG)])):(m(),p("div",IG,[...e[21]||(e[21]=[a("span",{class:"framesync-subtitle"},"No preview yet — select this style to generate one automatically.",-1)])])),a("label",FG,[e[22]||(e[22]=a("span",{class:"framesync-subtitle"},"Name",-1)),J(a("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>t.promptStyleDraft.name=l),type:"text",class:"framesync-input","data-testid":"prompt-style-name"},null,512),[[ye,t.promptStyleDraft.name,void 0,{trim:!0}]])]),a("label",NG,[e[23]||(e[23]=a("span",{class:"framesync-subtitle"},"Description",-1)),J(a("textarea",{"onUpdate:modelValue":e[6]||(e[6]=l=>t.promptStyleDraft.description=l),class:"framesync-input",rows:"3",placeholder:"What this style is for, mood, subject matter, references…","data-testid":"prompt-style-description"},null,512),[[ye,t.promptStyleDraft.description]])]),a("label",OG,[e[24]||(e[24]=a("span",{class:"framesync-subtitle"},"Preview scene (txt2img)",-1)),J(a("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>t.promptStyleDraft.previewPrompt=l),type:"text",class:"framesync-input",placeholder:"bunny and cat in space","data-testid":"prompt-style-preview-prompt"},null,512),[[ye,t.promptStyleDraft.previewPrompt,void 0,{trim:!0}]]),e[25]||(e[25]=a("span",{class:"framesync-subtitle styles-settings__field-hint"}," Base scene for the thumbnail; positive and negative append below are added when generating the preview. ",-1))]),a("label",UG,[e[26]||(e[26]=a("span",{class:"framesync-subtitle"},"Positive append",-1)),J(a("textarea",{"onUpdate:modelValue":e[8]||(e[8]=l=>t.promptStyleDraft.positive=l),class:"framesync-input",rows:"3","data-testid":"prompt-style-positive"},null,512),[[ye,t.promptStyleDraft.positive]])]),a("label",BG,[e[27]||(e[27]=a("span",{class:"framesync-subtitle"},"Negative append",-1)),J(a("textarea",{"onUpdate:modelValue":e[9]||(e[9]=l=>t.promptStyleDraft.negative=l),class:"framesync-input",rows:"3","data-testid":"prompt-style-negative"},null,512),[[ye,t.promptStyleDraft.negative]])]),a("div",VG,[a("button",{type:"button",class:"framesync-button","data-testid":"prompt-style-save",onClick:e[10]||(e[10]=l=>t.savePromptStyleDraft())}," Save "),a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"prompt-style-generate-preview",disabled:!!t.promptStylePreviewGeneratingId,onClick:e[11]||(e[11]=l=>t.generatePromptStyleExample(t.promptStyleDraft.id))},b(t.promptStylePreviewGeneratingId===t.promptStyleDraft.id?"Generating…":"Generate preview"),9,zG),a("button",{type:"button",class:"framesync-button",disabled:!t.performance.lastPreviewPath&&!t.generator.lastPath,"data-testid":"prompt-style-example-from-preview",onClick:e[12]||(e[12]=l=>t.setPromptStyleExampleFromPreview(t.promptStyleDraft.id))}," Example from last preview ",8,$G),a("label",GG,[e[28]||(e[28]=ie(" Upload example ",-1)),a("input",{type:"file",accept:"image/*",class:"styles-settings__upload-input",onChange:e[13]||(e[13]=l=>t.onPromptStyleExampleFile(l,t.promptStyleDraft.id))},null,32)]),t.promptStyleDraft.exampleImage?(m(),p("button",{key:0,type:"button",class:"framesync-button",onClick:e[14]||(e[14]=l=>t.clearPromptStyleExample(t.promptStyleDraft.id))}," Clear example ")):N("",!0),t.promptStyles.find(l=>l.id===t.promptStyleDraft.id)?(m(),p("button",{key:2,type:"button",class:"framesync-button","data-testid":"prompt-style-delete",onClick:e[16]||(e[16]=l=>t.deletePromptStyle(t.promptStyleDraft.id))}," Delete ")):(m(),p("button",{key:1,type:"button",class:"framesync-button",onClick:e[15]||(e[15]=l=>{t.promptStyleDraft=null,t.promptStyleEditorId=null})}," Cancel "))])])])):N("",!0)])])}const WG=nt(oG,[["render",HG],["__scopeId","data-v-929085f3"]]),qG={name:"SettingsView",components:{RunsBrowserPanel:cy,StreamView:rG,StylesSettingsPanel:WG,GlassPanel:Cc,UiIcon:Kt},props:{app:{type:Object,required:!0}},setup(t){return Et(t)}},jG={class:"settings-tab-shell"},XG={class:"sub-pills settings-subtabs"},KG={key:0},YG={class:"rack"},JG={class:"engine-main-summary engine-main-summary--glass"},ZG=["disabled","title"],QG={class:"engine-main-card__value engine-main-card__value--model"},eH={class:"engine-main-card__meta"},tH={class:"engine-main-card engine-main-card--stat"},iH={class:"engine-main-card__value"},nH={class:"engine-main-card engine-main-card--stat"},sH={class:"engine-main-card__value"},rH={class:"engine-main-card engine-main-card--stat"},oH={class:"engine-main-card__value engine-main-card__value--small"},aH={class:"engine-main-inline-status-row"},lH={class:"engine-main-inline-status"},dH={class:"engine-advanced-panel framesync-panel"},uH={class:"framesync-row engine-main-grid",style:{"grid-template-columns":"1fr 1fr 0.8fr 0.8fr",gap:"10px","margin-top":"12px"}},cH={class:"framesync-stack"},hH=["value"],fH=["value"],mH={class:"framesync-stack"},pH=["value"],gH=["value"],yH={class:"framesync-stack"},vH=["value","disabled","title"],bH={class:"framesync-stack"},_H=["value"],SH={class:"framesync-row",style:{"grid-template-columns":"repeat(4, 1fr)",gap:"10px","margin-top":"12px"}},wH={class:"framesync-stack"},MH=["value"],PH={class:"framesync-stack"},xH=["value"],TH={class:"framesync-stack"},AH={class:"framesync-stack"},EH={class:"engine-main-inline-status"},CH={class:"lcm-engine-panel","data-testid":"lcm-engine-panel"},kH={class:"lcm-engine-panel__toggle"},LH=["checked"],RH={key:0,class:"lcm-engine-panel__fields"},DH={class:"framesync-stack"},IH=["value"],FH={class:"framesync-stack lcm-engine-panel__lora"},NH=["value"],OH={class:"framesync-footer",style:{"margin-top":"12px"}},UH=["disabled"],BH={class:"engine-seed-control","data-testid":"engine-seed-control"},VH=["value"],zH={key:1,class:"engine-seed-control__random-hint"},$H={class:"framesync-button",style:{cursor:"default"}},GH={class:"framesync-button",style:{cursor:"default"}},HH={class:"engine-model-picker__dialog",role:"dialog","aria-modal":"true","aria-label":"Checkpoint selector"},WH={class:"engine-model-picker__header"},qH={class:"framesync-subtitle engine-model-picker__subtitle"},jH={class:"engine-model-picker__header-actions"},XH=["disabled"],KH={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},YH={class:"sub-pills engine-model-picker__tabs"},JH=["onClick"],ZH={class:"engine-model-picker__tab-count"},QH={key:0,class:"framesync-subtitle engine-model-picker__status"},eW={key:1,class:"framesync-subtitle engine-model-picker__status"},tW={key:2,class:"engine-model-picker__empty"},iW={key:3,class:"engine-model-picker__list"},nW=["disabled","onClick"],sW={class:"engine-model-picker__item-title"},rW={class:"engine-model-picker__item-meta"},oW={key:1},aW={class:"rack"},lW={class:"framesync-panel"},dW={key:0,style:{color:"var(--text-secondary)","margin-top":"12px","font-size":"12px"}},uW={key:1},cW={class:"framesync-footer",style:{"margin-top":"12px"}},hW=["onClick"],fW={class:"framesync-footer",style:{"margin-top":"8px"}},mW={class:"framesync-button"},pW={style:{"margin-top":"12px",background:"var(--bg-0)",border:"1px solid var(--border)","border-radius":"8px",overflow:"hidden"}},gW={class:"table"},yW=["onUpdate:modelValue"],vW=["onUpdate:modelValue"],bW=["onUpdate:modelValue"],_W={label:"Modulation 1–6"},SW=["value"],wW=["value"],MW=["onClick"],PW={class:"rack"},xW={class:"framesync-panel"},TW={class:"framesync-header"},AW={style:{display:"flex",gap:"8px","align-items":"center"}},EW={key:0,style:{"margin-top":"8px",padding:"8px 12px",background:"rgba(127,119,221,0.08)",border:"1px solid var(--accent)","border-radius":"6px","font-size":"12px",color:"var(--accent-text)"}},CW={class:"framesync-row",style:{"grid-template-columns":"repeat(2, 1fr)",gap:"10px","margin-top":"12px"}},kW={class:"framesync-subtitle"},LW={style:{background:"var(--bg-0)",border:"1px solid var(--border)","border-radius":"6px",overflow:"hidden"}},RW={style:{width:"100%","font-size":"11px","border-collapse":"collapse"}},DW={style:{padding:"4px 8px",color:"var(--text-primary)"}},IW={style:{padding:"4px 8px"}},FW={key:0,style:{display:"inline-flex","align-items":"center",gap:"4px"}},NW={style:{background:"var(--bg-2)",border:"1px solid var(--border-strong)","border-radius":"3px",padding:"2px 6px","font-family":"monospace","font-size":"10px",color:"var(--success)"}},OW=["onClick"],UW={key:1,style:{color:"var(--text-dim)"}},BW={style:{padding:"4px 8px"}},VW={key:0,style:{display:"inline-flex","align-items":"center",gap:"4px"}},zW={style:{background:"var(--bg-2)",border:"1px solid var(--border-strong)","border-radius":"3px",padding:"2px 6px","font-size":"10px",color:"var(--warn)"}},$W=["onClick"],GW={key:1,style:{color:"var(--text-dim)"}},HW={style:{padding:"4px 8px","text-align":"center"}},WW=["onClick"],qW={class:"rack"},jW={class:"framesync-panel"},XW={class:"framesync-footer",style:{"margin-top":"12px"}},KW=["onClick"],YW=["disabled"],JW={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},ZW={class:"framesync-stack",style:{"margin-top":"12px"}},QW={class:"framesync-footer",style:{"margin-top":"10px"}},eq={key:0,class:"framesync-subtitle",style:{"margin-top":"8px","text-align":"center"}},tq={class:"framesync-header",style:{"margin-top":"20px","padding-top":"12px","border-top":"1px solid var(--border)"}},iq=["disabled"],nq={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},sq={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"10px"}},rq={class:"framesync-stack"},oq={class:"framesync-stack"},aq={class:"framesync-footer",style:{"margin-top":"8px"}},lq={key:1,class:"framesync-list",style:{"margin-top":"10px","font-size":"11px","padding-left":"16px"}},dq={style:{color:"var(--text-dim)"}},uq=["onClick"],cq=["onClick"],hq={key:2,style:{"margin-top":"10px","font-size":"11px",color:"var(--text-dim)"}},fq={key:3,class:"framesync-subtitle",style:{"margin-top":"8px"}},mq={key:2},pq={class:"rack"},gq={class:"framesync-panel","data-testid":"service-health-panel"},yq={class:"framesync-header"},vq=["disabled"],bq={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},_q={class:"service-health-grid"},Sq={class:"service-health-card"},wq={class:"service-health-card__head"},Mq={class:"service-health-card"},Pq={class:"service-health-card__head"},xq={class:"service-health-card__meta"},Tq={key:0},Aq={key:1},Eq={class:"service-health-card"},Cq={class:"service-health-card__head"},kq={class:"service-health-card__meta"},Lq={class:"service-health-card"},Rq={class:"service-health-card__head"},Dq={class:"service-health-card__meta"},Iq={key:0},Fq={key:1},Nq={key:2},Oq={class:"service-health-card"},Uq={class:"service-health-card__head"},Bq={class:"framesync-subtitle",style:{"margin-top":"10px"}},Vq={class:"framesync-panel infra-panel","data-testid":"infrastructure-panel"},zq={class:"framesync-header"},$q=["disabled"],Gq={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},Hq={class:"infra-section","data-testid":"infra-mediator-list"},Wq={key:0,class:"infra-panel__empty"},qq={key:1,class:"infra-mediator-list"},jq=["data-testid"],Xq={class:"infra-mediator-card__head"},Kq={key:0,class:"infra-mediator-card__meta"},Yq={key:1,class:"infra-panel__empty"},Jq={key:2,class:"infra-mediator-card","data-testid":"infra-mediator-card"},Zq={class:"infra-mediator-card__head"},Qq={class:"infra-mediator-card__source"},ej={class:"infra-mediator-card__meta"},tj={key:3,class:"infra-panel__empty"},ij={class:"infra-section"},nj={key:0,class:"infra-panel__empty"},sj={key:1,class:"infra-panel__empty"},rj={key:2,class:"gpu-pool-table-wrap","data-testid":"infra-transcoder-table"},oj={class:"gpu-pool-table infra-transcoder-table"},aj={class:"infra-address"},lj={key:0,class:"infra-address-sub"},dj={class:"framesync-panel","data-testid":"gpu-pool-panel"},uj={class:"framesync-header"},cj={class:"framesync-checkbox gpu-pool-enable"},hj={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr 1fr",gap:"10px","margin-top":"12px"}},fj={class:"framesync-stack"},mj=["disabled"],pj={class:"framesync-stack"},gj={class:"gpu-pool-healthy-count"},yj={class:"framesync-stack",style:{"justify-content":"flex-end"}},vj=["disabled"],bj={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},_j={class:"framesync-row",style:{"grid-template-columns":"2fr 1fr",gap:"10px","margin-top":"10px"}},Sj={class:"framesync-stack"},wj=["disabled"],Mj=["value"],Pj={class:"framesync-stack",style:{"justify-content":"flex-end"}},xj=["disabled"],Tj={key:0,class:"framesync-subtitle",style:{"margin-top":"10px"}},Aj={class:"gpu-pool-add",style:{"margin-top":"14px",padding:"12px",border:"1px solid var(--border)","border-radius":"10px"}},Ej={class:"framesync-row",style:{"grid-template-columns":"2fr 1fr 1fr",gap:"8px","margin-top":"8px"}},Cj=["disabled"],kj=["disabled"],Lj=["disabled"],Rj={key:0,class:"framesync-footer",style:{"margin-top":"8px","align-items":"center",gap:"8px","flex-wrap":"wrap"}},Dj=["disabled"],Ij=["value"],Fj=["disabled"],Nj={class:"framesync-footer",style:{"margin-top":"8px"}},Oj=["disabled"],Uj={key:1,style:{"margin-top":"14px",display:"grid",gap:"10px"}},Bj={class:"gpu-node-card__header"},Vj={class:"gpu-node-card__identity"},zj={style:{"font-size":"12px"}},$j={style:{"font-size":"10px",color:"var(--text-dim)"}},Gj={style:{"font-size":"10px",color:"var(--text-dim)"}},Hj={key:0,style:{"font-size":"10px",color:"var(--text-dim)"}},Wj={key:1,style:{"font-size":"10px",color:"var(--text-dim)"}},qj={class:"gpu-node-card__stats"},jj={title:"Current model",style:{"font-size":"10px",color:"var(--text-secondary)","max-width":"140px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Xj={title:"VRAM",style:{"font-size":"10px",color:"var(--text-dim)"}},Kj={title:"GPU utilization",style:{"font-size":"10px",color:"var(--text-dim)"}},Yj={title:"Active jobs",style:{"font-size":"10px",color:"var(--text-dim)"}},Jj={key:0,title:"Forge queue (running/pending)",style:{"font-size":"10px",color:"var(--text-dim)"}},Zj={key:1,title:"Forge progress",style:{"font-size":"10px",color:"var(--text-dim)"}},Qj={class:"framesync-footer",style:{"flex-wrap":"wrap",gap:"4px",margin:"0"}},eX=["onClick"],tX=["onClick"],iX=["onClick"],nX=["onClick"],sX=["onClick"],rX=["onClick"],oX={key:0,class:"framesync-footer",style:{margin:"8px 0 0","align-items":"center",gap:"8px","flex-wrap":"wrap"}},aX=["value"],lX={key:1,class:"gpu-node-log"},dX={key:0,class:"gpu-node-log__empty"},uX={class:"gpu-node-log__path"},cX={class:"gpu-node-log__duration"},hX={key:0,class:"gpu-node-log__error"},fX={class:"gpu-node-log__time"},mX={key:2,style:{"margin-top":"14px","font-size":"12px",color:"var(--text-dim)"}},pX={key:3,class:"framesync-subtitle",style:{"margin-top":"10px"}},gX={class:"gpu-forge-modal__dialog"},yX={class:"gpu-forge-modal__header"},vX={class:"framesync-subtitle gpu-forge-modal__subtitle"},bX={class:"framesync-row gpu-forge-modal__identity",style:{"grid-template-columns":"1fr 1.6fr 0.6fr",gap:"10px","margin-top":"12px"}},_X={class:"framesync-stack"},SX=["disabled"],wX={class:"framesync-stack"},MX=["disabled"],PX={class:"framesync-stack"},xX=["disabled"],TX={class:"framesync-footer",style:{"margin-top":"12px"}},AX=["disabled"],EX={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},CX=["disabled"],kX=["disabled"],LX={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},RX={class:"framesync-stack"},DX={class:"framesync-stack"},IX={class:"forge-tab__endpoint"},FX={class:"framesync-subtitle forge-tab__note"},NX={class:"gpu-forge-modal__mediator","data-testid":"gpu-forge-mediator-section"},OX={class:"framesync-subtitle forge-tab__note",style:{"margin-top":"6px"}},UX={class:"framesync-row",style:{"grid-template-columns":"1.4fr 0.8fr 0.8fr",gap:"10px","margin-top":"10px"}},BX={class:"framesync-stack"},VX=["disabled"],zX={class:"framesync-stack"},$X=["disabled"],GX={class:"framesync-stack"},HX=["disabled"],WX={class:"framesync-footer",style:{"margin-top":"10px","align-items":"center","flex-wrap":"wrap",gap:"8px"}},qX=["disabled"],jX={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},XX={class:"framesync-stack"},KX=["value"],YX={class:"framesync-stack"},JX=["value"],ZX={class:"framesync-row",style:{"grid-template-columns":"1fr",gap:"10px","margin-top":"12px"}},QX={class:"framesync-stack"},eK=["value"],tK={class:"framesync-row forge-tab__options-grid",style:{"grid-template-columns":"repeat(3, 1fr)",gap:"10px","margin-top":"12px"}},iK={class:"framesync-stack"},nK={class:"framesync-stack"},sK={class:"framesync-stack"},rK={key:0,class:"forge-tab__metadata"},oK={class:"chips",style:{"margin-top":"8px"}},aK={key:1,class:"framesync-subtitle",style:{"margin-top":"12px"}},lK={key:3},dK={key:4,class:"settings-plugins-tab","data-testid":"settings-plugins-registry"},uK={class:"rack"},cK={class:"framesync-panel"},hK={class:"framesync-header"},fK={key:0,class:"framesync-list settings-plugins-tab__list"},mK={key:0},pK={key:1,class:"framesync-subtitle settings-plugins-tab__empty"},gK={key:5},yK={class:"rack"},vK={class:"framesync-panel"},bK={class:"framesync-header"},_K={key:0,style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},SK={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},wK={class:"framesync-stack"},MK={class:"framesync-stack"},PK=["value"],xK={class:"framesync-subtitle",style:{"margin-top":"14px"}},TK={key:0,class:"framesync-list",style:{"font-size":"11px","padding-left":"16px","margin-top":"6px"}},AK={key:0,style:{color:"var(--warn)"}},EK={key:1,style:{"font-size":"11px",color:"var(--text-dim)","margin-top":"6px"}},CK={class:"framesync-footer",style:{"margin-top":"8px"}},kK={key:2,class:"framesync-list",style:{"margin-top":"8px","font-size":"11px","padding-left":"16px"}},LK=["onClick"],RK={key:3,class:"framesync-subtitle",style:{"margin-top":"10px",color:"var(--success)"}},DK={key:4,style:{"font-size":"11px","margin-top":"6px"}},IK=["onClick"],FK={key:5,style:{"font-size":"11px",color:"var(--text-dim)","margin-top":"6px"}},NK={key:6,"data-testid":"settings-output-stream"},OK={key:7,class:"system-runs-tab","data-testid":"settings-system-runs"};function UK(t,e,i,n,s,r){const l=Ne("GlassPanel"),o=Ne("UiIcon"),d=Ne("StylesSettingsPanel"),u=Ne("StreamView"),h=Ne("RunsBrowserPanel");return m(),p("div",jG,[a("div",XG,[a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="ENGINE"}]),onClick:e[0]||(e[0]=c=>t.switchSubTab("SETTINGS","ENGINE"))},"ENGINE",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="OUTPUT"}]),onClick:e[1]||(e[1]=c=>t.switchSubTab("SETTINGS","OUTPUT"))},"OUTPUT",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="GPUS"}]),onClick:e[2]||(e[2]=c=>t.switchSubTab("SETTINGS","GPUS"))},"GPUS",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="RUNS"||t.currentSubTab.SETTINGS==="SYSTEM"}]),onClick:e[3]||(e[3]=c=>t.switchSubTab("SETTINGS","RUNS"))},"RUNS",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="MIDI"}]),onClick:e[4]||(e[4]=c=>t.switchSubTab("SETTINGS","MIDI"))},"CONTROLLERS / MIDI",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="STYLES"}]),onClick:e[5]||(e[5]=c=>t.switchSubTab("SETTINGS","STYLES"))},"STYLES",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="PLUGINS"}]),onClick:e[6]||(e[6]=c=>t.switchSubTab("SETTINGS","PLUGINS"))},"PLUGINS",2),a("button",{class:B(["sub-pill",{active:t.currentSubTab.SETTINGS==="COLLAB"}]),onClick:e[7]||(e[7]=c=>t.switchSubTab("SETTINGS","COLLAB"))},"COLLAB",2)]),t.currentSubTab.SETTINGS==="ENGINE"?(m(),p("div",KG,[a("div",YG,[ve(l,{size:"lg",class:"engine-model-glass"},{header:Ni(()=>[...e[84]||(e[84]=[ie("Checkpoint",-1)])]),default:Ni(()=>[a("div",JG,[a("button",{type:"button",class:"engine-main-card engine-main-card--wide engine-main-card--picker",disabled:t.forge.switching,title:t.engineCurrentModelName?"Change checkpoint":"Select checkpoint","data-testid":"engine-model-picker",onClick:e[8]||(e[8]=c=>t.openEngineModelPicker())},[e[85]||(e[85]=a("div",{class:"framesync-subtitle"},"Current model",-1)),a("div",QG,b(t.engineCurrentModelName||"Select checkpoint"),1),a("div",eH,b(t.engineOptimizedProfileLabel)+" · "+b(t.engineCurrentModelFamilyLabel),1),e[86]||(e[86]=a("div",{class:"engine-main-card__hint"},"Click to browse checkpoints",-1))],8,ZG),a("div",tH,[e[87]||(e[87]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("div",iH,b(t.engineCurrentCfgScale.toFixed(1)),1)]),a("div",nH,[e[88]||(e[88]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("div",sH,b(t.engineCurrentSteps),1)]),a("div",rH,[e[89]||(e[89]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),a("div",oH,b(t.deforumSettings.sampler||"—"),1)])]),a("div",aH,[a("span",{class:B(["model-status-pill","model-"+t.modelStatusKind])},[e[90]||(e[90]=a("span",{class:"model-status-dot"},null,-1)),ie(" "+b(t.modelStatusLabel),1)],2),a("span",lH,b(t.deforumSettingsStatus||"Idle"),1)])]),_:1}),a("details",dH,[e[105]||(e[105]=a("summary",{class:"engine-advanced-panel__summary"},"Advanced sampling & resolution",-1)),a("div",uH,[a("div",cH,[e[91]||(e[91]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.sampler,onChange:e[9]||(e[9]=c=>t.onEngineSamplerChange(c.target.value))},[(m(!0),p(H,null,oe(t.engineSamplerOptions,c=>(m(),p("option",{key:"engine-sampler-"+c,value:c},b(c),9,fH))),128))],40,hH)]),a("div",mH,[e[92]||(e[92]=a("div",{class:"framesync-subtitle"},"Scheduler",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.scheduler,onChange:e[10]||(e[10]=c=>t.onEngineSchedulerChange(c.target.value))},[(m(!0),p(H,null,oe(t.engineSchedulerOptions,c=>(m(),p("option",{key:"engine-scheduler-"+c,value:c},b(c),9,gH))),128))],40,pH)]),a("div",yH,[e[93]||(e[93]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("input",{type:"number",class:"framesync-input",value:t.engineCurrentSteps,min:"1",max:"150",step:"1",disabled:t.lcmEngineEnabled,title:t.lcmEngineEnabled?"Steps are controlled by LCM Engine":"","data-testid":"engine-steps-input",onInput:e[11]||(e[11]=c=>t.onEngineStepsChange(c.target.value))},null,40,vH)]),a("div",bH,[e[94]||(e[94]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("input",{type:"number",class:"framesync-input",value:t.engineCurrentCfgScale,min:"0",max:"30",step:"0.1",onInput:e[12]||(e[12]=c=>t.onEngineCfgScaleChange(c.target.value))},null,40,_H)])]),a("div",SH,[a("div",wH,[e[96]||(e[96]=a("div",{class:"framesync-subtitle"},"Resolution",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.W+"x"+t.deforumSettings.H,onChange:e[13]||(e[13]=c=>t.onEngineResolutionChange(c.target.value))},[...e[95]||(e[95]=[a("option",{value:"512x512"},"512×512",-1),a("option",{value:"960x540"},"960×540",-1),a("option",{value:"1024x1024"},"1024×1024",-1)])],40,MH)]),a("div",PH,[e[98]||(e[98]=a("div",{class:"framesync-subtitle"},"Global FPS",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.fps,onChange:e[14]||(e[14]=c=>t.setGlobalFps(+c.target.value))},[...e[97]||(e[97]=[a("option",{value:8},"8",-1),a("option",{value:12},"12",-1),a("option",{value:24},"24",-1),a("option",{value:30},"30",-1)])],40,xH)]),a("div",TH,[e[99]||(e[99]=a("div",{class:"framesync-subtitle"},"Model source",-1)),a("span",{class:B(["model-source-pill","src-"+(t.forge.modelsSource||"placeholder")])},b(t.forge.modelsSource||"unknown"),3)]),a("div",AH,[e[100]||(e[100]=a("div",{class:"framesync-subtitle"},"Status",-1)),a("div",EH,b(t.deforumSettingsStatus||"Idle"),1)])]),a("div",CH,[a("label",kH,[a("input",{type:"checkbox",checked:t.lcmEngineEnabled,"data-testid":"lcm-engine-toggle",onChange:e[15]||(e[15]=c=>t.setLcmEngineEnabled(c.target.checked))},null,40,LH),e[101]||(e[101]=a("span",null,"LCM Engine",-1))]),t.lcmEngineEnabled?(m(),p("div",RH,[a("div",DH,[e[102]||(e[102]=a("div",{class:"framesync-subtitle"},"LCM steps",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"lcm-engine-steps",min:"1",max:"20",step:"1",value:t.lcmEngine.steps,onInput:e[16]||(e[16]=c=>t.onLcmEngineStepsChange(c.target.value))},null,40,IH)]),a("div",FH,[e[103]||(e[103]=a("div",{class:"framesync-subtitle"},"LCM LoRA tag",-1)),a("input",{type:"text",class:"framesync-input","data-testid":"lcm-engine-lora",value:t.lcmEngine.loraTag,onInput:e[17]||(e[17]=c=>t.onLcmEngineLoraChange(c.target.value))},null,40,NH)])])):N("",!0)]),a("div",OH,[a("button",{class:"framesync-button",disabled:t.forge.switching||!t.engineCurrentModelName,onClick:e[18]||(e[18]=c=>t.reapplyEngineModelDefaults())},"Optimize for model",8,UH),a("div",BH,[e[104]||(e[104]=a("span",{class:"engine-seed-control__label"},"Seed",-1)),a("button",{type:"button",class:B(["chip chip--compact",{active:t.seedRandomEnabled}]),"data-testid":"seed-random-toggle",onClick:e[19]||(e[19]=c=>t.setSeedRandomEnabled(!t.seedRandomEnabled))}," Random ",2),t.seedRandomEnabled?(m(),p("span",zH,"−1 · random each run")):(m(),p("input",{key:0,type:"number",class:"framesync-input engine-seed-control__input","data-testid":"seed-value-input",min:"0",max:"2147483647",step:"1",value:t.deforumSettings.seed,onInput:e[20]||(e[20]=c=>t.onDeforumSeedInput(c.target.value))},null,40,VH))]),a("span",$H,b(t.deforumSettings.W)+"×"+b(t.deforumSettings.H)+" @ "+b(t.deforumSettings.fps)+" fps",1),a("span",GH,"Profile: "+b(t.engineOptimizedProfileLabel),1)])]),t.engineModelPickerOpen?(m(),p("div",{key:0,class:"engine-model-picker",onClick:e[23]||(e[23]=(...c)=>t.onEngineModelPickerBackdropClick&&t.onEngineModelPickerBackdropClick(...c))},[a("div",HH,[a("div",WH,[a("div",null,[e[106]||(e[106]=a("div",{class:"framesync-title"},[ie("Select "),a("span",{class:"framesync-accent"},"Checkpoint")],-1)),a("div",qH,b(t.forge.modelsSource?"Source: "+(t.forge.modelsSource||"unknown"):"Loading checkpoints from Forge"),1)]),a("div",jH,[a("button",{type:"button",class:"framesync-button",disabled:t.forge.loading,onClick:e[21]||(e[21]=c=>t.refreshForgeModels())},[t.forge.loading?(m(),p("span",KH,[...e[107]||(e[107]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,XH),a("button",{type:"button",class:"framesync-button",onClick:e[22]||(e[22]=c=>t.closeEngineModelPicker())},"Close")])]),a("div",YH,[(m(!0),p(H,null,oe(t.engineModelFamilyTabs,c=>(m(),p("button",{key:"engine-model-tab-"+c.key,type:"button",class:B(["sub-pill",{active:t.engineModelPickerTab===c.key}]),onClick:f=>t.setEngineModelPickerTab(c.key)},[ie(b(c.label)+" ",1),a("span",ZH,b((t.groupedEngineModels[c.key]||[]).length),1)],10,JH))),128))]),t.forge.switching?(m(),p("div",QH,"Switching checkpoint…")):t.forge.loading&&!t.forge.models.length?(m(),p("div",eW,"Loading checkpoints…")):t.activeEngineModelList.length?(m(),p("div",iW,[(m(!0),p(H,null,oe(t.activeEngineModelList,c=>(m(),p("button",{key:c.model_name||c.title,type:"button",class:B(["engine-model-picker__item",{active:t.normalizeModelName(c.model_name||c.title)===t.engineCurrentModelName}]),disabled:t.forge.switching,onClick:f=>t.selectEngineModel(c)},[a("span",sW,b(c.title||c.model_name),1),a("span",rW,b(c.model_name||c.title),1)],10,nW))),128))])):(m(),p("div",tW," No checkpoints in this family. Try another tab or refresh the model list. "))])])):N("",!0)])])):t.currentSubTab.SETTINGS==="MIDI"?(m(),p("div",oW,[a("div",aW,[a("div",lW,[e[112]||(e[112]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Controllers "),a("span",{class:"framesync-accent"},"/ MIDI")])],-1)),t.midi.supported?(m(),p("div",uW,[a("div",cW,[(m(!0),p(H,null,oe(t.midi.devices,c=>(m(),p("button",{class:B(["framesync-button",{active:t.midi.selected===c.id}]),key:c.id,onClick:f=>t.midi.selected=c.id},b(c.name),11,hW))),128)),a("button",{class:"framesync-button",onClick:e[24]||(e[24]=c=>t.scanMidi())},"Rescan")]),a("div",fW,[e[108]||(e[108]=a("button",{class:"framesync-button"},"Learn mode",-1)),a("button",{class:"framesync-button",onClick:e[25]||(e[25]=(...c)=>t.addMidiMapping&&t.addMidiMapping(...c))},"+ Add Mapping"),a("button",mW,"Status: "+b(t.midiStatus),1)]),e[111]||(e[111]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" Quick targets: "),a("strong",null,"Modulation 1–6"),ie(" map to the LIVE drawer performance widgets. ")],-1)),a("div",pW,[a("table",gW,[e[110]||(e[110]=a("thead",null,[a("tr",null,[a("th",null,"Control"),a("th",null,"CC"),a("th",null,"Target"),a("th",null,"Actions")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(t.midi.mappings,(c,f)=>(m(),p("tr",{key:"midi"+f},[a("td",null,[J(a("input",{class:"framesync-input","onUpdate:modelValue":g=>c.control=g,onChange:e[26]||(e[26]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"100px",padding:"4px"}},null,40,yW),[[ye,c.control]])]),a("td",null,[J(a("input",{class:"framesync-input",type:"number","onUpdate:modelValue":g=>c.cc=g,onChange:e[27]||(e[27]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"60px",padding:"4px"}},null,40,vW),[[ye,c.cc,void 0,{number:!0}]])]),a("td",null,[J(a("select",{class:"framesync-select","onUpdate:modelValue":g=>c.key=g,onChange:e[28]||(e[28]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"120px",padding:"4px"}},[e[109]||(e[109]=a("option",{value:""},"None",-1)),a("optgroup",_W,[(m(),p(H,null,oe(6,g=>a("option",{key:"modslot-"+g,value:"mod_slot_"+g},b("Modulation "+g),9,SW)),64))]),(m(!0),p(H,null,oe(t.modulationTargets,g=>(m(),p("option",{key:"mopt"+g.key,value:g.key},b(g.label),9,wW))),128))],40,bW),[[Dt,c.key]])]),a("td",null,[a("button",{class:"framesync-button",onClick:g=>t.deleteMidiMapping(f),style:{padding:"4px 8px",cursor:"pointer"}},"Delete",8,MW)])]))),128))])])])])):(m(),p("div",dW,"WebMIDI not supported or not enabled."))])]),a("div",PW,[a("div",xW,[a("div",TW,[e[113]||(e[113]=a("div",{class:"framesync-title"},[ie("Parameter "),a("span",{class:"framesync-accent"},"Bindings")],-1)),a("div",AW,[a("button",{class:B(["framesync-button",{active:t.bindingLearnMode}]),onClick:e[29]||(e[29]=(...c)=>t.toggleBindingLearn&&t.toggleBindingLearn(...c))},b(t.bindingLearnMode?"Stop learn":"Learn"),3),a("button",{class:"framesync-button",onClick:e[30]||(e[30]=(...c)=>t.resetBindings&&t.resetBindings(...c))},"Defaults")])]),t.bindingLearnMode?(m(),p("div",EW," Learn mode active. Press a key or move a MIDI controller, then click a parameter to bind. ")):N("",!0),a("div",CW,[(m(!0),p(H,null,oe(t.bindingGroups,c=>(m(),p("div",{class:"framesync-stack",key:c.label},[a("div",kW,b(c.label),1),a("div",LW,[a("table",RW,[e[114]||(e[114]=a("thead",null,[a("tr",{style:{color:"var(--text-dim)","border-bottom":"1px solid var(--border)"}},[a("th",{style:{"text-align":"left",padding:"4px 8px"}},"Parameter"),a("th",{style:{"text-align":"left",padding:"4px 8px"}},"Key"),a("th",{style:{"text-align":"left",padding:"4px 8px"}},"MIDI CC"),a("th",{style:{padding:"4px 8px"}},"Actions")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(c.items,f=>(m(),p("tr",{key:f.key,style:{"border-bottom":"1px solid var(--border)"}},[a("td",DW,b(f.label),1),a("td",IW,[t.getKeyBinding(f.key)?(m(),p("span",FW,[a("kbd",NW,b(t.getKeyBinding(f.key)),1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Clear key binding",onClick:g=>t.clearKeyBinding(f.key)},[ve(o,{name:"close"})],8,OW)])):(m(),p("span",UW,"—"))]),a("td",BW,[t.getMidiBinding(f.key)?(m(),p("span",VW,[a("span",zW,"CC "+b(t.getMidiBinding(f.key)),1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Clear MIDI binding",onClick:g=>t.clearMidiBinding(f.key)},[ve(o,{name:"close"})],8,$W)])):(m(),p("span",GW,"—"))]),a("td",HW,[t.bindingLearnMode?(m(),p("button",{key:0,class:"framesync-button framesync-button--compact",onClick:g=>t.bindingTargetKey=f.key},"Bind here",8,WW)):N("",!0)])]))),128))])])])]))),128))])])]),a("div",qW,[a("div",jW,[e[121]||(e[121]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Preset "),a("span",{class:"framesync-accent"},"Management")])],-1)),a("div",XW,[(m(!0),p(H,null,oe(t.availablePresets,c=>(m(),p("button",{class:B(["framesync-button",{active:t.currentPreset===c}]),key:c,onClick:f=>t.loadPreset(c)},b(c),11,KW))),128)),a("button",{class:"framesync-button",disabled:t.presetsLoading,onClick:e[31]||(e[31]=(...c)=>t.refreshPresets&&t.refreshPresets(...c))},[t.presetsLoading?(m(),p("span",JW,[...e[115]||(e[115]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,YW)]),a("div",ZW,[e[116]||(e[116]=a("div",{class:"framesync-subtitle"},"New preset name",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[32]||(e[32]=c=>t.newPresetName=c),placeholder:"my-preset"},null,512),[[ye,t.newPresetName]])]),a("div",QW,[a("button",{class:"framesync-button",onClick:e[33]||(e[33]=(...c)=>t.saveCurrentPreset&&t.saveCurrentPreset(...c))},"Save current as preset"),t.currentPreset?(m(),p("button",{key:0,class:"framesync-button framesync-button--danger",onClick:e[34]||(e[34]=c=>t.deletePreset(t.currentPreset))},"Delete "+b(t.currentPreset),1)):N("",!0)]),t.presetStatus?(m(),p("div",eq,b(t.presetStatus),1)):N("",!0),a("div",tq,[e[118]||(e[118]=a("div",{class:"framesync-title"},[ie("Shared "),a("span",{class:"framesync-accent"},"Presets")],-1)),a("button",{class:"framesync-button",disabled:t.sharedPresetsLoading,onClick:e[35]||(e[35]=(...c)=>t.refreshSharedPresets&&t.refreshSharedPresets(...c))},[t.sharedPresetsLoading?(m(),p("span",nq,[...e[117]||(e[117]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,iq)]),a("div",sq,[a("div",rq,[e[119]||(e[119]=a("div",{class:"framesync-subtitle"},"Share as",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[36]||(e[36]=c=>t.sharedPresetName=c),placeholder:"shared-preset-name"},null,512),[[ye,t.sharedPresetName]])]),a("div",oq,[e[120]||(e[120]=a("div",{class:"framesync-subtitle"},"Your name",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[37]||(e[37]=c=>t.collab.userName=c),placeholder:"Performer",onChange:e[38]||(e[38]=(...c)=>t.saveCollabUserName&&t.saveCollabUserName(...c))},null,544),[[ye,t.collab.userName]])])]),a("div",aq,[a("button",{class:"framesync-button",onClick:e[39]||(e[39]=(...c)=>t.shareCurrentPreset&&t.shareCurrentPreset(...c))},"Share current state")]),t.sharedPresets.length?(m(),p("ul",lq,[(m(!0),p(H,null,oe(t.sharedPresets,c=>(m(),p("li",{key:c.name,style:{"margin-bottom":"6px",display:"flex","flex-wrap":"wrap",gap:"6px","align-items":"center"}},[a("strong",null,b(c.name),1),a("span",dq,"by "+b(c.sharedBy),1),a("button",{class:"framesync-button framesync-button--compact",onClick:f=>t.loadSharedPreset(c.name)},"Load",8,uq),a("button",{class:"framesync-button framesync-button--danger framesync-button--compact",onClick:f=>t.deleteSharedPreset(c.name)},"Delete",8,cq)]))),128))])):(m(),p("div",hq,"No shared presets yet.")),t.sharedPresetsStatus?(m(),p("div",fq,b(t.sharedPresetsStatus),1)):N("",!0)])])])):t.currentSubTab.SETTINGS==="GPUS"?(m(),p("div",mq,[a("div",pq,[a("div",gq,[a("div",yq,[e[123]||(e[123]=a("div",{class:"framesync-title"},[ie("Service "),a("span",{class:"framesync-accent"},"Health")],-1)),a("button",{class:"framesync-button framesync-button--compact",onClick:e[40]||(e[40]=(...c)=>t.refreshServiceHealth&&t.refreshServiceHealth(...c)),disabled:t.serviceHealth.loading},[t.serviceHealth.loading?(m(),p("span",bq,[...e[122]||(e[122]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,vq)]),a("div",_q,[a("div",Sq,[a("div",wq,[e[124]||(e[124]=a("strong",null,"Web",-1)),a("span",{class:B(["gpu-status-pill",t.serviceHealth.web&&t.serviceHealth.web.ok?"st-healthy":"st-unhealthy"])},b(t.serviceHealth.web&&t.serviceHealth.web.ok?"healthy":"down"),3)]),e[125]||(e[125]=a("div",{class:"service-health-card__meta"},[ie("HTTP "),a("code",null,"/health")],-1))]),a("div",Mq,[a("div",Pq,[e[126]||(e[126]=a("strong",null,"HLS",-1)),a("span",{class:B(["gpu-status-pill",t.serviceHealth.hls&&t.serviceHealth.hls.updated?t.serviceHealth.hls.ageMs!=null&&t.serviceHealth.hls.ageMs<15e3?"st-healthy":t.serviceHealth.hls.ageMs!=null&&t.serviceHealth.hls.ageMs<6e4?"st-unknown":"st-unhealthy":"st-unknown"])},b(t.serviceHealth.hls&&t.serviceHealth.hls.updated?"ok":"unknown"),3)]),a("div",xq,[e[127]||(e[127]=ie(" Playlist updated: ",-1)),t.serviceHealth.hls&&t.serviceHealth.hls.updated?(m(),p("span",Tq,b(Math.round((t.serviceHealth.hls.ageMs||0)/1e3))+"s ago ",1)):(m(),p("span",Aq,"—"))])]),a("div",Eq,[a("div",Cq,[e[128]||(e[128]=a("strong",null,"SD-Forge",-1)),a("span",{class:B(["gpu-status-pill",t.apiHealth.sdForge&&t.apiHealth.sdForge.available?"st-healthy":"st-unhealthy"])},b(t.apiHealth.sdForge&&t.apiHealth.sdForge.available?"available":"offline"),3)]),a("div",kq,"Last checked: "+b(t.apiHealth.sdForge&&t.apiHealth.sdForge.lastChecked?t.formatDate(t.apiHealth.sdForge.lastChecked):"—"),1)]),a("div",Lq,[a("div",Rq,[e[129]||(e[129]=a("strong",null,"Mediator",-1)),a("span",{class:B(["gpu-status-pill",t.mediatorHealthSummary.ok?"st-healthy":"st-unhealthy"])},b(t.mediatorHealthSummary.label),3)]),a("div",Dq,[t.sdForgeGpuNodes.length?(m(),p("span",Iq,b(t.sdForgeGpuNodes.length)+" forge instance(s)",1)):t.infrastructure.mediator?(m(),p("span",Fq,[a("code",null,b(t.infrastructure.mediator.address),1)])):(m(),p("span",Nq,"—"))])]),a("div",Oq,[a("div",Uq,[e[130]||(e[130]=a("strong",null,"Streamer",-1)),a("span",{class:B(["gpu-status-pill",t.serviceHealth.stream&&t.serviceHealth.stream.status==="running"?"st-healthy":(t.serviceHealth.stream&&t.serviceHealth.stream.status==="stopped","st-unknown")])},b(t.serviceHealth.stream?t.serviceHealth.stream.status:"unknown"),3)]),e[131]||(e[131]=a("div",{class:"service-health-card__meta"},[a("code",null,"/api/stream/status")],-1))])]),a("div",Bq," Last refresh: "+b(t.serviceHealth.lastChecked?t.formatDate(t.serviceHealth.lastChecked):"—"),1)]),a("div",Vq,[a("div",zq,[e[133]||(e[133]=a("div",{class:"framesync-title"},[ie("Stack "),a("span",{class:"framesync-accent"},"Services")],-1)),a("button",{class:"framesync-button framesync-button--compact",onClick:e[41]||(e[41]=c=>t.refreshGpuPool(!0)),disabled:t.infrastructure.loading||t.gpuPool.loading},[t.infrastructure.loading||t.gpuPool.loading?(m(),p("span",Gq,[...e[132]||(e[132]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh")],64))],8,$q)]),a("div",Hq,[e[139]||(e[139]=a("div",{class:"framesync-subtitle"},"Mediator per SD-Forge instance",-1)),t.gpuPool.loading&&!t.sdForgeGpuNodes.length?(m(),p("div",Wq,"Loading forge mediators…")):t.sdForgeGpuNodes.length?(m(),p("div",qq,[(m(!0),p(H,null,oe(t.sdForgeGpuNodes,c=>(m(),p("div",{key:"infra-mediator-"+c.id,class:"infra-mediator-card","data-testid":c.id===t.sdForgeGpuNodes[0].id?"infra-mediator-card":void 0},[a("div",Xq,[a("strong",null,b(c.name),1),c.mediator?(m(),p("span",{key:0,class:B(["gpu-status-pill",t.mediatorStatusClass(c.mediator.deforumationStatus)])}," Deforumation "+b(c.mediator.deforumationStatus),3)):N("",!0),c.mediator?(m(),p("span",{key:1,class:B(["gpu-status-pill",t.mediatorStatusClass(c.mediator.deforumStatus)])}," Deforum "+b(c.mediator.deforumStatus),3)):N("",!0)]),c.mediator?(m(),p("div",Kq,[a("span",null,[e[134]||(e[134]=ie("Host ",-1)),a("code",null,b(c.mediator.host),1)]),a("span",null,[e[135]||(e[135]=ie("Deforumation ",-1)),a("code",null,b(c.mediator.deforumationWsUrl),1)]),a("span",null,[e[136]||(e[136]=ie("Deforum bridge ",-1)),a("code",null,b(c.mediator.deforumWsUrl),1)])])):(m(),p("div",Yq,"No mediator settings — disable node and Edit to configure."))],8,jq))),128))])):t.infrastructure.mediator?(m(),p("div",Jq,[a("div",Zq,[a("span",{class:B(["gpu-status-pill",t.infrastructure.mediator.status==="healthy"?"st-healthy":"st-unhealthy"])},b(t.infrastructure.mediator.status),3),a("strong",null,b(t.infrastructure.mediator.address),1),a("span",Qq,b(t.infrastructure.mediator.source),1)]),a("div",ej,[a("span",null,[e[137]||(e[137]=ie("Deforumation ",-1)),a("code",null,b(t.infrastructure.mediator.wsUrl),1)]),a("span",null,[e[138]||(e[138]=ie("Deforum ",-1)),a("code",null,b(t.infrastructure.mediator.deforumWsUrl),1),ie(" · "+b(t.infrastructure.mediator.deforumStatus),1)])])])):(m(),p("div",tj,"No SD-Forge instances with mediator configuration.")),e[140]||(e[140]=a("p",{class:"infra-panel__hint"},[ie(" Each forge host runs its own mediator (e.g. "),a("code",null,"vimage5"),ie(" → "),a("code",null,"vimage5:8765"),ie(" / "),a("code",null,":8766"),ie("). Edit an instance (disable first) to change host and ports, or use "),a("strong",null,"Check ports"),ie(" in the forge editor. ")],-1))]),a("div",ij,[e[142]||(e[142]=a("div",{class:"framesync-subtitle"},"FFmpeg transcoder nodes",-1)),t.infrastructure.loading&&!t.infrastructure.transcoders.length?(m(),p("div",nj,"Loading transcoders…")):t.infrastructure.transcoders.length?(m(),p("div",rj,[a("table",oj,[e[141]||(e[141]=a("thead",null,[a("tr",null,[a("th",null,"Name"),a("th",null,"Address"),a("th",null,"CPU"),a("th",null,"Jobs"),a("th",null,"Status")])],-1)),a("tbody",null,[(m(!0),p(H,null,oe(t.infrastructure.transcoders,c=>(m(),p("tr",{key:c.id},[a("td",null,[a("strong",null,b(c.name),1)]),a("td",null,[a("code",aj,b(c.address),1),c.rtmpTarget&&c.rtmpTarget!==c.address?(m(),p("span",lj,b(c.rtmpTarget),1)):N("",!0)]),a("td",null,b(c.cpuLabel),1),a("td",null,b(c.jobsLabel),1),a("td",null,[a("span",{class:B(["gpu-status-pill","st-"+(c.status==="streaming"?"healthy":c.status==="idle"?"unknown":"unhealthy")])},b(c.status),3)])]))),128))])])])):(m(),p("div",sj,"No transcoder nodes configured.")),e[143]||(e[143]=a("p",{class:"infra-panel__hint"},[ie(" Configure extra nodes with "),a("code",null,"TRANSCODER_NODES"),ie(" (format: "),a("code",null,"name|host:port|rtmp://target|statusUrl"),ie("). Optional "),a("code",null,"statusUrl"),ie(" returns JSON "),a("code",null,'{ "cpu": 12.5, "activeJobs": 1 }'),ie(". ")],-1))])]),a("div",dj,[a("div",uj,[e[145]||(e[145]=a("div",{class:"framesync-title"},[ie("GPU "),a("span",{class:"framesync-accent"},"Pool")],-1)),a("label",cj,[J(a("input",{type:"checkbox","onUpdate:modelValue":e[42]||(e[42]=c=>t.gpuPool.enabled=c),onChange:e[43]||(e[43]=(...c)=>t.saveGpuPoolSettings&&t.saveGpuPoolSettings(...c))},null,544),[[xi,t.gpuPool.enabled]]),e[144]||(e[144]=ie(" Load balancing ",-1))])]),a("div",hj,[a("div",fj,[e[147]||(e[147]=a("div",{class:"framesync-subtitle"},"Strategy",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[44]||(e[44]=c=>t.gpuPool.strategy=c),onChange:e[45]||(e[45]=(...c)=>t.saveGpuPoolSettings&&t.saveGpuPoolSettings(...c)),disabled:t.gpuPool.loading},[...e[146]||(e[146]=[a("option",{value:"round_robin"},"Round robin",-1),a("option",{value:"least_busy"},"Least busy",-1),a("option",{value:"priority"},"Priority",-1),a("option",{value:"random"},"Random",-1)])],40,mj),[[Dt,t.gpuPool.strategy]])]),a("div",pj,[e[148]||(e[148]=a("div",{class:"framesync-subtitle"},"Healthy / total",-1)),a("div",gj,b(t.gpuPool.healthyNodes)+" / "+b(t.gpuPool.nodes.length),1)]),a("div",yj,[a("button",{class:"framesync-button",onClick:e[46]||(e[46]=c=>t.refreshGpuPool(!0)),disabled:t.gpuPool.loading},[t.gpuPool.loading?(m(),p("span",bj,[...e[149]||(e[149]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh stats",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh stats")],64))],8,vj)])]),a("div",_j,[a("div",Sj,[e[151]||(e[151]=a("div",{class:"framesync-subtitle"},"Default SD-Forge model",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[47]||(e[47]=c=>t.gpuPool.defaultForgeModel=c),disabled:t.gpuPool.loading||t.forge.switching||!t.forge.models||!t.forge.models.length},[e[150]||(e[150]=a("option",{value:""},"(no default)",-1)),(m(!0),p(H,null,oe(t.forge.models||[],c=>(m(),p("option",{key:"gpu-default-model-"+(c.title||c.model_name),value:c.title||c.model_name},b(c.title||c.model_name),9,Mj))),128))],8,wj),[[Dt,t.gpuPool.defaultForgeModel]])]),a("div",Pj,[a("button",{class:"framesync-button",onClick:e[48]||(e[48]=c=>t.saveDefaultForgeModel({preload:!0})),disabled:t.gpuPool.loading||t.forge.switching||!t.gpuPool.defaultForgeModel,title:"Switch model on healthy SD-Forge nodes now so new jobs start instantly"}," Save + preload ",8,xj)])]),t.gpuPool.defaultForgeModelStatus?(m(),p("div",Tj,b(t.gpuPool.defaultForgeModelStatus),1)):N("",!0),e[157]||(e[157]=a("p",{style:{"font-size":"11px",color:"var(--text-dim)",margin:"12px 0 0"}},[ie(" Add SD-Forge (A1111 API), ComfyUI, or Ollama instances. Disable a node to edit or remove it. Generation load balancing uses enabled "),a("strong",null,"SD-Forge"),ie(" nodes for img2img/txt2img/Deforum, while the story generator uses configured "),a("strong",null,"Ollama"),ie(" nodes. ")],-1)),a("div",Aj,[e[154]||(e[154]=a("div",{class:"framesync-subtitle"},"Add instance (saved disabled — enable after editing)",-1)),a("div",Ej,[J(a("input",{class:"framesync-input","onUpdate:modelValue":e[49]||(e[49]=c=>t.gpuPool.draft.url=c),placeholder:"http://host:7860, :8188, or :11434",disabled:t.gpuPool.loading},null,8,Cj),[[ye,t.gpuPool.draft.url]]),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[50]||(e[50]=c=>t.gpuPool.draft.name=c),placeholder:"Name",disabled:t.gpuPool.loading},null,8,kj),[[ye,t.gpuPool.draft.name]]),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[51]||(e[51]=c=>t.gpuPool.draft.backend=c),disabled:t.gpuPool.loading},[...e[152]||(e[152]=[a("option",{value:"sd-forge"},"SD-Forge",-1),a("option",{value:"comfyui"},"ComfyUI",-1),a("option",{value:"ollama"},"Ollama",-1)])],8,Lj),[[Dt,t.gpuPool.draft.backend]])]),t.gpuPool.draft.backend==="ollama"?(m(),p("div",Rj,[J(a("select",{class:"framesync-select","onUpdate:modelValue":e[52]||(e[52]=c=>t.gpuPool.draft.model=c),disabled:t.gpuPool.loading,style:{"min-width":"220px"}},[e[153]||(e[153]=a("option",{value:""},"Select Ollama model…",-1)),(m(!0),p(H,null,oe(t.ollamaModelOptions(t.gpuPool.draft.url),c=>(m(),p("option",{key:"draft-"+c,value:c},b(c),9,Ij))),128))],8,Dj),[[Dt,t.gpuPool.draft.model]]),a("button",{class:"framesync-button",onClick:e[53]||(e[53]=(...c)=>t.refreshGpuDraftModels&&t.refreshGpuDraftModels(...c)),disabled:t.gpuPool.loading||!t.gpuPool.draft.url},"Load models",8,Fj)])):N("",!0),a("div",Nj,[a("button",{class:"framesync-button",onClick:e[54]||(e[54]=(...c)=>t.addGpuNode&&t.addGpuNode(...c)),disabled:t.gpuPool.loading||!t.gpuPool.draft.url},"+ Add instance",8,Oj)])]),t.gpuPool.nodes.length?(m(),p("div",Uj,[(m(!0),p(H,null,oe(t.gpuPool.nodes,c=>(m(),p("div",{key:c.id,class:B(["gpu-node-card",{"gpu-row-disabled":!c.enabled}])},[a("div",Bj,[a("div",Vj,[a("span",{class:B(["gpu-status-pill","st-"+(c.enabled?c.status:"disabled")])},b(c.enabled?c.status:"disabled"),3),t.gpuPool.editId===c.id?(m(),p(H,{key:0},[J(a("input",{class:"framesync-input","onUpdate:modelValue":e[55]||(e[55]=f=>t.gpuPool.editDraft.name=f),style:{"font-size":"11px",width:"120px"}},null,512),[[ye,t.gpuPool.editDraft.name]]),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[56]||(e[56]=f=>t.gpuPool.editDraft.url=f),style:{"font-size":"10px",flex:"1","min-width":"160px"}},null,512),[[ye,t.gpuPool.editDraft.url]]),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[57]||(e[57]=f=>t.gpuPool.editDraft.backend=f),style:{"font-size":"11px",width:"100px"}},[...e[155]||(e[155]=[a("option",{value:"sd-forge"},"SD-Forge",-1),a("option",{value:"comfyui"},"ComfyUI",-1),a("option",{value:"ollama"},"Ollama",-1)])],512),[[Dt,t.gpuPool.editDraft.backend]])],64)):(m(),p(H,{key:1},[a("strong",zj,b(c.name),1),a("span",$j,b(c.url),1),a("span",Gj,b(c.backend),1),c.backend==="ollama"&&(c.model||c.currentModel)?(m(),p("span",Hj,"model: "+b(c.model||c.currentModel),1)):N("",!0),c.backend==="sd-forge"&&c.mediator?(m(),p("span",Wj," mediator: "+b(c.mediator.host)+" · "+b(c.mediator.deforumStatus)+"/"+b(c.mediator.deforumationStatus),1)):N("",!0)],64))]),a("div",qj,[a("span",jj,b(c.model||c.currentModel||"—"),1),a("span",Xj,b(t.formatGpuMemory(c)),1),a("span",Kj,b(c.gpuUtilization!=null?c.gpuUtilization+"%":"—"),1),a("span",Yj,b(c.activeJobs)+" jobs",1),c.backend==="sd-forge"?(m(),p("span",Jj," q "+b(c.queueRunning!=null?c.queueRunning:"—")+"/"+b(c.queuePending!=null?c.queuePending:"—"),1)):N("",!0),c.backend==="sd-forge"?(m(),p("span",Zj,b(c.progress!=null?Math.round(c.progress*100)+"%":"—"),1)):N("",!0)]),a("div",Qj,[c.enabled?(m(),p("button",{key:0,class:"framesync-button framesync-button--compact",onClick:f=>t.disableGpuNode(c)},"Disable",8,eX)):(m(),p(H,{key:1},[a("button",{class:"framesync-button framesync-button--compact",onClick:f=>t.enableGpuNode(c)},"Enable",8,tX),t.gpuPool.editId!==c.id?(m(),p("button",{key:0,class:"framesync-button framesync-button--compact",onClick:f=>t.startEditGpuNode(c)},"Edit",8,iX)):(m(),p("button",{key:1,class:"framesync-button framesync-button--compact",onClick:f=>t.saveGpuNodeEdit(c)},"Save",8,nX)),a("button",{class:"framesync-button framesync-button--danger framesync-button--compact",onClick:f=>t.removeGpuNode(c)},"Remove",8,sX)],64)),a("button",{class:"framesync-button framesync-button--compact",onClick:f=>t.gpuPool.expandedLog=t.gpuPool.expandedLog===c.id?null:c.id},b(t.gpuPool.expandedLog===c.id?"Hide log":"Log")+b(c.requestLog&&c.requestLog.length?" ("+c.requestLog.length+")":""),9,rX)])]),t.gpuPool.editId===c.id&&t.gpuPool.editDraft.backend==="ollama"?(m(),p("div",oX,[J(a("select",{class:"framesync-select","onUpdate:modelValue":e[58]||(e[58]=f=>t.gpuPool.editDraft.model=f),style:{"min-width":"220px"}},[e[156]||(e[156]=a("option",{value:""},"Select Ollama model…",-1)),(m(!0),p(H,null,oe(t.ollamaModelOptions(t.gpuPool.editDraft.url),f=>(m(),p("option",{key:"edit-"+c.id+"-"+f,value:f},b(f),9,aX))),128))],512),[[Dt,t.gpuPool.editDraft.model]]),a("button",{class:"framesync-button framesync-button--compact",onClick:e[59]||(e[59]=(...f)=>t.refreshGpuEditModels&&t.refreshGpuEditModels(...f))},"Load models")])):N("",!0),t.gpuPool.expandedLog===c.id?(m(),p("div",lX,[!c.requestLog||!c.requestLog.length?(m(),p("div",dX,"No requests logged yet.")):N("",!0),(m(!0),p(H,null,oe(c.requestLog||[],(f,g)=>(m(),p("div",{key:g,class:B(["gpu-node-log__entry",{"gpu-node-log__entry--error":!f.ok}])},[a("span",{class:B(["gpu-node-log__badge","gpu-node-log__badge--"+f.type])},b(f.type),3),a("span",uX,b(f.path),1),a("span",{class:"gpu-node-log__status",style:Mt(f.ok?"color:var(--live-text)":"color:var(--error)")},b(f.statusCode||(f.ok?"ok":"err")),5),a("span",cX,b(f.durationMs)+"ms",1),f.error?(m(),p("span",hX,b(f.error),1)):N("",!0),a("span",fX,b(new Date(f.ts).toLocaleTimeString()),1)],2))),128))])):N("",!0)],2))),128))])):(m(),p("div",mX,"No GPU instances configured.")),t.gpuPool.status?(m(),p("div",pX,b(t.gpuPool.status),1)):N("",!0)])]),t.gpuPool.forgeModal.open?(m(),p("div",{key:0,class:"gpu-forge-modal",onClick:e[77]||(e[77]=(...c)=>t.onGpuForgeModalBackdropClick&&t.onGpuForgeModalBackdropClick(...c))},[a("div",gX,[a("div",yX,[a("div",null,[e[158]||(e[158]=a("div",{class:"framesync-title"},[ie("Edit "),a("span",{class:"framesync-accent"},"SD-Forge"),ie(" instance")],-1)),a("div",vX,b(t.gpuPool.forgeModal.nodeName||"Forge node"),1)]),a("button",{class:"framesync-button",onClick:e[60]||(e[60]=c=>t.closeGpuForgeModal())},"Close")]),a("div",bX,[a("div",_X,[e[159]||(e[159]=a("div",{class:"framesync-subtitle"},"Name",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[61]||(e[61]=c=>t.gpuPool.forgeModal.nodeName=c),disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,SX),[[ye,t.gpuPool.forgeModal.nodeName,void 0,{trim:!0}]])]),a("div",wX,[e[160]||(e[160]=a("div",{class:"framesync-subtitle"},"URL",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[62]||(e[62]=c=>t.gpuPool.forgeModal.url=c),disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,MX),[[ye,t.gpuPool.forgeModal.url,void 0,{trim:!0}]])]),a("div",PX,[e[161]||(e[161]=a("div",{class:"framesync-subtitle"},"Priority",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[63]||(e[63]=c=>t.gpuPool.forgeModal.priority=c),min:"1",max:"99",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,xX),[[ye,t.gpuPool.forgeModal.priority,void 0,{number:!0}]])])]),a("div",TX,[a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.loading,onClick:e[64]||(e[64]=c=>t.refreshGpuForgeModalOptions())},[t.gpuPool.forgeModal.loading?(m(),p("span",EX,[...e[162]||(e[162]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh Forge",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(m(),p(H,{key:1},[ie("Refresh Forge")],64))],8,AX),a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.saving,onClick:e[65]||(e[65]=c=>t.applyGpuForgeModalOptions())},"Apply options",8,CX),a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying,onClick:e[66]||(e[66]=c=>t.saveGpuForgeModal())},"Save instance",8,kX)]),a("div",LX,[a("div",RX,[e[163]||(e[163]=a("div",{class:"framesync-subtitle"},"Current model",-1)),a("code",null,b(t.gpuPool.forgeModal.currentModel||"—"),1)]),a("div",DX,[e[164]||(e[164]=a("div",{class:"framesync-subtitle"},"Endpoint",-1)),a("code",IX,b(t.gpuPool.forgeModal.url||"—"),1)])]),a("div",FX,[e[165]||(e[165]=ie(" This is the per-instance Forge configuration for ",-1)),a("strong",null,b(t.gpuPool.forgeModal.nodeName||"this node"),1),e[166]||(e[166]=ie(". Saved values reopen here next time, and ",-1)),e[167]||(e[167]=a("strong",null,"Apply options",-1)),e[168]||(e[168]=ie(" pushes them to this Forge instance only. ",-1))]),a("div",NX,[e[174]||(e[174]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},[ie("Mediator "),a("span",{class:"framesync-accent"},"(Deforum)")],-1)),a("p",OX,[e[169]||(e[169]=ie(" Co-located on the forge host — defaults to instance name (",-1)),a("code",null,b(t.gpuPool.forgeModal.nodeName||"hostname"),1),e[170]||(e[170]=ie("). ",-1))]),a("div",UX,[a("div",BX,[e[171]||(e[171]=a("div",{class:"framesync-subtitle"},"Host",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[67]||(e[67]=c=>t.gpuPool.forgeModal.mediator.host=c),placeholder:"vimage5",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,VX),[[ye,t.gpuPool.forgeModal.mediator.host,void 0,{trim:!0}]])]),a("div",zX,[e[172]||(e[172]=a("div",{class:"framesync-subtitle"},"Deforum port",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[68]||(e[68]=c=>t.gpuPool.forgeModal.mediator.deforumPort=c),min:"1",max:"65535",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,$X),[[ye,t.gpuPool.forgeModal.mediator.deforumPort,void 0,{number:!0}]])]),a("div",GX,[e[173]||(e[173]=a("div",{class:"framesync-subtitle"},"Deforumation port",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[69]||(e[69]=c=>t.gpuPool.forgeModal.mediator.deforumationPort=c),min:"1",max:"65535",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,HX),[[ye,t.gpuPool.forgeModal.mediator.deforumationPort,void 0,{number:!0}]])])]),a("div",WX,[a("button",{class:"framesync-button framesync-button--compact",disabled:t.gpuPool.forgeModal.mediator.probing||!t.gpuPool.forgeModal.nodeId,onClick:e[70]||(e[70]=c=>t.probeGpuForgeMediatorPorts())},b(t.gpuPool.forgeModal.mediator.probing?"Checking…":"Check ports"),9,qX),t.gpuPool.forgeModal.mediator.deforumStatus?(m(),p("span",{key:0,class:B(["gpu-status-pill",t.mediatorStatusClass(t.gpuPool.forgeModal.mediator.deforumStatus)])}," Deforum "+b(t.gpuPool.forgeModal.mediator.deforumPort)+": "+b(t.gpuPool.forgeModal.mediator.deforumStatus),3)):N("",!0),t.gpuPool.forgeModal.mediator.deforumationStatus?(m(),p("span",{key:1,class:B(["gpu-status-pill",t.mediatorStatusClass(t.gpuPool.forgeModal.mediator.deforumationStatus)])}," Deforumation "+b(t.gpuPool.forgeModal.mediator.deforumationPort)+": "+b(t.gpuPool.forgeModal.mediator.deforumationStatus),3)):N("",!0)])]),a("div",jX,[a("div",XX,[e[176]||(e[176]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[71]||(e[71]=c=>t.gpuPool.forgeModal.options.sampler_name=c)},[e[175]||(e[175]=a("option",{value:""},"Auto",-1)),(m(!0),p(H,null,oe(t.engineSamplerOptions,c=>(m(),p("option",{key:"gpu-forge-sampler-"+c,value:c},b(c),9,KX))),128))],512),[[Dt,t.gpuPool.forgeModal.options.sampler_name]])]),a("div",YX,[e[178]||(e[178]=a("div",{class:"framesync-subtitle"},"Scheduler",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[72]||(e[72]=c=>t.gpuPool.forgeModal.options.scheduler=c)},[e[177]||(e[177]=a("option",{value:""},"Auto",-1)),(m(!0),p(H,null,oe(t.engineSchedulerOptions,c=>(m(),p("option",{key:"gpu-forge-sch-"+c,value:c},b(c),9,JX))),128))],512),[[Dt,t.gpuPool.forgeModal.options.scheduler]])])]),a("div",ZX,[a("div",QX,[e[180]||(e[180]=a("div",{class:"framesync-subtitle"},"VAE",-1)),J(a("select",{class:"framesync-select","onUpdate:modelValue":e[73]||(e[73]=c=>t.gpuPool.forgeModal.options.sd_vae=c)},[e[179]||(e[179]=a("option",{value:""},"Auto",-1)),(m(!0),p(H,null,oe(t.gpuPool.forgeModal.vaeList,c=>(m(),p("option",{key:"gpu-forge-vae-"+c,value:c},b(c),9,eK))),128))],512),[[Dt,t.gpuPool.forgeModal.options.sd_vae]])])]),a("div",tK,[a("div",iK,[e[181]||(e[181]=a("div",{class:"framesync-subtitle"},"Width",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[74]||(e[74]=c=>t.gpuPool.forgeModal.options.width=c),min:"64",max:"4096",step:"64"},null,512),[[ye,t.gpuPool.forgeModal.options.width,void 0,{number:!0}]])]),a("div",nK,[e[182]||(e[182]=a("div",{class:"framesync-subtitle"},"Height",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[75]||(e[75]=c=>t.gpuPool.forgeModal.options.height=c),min:"64",max:"4096",step:"64"},null,512),[[ye,t.gpuPool.forgeModal.options.height,void 0,{number:!0}]])]),a("div",sK,[e[183]||(e[183]=a("div",{class:"framesync-subtitle"},"Batch",-1)),J(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[76]||(e[76]=c=>t.gpuPool.forgeModal.options.batch_size=c),min:"1",max:"16"},null,512),[[ye,t.gpuPool.forgeModal.options.batch_size,void 0,{number:!0}]])])]),t.gpuPool.forgeModal.modelInfo?(m(),p("div",rK,[e[184]||(e[184]=a("div",{class:"framesync-subtitle"},"Model metadata",-1)),a("div",oK,[(m(!0),p(H,null,oe(t.gpuPool.forgeModal.modelInfo,(c,f)=>(m(),p("span",{key:"gpu-forge-meta-"+f,class:"chip"},b(f)+": "+b(c),1))),128))])])):N("",!0),t.gpuPool.forgeModal.status?(m(),p("div",aK,b(t.gpuPool.forgeModal.status),1)):N("",!0)])])):N("",!0)])):t.currentSubTab.SETTINGS==="STYLES"?(m(),p("div",lK,[ve(d,{app:i.app},null,8,["app"])])):t.currentSubTab.SETTINGS==="PLUGINS"?(m(),p("div",dK,[a("div",uK,[a("div",cK,[a("div",hK,[e[185]||(e[185]=a("div",{class:"framesync-title"},[ie("Plugins "),a("span",{class:"framesync-accent"},"Registry")],-1)),a("button",{type:"button",class:"framesync-button",onClick:e[78]||(e[78]=(...c)=>t.refreshPlugins&&t.refreshPlugins(...c))},"Refresh")]),e[186]||(e[186]=a("p",{class:"framesync-subtitle settings-plugins-tab__intro"}," Server-side animation and modulation plugins available to the live engine. ",-1)),t.pluginsRegistry.length?(m(),p("ul",fK,[(m(!0),p(H,null,oe(t.pluginsRegistry,c=>(m(),p("li",{key:c.id||c.name},[ie(b(c.name||c.id),1),c.description?(m(),p("span",mK," — "+b(c.description),1)):N("",!0)]))),128))])):(m(),p("p",pK,"No plugins reported — try Refresh."))])])])):t.currentSubTab.SETTINGS==="COLLAB"?(m(),p("div",gK,[a("div",yK,[a("div",vK,[a("div",bK,[e[187]||(e[187]=a("div",{class:"framesync-title"},[a("span",{class:"framesync-accent"},"Collaboration")],-1)),a("button",{class:B(["framesync-button",{"framesync-button--live":t.collabEnabled}]),onClick:e[79]||(e[79]=(...c)=>t.toggleCollaboration&&t.toggleCollaboration(...c))},b(t.collabEnabled?"WS "+t.wsStatus:"WS offline"),3)]),t.collabEnabled?(m(),p(H,{key:1},[a("div",SK,[a("div",wK,[e[188]||(e[188]=a("div",{class:"framesync-subtitle"},"Display name",-1)),J(a("input",{class:"framesync-input","onUpdate:modelValue":e[80]||(e[80]=c=>t.collab.userName=c),onChange:e[81]||(e[81]=c=>{t.saveCollabUserName,t.collabIdentify()})},null,544),[[ye,t.collab.userName]])]),a("div",MK,[e[189]||(e[189]=a("div",{class:"framesync-subtitle"},"Your session ID",-1)),a("input",{class:"framesync-input",value:t.collab.userId||"—",readonly:""},null,8,PK)])]),a("div",xK,"Connected users ("+b(t.collab.users.length)+")",1),t.collab.users.length?(m(),p("ul",TK,[(m(!0),p(H,null,oe(t.collab.users,c=>(m(),p("li",{key:c.id},[ie(b(c.name)+" ",1),c.lockedParams&&c.lockedParams.length?(m(),p("span",AK," — locks: "+b(c.lockedParams.join(", ")),1)):N("",!0)]))),128))])):(m(),p("div",EK,"Only you (open another browser tab to test multi-user).")),e[190]||(e[190]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},"Session recording",-1)),a("div",CK,[a("button",{class:B(["framesync-button",{"framesync-button--live":t.collab.recording}]),onClick:e[82]||(e[82]=(...c)=>t.toggleSessionRecording&&t.toggleSessionRecording(...c))},b(t.collab.recording?"Stop recording":"Start recording"),3),a("button",{class:"framesync-button",onClick:e[83]||(e[83]=(...c)=>t.listSessionRecordings&&t.listSessionRecordings(...c))},"List recordings")]),t.collab.recordings.length?(m(),p("ul",kK,[(m(!0),p(H,null,oe(t.collab.recordings,c=>(m(),p("li",{key:c.filename,style:{display:"flex",gap:"8px","align-items":"center"}},[ie(b(c.filename)+" ",1),a("button",{class:"framesync-button framesync-button--compact",onClick:f=>t.playbackSessionRecording(c.filename)},"Play",8,LK)]))),128))])):N("",!0),t.collab.status?(m(),p("div",RK,b(t.collab.status),1)):N("",!0),e[191]||(e[191]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},"Parameter locks (click param label in LIVE drawer)",-1)),Object.keys(t.collab.locks).length?(m(),p("div",DK,[(m(!0),p(H,null,oe(t.collab.locks,(c,f)=>(m(),p("span",{key:f,class:"pill",style:{margin:"2px 4px 2px 0"}},[ie(b(f)+" → "+b(c)+" ",1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Unlock parameter",onClick:g=>t.unlockParam(f)},[ve(o,{name:"close"})],8,IK)]))),128))])):(m(),p("div",FK,"No active locks."))],64)):(m(),p("div",_K," Collaboration is offline. Press the WS button to bring the collaboration panel back and reconnect. "))])])])):t.currentSubTab.SETTINGS==="OUTPUT"?(m(),p("div",NK,[ve(u,{app:i.app},null,8,["app"])])):t.currentSubTab.SETTINGS==="RUNS"||t.currentSubTab.SETTINGS==="SYSTEM"?(m(),p("div",OK,[ve(h,{app:i.app},null,8,["app"])])):N("",!0)])}const BK=nt(qG,[["render",UK]]);var Rs={};function VK(t){return[{id:"webgl",layerKind:"webgl"},{id:"deforum",layerKind:"deforum"},{id:"wan",layerKind:"wan"},{id:"animatelcm",layerKind:"animatelcm"}].find(i=>i.layerKind===t)||null}const zK=["rgb(45, 226, 255)","rgb(255, 83, 217)","rgb(90, 242, 169)","rgb(255, 138, 26)","rgb(167, 139, 250)","rgb(244, 114, 182)","rgb(52, 211, 153)","rgb(251, 191, 36)"],$K="rgb(26, 58, 82)",Vm="rgb(58, 90, 120)",GK="rgb(12, 48, 72)",HK="rgb(90, 143, 184)",zm={distilled_cfg_scale_schedule:"cfg_scale_schedule"},WK={name:"App",components:{StatusStrip:N0,GlassPanel:Cc,LiveParamRow:K0,UiIcon:Kt,SequencerControlsPanel:Gw,GenerateView:dy,ThreeBackground:YE,LiveView:mC,AnimationEnginePanel:KI,LibraryWorkspaceOverlay:v4,EditorView:ly,PromptsView:d8,MotionView:Z8,ModulationView:Iz,SettingsView:BK,RunsBrowserPanel:cy},data(){return{showFrames:!1,isPlaying:!1,isRecording:!1,deforumPlaying:!1,deforumSessionStartedAt:null,previewGenerating:!1,heldPreviewFramePath:"",previewDebounceTimer:null,previewQueuedKind:null,videoReady:!1,framesRefreshBackoffMs:1e3,frameRefreshTimer:null,apiHealthBackoffMs:15e3,runsLoading:!1,presetsLoading:!1,sharedPresetsLoading:!1,pluginsLoading:!1,lorasLoading:!1,cnLoading:!1,deforumSettingsLoading:!1,deforumSettingsSaving:!1,paramPanelOpen:!1,deforumPanelOpen:!1,liveDrawerOpen:!0,rightPanelOpen:!0,sidePanelDock:"auto",sidePanelDockBounds:{top:0,left:0,height:0},_sidePanelDockOnResize:null,_sidePanelDockResizeObserver:null,videoStageSize:"full",liveAnimationBoxOpen:!1,enginePanelDetailsOpen:!1,enginePanelDetailsTab:"ENGINE",deforumPreloadStatus:"",_preloadDeforumStarted:!1,libraryFullscreen:!1,libraryWorkspaceOpen:!1,libraryWorkspacePane:"browser",liveBottomDrawerOpen:!1,liveBottomDrawerTab:"MODULATION",deforumSettings:{...ia},seedFixedBackup:Math.floor(Math.random()*2147483647),deforumFieldGroups:[...Dl],deforumFieldEnabled:Qs(),deforumActiveTab:"canvas",deforumSectionOpen:{},deforumAdvancedOpen:!1,sessionDeforumSettingsLoaded:!1,deforumSettingsJson:"",deforumSettingsJsonError:"",deforumSettingsStatus:"",deforumVerifyResults:null,deforumSaveTimer:null,deforumPreviewTimer:null,crossfadeSlotTypes:i1,performance:{genericPrompt:"",crossfader:.5,newSlotType:"prompt",slots:[],status:"",lastPreviewPath:null},forge:{host:typeof process<"u"&&Rs&&Rs.SD_FORGE_HOST?Rs.SD_FORGE_HOST:"192.168.2.101",port:typeof process<"u"&&Rs&&Rs.SD_FORGE_PORT?Rs.SD_FORGE_PORT:"7860",available:!1,loading:!1,switching:!1,models:[],modelsSource:"",currentModel:"",selectedModel:"",lastModel:"",modelInfo:null,samplers:[],schedulers:[],vaeList:[],options:{}},streamUrl:"",streaming:{status:"",activeStatus:"unknown",activeDestinationId:null,destinations:[]},lfoOn:!0,beatMacroOn:!0,apiHealth:{sdForge:null},serviceHealth:{loading:!1,lastChecked:null,web:{ok:!0},hls:{updated:null,ageMs:null},stream:{status:"unknown"}},forgeHost:Rs.SD_FORGE_HOST||"192.168.2.101",availablePresets:[],currentPreset:null,newPresetName:"",presetStatus:"",sharedPresets:[],sharedPresetName:"",sharedPresetBy:"",sharedPresetsStatus:"",collab:{userId:null,userName:typeof localStorage<"u"&&localStorage.getItem("defora_user_name")||"Performer",users:[],locks:{},recording:!1,recordings:[],status:""},collabEnabled:!0,gpuPool:{enabled:!1,strategy:"least_busy",defaultForgeModel:"",healthyNodes:0,nodes:[],loading:!1,status:"",draft:{url:"",name:"",backend:"sd-forge",priority:1,model:""},editId:null,editDraft:{name:"",url:"",backend:"sd-forge",priority:1,model:""},forgeModal:{open:!1,nodeId:"",nodeName:"",url:"",priority:1,model:"",currentModel:"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[],schedulers:[],vaeList:[],modelInfo:null,options:{},mediator:{host:"",deforumPort:8765,deforumationPort:8766,deforumStatus:"",deforumationStatus:"",probing:!1}},expandedLog:null,modelOptions:{},defaultForgeModelStatus:""},infrastructure:{loading:!1,mediator:null,transcoders:[],updatedAt:null},generator:{theme:"",stylePreset:"Masterpiece, Realistic",customStyle:"",fps:24,resolution:"1024x576",totalFrames:96,numScenes:4,isGenerating:!1,status:"",lastPath:null,result:null},session:"clown_set_01",_syncingGlobalFps:!1,tabs:[{id:"LIVE",label:"LIVE",hint:"Monitor",icon:"broadcast"},{id:"PROMPTS",label:"PROMPTS",hint:"Words",icon:"sparkles"},{id:"MOTION",label:"MOTION",hint:"Move",icon:"shuffle"},{id:"MODULATION",label:"MODULATION",hint:"React",icon:"wave"},{id:"AUDIO",label:"AUDIO",hint:"Reactive",icon:"mic"},{id:"SETTINGS",label:"SETTINGS",hint:"Engine",icon:"gear"}],currentTab:"LIVE",currentSubTab:{LIVE:"MONITOR",PROMPTS:"PROMPTS",MODULATION:"LFO",SETTINGS:"ENGINE",MOTION:"PERFORMANCE"},editorFreecutRoute:"projects",editorPendingImportPath:"",editorPendingImportRootId:"",editorPendingImportUrl:"",editorStatus:"",editorStatusLive:!1,liveSourcePanel:"library",liveSources:[],liveSourceStatus:"",videoLayers:[{id:"webgl",kind:"webgl",label:"WebGL",builtin:!0},{id:"deforum",kind:"deforum",label:"Deforum",builtin:!0},{id:"wan",kind:"wan",label:"WAN Video",builtin:!0},{id:"animatelcm",kind:"animatelcm",label:"AnimateLCM",builtin:!0},{id:"input",kind:"input",label:"Input",builtin:!0,playbackUrl:null}],wanEngine:{...Vr},wanDownloadStatus:"",wanDownloadBusy:!1,animateLcmEngine:{...cl},_userPickedPreviewLayer:!1,activeVideoLayerId:"webgl",videoLayerAddOpen:!1,layersSidebarOpen:!1,savedScenes:[],defaultSceneName:"default",inputLayerPlaybackUrl:null,inputLayerLabel:"Input",inputVideoReady:!1,cloudDriveDraft:{url:"",provider:"google_drive"},systemFiles:{roots:[],rootId:"uploads",currentPath:"",parent:"",folders:[],videos:[],videoCount:null,folderCount:null,loading:!1,status:"",recursive:!1,viewMode:"browse",showFilenames:!0,sortKey:"name-asc",zoomLevel:2,selectedPaths:[],fullscreenIndex:-1,cloudSources:[],cloudSource:null,cloudConnectOpen:!1,cloudVideoDraft:{name:"",url:""},newFolderOpen:!1,newFolderName:"",_rootsLoaded:!1},videoSwarmVisibleStart:0,videoSwarmVisibleEnd:48,librarySubTab:"BROWSER",librarySelectedProject:null,librarySelectedVideo:null,librarySelectedAudio:null,liveEngineDrawerOpen:!1,restoreSessionPromptOpen:!1,viewportWidth:typeof window<"u"?window.innerWidth:1400,pendingSessionStateRaw:"",promptHistoryOpen:!1,promptHistory:[],speechPromptSupported:!1,speechPromptListening:!1,speechPromptError:"",stats:{lat:120},hud:{seed:42490527},timecode:"00:00.00",liveVibe:[{key:"cfg",label:"Vibe (CFG)",val:.63,min:0,max:1.5,step:.01},{key:"strength",label:"Strength",val:.78,min:0,max:1.5,step:.01},{key:"noise",label:"Noise/Glitch",val:.2,min:0,max:1,step:.01},{key:"cfgscale",label:"CFG scale",val:5,min:0,max:15,step:.1}],liveCam:[{key:"zoom",label:"Zoom",val:.8,min:-5,max:5,step:.05,sourceable:!0},{key:"panx",label:"Pan X",val:.1,min:-1,max:1,step:.01,sourceable:!1},{key:"pany",label:"Pan Y",val:0,min:-1,max:1,step:.01,sourceable:!1},{key:"tilt",label:"Tilt / Rotate",val:0,min:-180,max:180,step:.5,sourceable:!1}],paramSources:{cfg:"Manual",strength:"Manual",noise:"Beat",cfgscale:"Manual",zoom:"Beat"},liveParamAliases:{panx:"translation_x",pany:"translation_y",zoom:"zoom_2d",tilt:"rotation_z",noise:"noise_multiplier"},modulationRouteFocusKey:null,pinnedParams:(()=>{try{const t=typeof localStorage<"u"&&localStorage.getItem("defora_pinned_params");return t?JSON.parse(t):[]}catch{return[]}})(),promptStyles:[],promptStylesLoading:!1,promptStylesImporting:!1,promptStylesStatus:"",activePromptStyleId:null,promptStyleEditorId:null,promptStyleDraft:null,promptStyleSearch:"",promptStyleAutoExample:!0,lcmEngine:{...er},prompts:{pos:"",neg:"",morphOn:!0,loraCrossfaderOn:!1,crossfaderValue:.5,loraCrossfaderLfoLink:null,loraCrossfaderLfoBase:.5,morphBlend:.5,morphBlendLfoLink:null,morphBlendLfoBase:.5},img2img:{show:!0,dataUrl:null,maskDataUrl:null,maskBlur:4,inpaintingFill:1,inpaintFullRes:!0,denoisingStrength:.55,width:1024,height:1024,loading:!1,status:"",lastPath:null},pluginsRegistry:[],morphSlots:[{id:1,on:!0,name:"clean → mad",a:"clean evil",b:"mad clown",range:"0.40–1.00",weight:1},{id:2,on:!0,name:"box → tunnel",a:"small box",b:"neon tunnel",range:"0.00–0.60",weight:1},{id:3,on:!1,name:"style fade",a:"photographic",b:"anime render",range:"0.20–0.80",weight:1}],loras:{available:[],common:[],groupA:[],groupB:[],source:"unknown",familyCollapsed:{sd15:!0,sdxl:!0,flux:!0,svd:!0}},motionPresets:{Static:{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0},Orbit:{translation_z:2,rotation_y:15,translation_x:0,translation_y:0,rotation_z:0},Tunnel:{translation_z:5,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0},Handheld:{translation_z:.5,translation_x:.2,translation_y:.1,rotation_z:2,rotation_y:0},Chaos:{translation_z:1.5,translation_x:.5,translation_y:.3,rotation_z:5,rotation_y:10},"Spin +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:1,rotation_y:0},"Spin +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:2,rotation_y:0},"Spin +4":{translation_z:0,translation_x:0,translation_y:0,rotation_z:4,rotation_y:0},"Spin +8":{translation_z:0,translation_x:0,translation_y:0,rotation_z:8,rotation_y:0},"Spin -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-1,rotation_y:0},"Spin -2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-2,rotation_y:0},"Spin -4":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-4,rotation_y:0},"Yaw +0.5":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:.5},"Yaw +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:1},"Yaw +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:2},"Yaw +3":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:3},"Yaw -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:-1},"Yaw -2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:-2},"Pitch +0.5":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:.5},"Pitch +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:1},"Pitch +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:2},"Pitch -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:-1},"Pan R":{translation_z:0,translation_x:5,translation_y:0,rotation_z:0,rotation_y:0},"Pan L":{translation_z:0,translation_x:-5,translation_y:0,rotation_z:0,rotation_y:0},"Pan Up":{translation_z:0,translation_x:0,translation_y:-5,rotation_z:0,rotation_y:0},"Pan Down":{translation_z:0,translation_x:0,translation_y:5,rotation_z:0,rotation_y:0},"Zoom Out":{translation_z:-2,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0}},motionStyles:["Calm","Travel","Spin","Handheld","Chaos"],motionStylesSaved:{},motionSelectedPreset:"Static",motionPadValues:{translation_x:0,translation_y:0,translation_z:0,zoom:1,rotation_z:0,look_x:0,look_y:0},motionSmoothness:{enabled:!1,frames:1},motionPadSpringBack:!0,xyPad:{dragging:!1,activePad:null,padSize:420,dragStartValues:null},motionXYPadSlots:[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"},{id:"look",xAxis:"angle",yAxis:"zoom"}],audio:{track:"",bpm:114.8,uploadedFile:null,objectUrl:null},audioSpectrogramDataUrl:null,audioSpectrogramStatus:"",_spectrogramGen:0,avSyncEnabled:!1,avSyncLeadSec:4,liveModSlotParamKeys:["","","","","","","",""],modulationMapPicker:null,mappingsActiveOnly:!1,mappingsGroupTab:"",audioBeatMacrosCollapsed:!0,audioStatus:"Idle",audioMappings:[{param:"strength",band:"low",freq_min:20,freq_max:250,out_min:0,out_max:1.5},{param:"cfg",band:"mid",freq_min:250,freq_max:2e3,out_min:0,out_max:30},{param:"translation_z",band:"high",freq_min:2e3,freq_max:8e3,out_min:-5,out_max:5}],audioMappingLevels:[0,0,0],audioSelectedMappingIndex:0,audioBandPreviewIndex:-1,audioActiveBandTab:"low",audioSpectrumBins:[],_audioSpectrumPaintTs:0,audioBandPresets:{sub:{label:"Sub",freq_min:20,freq_max:60},bass:{label:"Bass",freq_min:60,freq_max:250},lowmid:{label:"Lo-mid",freq_min:250,freq_max:500},mid:{label:"Mid",freq_min:500,freq_max:2e3},high:{label:"High",freq_min:2e3,freq_max:8e3},air:{label:"Air",freq_min:8e3,freq_max:16e3}},lfoBpm:120,modulationSelectedLfoId:1,lfoTargets:[{key:"cfg",label:"Vibe (CFG)",min:0,max:30,default:6,group:"Style"},{key:"strength",label:"Strength",min:0,max:1.5,default:.7,group:"Style"},{key:"noise_multiplier",label:"Noise/Glitch",min:0,max:3,default:1,group:"Style"},{key:"translation_z",label:"Zoom",min:-10,max:10,default:0,group:"Camera"},{key:"translation_x",label:"Pan X",min:-10,max:10,default:0,group:"Camera"},{key:"translation_y",label:"Pan Y",min:-10,max:10,default:0,group:"Camera"},{key:"rotation_y",label:"Rotate Y",min:-180,max:180,default:0,group:"Camera"},{key:"rotation_z",label:"Tilt",min:-180,max:180,default:0,group:"Camera"},{key:"fov",label:"FOV",min:1,max:180,default:70,group:"Camera"},{key:"rotation_3d_x",label:"Rotate X (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_x"},{key:"rotation_3d_y",label:"Rotate Y (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_y"},{key:"rotation_3d_z",label:"Rotate Z (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_z"},{key:"zoom_2d",label:"Zoom (2D)",min:.5,max:2,default:1,group:"Camera 2D",deforumKey:"zoom"},{key:"angle_2d",label:"Angle (2D)",min:-90,max:90,default:0,group:"Camera 2D",deforumKey:"angle"},{key:"near_clip",label:"Near Clip",min:1,max:1e3,default:200,group:"Camera 3D",deforumKey:"near_schedule"},{key:"far_clip",label:"Far Clip",min:100,max:1e5,default:1e4,group:"Camera 3D",deforumKey:"far_schedule"},{key:"cn_CN1_weight",label:"CN1 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN2_weight",label:"CN2 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN3_weight",label:"CN3 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN1_start",label:"CN1 Start",min:0,max:1,default:0,group:"ControlNet"},{key:"cn_CN2_start",label:"CN2 Start",min:0,max:1,default:0,group:"ControlNet"},{key:"cn_CN1_end",label:"CN1 End",min:0,max:1,default:.9,group:"ControlNet"},{key:"cn_CN2_end",label:"CN2 End",min:0,max:1,default:.9,group:"ControlNet"}],animationTargets:[{key:"anim_instCount",field:"instCount",label:"Instance count",min:1e3,max:5e4,default:12e3,group:"Standby — Instancing"},{key:"anim_spread",field:"spread",label:"Spread",min:.2,max:2.5,default:.68,group:"Standby — Instancing"},{key:"anim_speed",field:"speed",label:"Speed",min:.1,max:2.5,default:.75,group:"Standby — Instancing"},{key:"anim_hue",field:"hue",label:"Hue",min:0,max:1,default:.6,group:"Standby — Instancing"},{key:"anim_glow",field:"glow",label:"Glow",min:.1,max:1.4,default:.78,group:"Standby — Instancing"},{key:"anim_orbit",field:"orbit",label:"Orbit",min:0,max:1,default:.52,group:"Standby — Instancing"},{key:"anim_beamCount",field:"beamCount",label:"Beam count",min:3,max:12,default:7,group:"Standby — Volume"},{key:"anim_pulse",field:"pulse",label:"Pulse",min:0,max:1,default:.36,group:"Standby — Volume"},{key:"anim_drift",field:"drift",label:"Drift",min:0,max:1,default:.44,group:"Standby — Volume"},{key:"anim_mist",field:"mist",label:"Mist",min:0,max:1,default:.58,group:"Standby — Nebula"},{key:"anim_lineWidth",field:"lineWidth",label:"Line width",min:1,max:10,default:2.4,group:"Standby — Raycast"},{key:"anim_lineThreshold",field:"lineThreshold",label:"Line threshold",min:0,max:10,default:.8,group:"Standby — Raycast"},{key:"anim_lineTranslation",field:"lineTranslation",label:"Line translation",min:0,max:10,default:0,group:"Standby — Raycast"},{key:"anim_mcNumBlobs",field:"mcNumBlobs",label:"Blob count",min:1,max:50,default:10,group:"Standby — Marching"},{key:"anim_mcResolution",field:"mcResolution",label:"MC resolution",min:14,max:100,default:28,group:"Standby — Marching"},{key:"anim_mcIsolation",field:"mcIsolation",label:"MC isolation",min:10,max:300,default:80,group:"Standby — Marching"},{key:"anim_ocElevation",field:"ocElevation",label:"Sun elevation",min:0,max:90,default:2,group:"Standby — Ocean"},{key:"anim_ocDistortion",field:"ocDistortion",label:"Distortion",min:0,max:8,default:3.7,group:"Standby — Ocean"},{key:"anim_ocCloudCoverage",field:"ocCloudCoverage",label:"Cloud coverage",min:0,max:1,default:.4,group:"Standby — Ocean"}],lfoShapes:["Sine","Triangle","Saw","Square"],lfos:Array.from({length:6}).map((t,e)=>({id:e+1,on:e===0,targets:e===0?["cfg"]:[],shape:"Sine",bpm:120,speed:1,depth:.1,base:null,phase:0,renderPhase:0})),macrosRack:[{id:"macro-0",on:!0,target:"cfg",shape:"Sine",bpm:120,depth:.7,offset:.1,show:!0},{id:"macro-1",on:!0,target:"translation_z",shape:"Saw",bpm:90,depth:.6,offset:.2,show:!1},{id:"macro-2",on:!1,target:"noise_multiplier",shape:"Noise",bpm:140,depth:.3,offset:0,show:!1}],framesync:{presets:["Basic Strength Schedule","Basic Noise Schedule","Basic Init"],factoryPresets:["Basic Strength Schedule","Basic Noise Schedule","Basic Init"],selectedPreset:"Basic Strength Schedule",primaryWave:"Cosine",waveShapes:["Cosine","Sine","Saw","Triangle","Square","Noise"],amplitude:1,shift:0,bend:1,noise:0,fps:24,frameCount:120,bpm:120,shiftFrames:0,syncRates:["1","1/2","1/4","1/8","1/16","1/32","2","4","8"],syncRate:"1/4",decimals:2,metrics:[{label:"Max",value:"1.00",sub:"32bars"},{label:"Min",value:"-1.00",sub:"16bars"},{label:"Avg",value:"0.00",sub:"4bars"},{label:"Abs Avg",value:"0.63",sub:"1bar"},{label:"Duration",value:"5.00s",sub:"1/2"}],timingTable:[{label:"32bar",time:"58.0s",frames:"1392.0"},{label:"16bar",time:"28.0s",frames:"768.0"},{label:"8bar",time:"16.0s",frames:"384.0"},{label:"4bar",time:"8.0s",frames:"192.0"},{label:"2bar",time:"4.0s",frames:"96.0"},{label:"1bar",time:"2.0s",frames:"48.0"},{label:"1/2",time:"1.0s",frames:"24.0"}],featureCoverage:["Wave presets","LFO modulation","Audio-driven sync","Tempo & shift","Metrics + timing table","Preset import/export"]},cn:{slots:[{id:"CN1",label:"CN1",model:"Canny",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN2",label:"CN2 •",model:"Depth",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN3",label:"CN3",model:"Pose",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN4",label:"CN4",model:"Tile",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN5",label:"CN5",model:"Control",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"}],active:"CN2",availableModels:[],source:"unknown",webcamActive:!1,webcamStream:null,webcamVideo:null,webcamCanvas:null,webcamCaptureInterval:null},webcamCaptureRate:500,midi:{supported:typeof navigator<"u"&&!!navigator.requestMIDIAccess,devices:[],selected:null,mappings:[{control:"LaunchControl CC21",cc:21,key:"cfg"},{control:"LaunchControl CC22",cc:22,key:"strength"},{control:"LaunchControl CC23",cc:23,key:"cfgscale"}]},keyBindings:{translation_z:"w",translation_x:"a",translation_y:"s",rotation_y:"d",rotation_z:"q",fov:"f",cfg:"z",strength:"x",noise_multiplier:"c"},bindingLearnMode:!1,bindingTargetKey:null,bindingLearnTimeout:null,midiStatus:"Ready",ws:null,wsStatus:"disconnected",wsReconnectTimer:null,streamSrc:"/hls/live/deforum.m3u8",hlsWatchEnabled:!1,hlsPreviewStreamValid:!1,standbyPreviewVideoUrl:"",defaultAnimation:{preferDeforumVideo:!1,showStandbyClip:!1,autoTransitionToDeforum:!0,mode:"customlights",instCount:12e3,beamCount:7,speed:.75,spread:.68,glow:.78,hue:.6,pulse:.36,drift:.44,mist:.58,orbit:.52,lineType:"segments",lineWidth:2.4,lineThreshold:.8,lineTranslation:0,lineWorldUnits:!0,lineVisualizeThreshold:!1,lineAlphaToCoverage:!0,lineAnimate:!0,mcMaterial:"shiny",mcNumBlobs:10,mcResolution:28,mcIsolation:80,mcFloor:!0,mcWallX:!1,mcWallZ:!1,ocElevation:2,ocAzimuth:180,ocExposure:.1,ocDistortion:3.7,ocSize:1,ocCloudCoverage:.4,ocCloudDensity:.5,ocCloudElevation:.5,forgeLayerOpacity:0,rememberCompositorLayerOnStartup:!1,previewCompositorCrossfadeMs:800,forgeLayerOpacityLfoLink:null,forgeLayerOpacityLfoBase:0,deforumBackdropEnabled:!0,deforumBackdropMix:.35},frameRailRunId:null,thumbs:[],frameThumbLoadingKeys:{},framesTimer:null,playerEl:null,timeHandler:null,hls:null,videoReadyHandler:null,videoWaitingHandler:null,videoPlayHandler:null,videoPauseHandler:null,liveParamTimers:{},liveParamPending:{},lastParamSent:{},controlDelayMs:75,errorHandler:null,playbackTimer:null,lfoTimer:null,lastLfoTick:null,beatTimer:null,lastBeatTime:null,beatCount:0,beatPhase:0,lastMacroTrigger:{},sequencer:{version:1,durationSec:8,fps:24,loop:!0,tracks:[],markers:[],clips:[],bpmSync:!1,bpm:120,bars:4,beatsPerBar:4},sequencerPlayhead:0,jobPlaybackTimeSec:0,sequencerPlaying:!1,sequencerTimer:null,sequencerSaveName:"default_clip",sequencerLoadPick:"",sequencerList:[],sequencerStatus:"",sequencerNewParam:"translation_x",sequencerKeyframeVal:0,sequencerMarkerName:"Scene",sequencerClipDurationSec:2,sequencerSelectedTrackId:null,sequencerSelectedClipId:null,generateDockExpanded:!1,motionSequencerSideOpen:!1,selectedFrameIndex:-1,timelineHoverTime:null,timelineHoverPercent:0,timelineCanvasCtx:null,lfoTargetPick:{},avSyncCollapsed:!0,morphCollapsed:!0,loraPickerOpen:!1,loraCrossfaderPickerGroup:null,loraCrossfaderCollapsed:!1,engineModelPickerOpen:!1,engineModelPickerTab:"sd15",forgeAdvancedCollapsed:!0,storyResultCollapsed:!1,lfoCanvasRefs:{},_lfoAnimFrame:null,runsAll:[],runsFiltered:[],runsFilter:{search:"",status:"",tag:"",model:""},runsSort:{field:"started_at",order:"desc"},deforumBatches:[],deforumBatchesStatus:"",deforumBatchNodes:[],runsSelected:[],runsCompareFields:["status","model","frame_count","seed","steps","strength","cfg","tag","prompt_positive","prompt_negative","notes"],runsDetailView:null,runsDetailTab:"summary",runsDetailJsonShowDiffOnly:!1,runsBrowserTab:"active",runsStatus:"",runsAutoRefresh:!0,runsPollIntervalSec:5,_runsPollTimer:null,runsLaunching:!1,runsJobLog:[],_runsJobLogSeq:0,_runsActivityKey:"",runsLastRefreshedAt:null,genData:{defaultThemes:["A journey through light","Neon cathedral","Ocean depths"],sceneDescriptors:{opening:["ethereal","quiet"],buildup:["rising","vivid"],climax:["intense","surreal"],closing:["soft","fading"]},environments:[["forest","meadow"],["city","alley"],["space","nebula"]],lighting:["golden hour","neon rim light","moonlit"],quality:["masterpiece","best quality"],techSpecs:["8k","sharp focus"],artists:{default:["artgerm","greg rutkowski"],"Masterpiece, Realistic":["photorealistic"]},negatives:["blurry","low quality"],cameraBehaviors:["STATIC","ORBIT","TUNNEL"]}}},computed:{appViewModel(){return this},gpuActiveCount(){return Math.max(0,Number(this.gpuPool&&this.gpuPool.healthyNodes)||0)},gpuTotalCount(){return Array.isArray(this.gpuPool&&this.gpuPool.nodes)?this.gpuPool.nodes.length:0},recentRunsRail(){return(Array.isArray(this.runsAll)?this.runsAll:[]).slice().sort((e,i)=>new Date(i.started_at||0)-new Date(e.started_at||0)).slice(0,4)},runsActiveGpuJobs(){return(Array.isArray(this.deforumBatches)?this.deforumBatches:[]).map(e=>{const i=e.batch_id||e.id||e.batchId||"",n=String(e.status||e.state||"queued").toLowerCase();let s=n;return n.includes("run")||n.includes("progress")||n.includes("generat")?s="running":n.includes("queue")||n.includes("pending")||n.includes("wait")?s="queued":n.includes("cancel")?s="cancelled":n.includes("fail")||n.includes("error")?s="failed":(n.includes("complete")||n.includes("done")||n.includes("success"))&&(s="completed"),{batchId:i,runId:i?`batch:${i}`:"",status:s,model:e.model||e.sd_model_name||e.sd_model_checkpoint||"",frames:e.frame_count??e.frames??e.max_frames??null,progress:e.progress??e.phase_progress??null,node:e._node||null,nodeName:e._node&&e._node.name||e._node&&e._node.url||"forge",startedAt:e.started_at||e.created_at||e.createdAt||null,_batch:e}}).filter(e=>e.batchId&&(e.status==="queued"||e.status==="running"))},runsGpuNodeSummaries(){const t=(this.gpuPool.nodes||[]).filter(i=>i&&i.enabled&&i.backend==="sd-forge"),e={};return this.runsActiveGpuJobs.forEach(i=>{const n=i.node&&i.node.id||i.nodeName||"unknown";e[n]||(e[n]=[]),e[n].push(i)}),t.length?t.map(i=>({id:i.id,name:i.name||i.url,url:i.url,status:i.status,activeJobs:i.activeJobs,queueRunning:i.queueRunning,queuePending:i.queuePending,progress:i.progress,jobs:e[i.id]||[]})):(this.deforumBatchNodes||[]).map(i=>({id:i.id||i.url,name:i.name||i.url,url:i.url,status:null,activeJobs:(e[i.id||i.url]||[]).length,queueRunning:null,queuePending:null,progress:null,jobs:e[i.id||i.url]||e[i.name||i.url]||[]}))},runsMonitorActive(){return this.currentTab==="RUNS"||this.currentTab==="SETTINGS"&&(this.currentSubTab.SETTINGS==="RUNS"||this.currentSubTab.SETTINGS==="SYSTEM")},runsLastRefreshedLabel(){if(!this.runsLastRefreshedAt)return"";try{return`Updated ${new Date(this.runsLastRefreshedAt).toLocaleTimeString()}`}catch{return""}},runsActiveList(){return(this.runsAll||[]).filter(t=>t.status==="running"||t.status==="queued")},runsActiveRunningCount(){return this.runsActiveList.filter(t=>t.status==="running").length},runsActiveQueuedCount(){return this.runsActiveList.filter(t=>t.status==="queued").length},runsActiveWorkerCount(){const t=this.runsActiveList.map(e=>this.runWorkerName(e)).filter(e=>e&&e!=="—");return new Set(t).size},runsActiveSummaryLabel(){const t=this.runsActiveRunningCount,e=this.runsActiveQueuedCount,i=this.runsActiveWorkerCount,n=i?` · ${i} worker${i===1?"":"s"}`:"";return`${t} running · ${e} queued${n}`},runsPastCount(){return(this.runsAll||[]).filter(t=>t.status!=="running"&&t.status!=="queued").length},rtmpStreamHref(){const t=this.infrastructure&&Array.isArray(this.infrastructure.transcoders)?this.infrastructure.transcoders:[],e=t.find(i=>i&&i.rtmpTarget)||t[0];return e&&e.rtmpTarget?e.rtmpTarget:"rtmp://vimage3:1935/live/deforum"},hlsStreamHref(){return"/hls/live/deforum.m3u8"},frameStripThumbs(){const t=this.frameRailRunId,e=this.runsDetailView;return t&&e&&e.run_id===t&&Array.isArray(e.frames)&&e.frames.length?e.frames.map((i,n)=>{const s=String(i),r=`/api/runs/${encodeURIComponent(e.run_id)}/frames/${encodeURIComponent(s)}`;return{name:s,src:r,url:r,path:r,frame:n+1}}):(this.thumbs||[]).filter(i=>!!(i&&(i.src||i.url||i.path)))},frameRailSourceLabel(){const t=this.frameRailRunId;return t?`Run ${t}`:""},framesEmptyStatus(){if(!(!!(this.forge&&this.forge.available)||!!(this.apiHealth&&this.apiHealth.sdForge&&this.apiHealth.sdForge.available)))return{label:"Waiting for frames…",detail:"Unknown (offline)",kind:"unknown"};const e=Math.max(0,Number(this.framesRefreshBackoffMs)||0),i=e?Math.max(1,Math.round(e/1e3)):0;return this.previewGenerating?{label:"Rendering…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}:this.deforumPlaying?{label:"Animating…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}:{label:"Waiting for frames…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}},selectedFrameThumb(){if(!this.frameStripThumbs.length)return null;if(!Number.isFinite(Number(this.selectedFrameIndex)))return this.frameStripThumbs[this.frameStripThumbs.length-1]||null;const t=Math.min(this.frameStripThumbs.length-1,Math.max(0,Number(this.selectedFrameIndex)));return this.frameStripThumbs[t]||null},selectedFrameLabel(){return this.selectedFrameThumb?`Frame ${this.frameLabel(this.selectedFrameThumb)}`:"No frames"},currentProjectLabel(){return String(this.session||"").trim()||"Project"},currentBatchLabel(){return String(this.deforumSettings&&this.deforumSettings.batch_name||"").trim()||"—"},deforumGeneratedFrameCount(){return this.frameStripThumbs.length},deforumStreamFrameLabel(){const t=this.deforumGeneratedFrameCount;if(!t)return"";const e=this.frameStripThumbs[t-1],i=e?this.frameLabel(e):t;return t===1?`1 frame generated (#${i})`:`${t} frames generated · latest #${i}`},latestGeneratedFramePath(){const t=this.frameStripThumbs;if(!t.length)return"";const e=t[t.length-1];return e&&(e.src||e.url||e.path)||""},activePreviewStillPath(){return this.deforumPlaying?this.latestGeneratedFramePath||this.performance.lastPreviewPath||this.generator.lastPath||this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||"":this.currentTab==="LIVE"?this.performance.lastPreviewPath||this.generator.lastPath||this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||"":!this.showMotionSequencerDock&&this.selectedFrameThumb?this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path||this.performance.lastPreviewPath||this.generator.lastPath||"":this.performance.lastPreviewPath||this.generator.lastPath||""},displayedPreviewStillPath(){return this.heldPreviewFramePath?this.heldPreviewFramePath:this.activePreviewStillPath},showFrameProcessing(){return this.previewGenerating?!0:this.isWebglSoloPreview?!1:!!(this.deforumPlaying&&!this.showDeforumVideo&&this.displayedPreviewStillPath)},showFrameProcessingOnStage(){return!this.showFrameProcessing||this.isWebglSoloPreview?!1:!!(this.showPreviewStill||this.deforumPlaying&&!this.showDeforumVideo&&this.displayedPreviewStillPath)},showFrameProcessingInChrome(){return this.showFrameProcessing&&!this.showFrameProcessingOnStage&&!this.previewGenerating},frameProcessingLabel(){return this.previewGenerating?"Rendering preview frame":this.deforumPlaying?"Generating frames":"Processing"},frameProcessingHint(){return this.previewGenerating?"Keeping the current frame visible until the new preview is ready.":this.deforumPlaying?"Keeping the last frame on screen until the live feed is ready.":"Processing…"},showMotionSequencerDock(){return this.currentTab==="MOTION"||this.currentTab==="GENERATE"},showRightPanel(){return this.rightPanelOpen},showEngineDrawerShell(){return!this.libraryWorkspaceOpen},libraryEditorOpen:{get(){return this.libraryWorkspaceOpen&&this.libraryWorkspacePane==="editor"},set(t){t?(this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane="editor"):this.libraryWorkspacePane==="editor"&&(this.libraryWorkspaceOpen=!1)}},edgeDockOverlayMode(){return this.libraryWorkspaceOpen?!1:this.videoStageSize==="full"?!0:this.viewportWidth<1360},edgeDockSingleRightPanel(){return this.viewportWidth<920},rightPanelEdgeLabel(){return{LIVE:"Live",PROMPTS:"Prompts",MOTION:"Motion",GENERATE:"Generate",MODULATION:"Mod",AUDIO:"Audio",SETTINGS:"Settings",RUNS:"Runs"}[this.currentTab]||"Panel"},sidePanelUsesEdgeDock(){return!0},rightPanelToggleIcon(){return this.rightPanelOpen?"chevron-up":"chevron-down"},rightPanelToggleTitle(){return this.sidePanelUsesEdgeDock?this.rightPanelOpen?"Collapse panel":"Expand panel":this.rightPanelOpen?"Collapse controls":"Show controls"},contextPanelChevronIcon(){return this.rightPanelOpen?"chevron-left":"chevron-right"},contextPanelToggleLabel(){return this.rightPanelOpen?"Hide controls panel":"Show controls panel"},engineDrawerToggleLabel(){return this.liveEngineDrawerOpen?"Hide engine panel":"Show engine panel"},engineDrawerChevronIcon(){return this.liveEngineDrawerOpen?"chevron-right":"chevron-left"},layersSidebarToggleLabel(){return this.layersSidebarOpen?"Hide layers panel":"Show layers panel"},layersSidebarChevronIcon(){return this.layersSidebarOpen?"chevron-right":"chevron-left"},shouldAutoRevealDeforumVideo(){return!this.showMainStageHls||!this.isDeforumLayerActive&&!this.isBlendLayerActive?!1:this.deforumGeneratedFrameCount>0||this.deforumPlaying&&this.videoReady},deforumLayerAutoFadeIn(){if(!this.showDeforumVideo||!this.shouldAutoRevealDeforumVideo)return!1;const t=this.findVideoLayer("deforum");return t?this.readVideoLayerOpacity(t)<=.001:!1},sidePanelDockStyle(){if(this.sidePanelUsesEdgeDock)return null;const t=this.sidePanelDockBounds||{},e=Number(t.top),i=Number(t.left),n=Number(t.height);return!Number.isFinite(n)||n<8?null:{top:`${Number.isFinite(e)?e:0}px`,left:`${Number.isFinite(i)?i:0}px`,height:`${n}px`}},canStartHlsWatch(){return this.hlsPreviewStreamValid&&!this.hlsWatchEnabled},showMainStageHls(){return this.hlsWatchEnabled},showDeforumVideo(){var t;if(!this.showMainStageHls)return!1;if(this.isBlendLayerActive){if(!this.layerKindVisible("blend")&&!this.shouldAutoRevealDeforumVideo)return!1}else if(this.isForgeAnimationLayerActive){const e=(t=this.activeVideoLayer)==null?void 0:t.kind;if(!this.layerKindVisible(e)&&!(e==="deforum"&&this.shouldAutoRevealDeforumVideo))return!1}else return!1;return this.isWebglLayerActive&&!this.isBlendLayerActive||!this.isForgeAnimationLayerActive&&!this.isBlendLayerActive||!this.videoReady?!1:this.deforumPlaying||this.deforumGeneratedFrameCount>0},showStandbyPreviewVideo(){return!(!this.standbyPreviewVideoUrl||!!!(this.defaultAnimation&&this.defaultAnimation.showStandbyClip)&&!this.showMainStageHls||this.libraryWorkspaceOpen||this.showLayerInputVideo||this.showPreviewStill)},showDefaultAnimation(){return this.showStandbyPreviewVideo||this.showPreviewStill?!1:this.isBlendLayerActive?this.layerKindVisible("webgl"):this.isWebglLayerActive?this.layerKindVisible("webgl"):this.isForgeAnimationLayerActive?!this.showDeforumVideo&&this.layerKindVisible("webgl"):!this.activeLayerPlaybackUrl&&!this.showLayerInputVideo?this.layerKindVisible("webgl"):!1},activeVideoLayer(){const t=Array.isArray(this.videoLayers)?this.videoLayers:[];return t.find(e=>e.id===this.activeVideoLayerId)||t[0]||null},activePromptStyle(){return this.activePromptStyleId&&(this.promptStyles||[]).find(t=>t.id===this.activePromptStyleId)||null},seedRandomEnabled(){var t;return Number((t=this.deforumSettings)==null?void 0:t.seed)===-1},filteredPromptStyles(){const t=String(this.promptStyleSearch||"").trim().toLowerCase(),e=Array.isArray(this.promptStyles)?this.promptStyles:[];return t?e.filter(i=>String(i.name||"").toLowerCase().includes(t)||String(i.positive||"").toLowerCase().includes(t)||String(i.negative||"").toLowerCase().includes(t)):e},builtinEngineLayers(){return(Array.isArray(this.videoLayers)?this.videoLayers:[]).filter(t=>t&&t.builtin)},runningPreviewVideoLayers(){return(Array.isArray(this.videoLayers)?this.videoLayers:[]).filter(e=>e&&e.builtin&&this.isVideoLayerPreviewVisible(e)&&this.isVideoLayerRunning(e))},isWebglLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="webgl"},isWebglSoloPreview(){return this.isWebglLayerActive&&!this.isBlendLayerActive},showForgeOverWebgl(){return this.isWebglSoloPreview?!1:this.isBlendLayerActive||this.isForgeAnimationLayerActive},effectiveForgeLayerOpacity(){var i;if(this.isWebglSoloPreview)return 0;const t=this.activeVideoLayer;if(t&&(t.kind==="deforum"||t.kind==="wan"||t.kind==="blend")){const n=this.readVideoLayerOpacity(t);if(this.isVideoLayerPreviewVisible(t)&&n<=.001){if(t.kind==="deforum"&&this.shouldAutoRevealDeforumVideo)return 1;if(!this.isVideoLayerPreviewVisible(t)||!this.layerKindVisible(t.kind))return 0}else if(!this.layerKindVisible(t.kind))return 0;return n}const e=Number((i=this.defaultAnimation)==null?void 0:i.forgeLayerOpacity);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0},webglLayerStyle(){return this.videoLayerRenderStyle("webgl")},inputLayerStyle(){return this.videoLayerRenderStyle("input")},forgeOverlayStyle(){var i;const t=this.effectiveForgeLayerOpacity,e=Math.max(0,Math.min(5e3,Math.round(Number((i=this.defaultAnimation)==null?void 0:i.previewCompositorCrossfadeMs)||800)));return t<=0?{opacity:"0",visibility:"hidden",pointerEvents:"none",transition:`opacity ${e}ms ease, visibility 0s linear ${e}ms`}:{opacity:String(t),visibility:"visible",pointerEvents:"none",transition:`opacity ${e}ms ease`}},previewStageStyle(){var i;const t=Math.max(0,Math.min(5e3,Math.round(Number((i=this.defaultAnimation)==null?void 0:i.previewCompositorCrossfadeMs)||800))),e=this.effectiveForgeLayerOpacity;return{"--preview-compositor-crossfade-ms":`${t}ms`,"--preview-forge-layer-opacity":String(e)}},isDeforumLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="deforum"},isWanLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="wan"},isAnimateLcmLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="animatelcm"},animateLcmMotionTypes(){return cg},animateLcmMotionLoras(){return hg},animateLcmControlFields(){return Ec},isForgeAnimationLayerActive(){var e;const t=(e=this.activeVideoLayer)==null?void 0:e.kind;return t==="deforum"||t==="wan"||t==="animatelcm"},activeAnimationPlugin(){var t;return VK((t=this.activeVideoLayer)==null?void 0:t.kind)||null},activeAnimationPluginId(){var t;return((t=this.activeAnimationPlugin)==null?void 0:t.id)||null},wanEngineControlFields(){return B1(this.wanEngine)},wanSpeedPresetNames(){return E1},wanMotionPresetNames(){return C1},wanMotionLoras(){return rg},wanDownloadPackages(){return Po},wanI2vModelOptions(){return lg},activeWanMotionLoras(){var t;return Array.isArray((t=this.wanEngine)==null?void 0:t.motion_loras)?this.wanEngine.motion_loras:[]},isBlendLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="blend"},isInputLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="input"},activeLayerPlaybackUrl(){const t=this.activeVideoLayer;return t?t.kind==="input"?this.inputLayerPlaybackUrl||t.playbackUrl||"":t.kind==="library"&&t.playbackUrl||"":""},showLayerInputVideo(){const t=this.activeVideoLayer;return!t||!this.activeLayerPlaybackUrl||!this.layerKindVisible("input")?!1:t.kind==="input"||t.kind==="library"},appView(){return this},videoLayerStatusLabel(){var e;const t=this.activeVideoLayer;if(!t)return"—";if(t.kind==="webgl")return"WebGL engine";if(t.kind==="blend")return this.showDeforumVideo?"WebGL + Deforum":"WebGL · waiting for Deforum";if(t.kind==="deforum"){const i=this.deforumGeneratedFrameCount,n=i?` · ${i} frame${i===1?"":"s"}`:"";return this.showDeforumVideo?`Deforum live${n}`:this.videoReady?`Deforum ready${n}`:this.deforumPlaying?`Deforum warming up${n}`:i?`Deforum · ${i} frame${i===1?"":"s"}`:"Waiting for Deforum"}if(t.kind==="wan"){const i=this.deforumGeneratedFrameCount,n=i?` · ${i} frame${i===1?"":"s"}`:"",s=String(((e=this.wanEngine)==null?void 0:e.wan_t2v_model)||"Wan").trim();return this.showDeforumVideo?`WAN live · ${s}${n}`:this.deforumPlaying?`WAN generating · ${s}${n}`:`WAN Video · ${s}`}return t.kind==="input"?this.activeLayerPlaybackUrl?`Input · ${this.inputLayerLabel||"Video"}`:"Input · no source":t.kind==="library"?`Layer · ${t.label||"Video"}`:t.kind==="cloud"?`Cloud · ${t.label||"Link"}`:t.label||"Layer"},showPreviewStill(){if(this.isWebglSoloPreview)return!1;const t=this.activeVideoLayer;if(t&&(t.kind==="deforum"||t.kind==="wan"||t.kind==="blend")){if(this.readVideoLayerOpacity(t)<=.001&&(this.showDeforumVideo||this.shouldAutoRevealDeforumVideo))return!1}else if(this.effectiveForgeLayerOpacity<=0)return!1;const e=this.currentTab!=="LIVE"||this.isForgeAnimationLayerActive||this.isBlendLayerActive;return!!(!this.showDeforumVideo&&this.displayedPreviewStillPath&&e)},backgroundAudioMetrics(){const t=Array.isArray(this.audioMappingLevels)?this.audioMappingLevels.map(l=>Math.max(0,Math.min(1,Number(l)||0))):[],e=t[0]||0,i=t[1]||0,n=t[2]||0,s=t.length?t.reduce((l,o)=>l+o,0)/t.length:0,r=this.audioSpectrumPlaying;return{active:s>.01||r,level:s,bass:e,mid:i,treble:n,pulse:Math.min(1,e*.7+s*.3)}},availableOllamaNodes(){return(this.gpuPool.nodes||[]).filter(t=>t&&t.enabled&&t.backend==="ollama")},healthyOllamaNodes(){return this.availableOllamaNodes.filter(t=>t.status==="healthy")},storyOllamaStatusLabel(){const t=this.healthyOllamaNodes;if(t.length){const i=t[0],n=i.model||i.currentModel,s=i.name||i.url||"Ollama",r=t.length>1?` (+${t.length-1} more)`:"";return n?`Ollama ready — ${n} on ${s}${r}`:`Ollama ready — ${s}${r}`}const e=this.availableOllamaNodes;if(e.length){const i=e[0];return`Ollama unreachable — ${i.name||i.url}`}return this.gpuPool&&this.gpuPool.loading?"Checking Ollama…":"Ollama not configured"},storyOllamaStatusTone(){return this.healthyOllamaNodes.length?"ready":this.availableOllamaNodes.length?"warn":"off"},storyOllamaNeedsConfigure(){return this.healthyOllamaNodes.length===0},storyGeneratorSourceLabel(){const t=this.generator&&this.generator.result&&this.generator.result.source;if(t&&t.model)return`Ollama ${t.model}${t.node&&t.node.name?" on "+t.node.name:""}`;const e=this.availableOllamaNodes[0];return e?`Ollama ${e.model||e.currentModel||e.name}`:"Local fallback"},storyGeneratorStatusLabel(){return this.generator.isGenerating?"Generating":this.generator.result?"Ready":"Idle"},storyGeneratorStatusLive(){return!!this.generator.isGenerating||!!this.generator.result},storyGeneratorSceneCount(){return Math.max(2,Number(this.generator.numScenes)||4)},storyGeneratorFrameCount(){return Number(this.deforumSettings&&this.deforumSettings.max_frames)||Number(this.generator.totalFrames)||96},storyGeneratorFps(){return this.masterFps},storyGeneratorSceneMeta(){const t=this.storyGeneratorSceneCount,e=this.storyGeneratorFrameCount;return`~${Math.ceil(e/t)} frames per scene`},storyGeneratorTimelineMeta(){const t=this.storyGeneratorFps;return`${(this.storyGeneratorFrameCount/t).toFixed(1)}s timeline`},storyGeneratorResolutionLabel(){const t=Number(this.deforumSettings&&this.deforumSettings.W)||Number((this.generator.resolution||"1024x576").split("x")[0])||1024,e=Number(this.deforumSettings&&this.deforumSettings.H)||Number((this.generator.resolution||"1024x576").split("x")[1])||576;return`${t}×${e}`},promptMorphBlendLinkedLfo(){const t=Number(this.prompts.morphBlendLfoLink||0);return t&&this.lfos.find(e=>e.id===t)||null},promptMorphBlendLinkStatus(){const t=this.promptMorphBlendLinkedLfo;return t?t.on?`Linked to LFO ${t.id}`:`Linked to LFO ${t.id} (currently off)`:"Manual control"},loraCrossfaderLinkedLfo(){const t=Number(this.prompts.loraCrossfaderLfoLink||0);return t&&this.lfos.find(e=>e.id===t)||null},loraCrossfaderLinkStatus(){const t=this.loraCrossfaderLinkedLfo;return t?t.on?`Linked to LFO ${t.id}`:`Linked to LFO ${t.id} (currently off)`:"Manual control"},currentLoraModelFamily(){return this.detectModelFamilyFromValue(this.forge.modelInfo,this.forge.currentModel||this.forge.selectedModel||this.forge.lastModel)},currentLoraModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[this.currentLoraModelFamily]||"Unknown"},loraBrowserFamilies(){const t=[{key:"sd15",label:"SD1.5"},{key:"sdxl",label:"SDXL"},{key:"flux",label:"FLUX"},{key:"svd",label:"SVD"}],e=this.currentLoraModelFamily;return t.map(i=>({...i,items:this.loras.available.filter(n=>(n.family||"sd15")===i.key),compatible:!e||e===i.key,collapsed:this.loras.familyCollapsed[i.key]!==!1})).filter(i=>!e||i.compatible)},compatibleLoraFamilies(){return this.loraBrowserFamilies.map(t=>({...t,items:t.items.filter(Boolean)})).filter(t=>t.items.length)},videoSwarmIsCloudRoot(){return this.isCloudStorageRoot(this.systemFiles.rootId)},videoSwarmIsVideosOnly(){return this.systemFiles.viewMode==="videos-only"},videoSwarmCloudPathLabel(){const t=this.systemFiles.cloudSource;return t?`${this.cloudProviderLabel(t.provider)} — ${t.label}`:"Cloud storage"},videoSwarmDisplayFolders(){return this.videoSwarmIsVideosOnly||this.videoSwarmIsCloudRoot?[]:Array.isArray(this.systemFiles.folders)?this.systemFiles.folders:[]},videoSwarmDisplayVideos(){return(Array.isArray(this.systemFiles.videos)?this.systemFiles.videos:[]).slice(this.videoSwarmVisibleStart,this.videoSwarmVisibleEnd)},videoSwarmFullscreenVideo(){const t=this.systemFiles.videos||[],e=this.systemFiles.fullscreenIndex;return e>=0&&e0&&this.loras.groupB.length>0},loraCrossfaderBlending(){return!!this.prompts.loraCrossfaderOn&&this.loraCrossfaderReady},loraCrossfaderStatusLabel(){return this.prompts.loraCrossfaderOn?"Enabled":"Disabled"},loraCrossfaderSummary(){const t=this.loras.groupA.length,e=this.loras.groupB.length,i=((1-this.prompts.crossfaderValue)*100).toFixed(0),n=(this.prompts.crossfaderValue*100).toFixed(0);return this.prompts.loraCrossfaderOn?!t&&!e?"Assign LoRAs to A and B groups to crossfade.":this.loraCrossfaderReady?`A ${t} · B ${e} · mix ${i}% / ${n}%`:`Needs LoRAs in both groups. Current assignment: A ${t}, B ${e}.`:"Crossfader is off. Click Enabled to blend A/B LoRA groups."},modelStatusKind(){return this.forge.switching||this.forge.loading?"loading":this.forge.available||this.apiHealth.sdForge&&this.apiHealth.sdForge.available?"ready":"offline"},modelStatusLabel(){return this.modelStatusKind==="loading"?"Loading":this.modelStatusKind==="ready"?"Ready":"Offline"},engineCurrentModelName(){return this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name||this.forge.currentModel||this.forge.selectedModel||this.forge.lastModel)},engineCurrentModelFamily(){return this.detectModelFamilyFromValue(this.forge.modelInfo,this.engineCurrentModelName)},engineCurrentModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[this.engineCurrentModelFamily]||"Generic"},engineModelFamilyTabs(){return[{key:"sd15",label:"SD1.5"},{key:"sdxl",label:"SDXL"},{key:"flux",label:"Flux"},{key:"zimage",label:"Z-Image"},{key:"other",label:"Other"}]},groupedEngineModels(){const t={sd15:[],sdxl:[],flux:[],zimage:[],other:[]};return(this.forge.models||[]).forEach(e=>{const i=this.detectModelFamilyFromValue(e.metadata,`${e.title||""} ${e.model_name||""}`),n=t[i]?i:"other";t[n].push(e)}),Object.keys(t).forEach(e=>{t[e].sort((i,n)=>String(i.title||i.model_name||"").localeCompare(String(n.title||n.model_name||"")))}),t},activeEngineModelList(){const t=this.engineModelPickerTab||"sd15";return this.groupedEngineModels[t]||[]},engineCurrentCfgScale(){const t=Number(this.forge.options&&this.forge.options.cfg_scale)||Number((this.liveVibe.find(e=>e.key==="cfgscale")||{}).val)||1;return this.readFirstNumericValue(this.deforumSettings&&(this.deforumSettings.cfg_scale_schedule||this.deforumSettings.distilled_cfg_scale_schedule)||"",t)},engineCurrentSteps(){return this.lcmEngine&&this.lcmEngine.enabled?Math.max(1,Math.round(Number(this.lcmEngine.steps)||1)):this.currentStepsValue()},lcmEngineEnabled(){return!!(this.lcmEngine&&this.lcmEngine.enabled)},engineSamplerOptions(){return[...new Set([this.deforumSettings&&this.deforumSettings.sampler,this.forge.options&&this.forge.options.sampler_name,this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.sampler_name,...this.forge.samplers||[],...r1].map(t=>String(t||"").trim()).filter(Boolean))]},engineSchedulerOptions(){return[...new Set([this.deforumSettings&&this.deforumSettings.scheduler,this.forge.options&&this.forge.options.scheduler,this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.scheduler,...this.forge.schedulers||[],...o1].map(t=>String(t||"").trim()).filter(Boolean))]},sdForgeGpuNodes(){return(this.gpuPool.nodes||[]).filter(t=>t&&t.backend==="sd-forge")},mediatorHealthSummary(){const t=this.sdForgeGpuNodes.filter(i=>i.mediator);if(!t.length){const i=this.infrastructure&&this.infrastructure.mediator;if(i){const n=i.status==="healthy"&&i.deforumStatus==="healthy";return{label:i.status||"unknown",ok:n}}return{label:"unknown",ok:!1}}const e=t.filter(i=>i.mediator.deforumStatus==="healthy"&&i.mediator.deforumationStatus==="healthy").length;return e===t.length?{label:"healthy",ok:!0}:e>0?{label:`${e}/${t.length} ok`,ok:!1}:{label:"unreachable",ok:!1}},activeDeforumFieldGroup(){return this.deforumFieldGroups.find(t=>t.id===this.deforumActiveTab)||this.deforumFieldGroups[0]||null},deforumMode2d3d(){var t;return sf((t=this.deforumSettings)==null?void 0:t.animation_mode)},deforumMode3dActive(){return this.deforumMode2d3d==="3D"},engineOptimizedDefaults(){return this.optimizedDefaultsForModel(this.engineCurrentModelName)},engineOptimizedProfileLabel(){return this.engineOptimizedDefaults&&this.engineOptimizedDefaults.profileLabel||"Manual / custom"},paramPanelGroups(){return[{label:"Style",items:this.liveVibe},{label:"Camera",items:this.liveCam}]},pinnedParamItems(){const t=[...this.liveVibe,...this.liveCam];return this.pinnedParams.map(e=>t.find(i=>i.key===e)).filter(Boolean)},modulatingNowItems(){return[...this.liveVibe,...this.liveCam].filter(t=>this.paramSources[t.key]&&this.paramSources[t.key]!=="Manual").map(t=>({key:t.key,label:t.label,source:this.paramSources[t.key],val:t.val,min:t.min,max:t.max,pct:Math.round((t.val-t.min)/(t.max-t.min||1)*100)}))},liveActiveLayerLabel(){const t=this.findVideoLayer(this.activeVideoLayerId);return(t==null?void 0:t.label)||"—"},liveContextSummaryParams(){const t=this.modulatingNowItems||[];if(t.length)return t.slice(0,4);const e=(this.pinnedParamItems||[]).slice(0,4);return e.length?e.map(i=>({key:i.key,label:i.label,val:i.val,source:this.paramSources[i.key]||"Manual"})):[...this.liveVibe||[],...this.liveCam||[]].slice(0,3).map(i=>({key:i.key,label:i.label,val:i.val,source:this.paramSources[i.key]||"Manual"}))},audioReactiveActive(){return["Audio sent to mediator","Streaming"].includes(this.audioStatus)},audioSpectrumPlaying(){const t=this.$refs&&this.$refs.avSyncAudio;return!!(t&&this.audio.objectUrl&&!t.paused&&!t.ended)},audioSpectrumEditorLive(){return!!(this.audio.objectUrl||this.audioSpectrumBins&&this.audioSpectrumBins.length)},animationModeGroupLabel(){const t=this.defaultAnimation&&this.defaultAnimation.mode||"instancing";return`Standby — ${{instancing:"Instancing",volume:"Volume",nebula:"Nebula",raycast:"Raycast",marching:"Marching",ocean:"Ocean",interactive_points:"Interactive points",interactive_raycast_points:"Raycast points",lensflares:"Lens flares"}[t]||"Instancing"}`},modulationMappingsGroups(){const t=new Map;this.animationTargets.forEach(n=>{const s=n.group||"Animation";t.has(s)||t.set(s,[]),t.get(s).push(n)}),this.lfoTargets.forEach(n=>{const s=n.group||"Deforum";t.has(s)||t.set(s,[]),t.get(s).push(n)});const e=this.animationModeGroupLabel,i=[...t.entries()].map(([n,s])=>({label:n,shortLabel:String(n).replace(/^Standby — /,""),items:s}));return i.sort((n,s)=>n.label===e?-1:s.label===e?1:n.label.localeCompare(s.label)),i},modulationMappingsVisibleGroups(){let t=this.modulationMappingsGroups;return this.mappingsActiveOnly&&(t=t.map(e=>({...e,items:e.items.filter(i=>this.paramHasActiveMapping(i.key))})).filter(e=>e.items.length)),t},mappingsActiveGroupLabel(){var i;const t=this.modulationMappingsVisibleGroups||[],e=this.mappingsGroupTab||this.animationModeGroupLabel;return t.some(n=>n.label===e)?e:((i=t[0])==null?void 0:i.label)||""},mappingsActiveGroup(){const t=this.modulationMappingsVisibleGroups||[],e=this.mappingsActiveGroupLabel;return t.find(i=>i.label===e)||t[0]||null},modulationMapPickerParamLabel(){var i;const t=(i=this.modulationMapPicker)==null?void 0:i.paramKey;if(!t)return"";const e=this.modulationTargetByKey(t);return(e==null?void 0:e.label)||t},videoSwarmIsCloudRoot(){return this.isCloudStorageRoot(this.systemFiles.rootId)},videoSwarmIsVideosOnly(){return this.systemFiles.viewMode==="videos-only"},videoSwarmCloudPathLabel(){const t=this.systemFiles.cloudSource;return t?`${this.cloudProviderLabel(t.provider)} — ${t.label}`:"Cloud storage"},videoSwarmDisplayFolders(){return this.videoSwarmIsVideosOnly||this.videoSwarmIsCloudRoot?[]:Array.isArray(this.systemFiles.folders)?this.systemFiles.folders:[]},videoSwarmDisplayVideos(){return(Array.isArray(this.systemFiles.videos)?this.systemFiles.videos:[]).slice(this.videoSwarmVisibleStart,this.videoSwarmVisibleEnd)},videoSwarmFullscreenVideo(){const t=this.systemFiles.videos||[],e=this.systemFiles.fullscreenIndex;return e>=0&&e=0&&ts.key===i);return n>=0?n:0},activeAudioMapping(){return this.audioMappings[this.activeAudioMappingIndex]||this.audioMappings[0]||null},audioSpectrumBandLabels(){return this.audioBandTabDefs.map(t=>t.label)},audioSpectrumBandColors(){try{const t=getComputedStyle(document.documentElement),e=i=>t.getPropertyValue(i).trim();return[e("--band-low"),e("--band-mid"),e("--band-high")].filter(Boolean)}catch{return[]}},liveModulating(){const t={};[...this.liveVibe,...this.liveCam].forEach(i=>{t[i.key]=i}),this.modulationTargets.forEach(i=>{var n;if(!t[i.key]){const s=(n=Object.entries(this.liveParamAliases).find(([,d])=>d===i.key))==null?void 0:n[0],r=s?this.liveHudParamByKey(s):null;if(r){t[i.key]={key:i.key,label:i.label,val:Number(r.val??0),min:r.min??0,max:r.max??1,step:r.step??.01};return}const l=i.field,o=l&&this.defaultAnimation?Number(this.defaultAnimation[l]):i.default||0;t[i.key]={key:i.key,label:i.label,val:Number.isFinite(o)?o:i.default||0,min:i.min||0,max:i.max||1,step:i.step??.01}}});const e={};return this.lfos.filter(i=>i.on&&i.targets.length).forEach(i=>{i.targets.forEach(n=>{e[n]||(e[n]={key:n,sources:[]}),e[n].sources.push(`LFO ${i.id}`)})}),this.macrosRack.filter(i=>i.on&&i.target).forEach(i=>{const n=i.target;e[n]||(e[n]={key:n,sources:[]}),e[n].sources.push("Macro")}),this.audioReactiveActive&&this.audioMappings.forEach(i=>{!i||!i.param||(e[i.param]||(e[i.param]={key:i.param,sources:[]}),e[i.param].sources.push("Audio"))}),[{key:"translation_x",active:Math.abs(Number(this.motionPadValues.translation_x)||0)>.01},{key:"translation_y",active:Math.abs(Number(this.motionPadValues.translation_y)||0)>.01}].forEach(({key:i,active:n})=>{n&&(e[i]||(e[i]={key:i,sources:[]}),e[i].sources.push("XY"))}),Object.values(e).map(i=>({...t[i.key]||{key:i.key,label:i.key,val:0,min:0,max:1},source:i.sources.join(" + ")}))},liveModulationSlots(){const t=l=>{const o=this.liveModSlotParamKeys[l];if(!o)return null;const d=this.modulationTargetByKey(o),u=this.paramControlMeta(o),h=this.paramSources[o]||this.paramSources[this.liveParamCanonicalKey(o)]||"Manual";return{key:o,label:d&&d.label||o,val:u.hud?u.hud.val:u.value,min:u.min,max:u.max,step:u.step,source:h}},e=l=>{const o=Number(l);return Number.isFinite(o)?Math.abs(o)>=10?o.toFixed(1):o.toFixed(2):"—"},i=l=>{if(!l)return 35;const o=Number(l.min??0),d=Number(l.max??1),h=(Number(l.val??0)-o)/(d-o||1);return Math.round(30+Math.max(0,Math.min(1,h))*70)},n=(l,o)=>{if(!(l!=null&&l.key))return{kind:"slider",label:o,paramKey:"",mappingLabel:"",min:0,max:1,step:.01,value:0,valueLabel:"—",shade:35};const d=this.paramControlMeta(l.key),u=d.hud?d.hud.val:d.value,h={...l,val:u,min:d.min,max:d.max};return{kind:"slider",label:l.label||o,paramKey:l.key,mappingLabel:l!=null&&l.source&&l.source!=="Manual"?l.source:"",min:d.min,max:d.max,step:d.step,value:u,valueLabel:e(u),shade:i(h)}},s=(l,o)=>{if(!(l!=null&&l.key))return{kind:"knob",label:o,paramKey:"",mappingLabel:"",min:0,max:1,step:.01,value:0,valueLabel:"—"};const d=this.paramControlMeta(l.key),u=d.hud?d.hud.val:d.value;return{kind:"knob",label:l.label||o,paramKey:l.key,mappingLabel:l!=null&&l.source&&l.source!=="Manual"?l.source:"",min:d.min,max:d.max,step:d.step,value:u,valueLabel:e(u)}},r=(l,o,d)=>{const u=l!=null&&l.key?this.paramControlMeta(l.key):null,h=o!=null&&o.key?this.paramControlMeta(o.key):null,c=Number((u==null?void 0:u.min)??(l==null?void 0:l.min)??0),f=Number((u==null?void 0:u.max)??(l==null?void 0:l.max)??1),g=Number((h==null?void 0:h.min)??(o==null?void 0:o.min)??0),y=Number((h==null?void 0:h.max)??(o==null?void 0:o.max)??1),T=Number(u!=null&&u.hud?u.hud.val:(u==null?void 0:u.value)??(l==null?void 0:l.val)??0),_=Number(h!=null&&h.hud?h.hud.val:(h==null?void 0:h.value)??(o==null?void 0:o.val)??0),v=(T-c)/(f-c||1),S=(_-g)/(y-g||1),w=Math.max(0,Math.min(1,Number.isFinite(v)?v:0)),x=Math.max(0,Math.min(1,Number.isFinite(S)?S:0));return{kind:"xypad",label:d,paramKey:"",paramKeyX:(l==null?void 0:l.key)||"",paramKeyY:(o==null?void 0:o.key)||"",mappingLabel:[l==null?void 0:l.source,o==null?void 0:o.source].filter(k=>k&&k!=="Manual").join(" · "),x:w,y:x,xLabel:e(T),yLabel:e(_),puckStyle:{left:`${w*100}%`,top:`${(1-x)*100}%`}}};return[n(t(0),"Slider 1"),n(t(1),"Slider 2"),r(t(2),t(3),"XY Pad 1"),r(t(4),t(5),"XY Pad 2"),s(t(6),"Knob 1"),s(t(7),"Knob 2")]},sessionCatalog(){try{if(typeof window>"u"||!window.localStorage)return[];const t=window.localStorage,e=new Set;for(let n=0;n{const s=t.getItem(`defora_session_${n}__touchedAt`),r=s!=null?Number(s):NaN,l=(this.runsAll||[]).filter(u=>{const h=String(u&&u.run_id?u.run_id:"");return h?h===n||h.startsWith(`${n}_`)||h.startsWith(`${n}-`)||h.includes(n):!1});let o=0,d=0;return l.forEach(u=>{(Number(u&&(u.frame_count??u.frames??u.length_frames??0))||0)>1?d+=1:o+=1}),{name:n,touchedAt:Number.isFinite(r)?r:0,images:o,videos:d,runs:l.length}}).sort((n,s)=>(s.touchedAt||0)-(n.touchedAt||0)||n.name.localeCompare(s.name))}catch{return[]}},targetOwners(){const t={};return this.lfos.forEach(e=>{e.on&&e.targets.forEach(i=>{t[i]||(t[i]=[]),t[i].push(`LFO ${e.id}`)})}),this.macrosRack.forEach((e,i)=>{!e.on||!e.target||(t[e.target]||(t[e.target]=[]),t[e.target].push(`Macro ${i+1}`))}),t},activeSlot(){return this.cn.slots.find(t=>t.id===this.cn.active)||this.cn.slots[0]},currentControlNetModelFamily(){return this.engineCurrentModelFamily||this.currentLoraModelFamily||""},currentControlNetModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",svd:"SVD"}[this.currentControlNetModelFamily]||"Generic"},controlNetCompatibleModels(){const t=this.currentControlNetModelFamily;return(this.cn.availableModels||[]).filter(e=>{const i=this.detectModelFamilyFromValue(null,`${e&&e.name?e.name:""} ${e&&e.id?e.id:""}`);return!t||!i||i===t})},activeControlNetModelIsCompatible(){const t=String(this.activeSlot&&this.activeSlot.model||"").trim();if(!t)return!0;const e=this.detectModelFamilyFromValue(null,t);return!this.currentControlNetModelFamily||!e?!0:e===this.currentControlNetModelFamily},activeControlNetModelChoices(){const t=String(this.activeSlot&&this.activeSlot.model||"").trim(),e=this.controlNetCompatibleModels.some(n=>n&&n.name===t);return!t||e?this.controlNetCompatibleModels:[{...(this.cn.availableModels||[]).find(n=>n&&n.name===t)||{id:`current-${t.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,name:t,category:"current"},current:!0,incompatible:!this.activeControlNetModelIsCompatible},...this.controlNetCompatibleModels]},controlNetModelSummary(){const t=this.controlNetCompatibleModels.length;return this.currentControlNetModelFamily?`Showing ${t} ${this.currentControlNetModelFamilyLabel}-compatible models.`:`Showing ${t} available models.`},controlNetWeightPercent(){return Math.max(0,Math.min(100,(Number(this.activeSlot&&this.activeSlot.weight)||0)/2*100))},controlNetWeightLabel(){const t=Number(this.activeSlot&&this.activeSlot.weight)||0;return t<.35?"Very subtle":t<.75?"Subtle":t<1.1?"Balanced":t<1.5?"Strong":"Very strong"},modulationTargets(){return[...this.lfoTargets,...this.animationTargets]},lfoTargetGroups(){const t={};return this.modulationTargets.forEach(e=>{const i=e.group||"Other";t[i]||(t[i]=[]),t[i].push(e)}),Object.entries(t).map(([e,i])=>({label:e,items:i}))},sequencerParamOptions(){const t=this.modulationTargets.map(e=>({key:e.key,label:e.label}));return this.cn.slots.forEach(e=>{t.push({key:`cn_${e.id}_weight`,label:`CN ${e.id} Weight`,group:"ControlNet"}),t.push({key:`cn_${e.id}_start`,label:`CN ${e.id} Start`,group:"ControlNet"}),t.push({key:`cn_${e.id}_end`,label:`CN ${e.id} End`,group:"ControlNet"})}),t},audioBandChips(){return Object.entries(this.audioBandPresets).map(([t,e])=>({key:t,label:e.label,freq_min:e.freq_min,freq_max:e.freq_max}))},sortedSequencerMarkers(){return[...this.sequencer&&this.sequencer.markers||[]].sort((e,i)=>e.t-i.t)},sortedSequencerClips(){return[...this.sequencer&&this.sequencer.clips||[]].sort((e,i)=>e.t-i.t)},sequencerClipSummary(){const t=this.sortedSequencerClips,e=i=>t.filter(n=>n.type===i).length;return{prompt:e("prompt"),lora:e("lora"),controlnet:e("controlnet")}},masterFps(){const t=Number(this.deforumSettings&&this.deforumSettings.fps);return Math.max(1,Math.min(120,Number.isFinite(t)&&t>0?Math.round(t):24))},sequencerJobFps(){return this.masterFps},sequencerJobTotalFrames(){const t=Number(this.deforumSettings&&this.deforumSettings.max_frames);if(Number.isFinite(t)&&t>0)return Math.floor(t);const e=this.sequencerJobFps,i=Number(this.sequencer&&this.sequencer.durationSec)||0;return Math.max(1,Math.ceil(i*e))},sequencerJobTimeSec(){return this.sequencerPlaying?Number(this.sequencerPlayhead)||0:this.deforumPlaying&&this.showMotionSequencerDock?Number(this.jobPlaybackTimeSec)||0:Number(this.sequencerPlayhead)||0},sequencerJobFrameIndex(){const t=this.sequencerJobFps,e=this.sequencerJobTotalFrames,i=Math.floor((Number(this.sequencerJobTimeSec)||0)*t+1e-6);return Math.min(e-1,Math.max(0,i))},sequencerJobFrameNumber(){return this.sequencerJobFrameIndex+1},sequencerJobFrameLabel(){return`Frame ${this.sequencerJobFrameNumber} / ${this.sequencerJobTotalFrames}`},sequencerJobFrameProgressPct(){const t=this.sequencerJobTotalFrames;return t<=1?0:this.sequencerJobFrameIndex/(t-1)*100},sequencerJobFrameLive(){return!!this.sequencerPlaying||!!this.deforumPlaying},sequencerCalculatedDuration(){if(!this.sequencer.bpmSync)return"—";const t=Math.max(1,this.sequencer.bpm||120);return((this.sequencer.bars||4)*(this.sequencer.beatsPerBar||4)/t*60).toFixed(2)},selectedSequencerTrack(){return this.sequencer.tracks.find(t=>t.id===this.sequencerSelectedTrackId)||this.sequencer.tracks[0]||null},sequencerParamMetaMap(){const t={};return this.modulationTargets.forEach(e=>{t[e.key]={label:e.label,min:Number(e.min??0),max:Number(e.max??1)}}),this.cn.slots.forEach(e=>{t[`cn_${e.id}_weight`]={label:`CN ${e.id} Weight`,min:0,max:2},t[`cn_${e.id}_start`]={label:`CN ${e.id} Start`,min:0,max:1},t[`cn_${e.id}_end`]={label:`CN ${e.id} End`,min:0,max:1}}),t},selectedModulationLfo(){return this.lfos.find(t=>t.id===this.modulationSelectedLfoId)||this.lfos[0]||null},isDeforumMotion2d(){var e;return String(((e=this.deforumSettings)==null?void 0:e.animation_mode)||"2D").trim().toUpperCase()==="2D"},motionMovePadRange(){return this.isDeforumMotion2d?1:10},motionAxisOptionsList(){const t=this.isDeforumMotion2d?["translation_x","translation_y","angle","zoom"]:["translation_x","translation_y","translation_z","zoom","rotation_z"],e={translation_x:{key:"translation_x",label:"Pan X",shortLabel:"X",icon:"arrow-right"},translation_y:{key:"translation_y",label:"Pan Y",shortLabel:"Y",icon:"chevron-up"},translation_z:{key:"translation_z",label:"Depth Z",shortLabel:"Z",icon:"panel-bottom"},angle:{key:"angle",label:"Angle",shortLabel:"Ang",icon:"rotate-ccw"},zoom:{key:"zoom",label:"Zoom",shortLabel:"Zm",icon:"size-full"},rotation_z:{key:"rotation_z",label:"Tilt",shortLabel:"Tlt",icon:"rotate-ccw"}};return t.map(i=>e[i]).filter(Boolean)},motionPadPuckStyle(){return this.motionPadPuckStyleFor("move")},motionLookPadPuckStyle(){return this.motionPadPuckStyleFor("look")},motionPadReadout(){return{x:Number(this.motionPadValues.translation_x||0),y:Number(this.motionPadValues.translation_y||0),z:Number(this.motionPadValues.translation_z||0),zoom:Number(this.motionPadValues.zoom??1),tilt:Number(this.motionPadValues.rotation_z??0),lookX:Number(this.motionPadValues.look_x??0),lookY:Number(this.motionPadValues.look_y??0)}},savedMotionPresetNames(){return Object.keys(this.motionStylesSaved||{}).sort((t,e)=>t.localeCompare(e))},morphHudSummary(){const t=Array.isArray(this.performance.slots)?this.performance.slots:[],e=i=>{if(!t.length)return`No ${i} slots`;const n=t.slice(0,2).map(r=>{if(r.type==="param"&&r.paramKey){const l=this.modulationTargetByKey(r.paramKey);return l?l.label:this.slotTypeLabel(r.type)}if(r.type==="style"){const l=this.promptStyleLabel(r.valueA),o=this.promptStyleLabel(r.valueB);return l&&o?`${l}↔${o}`:l||o||this.slotTypeLabel(r.type)}return this.slotTypeLabel(r.type)}),s=t.length>2?` +${t.length-2}`:"";return`${i} · ${n.join(" / ")}${s}`};return{a:e("A"),b:e("B")}},bindingGroups(){const t={};return this.modulationTargets.forEach(e=>{const i=e.group||"Other";t[i]||(t[i]=[]),t[i].push(e)}),Object.entries(t).map(([e,i])=>({label:e,items:i}))},modulationSubtabSummary(){const t=this.normalizeModulationSubTab(this.currentSubTab.MODULATION);if(t==="LFO")return`${this.lfos.filter(i=>i.on).length}/${this.lfos.length} LFO active`;if(t==="AV_SYNC")return this.avSyncEnabled&&this.audio.objectUrl?"Sync on":this.audio.objectUrl?"Sync off":"Upload track";if(t==="AUDIO_REACTIVE")return this.audioReactiveActive?"Audio live":"Audio idle";if(t==="BEAT_MACROS")return this.beatMacroOn?"Beat macros on":"Beat macros off";if(t==="MAPPINGS"){const e=this.mappingsActiveOnly?this.modulationMappingsVisibleGroups.reduce((i,n)=>i+n.items.length,0):this.modulationMappingsGroups.reduce((i,n)=>i+n.items.length,0);return e?`${e} parameters`:"No mappings"}return""}},watch:{sequencer:{handler(){this.$nextTick(()=>this.drawTimeline())},deep:!0},"sequencer.fps"(t){this._syncingGlobalFps||this.setGlobalFps(t,{source:"sequencer"})},"generator.fps"(t){this._syncingGlobalFps||this.setGlobalFps(t,{source:"generator"})},sequencerPlayhead(){this.$nextTick(()=>this.drawTimeline())},"performance.crossfader"(){this.applyCrossfadeMorph(),this.saveSessionState()},session(t){this.saveSessionState(),this.deforumSettings&&(this.deforumSettings={...this.deforumSettings,batch_name:t})},showDefaultAnimation(t){t&&this.$nextTick(()=>this.kickstandbyAnimation())},audioMappings:{deep:!0,handler(){if(this.audioBandPreviewIndex<0)return;const t=this.audioMappings[this.audioBandPreviewIndex];t&&this.updateAudioBandpassFilter(t)}},deforumGeneratedFrameCount(t){t>0&&this.maybePromoteDeforumPreview()},isDeforumMotion2d(t){this.motionXYPadSlots=t?[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"},{id:"look",xAxis:"angle",yAxis:"zoom"}]:[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"}]},deforumPlaying(t){t?(this.frameRailFollowLatest=!0,this.pinHeldPreviewFrame(),this.maybePromoteDeforumPreview(),this.scheduleFrameRefresh(0)):(this.clearHeldPreviewFrame(),this.clearFrameThumbLoadingState())},videoReady(t){t&&(this.maybePromoteDeforumPreview(),this.showDeforumVideo&&this.clearHeldPreviewFrame())},showDeforumVideo(t){t&&this.clearHeldPreviewFrame()},currentTab(){this.syncRunsMonitorPolling()},"currentSubTab.SETTINGS"(t){this.currentTab==="SETTINGS"&&(this.syncRunsMonitorPolling(),t==="SYSTEM"&&this.refreshRuns(),t==="PLUGINS"&&this.refreshPlugins())},runsAutoRefresh(){this.syncRunsMonitorPolling(),this.saveSessionState()},liveEngineDrawerOpen(t){this.$nextTick(()=>this.updateSidePanelDockBounds()),t&&this.preloadDeforumPipeline()},liveAnimationBoxOpen(t){this.enginePanelDetailsOpen!==t&&(this.enginePanelDetailsOpen=t)},enginePanelDetailsOpen(t){this.liveAnimationBoxOpen!==t&&(this.liveAnimationBoxOpen=t)},currentTab(t,e){(e==="STREAM"||e==="LIBRARY")&&t!==e&&e==="STREAM"&&this.hlsWatchEnabled&&this.disableHlsWatch()},hlsPreviewStreamValid(t){!t&&this.hlsWatchEnabled&&this.disableHlsWatch()},deforumActiveTab(t){t==="sampling"&&this.ensureForgeSamplerSchedulerLists()},"currentSubTab.LIVE"(t){t==="DEFORUM_JOB"&&this.ensureForgeSamplerSchedulerLists()},sidePanelUsesEdgeDock(){this.updateSidePanelDockBounds(),this.$nextTick(()=>this.bindSidePanelDockTracking())},videoStageSize(){this.updateSidePanelDockBounds()},libraryWorkspaceOpen(){this.updateSidePanelDockBounds()},currentTab(){this.updateSidePanelDockBounds()},rightPanelOpen(){this.updateSidePanelDockBounds()}},mounted(){this.checkAndPromptSessionRestore()||this.loadSessionState();try{if(typeof window<"u"&&window.localStorage){const i=window.localStorage.getItem("defora_tab");i==="EDITOR"||i==="LIBRARY"?this.openLibraryWorkspace(i==="EDITOR"?"editor":"browser"):i==="STREAM"&&(this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","OUTPUT"))}}catch{}this.initVideoLayers(),this.initDefaultScene(),this.applyStartupVideoPreview(),this.applyContextPanelStartupDefaults(),this.ensureStandbyAnimationAtStartup(),this.syncMotionPadFromPayload(this.motionPresets[this.motionSelectedPreset]||{translation_x:0,translation_y:0}),this.applyCrossfadeMorph(),this.loadMotionStyles(),this.loadBindings(),this.refreshPresets(),this.refreshSharedPresets(),this.refreshGpuPool(!1),this.loadControlNetModels(),this.refreshPlugins(),this.loadPromptStyles(),this.syncDeforumSettingsJson();const t=this.loadDeforumSettings({syncServerModel:!1}),e=this.refreshForgeAll();if(t.finally(()=>{this.deforumPlaying||this.schedulePreviewFrame(),this.preloadDeforumPipeline()}),Promise.allSettled([t,e]).then(()=>{this.restoreLastModel(),this.ensureDefaultForgeModelPreloaded(),this.preloadDeforumPipeline()}),this.scanMidi(),this.connectWebSocket(),this.loadStandbyPreviewVideo(),typeof fetch=="function"){const i=this.loadCachedFrameThumbs();i.length&&(this.thumbs=i,this.updateFrameSelection(""));const n=()=>{this.refreshFrames().finally(()=>{this.framesTimer=setTimeout(n,this.framesRefreshBackoffMs||5e3)})};n();const s=()=>{this.refreshApiHealth().finally(()=>{this.apiStatusTimer=setTimeout(s,this.apiHealthBackoffMs||15e3)})};s()}this.playbackTimer=setInterval(()=>this.ensureLivePlayback(),4e3),this.lfoTimer=setInterval(()=>this.runLfos(),120),this.beatTimer=setInterval(()=>this.processBeat(),50),this.startLfoAnimation(),this.setupKeyboardShortcuts(),typeof window<"u"&&(this._viewportResizeHandler=()=>{this.viewportWidth=window.innerWidth},window.addEventListener("resize",this._viewportResizeHandler,{passive:!0})),this.refreshRuns(),this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200),this.kickstandbyAnimation(),this.bindSidePanelDockTracking()}),this.initPromptHistory(),this.refreshServiceHealth(),this.syncRunsMonitorPolling()},beforeUnmount(){this.unbindSidePanelDockTracking(),this._viewportResizeHandler&&typeof window<"u"&&(window.removeEventListener("resize",this._viewportResizeHandler),this._viewportResizeHandler=null),this.disposeLiveAudioAnalyser(),this.stopSequencerPlayback(),this.framesTimer&&clearTimeout(this.framesTimer),this.apiStatusTimer&&clearTimeout(this.apiStatusTimer),this.playbackTimer&&clearInterval(this.playbackTimer),this.lfoTimer&&clearInterval(this.lfoTimer),this.beatTimer&&clearInterval(this.beatTimer),this.previewDebounceTimer&&clearTimeout(this.previewDebounceTimer),this.deforumPreviewTimer&&clearTimeout(this.deforumPreviewTimer),this.frameRefreshTimer&&clearTimeout(this.frameRefreshTimer),this.wsReconnectTimer&&clearTimeout(this.wsReconnectTimer),this.stopRunsPolling(),this.stopLfoAnimation(),this.playerEl&&this.detachPlayerListeners(this.playerEl),this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),typeof document<"u"&&document.removeEventListener("keydown",this._keyHandler)},methods:{cssVar(t){return getComputedStyle(document.documentElement).getPropertyValue(t).trim()},themeColor(t,e){return this.cssVar(t)||e},sanitizeSessionName(t){return String(t||"").trim().replace(/\s+/g,"_").replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,60)||"default"},selectSession(t){const e=this.sanitizeSessionName(t);this.session=e;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_session",e)}catch{}this.loadSessionState(),this.saveSessionState()},createNewSession(){const t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),e=this.sanitizeSessionName(`session_${t}`);this.selectSession(e)},resetUiLayoutDefaults(){this.paramPanelOpen=!1,this.deforumPanelOpen=!1,this.liveDrawerOpen=!0,this.rightPanelOpen=!0,this.sidePanelDock="auto",this.videoStageSize="full",this.liveAnimationBoxOpen=!1,this.enginePanelDetailsOpen=!1,this.enginePanelDetailsTab="ENGINE",this.liveEngineDrawerOpen=!1,this.layersSidebarOpen=!1,this.libraryFullscreen=!1,this.libraryWorkspaceOpen=!1,this.libraryWorkspacePane="browser",this.generateDockExpanded=!1,this.motionSequencerSideOpen=!1,this.saveSessionState()},purgeSession(t){try{if(typeof window>"u"||!window.localStorage)return;const e=this.sanitizeSessionName(t);window.localStorage.removeItem(`defora_session_${e}`),window.localStorage.removeItem(`defora_session_${e}__touchedAt`),window.localStorage.removeItem(`defora_session_${e}__restoreDeclinedAt`),e===this.session&&this.selectSession("default")}catch{}},restoreSession(t){try{if(typeof window>"u"||!window.localStorage)return;const e=this.sanitizeSessionName(t),i=window.localStorage.getItem(`defora_session_${e}`);if(!i)return;this.pendingSessionStateRaw=i,this.session=e;try{window.localStorage.setItem("defora_session",e)}catch{}this.clearSessionRestoreDeclined(),this.loadSessionState(),this.saveSessionState()}catch{}},async refreshApiHealth(){var t,e,i;if(typeof fetch=="function")try{const n=await fetch("/api/status");if(!n.ok){this.apiHealthBackoffMs=Math.min(12e4,(this.apiHealthBackoffMs||15e3)*2);return}const s=await n.json();if(s&&s.sdForge){const r=!!((e=(t=this.apiHealth)==null?void 0:t.sdForge)!=null&&e.available||(i=this.forge)!=null&&i.available);this.apiHealth={sdForge:{...s.sdForge}},this.forge.available=!!s.sdForge.available,!r&&this.forge.available&&this.preloadDeforumPipeline()}this.apiHealthBackoffMs=15e3}catch{this.apiHealthBackoffMs=Math.min(12e4,(this.apiHealthBackoffMs||15e3)*2)}},async refreshServiceHealth(){if(typeof fetch!="function")return;const t=Date.now();this.serviceHealth.loading=!0,this.serviceHealth.lastChecked=new Date().toISOString();const e={web:{ok:!1},hls:{updated:null,ageMs:null},stream:{status:"unknown"}},i=async s=>{try{return await s.json()}catch{return null}};await Promise.allSettled([(async()=>{try{const s=await fetch("/health",{cache:"no-store"});e.web.ok=!!s.ok}catch{e.web.ok=!1}})(),(async()=>{try{const s=await fetch("/api/health",{cache:"no-store"});if(!s.ok)return;const r=await i(s),l=r&&r.updated!=null?Number(r.updated):null;e.hls.updated=Number.isFinite(l)?l:null,e.hls.updated!=null&&(e.hls.ageMs=Math.max(0,Date.now()-e.hls.updated))}catch{}})(),(async()=>{try{const s=await fetch("/api/stream/status",{cache:"no-store"});if(!s.ok)return;const r=await i(s);e.stream.status=r&&r.status?String(r.status):"unknown"}catch{}})()]),this.serviceHealth.web=e.web,this.serviceHealth.hls=e.hls,this.serviceHealth.stream=e.stream,this.serviceHealth.lastChecked=new Date().toISOString(),this.serviceHealth.loading=!1;const n=Date.now()-t;n>1500&&this.performance&&this.performance.status===""&&(this.performance.status=`Service health refreshed (${n}ms)`,setTimeout(()=>{this.performance.status&&this.performance.status.startsWith("Service health refreshed")&&(this.performance.status="")},2500))},appendRunsJobLog(t,e="info"){const i={id:`log-${++this._runsJobLogSeq}`,ts:new Date().toISOString(),message:String(t||""),level:e};this.runsJobLog=[i,...this.runsJobLog].slice(0,80)},clearRunsJobLog(){this.runsJobLog=[]},formatRunsLogTime(t){if(!t)return"";try{return new Date(t).toLocaleTimeString()}catch{return""}},onRunsAutoRefreshChange(){this.runsAutoRefresh?this.startRunsPolling():this.stopRunsPolling(),this.saveSessionState()},syncRunsMonitorPolling(){this.runsMonitorActive&&this.runsAutoRefresh?this.startRunsPolling():this.stopRunsPolling()},startRunsPolling(){if(this.stopRunsPolling(),!this.runsAutoRefresh)return;const t=Math.max(2e3,(Number(this.runsPollIntervalSec)||5)*1e3);this._runsPollTimer=setInterval(()=>{this.runsMonitorActive&&this.refreshRuns({fromPoll:!0})},t)},stopRunsPolling(){this._runsPollTimer&&(clearInterval(this._runsPollTimer),this._runsPollTimer=null)},noteRunsActivityAfterRefresh(){if(!this.runsMonitorActive)return;const t=this.runsAll.filter(s=>s.status==="running").length,e=this.runsAll.filter(s=>s.status==="queued").length,i=this.runsActiveGpuJobs.length,n=`${t}|${e}|${i}|${this.runsAll.length}`;n!==this._runsActivityKey&&(this._runsActivityKey=n,this.appendRunsJobLog(`Activity: ${t} running, ${e} queued, ${i} GPU batch(es), ${this.runsAll.length} total`,"info"))},async launchTestRun(){if(!(this.runsLaunching||typeof fetch!="function")){this.runsLaunching=!0,this.appendRunsJobLog("Launching test job…","info");try{let t=await fetch("/api/deforum/warmup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({maxFrames:24,fps:12})}),e=t.ok?await t.json():null;if(t.ok&&e&&e.ok&&e.batchId){const i=e.status==="already_running"?"already running":"submitted";this.appendRunsJobLog(`Warmup batch ${i}: ${e.batchId}`,"info"),this.refreshRuns();return}if(t=await fetch("/api/runs/launch-demo",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),e=t.ok?await t.json():null,t.ok&&e&&e.ok&&e.run_id)this.appendRunsJobLog(`Demo run logged: ${e.run_id} (${e.status||"queued"})`,"success"),this.refreshRuns();else{const i=e&&e.error||`Launch failed (${t.status})`;this.appendRunsJobLog(i,"error"),this.runsStatus=i}}catch(t){const e=t&&t.message?t.message:String(t);this.appendRunsJobLog(`Launch error: ${e}`,"error"),this.runsStatus="Failed to launch test job"}finally{this.runsLaunching=!1}}},async refreshRuns(t={}){if(typeof fetch=="function"){t.fromPoll||(this.runsLoading=!0);try{const e=await fetch("/api/runs");if(!e.ok)return;const i=await e.json();this.runsAll=i.runs||[],this.applyRunsFilters(),this.refreshGpuPool(!0);try{const n=await fetch("/api/deforum/batches?all=1",{cache:"no-store"});if(n.ok){const s=await n.json(),r=Array.isArray(s.batches)?s.batches:[];this.deforumBatches=r,this.deforumBatchNodes=Array.isArray(s.nodes)?s.nodes:[];const l=Array.isArray(s.errors)?s.errors:[];this.deforumBatchesStatus=l.length?`Some GPUs unavailable (${l.length})`:""}else this.deforumBatches=[],this.deforumBatchNodes=[],this.deforumBatchesStatus="Deforum batches unavailable"}catch{this.deforumBatches=[],this.deforumBatchNodes=[],this.deforumBatchesStatus="Deforum batches unavailable"}if(this.deforumBatches.length){const n=i.runs||[],s=this.deforumBatches.map(l=>{const o=l.batch_id||l.id||l.batchId||"",d=String(l.status||l.state||"queued").toLowerCase(),u=l.started_at||l.created_at||l.createdAt||null,h=l.model||l.sd_model_name||l.sd_model_checkpoint||"",c=l._node||null,f=n.find(_=>_.run_id===o||_.run_id===`batch:${o}`),g=(f==null?void 0:f.frames_total)??l.max_frames??l.frame_count??l.frames??null;let y=(f==null?void 0:f.frames_done)??l.frames_done??l.frames_completed??l.current_frame??null;y==null&&typeof l.progress=="number"&&g&&(y=Math.round(l.progress*Number(g)));let T=(f==null?void 0:f.frames_progress_pct)??null;return T==null&&y!=null&&g&&(T=Math.min(100,Math.round(Number(y)/Number(g)*100))),{run_id:o?`batch:${o}`:`batch:unknown:${Math.random().toString(36).slice(2,8)}`,status:d.includes("run")||d.includes("progress")?"running":d.includes("queue")||d.includes("pending")?"queued":d.includes("cancel")?"cancelled":d,model:h,tag:"deforum-batch",started_at:u,frame_count:g,frames_total:g,frames_done:y,frames_progress_pct:T,has_thumbnail:!!(f!=null&&f.has_thumbnail),latest_frame:(f==null?void 0:f.latest_frame)??null,thumb_rev:(f==null?void 0:f.thumb_rev)??(f==null?void 0:f.latest_frame)??null,_isBatch:!0,_batch:l,_batchNode:c,_gpu:c&&c.name||c&&c.url||""}}),r=this.runsAll.filter(l=>!String(l.run_id||"").startsWith("batch:"));this.runsAll=[...s,...r]}this.applyRunsFilters(),this.runsLastRefreshedAt=Date.now(),this.noteRunsActivityAfterRefresh()}catch{this.runsStatus="Failed to load runs",this.runsMonitorActive&&this.appendRunsJobLog("Failed to load runs","error")}finally{t.fromPoll||(this.runsLoading=!1)}}},openMidiSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","MIDI")},openGpuSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","GPUS")},openRunsSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","SYSTEM"),this.runsBrowserTab="active",this.refreshRuns(),this.syncRunsMonitorPolling()},openRecentRun(t){t&&(this.switchTab("RUNS"),this.showRunDetails(t))},openRunsDrawerSystem(){this.switchTab("RUNS")},openFramesInRunsPanel(){this.switchTab("RUNS"),this.setRunsBrowserTab("frames"),this.syncRunsMonitorPolling()},openFramesInRunsPanel(){this.liveBottomDrawerOpen=!0,this.liveBottomDrawerTab="SYSTEM",this.setRunsBrowserTab("frames"),this.syncRunsMonitorPolling()},applyRunsFilters(){let t=(this.runsAll||[]).filter(o=>o.status!=="running"&&o.status!=="queued");const{search:e,status:i,tag:n,model:s}=this.runsFilter;if(i&&(t=t.filter(o=>o.status===i)),n&&(t=t.filter(o=>(o.tag||"").toLowerCase().includes(n.toLowerCase()))),s&&(t=t.filter(o=>(o.model||"").toLowerCase().includes(s.toLowerCase()))),e){const o=e.toLowerCase();t=t.filter(d=>(d.run_id||"").toLowerCase().includes(o)||(d.tag||"").toLowerCase().includes(o)||(d.model||"").toLowerCase().includes(o)||(d.prompt_positive||"").toLowerCase().includes(o)||(d.notes||"").toLowerCase().includes(o))}const{field:r,order:l}=this.runsSort;t.sort((o,d)=>{let u=o[r]||"",h=d[r]||"";return typeof u=="number"&&typeof h=="number"?l==="desc"?h-u:u-h:(u=String(u).toLowerCase(),h=String(h).toLowerCase(),l==="desc"?h.localeCompare(u):u.localeCompare(h))}),this.runsFiltered=t},toggleRunSelect(t){const e=this.runsSelected.indexOf(t);e>=0?this.runsSelected.splice(e,1):this.runsSelected.push(t)},async showRunDetails(t){var e;if(t){if(this.runsDetailTab="summary",this.runsDetailJsonShowDiffOnly=!1,t._isBatch){this.runsDetailView={...t},this.frameRailRunId=null;return}if(this.frameRailRunId=t.run_id||null,typeof fetch=="function")try{const i=await fetch(`/api/runs/${t.run_id}`);if(!i.ok)return;this.runsDetailView=await i.json(),this.frameRailRunId=((e=this.runsDetailView)==null?void 0:e.run_id)||this.frameRailRunId}catch{this.runsStatus="Failed to load run details"}}},onRunRowClick(t,e){var i,n;if(t&&!((n=(i=e==null?void 0:e.target)==null?void 0:i.closest)!=null&&n.call(i,"button, a, input, select, textarea, label"))){if(e&&(e.metaKey||e.ctrlKey)){this.toggleRunSelect(t.run_id);return}this.showRunDetails(t)}},openRecentRunFromRail(t){t&&(this.switchTab("RUNS"),this.showRunDetails(t))},runPrimaryVideoUrl(t){if(!t)return"";if(t.primary_video&&t.primary_video.url)return t.primary_video.url;if(Array.isArray(t.videos)&&t.videos.length)return`/api/runs/${encodeURIComponent(t.run_id)}/video/${encodeURIComponent(t.videos[0])}`;const e=(t.outputs||[]).find(i=>i.kind==="video");return(e==null?void 0:e.url)||""},runHasOutputMaterial(t){return t?!!(t.has_video||t.has_frames||Array.isArray(t.frames)&&t.frames.length||Array.isArray(t.outputs)&&t.outputs.length):!1},async openRunMaterialInBrowser(t){if(!t)return;const e=(t.outputs||[]).find(s=>s.kind==="frames"),i=(e==null?void 0:e.browse_path)||null,n=(e==null?void 0:e.rootId)||"runs";i&&(this.openLibraryWorkspace("browser"),this.librarySubTab="BROWSER",await this.initSystemFilesBrowser(),await this.browseSystemFiles(i,{rootId:n}))},openRunVideoInEditor(t){const e=((t==null?void 0:t.outputs)||[]).find(n=>n.kind==="video");if(e!=null&&e.browse_path){this.openInVideoEditor({path:e.browse_path,rootId:e.rootId||"runs",name:e.name||"Run video"});return}const i=this.runPrimaryVideoUrl(t);i&&(this.editorPendingImportUrl=i.startsWith("http")?i:`${window.location.origin}${i}`,this.editorPendingImportPath="",this.editorPendingImportRootId="runs",this.editorFreecutRoute="projects",this.editorStatus="Ready to import run video",this.editorStatusLive=!0,this.openLibraryVideoEditor())},canKillQueuedRun(t){return!!(t&&t._isBatch&&t.status==="queued")},async killQueuedRun(t){if(typeof fetch!="function"||!this.canKillQueuedRun(t))return;const e=String(t.run_id||"").replace(/^batch:/,""),i=t._batchNode&&t._batchNode.id||"";if(e&&confirm(`Cancel queued batch ${e}?`))try{const n=i?`?nodeId=${encodeURIComponent(i)}`:"",s=await fetch(`/api/deforum/batches/${encodeURIComponent(e)}/cancel${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i?{nodeId:i}:{})}),r=await s.json().catch(()=>({}));s.ok&&r.ok!==!1?(this.runsStatus=`Cancelled batch ${e}`,await this.refreshRuns()):this.runsStatus=r.error||`Failed to cancel batch ${e}`}catch{this.runsStatus="Failed to cancel batch"}},async rerunRun(t){if(typeof fetch=="function"&&confirm(`Rerun ${t.run_id}?`))try{const i=await(await fetch(`/api/runs/${t.run_id}/rerun`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({overrides:{}})})).json();this.runsStatus=i.success?`Rerun request saved for ${t.run_id}`:i.error}catch{this.runsStatus="Failed to submit rerun"}},async deleteRun(t){if(typeof fetch=="function"&&confirm(`Delete ${t.run_id}? This cannot be undone.`))try{const i=await(await fetch(`/api/runs/${t.run_id}`,{method:"DELETE"})).json();i.success?(await this.refreshRuns(),this.runsStatus=`Deleted ${t.run_id}`):this.runsStatus=i.error}catch{this.runsStatus="Failed to delete run"}},async saveRunNotes(t){if(typeof fetch=="function")try{const i=await(await fetch(`/api/runs/${t.run_id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:t.notes})})).json();this.runsStatus=i.success?"Notes saved":i.error}catch{this.runsStatus="Failed to save notes"}},async exportRuns(t){if(typeof fetch=="function")try{const e=await fetch(`/api/runs/export?format=${t}`);if(!e.ok)return;const i=await e.blob(),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download=`runs_export.${t}`,s.click(),URL.revokeObjectURL(n)}catch{this.runsStatus="Failed to export"}},getRunProp(t,e){const i=this.runsAll.find(s=>s.run_id===t);if(!i)return"-";const n=i[e];return n==null||n===""?"-":(e==="prompt_positive"||e==="prompt_negative")&&String(n).length>80?String(n).slice(0,80)+"…":n},async exportRunComparison(t){if(this.runsSelected.length<2){this.runsStatus="Select at least 2 runs to compare";return}try{const e=await fetch("/api/runs/compare",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({run_ids:this.runsSelected,format:t})});if(!e.ok){const i=await e.json().catch(()=>({}));throw new Error(i.error||`HTTP ${e.status}`)}if(t==="csv"){const i=await e.blob(),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download="runs_comparison.csv",s.click(),URL.revokeObjectURL(n)}else{const i=await e.json(),n=new Blob([JSON.stringify(i.comparison,null,2)],{type:"application/json"}),s=URL.createObjectURL(n),r=document.createElement("a");r.href=s,r.download="runs_comparison.json",r.click(),URL.revokeObjectURL(s)}this.runsStatus=`Exported comparison (${this.runsSelected.length} runs)`}catch(e){this.runsStatus=e.message||"Compare export failed"}},formatDate(t){if(!t)return"-";try{const e=new Date(t);return e.toLocaleDateString()+" "+e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return t}},runListingId(t){return String((t==null?void 0:t.run_id)||"").replace(/^batch:/,"")},runListingThumbUrl(t){if(!t)return"";const e=this.runListingId(t);if(!e||!t.has_thumbnail&&!(Number(t.frames_done)>0)&&!t.latest_frame)return"";const i=`/api/runs/${encodeURIComponent(e)}/thumb`,n=t.thumb_rev||t.latest_frame||t.frames_done||"";return n?`${i}?v=${encodeURIComponent(n)}`:i},runFramesDone(t){if(!t)return null;if(Number.isFinite(t.frames_done))return t.frames_done;if(t._isBatch&&t._batch){const e=t._batch,i=this.runFramesTotal(t);if(Number.isFinite(e.frames_done))return e.frames_done;if(Number.isFinite(e.frames_completed))return e.frames_completed;if(Number.isFinite(e.current_frame))return e.current_frame;if(typeof e.progress=="number"&&i)return Math.round(e.progress*i)}return null},runFramesTotal(t){if(!t)return null;if(Number.isFinite(t.frames_total)&&t.frames_total>0)return t.frames_total;const e=t.frame_count??t.length_frames??null;if(Number.isFinite(e)&&e>0)return e;if(t._isBatch&&t._batch){const i=t._batch,n=i.max_frames??i.frame_count??i.frames??null;if(Number.isFinite(n)&&n>0)return n}return null},runFrameProgressPct(t){if(!t)return null;if(Number.isFinite(t.frames_progress_pct))return t.frames_progress_pct;const e=this.runFramesDone(t),i=this.runFramesTotal(t);return e!=null&&i!=null&&i>0?Math.min(100,Math.round(e/i*100)):null},runFrameProgressLabel(t){const e=this.runFramesDone(t),i=this.runFramesTotal(t);if(e==null&&i==null)return"-";const n=this.runFrameProgressPct(t),s=e??"?",r=i??"?";return n!=null?`${s}/${r} · ${n}%`:`${s}/${r}`},runWorkerName(t){return t&&(t._gpu||t._batchNode&&t._batchNode.name||t._batch&&t._batch._node&&t._batch._node.name||t.job&&t.job.snapshot&&t.job.snapshot.node&&t.job.snapshot.node.name)||"—"},runLiveFramesLabel(t){const e=this.runFramesDone(t);if(e==null)return"—";const i=this.runFramesTotal(t);return i!=null?`${e} / ${i} frames`:`${e} frames`},formatDurationShort(t){const e=Number(t);return!Number.isFinite(e)||e<0?"—":e<45?`~${Math.max(1,Math.round(e))}s left`:e<3600?`~${Math.round(e/60)}m left`:`~${(e/3600).toFixed(1)}h left`},runEtaLabel(t){if(!t)return"—";if(t.status==="queued")return"Waiting in queue";const e=this.runFramesDone(t),i=this.runFramesTotal(t);if(i!=null&&e!=null&&e>=i)return"Finishing…";if(e==null||e<=0||!i)return"Estimating…";const n=t.started_at?new Date(t.started_at).getTime():NaN;if(!Number.isFinite(n))return"Estimating…";const s=Math.max(1,(Date.now()-n)/1e3),r=e/s;if(!Number.isFinite(r)||r<=0)return"Estimating…";const l=Math.max(0,i-e);return l<=0?"Finishing…":this.formatDurationShort(l/r)},runDetailCurrentContext(){var t,e;return S1({deforumSettings:this.normalizedDeforumSettings(),forgeModel:((t=this.forge)==null?void 0:t.selectedModel)||((e=this.forge)==null?void 0:e.currentModel)})},runDetailJsonRows(t){return cf(t,this.runDetailCurrentContext(),{diffOnly:!!this.runsDetailJsonShowDiffOnly})},runDetailJsonPretty(t){return x1(t)},runDetailJsonDiffCount(t){return cf(t,this.runDetailCurrentContext(),{diffOnly:!0}).length},async copyRunDetailJson(t){var i;const e=this.runDetailJsonPretty(t);if(e)try{if(typeof navigator<"u"&&((i=navigator.clipboard)!=null&&i.writeText))await navigator.clipboard.writeText(e);else{const n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}this.runsStatus="Run JSON copied"}catch{this.runsStatus="Failed to copy JSON"}},layersSidebarToggle(){this.layersSidebarOpen=!this.layersSidebarOpen,this.saveSessionState()},setLiveBottomDrawerTab(t){const i=["MODULATION","CROSSFADER","SYSTEM"].includes(t)?t:"MODULATION";this.liveBottomDrawerTab=i,this.liveBottomDrawerOpen=!0,this.saveSessionState()},toggleLiveBottomDrawer(){this.liveBottomDrawerOpen=!this.liveBottomDrawerOpen,this.saveSessionState()},toggleRightPanel(){this.rightPanelOpen=!this.rightPanelOpen,this.liveDrawerOpen=this.rightPanelOpen,this.saveSessionState()},toggleEngineDrawer(){this.liveEngineDrawerOpen=!this.liveEngineDrawerOpen,this.saveSessionState()},updateSidePanelDockBounds(){this.$nextTick(()=>{if(this.sidePanelUsesEdgeDock)return;const t=this.$refs.videoStageRef;if(!t||typeof t.getBoundingClientRect!="function")return;const e=t.getBoundingClientRect();e.height<8||(this.sidePanelDockBounds={top:e.top,left:e.left,height:e.height})})},bindSidePanelDockTracking(){if(typeof window>"u")return;const t=()=>this.updateSidePanelDockBounds();if(this._sidePanelDockOnResize||(window.addEventListener("resize",t,{passive:!0}),this._sidePanelDockOnResize=t),this._sidePanelDockResizeObserver&&(this._sidePanelDockResizeObserver.disconnect(),this._sidePanelDockResizeObserver=null),typeof ResizeObserver=="function"){const e=this.$refs.videoStageRef;e&&(this._sidePanelDockResizeObserver=new ResizeObserver(t),this._sidePanelDockResizeObserver.observe(e))}t()},unbindSidePanelDockTracking(){this._sidePanelDockOnResize&&(window.removeEventListener("resize",this._sidePanelDockOnResize),this._sidePanelDockOnResize=null),this._sidePanelDockResizeObserver&&(this._sidePanelDockResizeObserver.disconnect(),this._sidePanelDockResizeObserver=null)},switchTab(t){if(t==="EDITOR"||t==="LIBRARY"){this.openLibraryWorkspace(t==="EDITOR"?"editor":"browser");return}if(t==="STREAM"){this.currentTab="SETTINGS",this.switchSubTab("SETTINGS","OUTPUT");try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","SETTINGS")}catch{}this.refreshStreamStatus(),this.saveSessionState();return}if(t==="AUDIO"){this.currentTab="AUDIO",this.currentSubTab.MODULATION="AUDIO_REACTIVE";try{typeof window<"u"&&window.localStorage&&(window.localStorage.setItem("defora_tab","AUDIO"),window.localStorage.setItem("defora_subtab_MODULATION","AUDIO_REACTIVE"))}catch{}this.saveSessionState();return}if(t==="RUNS"){this.currentTab="SETTINGS",this.currentSubTab.SETTINGS="RUNS",this.refreshRuns(),this.syncRunsMonitorPolling();try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","SETTINGS")}catch{}this.saveSessionState();return}if(t==="GENERATE"){this.currentTab="MOTION",this.motionSequencerSideOpen=!0,this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200)});try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","MOTION")}catch{}this.saveSessionState();return}this.currentTab=t,t==="MOTION"&&this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200)});try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab",t)}catch{}this.saveSessionState()},normalizeModulationSubTab(t){return t==="AUDIO"?"AUDIO_REACTIVE":t==="ACTIVE"||t==="ACTIVE_MODS"?"MAPPINGS":t==="CROSSFADER"?"LFO":["LFO","AV_SYNC","AUDIO_REACTIVE","BEAT_MACROS","MAPPINGS"].includes(t)?t:"LFO"},normalizeLiveSubTab(t){const e=["MONITOR","DEFORUM_JOB"];return t==="ADD_SOURCE"?"MONITOR":e.includes(t)?t:"MONITOR"},normalizeMotionSubTab(t){return t==="SEQUENCER"?(this.motionSequencerSideOpen=!0,"PERFORMANCE"):t==="PERFORMANCE"?t:"PERFORMANCE"},switchSubTab(t,e){if(t==="SETTINGS"&&e==="RUNS"){this.openRunsSettings();return}t==="SETTINGS"&&e==="FORGE"&&(e="GPUS"),t==="SETTINGS"&&e==="KEYS"&&(e="ENGINE"),t==="SETTINGS"&&(e==="BINDINGS"||e==="PRESETS")&&(e="MIDI"),t==="MODULATION"&&(e=this.normalizeModulationSubTab(e)),t==="LIVE"&&(e=this.normalizeLiveSubTab(e)),t==="MOTION"&&(e=this.normalizeMotionSubTab(e)),t==="LIVE"&&(e==="DEFORUM_JOB"?(this.enginePanelDetailsTab="JOB",this.liveEngineDrawerOpen||(this.liveEngineDrawerOpen=!0),this.ensureForgeSamplerSchedulerLists()):this.enginePanelDetailsTab="ENGINE"),this.currentSubTab[t]=e;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_subtab_"+t,e)}catch{}t==="PROMPTS"&&e!=="LORA"&&(this.loraPickerOpen=!1),t==="PROMPTS"&&e==="LORA"&&!this.lorasLoading&&!this.loras.available.length&&this.refreshLoras(),t==="LIVE"&&e==="ADD_SOURCE"&&(e="MONITOR",this.toggleVideoLayerAdd(!0)),t==="LIVE"&&this.videoLayerAddOpen&&!this.systemFiles._rootsLoaded&&this.initSystemFilesBrowser(),t==="SETTINGS"&&(e==="SYSTEM"&&this.refreshRuns(),this.syncRunsMonitorPolling())},setRunsBrowserTab(t){if(!(t!=="active"&&t!=="past"&&t!=="frames")){if(this.runsBrowserTab=t,t==="frames"){this.showFrames=!0;const e=this.runsDetailView;e!=null&&e.run_id&&Array.isArray(e.frames)&&e.frames.length&&(this.frameRailRunId=e.run_id),this.refreshFrames()}else(t==="active"||t==="past")&&this.refreshRuns();this.saveSessionState()}},toggleLoraCrossfaderPicker(t){t!=="A"&&t!=="B"||(this.loraCrossfaderPickerGroup=this.loraCrossfaderPickerGroup===t?null:t,this.loraCrossfaderPickerGroup&&!this.lorasLoading&&!this.loras.available.length&&this.refreshLoras())},togglePlayPause(){this.toggleDeforumPlay()},stopVideo(){this.stopDeforumPlay()},toggleDeforumPlay(){this.deforumPlaying?this.pauseDeforumAnimation():this.startDeforumAnimation()},async startDeforumAnimation(){var e;if(!this.guardDeforumSettingsBeforeRun("start the Deforum job"))return;if(!this.deforumSessionStartedAt){const n=(this.runsActiveGpuJobs||[]).filter(s=>s.startedAt?Date.now()-new Date(s.startedAt).getTime()<36e5:!1);if(n.length){const s=Math.floor((Date.now()-new Date(n[0].startedAt).getTime())/6e4),r=s<1?"less than a minute":`${s} minute${s!==1?"s":""}`;if(!window.confirm(`A Deforum job has been running for ${r}. Stop it and start a new job?`))return}}this.applyCrossfadeMorph(),this.deforumSettings&&(this.deforumSettings.batch_name=this.session);const t=this.parseFrameNumber((e=this.thumbs[0])==null?void 0:e.name)||0;this.sendControl("liveParam",{start_frame:t,should_resume:1}),this.pinHeldPreviewFrame(),this.frameRailFollowLatest=!0,this.deforumPlaying=!0,this.deforumSessionStartedAt||(this.deforumSessionStartedAt=Date.now()),this.performance.status="Deforum animation playing",this.isPlaying=!0,this.openFramesInRunsPanel(),this.scheduleFrameRefresh(0)},pauseDeforumAnimation(){this.sendControl("liveParam",{is_paused_rendering:1}),this.deforumPlaying=!1,this.performance.status="Animation paused — parameter changes update preview",this.isPlaying=!1},stopDeforumPlay(){this.sendControl("liveParam",{is_paused_rendering:1,should_resume:0}),this.deforumPlaying=!1,this.clearHeldPreviewFrame(),this.deforumSessionStartedAt=null,this.performance.status="",this.isPlaying=!1;const t=this.playerEl||document.getElementById("player");t&&(t.pause(),t.currentTime=0),this.syncFrameSelectionFromPlayback(0)},async runStartupWarmup(){var t,e;if(!(this.deforumPlaying||typeof fetch!="function")&&(e=(t=this.apiStatus)==null?void 0:t.sdForge)!=null&&e.available)try{const i=await fetch("/api/deforum/warmup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({maxFrames:48,fps:12})});if(!i.ok)return;const n=await i.json();n.ok&&n.status!=="already_running"&&(this.performance.status="Startup clip generating… (WebGL stays visible until frames arrive)")}catch{}},async toggleStreamRecord(){if(this.isRecording){this.isRecording=!1;try{const e=await(await fetch("/api/stream/stop-record",{method:"POST"})).json();this.performance.status=e.success?"Recording stopped":e.error||"Stop failed"}catch{this.performance.status="Stop record failed"}}else{this.isRecording=!0;const t=`/tmp/defora_rec_${Date.now()}.mp4`;try{const i=await(await fetch("/api/stream/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({output:t,fps:24})})).json(),n=String(i.error||i.message||"").trim();this.performance.status=i.success?`Recording → ${t}`:n.includes("python")?"Recording unavailable (Python not installed on server)":n||"Record failed",i.success||(this.isRecording=!1)}catch(e){this.isRecording=!1;const i=String(e.message||e);this.performance.status=i.includes("python")?"Recording unavailable (Python not installed on server)":"Record failed"}}},async toggleRecord(){return this.toggleStreamRecord()},newStreamDestination(t="rtmp"){const e=["rtmp","srt","whip"].includes(t)?t:"rtmp",i={rtmp:"Custom RTMP",srt:"Custom SRT",whip:"Custom WHIP"},{width:n,height:s}=this.currentResolution();return{id:`stream_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,name:i[e]||"Custom Stream",protocol:e,target:"",fps:Number(this.generator&&this.generator.fps)||24,resolution:`${n}x${s}`,overlay:"",transition:"",kbps:null,health:"idle"}},normalizeStreamDestination(t,e=0){const i=t&&typeof t=="object"?t:{};return{id:i.id?String(i.id):`stream_saved_${e}`,name:String(i.name||"Custom Stream"),protocol:["rtmp","srt","whip"].includes(i.protocol)?i.protocol:"rtmp",target:String(i.target||"").trim(),fps:Number(i.fps)||24,resolution:String(i.resolution||"1024x576"),overlay:String(i.overlay||""),transition:String(i.transition||""),kbps:Number.isFinite(Number(i.kbps))?Number(i.kbps):null,health:String(i.health||"idle")}},addStreamDestination(t="rtmp"){const e=this.newStreamDestination(t);return this.streaming.destinations.push(e),this.saveSessionState(),e},streamDestinationViewUrl(t){const e=String(t&&t.target||"").trim();if(/^https?:\/\//i.test(e))return e;const i=String(this.hlsStreamHref||"/hls/live/deforum.m3u8");return typeof window<"u"&&window.location&&window.location.origin?`${window.location.origin}${i.startsWith("/")?i:`/${i}`}`:i},applyStreamMetricsToDestinations(t={}){const e=!!(t&&t.running),i=this.streaming.activeDestinationId,n=Number.isFinite(Number(t&&t.kbps))?Number(t.kbps):null,s=Number.isFinite(Number(t&&t.fps))?Number(t.fps):null,r=String(t&&t.health||(e?"healthy":"offline"));this.streaming.destinations=(this.streaming.destinations||[]).map(l=>e&&i===l.id?{...l,kbps:n,fps:s||l.fps,health:r}:l.health==="healthy"||l.health==="degraded"?{...l,health:"idle",kbps:null}:l)},removeStreamDestination(t){this.streaming.destinations=this.streaming.destinations.filter(e=>e.id!==t),this.streaming.activeDestinationId===t&&(this.streaming.activeDestinationId=null),this.saveSessionState()},async refreshStreamStatus(){try{const e=await(await fetch("/api/stream/status",{cache:"no-store"})).json(),i=e.metrics&&typeof e.metrics=="object"?e.metrics:{};if(this.streaming.activeStatus=e.status||i.status||"unknown",this.streaming.status=(e.output||"").trim()||(this.streaming.activeStatus==="running"?"Outbound stream is running.":"No outbound stream running."),this.streaming.activeStatus!=="running")this.streaming.activeDestinationId=null,this.applyStreamMetricsToDestinations({running:!1,health:"offline"});else{if(!this.streaming.activeDestinationId&&i.target){const s=(this.streaming.destinations||[]).find(r=>String(r.target||"").trim()===String(i.target).trim());s&&(this.streaming.activeDestinationId=s.id)}this.applyStreamMetricsToDestinations(i)}}catch(t){this.streaming.activeStatus="error",this.streaming.status=t.message||"Failed to read stream status",this.applyStreamMetricsToDestinations({running:!1,health:"error"})}},async startStreamDestination(t){const e=this.streaming.destinations.find(n=>n.id===t);if(!e)return;const i=String(e.target||"").trim();if(!i){this.streaming.status="Destination URL is required.";return}try{const n=await fetch("/api/stream/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({target:i,fps:Number(e.fps)||24,resolution:e.resolution||void 0,protocol:e.protocol||void 0,overlay:e.overlay?String(e.overlay).trim():void 0,transition:e.transition?String(e.transition).trim():void 0})}),s=await n.json();if(!n.ok||!s.success)throw new Error(s.error||s.message||"Could not start outbound stream");this.streaming.activeDestinationId=t,this.streaming.activeStatus="running",this.streaming.status=(s.message||"").trim()||`Streaming to ${e.name}`,this.streamUrl=i,e.health="healthy",this.saveSessionState(),this.refreshStreamStatus()}catch(n){this.streaming.activeStatus="error",this.streaming.status=n.message||"Could not start outbound stream";const s=this.streaming.destinations.find(r=>r.id===t);s&&(s.health="error")}},async stopOutboundStream(){try{const t=await fetch("/api/stream/stop",{method:"POST"}),e=await t.json();if(!t.ok||!e.success)throw new Error(e.error||e.message||"Could not stop outbound stream");this.streaming.activeDestinationId=null,this.streaming.activeStatus="stopped",this.streaming.status=(e.message||"").trim()||"Outbound stream stopped.",this.applyStreamMetricsToDestinations({running:!1,health:"offline"}),this.saveSessionState()}catch(t){this.streaming.activeStatus="error",this.streaming.status=t.message||"Could not stop outbound stream"}},normalizeDefaultAnimationSettings(t={}){const e=t&&typeof t=="object"?t:{},i=["instancing","volume","orbital","nebula","raycast","marching","ocean","customlights"].includes(e.mode)?e.mode:"customlights";return{preferDeforumVideo:!!e.preferDeforumVideo,showStandbyClip:!!e.showStandbyClip,autoTransitionToDeforum:e.autoTransitionToDeforum!==!1,mode:i,instCount:Math.max(1e3,Math.min(5e4,Math.round(Number(e.instCount)||12e3))),beamCount:Math.max(3,Math.min(12,Math.round(Number(e.beamCount)||7))),speed:Math.max(.1,Math.min(2.5,Number(e.speed)||.75)),spread:Math.max(.2,Math.min(2.5,Number(e.spread)||.68)),glow:Math.max(.1,Math.min(1.4,Number(e.glow)||.78)),hue:Math.max(0,Math.min(1,Number.isFinite(Number(e.hue))?Number(e.hue):.6)),pulse:Math.max(0,Math.min(1,Number.isFinite(Number(e.pulse))?Number(e.pulse):.36)),drift:Math.max(0,Math.min(1,Number.isFinite(Number(e.drift))?Number(e.drift):.44)),mist:Math.max(0,Math.min(1,Number.isFinite(Number(e.mist))?Number(e.mist):.58)),orbit:Math.max(0,Math.min(1,Number.isFinite(Number(e.orbit))?Number(e.orbit):.52)),lineType:e.lineType==="line"?"line":"segments",lineWidth:Math.max(1,Math.min(10,Number(e.lineWidth)||2.4)),lineThreshold:Math.max(0,Math.min(10,Number.isFinite(Number(e.lineThreshold))?Number(e.lineThreshold):.8)),lineTranslation:Math.max(0,Math.min(10,Number.isFinite(Number(e.lineTranslation))?Number(e.lineTranslation):0)),lineWorldUnits:e.lineWorldUnits!==!1,lineVisualizeThreshold:!!e.lineVisualizeThreshold,lineAlphaToCoverage:e.lineAlphaToCoverage!==!1,lineAnimate:e.lineAnimate!==!1,mcMaterial:["shiny","chrome","liquid","matte","flat","plastic","colors","multiColors"].includes(e.mcMaterial)?e.mcMaterial:"shiny",mcNumBlobs:Math.max(1,Math.min(50,Math.round(Number(e.mcNumBlobs)||10))),mcResolution:Math.max(14,Math.min(100,Math.round(Number(e.mcResolution)||28))),mcIsolation:Math.max(10,Math.min(300,Math.round(Number(e.mcIsolation)||80))),mcFloor:e.mcFloor!==!1,mcWallX:!!e.mcWallX,mcWallZ:!!e.mcWallZ,ocElevation:Math.max(0,Math.min(90,Number(e.ocElevation)||2)),ocAzimuth:Math.max(-180,Math.min(180,Number.isFinite(Number(e.ocAzimuth))?Number(e.ocAzimuth):180)),ocExposure:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocExposure))?Number(e.ocExposure):.1)),ocDistortion:Math.max(0,Math.min(8,Number.isFinite(Number(e.ocDistortion))?Number(e.ocDistortion):3.7)),ocSize:Math.max(.1,Math.min(10,Number.isFinite(Number(e.ocSize))?Number(e.ocSize):1)),ocCloudCoverage:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudCoverage))?Number(e.ocCloudCoverage):.4)),ocCloudDensity:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudDensity))?Number(e.ocCloudDensity):.5)),ocCloudElevation:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudElevation))?Number(e.ocCloudElevation):.5)),forgeLayerOpacity:Math.max(0,Math.min(1,Number.isFinite(Number(e.forgeLayerOpacity))?Number(e.forgeLayerOpacity):0)),rememberCompositorLayerOnStartup:!!e.rememberCompositorLayerOnStartup,previewCompositorCrossfadeMs:Math.max(0,Math.min(5e3,Math.round(Number(e.previewCompositorCrossfadeMs)||800))),forgeLayerOpacityLfoLink:(()=>{const n=Number(e.forgeLayerOpacityLfoLink);return n>=1&&n<=6?n:null})(),forgeLayerOpacityLfoBase:Math.max(0,Math.min(1,Number.isFinite(Number(e.forgeLayerOpacityLfoBase))?Number(e.forgeLayerOpacityLfoBase):Number(e.forgeLayerOpacity)||0)),deforumBackdropEnabled:e.deforumBackdropEnabled!==!1,deforumBackdropMix:Math.max(0,Math.min(1,Number.isFinite(Number(e.deforumBackdropMix))?Number(e.deforumBackdropMix):.35))}},onDefaultAnimationInput(){this.defaultAnimation=this.normalizeDefaultAnimationSettings(this.defaultAnimation),this.saveSessionState()},liveParamCanonicalKey(t){return t&&(this.liveParamAliases[t]||t)},liveHudParamByKey(t){return[...this.liveVibe,...this.liveCam].find(e=>e.key===t)||null},paramControlMeta(t){var s;const e=this.liveParamCanonicalKey(t);let i=this.liveHudParamByKey(t);if(!i){const r=(s=Object.entries(this.liveParamAliases).find(([,l])=>l===t||l===e))==null?void 0:s[0];r&&(i=this.liveHudParamByKey(r))}if(i)return{min:Number(i.min??0),max:Number(i.max??1),step:Number(i.step??.01)||.01,routeKey:e,hud:i,value:Number(i.val??0)};const n=this.modulationTargetByKey(e)||this.modulationTargetByKey(t);if(n){let r=Number(n.default??0);if(n.field&&this.defaultAnimation){const l=Number(this.defaultAnimation[n.field]);Number.isFinite(l)&&(r=l)}else n.key==="translation_x"?r=Number(this.motionPadValues.translation_x??0):n.key==="translation_y"?r=Number(this.motionPadValues.translation_y??0):n.key==="translation_z"?r=Number(this.motionPadValues.translation_z??0):n.key==="zoom_2d"&&(r=Number(this.motionPadValues.zoom??1));return{min:Number(n.min??0),max:Number(n.max??1),step:Number(n.step??.01)||.01,routeKey:n.key,hud:null,value:r}}return{min:0,max:1,step:.01,routeKey:e,hud:null,value:0}},clampParamToMeta(t,e){const i=Number((e==null?void 0:e.min)??0),n=Number((e==null?void 0:e.max)??1),s=Number((e==null?void 0:e.step)??.01)||.01;let r=this.clampVal(Number(t),i,n);if(s>0){r=Math.round(r/s)*s;const l=(String(s).split(".")[1]||"").length;l>0&&(r=Number(r.toFixed(l)))}return r},syncHudMotionFromParam(t,e){const i=Number(e);Number.isFinite(i)&&(t==="panx"?this.motionPadValues.translation_x=i:t==="pany"?this.motionPadValues.translation_y=i:t==="zoom"&&(this.motionPadValues.zoom=i))},modulationTargetByKey(t){if(!t)return null;const e=this.liveParamCanonicalKey(t);return this.lfoTargets.find(i=>i.key===e||i.key===t)||this.animationTargets.find(i=>i.key===e||i.key===t)||null},isAnimationModKey(t){return typeof t=="string"&&t.startsWith("anim_")},applyAnimationModulation(t,e){t&&(this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,[t]:e}))},routeModulationValue(t,e,i,n){const s=H1(t);if(s){this.writeCommonVisualValue(s.pluginId,s.paramId,e);return}if(String(t).startsWith("wan.")){this.onWanEngineFieldChange(String(t).slice(4),e,"number");return}const r=this.animationTargets.find(l=>l.key===t);if(r){this.applyAnimationModulation(r.field,e);return}if(t.startsWith("cn_")){const l=t.split("_"),o=l[1],d=l[2],u=this.cn.slots.find(h=>h.id===o);u&&(d==="weight"?u.weight=e:d==="start"?u.start=e:d==="end"&&(u.end=e),n[o]=u);return}i[t]=e},readCommonVisualValue(t,e){var s,r,l;const i=uu(t,e),n=id.find(o=>o.id===e);if(!n||i.type==="disabled")return(n==null?void 0:n.default)??0;if(i.type==="animation"){const o=i.field,d=Number((s=this.defaultAnimation)==null?void 0:s[o]);return Number.isFinite(d)?d:n.default}if(i.type==="schedule"){const o=of((r=this.deforumSettings)==null?void 0:r[i.key],0),d=Number(o);return Number.isFinite(d)?d:n.default}if(i.type==="wan"){const o=Number((l=this.wanEngine)==null?void 0:l[i.key]);return Number.isFinite(o)?o:n.default}return n.default},writeCommonVisualValue(t,e,i){const n=uu(t,e);if(n.type==="disabled")return;const s=id.find(o=>o.id===e),r=Number(i);if(!Number.isFinite(r)||!s)return;const l=this.clampVal(r,s.min,s.max);if(n.type==="animation"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,[n.field]:l}),this.saveSessionState();return}if(n.type==="schedule"){this.onDeforumFieldInput(n.key,`0:(${l})`,"text");return}n.type==="wan"&&this.onWanEngineFieldChange(n.key,l,"number")},onCommonVisualInput(t,e,i){const n=i||this.activeAnimationPluginId;n&&this.writeCommonVisualValue(n,t,e)},commonVisualItemsForPlugin(t){return t?id.map(e=>{const i=!W1(t,e.id),n=i?e.default:this.readCommonVisualValue(t,e.id),s=Number.isFinite(n)?Math.abs(n)>=10?n.toFixed(1):n.toFixed(2):"—";return{...e,paramId:e.id,value:n,readout:s,disabled:i}}):[]},setDefaultAnimationMode(t){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,mode:t}),this.saveSessionState()},resetDefaultAnimationSettings(){const t=!!(this.defaultAnimation&&this.defaultAnimation.preferDeforumVideo);this.defaultAnimation=this.normalizeDefaultAnimationSettings({preferDeforumVideo:t}),this.saveSessionState()},setPreferDeforumVideo(t){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:t}),t?(this.isForgeAnimationLayerActive||(this.activeVideoLayerId="deforum"),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer()):this.isForgeAnimationLayerActive&&(this.activeVideoLayerId="webgl"),this.saveSessionState()},async loadStandbyPreviewVideo(){try{if(!(await fetch("/api/preview/standby-video",{method:"HEAD"})).ok)return;this.standbyPreviewVideoUrl="/api/preview/standby-video",this.$nextTick(()=>this.attachStandbyPreview())}catch{}},attachStandbyPreview(){const t=this.$refs.standbyPreviewEl;!t||!this.standbyPreviewVideoUrl||typeof t.play=="function"&&t.play().catch(()=>{})},setHlsPreviewStreamValid(t){this.hlsPreviewStreamValid=!!t},enableHlsWatch(){this.hlsPreviewStreamValid&&(this.hlsWatchEnabled||(this.hlsWatchEnabled=!0,this.videoReady=!1,this.attachPlayer(),this.saveSessionState()))},disableHlsWatch(){this.hlsWatchEnabled&&(this.hlsWatchEnabled=!1,this.detachHlsPlayer(),this.saveSessionState())},detachHlsPlayer(){const t=this.playerEl||document.getElementById("player");t&&(this.detachPlayerListeners(t),typeof t.pause=="function"&&t.pause(),t.removeAttribute("src"),typeof t.load=="function"&&t.load()),this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),this.videoReady=!1,this.markVideoReady(!1)},rebuildVideoLayers(){const t=Array.isArray(this.videoLayers)?this.videoLayers:[],e=s=>{const r=t.find(l=>l&&l.id===s);return r?r.previewVisible!==!1:!0},i=(s,r)=>{var o;const l=t.find(d=>d&&d.id===s);if(l&&Number.isFinite(Number(l.opacity)))return Math.max(0,Math.min(1,Number(l.opacity)));if(r==="deforum"||r==="wan"||r==="blend"){const d=Number((o=this.defaultAnimation)==null?void 0:o.forgeLayerOpacity);return Number.isFinite(d)?Math.max(0,Math.min(1,d)):0}return r==="webgl"?1:0},n=(this.liveSources||[]).map(s=>({id:s.id,kind:s.type==="cloud"?"cloud":"library",label:s.label||"Source",playbackUrl:s.playbackUrl||null,url:s.url||null,builtin:!1,previewVisible:!0,opacity:1}));this.videoLayers=[{id:"webgl",kind:"webgl",label:"WebGL",builtin:!0,previewVisible:e("webgl"),opacity:i("webgl","webgl")},{id:"deforum",kind:"deforum",label:"Deforum",builtin:!0,previewVisible:e("deforum"),opacity:i("deforum","deforum")},{id:"wan",kind:"wan",label:"WAN Video",builtin:!0,previewVisible:e("wan"),opacity:i("wan","wan")},{id:"input",kind:"input",label:this.inputLayerLabel||"Input",playbackUrl:this.inputLayerPlaybackUrl||null,builtin:!0,previewVisible:e("input"),opacity:i("input","input")},...n]},findVideoLayer(t){return(this.videoLayers||[]).find(e=>e&&e.id===t)||null},readVideoLayerOpacity(t){var i;if(!t)return 1;const e=Number(t.opacity);if(Number.isFinite(e))return Math.max(0,Math.min(1,e));if(t.kind==="deforum"||t.kind==="wan"||t.kind==="blend"){const n=Number((i=this.defaultAnimation)==null?void 0:i.forgeLayerOpacity);return Number.isFinite(n)?Math.max(0,Math.min(1,n)):0}return 1},layerKindVisible(t){const e=(this.videoLayers||[]).find(i=>i&&i.kind===t);return e?!(!this.isVideoLayerPreviewVisible(e)||this.readVideoLayerOpacity(e)<=.001):!0},videoLayerRenderStyle(t){const e=this.findVideoLayer(t);if(!e||!this.isVideoLayerPreviewVisible(e))return{opacity:"0",visibility:"hidden",pointerEvents:"none"};const i=this.readVideoLayerOpacity(e);return i<=.001?{opacity:"0",visibility:"hidden",pointerEvents:"none"}:{opacity:String(i),visibility:"visible"}},setVideoLayerOpacity(t,e){const i=this.findVideoLayer(t);if(!i||!i.builtin)return;const n=Math.max(0,Math.min(1,Number(e)));i.opacity=n,i.kind==="deforum"||i.kind==="wan"||i.kind==="blend"?this.applyForgeLayerOpacity(n,{commitBase:!0}):this.saveSessionState()},isVideoLayerPreviewVisible(t){return!!(t&&t.previewVisible!==!1)},toggleVideoLayerPreview(t){const e=this.findVideoLayer(t);if(!(!e||!e.builtin)){if(e.previewVisible=e.previewVisible===!1,e.previewVisible===!1&&this.activeVideoLayerId===t){const i=(this.videoLayers||[]).find(n=>n&&n.builtin&&n.id!==t&&n.previewVisible!==!1);i&&this.selectVideoLayer(i.id)}this.saveSessionState()}},videoLayerStatusShort(t){const e=this.layerStatus(t);return e==="green"?"Ready":e==="yellow"?"Loading":"Offline"},toggleEnginePanelDetails(t){const e=typeof t=="boolean"?t:!this.enginePanelDetailsOpen;this.enginePanelDetailsOpen=e,this.liveAnimationBoxOpen=e,e&&this.enginePanelDetailsTab==="JOB"&&this.ensureForgeSamplerSchedulerLists(),this.saveSessionState()},setEnginePanelDetailsTab(t){t!=="ENGINE"&&t!=="JOB"||(this.enginePanelDetailsTab=t,this.currentSubTab.LIVE=t==="JOB"?"DEFORUM_JOB":"MONITOR",this.currentTab==="LIVE"&&!this.liveEngineDrawerOpen&&(this.liveEngineDrawerOpen=!0),t==="JOB"&&this.ensureForgeSamplerSchedulerLists(),this.saveSessionState())},openEngineControlsInRightPanel(){this.setEnginePanelDetailsTab("ENGINE")},async probeHlsPreviewStream(){if(typeof fetch=="function")try{const t=String(this.streamSrc||"/hls/live/deforum.m3u8"),e=t.includes("?")?`${t}&probe=${Date.now()}`:`${t}?probe=${Date.now()}`;(await fetch(e,{method:"GET",cache:"no-store"})).ok&&this.setHlsPreviewStreamValid(!0)}catch{}},async preloadDeforumPipeline({force:t=!1}={}){var i,n,s;if(this._preloadDeforumStarted&&!t)return;this._preloadDeforumStarted=!0,this.deforumPreloadStatus="Preparing Deforum…",this.ensureForgeSamplerSchedulerLists(),this.probeHlsPreviewStream(),this.deforumPlaying||this.scheduleDeforumPreview(),!!((n=(i=this.apiHealth)==null?void 0:i.sdForge)!=null&&n.available||(s=this.forge)!=null&&s.available)?(await this.runStartupWarmup(),this.deforumPreloadStatus=this.deforumGeneratedFrameCount>0?"Deforum ready":"Deforum warming up in background"):this.deforumPreloadStatus="Waiting for Forge…"},initVideoLayers(){var n,s;this.rebuildVideoLayers();const t=new Set(this.videoLayers.map(r=>r.id));!!((n=this.defaultAnimation)!=null&&n.rememberCompositorLayerOnStartup)&&!!((s=this.defaultAnimation)!=null&&s.preferDeforumVideo)&&t.has("deforum")?this.activeVideoLayerId="deforum":t.has(this.activeVideoLayerId)||(this.activeVideoLayerId="webgl"),this.$nextTick(()=>{this.showLayerInputVideo&&this.attachInputVideo(this.activeLayerPlaybackUrl)})},ensureStandbyAnimationAtStartup(){var s,r,l;const t=!!((s=this.defaultAnimation)!=null&&s.rememberCompositorLayerOnStartup),e=t&&!!((r=this.defaultAnimation)!=null&&r.preferDeforumVideo),i=this.deforumPlaying&&this.videoReady;!e&&!i&&this.activeVideoLayerId!=="webgl"&&!this.isBlendLayerActive&&(this.activeVideoLayerId="webgl");const n=this.findVideoLayer("webgl");n&&!t&&(n.previewVisible=!0,(!Number.isFinite(Number(n.opacity))||Number(n.opacity)<=0)&&(n.opacity=1)),(l=this.defaultAnimation)!=null&&l.mode||(this.defaultAnimation=this.normalizeDefaultAnimationSettings(this.defaultAnimation)),this.$nextTick(()=>this.kickstandbyAnimation())},pinHeldPreviewFrame(){const t=this.activePreviewStillPath||this.displayedPreviewStillPath;t&&(this.heldPreviewFramePath=t)},clearHeldPreviewFrame(){this.heldPreviewFramePath=""},clearFrameThumbLoadingState(){this.frameThumbLoadingKeys={}},markFrameThumbLoading(t){const e=this.frameSrcKey(t);if(!e)return;const i=this.frameThumbLoadingKeys||{};i[e]||(this.frameThumbLoadingKeys={...i,[e]:!0})},markFrameThumbLoaded(t){const e=this.frameSrcKey(t);if(!e||!this.frameThumbLoadingKeys[e])return;const i={...this.frameThumbLoadingKeys};delete i[e],this.frameThumbLoadingKeys=i},isFrameThumbLoading(t){const e=this.frameSrcKey(t&&(t.src||t.url||t.path||""));return!!e&&!!this.frameThumbLoadingKeys[e]},onFrameThumbImageLoad(t){this.markFrameThumbLoaded(t&&(t.src||t.url||t.path||""))},onFrameThumbImageError(t){this.markFrameThumbLoaded(t&&(t.src||t.url||t.path||""))},onPreviewStillImageLoad(){this.markFrameThumbLoaded(this.displayedPreviewStillPath)},onPreviewStillImageError(){this.markFrameThumbLoaded(this.displayedPreviewStillPath)},applyNewGeneratedFrames(t){const e=this.frameStripThumbs,i=e.length;if(!(i<=t)){for(let n=t;n{!s||!s.builtin||s.id!=="webgl"&&(s.kind==="deforum"||s.kind==="wan"||s.kind==="blend"?(s.opacity=0,s.id!=="deforum"&&(s.previewVisible=!1)):s.kind==="input"&&(s.opacity=0))}),this.applyForgeLayerOpacity(0,{commitBase:!0})}this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:t?this.defaultAnimation.preferDeforumVideo:!1,autoTransitionToDeforum:((i=this.defaultAnimation)==null?void 0:i.autoTransitionToDeforum)!==!1}),this.$nextTick(()=>this.kickstandbyAnimation())},applyContextPanelStartupDefaults(){var i,n;let t=!1;try{const s=(i=window.localStorage)==null?void 0:i.getItem(this.sessionStorageKey());if(s){const r=JSON.parse(s);t=typeof r.rightPanelOpen=="boolean"||typeof r.liveDrawerOpen=="boolean"}}catch{}t||(this.rightPanelOpen=!0,this.liveDrawerOpen=!0);let e="LIVE";try{e=((n=window.localStorage)==null?void 0:n.getItem("defora_tab"))||"LIVE"}catch{}e==="LIVE"&&!this.libraryWorkspaceOpen&&this.switchTab("MODULATION")},promoteToDeforum(){this.selectVideoLayer("deforum",{userInitiated:!0})},openEngineDeforumSettingsTab(t="canvas"){const i=(this.deforumFieldGroups||[]).map(n=>n.id).includes(t)?t:"canvas";this.liveEngineDrawerOpen=!0,this.promoteToDeforum(),this.deforumActiveTab=i,this.saveSessionState()},applyForgeLayerOpacity(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);this.defaultAnimation.forgeLayerOpacity=n,(e||!i)&&(this.defaultAnimation.forgeLayerOpacityLfoBase=n),(this.videoLayers||[]).forEach(s=>{s&&(s.kind==="deforum"||s.kind==="wan"||s.kind==="blend")&&(s.opacity=n)}),i||this.onDefaultAnimationInput(),this.syncDeforumBackdropToWebGL()},syncDeforumBackdropToWebGL(){var o,d;const t=this.$refs.threeBackgroundRef;if(!t||typeof t.setDeforumBackdropFromUrl!="function")return;if(((o=this.defaultAnimation)==null?void 0:o.deforumBackdropEnabled)===!1){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}if(!(this.isWebglLayerActive||this.isBlendLayerActive)){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}const i=(this.thumbs||[]).slice(-1)[0],n=i&&(i.src||i.url||i.path);if(!n){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}const s=this.clampVal(Number(((d=this.defaultAnimation)==null?void 0:d.deforumBackdropMix)??.35),0,1),r=this.effectiveForgeLayerOpacity,l=this.isBlendLayerActive?s*(1-r):s;t.setDeforumBackdropFromUrl(n,{opacity:l})},setForgeLayerOpacityLfoLink(t){const e=Number(t||0),i=e>=1&&e<=6?e:null;if(this.defaultAnimation.forgeLayerOpacityLfoLink=this.defaultAnimation.forgeLayerOpacityLfoLink===i?null:i,this.defaultAnimation.forgeLayerOpacityLfoBase=this.defaultAnimation.forgeLayerOpacity,this.defaultAnimation.forgeLayerOpacityLfoLink){const n=this.lfos.find(s=>s.id===this.defaultAnimation.forgeLayerOpacityLfoLink);n&&(n.on=!0),this.isForgeAnimationLayerActive||this.selectVideoLayer("deforum",{userInitiated:!1})}this.onDefaultAnimationInput()},maybePromoteDeforumPreview(){(this.defaultAnimation||{}).autoTransitionToDeforum!==!1&&(this._userPickedPreviewLayer||this.activeVideoLayerId==="webgl"&&(!this.deforumPlaying&&!this.deforumGeneratedFrameCount||this.selectVideoLayer("deforum",{userInitiated:!1})))},kickstandbyAnimation(t=0){const e=this.$refs.threeBackgroundRef;if(e&&typeof e.ensureRunning=="function"){e.ensureRunning();return}t<30&&typeof requestAnimationFrame=="function"&&requestAnimationFrame(()=>this.kickstandbyAnimation(t+1))},selectVideoLayer(t,e={}){if(!this.videoLayers.find(n=>n.id===t))return;e.userInitiated!==!1&&(this._userPickedPreviewLayer=!0),this.activeVideoLayerId=t;const i=this.activeVideoLayer;if((i==null?void 0:i.kind)==="webgl"){this.setPreferDeforumVideo(!1),this.clearHeldPreviewFrame(),this.kickstandbyAnimation();return}if((i==null?void 0:i.kind)==="blend"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.kickstandbyAnimation(),this.saveSessionState();return}if((i==null?void 0:i.kind)==="deforum"){this.setPreferDeforumVideo(!0),this.deforumPlaying||(this.scheduleDeforumPreview(),this.preloadDeforumPipeline());return}if((i==null?void 0:i.kind)==="wan"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview(),this.saveSessionState();return}if((i==null?void 0:i.kind)==="wan"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.queueDeforumSettingsSave(),this.saveSessionState();return}this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!1}),(i!=null&&i.playbackUrl||(i==null?void 0:i.kind)==="input"&&this.inputLayerPlaybackUrl)&&this.$nextTick(()=>this.attachInputVideo(this.activeLayerPlaybackUrl)),this.saveSessionState()},toggleVideoLayerAdd(t){const e=typeof t=="boolean"?t:!this.videoLayerAddOpen;this.videoLayerAddOpen=e,e&&!this.systemFiles._rootsLoaded&&this.initSystemFilesBrowser(),this.saveSessionState()},_buildSceneSnapshot(t){return{name:t,layers:(this.videoLayers||[]).map(e=>({id:e.id,kind:e.kind,opacity:typeof e.opacity=="number"?e.opacity:1,previewVisible:e.previewVisible!==!1})),activeLayerId:this.activeVideoLayerId}},syncLayerCompositing(){this.$nextTick(()=>{typeof this.onDefaultAnimationInput=="function"&&this.onDefaultAnimationInput()})},_applySceneSnapshot(t){!t||!Array.isArray(t.layers)||((this.videoLayers||[]).forEach(e=>{const i=t.layers.find(n=>n.id===e.id);i&&(e.opacity=typeof i.opacity=="number"?i.opacity:e.opacity,e.previewVisible=i.previewVisible!==!1)}),t.activeLayerId&&(this.activeVideoLayerId=t.activeLayerId),this.syncLayerCompositing(),this.saveSessionState())},saveScene(t,e=!1){const i=(t||"").trim()||"scene",n=this._buildSceneSnapshot(i),s=Array.isArray(this.savedScenes)?[...this.savedScenes]:[],r=s.findIndex(l=>l.name===i);r>=0?s[r]=n:s.push(n),this.savedScenes=s,e&&(this.defaultSceneName=i);try{localStorage.setItem("defora_scenes",JSON.stringify({scenes:s,defaultSceneName:this.defaultSceneName}))}catch{}this.saveSessionState()},loadScene(t){const e=(this.savedScenes||[]).find(i=>i.name===t);e&&this._applySceneSnapshot(e)},deleteScene(t){this.savedScenes=(this.savedScenes||[]).filter(e=>e.name!==t),this.defaultSceneName===t&&(this.defaultSceneName="default");try{localStorage.setItem("defora_scenes",JSON.stringify({scenes:this.savedScenes,defaultSceneName:this.defaultSceneName}))}catch{}this.saveSessionState()},initDefaultScene(){try{const t=localStorage.getItem("defora_scenes");if(t){const e=JSON.parse(t);if(Array.isArray(e.scenes)&&e.scenes.length){this.savedScenes=e.scenes,this.defaultSceneName=e.defaultSceneName||"default";const i=e.scenes.find(n=>n.name===(e.defaultSceneName||"default"));if(i){this._applySceneSnapshot(i);return}}}}catch{}(this.videoLayers||[]).forEach(t=>{t.id==="webgl"?(t.opacity=1,t.previewVisible=!0):t.id==="deforum"?(t.opacity=0,t.previewVisible=!0):t.id==="wan"?(t.opacity=0,t.previewVisible=!1):(t.previewVisible=!1,t.opacity=0)}),this.applyForgeLayerOpacity(0,{commitBase:!0}),this.syncLayerCompositing()},closeVideoLayer(t){t==="webgl"||t==="deforum"||t==="wan"||t==="blend"||t==="input"||(this.removeLiveSource(t),this.activeVideoLayerId===t&&this.selectVideoLayer("input"))},attachInputVideo(t){var i,n,s,r,l;const e=this.$refs.inputVideoEl;if(!(!e||!t)){this.inputVideoReady=!1,this._inputVideoReadyHandler||(this._inputVideoReadyHandler=()=>{try{this.inputVideoReady=e.readyState>=2}catch{this.inputVideoReady=!0}}),(i=e.removeEventListener)==null||i.call(e,"loadeddata",this._inputVideoReadyHandler),(n=e.removeEventListener)==null||n.call(e,"canplay",this._inputVideoReadyHandler),(s=e.addEventListener)==null||s.call(e,"loadeddata",this._inputVideoReadyHandler),(r=e.addEventListener)==null||r.call(e,"canplay",this._inputVideoReadyHandler),e.src!==t&&(e.src=t,e.load());try{const o=(l=e.play)==null?void 0:l.call(e);o&&typeof o.catch=="function"&&o.catch(()=>{})}catch{}}},openCloudLayer(t){t!=null&&t.url&&window.open(t.url,"_blank","noopener")},toggleVideoStageSize(t){const e=["small","medium","full"],i=e.includes(String(t))?String(t):null,n=["small","medium","full"],s=e.includes(this.videoStageSize)?this.videoStageSize:"medium",r=i||n[(n.indexOf(s)+1)%n.length];this.videoStageSize=r,this.saveSessionState()},isVideoLayerRunning(t){return t?t.kind==="webgl"?this.layerKindVisible("webgl"):t.kind==="deforum"||t.kind==="wan"?this.deforumPlaying||this.videoReady||this.deforumGeneratedFrameCount>0||this.showFrameProcessing:t.kind==="blend"?this.showDefaultAnimation&&(this.showDeforumVideo||this.deforumPlaying||this.videoReady||this.deforumGeneratedFrameCount>0):t.kind==="input"?!!(this.inputLayerPlaybackUrl||t.playbackUrl):t.kind==="library"?!!t.playbackUrl:t.kind==="cloud"?!!t.url:this.layerStatus(t)!=="red":!1},layerStatus(t){return t?t.kind==="webgl"?"green":t.kind==="blend"?this.showDeforumVideo?"green":this.deforumPlaying||this.videoReady?"yellow":"green":t.kind==="deforum"||t.kind==="wan"?this.videoReady?"green":this.deforumPlaying||this.defaultAnimation&&this.defaultAnimation.preferDeforumVideo||t.kind==="wan"?"yellow":"red":t.kind==="input"?this.inputLayerPlaybackUrl?this.inputVideoReady?"green":"yellow":"red":t.kind==="library"?t.playbackUrl?this.inputVideoReady?"green":"yellow":"red":t.kind==="cloud"&&t.url?"yellow":"red":"red"},animationLayerDescription(t){var e,i;if(!t)return"";if(t.kind==="webgl")return`Standby WebGL · ${String(((e=this.defaultAnimation)==null?void 0:e.mode)||"instancing")}`;if(t.kind==="deforum")return this.deforumPlaying?"Deforum batch · animating":this.videoReady?"Deforum · live HLS feed":"Deforum · preview stills / batch";if(t.kind==="wan"){const n=String(((i=this.wanEngine)==null?void 0:i.wan_t2v_model)||"Wan").trim();return this.deforumPlaying?`WAN Video · ${n} · generating`:this.videoReady?`WAN Video · ${n} · live`:`WAN Video · ${n} · idle`}return t.kind==="blend"?"Composite · WebGL under Deforum":t.kind==="input"?this.inputLayerPlaybackUrl?`Input · ${this.inputLayerLabel||"Video"}`:"Input · link a library or cloud source":t.kind==="library"?t.label||"Library video layer":t.kind==="cloud"?t.label||"Cloud link layer":t.label||""},assignInputFromSelection(){const e=(this.systemFiles.selectedPaths||[]).map(i=>(this.systemFiles.videos||[]).find(n=>n.path===i)).filter(Boolean)[0];if(!e){this.liveSourceStatus="Select a video in the library grid first";return}this.inputLayerPlaybackUrl=this.systemFilePlaybackUrl(e),this.inputLayerLabel=e.name||"Input",this.rebuildVideoLayers(),this.selectVideoLayer("input"),this.liveSourceStatus=`Assigned to Input layer: ${this.inputLayerLabel}`,this.videoLayerAddOpen=!1,this.saveSessionState()},toggleLibraryWorkspace(){this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.openLibraryWorkspace("browser")},openLibraryWorkspace(t="browser",e={}){e&&e.asSource&&(this.librarySourceMode=!0),this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane=t==="editor"?"editor":"browser",this.initSystemFilesBrowser(),this.saveSessionState()},closeLibraryWorkspace(){this.libraryWorkspaceOpen=!1,this.libraryWorkspacePane="browser",this.librarySourceMode=!1,this.saveSessionState()},setLibraryWorkspacePane(t){const e=t==="editor"?"editor":"browser";this.libraryWorkspacePane!==e&&(this.libraryWorkspacePane=e,this.saveSessionState())},openLibraryVideoEditor(){this.openLibraryWorkspace("editor")},closeLibraryEditor(){this.setLibraryWorkspacePane("browser")},openInVideoEditor(t){var n;const e=(n=this.librarySelectedProject)!=null&&n.videoPath?{path:this.librarySelectedProject.videoPath,rootId:this.librarySelectedProject.rootId||"uploads",name:this.librarySelectedProject.title,url:this.librarySelectedProject.videoUrl}:null,i=t||e||(this.systemFiles.videos||[]).find(s=>s.path===(this.systemFiles.selectedPaths||[])[0]);if(!i||!i.path){this.editorStatus="Select a video in the library first",this.editorStatusLive=!1,this.openLibraryWorkspace("browser"),this.saveSessionState();return}this.editorPendingImportPath=i.path,this.editorPendingImportRootId=i.rootId||this.systemFiles.rootId||"uploads",this.editorPendingImportUrl=i.url||this.systemFilePlaybackUrl(i),this.editorFreecutRoute="projects",this.editorStatus=`Ready to import ${i.name||"video"}`,this.editorStatusLive=!0,this.openLibraryWorkspace("editor")},useLibraryAudio(t,e={}){if(!(t!=null&&t.audioPath))return;const i=e.webgl??!!this.librarySourceMode;if(this.audio.objectUrl&&String(this.audio.objectUrl).startsWith("blob:"))try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.track=t.audioPath,this.audio.uploadedFile=t.title||t.audioName||"Audio",this.audio.objectUrl=t.audioUrl||null,this.audioBeatMacrosCollapsed=!0,this.primeAudioSpectrumPlaceholder();let n=!1;const s=()=>{if(!n){n=!0;try{this.setupLiveAudioAnalyser()}catch{}this.playAvSyncAudioForVisualizer(),this.audio.objectUrl&&(this.audioSpectrogramStatus="Analyzing…",this.scheduleAudioSpectrogramDecode(this._spectrogramGen)),i?this.applyAudioAsWebglSource():(this.audioStatus="Audio loaded from library",this.switchTab("AUDIO"))}},r=()=>{const l=this.$refs&&this.$refs.avSyncAudio;if(!l||!this.audio.objectUrl){s();return}const o=()=>{l.removeEventListener("canplay",o),s()};if(l.readyState>=2){s();return}l.addEventListener("canplay",o),typeof this.$nextTick=="function"&&this.$nextTick(()=>{l.readyState>=2&&o()})};typeof this.$nextTick=="function"?this.$nextTick(r):setTimeout(r,0),this.saveSessionState()},playAvSyncAudioForVisualizer(){const t=this.$refs&&this.$refs.avSyncAudio;if(!t||!this.audio.objectUrl)return Promise.resolve();t.loop=!0;try{const e=t.play&&t.play();return e&&typeof e.then=="function"?e.catch(()=>{}):Promise.resolve()}catch{return Promise.resolve()}},applyAudioAsWebglSource(){const t=this.findVideoLayer("webgl");t&&(t.previewVisible=!0,(!Number.isFinite(Number(t.opacity))||Number(t.opacity)<=0)&&(t.opacity=1)),this.selectVideoLayer("webgl"),this.currentTab!=="LIVE"&&this.switchTab("LIVE"),this.audioStatus="Audio driving WebGL visualizer",this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.librarySourceMode=!1},applyLibrarySelectionAsSource(){var i;const t=this.librarySelectedAudio;if(t!=null&&t.audioPath){this.useLibraryAudio(t,{webgl:!0});return}const e=(i=this.librarySelectedProject)!=null&&i.videoPath?this.librarySelectedProject:this.librarySelectedVideo;if(!(e!=null&&e.videoPath)){this.liveSourceStatus="Select audio or video in the library first";return}this.inputLayerPlaybackUrl=e.videoUrl||this.systemFilePlaybackUrl({path:e.videoPath,rootId:e.rootId||"uploads"}),this.inputLayerLabel=e.title||e.name||"Input",this.rebuildVideoLayers(),this.selectVideoLayer("input"),this.liveSourceStatus=`Assigned to Input layer: ${this.inputLayerLabel}`,this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.librarySourceMode=!1,this.saveSessionState()},isCloudStorageRoot(t){return String(t||this.systemFiles.rootId||"").startsWith("cloud:")},cloudStorageSourceId(t){const e=String(t||this.systemFiles.rootId||"");return e.startsWith("cloud:")?e.slice(6):""},cloudProviderLabel(t){return{google_drive:"Google Drive",dropbox:"Dropbox",onedrive:"OneDrive",other:"Cloud"}[String(t||"").toLowerCase()]||"Cloud"},async initSystemFilesBrowser(){try{if(!this.systemFiles._rootsLoaded){const t=await fetch("/api/video-swarm/roots"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load library roots");this.systemFiles.roots=Array.isArray(e.roots)?e.roots:[],this.systemFiles.cloudSources=Array.isArray(e.cloudSources)?e.cloudSources:[],this.systemFiles._rootsLoaded=!0}await this.refreshLibraryBrowse()}catch(t){this.systemFiles.status=t.message||"Library unavailable"}},async refreshLibraryBrowse(){const t=this.systemFiles.roots||[],e=t.find(i=>i.id===this.systemFiles.rootId)||t.find(i=>i.id==="uploads")||t.find(i=>i.id==="frames")||t[0];if(e){if(this.systemFiles.rootId=e.id,e.kind==="cloud"){await this.browseSystemFiles("",{rootId:e.id});return}await this.browseSystemFiles(e.path,{rootId:e.id})}},async refreshCloudSources(){try{const t=await fetch("/api/video-swarm/cloud-sources"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load cloud sources");this.systemFiles.cloudSources=Array.isArray(e.sources)?e.sources:[];const i=(this.systemFiles.roots||[]).filter(n=>n.kind!=="cloud");this.systemFiles.roots=[...i,...(this.systemFiles.cloudSources||[]).map(n=>({id:`cloud:${n.id}`,label:`${this.cloudProviderLabel(n.provider)} — ${n.label}`,kind:"cloud",provider:n.provider,url:n.url,path:""}))]}catch(t){this.systemFiles.status=t.message||"Cloud storage unavailable"}},async connectCloudStorage({label:t,provider:e,url:i}={}){const n=String(i||this.cloudDriveDraft.url||"").trim();if(!n){this.systemFiles.status="Enter a cloud share link";return}try{const s=await fetch("/api/video-swarm/cloud-sources",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({label:String(t||"").trim()||this.cloudProviderLabel(e||this.cloudDriveDraft.provider),provider:e||this.cloudDriveDraft.provider||"other",url:n})}),r=await s.json();if(!s.ok)throw new Error(r.error||"Could not connect cloud storage");this.cloudDriveDraft.url="",this.systemFiles.cloudConnectOpen=!1,await this.refreshCloudSources();const l=r.source;l&&l.id&&(this.systemFiles.rootId=`cloud:${l.id}`,await this.browseSystemFiles("",{rootId:this.systemFiles.rootId})),this.systemFiles.status="Cloud storage connected"}catch(s){this.systemFiles.status=s.message||"Could not connect cloud storage"}},async disconnectCloudStorage(t){const e=String(t||"").trim();if(e&&window.confirm("Remove this cloud connection from the browser?"))try{const i=await fetch(`/api/video-swarm/cloud-sources/${encodeURIComponent(e)}`,{method:"DELETE"}),n=await i.json();if(!i.ok)throw new Error(n.error||"Could not remove cloud storage");if(await this.refreshCloudSources(),this.isCloudStorageRoot(this.systemFiles.rootId)){const s=(this.systemFiles.roots||[]).find(r=>r.kind!=="cloud")||this.systemFiles.roots[0];s&&(this.systemFiles.rootId=s.id,await this.browseSystemFiles(s.path,{rootId:s.id}))}this.systemFiles.status="Cloud storage removed"}catch(i){this.systemFiles.status=i.message||"Could not remove cloud storage"}},openCloudStorageLink(t){const e=t&&t.url?String(t.url):"";if(e)try{window.open(e,"_blank","noopener,noreferrer")}catch{this.systemFiles.status="Could not open cloud link"}},async addCloudStorageVideo(t){const e=String(t||this.cloudStorageSourceId()||"").trim(),i=String(this.systemFiles.cloudVideoDraft.url||"").trim();if(!e||!i){this.systemFiles.status="Enter a direct video URL from the cloud share";return}try{const n=await fetch(`/api/video-swarm/cloud-sources/${encodeURIComponent(e)}/videos`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:String(this.systemFiles.cloudVideoDraft.name||"").trim(),url:i})}),s=await n.json();if(!n.ok)throw new Error(s.error||"Could not add cloud video");this.systemFiles.cloudVideoDraft={name:"",url:""},this.isCloudStorageRoot(this.systemFiles.rootId)&&await this.browseSystemFiles("",{rootId:this.systemFiles.rootId}),this.systemFiles.status="Cloud video added"}catch(n){this.systemFiles.status=n.message||"Could not add cloud video"}},toggleSystemFilesVideosOnly(){this.systemFiles.viewMode=this.systemFiles.viewMode==="videos-only"?"browse":"videos-only",this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState()},openNewFolderDialog(){if(this.isCloudStorageRoot()){this.systemFiles.status="Create folders on local storage roots only";return}this.systemFiles.newFolderName="",this.systemFiles.newFolderOpen=!0},cancelNewFolderDialog(){this.systemFiles.newFolderOpen=!1,this.systemFiles.newFolderName=""},async uploadSystemVideoFile(t,{target:e="uploads"}={}){var r;if(!t)return;const i=String(t.name||"upload.mp4"),n=i.includes(".")?i.slice(i.lastIndexOf(".")).toLowerCase():"";if(n&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(n)){this.systemFiles.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.systemFiles.loading=!0,this.systemFiles.status=`Uploading ${i}…`;try{const l=await t.arrayBuffer(),o=new URLSearchParams({name:i,dir:e==="videoswarm"?"videoswarm":"uploads"}),d=await fetch(`/api/video-swarm/upload?${o.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":i},body:l}),u=await d.json();if(!d.ok)throw new Error(u.error||"Upload failed");this.systemFiles.status=`Uploaded ${u.name||i}`;const h=this.systemFiles.currentPath||((r=(this.systemFiles.roots||[]).find(c=>c.id===(u.rootId||"uploads")))==null?void 0:r.path);await this.browseSystemFiles(h,{rootId:u.rootId||"uploads"}),u.path&&(this.systemFiles.selectedPaths=[u.path])}catch(l){this.systemFiles.status=l.message||"Upload failed"}finally{this.systemFiles.loading=!1}},async uploadSystemVideoFiles(t){const e=Array.from(t||[]).filter(i=>i&&i.size);if(e.length)for(const i of e)await this.uploadSystemVideoFile(i)},async createSystemFolder(){const t=String(this.systemFiles.newFolderName||"").trim();if(!t){this.systemFiles.status="Enter a folder name";return}if(this.isCloudStorageRoot()){this.systemFiles.status="Cannot create folders on cloud storage";return}try{const e=await fetch("/api/video-swarm/mkdir",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,path:this.systemFiles.currentPath,rootId:this.systemFiles.rootId})}),i=await e.json();if(!e.ok)throw new Error(i.error||"Could not create folder");this.systemFiles.newFolderOpen=!1,this.systemFiles.newFolderName="",await this.browseSystemFiles(this.systemFiles.currentPath),this.systemFiles.status=`Created folder “${t}”`}catch(e){this.systemFiles.status=e.message||"Could not create folder"}},systemFilesSortApiKey(t){const e=String(t||"name-asc").toLowerCase();return e.startsWith("mtime")||e==="date"?"date":e.startsWith("size")?"size":"name"},setSystemFilesSort(t){this.systemFiles.sortKey=t,this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState()},refreshSystemFilesBrowse(){var e;const t=this.systemFiles.currentPath||((e=(this.systemFiles.roots||[]).find(i=>i.id===this.systemFiles.rootId))==null?void 0:e.path);this.browseSystemFiles(t)},setSystemFilesZoom(t){this.systemFiles.zoomLevel=Math.max(0,Math.min(4,Number(t)||0)),this.saveSessionState()},async copySystemFilePath(t){const e=String(t||"").trim();if(e)try{await navigator.clipboard.writeText(e),this.systemFiles.status="Path copied",setTimeout(()=>{this.systemFiles.status==="Path copied"&&(this.systemFiles.status="")},2e3)}catch{this.systemFiles.status="Could not copy path"}},async browseSystemFiles(t,{rootId:e}={}){this.systemFiles.loading=!0;try{const i=e||this.systemFiles.rootId,n=new URLSearchParams;t&&n.set("path",t),i&&n.set("rootId",i);const s=this.systemFiles.viewMode==="videos-only";s?n.set("videosOnly","1"):this.systemFiles.recursive&&n.set("recursive","1"),n.set("sort",this.systemFilesSortApiKey(this.systemFiles.sortKey));const r=await fetch(`/api/video-swarm/browse?${n.toString()}`),l=await r.json();if(!r.ok)throw new Error(l.error||"Browse failed");if(this.systemFiles.cloudSource=l.kind==="cloud"&&l.cloudSource||null,this.systemFiles.currentPath=l.path||"",this.systemFiles.parent=l.parent||"",this.systemFiles.folders=s||l.kind==="cloud"?[]:Array.isArray(l.folders)?l.folders:[],this.systemFiles.videos=Array.isArray(l.videos)?l.videos:[],this.systemFiles.folderCount=Number.isFinite(Number(l.folderCount))?Number(l.folderCount):this.systemFiles.folders.length,this.systemFiles.videoCount=Number.isFinite(Number(l.videoCount))?Number(l.videoCount):this.systemFiles.videos.length,e)this.systemFiles.rootId=e;else if(this.systemFiles.currentPath){const o=(this.systemFiles.roots||[]).find(d=>{const u=String(d.path||"");return this.systemFiles.currentPath===u||this.systemFiles.currentPath.startsWith(`${u}/`)});o&&(this.systemFiles.rootId=o.id)}this.systemFiles.status=""}catch(i){this.systemFiles.status=i.message||"Could not browse folder",this.systemFiles.folders=[],this.systemFiles.videos=[],this.systemFiles.folderCount=0,this.systemFiles.videoCount=0}finally{this.systemFiles.loading=!1}},toggleSystemFilesRecursive(){this.systemFiles.recursive=!this.systemFiles.recursive,this.browseSystemFiles(this.systemFiles.currentPath)},toggleSystemFilesShowNames(){this.systemFiles.showFilenames=!this.systemFiles.showFilenames},toggleSystemFileSelection(t){const e=Array.isArray(this.systemFiles.selectedPaths)?[...this.systemFiles.selectedPaths]:[],i=e.indexOf(t);i>=0?e.splice(i,1):e.push(t),this.systemFiles.selectedPaths=e},openSystemFileFullscreen(t){const e=this.systemFiles.videos||[];t>=0&&ts.path===t);if(i)return this.systemFilePlaybackUrl(i);const n=new URLSearchParams({path:t});return this.systemFiles.rootId&&n.set("rootId",this.systemFiles.rootId),`/api/video-swarm/file?${n.toString()}`},addLiveSourceFromVideo(t){if(!t||!t.path)return;const e={id:`src-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,type:"library",label:t.name||"Video",path:t.path,rootId:t.rootId||this.systemFiles.rootId||"frames",playbackUrl:this.systemFilePlaybackUrl(t)};this.liveSources=[...this.liveSources||[],e],this.rebuildVideoLayers(),this.selectVideoLayer(e.id),this.liveSourceStatus=`Opened layer: ${e.label}`,this.videoLayerAddOpen=!1,this.saveSessionState()},addLiveSourcesFromSelection(){const t=(this.systemFiles.selectedPaths||[]).map(e=>(this.systemFiles.videos||[]).find(i=>i.path===e)).filter(Boolean);if(!t.length){const e=(this.systemFiles.videos||[]).find(i=>i.path===(this.systemFiles.selectedPaths||[])[0]);e&&t.push(e)}if(!t.length){this.liveSourceStatus="Select a video in the library grid first";return}t.forEach(e=>this.addLiveSourceFromVideo(e))},linkCloudDriveSource(){const t=String(this.cloudDriveDraft.url||"").trim();if(!t){this.liveSourceStatus="Enter a cloud share link";return}let e;try{e=new URL(t)}catch{this.liveSourceStatus="Enter a valid https:// link";return}const i={id:`cloud-${Date.now()}`,type:"cloud",label:e.hostname.replace(/^www\./,""),url:e.href,provider:this.cloudDriveDraft.provider||"other",playbackUrl:e.href};this.liveSources=[...this.liveSources||[],i],this.rebuildVideoLayers(),this.selectVideoLayer(i.id),this.cloudDriveDraft.url="",this.liveSourceStatus=`Opened cloud layer: ${i.label}`,this.videoLayerAddOpen=!1,this.saveSessionState()},removeLiveSource(t){this.liveSources=(this.liveSources||[]).filter(e=>e.id!==t),this.rebuildVideoLayers(),this.saveSessionState()},applyLiveSourceAsFeed(t){t&&this.selectVideoLayer(t.id)},markVideoReady(t){this.videoReady=!!t},detachPlayerListeners(t=this.playerEl){t&&(this.timeHandler&&t.removeEventListener("timeupdate",this.timeHandler),this.errorHandler&&t.removeEventListener("error",this.errorHandler),this.videoReadyHandler&&(t.removeEventListener("loadeddata",this.videoReadyHandler),t.removeEventListener("canplay",this.videoReadyHandler),t.removeEventListener("playing",this.videoReadyHandler)),this.videoWaitingHandler&&(t.removeEventListener("waiting",this.videoWaitingHandler),t.removeEventListener("stalled",this.videoWaitingHandler),t.removeEventListener("emptied",this.videoWaitingHandler)),this.videoPlayHandler&&t.removeEventListener("play",this.videoPlayHandler),this.videoPauseHandler&&t.removeEventListener("pause",this.videoPauseHandler))},attachPlayer(){if(!this.hlsWatchEnabled)return;const t=document.getElementById("player");if(!t)return;this.playerEl&&this.detachPlayerListeners(this.playerEl),this.playerEl=t,this.markVideoReady(!1);const e=this.streamSrc.includes("?")?this.streamSrc+"&t="+Date.now():this.streamSrc+"?t="+Date.now();if(this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),this.autoplayVideo(t);else if(typeof Hls<"u"&&Hls.isSupported&&Hls.isSupported()){const i=Hls&&Hls.Events||{MANIFEST_PARSED:"manifest_parsed",ERROR:"error"};this.hls=new Hls({liveSyncDurationCount:1,liveMaxLatencyDurationCount:3,maxBufferLength:6,maxMaxBufferLength:12}),this.hls.loadSource(e),this.hls.attachMedia(t),this.hls.on&&(this.hls.on(i.MANIFEST_PARSED,()=>this.autoplayVideo(t)),this.hls.on(i.ERROR,()=>{setTimeout(()=>this.attachPlayer(),800)}))}else t.src=e;this.timeHandler=()=>{if(!isNaN(t.currentTime)){const i=t.currentTime;this.timecode=this.formatPlaybackTime(i),this.jobPlaybackTimeSec=i,this.syncFrameSelectionFromPlayback(i)}t.readyState>=2&&this.markVideoReady(!0),this.syncReferenceAudioToVideo(t)},this.errorHandler=()=>{this.markVideoReady(!1),this.hlsWatchEnabled&&setTimeout(()=>this.attachPlayer(),800)},this.videoReadyHandler=()=>{t.readyState>=2&&this.markVideoReady(!0)},this.videoWaitingHandler=()=>{this.markVideoReady(!1)},this.videoPlayHandler=()=>{this.isPlaying=!0,t.readyState>=2&&this.markVideoReady(!0),this.syncAvAudioPlayState(!0,t)},this.videoPauseHandler=()=>{this.isPlaying=!1,this.syncAvAudioPlayState(!1,t)},t.addEventListener("timeupdate",this.timeHandler),t.addEventListener("error",this.errorHandler),t.addEventListener("loadeddata",this.videoReadyHandler),t.addEventListener("canplay",this.videoReadyHandler),t.addEventListener("playing",this.videoReadyHandler),t.addEventListener("waiting",this.videoWaitingHandler),t.addEventListener("stalled",this.videoWaitingHandler),t.addEventListener("emptied",this.videoWaitingHandler),t.addEventListener("play",this.videoPlayHandler),t.addEventListener("pause",this.videoPauseHandler),this.autoplayVideo(t)},syncReferenceAudioToVideo(t){if(!this.avSyncEnabled||!this.audio.objectUrl)return;const e=t||this.playerEl,i=this.$refs.avSyncAudio;if(!e||!i||e.paused)return;const n=Number(this.avSyncLeadSec),s=Number.isFinite(n)&&n>=0?n:4,r=Math.max(0,e.currentTime-s);if(Math.abs(i.currentTime-r)>.12)try{i.currentTime=r}catch{}i.paused&&i.play().catch(()=>{})},syncAvAudioPlayState(t,e){const i=this.$refs.avSyncAudio;if(!i||!this.avSyncEnabled||!this.audio.objectUrl)return;const n=e||this.playerEl;t&&n?(this.syncReferenceAudioToVideo(n),i.play().catch(()=>{})):i.pause()},autoplayVideo(t){const e=t||this.playerEl;if(!e||typeof e.play!="function")return;let i=null;try{i=e.play()}catch{this.isPlaying=!1,this.markVideoReady(!1);return}i&&typeof i.catch=="function"&&i.then(()=>{this.isPlaying=!0,e.readyState>=2&&this.markVideoReady(!0)}).catch(()=>{this.isPlaying=!1,this.markVideoReady(!1)})},ensureLivePlayback(){!this.hlsWatchEnabled||!this.playerEl||(this.playerEl.paused||this.playerEl.readyState<2)&&this.autoplayVideo(this.playerEl)},lfoTarget(t){return!t||!t.target?null:this.lfoTargets.find(e=>e.key===t.target)||null},initLfoBase(t){const e=this.lfoTarget(t);e&&(t.base===null||t.base===void 0?t.base=e.default!=null?e.default:(e.min+e.max)/2:t.base=this.clampVal(t.base,e.min,e.max))},shapeValue(t,e){const i=e%(Math.PI*2);return t==="Square"?Math.sin(i)>=0?1:-1:t==="Saw"?i/Math.PI-1:t==="Triangle"?2*Math.asin(Math.sin(i))/Math.PI:Math.sin(i)},clampVal(t,e,i){return t==null||Number.isNaN(t)?e:Math.min(i,Math.max(e,t))},getNow(){return typeof performance<"u"&&performance.now?performance.now():Date.now()},formatPlaybackTime(t){const e=Math.max(0,Number(t)||0),i=Math.floor(e/60),n=(e%60).toFixed(2).padStart(5,"0");return`${String(i).padStart(2,"0")}:${n}`},lfoRateRadPerSec(t){const e=Number(t&&t.bpm||this.lfoBpm||120),i=Number(t&&t.speed||1);return e/60*Math.PI*2*i},interpolatedLfoPhase(t,e=this.getNow()){const i=Number(t&&t.phase)||0;if(!t||!t.on||this.lastLfoTick==null)return i;const n=Math.max(0,(e-this.lastLfoTick)/1e3);return(i+n*this.lfoRateRadPerSec(t))%(Math.PI*2)},runLfos(t=this.getNow()){if(this.audio.track)return;if(this.lastLfoTick===null){this.lastLfoTick=t;return}const e=(t-this.lastLfoTick)/1e3;if(this.lastLfoTick=t,e<=0)return;const i={},n={};this.lfos.forEach(s=>{var f;const r=Number(this.prompts.morphBlendLfoLink||0)===s.id&&s.id>=1&&s.id<=4,l=this.prompts.loraCrossfaderOn&&Number(this.prompts.loraCrossfaderLfoLink||0)===s.id&&s.id>=1&&s.id<=6,o=Number(((f=this.defaultAnimation)==null?void 0:f.forgeLayerOpacityLfoLink)||0)===s.id&&s.id>=1&&s.id<=6;if(!s.on||!s.targets.length&&!r&&!l&&!o)return;const d=this.clampVal(s.depth??0,0,1),u=e*this.lfoRateRadPerSec(s),h=(s.phase||0)+u;s.phase=h%(Math.PI*2),s.renderPhase=s.phase;const c=this.shapeValue(s.shape,s.phase);if(r){const g=this.clampVal(Number(this.prompts.morphBlendLfoBase??this.prompts.morphBlend??.5)||.5,0,1),y=d*.5,T=this.clampVal(g+c*y,0,1);this.applyPromptMorphBlend(T,{fromModulation:!0})}if(l){const g=this.clampVal(Number(this.prompts.loraCrossfaderLfoBase??this.prompts.crossfaderValue??.5)||.5,0,1),y=d*.5,T=this.clampVal(g+c*y,0,1);this.applyLoraCrossfader(T,{fromModulation:!0})}if(o){const g=this.clampVal(Number(this.defaultAnimation.forgeLayerOpacityLfoBase??this.defaultAnimation.forgeLayerOpacity??0)||0,0,1),y=d*.5,T=this.clampVal(g+c*y,0,1);this.applyForgeLayerOpacity(T,{fromModulation:!0})}s.targets.forEach(g=>{const y=this.modulationTargetByKey(g);if(!y)return;const T=s.base==null?y.default??(y.min+y.max)/2:this.clampVal(s.base,y.min,y.max);s.base===null&&(s.base=T);const _=d*(y.max-y.min)/2,v=this.clampVal(T+c*_,y.min,y.max);this.routeModulationValue(g,v,i,n)})}),Object.keys(i).length&&this.sendControl("liveParam",i),Object.values(n).forEach(s=>this.updateControlNet(s))},startLfoAnimation(){var n;this.stopLfoAnimation();const t=typeof window<"u"&&((n=window.matchMedia)==null?void 0:n.call(window,"(prefers-reduced-motion: reduce)").matches);let e=0;const i=s=>{!t&&s-e>48?(e=s,this.lfos.forEach(o=>{o.renderPhase=this.interpolatedLfoPhase(o,s);const d=this.lfoCanvasRefs[o.id];d!=null&&d.getContext&&this.drawLfoPreview(d,o,s)})):t&&this.lfos.forEach(o=>{o.renderPhase=Number(o.phase)||0});const r=this._liveSpecAnalyser,l=this._liveSpecFreqBuf;if(r&&l&&l.length){try{r.getByteFrequencyData(l)}catch{}!t&&s-(this._audioSpectrumPaintTs||0)>48&&(this._audioSpectrumPaintTs=s,this.audioSpectrumBins=Array.from(l));const d=(r.context&&r.context.sampleRate||44100)/2,u=l.length;this.audioMappings.forEach((h,c)=>{const f=Math.max(0,Math.floor(h.freq_min/d*u)),g=Math.min(u-1,Math.ceil(h.freq_max/d*u)),y=Math.max(1,g-f+1);let T=0;for(let _=f;_<=g;_++)T+=l[_];this.audioMappingLevels.length<=c&&this.audioMappingLevels.push(0),this.audioMappingLevels[c]=Math.min(1,T/(y*255))})}else this.audioSpectrumBins.length&&(this.audioSpectrumBins=[]),this.audioMappings.forEach((o,d)=>{this.audioMappingLevels.length>d&&(this.audioMappingLevels[d]=0)});this._lfoAnimFrame=requestAnimationFrame(i)};this._lfoAnimFrame=requestAnimationFrame(i)},stopLfoAnimation(){this._lfoAnimFrame!=null&&typeof cancelAnimationFrame=="function"&&(cancelAnimationFrame(this._lfoAnimFrame),this._lfoAnimFrame=null)},drawLfoPreview(t,e,i){const n=t.getContext("2d");if(!n)return;const s=t.width,r=t.height,l=r/2,o=(r/2-4)*(e.depth||.2);n.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),n.fillRect(0,0,s,r),n.strokeStyle="rgba(12, 48, 72, 0.5)",n.lineWidth=.5,n.beginPath(),n.moveTo(0,l),n.lineTo(s,l),n.stroke();const d=(e.speed||1)*.002,u=(i||0)*d;n.strokeStyle=e.on?this.themeColor("--warn","rgb(239, 159, 39)"):this.themeColor("--border","rgb(42, 45, 58)"),n.lineWidth=2,n.beginPath();const h=2;for(let c=0;c=0?1:-1)*o,c===0?n.moveTo(c,g):n.lineTo(c,g)}if(n.stroke(),e.on){n.strokeStyle="rgba(255, 138, 26, 0.15)",n.lineWidth=6,n.beginPath();for(let c=0;c=0?1:-1)*o,c===0?n.moveTo(c,y):n.lineTo(c,y)}n.stroke()}},processBeat(){const t=this.getNow(),i=60/(this.audio.bpm||120)*1e3;if(this.lastBeatTime===null){this.lastBeatTime=t,this.beatCount=0,this.beatPhase=0;return}const n=t-this.lastBeatTime;n>=i&&(this.lastBeatTime=t,this.beatCount++,this.triggerBeatMacros(t)),this.beatPhase=n/i%1},triggerBeatMacros(t=this.getNow()){const e={},i={};this.macrosRack.filter(s=>s.on).forEach(s=>{const r=this.modulationTargetByKey(s.target);if(!r||!this.shouldMacroTrigger(s,t))return;const o=r.default??(r.min+r.max)/2,d=this.clampVal(s.depth??.5,0,1),u=this.clampVal(s.offset??0,-1,1);let h;if(s.shape==="Noise")h=o+(Math.random()*2-1)*d*(r.max-r.min)/2;else{const f=this.beatPhase*Math.PI*2,g=this.shapeValue(s.shape||"Sine",f);h=o+(g+u)*d*(r.max-r.min)/2}const c=this.clampVal(h,r.min,r.max);this.routeModulationValue(s.target,c,e,i)}),Object.keys(e).length&&this.sendControl("liveParam",e),Object.values(i).forEach(s=>this.updateControlNet(s))},shouldMacroTrigger(t,e){const i=Number(t.bpm||0);if(i>0){const n=60/i*1e3,s=this.lastMacroTrigger[t.id]||0;return e-s>=n?(this.lastMacroTrigger[t.id]=e,!0):!1}return!0},connectWebSocket(){if(!this.collabEnabled){this.wsStatus="offline";return}const t=(location.protocol==="https:"?"wss://":"ws://")+location.host+"/ws",e=()=>{if(!this.collabEnabled){this.wsStatus="offline";return}if(this.ws&&(this.ws.readyState===0||this.ws.readyState===1))return;this.wsStatus="connecting";const i=new WebSocket(t);this.ws=i,i.onopen=()=>{this.ws===i&&(this.wsStatus="connected",this.wsReconnectTimer&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.collabIdentify())},i.onclose=()=>{if(this.ws===i&&(this.ws=null),this.clearCollaborationPresence(),!this.collabEnabled){this.wsStatus="offline";return}this.wsStatus="disconnected",this.wsReconnectTimer=setTimeout(e,1e3)},i.onmessage=n=>{try{const s=JSON.parse(n.data);this.handleWsMessage(s)}catch{}}};e()},clearCollaborationPresence(){this.collab.userId=null,this.collab.users=[],this.collab.locks={},this.collab.recording=!1,this.collab.recordings=[],this.collab.status=""},disconnectWebSocket({status:t="offline"}={}){this.wsReconnectTimer&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null);const e=this.ws;if(this.ws=null,this.clearCollaborationPresence(),this.wsStatus=t,e&&typeof e.close=="function"&&e.readyState<2)try{e.close()}catch{}},toggleCollaboration(){this.collabEnabled?(this.collabEnabled=!1,this.disconnectWebSocket({status:"offline"})):(this.collabEnabled=!0,this.wsStatus="disconnected",this.connectWebSocket()),this.saveSessionState()},handleWsMessage(t){if(t.type==="batch"&&Array.isArray(t.messages)){t.messages.forEach(e=>this.handleWsMessage(e));return}if(t.type==="hello"&&t.userId&&(this.collab.userId=t.userId,this.collabIdentify()),t.type==="presence"&&Array.isArray(t.users)){this.collab.users=t.users;const e={};t.users.forEach(i=>{(i.lockedParams||[]).forEach(n=>{e[n]=i.name})}),this.collab.locks=e}if(t.type==="shared_preset"&&(this.sharedPresetsStatus=`Shared preset ${t.action}: ${t.name}`,this.refreshSharedPresets(),setTimeout(()=>{this.sharedPresetsStatus=""},3e3)),t.type==="recording"&&(this.collab.recording=t.status==="started",this.collab.status=t.status==="started"?"Session recording…":"Recording saved on server"),t.type==="recordings"&&Array.isArray(t.files)&&(this.collab.recordings=t.files),t.type==="playback"&&(this.collab.status=`Playback started (${t.events||0} events)`),t.type==="error"&&(console.error("[Defora WS]",t.msg||t,t.locked||""),this.collab.status=this.collabEnabled?t.msg||"WebSocket error":""),t.type==="event"&&t.msg&&console.log("[Defora event]",t.msg),t.type==="stream"&&t.src&&(this.markVideoReady(!1),this.streamSrc=t.src+"?t="+Date.now(),this.hlsWatchEnabled&&this.attachPlayer()),t.type==="frame"&&(t.item&&this.mergeFrameThumb(t.item),this.scheduleFrameRefresh(t.item?80:0)),t.type==="warmup_started"&&(this.performance.status="Startup clip generating…",this.appendRunsJobLog(`Warmup started (batch ${t.batchId||"—"})`,"info"),this.refreshRuns({fromPoll:!0})),t.type==="warmup_done"&&(this.performance.status==="Startup clip generating…"&&(this.performance.status="Startup clip ready"),this.appendRunsJobLog(`Warmup finished: ${t.status||"done"} (batch ${t.batchId||"—"})`,"success"),this.refreshRuns({fromPoll:!0})),t.type==="run_demo_started"&&(this.appendRunsJobLog(`Demo run started: ${t.runId||"—"}`,"info"),this.refreshRuns({fromPoll:!0})),t.type==="run_demo_done"&&(this.appendRunsJobLog(`Demo run ${t.status||"done"}: ${t.runId||"—"}`,"success"),this.refreshRuns({fromPoll:!0})),t.type==="deforum_settings"&&this.loadDeforumSettings({syncServerModel:!1}),t.type==="sd_model"&&t.model){const e=t.model.model_name||t.model.title||"";this.applyLoadedModelSelection(e,{queueDeforumSave:!1})}},collabIdentify(){!this.ws||this.ws.readyState!==1||this.wsSend({type:"identify",name:this.collab.userName||"Performer"})},saveCollabUserName(){try{localStorage.setItem("defora_user_name",this.collab.userName||"Performer")}catch{}},wsSend(t){!this.ws||this.ws.readyState!==1||this.ws.send(JSON.stringify(t))},modelSourceLabel(t){return b1(t)},isParamLocked(t){return!!this.collab.locks[t]},isParamLockedByMe(t){const e=this.collab.locks[t];return e&&e===(this.collab.userName||"Performer")},paramLockTitle(t){return this.collab.locks[t]?this.isParamLockedByMe(t)?"Unlock (you hold this lock)":`Locked by ${this.collab.locks[t]}`:"Lock parameter for collaboration"},toggleParamLock(t){this.isParamLockedByMe(t)?this.unlockParam(t):this.isParamLocked(t)?this.collab.status=`${t} is locked by ${this.collab.locks[t]}`:this.wsSend({type:"lock_param",param:t})},isParamPinned(t){return this.pinnedParams.includes(t)},toggleParamPin(t){const e=this.pinnedParams.indexOf(t);e===-1?this.pinnedParams.push(t):this.pinnedParams.splice(e,1);try{typeof localStorage<"u"&&localStorage.setItem("defora_pinned_params",JSON.stringify(this.pinnedParams))}catch{}},unlockParam(t){this.wsSend({type:"unlock_param",param:t})},toggleSessionRecording(){this.collab.recording?this.wsSend({type:"stop_recording"}):this.wsSend({type:"start_recording"})},listSessionRecordings(){this.wsSend({type:"list_recordings"})},playbackSessionRecording(t){this.wsSend({type:"playback_recording",recordingFile:t})},async refreshSharedPresets(){this.sharedPresetsLoading=!0;try{const{data:t}=await Gt("/api/shared-presets",{},"shared-presets list");this.sharedPresets=t.presets||[]}catch(t){this.sharedPresetsStatus=t.message}finally{this.sharedPresetsLoading=!1}},async shareCurrentPreset(){const t=(this.sharedPresetName||this.newPresetName||this.currentPreset||"shared").replace(/[^a-zA-Z0-9_-]/g,"")||"shared",e={liveVibe:this.liveVibe,liveCam:this.liveCam,audio:{bpm:this.audio.bpm,track:this.audio.track},cn:{slots:this.cn.slots,active:this.cn.active},loras:{common:this.loras.common,groupA:this.loras.groupA,groupB:this.loras.groupB},prompts:{pos:this.prompts.pos,neg:this.prompts.neg,morphOn:this.prompts.morphOn,loraCrossfaderOn:this.prompts.loraCrossfaderOn,crossfaderValue:this.prompts.crossfaderValue,loraCrossfaderLfoLink:this.prompts.loraCrossfaderLfoLink,loraCrossfaderLfoBase:this.prompts.loraCrossfaderLfoBase,morphBlend:this.prompts.morphBlend,morphBlendLfoLink:this.prompts.morphBlendLfoLink,morphBlendLfoBase:this.prompts.morphBlendLfoBase},lfos:this.lfos,macrosRack:this.macrosRack,paramSources:this.paramSources};try{await Gt("/api/shared-presets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,preset:e,sharedBy:this.collab.userName||"anonymous",description:"Shared from web UI"})},"share preset"),this.sharedPresetsStatus=`Shared as ${t}`,this.sharedPresetName=t,await this.refreshSharedPresets()}catch(i){this.sharedPresetsStatus=i.message}},async loadSharedPreset(t){try{const{data:e}=await Gt(`/api/shared-presets/${encodeURIComponent(t)}`,{},"load shared preset"),i=e.preset||e;i.liveVibe&&(this.liveVibe=i.liveVibe),i.liveCam&&(this.liveCam=i.liveCam),i.audio&&Object.assign(this.audio,i.audio),i.cn&&Object.assign(this.cn,i.cn),i.lfos&&(this.lfos=i.lfos),i.macrosRack&&(this.macrosRack=i.macrosRack),i.prompts&&Object.assign(this.prompts,i.prompts),i.loras&&(this.loras.common=i.loras.common||[],this.loras.groupA=i.loras.groupA||[],this.loras.groupB=i.loras.groupB||[],await this.refreshLoras()),this.sharedPresetsStatus=`Loaded shared preset: ${t}`,setTimeout(()=>{this.sharedPresetsStatus=""},3e3)}catch(e){this.sharedPresetsStatus=e.message}},async deleteSharedPreset(t){if(confirm(`Delete shared preset "${t}"?`))try{await Gt(`/api/shared-presets/${encodeURIComponent(t)}`,{method:"DELETE"},"delete shared preset"),await this.refreshSharedPresets(),this.sharedPresetsStatus=`Deleted ${t}`}catch(e){this.sharedPresetsStatus=e.message}},async refreshGpuPool(t=!1){var e;this.gpuPool.loading=!0,this.infrastructure.loading=!0;try{t&&await Gt("/api/gpu-pool/refresh",{method:"POST"},"gpu pool refresh");const[i,n]=await Promise.allSettled([Gt("/api/gpu-pool",{},"gpu pool status"),Gt("/api/infrastructure",{},"infrastructure status")]);if(i.status==="fulfilled"){const s=i.value.data;this.gpuPool.enabled=!!s.enabled,this.gpuPool.strategy=s.strategy||"round_robin",this.gpuPool.defaultForgeModel=s.defaultForgeModel||"",this.gpuPool.healthyNodes=s.healthyNodes??0,this.gpuPool.nodes=s.nodes||[];const r={...this.gpuPool.modelOptions||{}};this.gpuPool.nodes.forEach(l=>{l&&l.url&&Array.isArray(l.availableModels)&&l.availableModels.length&&(r[l.url]=[...l.availableModels])}),this.gpuPool.modelOptions=r}else this.gpuPool.status=((e=i.reason)==null?void 0:e.message)||"Failed to load GPU pool";if(n.status==="fulfilled"){const s=n.value.data||{};this.infrastructure.mediator=s.mediator||null,this.infrastructure.transcoders=Array.isArray(s.transcoders)?s.transcoders:[],this.infrastructure.updatedAt=s.updatedAt||null}else this.infrastructure.mediator=null,this.infrastructure.transcoders=[]}catch(i){this.gpuPool.status=i.message}finally{this.gpuPool.loading=!1,this.infrastructure.loading=!1}},ollamaModelOptions(t){const e=this.gpuPool.modelOptions||{},i=String(t||"").trim().replace(/\/+$/,"");return(e[t]||e[i]||[]).filter(Boolean)},frameThumbsCacheKey(){return"defora.frameThumbs.v1"},frameThumbsCacheLimit(){return 48},frameSrcKey(t){return String(t||"").split("?")[0]},loadCachedFrameThumbs(){try{if(!window.localStorage)return[];const t=window.localStorage.getItem(this.frameThumbsCacheKey());if(!t)return[];const e=JSON.parse(t);return Array.isArray(e)?e.map(i=>this.normalizeFrameThumb(i)).filter(Boolean):[]}catch{return[]}},saveCachedFrameThumbs(t){try{if(!window.localStorage)return;const e=(Array.isArray(t)?t:[]).slice(-this.frameThumbsCacheLimit()).map(i=>({name:i.name,src:this.frameSrcKey(i.src||i.url||i.path||""),frame:i.frame,mtime:i.mtime})).filter(i=>i.name||i.src);window.localStorage.setItem(this.frameThumbsCacheKey(),JSON.stringify(e))}catch{}},mergeFrameThumbs(t,{keepCachedOnEmpty:e=!0}={}){const i=this.loadCachedFrameThumbs(),n=(Array.isArray(t)?t:[]).map(r=>this.normalizeFrameThumb(r)).filter(Boolean),s=new Map;return(e||n.length)&&i.forEach(r=>{r&&r.name&&s.set(r.name,r)}),n.forEach(r=>{r&&r.name&&s.set(r.name,r)}),[...s.values()].sort((r,l)=>{const o=Number(r&&r.frame),d=Number(l&&l.frame);return Number.isFinite(o)&&Number.isFinite(d)?o-d:String(r&&r.name||"").localeCompare(String(l&&l.name||""))}).slice(-this.frameThumbsCacheLimit())},normalizeFrameThumb(t){if(!t)return null;if(typeof t=="string"){const l=t,o=this.frameSrcKey(l);return{src:l,name:o.split("/").pop(),frame:this.parseFrameNumber(o),mtime:Date.now()}}const e=t.src||t.url||t.path||"",i=t.name||this.frameSrcKey(e).split("/").pop()||"",n=t.frame!=null?t.frame:this.parseFrameNumber(i||e),s=Number(t.mtime)||Date.now();return{src:e||(i?`/frames/${i}?v=${s}`:""),name:i,frame:n,mtime:s}},mergeFrameThumb(t){const e=this.normalizeFrameThumb(t);if(!e||!e.name&&!e.src)return;const i=this.frameStripThumbs.length,n=this.frameSrcKey(this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||""),s=[...this.thumbs||[]].filter(r=>r&&r.name!==e.name).concat(e).sort((r,l)=>{const o=Number(r&&r.frame),d=Number(l&&l.frame);return Number.isFinite(o)&&Number.isFinite(d)?o-d:String(r&&r.name||"").localeCompare(String(l&&l.name||""))});this.thumbs=s,this.saveCachedFrameThumbs(s),this.frameStripThumbs.length>i?this.applyNewGeneratedFrames(i):(this.updateFrameSelection(n),this.updateHeldPreviewFromLatestFrame())},scheduleFrameRefresh(t=0){clearTimeout(this.frameRefreshTimer),this.frameRefreshTimer=setTimeout(()=>{this.frameRefreshTimer=null,this.refreshFrames()},Math.max(0,Number(t)||0))},nextFramesPollDelay({failed:t=!1}={}){const e=Number(this.framesRefreshBackoffMs)||1e3;return t?Math.min(1e4,Math.max(1e3,e*2)):this.deforumPlaying?400:this.previewGenerating?this.wsStatus==="connected"?400:750:this.wsStatus!=="connected"?1500:3e3},async loadOllamaModels(t){const e=(t||"").trim();if(!e)return this.gpuPool.status="Enter an Ollama URL first.",[];const{data:i}=await Gt(`/api/ollama/models?url=${encodeURIComponent(e)}`,{},"ollama models"),n=(i.models||[]).map(r=>r&&typeof r=="object"?r.name:r).filter(Boolean),s=i&&i.url?i.url:e;return this.gpuPool.modelOptions={...this.gpuPool.modelOptions||{},[s]:n},n},async refreshGpuDraftModels(){try{const t=await this.loadOllamaModels(this.gpuPool.draft.url);!this.gpuPool.draft.model&&t.length&&(this.gpuPool.draft.model=t[0]),this.gpuPool.status=t.length?`Loaded ${t.length} Ollama models.`:"No Ollama models found."}catch(t){this.gpuPool.status=t.message}},async refreshGpuEditModels(){try{const t=await this.loadOllamaModels(this.gpuPool.editDraft.url);!this.gpuPool.editDraft.model&&t.length&&(this.gpuPool.editDraft.model=t[0]),this.gpuPool.status=t.length?`Loaded ${t.length} Ollama models.`:"No Ollama models found."}catch(t){this.gpuPool.status=t.message}},gpuForgeOptionKeys(){return["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"]},normalizeGpuForgeSettings(t={},e={}){const i=t&&typeof t=="object"?t:{},n=e&&typeof e=="object"?e:{},s=new Set(["steps","cfg_scale","width","height","batch_size","clip_skip","eta_ddim","eta_ancestral","sigma_churn"]),r=new Set(["enable_emphasis","use_old_sampling","do_not_add_watermark"]),l={};for(const o of this.gpuForgeOptionKeys()){const d=i[o]!==void 0?i[o]:n[o];if(d!==void 0){if(r.has(o)){l[o]=!!d;continue}if(s.has(o)){const u=Number(d);Number.isFinite(u)&&(l[o]=u);continue}l[o]=d==null?null:String(d)}}return l},gpuForgePreferredQuery(t){return t?`?preferredNode=${encodeURIComponent(t)}`:""},inferGpuMediatorHost(t={}){const e=String(t.mediator&&t.mediator.host||t.mediatorSettings&&t.mediatorSettings.host||"").trim();if(e)return e.replace(/^https?:\/\//i,"").split(":")[0];const i=String(t.name||"").trim();if(i&&!i.includes("."))return i;try{const n=new URL(t.url||"").hostname;return n&&!/^\d+\.\d+\.\d+\.\d+$/.test(n)?n:i||n||"localhost"}catch{return i||"localhost"}},normalizeGpuMediatorSettings(t={},e={}){const i=t&&typeof t=="object"?t:{},n=String(i.host||"").trim()||this.inferGpuMediatorHost(e),s=Number(i.deforumPort??i.deforum_port??8765),r=Number(i.deforumationPort??i.deforumation_port??8766);return{host:n.replace(/^https?:\/\//i,"").split(":")[0],deforumPort:Number.isFinite(s)?s:8765,deforumationPort:Number.isFinite(r)?r:8766}},mediatorStatusClass(t){return t==="healthy"?"st-healthy":t==="unreachable"?"st-unhealthy":"st-unknown"},async probeGpuForgeMediatorPorts(){const t=this.gpuPool.forgeModal;if(!(!t.open||!t.nodeId)){t.mediator.probing=!0,t.status="Checking mediator ports…";try{const{data:e}=await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.nodeId)}/mediator-probe`,{method:"POST"},"mediator port probe"),i=e&&e.mediator?e.mediator:null;i?(t.mediator.host=i.host||t.mediator.host,t.mediator.deforumPort=i.deforumPort??t.mediator.deforumPort,t.mediator.deforumationPort=i.deforumationPort??t.mediator.deforumationPort,t.mediator.deforumStatus=i.deforumStatus||"",t.mediator.deforumationStatus=i.deforumationStatus||"",t.status=`Deforum ${i.deforumPort}: ${i.deforumStatus}; Deforumation ${i.deforumationPort}: ${i.deforumationStatus}`):t.status="Port check finished.",await this.refreshGpuPool(!1)}catch(e){t.status=e.message||"Mediator port check failed."}finally{t.mediator.probing=!1}}},onGpuForgeModalBackdropClick(t){(t==null?void 0:t.target)===(t==null?void 0:t.currentTarget)&&this.closeGpuForgeModal()},closeGpuForgeModal(){this.gpuPool.forgeModal={open:!1,nodeId:"",nodeName:"",url:"",priority:1,model:"",currentModel:"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[],schedulers:[],vaeList:[],modelInfo:null,options:{},mediator:{host:"",deforumPort:8765,deforumationPort:8766,deforumStatus:"",deforumationStatus:"",probing:!1}}},async refreshGpuForgeModalOptions(){const t=this.gpuPool.forgeModal;if(!t.open||!t.nodeId)return;const e=this.gpuForgePreferredQuery(t.nodeId),i=(this.gpuPool.nodes||[]).find(n=>n&&n.id===t.nodeId)||{};t.loading=!0,t.status="Loading Forge instance...";try{const[n,s,r,l,o]=await Promise.all([fetch(`/api/forge/options${e}`),fetch(`/api/forge/samplers${e}`),fetch(`/api/forge/schedulers${e}`),fetch(`/api/forge/vae${e}`),fetch(`/api/sd-models/current${e}`)]),[d,u,h,c,f]=await Promise.all([n.json(),s.json(),r.json(),l.json(),o.json()]);if(!this.gpuPool.forgeModal.open||this.gpuPool.forgeModal.nodeId!==t.nodeId)return;const g=this.normalizeGpuForgeSettings(i.forgeSettings||{},this.forge.options||{});this.gpuPool.forgeModal.available=!!d.available,this.gpuPool.forgeModal.options=this.normalizeGpuForgeSettings(d.options||{},g),this.gpuPool.forgeModal.samplers=Array.isArray(u.samplers)?u.samplers:[...this.forge.samplers||[]],this.gpuPool.forgeModal.schedulers=Array.isArray(h.schedulers)?h.schedulers:[...this.forge.schedulers||[]],this.gpuPool.forgeModal.vaeList=Array.isArray(c.vae)?c.vae:[...this.forge.vaeList||[]];const y=f&&f.model&&(f.model.model_name||f.model.title)||"";this.gpuPool.forgeModal.currentModel=y,this.gpuPool.forgeModal.model=i.model||y||"",this.gpuPool.forgeModal.modelInfo=f&&f.model&&f.model.metadata||null,this.gpuPool.forgeModal.status=d.available?"Forge instance ready.":d.error||"Forge instance unavailable."}catch(n){this.gpuPool.forgeModal.options=this.normalizeGpuForgeSettings(i.forgeSettings||{},this.forge.options||{}),this.gpuPool.forgeModal.samplers=[...this.forge.samplers||[]],this.gpuPool.forgeModal.schedulers=[...this.forge.schedulers||[]],this.gpuPool.forgeModal.vaeList=[...this.forge.vaeList||[]],this.gpuPool.forgeModal.currentModel=i.currentModel||i.model||"",this.gpuPool.forgeModal.model=i.model||i.currentModel||"",this.gpuPool.forgeModal.modelInfo=null,this.gpuPool.forgeModal.available=!1,this.gpuPool.forgeModal.status=n.message||"Failed to load Forge instance."}finally{this.gpuPool.forgeModal.nodeId===t.nodeId&&(this.gpuPool.forgeModal.loading=!1)}},async openGpuForgeModal(t){const e=this.normalizeGpuForgeSettings(t&&t.forgeSettings||{},this.forge.options||{}),i={name:t.name,url:t.url,mediator:t.mediator,mediatorSettings:t.mediatorSettings},n=this.normalizeGpuMediatorSettings(t.mediator||t.mediatorSettings||{},i);this.gpuPool.editId=null,this.gpuPool.forgeModal={open:!0,nodeId:t.id,nodeName:t.name||"",url:t.url||"",priority:t.priority||1,model:t.model||"",currentModel:t.currentModel||t.model||"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[...this.forge.samplers||[]],schedulers:[...this.forge.schedulers||[]],vaeList:[...this.forge.vaeList||[]],modelInfo:null,options:e,mediator:{host:n.host,deforumPort:n.deforumPort,deforumationPort:n.deforumationPort,deforumStatus:t.mediator&&t.mediator.deforumStatus||"",deforumationStatus:t.mediator&&t.mediator.deforumationStatus||"",probing:!1}},await this.refreshGpuForgeModalOptions()},async persistGpuForgeModalNode(){const t=this.gpuPool.forgeModal,e={name:t.nodeName||t.url,url:t.url,backend:"sd-forge",priority:t.priority||1,model:t.model||t.currentModel||null,forgeSettings:this.normalizeGpuForgeSettings(t.options||{},this.forge.options||{}),mediatorSettings:this.normalizeGpuMediatorSettings(t.mediator||{},{name:t.nodeName,url:t.url})},{data:i}=await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.nodeId)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},"save forge gpu node"),n=i&&i.node?i.node:null;return n&&(this.gpuPool.forgeModal.nodeId=n.id||t.nodeId,this.gpuPool.forgeModal.nodeName=n.name||t.nodeName,this.gpuPool.forgeModal.url=n.url||t.url,this.gpuPool.forgeModal.priority=n.priority||t.priority,this.gpuPool.forgeModal.model=n.model||t.model),await this.refreshGpuPool(!1),n},async saveGpuForgeModal(){this.gpuPool.forgeModal.saving=!0;try{await this.persistGpuForgeModalNode(),this.gpuPool.forgeModal.status="Forge instance settings saved.",this.gpuPool.status="Forge instance settings saved."}catch(t){this.gpuPool.forgeModal.status=t.message,this.gpuPool.status=t.message}finally{this.gpuPool.forgeModal.saving=!1}},async applyGpuForgeModalOptions(){this.gpuPool.forgeModal.applying=!0;try{const t=await this.persistGpuForgeModalNode(),e=t&&t.id||this.gpuPool.forgeModal.nodeId;await Gt(`/api/forge/options${this.gpuForgePreferredQuery(e)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.normalizeGpuForgeSettings(this.gpuPool.forgeModal.options||{},this.forge.options||{}))},"apply forge node options"),this.gpuPool.forgeModal.status="Forge options applied to this instance.",this.gpuPool.status="Forge options applied to this instance.",await this.refreshGpuForgeModalOptions()}catch(t){this.gpuPool.forgeModal.status=t.message,this.gpuPool.status=t.message}finally{this.gpuPool.forgeModal.applying=!1}},async saveGpuPoolSettings(){try{await Gt("/api/gpu-pool",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:this.gpuPool.enabled,strategy:this.gpuPool.strategy})},"gpu pool settings"),this.gpuPool.status=this.gpuPool.enabled?"Load balancing enabled":"Load balancing disabled"}catch(t){this.gpuPool.status=t.message}},async saveDefaultForgeModel({preload:t=!0}={}){var e;try{this.gpuPool.defaultForgeModelStatus="Saving default model…";const n=(e=(await Gt("/api/gpu-pool/default-forge-model",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.gpuPool.defaultForgeModel||"",preload:t===!0,singleNode:!0})},"default forge model")).data)==null?void 0:e.preloadResults;if(Array.isArray(n)&&n.length){const s=n.filter(l=>l&&l.ok).length,r=n.filter(l=>l&&!l.ok).length;this.gpuPool.defaultForgeModelStatus=`Default model saved. Preload: ${s} ok, ${r} failed.`}else this.gpuPool.defaultForgeModelStatus="Default model saved.";await this.refreshGpuPool(!0)}catch(i){this.gpuPool.defaultForgeModelStatus=i.message,this.gpuPool.status=i.message}},async addGpuNode(){const t=(this.gpuPool.draft.url||"").trim();if(t)try{await Gt("/api/gpu-pool/nodes",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:t,name:this.gpuPool.draft.name||t,backend:this.gpuPool.draft.backend,enabled:!1,priority:this.gpuPool.draft.priority||1,model:this.gpuPool.draft.backend==="ollama"&&this.gpuPool.draft.model||null})},"add gpu node"),this.gpuPool.draft={url:"",name:"",backend:"sd-forge",priority:1,model:""},await this.refreshGpuPool(!1),this.gpuPool.status="Instance added (disabled). Edit if needed, then enable."}catch(e){this.gpuPool.status=e.message}},async startEditGpuNode(t){if(t.enabled){this.gpuPool.status="Disable the node before editing.";return}if(t.backend==="sd-forge"){await this.openGpuForgeModal(t);return}this.gpuPool.editId=t.id,this.gpuPool.editDraft={name:t.name,url:t.url,backend:t.backend,priority:t.priority||1,model:t.model||""}},async saveGpuNodeEdit(t){try{await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.gpuPool.editDraft)},"edit gpu node"),this.gpuPool.editId=null,await this.refreshGpuPool(!1),this.gpuPool.status="Node updated."}catch(e){this.gpuPool.status=e.message}},async disableGpuNode(t){try{await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}/disable`,{method:"POST"},"disable gpu"),await this.refreshGpuPool(!1)}catch(e){this.gpuPool.status=e.message}},async enableGpuNode(t){try{await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}/enable`,{method:"POST"},"enable gpu"),await this.refreshGpuPool(!0),this.gpuPool.status=`${t.name} enabled.`}catch(e){this.gpuPool.status=e.message}},async removeGpuNode(t){if(confirm(`Remove GPU instance "${t.name}"?`))try{await Gt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}`,{method:"DELETE"},"remove gpu"),await this.refreshGpuPool(!1),this.gpuPool.status="Node removed."}catch(e){this.gpuPool.status=e.message}},formatGpuMemory(t){if(t.memoryUsedMb==null&&t.memoryTotalMb==null)return"—";const e=t.memoryUsedMb!=null?`${t.memoryUsedMb}`:"?",i=t.memoryTotalMb!=null?`${t.memoryTotalMb}`:"?";return`${e} / ${i} MB`},sendControl(t,e){if(!this.ws||this.ws.readyState!==1)return;t==="liveParam"&&e&&typeof e=="object"&&this.syncMotionPadFromPayload(e);const i={type:"control",controlType:t,payload:e};this.ws.send(JSON.stringify(i))},syncMotionPadFromPayload(t){if(!t||typeof t!="object")return;const e=t.translation_x??t.panx,i=t.translation_y??t.pany,n=t.translation_z,s=t.zoom_2d??t.zoom,r=t.angle_2d??t.angle;if(e!=null&&Number.isFinite(Number(e))&&(this.motionPadValues.translation_x=Number(e)),i!=null&&Number.isFinite(Number(i))&&(this.motionPadValues.translation_y=Number(i)),n!=null&&Number.isFinite(Number(n))&&(this.motionPadValues.translation_z=Number(n)),s!=null&&Number.isFinite(Number(s))){const o=Number(s);this.motionPadValues.zoom=o,this.motionPadValues.look_y=this.clampVal(o,-1,1)}r!=null&&Number.isFinite(Number(r))&&(this.motionPadValues.look_x=this.clampVal(Number(r),-1,1));const l=t.rotation_z??t.tilt;l!=null&&Number.isFinite(Number(l))&&(this.motionPadValues.rotation_z=Number(l))},updateParam(t,e){if(this.isParamLocked(t.key)&&!this.isParamLockedByMe(t.key)){console.warn(`[Defora] Parameter "${t.key}" is locked by ${this.collab.locks[t.key]}`);return}const i=this.paramControlMeta(t.key),n=this.clampParamToMeta(e.target.value,i);i.hud&&(i.hud.val=n),this.syncHudMotionFromParam(t.key,n),this.queueLiveParam(t.key,n),this.deforumPlaying||this.schedulePreviewFrame()},setSource(t,e){this.paramSources[t]=e,this.sendControl("paramSource",{key:t,source:e})},clearLiveModSlotForParam(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.liveModSlotParamKeys=this.liveModSlotParamKeys.map(i=>i===e||i===t?"":i)},paramLiveModSlotIndex(t){if(!t)return-1;const e=this.liveParamCanonicalKey(t);return this.liveModSlotParamKeys.findIndex(i=>i===e||i===t)},assignParamToLiveModSlot(t,e){if(!t||e<0||e>7)return;const i=this.liveParamCanonicalKey(t);this.liveModSlotParamKeys=this.liveModSlotParamKeys.map((n,s)=>s===e?i:n===i||n===t?"":n)},paramHasActiveMapping(t){if(!t)return!1;const e=this.liveParamCanonicalKey(t);if(this.paramLiveModSlotIndex(e)>=0||(this.targetOwners[e]||this.targetOwners[t]||[]).length||this.audioMappings.some(s=>s.param===e||s.param===t)||this.macrosRack.some(s=>s.on&&(s.target===e||s.target===t)))return!0;const n=this.paramSources[e]||this.paramSources[t];return!!(n&&n!=="Manual")},paramMappingLabels(t){if(!t)return[];const e=this.liveParamCanonicalKey(t),i=[],n=this.paramLiveModSlotIndex(e);if(n>=0){const l=this.liveModSlotPickerOptions.find(o=>o.index===n);i.push(l?l.label:`Slot ${n+1}`)}(this.targetOwners[e]||this.targetOwners[t]||[]).forEach(l=>i.push(l)),this.audioMappings.forEach((l,o)=>{var d;l.param!==e&&l.param!==t||i.push(`Audio ${((d=this.audioBandTabDefs[o])==null?void 0:d.label)||o+1}`)}),this.macrosRack.forEach((l,o)=>{!l.on||l.target!==e&&l.target!==t||i.push(`Macro ${o+1}`)});const r=this.paramSources[e]||this.paramSources[t];return r&&r!=="Manual"&&!i.length&&i.push(r),i},openModulationMapPicker(t){t&&(this.modulationMapPicker={paramKey:this.liveParamCanonicalKey(t),step:"choose"})},closeModulationMapPicker(){this.modulationMapPicker=null},onModulationMapPickerBackdropClick(t){t.target===t.currentTarget&&this.closeModulationMapPicker()},formatMappingParamValue(t){const e=Number(this.paramControlMeta(t).value);return Number.isFinite(e)?Math.abs(e)>=10?e.toFixed(1):e.toFixed(2):"—"},assignModulationMapToSlot(t){const e=this.modulationMapPicker&&this.modulationMapPicker.paramKey;e&&(this.assignParamToLiveModSlot(e,t),this.closeModulationMapPicker())},mapModulationParamToLfo(t){const e=this.modulationMapPicker&&this.modulationMapPicker.paramKey;if(!e)return;const i=this.lfos.find(n=>n.id===t);i&&(i.on||(i.on=!0),i.targets.includes(e)||this.toggleLfoTarget(i,e),this.modulationSelectedLfoId=i.id,this.closeModulationMapPicker())},onAudioFileDrop(t){const e=t&&t.dataTransfer&&t.dataTransfer.files&&t.dataTransfer.files[0];e&&(e.type&&!String(e.type).startsWith("audio/")||this.handleAudioUpload({target:{files:[e],value:""}}))},onModulationAudioDragover(t){t==null||t.preventDefault()},onModulationAudioDrop(t){t==null||t.preventDefault(),this.onAudioFileDrop(t)},onLfoRouteButtonClick(t){this.modulationSelectedLfoId=t},clearParamMapping(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.clearLiveModSlotForParam(e),this.lfos.forEach(i=>{[e,t].forEach(n=>{const s=i.targets.indexOf(n);s>=0&&i.targets.splice(s,1)})}),this.audioMappings=this.audioMappings.filter(i=>i.param!==e&&i.param!==t),this.macrosRack.forEach(i=>{(i.target===e||i.target===t)&&(i.on=!1)}),this.clearMidiBinding(e),this.setSource(t,"Manual"),e!==t&&this.setSource(e,"Manual")},openModulationMapping(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.modulationRouteFocusKey=e;let i=this.selectedModulationLfo;i||(i=this.lfos.find(n=>n.on)||this.lfos[0],i&&(this.modulationSelectedLfoId=i.id)),i&&(i.on||(i.on=!0),i.targets.includes(e)||this.toggleLfoTarget(i,e)),this.switchTab("MODULATION"),this.currentSubTab.MODULATION="LFO";try{window.localStorage&&window.localStorage.setItem("defora_subtab_MODULATION","LFO")}catch{}},setLiveModValue(t,e){if(!t)return;const i=this.paramControlMeta(t),n=this.clampParamToMeta(e,i),s=this.modulationTargetByKey(t);s&&s.field?this.applyAnimationModulation(s.field,n):(i.hud&&(i.hud.val=n,this.syncHudMotionFromParam(i.hud.key,n)),this.queueLiveParam(t,n)),this.deforumPlaying||this.schedulePreviewFrame()},livePadDown(t,e){this._livePadDragging=!0,this.livePadMove(t,e)},livePadMove(t,e){if(!this._livePadDragging||!e)return;const i=t.currentTarget;if(!i||!i.getBoundingClientRect)return;const n=i.getBoundingClientRect(),s=t.touches&&t.touches[0]?t.touches[0]:t,r=(s.clientX-n.left)/(n.width||1),l=(s.clientY-n.top)/(n.height||1),o=Math.max(0,Math.min(1,r)),d=Math.max(0,Math.min(1,1-l)),u=e.paramKeyX?this.paramControlMeta(e.paramKeyX):null,h=e.paramKeyY?this.paramControlMeta(e.paramKeyY):null;if(e.paramKeyX&&u){const c=u.min+o*(u.max-u.min||1);this.setLiveModValue(e.paramKeyX,c)}if(e.paramKeyY&&h){const c=h.min+d*(h.max-h.min||1);this.setLiveModValue(e.paramKeyY,c)}},livePadUp(){this._livePadDragging=!1},sourceTip(t){const e=this.paramSources[t.key];return e==="Beat"?"Beat/LFO":e==="MIDI"?"MIDI mapping":"Manual"},applyMotionPresetAndSelect(t){this.motionSelectedPreset=t,this.applyMotionPreset(t)},loadSelectedMotionPreset(){const t=this.motionSelectedPreset;if(t){if(this.motionPresets[t]){this.applyMotionPreset(t);return}this.motionStylesSaved[t]&&this.applySavedMotionStyle(t)}},motionAxisToLiveKey(t){return t==="zoom"?"zoom_2d":t==="angle"?"angle_2d":t==="rotation_z"?"rotation_z":t==="translation_x"||t==="translation_y"||t==="translation_z"?t:null},motionLiveKeyToScheduleKey(t){const e=String(t||"");return e==="zoom_2d"?"zoom":e==="angle_2d"?"angle":e==="rotation_z"?"rotation_3d_z":e},motionSmoothnessStartFrame(){if(this.selectedFrameThumb&&this.selectedFrameThumb.frame!=null&&!Number.isNaN(Number(this.selectedFrameThumb.frame)))return Math.max(0,Math.round(Number(this.selectedFrameThumb.frame)));const t=Number(this.deforumSettings&&this.deforumSettings.fps)||24,e=Number(this.jobPlaybackTimeSec)||0;return Math.max(0,Math.round(e*t))},readMotionScheduleValue(t,e){const i=this.motionLiveKeyToScheduleKey(t),n=this.deforumSettings&&this.deforumSettings[i];return of(n,e)},toggleMotionPadSpringBack(){this.motionPadSpringBack=!this.motionPadSpringBack,this.saveSessionState()},motionSmoothnessActive(){const t=this.motionSmoothness||{};return t.enabled?Math.max(1,Math.round(Number(t.frames)||1))>1:!1},applyMotionParamWithSmoothness(t,e){const i=Number(e);if(!Number.isFinite(i))return;if(!this.motionSmoothnessActive()){this.emitMotionLiveParam(t,i),this.deforumPlaying||this.schedulePreviewFrame();return}const n=Math.max(1,Math.round(Number(this.motionSmoothness.frames)||1)),s=this.motionSmoothnessStartFrame(),r=this.motionLiveKeyToScheduleKey(t),l=this.deforumSettings&&this.deforumSettings[r]||"",o=this.readMotionScheduleValue(t,s),d=d1(s,n,o,i,l);this.onDeforumFieldInput(r,d,"text")},previewMotionAxis(t,e){const i=Number(e);Number.isFinite(i)&&(t==="translation_x"?this.motionPadValues.translation_x=i:t==="translation_y"?this.motionPadValues.translation_y=i:t==="translation_z"?this.motionPadValues.translation_z=i:t==="zoom"?(this.motionPadValues.zoom=i,this.isDeforumMotion2d&&(this.motionPadValues.look_y=this.clampVal(i,-1,1))):t==="angle"?this.motionPadValues.look_x=this.clampVal(i,-1,1):t==="rotation_z"&&(this.motionPadValues.rotation_z=i))},motionAxisTargetValue(t){return t==="translation_x"?Number(this.motionPadValues.translation_x??0):t==="translation_y"?Number(this.motionPadValues.translation_y??0):t==="translation_z"?Number(this.motionPadValues.translation_z??0):t==="zoom"?Number(this.motionPadValues.zoom??1):t==="angle"?Number(this.motionPadValues.look_x??0):t==="rotation_z"?Number(this.motionPadValues.rotation_z??0):0},setMotionAxis(t,e){this.previewMotionAxis(t,e);const i=this.motionAxisToLiveKey(t);if(!i)return;const n=this.liveHudParamByKey("panx"),s=this.liveHudParamByKey("pany");t==="translation_x"&&n&&this.motionMovePadRange===1&&(n.val=this.motionPadValues.translation_x),t==="translation_y"&&s&&this.motionMovePadRange===1&&(s.val=this.motionPadValues.translation_y),this.applyMotionParamWithSmoothness(i,this.motionAxisTargetValue(t))},onMotionSmoothnessFramesChange(t){const e=Math.round(Number(t));this.motionSmoothness.frames=Number.isFinite(e)?Math.max(1,Math.min(999,e)):1,this.saveSessionState()},captureMotionPadSnapshot(){const t=this.xyPad.activePad,e=t?this.captureMotionPadSnapshotForPad(t):null;return e||{translation_x:Number(this.motionPadValues.translation_x??0),translation_y:Number(this.motionPadValues.translation_y??0),look_x:Number(this.motionPadValues.look_x??0),look_y:Number(this.motionPadValues.look_y??0)}},motionXYPadSlotById(t){return(this.motionXYPadSlots||[]).find(e=>e.id===t)||null},motionAxisRangeForKey(t){return t==="translation_x"||t==="translation_y"?this.motionMovePadRange:t==="translation_z"?10:t==="rotation_z"?180:1},setMotionXYPadAxis(t,e,i){const n=this.motionXYPadSlotById(t);if(!n||!i)return;const r=n[(e==="x"?"y":"x")==="x"?"xAxis":"yAxis"];i!==r&&(e==="x"?n.xAxis=i:n.yAxis=i,this.saveSessionState())},captureMotionPadSnapshotForPad(t){const e=this.motionXYPadSlotById(t);return e?{padId:t,xAxis:e.xAxis,yAxis:e.yAxis,x:this.motionAxisTargetValue(e.xAxis),y:this.motionAxisTargetValue(e.yAxis)}:null},commitMotionPadDrag(t){const e=this.xyPad.dragStartValues;if(!e)return;const i=this.motionXYPadSlotById(t);if(i&&e.xAxis&&e.yAxis){const n=this.motionAxisTargetValue(i.xAxis),s=this.motionAxisTargetValue(i.yAxis);if(e.x!==n){const r=this.motionAxisToLiveKey(i.xAxis);r&&this.applyMotionParamWithSmoothness(r,n)}if(e.y!==s){const r=this.motionAxisToLiveKey(i.yAxis);r&&this.applyMotionParamWithSmoothness(r,s)}return}if(t==="look"||t==="move"){const n=this.captureMotionPadSnapshot();if(t==="look"){e.look_x!==n.look_x&&this.applyMotionParamWithSmoothness("angle_2d",n.look_x),e.look_y!==n.look_y&&this.applyMotionParamWithSmoothness("zoom_2d",n.look_y);return}e.translation_x!==n.translation_x&&this.applyMotionParamWithSmoothness("translation_x",n.translation_x),e.translation_y!==n.translation_y&&this.applyMotionParamWithSmoothness("translation_y",n.translation_y)}},resetMotionToDefault(){this.motionSelectedPreset="Static",this.motionPadValues.translation_x=0,this.motionPadValues.translation_y=0,this.motionPadValues.translation_z=0,this.motionPadValues.zoom=1,this.motionPadValues.rotation_z=0,this.motionPadValues.look_x=0,this.motionPadValues.look_y=0;const t=this.liveHudParamByKey("panx"),e=this.liveHudParamByKey("pany");t&&(t.val=0),e&&(e.val=0);const i=this.isDeforumMotion2d?{translation_x:0,translation_y:0,angle_2d:0,zoom_2d:0}:{translation_x:0,translation_y:0,translation_z:0,zoom_2d:0,rotation_z:0,rotation_y:0};this.sendControl("liveParam",i),this.deforumPlaying||this.schedulePreviewFrame()},resetMotionToDefault(){this.motionSelectedPreset="Static",this.motionPadValues.translation_x=0,this.motionPadValues.translation_y=0,this.motionPadValues.translation_z=0,this.motionPadValues.zoom=1,this.motionPadValues.rotation_z=0,this.motionPadValues.look_x=0,this.motionPadValues.look_y=0;const t=this.liveHudParamByKey("panx"),e=this.liveHudParamByKey("pany");t&&(t.val=0),e&&(e.val=0);const i=this.isDeforumMotion2d?{translation_x:0,translation_y:0,angle_2d:0,zoom_2d:0}:{translation_x:0,translation_y:0,translation_z:0,zoom_2d:0,rotation_z:0,rotation_y:0};this.sendControl("liveParam",i),this.deforumPlaying||this.schedulePreviewFrame()},emitMotionLiveParam(t,e){const i=Number(e);if(!Number.isFinite(i))return;const n=this.getNow(),s=this.lastParamSent[t]||0;if(this.liveParamPending[t]=i,n-s>this.controlDelayMs){this.lastParamSent[t]=n,this.sendControl("liveParam",{[t]:i});return}clearTimeout(this.liveParamTimers[t]),this.liveParamTimers[t]=setTimeout(()=>{const r=this.liveParamPending[t];delete this.liveParamPending[t],this.lastParamSent[t]=this.getNow(),this.sendControl("liveParam",{[t]:r})},this.controlDelayMs)},sendPreset(t){const e=this.motionPresets[t];e&&(this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e),console.log(`Applied motion preset: ${t}`,e))},resetVibeParams(){const t={cfg:6,strength:.65,noise:1,cfgscale:5};this.liveVibe.forEach(e=>{t[e.key]!==void 0&&(e.val=t[e.key],this.queueLiveParam(e.key,t[e.key]))})},resetCameraParams(){const t={zoom:.8,panx:0,pany:0,tilt:0};this.liveCam.forEach(e=>{t[e.key]!==void 0&&(e.val=t[e.key],this.queueLiveParam(e.key,t[e.key]))}),this.sendControl("liveParam",this.motionPresets.Static)},isKeyboardEditableTarget(t){if(!t||typeof t!="object")return!1;if(t.isContentEditable)return!0;const e=String(t.tagName||"").toUpperCase();return e==="INPUT"||e==="TEXTAREA"||e==="SELECT"},handleKeyboardEscape(){return this.bindingLearnMode?(this.bindingLearnMode=!1,this.bindingTargetKey=null,!0):this.restoreSessionPromptOpen?(this.dismissSessionRestore(!1),!0):this.modulationMapPicker&&this.modulationMapPicker.paramKey?(this.closeModulationMapPicker(),!0):this.engineModelPickerOpen?(this.closeEngineModelPicker(),!0):this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.open?(this.closeGpuForgeModal(),!0):this.systemFiles.fullscreenIndex>=0?(this.closeSystemFileFullscreen(),!0):this.libraryWorkspaceOpen?typeof document<"u"&&document.querySelector('[data-testid="projects-fullscreen"], [data-testid="videos-fullscreen"]')?!1:(this.closeLibraryWorkspace(),!0):this.loraPickerOpen?(this.loraPickerOpen=!1,!0):this.loraCrossfaderPickerGroup?(this.loraCrossfaderPickerGroup=null,!0):this.systemFiles.cloudConnectOpen?(this.systemFiles.cloudConnectOpen=!1,!0):this.systemFiles.newFolderOpen?(this.systemFiles.newFolderOpen=!1,!0):this.videoLayerAddOpen?(this.toggleVideoLayerAdd(!1),!0):this.motionSequencerSideOpen?(this.motionSequencerSideOpen=!1,this.saveSessionState(),!0):this.showEngineDrawerShell&&this.liveEngineDrawerOpen?(this.liveEngineDrawerOpen=!1,this.saveSessionState(),this.$nextTick(()=>this.updateSidePanelDockBounds()),!0):this.rightPanelOpen?(this.rightPanelOpen=!1,this.liveDrawerOpen=!1,this.saveSessionState(),!0):!1},mainTabIds(){return(Array.isArray(this.tabs)?this.tabs:[]).map(t=>t&&t.id).filter(Boolean)},navigateMainTab(t){const e=this.mainTabIds();if(!e.length||!Number.isFinite(t))return;const i=this.currentTab==="AUDIO"?"AUDIO":this.currentTab;let n=e.indexOf(i);n<0&&(n=0);const s=e[(n+t+e.length)%e.length];this.switchTab(s)},subTabIdsForCurrentTab(){return this.currentTab==="PROMPTS"?["PROMPTS","IMAGE","LORA","CONTROLNET","STORY"]:this.currentTab==="SETTINGS"?["ENGINE","OUTPUT","GPUS","RUNS","MIDI","STYLES","PLUGINS","COLLAB"]:this.currentTab==="MODULATION"||this.currentTab==="AUDIO"?["LFO","AV_SYNC","AUDIO_REACTIVE","BEAT_MACROS","MAPPINGS"]:this.currentTab==="LIVE"?["MONITOR","DEFORUM_JOB"]:[]},navigateSubTab(t){const e=this.subTabIdsForCurrentTab();if(e.length<2||!Number.isFinite(t))return;const i=this.currentTab==="AUDIO",n=i?"MODULATION":this.currentTab;let s=i?"AUDIO_REACTIVE":this.currentSubTab[n];n==="SETTINGS"&&s==="SYSTEM"&&(s="RUNS");let r=e.indexOf(s);r<0&&(r=0);const l=e[(r+t+e.length)%e.length];if(l==="AUDIO_REACTIVE"){this.switchTab("AUDIO");return}if(i||n==="MODULATION"){this.currentTab==="AUDIO"&&this.switchTab("MODULATION"),this.switchSubTab("MODULATION",l);return}this.switchSubTab(n,l)},setupKeyboardShortcuts(){if(typeof document>"u")return;const t=this;this._keyHandler=e=>{if(e.key==="Escape"){t.handleKeyboardEscape()&&(e.preventDefault(),e.stopPropagation());return}if(t.isKeyboardEditableTarget(e.target)||e.ctrlKey||e.metaKey||e.altKey)return;if(t.bindingLearnMode&&t.bindingTargetKey){const r=e.key.toLowerCase();if(r.length===1||["arrowup","arrowdown","arrowleft","arrowright","space","enter","tab"].includes(r)){t.keyBindings[t.bindingTargetKey]=r,t.saveBindings(),t.status=`Bound "${t.bindingTargetKey}" → ${r}`,t.bindingTargetKey=null,e.preventDefault();return}}const i=Object.entries(t.keyBindings).find(([,r])=>r===e.key.toLowerCase());if(i){const[r]=i,l=t.modulationTargetByKey(r);if(l){const o=t.getParamValue(r),d=(l.max-l.min)*.05,u=Math.min(l.max,Math.max(l.min,o+d));l.field?t.applyAnimationModulation(l.field,u):t.queueLiveParam(r,u),e.preventDefault();return}}if(e.key==="ArrowLeft"){t.navigateMainTab(-1),e.preventDefault();return}if(e.key==="ArrowRight"){t.navigateMainTab(1),e.preventDefault();return}if(e.key==="ArrowUp"){t.navigateSubTab(-1),e.preventDefault();return}if(e.key==="ArrowDown"){t.navigateSubTab(1),e.preventDefault();return}const n=parseInt(e.key,10),s=t.mainTabIds();if(n>=1&&n<=s.length){t.switchTab(s[n-1]),e.preventDefault();return}switch(e.key){case" ":(t.currentTab==="LIVE"||t.showMotionSequencerDock)&&(t.generatePreviewFrame(),e.preventDefault());break;case"r":t.currentTab==="LIVE"&&(t.resetVibeParams(),t.resetCameraParams(),e.preventDefault());break;case"m":t.currentTab==="PROMPTS"&&(t.prompts.morphOn=!t.prompts.morphOn,t.setMorph(t.prompts.morphOn),e.preventDefault());break;case"l":t.currentTab==="MODULATION"&&(t.lfoOn=!t.lfoOn,e.preventDefault());break;case"b":t.currentTab==="MODULATION"&&(t.switchSubTab("MODULATION","BEAT_MACROS"),t.beatMacroOn=!t.beatMacroOn,e.preventDefault());break;case"e":t.showEngineDrawerShell&&(t.toggleEngineDrawer(),e.preventDefault());break;case"p":t.libraryWorkspaceOpen||(t.toggleRightPanel(),e.preventDefault());break}},document.addEventListener("keydown",this._keyHandler)},midiTarget(t){const e=String(t||""),i=e.match(/^mod_slot_(\d)$/);if(i){const n=Math.max(1,Math.min(6,Number(i[1])||1)),r=(Array.isArray(this.liveModulationSlots)?this.liveModulationSlots:[])[n-1];return!r||r.kind==="xypad"||!r.paramKey?null:this.modulationTargetByKey(r.paramKey)}return this.modulationTargetByKey(e)},updateMidiMapping(t){return t},setMorph(t){this.prompts.morphOn=t,this.sendControl("prompts",{morphOn:t}),t&&this.applyPromptMorphing()},parseMorphRange(t){const e=String(t||"0–1").match(/([0-9.]+)\s*[–\-]\s*([0-9.]+)/);if(!e)return{min:0,max:1};const i=Math.min(parseFloat(e[1]),parseFloat(e[2])),n=Math.max(parseFloat(e[1]),parseFloat(e[2]));return{min:i,max:n}},morphSlotInRange(t){const{min:e,max:i}=this.parseMorphRange(t.range),n=this.prompts.morphBlend??.5;return n>=e&&n<=i},morphBlendInSlotRange(t){const{min:e,max:i}=this.parseMorphRange(t.range),n=this.prompts.morphBlend??.5;return i<=e?n:Math.max(0,Math.min(1,(n-e)/(i-e)))},morphSlotPreview(t){if(!t.on||!this.morphSlotInRange(t))return"—";const e=Zs({type:"prompt",valueA:t.a,valueB:t.b},this.morphBlendInSlotRange(t));if(!e)return"—";const i=t.weight!=null?t.weight:1;return i<.99?`${e} ×${i.toFixed(2)}`:e},onPromptMorphBlendInput(){this.applyPromptMorphBlend(this.prompts.morphBlend,{commitBase:!0})},onMorphSlotWeightInput(t){this.applyPromptMorphing(),this.deforumPlaying||this.schedulePreviewFrame()},onMorphSlotPhraseInput(t){this.applyPromptMorphing(),this.deforumPlaying||this.schedulePreviewFrame()},applyPromptMorphBlend(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);this.prompts.morphBlend=n,(e||!i)&&(this.prompts.morphBlendLfoBase=n),this.applyPromptMorphing(),!i&&!this.deforumPlaying&&this.schedulePreviewFrame()},setPromptMorphBlendLfoLink(t){const e=Number(t||0),i=e>=1&&e<=4?e:null;if(this.prompts.morphBlendLfoLink=this.prompts.morphBlendLfoLink===i?null:i,this.prompts.morphBlendLfoBase=this.prompts.morphBlend,this.prompts.morphBlendLfoLink){const n=this.lfos.find(s=>s.id===this.prompts.morphBlendLfoLink);n&&(n.on=!0)}},setLoraCrossfaderOn(t){this.prompts.loraCrossfaderOn=!!t,this.sendControl("prompts",{loraCrossfaderOn:this.prompts.loraCrossfaderOn}),(this.loras.groupA.length||this.loras.groupB.length)&&this.applyLoras(),this.saveSessionState()},applyLoraCrossfader(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);if(this.prompts.crossfaderValue=n,this.performance.crossfader=n,(e||!i)&&(this.prompts.loraCrossfaderLfoBase=n),!this.prompts.loraCrossfaderOn){i||this.saveSessionState();return}this.performance.slots.length?this.applyCrossfadeMorph():(this.loras.groupA.length||this.loras.groupB.length)&&this.applyLoras(),i||this.saveSessionState()},setLoraCrossfaderLfoLink(t){const e=Number(t||0),i=e>=1&&e<=6?e:null;if(this.prompts.loraCrossfaderLfoLink=this.prompts.loraCrossfaderLfoLink===i?null:i,this.prompts.loraCrossfaderLfoBase=this.performance.crossfader,this.prompts.loraCrossfaderLfoLink){const n=this.lfos.find(s=>s.id===this.prompts.loraCrossfaderLfoLink);n&&(n.on=!0)}},toggleLoraFamilyCollapse(t){!t||!this.loras.familyCollapsed||!(t in this.loras.familyCollapsed)||(this.loras.familyCollapsed[t]=!this.loras.familyCollapsed[t])},applyPromptMorphing(){if(!this.prompts.morphOn)return;const t=(this.prompts.pos||"").trim(),e=t?[t]:[];for(const n of this.morphSlots){if(!n.on||!this.morphSlotInRange(n))continue;const s=Zs({type:"prompt",valueA:n.a,valueB:n.b},this.morphBlendInSlotRange(n));if(!s)continue;const r=Math.max(0,Math.min(1,n.weight!=null?n.weight:1));r>=.99?e.push(s):e.push(`(${s}:${r.toFixed(2)})`)}const i=e.join(", ").trim();i&&(this.prompts.pos=i,this.sendControl("prompt",{positive:i,negative:this.prompts.neg,morphBlend:this.prompts.morphBlend}))},sendPrompts(){this.sendControl("prompt",{positive:this.prompts.pos,negative:this.prompts.neg}),this.prompts.morphOn&&this.applyPromptMorphing()},addMacro(){if(this.macrosRack.length>=6)return;const t=`macro-${Date.now()}-${Math.random().toString(36).substring(2,11)}`;this.macrosRack.push({id:t,on:!0,target:"cfg",shape:"Sine",bpm:120,depth:.5,offset:0,show:!1})},removeMacro(t){this.macrosRack.length<=1||this.macrosRack.splice(t,1)},addAudioMapping(){this.audioMappings.push({param:"",band:"mid",freq_min:250,freq_max:2e3,out_min:0,out_max:1}),this.audioMappingLevels.push(0)},setAudioActiveBandTab(t){this.audioBandTabDefs.map(i=>i.key).includes(t)&&(this.audioActiveBandTab=t)},onAudioSpectrumSelectBand(t){const e=Number(t)||0;this.audioSelectedMappingIndex=e;const i=this.audioBandTabDefs[e];i&&this.setAudioActiveBandTab(i.key)},updateAudioMappingBand({index:t,freq_min:e,freq_max:i}){const n=this.audioMappings[t];n&&(n.freq_min=e,n.freq_max=i,this.audioBandPreviewIndex===t&&this.updateAudioBandpassFilter(n))},removeAudioMapping(t){this.audioBandPreviewIndex===t?this.stopAudioBandPreview():this.audioBandPreviewIndex>t&&(this.audioBandPreviewIndex-=1),this.audioMappings.splice(t,1),this.audioMappingLevels.splice(t,1),this.audioSelectedMappingIndex>=this.audioMappings.length&&(this.audioSelectedMappingIndex=Math.max(0,this.audioMappings.length-1))},applyAudioBandPreset(t,e){const i=this.audioBandPresets[e],n=this.audioMappings[t];!i||!n||(n.freq_min=i.freq_min,n.freq_max=i.freq_max,this.audioBandPreviewIndex===t&&this.updateAudioBandpassFilter(n))},toggleAudioBandPreview(t){if(!this.audio.objectUrl){this.audioStatus="Upload audio first";return}const e=Number(t);if(!Number.isFinite(e)||e<0)return;if(this.audioBandPreviewIndex===e){this.stopAudioBandPreview(),this.audioStatus="Band preview off";return}if(!this._liveSpecAnalyser)try{this.setupLiveAudioAnalyser()}catch{}this.playAvSyncAudioForVisualizer(),this.audioBandPreviewIndex=e;const i=this.audioMappings[e];i&&this.updateAudioBandpassFilter(i),this.syncAudioBandPreviewGains(),i&&(this.audioStatus=`Previewing ${i.freq_min}–${i.freq_max} Hz`)},stopAudioBandPreview(){this.audioBandPreviewIndex=-1,this.syncAudioBandPreviewGains()},updateAudioBandpassFilter(t){const e=this._liveSpecBandpass;if(!e||!t)return;const i=Math.max(20,Number(t.freq_min)||20),n=Math.min(2e4,Math.max(i+1,Number(t.freq_max)||i+100)),s=Math.sqrt(i*n),r=Math.max(1,n-i);e.type="bandpass",e.frequency.value=s,e.Q.value=Math.max(.1,Math.min(20,s/r))},syncAudioBandPreviewGains(){const t=this.audioBandPreviewIndex>=0;this._liveSpecGain&&(this._liveSpecGain.gain.value=t?0:1),this._liveSpecSoloGain&&(this._liveSpecSoloGain.gain.value=t?1:0)},readImg2imgAsset(t,{mask:e=!1}={}){if(!t)return;const i=new FileReader;i.onload=()=>{if(e){this.img2img.maskDataUrl=i.result,this.img2img.status="Mask loaded (inpaint)";return}this.img2img.dataUrl=i.result,this.img2img.status="Input image loaded"},i.onerror=()=>{this.img2img.status=e?"Could not read mask file":"Could not read input image"},i.readAsDataURL(t)},handleImg2imgFile(t){const e=t.target.files&&t.target.files[0];this.readImg2imgAsset(e)},handleImg2imgMask(t){const e=t.target.files&&t.target.files[0];this.readImg2imgAsset(e,{mask:!0})},handleImg2imgDrop(t,e="input"){const i=t&&t.dataTransfer&&t.dataTransfer.files,n=i&&i[0];n&&this.readImg2imgAsset(n,{mask:e==="mask"})},clearImg2imgInput(){this.img2img.dataUrl=null,this.img2img.status="Input image cleared"},clearImg2imgMask(){this.img2img.maskDataUrl=null,this.img2img.status="Mask cleared"},async refreshPlugins(){if(typeof fetch=="function"){this.pluginsLoading=!0;try{const t=await fetch("/api/plugins");if(!t.ok)return;const e=await t.json();this.pluginsRegistry=Array.isArray(e.plugins)?e.plugins:[]}catch{this.pluginsRegistry=[]}finally{this.pluginsLoading=!1}}},async submitImg2img(){if(!this.img2img.dataUrl){this.img2img.status="Choose an input image first";return}this.img2img.loading=!0,this.img2img.status="Submitting…";try{const t={init_image:this.img2img.dataUrl,prompt:this.prompts.pos,negative_prompt:this.prompts.neg,denoising_strength:this.img2img.denoisingStrength,width:this.img2img.width,height:this.img2img.height};this.img2img.maskDataUrl&&(t.mask_image=this.img2img.maskDataUrl,t.mask_blur=this.img2img.maskBlur,t.inpainting_fill=this.img2img.inpaintingFill,t.inpaint_full_res=this.img2img.inpaintFullRes);const e=await fetch("/api/img2img",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),i=await e.json();if(!e.ok)throw new Error(i.error||i.detail||e.statusText);this.img2img.lastPath=i.path||null,this.img2img.status=i.path?`OK → ${i.path}`:"OK"}catch(t){this.img2img.status=String(t.message||t)}finally{this.img2img.loading=!1}},runImg2img(){return this.submitImg2img()},addLfo(){const t=this.lfos.length?Math.max(...this.lfos.map(e=>e.id))+1:1;this.lfos.push({id:t,on:!0,targets:[],shape:"Sine",bpm:this.lfoBpm||120,speed:1,depth:.2,base:null,phase:0,renderPhase:0})},removeLfo(t){this.lfos.length<=1||this.lfos.splice(t,1)},resetLfo(t){const e=this.lfos[t];e&&(e.targets=[],e.shape="Sine",e.bpm=this.lfoBpm||120,e.speed=1,e.depth=.2,e.base=null,e.phase=0,e.renderPhase=0,e.on=!1)},resetLfos(){this.lfos.forEach((t,e)=>this.resetLfo(e))},toggleLfoTarget(t,e){if(!t||!e)return;const i=t.targets.indexOf(e);if(i>=0)t.targets.splice(i,1);else if(t.targets.push(e),t.base==null){const n=this.modulationTargetByKey(e);n&&(t.base=n.default??(n.min+n.max)/2)}this.modulationSelectedLfoId=t.id},addLfoTarget(t){const e=this.lfoTargetPick[t];if(!e)return;const i=this.lfos[t];if(!i||i.targets.includes(e)){this.$set?this.$set(this.lfoTargetPick,t,""):this.lfoTargetPick[t]="";return}if(i.targets.push(e),i.base===null){const n=this.modulationTargetByKey(e);n&&(i.base=n.default??(n.min+n.max)/2)}this.lfoTargetPick[t]=""},removeLfoTarget(t,e){const i=this.lfos[t];i&&i.targets.splice(e,1)},saveCurrentMotionStyle(){const t=prompt("Enter style name:");if(!t||!t.trim())return;const e={translation_x:Number(this.motionPadValues.translation_x||0),translation_y:Number(this.motionPadValues.translation_y||0),translation_z:Number(this.motionPadValues.translation_z||0),zoom_2d:Number(this.motionPadValues.zoom??1),rotation_z:0,rotation_y:0},i=t.trim();this.motionStylesSaved[i]=e,this.motionSelectedPreset=i;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_motion_styles",JSON.stringify(this.motionStylesSaved))}catch{}},loadMotionStyles(){try{if(typeof window<"u"&&window.localStorage){const t=window.localStorage.getItem("defora_motion_styles");if(t){const e=JSON.parse(t);e&&typeof e=="object"&&(this.motionStylesSaved=e)}}}catch{}},deleteSavedMotionStyle(t){if(confirm(`Delete saved style "${t}"?`)){delete this.motionStylesSaved[t];try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_motion_styles",JSON.stringify(this.motionStylesSaved))}catch{}}},applySavedMotionStyle(t){const e=this.motionStylesSaved[t];e&&(this.motionSelectedPreset=t,this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e))},applyMotionPreset(t){const e=this.motionPresets[t];e&&(this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e))},queueLiveParam(t,e){const i=this.paramControlMeta(t),n=this.clampParamToMeta(e,i),s=i.routeKey||t,r=this.animationTargets.find(u=>u.key===s||u.key===t);if(r&&r.field){this.applyAnimationModulation(r.field,n);return}i.hud&&(i.hud.val=n,this.syncHudMotionFromParam(i.hud.key,n));const l=this.getNow(),o=this.lastParamSent[s]||0;this.liveParamPending[s]=n;const d=()=>{const u=this.liveParamPending[s];delete this.liveParamPending[s],this.lastParamSent[s]=this.getNow(),this.sendControl("liveParam",{[s]:u})};if(l-o>this.controlDelayMs){d();return}clearTimeout(this.liveParamTimers[s]),this.liveParamTimers[s]=setTimeout(d,this.controlDelayMs)},async refreshFrames(){if(typeof fetch=="function")try{const t=this.frameStripThumbs.length,e=this.frameSrcKey(this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||""),i=await fetch("/api/frames?limit=48",{cache:"no-store"});if(!i.ok){this.framesRefreshBackoffMs=this.nextFramesPollDelay({failed:!0});return}const n=await i.json();if(Array.isArray(n.items)){const s=this.mergeFrameThumbs(n.items,{keepCachedOnEmpty:!0});this.thumbs=s.length?s:this.thumbs,this.saveCachedFrameThumbs(this.thumbs),this.frameStripThumbs.length>t?this.applyNewGeneratedFrames(t):this.updateFrameSelection(e)}this.framesRefreshBackoffMs=this.nextFramesPollDelay(),this.syncDeforumBackdropToWebGL()}catch(t){console.warn("frames fetch failed",t),this.framesRefreshBackoffMs=this.nextFramesPollDelay({failed:!0})}},parseFrameNumber(t){if(!t)return null;const e=String(t).match(/(\d{3,})/);return e?parseInt(e.pop(),10):null},async runAudioMod(){if(!this.audio.track){this.audioStatus="Set audio file first";return}const t=this.audioMappings.filter(e=>e.param&&!Number.isNaN(e.freq_min)&&!Number.isNaN(e.freq_max)).map(e=>({param:e.param,freq_min:e.freq_min,freq_max:e.freq_max,out_min:e.out_min??0,out_max:e.out_max??1}));if(!t.length){this.audioStatus="Add at least one mapping";return}try{const e=await fetch("/api/audio-map",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({audioPath:this.audio.track,fps:this.masterFps,mappings:t,live:!0})}),i=await e.json();!e.ok||i.error?this.audioStatus=i.error||"Audio processing failed":this.audioStatus=i.ok?"Audio sent to mediator":"Audio processing finished with errors"}catch(e){this.audioStatus=String(e)}},startAudioStream(){return this.runAudioMod()},frameLabel(t){return t?t.frame!=null&&!isNaN(t.frame)?t.frame:t.name?t.name.replace(/\.[^.]+$/,""):t.src||"?":"?"},scrollSelectedFrameIntoView(t=this.selectedFrameIndex){if(typeof window>"u")return;const e=this.$refs&&this.$refs.frameRail||typeof document<"u"&&document.querySelector('[data-testid="runs-browser-frames-rail"]');if(!e||typeof e.querySelector!="function")return;const i=e.querySelector(`[data-frame-index="${t}"]`);i&&typeof i.scrollIntoView=="function"&&i.scrollIntoView({block:"nearest",inline:"center",behavior:"smooth"})},selectFrame(t,{scroll:e=!0,userInitiated:i=!1}={}){var r;if(!this.frameStripThumbs.length){this.selectedFrameIndex=-1;return}const n=Math.min(this.frameStripThumbs.length-1,Math.max(0,Number(t)||0));i&&this.deforumPlaying&&(this.frameRailFollowLatest=n>=this.frameStripThumbs.length-1),this.selectedFrameIndex=n;const s=this.frameStripThumbs[n];if(s){const l=Math.max(1,Number(this.deforumSettings.fps||((r=this.sequencer)==null?void 0:r.fps)||24)||24),o=Number(this.frameStripThumbs[0]&&this.frameStripThumbs[0].frame),d=Number(s.frame);Number.isFinite(o)&&Number.isFinite(d)&&(this.timecode=this.formatPlaybackTime((d-o)/l))}e&&this.$nextTick(()=>this.scrollSelectedFrameIntoView(n))},stepFrameSelection(t){if(!this.frameStripThumbs.length)return;const e=Number.isFinite(Number(this.selectedFrameIndex))?Number(this.selectedFrameIndex):this.frameStripThumbs.length-1;this.selectFrame(e+Number(t||0))},frameIndexForTime(t){var l;if(!this.frameStripThumbs.length)return-1;const e=Math.max(1,Number(this.deforumSettings.fps||((l=this.sequencer)==null?void 0:l.fps)||24)||24),i=Number(this.frameStripThumbs[0]&&this.frameStripThumbs[0].frame);if(!Number.isFinite(i))return-1;const n=i+Math.round(Math.max(0,Number(t)||0)*e);let s=0,r=Number.POSITIVE_INFINITY;return this.frameStripThumbs.forEach((o,d)=>{const u=Number(o&&o.frame);if(!Number.isFinite(u))return;const h=Math.abs(u-n);h=0&&this.selectFrame(e,{scroll:!1})},updateFrameSelection(t=""){if(!this.frameStripThumbs.length){this.selectedFrameIndex=-1;return}if(this.deforumPlaying&&this.frameRailFollowLatest){this.followLatestGeneratedFrame();return}if(t){const e=this.frameStripThumbs.findIndex(i=>this.frameSrcKey(i.src||i.url||i.path||"")===this.frameSrcKey(t));if(e>=0){this.selectFrame(e,{scroll:!1});return}}if(this.deforumPlaying&&this.playerEl&&Number.isFinite(Number(this.playerEl.currentTime))){const e=this.frameIndexForTime(this.playerEl.currentTime);if(e>=0){this.selectFrame(e,{scroll:!1});return}}this.selectedFrameIndex>=0&&this.selectedFrameIndex{const o=Math.min(16e3,Math.max(20,Number(l)||20)),d=(Math.log(o)-Math.log(20))/(Math.log(16e3)-Math.log(20));return Math.min(100,Math.max(0,d*100))},s=n(t&&t.freq_min),r=n(t&&t.freq_max);return{left:`${Math.min(s,r)}%`,width:`${Math.max(1.5,Math.abs(r-s))}%`}},async scanMidi(){if(!navigator.requestMIDIAccess){this.midi.supported=!1;return}try{const t=await navigator.requestMIDIAccess({sysex:!1}),e=[];t.inputs.forEach(i=>{e.push({id:i.id,name:i.name}),i.onmidimessage=n=>this.handleMidi(i,n)}),this.midi.devices=e,!this.midi.selected&&e.length&&(this.midi.selected=e[0].id),this.loadMidiMappings()}catch{this.midiStatus="MIDI not available"}},loadMidiMappings(){const t=typeof window<"u"&&window.localStorage||typeof global<"u"&&global.window&&global.window.localStorage;if(t)try{const e=t.getItem("defora_midi_mappings");if(e){const i=JSON.parse(e);Array.isArray(i)&&i.length>0&&(this.midi.mappings=i,console.log("Loaded MIDI mappings from localStorage",i))}}catch(e){console.error("Failed to load MIDI mappings",e)}},saveMidiMappings(){const t=typeof window<"u"&&window.localStorage||typeof global<"u"&&global.window&&global.window.localStorage;if(!t)return!1;try{return t.setItem("defora_midi_mappings",JSON.stringify(this.midi.mappings)),console.log("Saved MIDI mappings to localStorage",this.midi.mappings),!0}catch(e){return console.error("Failed to save MIDI mappings",e),!1}},addMidiMapping(){this.midi.mappings.push({control:"New Mapping",cc:0,key:""}),this.saveMidiMappings()},deleteMidiMapping(t){this.midi.mappings.splice(t,1),this.saveMidiMappings()},updateMidiMapping(t){return this.saveMidiMappings(),t},loadBindings(){try{const t=typeof window<"u"&&window.localStorage||null;if(!t)return;const e=t.getItem("defora_key_bindings");if(e){const i=JSON.parse(e);i&&typeof i=="object"&&(this.keyBindings={...this.keyBindings,...i})}}catch{}},saveBindings(){try{const t=typeof window<"u"&&window.localStorage||null;if(!t)return;t.setItem("defora_key_bindings",JSON.stringify(this.keyBindings))}catch{}},toggleBindingLearn(){this.bindingLearnMode=!this.bindingLearnMode,this.bindingTargetKey=null,this.bindingLearnMode?this.status="Learn mode: press key or move MIDI CC, then click a parameter":this.status="Learn mode disabled"},resetBindings(){confirm("Reset all bindings to defaults?")&&(this.keyBindings={translation_z:"w",translation_x:"a",translation_y:"s",rotation_y:"d",rotation_z:"q",fov:"f",cfg:"z",strength:"x",noise_multiplier:"c"},this.saveBindings(),this.status="Bindings reset to defaults")},getKeyBinding(t){return this.keyBindings[t]||null},clearKeyBinding(t){delete this.keyBindings[t],this.saveBindings()},getMidiBinding(t){const e=this.midi.mappings.find(i=>i.key===t);return e?e.cc:null},clearMidiBinding(t){const e=this.midi.mappings.findIndex(i=>i.key===t);e>=0&&(this.midi.mappings.splice(e,1),this.saveMidiMappings())},getParamValue(t){var r;const e=this.liveParamCanonicalKey(t),i=this.liveHudParamByKey(t)||this.liveHudParamByKey((r=Object.entries(this.liveParamAliases).find(([,l])=>l===t||l===e))==null?void 0:r[0]);if(i)return i.val;const n=this.animationTargets.find(l=>l.key===t||l.key===e);if(n&&n.field&&this.defaultAnimation){const l=Number(this.defaultAnimation[n.field]);return Number.isFinite(l)?l:n.default??0}if(e==="translation_x")return Number(this.motionPadValues.translation_x??0);if(e==="translation_y")return Number(this.motionPadValues.translation_y??0);if(e==="translation_z")return Number(this.motionPadValues.translation_z??0);if(e==="zoom_2d")return Number(this.motionPadValues.zoom??1);const s=this.modulationTargetByKey(e);return s?s.default??0:0},async refreshPresets(){this.presetsLoading=!0;try{const{data:t}=await Gt("/api/presets",{},"presets list");this.availablePresets=t.presets||[]}catch{}finally{this.presetsLoading=!1}},async loadPreset(t){try{const i=await(await fetch(`/api/presets/${t}`)).json();i.preset&&(i.preset.liveVibe&&(this.liveVibe=i.preset.liveVibe),i.preset.liveCam&&(this.liveCam=i.preset.liveCam),i.preset.audio&&Object.assign(this.audio,i.preset.audio),i.preset.cn&&Object.assign(this.cn,i.preset.cn),i.preset.lfos&&(this.lfos=i.preset.lfos),i.preset.macrosRack&&(this.macrosRack=i.preset.macrosRack),i.preset.loras&&(this.loras.common=i.preset.loras.common||[],this.loras.groupA=i.preset.loras.groupA||[],this.loras.groupB=i.preset.loras.groupB||[],await this.refreshLoras()),i.preset.prompts&&Object.assign(this.prompts,i.preset.prompts),this.currentPreset=t,this.presetStatus=`Loaded preset: ${t}`,setTimeout(()=>{this.presetStatus=""},3e3))}catch(e){console.error("Failed to load preset",e),this.presetStatus=`Error loading preset: ${e.message}`}},async saveCurrentPreset(){const t=this.newPresetName||"untitled",e={liveVibe:this.liveVibe,liveCam:this.liveCam,audio:{bpm:this.audio.bpm,track:this.audio.track},cn:{slots:this.cn.slots,active:this.cn.active},loras:{common:this.loras.common,groupA:this.loras.groupA,groupB:this.loras.groupB},prompts:{pos:this.prompts.pos,neg:this.prompts.neg,morphOn:this.prompts.morphOn,loraCrossfaderOn:this.prompts.loraCrossfaderOn,crossfaderValue:this.prompts.crossfaderValue,loraCrossfaderLfoLink:this.prompts.loraCrossfaderLfoLink,loraCrossfaderLfoBase:this.prompts.loraCrossfaderLfoBase,morphBlend:this.prompts.morphBlend,morphBlendLfoLink:this.prompts.morphBlendLfoLink,morphBlendLfoBase:this.prompts.morphBlendLfoBase},lfos:this.lfos,macrosRack:this.macrosRack,paramSources:this.paramSources};try{(await(await fetch(`/api/presets/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json()).ok&&(this.currentPreset=t,this.presetStatus=`Saved preset: ${t}`,this.newPresetName="",await this.refreshPresets(),setTimeout(()=>{this.presetStatus=""},3e3))}catch(i){console.error("Failed to save preset",i),this.presetStatus=`Error saving preset: ${i.message}`}},async deletePreset(t){if(confirm(`Delete preset "${t}"?`))try{await fetch(`/api/presets/${t}`,{method:"DELETE"}),this.currentPreset=null,this.presetStatus=`Deleted preset: ${t}`,await this.refreshPresets(),setTimeout(()=>{this.presetStatus=""},3e3)}catch(e){console.error("Failed to delete preset",e),this.presetStatus=`Error deleting preset: ${e.message}`}},invalidateAudioSpectrogram(){this._spectrogramGen=(this._spectrogramGen||0)+1,this.audioSpectrogramDataUrl=null,this.audioSpectrogramStatus=""},buildSpectrogramRgba(t,e){t.sampleRate,t.numberOfChannels;const i=t.length,n=t.getChannelData(0),s=i>=8192?1024:Math.max(256,Math.pow(2,Math.floor(Math.log2(i/4)))),r=s/2,l=Math.max(1,Math.floor((i-s)/r)+1),o=s/2,d=Math.max(64,l),u=Math.max(32,Math.min(o,128)),h=new Uint8ClampedArray(d*u*4),c=Math.max(1,l/d);for(let f=0;f=i)break;const D=.5*(1-Math.cos(2*Math.PI*k/(s-1))),P=n[E]*D,M=2*Math.PI*T*k/s;_+=P*Math.cos(M),v-=P*Math.sin(M)}const S=Math.sqrt(_*_+v*v)/s,w=Math.min(1,S*10),x=(T*d+f)*4;w<.25?(h[x]=0,h[x+1]=Math.floor(w*4*255),h[x+2]=255):w<.5?(h[x]=0,h[x+1]=255,h[x+2]=Math.floor((1-(w-.25)*4)*255)):w<.75?(h[x]=Math.floor((w-.5)*4*255),h[x+1]=255,h[x+2]=0):(h[x]=255,h[x+1]=Math.floor((1-(w-.75)*4)*255),h[x+2]=0),h[x+3]=255}}return{width:d,height:u,data:h}},spectrogramRgbaToDataUrl(t){if(typeof OffscreenCanvas<"u"){const e=new OffscreenCanvas(t.width,t.height),i=e.getContext("2d"),n=i.createImageData(t.width,t.height);return n.data.set(t.data),i.putImageData(n,0,0),e.toDataURL("image/png")}if(typeof document<"u"){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d"),n=i.createImageData(t.width,t.height);return n.data.set(t.data),i.putImageData(n,0,0),e.toDataURL("image/png")}return null},scheduleAudioSpectrogramDecode(t){typeof setTimeout=="function"&&setTimeout(()=>{this.runAudioSpectrogramFromObjectUrl(t).catch(()=>{})},0)},async runAudioSpectrogramFromObjectUrl(t){const e=typeof AudioContext<"u"?AudioContext:typeof webkitAudioContext<"u"?webkitAudioContext:null;if(!e||!this.audio.objectUrl||typeof fetch!="function"){t===this._spectrogramGen&&(this.audioSpectrogramStatus="");return}if(t!==this._spectrogramGen)return;let i=null;try{const s=await(await fetch(this.audio.objectUrl)).arrayBuffer();if(t!==this._spectrogramGen)return;i=new e;const r=await i.decodeAudioData(s.slice(0));if(t!==this._spectrogramGen)return;const l=this.buildSpectrogramRgba(r,{});if(!l){this.audioSpectrogramStatus="";return}const o=this.spectrogramRgbaToDataUrl(l);if(t!==this._spectrogramGen)return;this.audioSpectrogramDataUrl=o,this.audioSpectrogramStatus=""}catch{t===this._spectrogramGen&&(this.audioSpectrogramStatus="")}finally{try{i&&typeof i.close=="function"&&await i.close()}catch{}}},spectrogramFromAudioBuffer(t,e){return this.buildSpectrogramRgba(t,e||{})},disposeLiveAudioAnalyser(){this._liveSpecRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._liveSpecRaf),this._liveSpecRaf=null;const t=this.$refs&&this.$refs.avSyncAudio;if(t&&this._liveSpecMediaHandlers){const i=this._liveSpecMediaHandlers;i.play&&t.removeEventListener("play",i.play),i.pause&&t.removeEventListener("pause",i.pause),this._liveSpecMediaHandlers=null}try{this._liveSpecSource&&typeof this._liveSpecSource.disconnect=="function"&&this._liveSpecSource.disconnect()}catch{}try{this._liveSpecAnalyser&&typeof this._liveSpecAnalyser.disconnect=="function"&&this._liveSpecAnalyser.disconnect()}catch{}try{this._liveSpecGain&&typeof this._liveSpecGain.disconnect=="function"&&this._liveSpecGain.disconnect()}catch{}try{this._liveSpecBandpass&&typeof this._liveSpecBandpass.disconnect=="function"&&this._liveSpecBandpass.disconnect()}catch{}try{this._liveSpecSoloGain&&typeof this._liveSpecSoloGain.disconnect=="function"&&this._liveSpecSoloGain.disconnect()}catch{}const e=this._liveSpecCtx;if(this._liveSpecCtx=null,this._liveSpecSource=null,this._liveSpecAnalyser=null,this._liveSpecGain=null,this._liveSpecBandpass=null,this._liveSpecSoloGain=null,this._liveSpecFreqBuf=null,this.audioBandPreviewIndex=-1,e&&typeof e.close=="function")try{e.close()}catch{}},setupLiveAudioAnalyser(){const t=typeof AudioContext<"u"?AudioContext:typeof webkitAudioContext<"u"?webkitAudioContext:null;if(!t)return;this.disposeLiveAudioAnalyser();const e=this.$refs&&this.$refs.avSyncAudio;if(!(!e||!this.audio.objectUrl))try{const i=new t,n=i.createMediaElementSource(e),s=i.createAnalyser();s.fftSize=1024,s.smoothingTimeConstant=.78;const r=i.createGain();r.gain.value=1;const l=i.createBiquadFilter();l.type="bandpass";const o=i.createGain();if(o.gain.value=0,n.connect(s),s.connect(r),r.connect(i.destination),n.connect(l),l.connect(o),o.connect(i.destination),this._liveSpecCtx=i,this._liveSpecSource=n,this._liveSpecAnalyser=s,this._liveSpecGain=r,this._liveSpecBandpass=l,this._liveSpecSoloGain=o,this._liveSpecFreqBuf=new Uint8Array(s.frequencyBinCount),this.syncAudioBandPreviewGains(),this.audioBandPreviewIndex>=0){const h=this.audioMappings[this.audioBandPreviewIndex];h&&this.updateAudioBandpassFilter(h)}const d=()=>this.onLiveAudioPlay(),u=()=>this.onLiveAudioPause();e.addEventListener("play",d),e.addEventListener("pause",u),this._liveSpecMediaHandlers={play:d,pause:u},e.paused||this.onLiveAudioPlay()}catch{this.disposeLiveAudioAnalyser()}},onLiveAudioPlay(){try{this._liveSpecCtx&&this._liveSpecCtx.state==="suspended"&&typeof this._liveSpecCtx.resume=="function"&&this._liveSpecCtx.resume()}catch{}this.scheduleLiveSpectrumFrame()},onLiveAudioPause(){this._liveSpecRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._liveSpecRaf),this._liveSpecRaf=null,this.paintLiveSpectrumCanvases(null)},scheduleLiveSpectrumFrame(){this._liveSpecRaf==null&&typeof requestAnimationFrame=="function"&&(this._liveSpecRaf=requestAnimationFrame(()=>{this._liveSpecRaf=null;const t=this.$refs&&this.$refs.avSyncAudio,e=this._liveSpecAnalyser,i=this._liveSpecFreqBuf;!e||!i||(t&&!t.paused&&!t.ended?(e.getByteFrequencyData(i),this.paintLiveSpectrumCanvases(i),this.scheduleLiveSpectrumFrame()):this.paintLiveSpectrumCanvases(null))}))},paintLiveSpectrumCanvases(t){const e=[this.$refs.liveSpectrumCanvas,this.$refs.liveSpectrumCanvasStrip].filter(Boolean);for(const i of e){if(!i||!i.getContext)continue;const n=i.getContext("2d");if(!n)continue;const s=i.width||280,r=i.height||56;if(!t||!t.length){n.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),n.fillRect(0,0,s,r);continue}uy(n,t,s,r,{bgColor:this.themeColor("--bg-0","rgb(8, 9, 13)"),barColor:"rgba(80, 250, 123, 0.9)"})}},async handleAudioUpload(t){const e=t.target.files[0];if(!e)return;this.disposeLiveAudioAnalyser(),this.invalidateAudioSpectrogram();const i=50*1024*1024;if(e.size!=null&&e.size>i){this.audioStatus="Audio file is too large. Maximum supported size is 50MB.",t&&t.target&&(t.target.value="");return}if(this.audio.objectUrl){try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.objectUrl=null}if(typeof URL<"u"&&typeof URL.createObjectURL=="function"&&typeof Blob<"u"&&e instanceof Blob)try{this.audio.objectUrl=URL.createObjectURL(e),this.audioBeatMacrosCollapsed=!0}catch{this.audio.objectUrl=null}this.audioStatus="Uploading audio…";try{const n=await new Promise((d,u)=>{const h=new FileReader;h.onload=()=>d(h.result),h.onerror=()=>u(h.error||new Error("Failed to read audio file. Ensure the file is under 50MB and try again.")),h.readAsDataURL(e)}),s=await fetch("/api/audio-upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e.name,data:n})}),r=await s.json();if(!s.ok||r.error)throw new Error(r.error||"Upload failed");this.audio.uploadedFile=e.name,this.audio.track=r.path||e.name,this.audioStatus="Audio uploaded";const l=this._spectrogramGen;this.audio.objectUrl&&(this.audioSpectrogramStatus="Analyzing…",this.scheduleAudioSpectrogramDecode(l));const o=()=>{try{this.setupLiveAudioAnalyser()}catch{}};typeof this.$nextTick=="function"?this.$nextTick(o):setTimeout(o,0),this.primeAudioSpectrumPlaceholder()}catch(n){if(this.audio.objectUrl){try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.objectUrl=null}this.audioStatus=String(n&&n.message?n.message:n),console.error("Audio upload failed:",n),this.invalidateAudioSpectrogram(),this.disposeLiveAudioAnalyser()}},onAudioUpload(t){return this.handleAudioUpload(t)},primeAudioSpectrumPlaceholder(){const t=new Array(512);for(let e=0;en.json()).then(n=>{n.error&&console.error("ControlNet upload:",n.error)}).catch(n=>console.error("ControlNet upload failed",n)),t.target.value=""},async toggleWebcam(){this.cn.webcamActive?this.stopWebcam():await this.startWebcam()},async startWebcam(){try{const t=await navigator.mediaDevices.getUserMedia({video:{width:512,height:512,facingMode:"user"}});this.cn.webcamStream=t,this.cn.webcamActive=!0;const e=this.$refs.webcamVideo;e&&(e.srcObject=t,e.style.display="block",this.cn.webcamVideo=e);const i=this.$refs.webcamCanvas;i&&(this.cn.webcamCanvas=i,i.width=512,i.height=512),this.cn.webcamCaptureInterval=setInterval(()=>this.captureWebcamFrame(),this.webcamCaptureRate)}catch(t){console.error("Failed to start webcam:",t),alert("Could not access webcam. Check browser permissions.")}},stopWebcam(){this.cn.webcamCaptureInterval&&(clearInterval(this.cn.webcamCaptureInterval),this.cn.webcamCaptureInterval=null),this.cn.webcamStream&&(this.cn.webcamStream.getTracks().forEach(e=>e.stop()),this.cn.webcamStream=null);const t=this.$refs.webcamVideo;t&&(t.style.display="none",t.srcObject=null),this.cn.webcamActive=!1},captureWebcamFrame(){const t=this.cn.webcamVideo,e=this.cn.webcamCanvas;if(!t||!e||t.readyState<2)return;e.getContext("2d").drawImage(t,0,0,512,512),e.toBlob(async n=>{if(!n)return;const s=this.cn.slots.find(l=>l.id===this.cn.active);if(!s||s.imageSource!=="webcam")return;const r=new FormData;r.append("image",n,"webcam_frame.png"),r.append("slot",this.cn.active);try{await fetch("/api/controlnet/upload-image",{method:"POST",body:r})}catch(l){console.error("Webcam frame upload failed:",l)}},"image/png")},async startScreenCapture(){try{const t=await navigator.mediaDevices.getDisplayMedia({video:{width:512,height:512}}),e=document.createElement("video");e.srcObject=t,e.autoplay=!0,e.playsInline=!0;const i=document.createElement("canvas");i.width=512,i.height=512;const n=setInterval(()=>{e.readyState<2||(i.getContext("2d").drawImage(e,0,0,512,512),i.toBlob(async s=>{if(!s)return;const r=this.cn.slots.find(o=>o.id===this.cn.active);if(!r||r.imageSource!=="screen")return;const l=new FormData;l.append("image",s,"screen_capture.png"),l.append("slot",this.cn.active);try{await fetch("/api/controlnet/upload-image",{method:"POST",body:l})}catch(o){console.error("Screen capture upload failed:",o)}},"image/png"))},this.webcamCaptureRate);t.getVideoTracks()[0].onended=()=>clearInterval(n)}catch(t){console.error("Failed to start screen capture:",t),alert("Could not start screen capture. Check browser permissions.")}},handleMidi(t,e){const[i,n,s]=e.data;if(!((i&240)===176))return;const l=this.midi.mappings.find(d=>d.cc===n),o=s/127;if(l&&l.key){const d=String(l.key||""),u=d.match(/^mod_slot_(\d)$/);if(u){const c=Math.max(1,Math.min(6,Number(u[1])||1)),g=(Array.isArray(this.liveModulationSlots)?this.liveModulationSlots:[])[c-1];if(g){if(g.kind==="xypad"){const y=this.modulationTargetByKey(g.paramKeyX);if(y){const T=y.min+o*(y.max-y.min),_={},v={};this.routeModulationValue(y.key,T,_,v),Object.keys(_).length&&this.sendControl("liveParam",_),Object.values(v).forEach(S=>this.updateControlNet(S))}}else if(g.paramKey){const y=this.modulationTargetByKey(g.paramKey);if(y){const T=y.min+o*(y.max-y.min),_={},v={};this.routeModulationValue(y.key,T,_,v),Object.keys(_).length&&this.sendControl("liveParam",_),Object.values(v).forEach(S=>this.updateControlNet(S))}else this.sendControl("liveParam",{[g.paramKey]:o})}}return}const h=this.midiTarget(d);if(h){const c=h.min+o*(h.max-h.min),f={},g={};this.routeModulationValue(h.key,c,f,g),Object.keys(f).length&&this.sendControl("liveParam",f),Object.values(g).forEach(y=>this.updateControlNet(y))}else this.sendControl("liveParam",{[d]:o})}},sortedKeyframes(t){return[...t.keyframes||[]].sort((e,i)=>e.t-i.t)},setKeyframeEasing(t,e){t&&(t.easing=e==="linear"?void 0:e)},sequencerEaseT(t,e){const i=Math.min(1,Math.max(0,t)),n=e||"linear";return n==="easeIn"?i*i*i:n==="easeOut"?1-(1-i)**3:n==="easeInOut"?i<.5?4*i*i*i:1-(-2*i+2)**3/2:i},sequencerPayload(){const t=Array.isArray(this.sequencer.markers)?[...this.sequencer.markers].map(e=>({t:Number(e.t),name:String(e.name||"").trim(),action:e.action||"jump",target:e.target||""})).filter(e=>e.name&&Number.isFinite(e.t)).sort((e,i)=>e.t-i.t):[];return{version:1,durationSec:Number(this.sequencer.durationSec),fps:Number(this.sequencer.fps),loop:!!this.sequencer.loop,markers:t,clips:this.normalizeSequencerClipsForSave(this.sequencer.clips),tracks:this.sequencer.tracks.map(e=>({id:e.id,param:e.param,keyframes:[...e.keyframes].sort((i,n)=>i.t-n.t)}))}},normalizeSequencerClipsForSave(t){const e=new Set(["prompt","lora","controlnet"]),i=Number(this.sequencer.durationSec)||0;return Array.isArray(t)?t.filter(n=>n&&e.has(n.type)&&Number.isFinite(Number(n.t))).map(n=>{const s=Math.min(Math.max(0,Number(n.t)),i);let r=n.endT==null||n.endT===""?null:Number(n.endT);return r!=null&&Number.isFinite(r)?r=Math.min(Math.max(s,r),i):r=null,{id:String(n.id||`clip-${Date.now()}`),type:n.type,t:s,endT:r,label:String(n.label||n.type).slice(0,48),payload:n.payload&&typeof n.payload=="object"?n.payload:{}}}).sort((n,s)=>n.t-s.t):[]},clampSequencerClips(){const t=Number(this.sequencer.durationSec)||0,e=this.sequencer.clips;if(Array.isArray(e))for(const i of e)!i||typeof i.t!="number"||(i.t<0&&(i.t=0),i.t>t&&(i.t=t),i.endT!=null&&typeof i.endT=="number"&&(i.endTt&&(i.endT=t)))},snapshotSequencerPromptPayload(){return{pos:String(this.prompts.pos||""),neg:String(this.prompts.neg||"")}},snapshotSequencerLoraPayload(){const t=e=>(e||[]).map(i=>({id:i.id,name:i.name,path:i.path,strength:Number(i.strength)||0}));return{common:t(this.loras.common),groupA:t(this.loras.groupA),groupB:t(this.loras.groupB),crossfaderValue:Number(this.prompts.crossfaderValue)||0,loraCrossfaderOn:!!this.prompts.loraCrossfaderOn}},snapshotSequencerControlNetPayload(){return{slots:(this.cn.slots||[]).map(t=>({id:t.id,model:t.model,weight:Number(t.weight)||0,start:Number(t.start)||0,end:Number(t.end)??1,enabled:!!t.enabled}))}},addSequencerClip(t){if(!new Set(["prompt","lora","controlnet"]).has(t))return;this.clampSequencerPlayhead();const i=Math.max(0,Number(this.sequencer.durationSec)||0);if(i<.1){this.sequencerStatus="Set timeline duration above 0s first";return}const n=Array.isArray(this.sequencer.clips)?this.sequencer.clips:[];if(n.length>=96){this.sequencerStatus="Maximum 96 timeline clips";return}const s=Math.min(Math.max(0,this.sequencerPlayhead),i),r=Math.max(.1,Number(this.sequencerClipDurationSec)||2),l=Math.min(i,s+r),o=n.filter(f=>f.type===t).length+1,d={prompt:"Prompt",lora:"LoRA",controlnet:"ControlNet"};let u={};t==="prompt"?u=this.snapshotSequencerPromptPayload():t==="lora"?u=this.snapshotSequencerLoraPayload():u=this.snapshotSequencerControlNetPayload();const h=`clip-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,c={id:h,type:t,t:s,endT:l>s?l:null,label:`${d[t]} ${o}`,payload:u};this.sequencer.clips=[...n,c],this.sequencerSelectedClipId=h,this.sequencerStatus=`Added ${c.label} at ${s.toFixed(2)}s`,this.saveSessionState(),this.$nextTick(()=>this.drawTimeline());try{this.applySequencerClip(c)}catch(f){console.warn("[sequencer] apply clip failed",f)}},removeSequencerClip(t){if(!Array.isArray(this.sequencer.clips))return;const e=this.sequencer.clips.findIndex(i=>i.id===t);e<0||(this.sequencer.clips.splice(e,1),this.sequencerSelectedClipId===t&&(this.sequencerSelectedClipId=null))},jumpToSequencerClip(t){if(!t||typeof t.t!="number")return;const e=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead=Math.min(Math.max(0,t.t),e),this.sequencerSelectedClipId=t.id,this.previewSequencerFrame()},selectSequencerClip(t){this.sequencerSelectedClipId=t},activeSequencerClipAt(t,e){const i=Number(t)||0,n=(this.sequencer.clips||[]).filter(s=>s&&s.type===e&&Number.isFinite(Number(s.t))&&i>=Number(s.t)).filter(s=>s.endT==null||iNumber(r.t)>=Number(s.t)?r:s,n[0]):null},applySequencerClip(t){if(!(!t||!t.payload)){if(t.type==="prompt"){t.payload.pos!=null&&(this.prompts.pos=String(t.payload.pos)),t.payload.neg!=null&&(this.prompts.neg=String(t.payload.neg)),this.sendPrompts();return}if(t.type==="lora"){const e=(i,n)=>{this.loras[n]=(i||[]).map(s=>({id:s.id||s.path,name:s.name||s.path,path:s.path,strength:Number(s.strength)||1}))};e(t.payload.common,"common"),e(t.payload.groupA,"groupA"),e(t.payload.groupB,"groupB"),t.payload.crossfaderValue!=null&&(this.prompts.crossfaderValue=Number(t.payload.crossfaderValue)||0),t.payload.loraCrossfaderOn!=null&&(this.prompts.loraCrossfaderOn=!!t.payload.loraCrossfaderOn),this.applyLoras();return}if(t.type==="controlnet"&&Array.isArray(t.payload.slots))for(const e of t.payload.slots){const i=this.cn.slots.find(n=>n.id===e.id);i&&(e.model!=null&&(i.model=e.model),e.weight!=null&&(i.weight=e.weight),e.start!=null&&(i.start=e.start),e.end!=null&&(i.end=e.end),e.enabled!=null&&(i.enabled=e.enabled),this.updateControlNet(i))}}},applySequencerClipsAt(t){for(const e of["prompt","lora","controlnet"]){const i=this.activeSequencerClipAt(t,e);i&&this.applySequencerClip(i)}},clipTypeLabel(t){return t==="prompt"?"Prompt":t==="lora"?"LoRA":t==="controlnet"?"ControlNet":t},clipSummaryText(t){var e,i,n,s,r,l,o,d;if(!t)return"";if(t.type==="prompt"){const u=String(((e=t.payload)==null?void 0:e.pos)||"").trim();return u.length>48?`${u.slice(0,48)}…`:u||"Empty prompt"}if(t.type==="lora"){const u=(((n=(i=t.payload)==null?void 0:i.common)==null?void 0:n.length)||0)+(((r=(s=t.payload)==null?void 0:s.groupA)==null?void 0:r.length)||0)+(((o=(l=t.payload)==null?void 0:l.groupB)==null?void 0:o.length)||0);return`${u} LoRA${u===1?"":"s"}`}if(t.type==="controlnet"){const u=(((d=t.payload)==null?void 0:d.slots)||[]).filter(h=>h.enabled).length;return`${u} slot${u===1?"":"s"} on`}return""},clampSequencerMarkers(){const t=Number(this.sequencer.durationSec)||0,e=this.sequencer.markers;if(Array.isArray(e)){for(const i of e)!i||typeof i.t!="number"||(i.t<0&&(i.t=0),i.t>t&&(i.t=t));this.clampSequencerClips()}},clampSequencerPlayhead(){const t=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead<0&&(this.sequencerPlayhead=0),this.sequencerPlayhead>t&&(this.sequencerPlayhead=t),this.clampSequencerMarkers()},addSequencerMarker(){this.clampSequencerPlayhead();const t=Number(this.sequencer.durationSec)||0;let e=(this.sequencerMarkerName||"").trim()||"Scene";if(e.length>48&&(e=e.slice(0,48)),!/^[a-zA-Z0-9_ \-.]+$/.test(e)){this.sequencerStatus="Marker label: letters, digits, space, underscore, hyphen, dot only";return}if(Array.isArray(this.sequencer.markers)||(this.sequencer.markers=[]),this.sequencer.markers.length>=64){this.sequencerStatus="Maximum 64 markers";return}const i=Math.min(Math.max(0,this.sequencerPlayhead),t);this.sequencer.markers.push({t:i,name:e,action:"jump",target:""}),this.sequencerStatus=""},removeSequencerMarker(t){const i=this.sortedSequencerMarkers[t];if(!i||!Array.isArray(this.sequencer.markers))return;const n=this.sequencer.markers.indexOf(i);n>=0&&this.sequencer.markers.splice(n,1)},jumpToSequencerMarker(t){if(!t||typeof t.t!="number")return;const e=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead=Math.min(Math.max(0,t.t),e),this.previewSequencerFrame()},setMarkerAction(t,e){t&&(t.action=e,(e==="jump"||e==="generate"||e==="pause")&&(t.target=""))},setMarkerTarget(t,e){t&&(t.target=e)},markerActionPlaceholder(t){switch(t){case"preset":return"Preset name";case"morph":return"Slot #";case"param":return'{"param": value}';default:return""}},markerActionTitle(t){switch(t){case"preset":return"Name of a motion preset (e.g. Orbit, Zoom)";case"morph":return"Morph slot number to toggle (1, 2, 3...)";case"param":return'JSON object of params to apply (e.g. {"zoom": 1.5})';default:return""}},interpolateTrack(t,e){const i=Number(this.sequencer.durationSec)||0,n=Math.min(Math.max(0,e),i),s=this.sortedKeyframes(t);if(!s.length)return null;if(n<=s[0].t)return s[0].v;if(n>=s[s.length-1].t)return s[s.length-1].v;let r=0;for(;rthis.updateControlNet(n)),this.applySequencerClipsAt(t)},previewSequencerFrame(){this.clampSequencerPlayhead(),this.jobPlaybackTimeSec=Number(this.sequencerPlayhead)||0,this.applySequencerAt(this.sequencerPlayhead);const t=this.ws&&this.ws.readyState===1;!t&&this.sequencer.tracks.some(e=>e.keyframes&&e.keyframes.length)?this.sequencerStatus="Preview applied locally — connect live control for engine output":t&&(this.sequencerStatus="")},tickSequencer(){const t=Number(this.sequencer.durationSec)||0,e=1/Math.max(1,Number(this.sequencer.fps)||24);let i=this.sequencerPlayhead+e;const n=this.sequencerPlayhead;if(i>=t-1e-9)if(this.sequencer.loop)i=0;else{this.sequencerPlayhead=t,this.applySequencerAt(this.sequencerPlayhead),this.stopSequencerPlayback();return}this.sequencerPlayhead=i,this.applySequencerAt(this.sequencerPlayhead);const s=this.sequencer.markers||[];for(const r of s)r.t>n&&r.t<=i&&this.triggerMarkerAction(r)},triggerMarkerAction(t){if(!(!t||!t.action))switch(t.action){case"jump":this.sequencerPlayhead=t.t,this.previewSequencerFrame();break;case"preset":t.target&&this.motionPresets[t.target]&&(this.sendPreset(t.target),this.sequencerStatus=`Marker: applied preset "${t.target}"`);break;case"generate":this.generateStory(),this.sequencerStatus="Marker: triggered generation";break;case"morph":if(t.target){const e=parseInt(t.target)-1;e>=0&&en.keyframes&&n.keyframes.length)){this.sequencerStatus="Add keyframes to play";return}const e=this.ws&&this.ws.readyState===1;this.sequencerPlaying=!0,this.sequencerStatus=e?"":"Playing locally — connect live control for engine output";const i=Math.max(16,Math.round(1e3/Math.max(1,Number(this.sequencer.fps)||24)));this.sequencerTimer=setInterval(()=>this.tickSequencer(),i)},stopSequencerPlayback(){this.sequencerPlaying=!1,this.sequencerTimer&&(clearInterval(this.sequencerTimer),this.sequencerTimer=null)},addSequencerTrack(){const t=this.sequencerNewParam;if(this.sequencer.tracks.some(i=>i.param===t)){this.sequencerStatus="Track already exists for "+t;return}const e="tr-"+Date.now()+"-"+Math.random().toString(36).slice(2,7);this.sequencer.tracks.push({id:e,param:t,keyframes:[]}),this.sequencerSelectedTrackId=e,this.sequencerStatus=""},removeSequencerTrack(t){this.sequencer.tracks=this.sequencer.tracks.filter(e=>e.id!==t),this.sequencerSelectedTrackId===t&&(this.sequencerSelectedTrackId=null)},addSequencerKeyframe(){const t=this.sequencerSelectedTrackId||this.sequencer.tracks[0]&&this.sequencer.tracks[0].id,e=this.sequencer.tracks.find(s=>s.id===t);if(!e){this.sequencerStatus="Add a track first";return}this.clampSequencerPlayhead();const i=Math.min(Math.max(0,this.sequencerPlayhead),Number(this.sequencer.durationSec)||0),n=Number(this.sequencerKeyframeVal);if(Number.isNaN(n)){this.sequencerStatus="Invalid keyframe value";return}e.keyframes.push({t:i,v:n}),this.sequencerStatus=""},removeSequencerKeyframe(t,e){const i=this.sequencer.tracks.find(l=>l.id===t);if(!i)return;const s=this.sortedKeyframes(i)[e];if(!s)return;const r=i.keyframes.indexOf(s);r>=0&&i.keyframes.splice(r,1)},async refreshSequencerList(){if(typeof fetch=="function")try{const e=await(await fetch("/api/sequencer")).json();Array.isArray(e.timelines)&&(this.sequencerList=e.timelines)}catch{}},async saveSequencerTimeline(){const e=(this.sequencerSaveName||"timeline").trim().replace(/[^a-zA-Z0-9_-]/g,"");if(!e){this.sequencerStatus="Invalid save name";return}try{const i=await fetch("/api/sequencer/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.sequencerPayload())}),n=await i.json();if(!i.ok)throw new Error(n.error||i.statusText);this.sequencerStatus="Saved "+e,await this.refreshSequencerList()}catch(i){this.sequencerStatus=String(i.message||i)}},async loadSequencerTimeline(){const t=this.sequencerLoadPick;if(t)try{const e=await fetch("/api/sequencer/"+encodeURIComponent(t)),i=await e.json();if(!e.ok||!i.timeline)throw new Error(i.error||"load failed");const n=i.timeline;n.durationSec!=null&&(this.sequencer.durationSec=n.durationSec),n.fps!=null&&(this.sequencer.fps=n.fps),this.sequencer.loop=n.loop!==!1,this.sequencer.markers=Array.isArray(n.markers)?n.markers.map(s=>({t:Number(s.t),name:String(s.name||"").trim(),action:s.action||"jump",target:s.target||""})).filter(s=>s.name&&Number.isFinite(s.t)):[],this.sequencer.tracks=Array.isArray(n.tracks)?n.tracks.map(s=>({id:s.id||"tr-"+Math.random().toString(36).slice(2),param:s.param,keyframes:Array.isArray(s.keyframes)?s.keyframes.slice():[]})):[],this.sequencer.clips=this.normalizeSequencerClipsForSave(n.clips||[]),this.sequencerSelectedClipId=this.sequencer.clips[0]?this.sequencer.clips[0].id:null,this.sequencerSaveName=t,this.sequencerSelectedTrackId=this.sequencer.tracks[0]?this.sequencer.tracks[0].id:null,this.clampSequencerPlayhead(),this.sequencerStatus="Loaded "+t}catch(e){this.sequencerStatus=String(e.message||e)}},exportSequencerDownload(){const t=JSON.stringify(this.sequencerPayload(),null,2),e=new Blob([t],{type:"application/json"}),i=(this.sequencerSaveName||"sequencer").replace(/[^a-zA-Z0-9_-]/g,"")||"sequencer",n=document.createElement("a");n.href=URL.createObjectURL(e),n.download=i+".json",n.click(),URL.revokeObjectURL(n.href)},async applySequencerToDeforumSettings(){const t=Math.max(1,Number(this.sequencer.fps)||24),e=Math.max(.1,Number(this.sequencer.durationSec)||1),i=Math.ceil(e*t),n={};for(const s of this.sequencer.tracks){const r=this.modulationTargets.find(u=>u.key===s.param),l=(r==null?void 0:r.deforumKey)||s.param;if(!s.keyframes.length)continue;const d=[...s.keyframes].sort((u,h)=>u.t-h.t).map(u=>{const h=Math.round(Math.min(i,Math.max(0,u.t*t))),c=Number.isFinite(u.v)?u.v:0;return`${h}:(${c.toFixed(4)})`});n[l]=d.join(", ")}if(!Object.keys(n).length){this.sequencerStatus="No keyframed tracks — add tracks/keyframes or Apply a Story first";return}try{const r={...this.deforumSettings||{},...n},l=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:r})});if(!l.ok)throw new Error(`HTTP ${l.status}`);this.sequencerStatus=`Applied ${Object.keys(n).length} schedule(s) to Deforum settings`,this.loadDeforumSettings({syncServerModel:!1})}catch(s){this.sequencerStatus="Apply failed: "+s.message}},selectSequencerTrack(t){this.sequencerSelectedTrackId=t},sequencerTimeFromJobFrame(t){const e=this.sequencerJobFps,i=this.sequencerJobTotalFrames;return(Math.min(i,Math.max(1,Math.floor(Number(t)||1)))-1)/e},seekSequencerToJobFrame(t){const e=Number(this.sequencer.durationSec)||0,i=Math.min(e,Math.max(0,this.sequencerTimeFromJobFrame(t)));this.seekSequencer(i)},seekSequencer(t){this.sequencerPlayhead=Math.min(Math.max(0,Number(t)||0),Math.max(.01,Number(this.sequencer.durationSec)||.01)),this.jobPlaybackTimeSec=this.sequencerPlayhead,this.previewSequencerFrame()},updateSequencerKeyframe({trackId:t,keyframe:e,t:i,v:n}){!this.sequencer.tracks.find(r=>r.id===t)||!e||(e.t=Math.min(Math.max(0,Number(i)||0),Math.max(.01,Number(this.sequencer.durationSec)||.01)),e.v=Number(n))},getTrackValueAt(t,e){const i=this.sortedKeyframes(t);if(!i.length)return 0;if(e<=i[0].t)return i[0].v;if(e>=i[i.length-1].t)return i[i.length-1].v;for(let n=0;n=i[n].t&&e<=i[n+1].t){const s=i[n+1].t-i[n].t,r=s>0?(e-i[n].t)/s:0,l=i[n],o=i[n+1];if(l.hIn!==void 0||l.hOut!==void 0||o.hIn!==void 0||o.hOut!==void 0){l.hOut!=null&&l.hOut,o.hIn!=null&&o.hIn;const u=l.hOutV!=null?l.hOutV:l.v+(o.v-l.v)*.33,h=o.hInV!=null?o.hInV:l.v+(o.v-l.v)*.67;return this.cubicBezier(r,l.v,u,h,o.v)}const d=this.sequencerEaseT(r,l.easing);return l.v+(o.v-l.v)*d}return i[i.length-1].v},drawTimeline(){const t=this.$refs.timelineCanvas;if(!t||!this.sequencer.tracks.length)return;const e=t.getContext("2d"),i=window.devicePixelRatio||1,n=t.getBoundingClientRect();t.width=n.width*i,t.height=Math.max(120,this.sequencer.tracks.length*40+20)*i,e.scale(i,i);const s=n.width,r=n.height,l=Math.max(.01,Number(this.sequencer.durationSec)||8),o=(r-20)/Math.max(1,this.sequencer.tracks.length),d=zK;e.clearRect(0,0,s,r),e.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),e.fillRect(0,0,s,r),this.sequencer.tracks.forEach((c,f)=>{const g=20+f*o,y=this.sortedKeyframes(c);if(!y.length){e.strokeStyle=$K,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(0,g+o/2),e.lineTo(s,g+o/2),e.stroke(),e.setLineDash([]),e.fillStyle=Vm,e.font="10px monospace",e.fillText(c.param+" (no keyframes)",6,g+o/2+3);return}let T=Math.min(...y.map(x=>x.v)),_=Math.max(...y.map(x=>x.v));const v=_-T||1;T-=v*.15,_+=v*.15;const S=d[f%d.length];e.strokeStyle=GK,e.lineWidth=1,e.strokeRect(0,g,s,o),e.fillStyle=S+"20",e.fillRect(0,g,s,o),e.strokeStyle=S,e.lineWidth=2,e.beginPath();const w=Math.max(s,100);for(let x=0;x<=w;x++){const k=x/w*l,E=this.getTrackValueAt(c,k),D=k/l*s,P=g+o-(E-T)/(_-T)*o;x===0?e.moveTo(D,P):e.lineTo(D,P)}e.stroke(),y.forEach((x,k)=>{const E=x.t/l*s,D=x.v,P=g+o-(D-T)/(_-T)*o;if(k{const f=c.t/l*s,g=this.themeColor("--error","rgb(226, 75, 74)");e.strokeStyle=g+"80",e.lineWidth=1,e.setLineDash([2,3]),e.beginPath(),e.moveTo(f,20),e.lineTo(f,r),e.stroke(),e.setLineDash([]),e.fillStyle=g,e.font="8px monospace",e.fillText(c.name,f+3,14)});const h=this.sequencerPlayhead/l*s;e.strokeStyle=this.themeColor("--media-text","rgb(255, 255, 255)"),e.lineWidth=2,e.beginPath(),e.moveTo(h,20),e.lineTo(h,r),e.stroke(),e.fillStyle=this.themeColor("--media-text","rgb(255, 255, 255)"),e.beginPath(),e.moveTo(h-5,20),e.lineTo(h+5,20),e.lineTo(h,26),e.closePath(),e.fill();for(let c=0;c<=4;c++){const f=l/4*c,g=f/l*s;e.fillStyle=Vm,e.font="8px monospace",e.fillText(f.toFixed(1)+"s",g+2,r-2)}},seekTimeline(t){const e=this.$refs.timelineCanvas;if(!e)return;const i=e.getBoundingClientRect(),n=t.clientX-i.left,s=Math.max(.01,Number(this.sequencer.durationSec)||8);this.sequencerPlayhead=Math.max(0,Math.min(s,n/i.width*s)),this.drawTimeline()},hoverTimeline(t){const e=this.$refs.timelineCanvas;if(!e)return;const i=e.getBoundingClientRect(),n=t.clientX-i.left,s=Math.max(.01,Number(this.sequencer.durationSec)||8);this.timelineHoverTime=Math.max(0,Math.min(s,n/i.width*s)),this.timelineHoverPercent=n/i.width*100},motionPadPuckStyleFor(t){const e=t==="look"?1:this.motionMovePadRange,i=Number(t==="look"?this.motionPadValues.look_x??0:this.motionPadValues.translation_x||0),n=Number(t==="look"?this.motionPadValues.look_y??0:this.motionPadValues.translation_y||0),s=(i+e)/(e*2)*100,r=(1-(n+e)/(e*2))*100;return{left:`${Math.min(100,Math.max(0,s))}%`,top:`${Math.min(100,Math.max(0,r))}%`}},motionPadMouseDown(t,e){this.motionPadDragStart(e),this.updateMotionPad(t,e,{previewOnly:this.motionSmoothnessActive()}),t.preventDefault()},motionPadDragStart(t){this.xyPad.dragging=!0,this.xyPad.activePad=t,this.xyPad.dragStartValues=this.captureMotionPadSnapshotForPad(t)||this.captureMotionPadSnapshot()},motionPadMouseMove(t,e){!this.xyPad.dragging||this.xyPad.activePad!==e||(this.updateMotionPad(t,e),t.preventDefault())},motionPadMouseUp(t){const e=t||this.xyPad.activePad;if(this.xyPad.dragging&&e){const i=this.motionXYPadSlotById(e);i&&!this.motionPadSpringBack?this.applyMotionPadAxisValues(i.xAxis,i.yAxis,this.motionAxisTargetValue(i.xAxis),this.motionAxisTargetValue(i.yAxis),{previewOnly:!1}):this.motionSmoothnessActive()&&this.commitMotionPadDrag(e)}this.xyPad.dragging=!1,this.xyPad.activePad=null,this.xyPad.dragStartValues=null},applyMotionPadAxisValues(t,e,i,n,s={}){const r=!!s.previewOnly;this.previewMotionAxis(t,Number(i)||0),this.previewMotionAxis(e,Number(n)||0);const l=this.liveHudParamByKey("panx"),o=this.liveHudParamByKey("pany");if(t==="translation_x"&&l&&this.motionMovePadRange===1&&(l.val=this.motionPadValues.translation_x),e==="translation_y"&&o&&this.motionMovePadRange===1&&(o.val=this.motionPadValues.translation_y),!r){const d=this.motionAxisToLiveKey(t),u=this.motionAxisToLiveKey(e);d&&this.emitMotionLiveParam(d,this.motionAxisTargetValue(t)),u&&this.emitMotionLiveParam(u,this.motionAxisTargetValue(e))}!r&&!this.deforumPlaying&&this.schedulePreviewFrame()},applyMotionPadValues(t,e,i,n={}){const s=!!n.previewOnly;if(t==="look"){this.applyMotionPadAxisValues("angle","zoom",e,i,{previewOnly:s});return}this.applyMotionPadAxisValues("translation_x","translation_y",e,i,{previewOnly:s})},xyPadMouseDown(t){this.motionPadMouseDown(t,"move")},xyPadMouseMove(t){this.motionPadMouseMove(t,"move")},xyPadMouseUp(){this.motionPadMouseUp()},updateMotionPad(t,e,i={}){const s=t.currentTarget.getBoundingClientRect();let r,l;t.touches&&t.touches.length>0?(r=t.touches[0].clientX,l=t.touches[0].clientY):(r=t.clientX,l=t.clientY);const o=s.width||this.xyPad.padSize||1,d=s.height||this.xyPad.padSize||1,u=Math.max(0,Math.min(o,r-s.left)),h=Math.max(0,Math.min(d,l-s.top)),c=this.clampVal(u/o*2-1,-1,1),f=this.clampVal(1-h/d*2,-1,1),g=!!i.previewOnly;if(e==="look")this.applyMotionPadValues("look",c,f,{previewOnly:g});else{const y=this.motionMovePadRange;this.applyMotionPadValues("move",c*y,f*y,{previewOnly:g})}},async refreshLoras(){this.lorasLoading=!0;try{const{data:t}=await Gt("/api/loras",{},"loras list");if(t.loras){this.loras.available=t.loras.map(i=>({id:i.id||i.name,name:i.name,path:i.path||"",thumbnail:i.thumbnail||null,metadata:i.metadata||null,family:this.detectLoraFamily(i),strength:i.strength||1,selected:!1,group:null})),this.loras.source=t.source||"unknown";const e=new Map(this.loras.available.map(i=>[i.id,i]));this.loras.common.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="COMMON",n.strength=i.strength)}),this.loras.groupA.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="A",n.strength=i.strength)}),this.loras.groupB.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="B",n.strength=i.strength)})}}catch(t){console.error("Failed to load LoRAs",t)}finally{this.lorasLoading=!1}},toggleLoraSelection(t){t.selected?this.removeLoraSelection(t):(t.selected=!0,t.group="COMMON",this.assignLoraToGroup(t,"COMMON"))},assignLoraToGroup(t,e){if(e!=="A"&&e!=="B"&&e!=="COMMON")return;this.loras.common=this.loras.common.filter(n=>n.id!==t.id),this.loras.groupA=this.loras.groupA.filter(n=>n.id!==t.id),this.loras.groupB=this.loras.groupB.filter(n=>n.id!==t.id),t.group=e,t.selected=!0;const i={id:t.id,name:t.name,path:t.path,strength:t.strength,thumbnail:t.thumbnail};e==="COMMON"?this.loras.common.push(i):e==="A"?this.loras.groupA.push(i):this.loras.groupB.push(i)},removeLoraSelection(t){t.selected=!1,t.group=null,this.loras.common=this.loras.common.filter(e=>e.id!==t.id),this.loras.groupA=this.loras.groupA.filter(e=>e.id!==t.id),this.loras.groupB=this.loras.groupB.filter(e=>e.id!==t.id)},unassignLora(t){const e=this.loras.available.find(i=>i.id===t.id);e&&(e.selected=!1,e.group=null),this.loras.common=this.loras.common.filter(i=>i.id!==t.id),this.loras.groupA=this.loras.groupA.filter(i=>i.id!==t.id),this.loras.groupB=this.loras.groupB.filter(i=>i.id!==t.id)},updateLoraStrength(t){const e=this.loras.common.find(s=>s.id===t.id);e&&(e.strength=t.strength);const i=this.loras.groupA.find(s=>s.id===t.id);i&&(i.strength=t.strength);const n=this.loras.groupB.find(s=>s.id===t.id);n&&(n.strength=t.strength)},updateGroupedLoraStrength(t,e,i){const n=parseFloat(i);if(!Number.isFinite(n))return;const r=(t==="COMMON"?this.loras.common:t==="B"?this.loras.groupB:this.loras.groupA).find(o=>o.id===e.id);r&&(r.strength=n);const l=this.loras.available.find(o=>o.id===e.id);l&&(l.strength=n,l.selected=!0,l.group=t)},updateCrossfader(){const t=this.loraCrossfaderBlending,e=this.prompts.crossfaderValue;this.sendControl("crossfader",{value:e,loraCrossfaderOn:this.prompts.loraCrossfaderOn,common:this.loras.common.map(i=>({...i,effectiveStrength:i.strength})),groupA:this.loras.groupA.map(i=>({...i,effectiveStrength:t?i.strength*(1-e):i.strength})),groupB:this.loras.groupB.map(i=>({...i,effectiveStrength:t?i.strength*e:i.strength}))})},applyLoras(){const t=this.loraCrossfaderBlending,e=this.prompts.crossfaderValue,i={common:this.loras.common.map(n=>({name:n.name,path:n.path,strength:n.strength})),groupA:this.loras.groupA.map(n=>({name:n.name,path:n.path,strength:t?n.strength*(1-e):n.strength})),groupB:this.loras.groupB.map(n=>({name:n.name,path:n.path,strength:t?n.strength*e:n.strength})),crossfaderValue:e,loraCrossfaderOn:this.prompts.loraCrossfaderOn};this.sendControl("loras",i),console.log("Applied LoRAs with crossfader",i)},clearAllLoras(){this.loras.available.forEach(t=>{t.selected=!1,t.group=null}),this.loras.common=[],this.loras.groupA=[],this.loras.groupB=[],this.sendControl("loras",{common:[],groupA:[],groupB:[],crossfaderValue:this.prompts.crossfaderValue})},_genRnd(t){return t[Math.floor(Math.random()*t.length)]},generatorRequestBody(){const t=this.generator.stylePreset==="custom"?this.generator.customStyle.trim()||"Masterpiece, Realistic":this.generator.stylePreset,e=Number(this.deforumSettings&&this.deforumSettings.W)||Number((this.generator.resolution||"1024x576").split("x")[0])||1024,i=Number(this.deforumSettings&&this.deforumSettings.H)||Number((this.generator.resolution||"1024x576").split("x")[1])||576,n=Number(this.sequencer&&this.sequencer.fps)||Number(this.framesync&&this.framesync.fps)||Number(this.generator.fps)||24,s=Number(this.deforumSettings&&this.deforumSettings.max_frames)||Number(this.framesync&&this.framesync.frameCount)||Number(this.generator.totalFrames)||96,r=Math.max(2,Number(this.generator.numScenes)||4);return{theme:this.generator.theme.trim()||this._genRnd(this.genData.defaultThemes),style:t,width:e,height:i,fps:n,totalFrames:s,numScenes:r}},_buildScene(t,e,i,n){const s=v=>this._genRnd(v),r=this.genData,l=i===0?"opening":i>=n-1?"closing":i1;v++)T=s(g);const _=s(r.negatives);return`A ${o} scene from ${t} — ${u}, ${h}. ${c}, ${f}, inspired by ${y} and ${T} --neg ${_}`},_buildMotion(t,e,i){const n=this.genData,s=Math.random.bind(Math),r=n.cameraBehaviors,l=[];let o=null;for(let S=0;S1&&x<10);l.push(w),o=w}const d=[],u=[],h=[],c=[],f=[];let g=null,y=null,T=null,_=null;for(let S=0;S1&&(v["Transform Center X"]=c.join(", ")),f.length>1&&(v["Transform Center Y"]=f.join(", ")),v},storyMotionDeforumKeyMap(){return{Zoom:"zoom","Translation X":"translation_x","Translation Y":"translation_y","Transform Center X":"transform_center_x","Transform Center Y":"transform_center_y","Rotation 3D X":"rotation_3d_x","Rotation 3D Y":"rotation_3d_y","Rotation 3D Z":"rotation_3d_z"}},sequencerParamForDeforumKey(t){if(!t)return null;const e=this.modulationTargets.find(i=>i.deforumKey===t||i.key===t);return e?e.key:t},parseMotionScheduleToKeyframes(t,e){const i=String(t||"").trim();if(!i)return[];const n=Math.max(1,Number(e)||24),s=[];for(const r of i.split(",")){const l=r.trim();if(!l)continue;const o=l.match(/^(\d+)\s*:\s*\(([^)]+)\)\s*$/);if(!o)continue;const d=Number(o[1]),u=o[2].trim();let h=Number(u);if(!Number.isFinite(h)){const c=u.match(/^-?\d+(?:\.\d+)?/);h=c?Number(c[0]):NaN}!Number.isFinite(d)||!Number.isFinite(h)||s.push({t:d/n,v:h})}return s.sort((r,l)=>r.t-l.t)},importStoryMotionToSequencer(t){var s;if(!t||typeof t!="object")return 0;const e=Math.max(1,Number(this.sequencer.fps)||24),i=this.storyMotionDeforumKeyMap();let n=0;for(const[r,l]of Object.entries(t)){const o=i[r];if(!o)continue;const d=this.sequencerParamForDeforumKey(o),u=this.parseMotionScheduleToKeyframes(l,e);if(!u.length)continue;let h=this.sequencer.tracks.find(c=>c.param===d);h||(h={id:`tr-story-${d}-${Date.now()}`,param:d,keyframes:[]},this.sequencer.tracks.push(h)),h.keyframes=u,n+=1}return n&&(this.sequencerSelectedTrackId=((s=this.sequencer.tracks[0])==null?void 0:s.id)||null,this.sequencerStatus=`Imported ${n} motion track(s) from story`,this.saveSessionState()),n},async applyStoryMotionToDeforumSettings(t){if(!t||typeof t!="object"||typeof fetch!="function")return;const e=this.storyMotionDeforumKeyMap(),i={};for(const[n,s]of Object.entries(t)){const r=e[n];r&&s&&(i[r]=String(s))}if(Object.keys(i).length)try{const n={...this.deforumSettings||{},...i},s=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:n})});if(!s.ok)throw new Error(`HTTP ${s.status}`);this.loadDeforumSettings({syncServerModel:!1})}catch(n){console.warn("[story] apply motion to deforum failed",n)}},buildLocalStoryResult(){const t=this.generatorRequestBody(),e=Math.max(1,Math.floor(t.totalFrames/t.numScenes)),i={};for(let r=0;r{this.generator.status=""},4e3)},rejectStory(){this.generator.result=null,this.generator.status="Discarded.",setTimeout(()=>{this.generator.status=""},2e3)},async refreshGeneratorPresets(){try{const e=await(await fetch("/api/presets")).json();this.generatorPresets=(e.presets||[]).filter(i=>i.startsWith("gen-"))}catch(t){console.error("Failed to load generator presets",t)}},async loadGeneratorPreset(t){try{const i=await(await fetch(`/api/presets/${t}`)).json();i.preset&&i.preset.generator&&(Object.assign(this.generator,i.preset.generator),this.generator.result=null,this.currentGeneratorPreset=t,this.generatorPresetStatus=`Loaded: ${t}`,setTimeout(()=>{this.generatorPresetStatus=""},3e3))}catch(e){this.generatorPresetStatus=`Error: ${e.message}`}},async saveGeneratorPreset(){const e=`gen-${(this.newGeneratorPresetName||"default").replace(/[^a-zA-Z0-9_-]/g,"-")}`,i={generator:{theme:this.generator.theme,stylePreset:this.generator.stylePreset,customStyle:this.generator.customStyle,fps:this.generator.fps,resolution:this.generator.resolution,totalFrames:this.generator.totalFrames,numScenes:this.generator.numScenes}};try{(await(await fetch(`/api/presets/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).json()).ok&&(this.currentGeneratorPreset=e,this.newGeneratorPresetName="",this.generatorPresetStatus=`Saved: ${e}`,await this.refreshGeneratorPresets(),setTimeout(()=>{this.generatorPresetStatus=""},3e3))}catch(n){this.generatorPresetStatus=`Error: ${n.message}`}},async deleteGeneratorPreset(t){if(confirm(`Delete preset "${t}"?`))try{await fetch(`/api/presets/${t}`,{method:"DELETE"}),this.currentGeneratorPreset=null,this.generatorPresetStatus=`Deleted: ${t}`,await this.refreshGeneratorPresets(),setTimeout(()=>{this.generatorPresetStatus=""},3e3)}catch(e){this.generatorPresetStatus=`Error: ${e.message}`}},sessionStorageKey(){return`defora_session_${this.session||"default"}`},sessionStorageTouchedKey(){return`${this.sessionStorageKey()}__touchedAt`},sessionRestoreDeclinedKey(){return`${this.sessionStorageKey()}__restoreDeclinedAt`},hasSessionRestoreDeclined({now:t=Date.now(),maxAgeMs:e=24*60*60*1e3}={}){try{if(typeof window>"u")return!1;const i=window.localStorage;if(!i)return!1;const n=i.getItem(this.sessionRestoreDeclinedKey()),s=n!=null?Number(n):NaN;return Number.isFinite(s)&&s>0&&t-s<=e}catch{return!1}},markSessionRestoreDeclined(){try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem(this.sessionRestoreDeclinedKey(),String(Date.now()))}catch{}},clearSessionRestoreDeclined(){try{typeof window<"u"&&window.localStorage&&window.localStorage.removeItem(this.sessionRestoreDeclinedKey())}catch{}},hasRecentSessionResumeToken({now:t=Date.now(),maxAgeMs:e=24*60*60*1e3}={}){try{if(typeof window>"u")return!1;const i=window.localStorage;if(!i)return!1;const n=i.getItem(this.sessionStorageTouchedKey()),s=n!=null?Number(n):NaN;if(!(Number.isFinite(s)&&s>0&&t-s<=e))return!1;try{const l=typeof document<"u"&&document.cookie?String(document.cookie):"";if(!l)return!0;const o=String(this.session||"default");return l.includes("defora_session=")||l.includes(`defora_session_${o}=`)||l.includes("defora=")}catch{return!0}}catch{return!1}},loadSessionState(){try{const t=window.localStorage&&window.localStorage.getItem(this.sessionStorageKey()),e=this.pendingSessionStateRaw||t;if(!e)return;const i=JSON.parse(e);if(this.pendingSessionStateRaw="",this.sessionDeforumSettingsLoaded=!1,typeof i.crossfader=="number"&&(this.performance.crossfader=i.crossfader),typeof i.genericPrompt=="string"&&(this.performance.genericPrompt=i.genericPrompt),Array.isArray(i.slots)&&(this.performance.slots=i.slots),typeof i.runsBrowserTab=="string"&&(i.runsBrowserTab==="active"||i.runsBrowserTab==="past"||i.runsBrowserTab==="frames")?this.runsBrowserTab=i.runsBrowserTab:i.showFrames===!0&&(this.runsBrowserTab="frames"),typeof i.showFrames=="boolean"&&(this.showFrames=i.showFrames),typeof i.rightPanelOpen=="boolean"?(this.rightPanelOpen=i.rightPanelOpen,this.liveDrawerOpen=i.rightPanelOpen):typeof i.liveDrawerOpen=="boolean"&&(this.rightPanelOpen=i.liveDrawerOpen,this.liveDrawerOpen=i.liveDrawerOpen),(i.sidePanelDock==="auto"||i.sidePanelDock==="edge"||i.sidePanelDock==="video")&&(this.sidePanelDock=i.sidePanelDock),typeof i.liveEngineDrawerOpen=="boolean"&&(this.liveEngineDrawerOpen=i.liveEngineDrawerOpen),typeof i.layersSidebarOpen=="boolean"&&(this.layersSidebarOpen=i.layersSidebarOpen),typeof i.liveBottomDrawerOpen=="boolean"&&(this.liveBottomDrawerOpen=i.liveBottomDrawerOpen),typeof i.liveBottomDrawerTab=="string"&&(i.liveBottomDrawerTab==="MODULATION"||i.liveBottomDrawerTab==="CROSSFADER"||i.liveBottomDrawerTab==="SYSTEM")&&(this.liveBottomDrawerTab=i.liveBottomDrawerTab),i.currentSubTab&&i.currentSubTab.LIVE&&(this.currentSubTab.LIVE=this.normalizeLiveSubTab(i.currentSubTab.LIVE)),i.currentSubTab&&i.currentSubTab.MOTION&&(this.currentSubTab.MOTION=this.normalizeMotionSubTab(i.currentSubTab.MOTION)),Array.isArray(i.liveSources)&&(this.liveSources=i.liveSources),(i.liveSourcePanel==="library"||i.liveSourcePanel==="cloud")&&(this.liveSourcePanel=i.liveSourcePanel),typeof i.activeVideoLayerId=="string"&&(this.activeVideoLayerId=i.activeVideoLayerId),typeof i.videoLayerAddOpen=="boolean"&&(this.videoLayerAddOpen=i.videoLayerAddOpen),typeof i.inputLayerPlaybackUrl=="string"&&(this.inputLayerPlaybackUrl=i.inputLayerPlaybackUrl),typeof i.inputLayerLabel=="string"&&(this.inputLayerLabel=i.inputLayerLabel),(i.videoStageSize==="small"||i.videoStageSize==="medium"||i.videoStageSize==="full")&&(this.videoStageSize=i.videoStageSize),typeof i.liveAnimationBoxOpen=="boolean"&&(this.liveAnimationBoxOpen=i.liveAnimationBoxOpen,this.enginePanelDetailsOpen=i.liveAnimationBoxOpen),typeof i.enginePanelDetailsOpen=="boolean"&&(this.enginePanelDetailsOpen=i.enginePanelDetailsOpen,this.liveAnimationBoxOpen=i.enginePanelDetailsOpen),(i.enginePanelDetailsTab==="ENGINE"||i.enginePanelDetailsTab==="JOB")&&(this.enginePanelDetailsTab=i.enginePanelDetailsTab),i.videoLayerPreviewVisible&&typeof i.videoLayerPreviewVisible=="object"){const n=i.videoLayerPreviewVisible;(this.videoLayers||[]).forEach(s=>{s&&Object.prototype.hasOwnProperty.call(n,s.id)&&(s.previewVisible=n[s.id]!==!1)})}if(i.videoLayerOpacity&&typeof i.videoLayerOpacity=="object"){const n=i.videoLayerOpacity;(this.videoLayers||[]).forEach(s=>{if(s&&Object.prototype.hasOwnProperty.call(n,s.id)){const r=Number(n[s.id]);Number.isFinite(r)&&(s.opacity=Math.max(0,Math.min(1,r)))}})}if(i.cloudDriveDraft&&typeof i.cloudDriveDraft=="object"&&(this.cloudDriveDraft={url:String(i.cloudDriveDraft.url||""),provider:String(i.cloudDriveDraft.provider||"google_drive")}),i.systemFiles&&typeof i.systemFiles=="object"){const n=i.systemFiles;this.systemFiles={...this.systemFiles,rootId:typeof n.rootId=="string"?n.rootId:this.systemFiles.rootId,recursive:typeof n.recursive=="boolean"?n.recursive:this.systemFiles.recursive,viewMode:n.viewMode==="videos-only"?"videos-only":"browse",showFilenames:typeof n.showFilenames=="boolean"?n.showFilenames:this.systemFiles.showFilenames,sortKey:typeof n.sortKey=="string"?n.sortKey:this.systemFiles.sortKey,zoomLevel:Number.isFinite(Number(n.zoomLevel))?n.zoomLevel:this.systemFiles.zoomLevel,roots:[],currentPath:"",parent:"",folders:[],videos:[],folderCount:null,videoCount:null,loading:!1,status:"",selectedPaths:Array.isArray(n.selectedPaths)?n.selectedPaths:[],fullscreenIndex:-1,_rootsLoaded:!1}}if(typeof i.hlsWatchEnabled=="boolean"&&(this.hlsWatchEnabled=i.hlsWatchEnabled,this.hlsWatchEnabled&&this.$nextTick(()=>this.attachPlayer())),typeof i.libraryFullscreen=="boolean"&&(this.libraryFullscreen=i.libraryFullscreen),typeof i.libraryWorkspaceOpen=="boolean"?(this.libraryWorkspaceOpen=i.libraryWorkspaceOpen,(i.libraryWorkspacePane==="editor"||i.libraryWorkspacePane==="browser")&&(this.libraryWorkspacePane=i.libraryWorkspacePane)):typeof i.libraryEditorOpen=="boolean"&&i.libraryEditorOpen&&(this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane="editor"),(i.librarySubTab==="RUNS"||i.librarySubTab==="BROWSER")&&(this.librarySubTab=i.librarySubTab==="RUNS"?"BROWSER":i.librarySubTab),typeof i.editorFreecutRoute=="string"&&(this.editorFreecutRoute=i.editorFreecutRoute),typeof i.editorPendingImportPath=="string"&&(this.editorPendingImportPath=i.editorPendingImportPath),typeof i.editorPendingImportRootId=="string"&&(this.editorPendingImportRootId=i.editorPendingImportRootId),typeof i.editorPendingImportUrl=="string"&&(this.editorPendingImportUrl=i.editorPendingImportUrl),typeof i.runsAutoRefresh=="boolean"&&(this.runsAutoRefresh=i.runsAutoRefresh),Number.isFinite(Number(i.runsPollIntervalSec))&&(this.runsPollIntervalSec=Math.max(2,Math.min(60,Number(i.runsPollIntervalSec)))),typeof i.paramPanelOpen=="boolean"&&(this.paramPanelOpen=i.paramPanelOpen),typeof i.deforumPanelOpen=="boolean"&&(this.deforumPanelOpen=i.deforumPanelOpen),typeof i.deforumActiveTab=="string"&&(this.deforumActiveTab=i.deforumActiveTab),typeof i.generateDockExpanded=="boolean"&&(this.generateDockExpanded=i.generateDockExpanded),typeof i.motionSequencerSideOpen=="boolean"&&(this.motionSequencerSideOpen=i.motionSequencerSideOpen),i.deforumFieldEnabled&&typeof i.deforumFieldEnabled=="object"?this.deforumFieldEnabled=Qs(i.deforumFieldEnabled):this.deforumFieldEnabled=Qs(),typeof i.collabEnabled=="boolean"&&(this.collabEnabled=i.collabEnabled,this.wsStatus=i.collabEnabled?this.wsStatus:"offline"),i.defaultAnimation&&typeof i.defaultAnimation=="object"&&(this.defaultAnimation=this.normalizeDefaultAnimationSettings(i.defaultAnimation)),i.deforumSettings&&typeof i.deforumSettings=="object"&&(this.deforumSettings=sa({...ia},i.deforumSettings),this.deforumSettings=this.normalizedDeforumSettings(),this.syncResolutionAcrossControls(this.deforumSettings.W,this.deforumSettings.H,{syncGpuModal:!1}),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.syncDeforumSettingsJson(),this.sessionDeforumSettingsLoaded=!0),i.lastModel&&(this.forge.lastModel=i.lastModel,this.forge.selectedModel=i.lastModel),i.streaming&&typeof i.streaming=="object"&&(Array.isArray(i.streaming.destinations)&&i.streaming.destinations.length&&(this.streaming.destinations=i.streaming.destinations.map((n,s)=>this.normalizeStreamDestination(n,s))),(typeof i.streaming.activeDestinationId=="string"||i.streaming.activeDestinationId===null)&&(this.streaming.activeDestinationId=i.streaming.activeDestinationId),typeof i.streaming.status=="string"&&(this.streaming.status=i.streaming.status)),i.prompts&&Object.assign(this.prompts,i.prompts),(typeof i.activePromptStyleId=="string"||i.activePromptStyleId===null)&&(this.activePromptStyleId=i.activePromptStyleId),typeof i.promptStyleAutoExample=="boolean"&&(this.promptStyleAutoExample=i.promptStyleAutoExample),i.lcmEngine&&typeof i.lcmEngine=="object"&&(this.lcmEngine={enabled:!!i.lcmEngine.enabled,steps:Math.max(1,Math.round(Number(i.lcmEngine.steps)||er.steps)),loraTag:String(i.lcmEngine.loraTag||pn).trim()||pn},this.lcmEngine.enabled&&this.applyLcmEngineToDeforum({saveSession:!1})),i.wanEngine&&typeof i.wanEngine=="object"&&(this.wanEngine=un(i.wanEngine)),i.animateLcmEngine&&typeof i.animateLcmEngine=="object"&&(this.animateLcmEngine=td(i.animateLcmEngine)),i.motionSmoothness&&typeof i.motionSmoothness=="object"){this.motionSmoothness.enabled=!!i.motionSmoothness.enabled;const n=Math.round(Number(i.motionSmoothness.frames));this.motionSmoothness.frames=Number.isFinite(n)?Math.max(1,Math.min(999,n)):1}typeof i.motionPadSpringBack=="boolean"&&(this.motionPadSpringBack=i.motionPadSpringBack),Number.isFinite(Number(i.seedFixedBackup))&&Number(i.seedFixedBackup)>=0&&(this.seedFixedBackup=Number(i.seedFixedBackup))}catch{}},saveSessionState(){try{if(!window.localStorage)return;const t={crossfader:this.performance.crossfader,genericPrompt:this.performance.genericPrompt,slots:this.performance.slots,showFrames:this.showFrames,runsBrowserTab:this.runsBrowserTab,rightPanelOpen:this.rightPanelOpen,sidePanelDock:this.sidePanelDock,liveEngineDrawerOpen:this.liveEngineDrawerOpen,layersSidebarOpen:this.layersSidebarOpen,liveBottomDrawerOpen:this.liveBottomDrawerOpen,liveBottomDrawerTab:this.liveBottomDrawerTab,currentSubTab:{...this.currentSubTab},liveSources:this.liveSources,liveSourcePanel:this.liveSourcePanel,activeVideoLayerId:this.activeVideoLayerId,videoLayerAddOpen:this.videoLayerAddOpen,inputLayerPlaybackUrl:this.inputLayerPlaybackUrl,inputLayerLabel:this.inputLayerLabel,videoStageSize:this.videoStageSize,liveAnimationBoxOpen:this.liveAnimationBoxOpen,enginePanelDetailsOpen:this.enginePanelDetailsOpen,enginePanelDetailsTab:this.enginePanelDetailsTab,videoLayerPreviewVisible:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,e.previewVisible!==!1])),videoLayerOpacity:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,this.readVideoLayerOpacity(e)])),cloudDriveDraft:{...this.cloudDriveDraft},systemFiles:{rootId:this.systemFiles.rootId,recursive:this.systemFiles.recursive,viewMode:this.systemFiles.viewMode,showFilenames:this.systemFiles.showFilenames,sortKey:this.systemFiles.sortKey,zoomLevel:this.systemFiles.zoomLevel},libraryFullscreen:this.libraryFullscreen,libraryWorkspaceOpen:this.libraryWorkspaceOpen,libraryWorkspacePane:this.libraryWorkspacePane,libraryEditorOpen:this.libraryEditorOpen,librarySubTab:this.librarySubTab,editorFreecutRoute:this.editorFreecutRoute,editorPendingImportPath:this.editorPendingImportPath,editorPendingImportRootId:this.editorPendingImportRootId,editorPendingImportUrl:this.editorPendingImportUrl,runsAutoRefresh:this.runsAutoRefresh,runsPollIntervalSec:this.runsPollIntervalSec,paramPanelOpen:this.paramPanelOpen,deforumPanelOpen:this.deforumPanelOpen,deforumActiveTab:this.deforumActiveTab,deforumFieldEnabled:Qs(this.deforumFieldEnabled),generateDockExpanded:this.generateDockExpanded,motionSequencerSideOpen:this.motionSequencerSideOpen,collabEnabled:this.collabEnabled,hlsWatchEnabled:!!this.hlsWatchEnabled,streaming:{destinations:this.streaming.destinations,activeDestinationId:this.streaming.activeDestinationId,status:this.streaming.status},defaultAnimation:this.normalizeDefaultAnimationSettings(this.defaultAnimation),deforumSettings:this.normalizedDeforumSettings(),lastModel:this.forge.lastModel||this.forge.currentModel||this.forge.selectedModel,prompts:{pos:this.prompts.pos,neg:this.prompts.neg},activePromptStyleId:this.activePromptStyleId,promptStyleAutoExample:this.promptStyleAutoExample,lcmEngine:{enabled:!!(this.lcmEngine&&this.lcmEngine.enabled),steps:Math.max(1,Math.round(Number(this.lcmEngine&&this.lcmEngine.steps)||1)),loraTag:String(this.lcmEngine&&this.lcmEngine.loraTag||pn).trim()||pn},wanEngine:un(this.wanEngine),animateLcmEngine:td(this.animateLcmEngine),motionSmoothness:{enabled:!!(this.motionSmoothness&&this.motionSmoothness.enabled),frames:Math.max(1,Math.round(Number(this.motionSmoothness&&this.motionSmoothness.frames)||1))},motionPadSpringBack:!!this.motionPadSpringBack,seedFixedBackup:Number.isFinite(Number(this.seedFixedBackup))&&this.seedFixedBackup>=0?this.seedFixedBackup:null};window.localStorage.setItem(this.sessionStorageKey(),JSON.stringify(t)),window.localStorage.setItem(this.sessionStorageTouchedKey(),String(Date.now()))}catch{}},getCurrentSessionSnapshotRaw(){try{if(typeof window>"u"||!window.localStorage)return"";const t={crossfader:this.performance.crossfader,genericPrompt:this.performance.genericPrompt,slots:this.performance.slots,showFrames:this.showFrames,runsBrowserTab:this.runsBrowserTab,rightPanelOpen:this.rightPanelOpen,sidePanelDock:this.sidePanelDock,liveEngineDrawerOpen:this.liveEngineDrawerOpen,currentSubTab:{...this.currentSubTab},liveSources:this.liveSources,liveSourcePanel:this.liveSourcePanel,activeVideoLayerId:this.activeVideoLayerId,videoLayerAddOpen:this.videoLayerAddOpen,inputLayerPlaybackUrl:this.inputLayerPlaybackUrl,inputLayerLabel:this.inputLayerLabel,videoStageSize:this.videoStageSize,liveAnimationBoxOpen:this.liveAnimationBoxOpen,enginePanelDetailsOpen:this.enginePanelDetailsOpen,enginePanelDetailsTab:this.enginePanelDetailsTab,videoLayerPreviewVisible:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,e.previewVisible!==!1])),videoLayerOpacity:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,this.readVideoLayerOpacity(e)])),cloudDriveDraft:{...this.cloudDriveDraft},systemFiles:{rootId:this.systemFiles.rootId,recursive:this.systemFiles.recursive,viewMode:this.systemFiles.viewMode,showFilenames:this.systemFiles.showFilenames,sortKey:this.systemFiles.sortKey,zoomLevel:this.systemFiles.zoomLevel},libraryFullscreen:this.libraryFullscreen,libraryWorkspaceOpen:this.libraryWorkspaceOpen,libraryWorkspacePane:this.libraryWorkspacePane,libraryEditorOpen:this.libraryEditorOpen,librarySubTab:this.librarySubTab,editorFreecutRoute:this.editorFreecutRoute,editorPendingImportPath:this.editorPendingImportPath,editorPendingImportRootId:this.editorPendingImportRootId,editorPendingImportUrl:this.editorPendingImportUrl,paramPanelOpen:this.paramPanelOpen,deforumPanelOpen:this.deforumPanelOpen,deforumActiveTab:this.deforumActiveTab,deforumFieldEnabled:Qs(this.deforumFieldEnabled),generateDockExpanded:this.generateDockExpanded,motionSequencerSideOpen:this.motionSequencerSideOpen,collabEnabled:this.collabEnabled,hlsWatchEnabled:!!this.hlsWatchEnabled,streaming:{destinations:this.streaming.destinations,activeDestinationId:this.streaming.activeDestinationId,status:this.streaming.status},defaultAnimation:this.normalizeDefaultAnimationSettings(this.defaultAnimation),deforumSettings:this.normalizedDeforumSettings(),lastModel:this.forge.lastModel||this.forge.currentModel||this.forge.selectedModel,prompts:{pos:this.prompts.pos,neg:this.prompts.neg},activePromptStyleId:this.activePromptStyleId,promptStyleAutoExample:this.promptStyleAutoExample,lcmEngine:{enabled:!!(this.lcmEngine&&this.lcmEngine.enabled),steps:Math.max(1,Math.round(Number(this.lcmEngine&&this.lcmEngine.steps)||1)),loraTag:String(this.lcmEngine&&this.lcmEngine.loraTag||pn).trim()||pn},wanEngine:un(this.wanEngine),animateLcmEngine:td(this.animateLcmEngine),motionSmoothness:{enabled:!!(this.motionSmoothness&&this.motionSmoothness.enabled),frames:Math.max(1,Math.round(Number(this.motionSmoothness&&this.motionSmoothness.frames)||1))}};return JSON.stringify(t)}catch{return""}},checkAndPromptSessionRestore(){try{if(typeof window>"u")return!1;const t=window.localStorage;if(!t)return!1;const e=t.getItem(this.sessionStorageKey());if(!e)return!1;if(!this.hasRecentSessionResumeToken()){try{t.removeItem(this.sessionStorageKey()),t.removeItem(this.sessionStorageTouchedKey()),t.removeItem(this.sessionRestoreDeclinedKey())}catch{}return!0}if(this.hasSessionRestoreDeclined())return!1;const i=this.getCurrentSessionSnapshotRaw();return i&&e!==i?(this.pendingSessionStateRaw=e,this.restoreSessionPromptOpen=!0,!0):!1}catch{return!1}},onRestoreSessionBackdropClick(t){t&&t.target===t.currentTarget&&this.dismissSessionRestore(!1)},dismissSessionRestore(t){try{this.restoreSessionPromptOpen=!1,t?(this.clearSessionRestoreDeclined(),this.loadSessionState()):(this.markSessionRestoreDeclined(),this.saveSessionState())}catch{this.restoreSessionPromptOpen=!1}},normalizedDeforumSettings(){const t=sa({...ia},this.deforumSettings||{});return String(t.init_image||"").trim()||(t.use_init=!1),t},currentResolution({fallbackWidth:t=1024,fallbackHeight:e=576}={}){const i=Number(this.deforumSettings&&this.deforumSettings.W)||Number(this.forge&&this.forge.options&&this.forge.options.width)||Number(this.img2img&&this.img2img.width)||Number((this.generator&&this.generator.resolution?this.generator.resolution:"").split("x")[0])||t,n=Number(this.deforumSettings&&this.deforumSettings.H)||Number(this.forge&&this.forge.options&&this.forge.options.height)||Number(this.img2img&&this.img2img.height)||Number((this.generator&&this.generator.resolution?this.generator.resolution:"").split("x")[1])||e;return{width:i,height:n}},syncResolutionAcrossControls(t,e,{syncDeforum:i=!0,syncForge:n=!0,syncImg2img:s=!0,syncGenerator:r=!0,syncGpuModal:l=!0}={}){const o=this.currentResolution(),d=Math.max(64,Math.round(Number(t)||o.width||1024)),u=Math.max(64,Math.round(Number(e)||o.height||576));return i&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.W=d,this.deforumSettings.H=u),n&&(this.forge.options.width=d,this.forge.options.height=u),s&&(this.img2img.width=d,this.img2img.height=u),r&&(this.generator.resolution=`${d}x${u}`),l&&this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&(this.gpuPool.forgeModal.options.width=d,this.gpuPool.forgeModal.options.height=u),{width:d,height:u}},currentStepsValue(t=6){const e=Number(this.deforumSettings&&this.deforumSettings.steps);if(Number.isFinite(e)&&e>0)return Math.max(1,Math.round(e));const i=Math.round(this.readFirstNumericValue(this.deforumSettings&&this.deforumSettings.steps_schedule||"",Number(this.forge&&this.forge.options&&this.forge.options.steps)||Number(this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.steps)||t));return Math.max(1,i||t)},syncStepsAcrossControls(t,{syncDeforum:e=!0,syncForge:i=!0,syncGpuModal:n=!0,syncSchedule:s=!0}={}){const r=Math.max(1,Math.round(Number(t)||this.currentStepsValue()));return e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.steps=r,s&&(this.deforumSettings.steps_schedule=`0: (${r})`)),i&&(this.forge.options.steps=r),n&&this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&(this.gpuPool.forgeModal.options.steps=r),r},syncFpsAcrossControls(t,{syncDeforum:e=!0,syncSequencer:i=!0,syncGenerator:n=!0,syncStreaming:s=!0,syncFramesync:r=!0}={}){const l=Number(this.deforumSettings&&this.deforumSettings.fps)||Number(this.sequencer&&this.sequencer.fps)||Number(this.generator&&this.generator.fps)||Number(this.framesync&&this.framesync.fps)||24,o=Math.max(1,Math.min(120,Math.round(Number(t)||l)));return e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.fps=o),i&&this.sequencer&&(this.sequencer.fps=o),n&&this.generator&&(this.generator.fps=o),r&&this.framesync&&(this.framesync.fps=o),s&&this.streaming&&Array.isArray(this.streaming.destinations)&&(this.streaming.destinations=this.streaming.destinations.map(d=>({...d||{},fps:o}))),o},setGlobalFps(t,{source:e="ui"}={}){if(!this._syncingGlobalFps){this._syncingGlobalFps=!0;try{const i=this.syncFpsAcrossControls(t);return this.onDeforumFieldInput("fps",i,"number"),e!=="deforum"&&this.saveSessionState(),i}finally{this._syncingGlobalFps=!1}}},normalizeModelName(t){const e=typeof t=="string"?t.trim():"";return!e||e.toLowerCase()==="unknown"?"":e},detectModelFamilyFromText(t){const e=String(t||"").toLowerCase();return e?/\bz[-_. ]?image\b|zimage/.test(e)?"zimage":/\bflux\b|flux\.1/.test(e)?"flux":/(?:^|[^a-z0-9])svd(?:[^a-z0-9]|$)|stable video diffusion|\bvideo\b/.test(e)?"svd":/(?:^|[^a-z0-9])sdxl(?:[^a-z0-9]|$)|stable diffusion xl|\bpony\b|illustrious|\bxl\b/.test(e)?"sdxl":/\bsd(?:\s|[-_.])?1(?:\s|[-_.])?5\b|(?:^|[^a-z0-9])sd15(?:[^a-z0-9]|$)|stable diffusion 1\.5|\bv1[-_. ]?5\b|\b1\.5\b/.test(e)?"sd15":"":""},detectModelFamilyFromValue(t,e=""){const i=[];t&&typeof t=="object"&&i.push(t.base_model,t.architecture,t.model_type,t.type,t.pipeline,t.variant,t.name),i.push(e);for(const n of i){const s=this.detectModelFamilyFromText(n);if(s)return s}return""},detectLoraFamily(t){return this.detectModelFamilyFromValue(t&&t.metadata,`${t&&t.name?t.name:""} ${t&&t.path?t.path:""}`)||"sd15"},findForgeModelEntry(t){const e=this.normalizeModelName(t);return e&&(this.forge.models||[]).find(i=>[i&&i.model_name,i&&i.title].map(s=>this.normalizeModelName(s)).filter(Boolean).includes(e))||null},readFirstNumericValue(t,e=0){const i=String(t??"").match(/-?\d+(?:\.\d+)?/);if(!i)return e;const n=Number(i[0]);return Number.isFinite(n)?n:e},optimizedDefaultsForModel(t){const e=typeof t=="string"?this.findForgeModelEntry(t):t,i=this.normalizeModelName(e&&(e.model_name||e.title||e.name)||(typeof t=="string"?t:t&&(t.model_name||t.title||t.name))||this.engineCurrentModelName),n=e&&e.metadata||t&&t.metadata||this.forge.modelInfo||null;if(!n&&!i)return null;const s=this.detectModelFamilyFromValue(n,i),r=[n&&n.variant,n&&n.type,n&&n.pipeline,n&&n.architecture,n&&n.base_model,n&&n.name,i].filter(Boolean).join(" ").toLowerCase(),l={sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[s]||"Generic",o=/(turbo|lightning|lcm|hyper|distill|schnell)/.test(r),d=s==="flux"&&/\bdev\b/.test(r),u=Number(n&&n.base_resolution)||(s==="sd15"?512:1024),h=this.deforumSettings&&this.deforumSettings.sampler?this.deforumSettings.sampler:this.forge.options&&this.forge.options.sampler_name||"Euler a",c=this.deforumSettings&&this.deforumSettings.scheduler?this.deforumSettings.scheduler:this.forge.options&&this.forge.options.scheduler||"Normal";let f=l,g=Number(n&&n.recommended_steps),y=Number(n&&n.recommended_cfg_scale),T=Number(n&&n.recommended_strength),_=n&&n.recommended_sampler||h;const v=n&&n.recommended_scheduler||c;return Number.isFinite(g)||(o?g=4:s==="flux"?g=d?20:8:s==="svd"?g=25:s==="sdxl"?g=30:g=24),Number.isFinite(y)||(o?y=s==="flux"?1:1.5:s==="flux"?y=d?3.5:1:s==="svd"?y=2.5:s==="sdxl"?y=6.5:s==="sd15"?y=7:y=6),Number.isFinite(T)||(o?T=.4:s==="flux"?T=.5:s==="sdxl"?T=.55:T=.65),o?f=`${l} fast`:s==="flux"&&d?f="FLUX dev":s==="flux"&&(f="FLUX schnell"),{width:u>=1024?1024:512,height:u>=1024?1024:512,steps:g,sampler:_,scheduler:v,cfgScale:y,strength:T,profileLabel:f}},applyModelOptimizedDefaults(t){const e=this.optimizedDefaultsForModel(t);if(!e)return!1;this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.W=e.width,this.deforumSettings.H=e.height,this.deforumSettings.sampler=e.sampler,this.deforumSettings.scheduler=e.scheduler,this.deforumSettings.cfg_scale_schedule=`0:(${e.cfgScale})`,this.deforumSettings.distilled_cfg_scale_schedule=`0: (${e.cfgScale})`,this.deforumSettings.strength_schedule=`0: (${e.strength})`,this.deforumSettings.keyframe_strength_schedule=`0: (${e.strength})`,this.forge.options.width=e.width,this.forge.options.height=e.height,this.forge.options.sampler_name=e.sampler,this.forge.options.scheduler=e.scheduler,this.forge.options.cfg_scale=e.cfgScale,this.syncStepsAcrossControls(e.steps,{syncGpuModal:!0});const i=this.liveVibe.find(s=>s.key==="cfgscale")||this.liveVibe.find(s=>s.key==="cfg");i&&(i.val=e.cfgScale);const n=this.liveVibe.find(s=>s.key==="strength");return n&&(n.val=e.strength),this.syncDeforumSettingsJson(),this.deforumSettingsStatus=`${this.normalizeModelName(this.forge.selectedModel||this.forge.currentModel)} optimized for ${e.profileLabel}`,!0},applyLoadedModelSelection(t,{syncDeforumSettings:e=!0,queueDeforumSave:i=!1,saveSession:n=!0}={}){const s=this.normalizeModelName(t);if(!s)return"";this.forge.currentModel=s,this.forge.selectedModel=s,this.forge.lastModel=s;const r=this.findForgeModelEntry(s);return r&&r.metadata&&(this.forge.modelInfo=r.metadata),e&&this.deforumSettings&&this.deforumSettings.sd_model_name!==s&&(this.deforumSettings.sd_model_name=s,this.syncDeforumSettingsJson(),i&&this.queueDeforumSettingsSave()),n&&this.saveSessionState(),s},syncSelectedModelFromDeforumSettings(){const t=this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name);return t&&(this.forge.selectedModel=t),t},restoreLastModel(){const t=this.syncSelectedModelFromDeforumSettings()||this.normalizeModelName(this.forge.lastModel)||this.normalizeModelName(this.forge.selectedModel);return!t||this.forge.switching?!1:this.normalizeModelName(this.forge.currentModel)===t?(this.applyLoadedModelSelection(t,{queueDeforumSave:!1}),!0):(this.forge.selectedModel=t,this.switchForgeModel(t,{persistDeforumSettings:!1}))},async onModelSelectChange(){await this.switchForgeModel(this.forge.selectedModel,{persistDeforumSettings:!0,applyOptimizedDefaults:!0}),this.saveSessionState()},openEngineModelPicker(){const t=this.engineCurrentModelFamily,e=["sd15","sdxl","flux","zimage","other"];this.engineModelPickerTab=e.includes(t)?t:"other",this.engineModelPickerOpen=!0,!this.forge.models.length&&!this.forge.loading&&this.refreshForgeModels()},closeEngineModelPicker(){this.engineModelPickerOpen=!1},onEngineModelPickerBackdropClick(t){(t==null?void 0:t.target)===(t==null?void 0:t.currentTarget)&&this.closeEngineModelPicker()},setEngineModelPickerTab(t){["sd15","sdxl","flux","zimage","other"].includes(t)&&(this.engineModelPickerTab=t)},async selectEngineModel(t){const e=this.normalizeModelName(t&&(t.model_name||t.title));e&&(await this.onDeforumModelCommit(e),this.closeEngineModelPicker())},async onDeforumModelCommit(t){const e=this.normalizeModelName(t??(this.deforumSettings&&this.deforumSettings.sd_model_name));if(!e)return;this.deforumSettings&&this.deforumSettings.sd_model_name!==e&&(this.deforumSettings.sd_model_name=e,this.syncDeforumSettingsJson()),this.forge.selectedModel=e,!await this.switchForgeModel(e,{persistDeforumSettings:!0,applyOptimizedDefaults:!0})&&this.forge.currentModel&&this.applyLoadedModelSelection(this.forge.currentModel,{queueDeforumSave:!0})},onEngineSamplerChange(t){const e=String(t||"").trim();e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.sampler=e,this.forge.options.sampler_name=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("sampler",e),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onEngineSchedulerChange(t){const e=String(t||"").trim();e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.scheduler=e,this.forge.options.scheduler=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("scheduler",e),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onEngineStepsChange(t){if(this.lcmEngineEnabled){this.onLcmEngineStepsChange(t);return}const e=this.syncStepsAcrossControls(t,{syncGpuModal:!0});this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("steps",e),this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},setLcmEngineEnabled(t){const e=!!t;this.lcmEngine||(this.lcmEngine={...er}),this.lcmEngine.enabled!==e&&(this.lcmEngine.enabled=e,e?((!Number.isFinite(Number(this.lcmEngine.steps))||Number(this.lcmEngine.steps)<1)&&(this.lcmEngine.steps=er.steps),String(this.lcmEngine.loraTag||"").trim()||(this.lcmEngine.loraTag=pn),this.applyLcmEngineToDeforum()):(this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()))},onLcmEngineStepsChange(t){const e=Math.max(1,Math.round(Number(t)||Number(this.lcmEngine.steps)||1));this.lcmEngine||(this.lcmEngine={...er}),this.lcmEngine.steps=e,this.applyLcmEngineToDeforum()},onLcmEngineLoraChange(t){const e=String(t??"").trim()||pn;this.lcmEngine||(this.lcmEngine={...er}),this.lcmEngine.loraTag=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()},applyLcmEngineToDeforum({saveSession:t=!0}={}){if(!this.lcmEngine||!this.lcmEngine.enabled)return;const e=Math.max(1,Math.round(Number(this.lcmEngine.steps)||1));this.lcmEngine.steps=e,this.syncStepsAcrossControls(e,{syncGpuModal:!0}),this.syncDeforumSettingsJson(),t&&this.saveSessionState(),this.pushDeforumLivePatch("steps",e),this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},async ensureDefaultForgeModelPreloaded(){if(typeof fetch=="function")try{const t=this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name||T1);if(!t)return;await fetch("/api/gpu-pool/default-forge-model",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,preload:!0,singleNode:!0})}),await this.refreshGpuPool(!0)}catch(t){console.warn("[engine] default model preload failed",t.message||t)}},onEngineCfgScaleChange(t){const e=Number(t);if(!Number.isFinite(e)||e<0)return;this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.cfg_scale_schedule=`0:(${e})`,this.deforumSettings.distilled_cfg_scale_schedule=`0: (${e})`,this.forge.options.cfg_scale=e;const i=this.liveVibe.find(n=>n.key==="cfgscale")||this.liveVibe.find(n=>n.key==="cfg");i&&(i.val=e),this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("cfg_scale_schedule",this.deforumSettings.cfg_scale_schedule),this.pushDeforumLivePatch("distilled_cfg_scale_schedule",this.deforumSettings.distilled_cfg_scale_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},reapplyEngineModelDefaults(){const t=this.engineCurrentModelName;if(!t)return!1;const e=this.applyModelOptimizedDefaults(t);return e&&(this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()),e},slotTypeLabel(t){const e=this.crossfadeSlotTypes.find(i=>i.id===t);return e?e.label:t},newSlotId(){return`slot_${Date.now()}_${Math.random().toString(36).slice(2,7)}`},addCrossfadeSlot(){const t=this.performance.newSlotType||"prompt",e={id:this.newSlotId(),type:t,valueA:t==="param"?0:t==="prompt"?"":null,valueB:t==="param"?0:t==="prompt"?"":null,paramKey:"cfg",loraStrengthA:1,loraStrengthB:1,cnSlotId:this.cn.active||"CN1"};this.performance.slots.push(e),this.applyCrossfadeMorph(),this.saveSessionState()},removeCrossfadeSlot(t){this.performance.slots=this.performance.slots.filter(e=>e.id!==t),this.applyCrossfadeMorph(),this.saveSessionState()},slotMorphedPreview(t){return Zs(this.normalizeSlotForMorph(t),this.performance.crossfader)},promptStyleById(t){return t&&(this.promptStyles||[]).find(e=>e.id===t)||null},promptStyleLabel(t){const e=this.promptStyleById(t);return e?e.name:""},formatMorphedPreview(t){const e=this.slotMorphedPreview(t);if(e==null)return"—";if(t.type==="style"&&e&&typeof e=="object"){const n=[];return e.positive&&n.push(`+${String(e.positive).slice(0,36)}${String(e.positive).length>36?"…":""}`),e.negative&&n.push(`−${String(e.negative).slice(0,28)}${String(e.negative).length>28?"…":""}`),n.length?n.join(" "):"—"}if(typeof e=="object")return JSON.stringify(e);if(typeof e=="number")return Number(e).toFixed(3);const i=String(e);return i.length>48?i.slice(0,48)+"…":i},normalizeSlotForMorph(t){if(t.type==="lora"){const e=(i,n)=>i?{name:i,strength:Number(n)||1}:null;return{...t,valueA:e(t.valueA,t.loraStrengthA),valueB:e(t.valueB,t.loraStrengthB)}}if(t.type==="controlnet"){const e=i=>({slotId:t.cnSlotId,weight:Number(i),start:0,end:.9,enabled:!0});return{...t,valueA:t.valueA!=null&&t.valueA!==""?e(t.valueA):null,valueB:t.valueB!=null&&t.valueB!==""?e(t.valueB):null}}return t.type==="style"?{...t,valueA:this.promptStyleById(t.valueA),valueB:this.promptStyleById(t.valueB)}:t.type==="param"?{...t,valueA:t.valueA,valueB:t.valueB}:t},buildMorphedPrompt(){const t=[],e=(this.performance.genericPrompt||"").trim();e&&t.push(e);for(const n of this.performance.slots){if(n.type!=="prompt")continue;const s=Zs(this.normalizeSlotForMorph(n),this.performance.crossfader);s&&t.push(String(s))}const i=t.join(", ").trim();return i||(this.prompts.pos||"").trim()},buildMorphedStyleAppend(){const t=[],e=[];for(const i of this.performance.slots){if(i.type!=="style")continue;const n=Zs(this.normalizeSlotForMorph(i),this.performance.crossfader);!n||typeof n!="object"||(n.positive&&t.push(String(n.positive).trim()),n.negative&&e.push(String(n.negative).trim()))}return{positive:t.filter(Boolean).join(", "),negative:e.filter(Boolean).join(", ")}},applyCrossfadeMorph(){const t=this.performance.crossfader,e={},i=[],n=[];for(const d of this.performance.slots){const u=this.normalizeSlotForMorph(d),h=Zs(u,t);if(h!=null&&!(d.type==="prompt"||d.type==="style")){if(d.type==="param"&&d.paramKey){const c=this.animationTargets.find(f=>f.key===d.paramKey);if(c)this.applyAnimationModulation(c.field,h);else{e[d.paramKey]=h;const f=this.liveVibe.find(g=>g.key===d.paramKey)||this.liveCam.find(g=>g.key===d.paramKey);f&&(f.val=h)}}else if(d.type==="lora"&&h&&h.name){const c={name:h.name,path:h.name,strength:h.strength??1};jr(t)<.5?i.push(c):n.push(c)}else if(d.type==="controlnet"&&h){const c=this.cn.slots.find(f=>f.id===h.slotId);c&&(c.weight=h.weight,c.start=h.start,c.end=h.end,c.enabled=h.enabled,this.updateControlNet(c))}}}const s=this.buildMorphedPrompt(),r=(this.prompts.neg||"").trim();this.prompts.pos=s;const l=this.effectivePositivePrompt(s),o=this.effectiveNegativePrompt(r);this.sendControl("prompt",{positive:l,negative:o}),Object.keys(e).length&&this.sendControl("liveParam",e),(this.loras.common.length||i.length||n.length)&&this.sendControl("loras",{common:this.loras.common.map(d=>({name:d.name,path:d.path,strength:d.strength})),groupA:i,groupB:n,crossfaderValue:t}),this.prompts.crossfaderValue=t},onCrossfaderSlider(t){const e=this.clampVal(Number(t)||0,0,1);this.performance.crossfader=e,this.prompts.crossfaderValue=e,this.prompts.morphOn&&(this.prompts.morphBlend=e,this.prompts.morphBlendLfoLink||(this.prompts.morphBlendLfoBase=e),this.applyPromptMorphing()),this.onCrossfaderInput()},onCrossfaderInput(){this.applyCrossfadeMorph(),this.saveSessionState(),this.deforumPlaying||this.schedulePreviewFrame()},onPerformanceInput(){this.applyCrossfadeMorph(),this.saveSessionState(),this.queuePromptHistorySave(this.performance.genericPrompt),this.deforumPlaying||this.schedulePreviewFrame()},async loadPromptStyles({quiet:t=!1}={}){this.promptStylesLoading=!0,t||(this.promptStylesStatus="Loading styles…");try{const e=await fetch("/api/prompt-styles"),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);if(this.promptStyles=Array.isArray(i.styles)?i.styles:[],t||(this.promptStylesStatus=`${this.promptStyles.length} styles loaded`),this.promptStyleEditorId){const n=this.promptStyles.find(s=>s.id===this.promptStyleEditorId);n&&(this.promptStyleDraft={...n})}}catch(e){t||(this.promptStylesStatus=`Load failed: ${e.message||e}`)}finally{this.promptStylesLoading=!1}},async importPromptStylesFromForge(){this.promptStylesImporting=!0,this.promptStylesStatus="Importing from Forge…";try{const t=this.forge&&this.forge.baseUrl||"",e=await fetch("/api/prompt-styles/import-forge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({forgeUrl:t||void 0})}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);this.promptStyles=Array.isArray(i.styles)?i.styles:[],this.promptStylesStatus=`Imported ${i.added||0} new, updated ${i.updated||0} (${i.total||this.promptStyles.length} total)`}catch(t){this.promptStylesStatus=`Import failed: ${t.message||t}`}finally{this.promptStylesImporting=!1}},selectActivePromptStyle(t){const e=t?String(t):null;this.activePromptStyleId=e,this.saveSessionState(),this.deforumPlaying||this.schedulePreviewFrame()},openPromptStyleEditor(t){const e=(this.promptStyles||[]).find(i=>i.id===t);e&&(this.promptStyleEditorId=t,this.promptStyleDraft={...e})},startNewPromptStyle(){const t=`custom_${Date.now()}`;this.promptStyleEditorId=t,this.promptStyleDraft={id:t,name:"New style",positive:"",negative:"",source:"custom",exampleImage:null}},async savePromptStyleDraft(){const t=this.promptStyleDraft;if(!t||!String(t.name||"").trim()){this.promptStylesStatus="Style name is required";return}const e=(this.promptStyles||[]).some(n=>n.id===t.id),i={id:t.id,name:t.name,positive:t.positive,negative:t.negative};try{const n=await fetch(e?`/api/prompt-styles/${encodeURIComponent(t.id)}`:"/api/prompt-styles",{method:e?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),s=await n.json();if(!n.ok)throw new Error(s.error||n.statusText);await this.loadPromptStyles({quiet:!0}),s.style&&(this.promptStyleEditorId=s.style.id,this.promptStyleDraft={...s.style}),this.promptStylesStatus=e?"Style saved":"Style created"}catch(n){this.promptStylesStatus=`Save failed: ${n.message||n}`}},async deletePromptStyle(t){if(t)try{const e=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}`,{method:"DELETE"}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);this.activePromptStyleId===t&&(this.activePromptStyleId=null),this.promptStyleEditorId===t&&(this.promptStyleEditorId=null,this.promptStyleDraft=null),await this.loadPromptStyles({quiet:!0}),this.promptStylesStatus="Style deleted"}catch(e){this.promptStylesStatus=`Delete failed: ${e.message||e}`}},async setPromptStyleExampleFromPreview(t){const e=this.performance.lastPreviewPath||this.generator.lastPath;if(!e){this.promptStylesStatus="No preview image yet";return}await this.setPromptStyleExampleFromPath(t,e)},async setPromptStyleExampleFromPath(t,e){try{const i=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}/example`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e})}),n=await i.json();if(!i.ok)throw new Error(n.error||i.statusText);await this.loadPromptStyles({quiet:!0}),n.style&&this.promptStyleDraft&&this.promptStyleDraft.id===t&&(this.promptStyleDraft={...n.style}),this.promptStylesStatus="Example image saved"}catch(i){this.promptStylesStatus=`Example save failed: ${i.message||i}`}},async onPromptStyleExampleFile(t,e){var s,r;const i=(r=(s=t==null?void 0:t.target)==null?void 0:s.files)==null?void 0:r[0];if(!i||!e)return;const n=new FileReader;n.onload=async()=>{try{const l=await fetch(`/api/prompt-styles/${encodeURIComponent(e)}/example`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n.result})}),o=await l.json();if(!l.ok)throw new Error(o.error||l.statusText);await this.loadPromptStyles({quiet:!0}),o.style&&this.promptStyleDraft&&this.promptStyleDraft.id===e&&(this.promptStyleDraft={...o.style}),this.promptStylesStatus="Example image uploaded"}catch(l){this.promptStylesStatus=`Upload failed: ${l.message||l}`}},n.readAsDataURL(i),t!=null&&t.target&&(t.target.value="")},async clearPromptStyleExample(t){try{const e=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}/example`,{method:"DELETE"}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);await this.loadPromptStyles({quiet:!0}),this.promptStyleDraft&&this.promptStyleDraft.id===t&&(this.promptStyleDraft={...i.style}),this.promptStylesStatus="Example cleared"}catch(e){this.promptStylesStatus=`Clear failed: ${e.message||e}`}},effectivePositivePrompt(t){const e=hf({positive:t,negative:""},this.activePromptStyle),i=this.buildMorphedStyleAppend(),n=dl(e.positive,i.positive);return this.lcmEngineEnabled?A1(n,this.lcmEngine.loraTag||pn):n},effectiveNegativePrompt(t){const e=hf({positive:"",negative:t},this.activePromptStyle),i=this.buildMorphedStyleAppend();return dl(e.negative,i.negative)},effectiveDeforumSettingsForRender(){var s,r;const t=JSON.parse(JSON.stringify(this.activeDeforumSettings())),e=this.isWanLayerActive||this.isAnimateLcmLayerActive?this.buildMorphedPrompt()||String(this.prompts.pos||"").trim():na(t,"prompts.0")||this.buildMorphedPrompt()||String(this.prompts.pos||"").trim(),i=t.negative_prompts||this.prompts.neg||"",n=this.effectivePositivePrompt(e);if(rf(t,"prompts.0",n),t.negative_prompts=this.effectiveNegativePrompt(i),this.lcmEngineEnabled&&!this.isWanLayerActive&&!this.isAnimateLcmLayerActive){const l=Math.max(1,Math.round(Number(this.lcmEngine.steps)||1));t.steps=l,t.steps_schedule=`0: (${l})`}return this.isWanLayerActive?U1(t,this.wanEngine,{positivePrompt:n}):this.isAnimateLcmLayerActive?$1(t,this.animateLcmEngine,{positivePrompt:n}):(t.animation_mode===sg&&(t.animation_mode=((s=this.deforumSettings)==null?void 0:s.animation_mode)||"2D"),t.animation_mode===ug&&(t.animation_mode=((r=this.deforumSettings)==null?void 0:r.animation_mode)||"2D"),t)},onAnimateLcmFieldChange(t,e,i="text"){if(!t)return;let n;if(i==="number"){const s=Number(e);if(!Number.isFinite(s))return;n=s}else n=String(e??"");this.animateLcmEngine={...this.animateLcmEngine,[t]:n},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},setAnimateLcmMotionType(t){this.animateLcmEngine={...this.animateLcmEngine,motion_type:t},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave()},toggleAnimateLcmMotionLora(t){const e=Array.isArray(this.animateLcmEngine.motion_loras)?this.animateLcmEngine.motion_loras:[],i=e.includes(t)?e.filter(n=>n!==t):[...e,t];this.animateLcmEngine={...this.animateLcmEngine,motion_loras:i},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},applyAnimateLcmMotionPreset(t){const i={Static:{motion_type:"static",alcm_motion_amount:.5,alcm_zoom:1,alcm_pan_x:0,alcm_pan_y:0,alcm_noise:.03},Orbit:{motion_type:"orbit",alcm_motion_amount:1.2,alcm_zoom:1.01,alcm_pan_x:.3,alcm_pan_y:0,alcm_noise:.05},Tunnel:{motion_type:"zoom",alcm_motion_amount:1,alcm_zoom:1.04,alcm_pan_x:0,alcm_pan_y:0,alcm_noise:.04},Handheld:{motion_type:"handheld",alcm_motion_amount:.8,alcm_zoom:1,alcm_pan_x:.1,alcm_pan_y:.1,alcm_noise:.08},Chaos:{motion_type:"custom",alcm_motion_amount:1.5,alcm_zoom:1.02,alcm_pan_x:.5,alcm_pan_y:.3,alcm_noise:.12}}[t];i&&(this.animateLcmEngine={...this.animateLcmEngine,...i,motion_preset:t},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onWanEngineFieldChange(t,e,i="text"){if(!t||!this.wanEngine)return;let n=e;if(i==="boolean")n=!!e;else if(i==="number"){const s=Number(e);if(!Number.isFinite(s))return;n=s}else n=String(e??"");if(this.wanEngine={...this.wanEngine,[t]:n},t==="wan_resolution"){const s=ul(n);s&&this.syncResolutionAcrossControls(s.width,s.height,{syncGpuModal:!0})}this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},readWanInitImage(t){var i,n;if(!t||!((n=(i=t.type)==null?void 0:i.startsWith)!=null&&n.call(i,"image/")))return;const e=new FileReader;e.onload=()=>{const s=String(e.result||"");s&&this.applyWanInitImageDataUrl(s)},e.onerror=()=>{},e.readAsDataURL(t)},handleWanInitImageFile(t){var i,n;const e=(n=(i=t==null?void 0:t.target)==null?void 0:i.files)==null?void 0:n[0];e&&this.readWanInitImage(e),t!=null&&t.target&&(t.target.value="")},handleWanInitImageDrop(t){var i,n;const e=(n=(i=t==null?void 0:t.dataTransfer)==null?void 0:i.files)==null?void 0:n[0];e&&this.readWanInitImage(e)},clearWanInitImage(){this.wanEngine=un({...this.wanEngine,wan_init_image:null,wan_use_init_image:!1}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},useImg2imgAsWanInit(){var e;const t=(e=this.img2img)==null?void 0:e.dataUrl;t&&this.applyWanInitImageDataUrl(t)},applyWanInitImageDataUrl(t){var n;const e=String(((n=this.wanEngine)==null?void 0:n.wan_i2v_model)||""),i={wan_init_image:t,wan_use_init_image:!0};(!e||e==="Use T2V Model (No Continuity)")&&(i.wan_i2v_model="1.3B VACE"),this.wanEngine=un({...this.wanEngine,...i}),this.syncWanInitResolutionFromDataUrl(t),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},syncWanInitResolutionFromDataUrl(t){if(!t||typeof Image>"u")return;const e=new Image;e.onload=()=>{const i=N1(e.naturalWidth,e.naturalHeight);if(i){this.wanEngine=un({...this.wanEngine,wan_resolution:i});const n=ul(i);n&&this.syncResolutionAcrossControls(n.width,n.height,{syncGpuModal:!0})}this.syncDeforumSettingsJson(),this.saveSessionState()},e.src=t},applyWanSpeedPreset(t){const e=L1(t);e&&(this.wanEngine=un({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},applyWanMotionPreset(t){const e=R1(t);e&&(this.wanEngine=un({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},toggleWanMotionLora(t){const e=Array.isArray(this.wanEngine.motion_loras)?this.wanEngine.motion_loras:[],i=e.includes(t)?e.filter(n=>n!==t):[...e,t];this.wanEngine=un({...this.wanEngine,motion_loras:i}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},async requestWanModelDownload(t="vace-1.3b"){if(this.wanDownloadBusy)return;this.wanDownloadBusy=!0,this.wanDownloadStatus="Queuing download on Forge…";const e=V1(t,this.wanEngine);this.wanEngine=un({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState();try{const i=this.buildMorphedPrompt()||String(this.prompts.pos||"").trim()||"defora wan model download probe",n=await fetch("/api/wan/download-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({packageId:t,wanEngine:this.wanEngine,prompt:i})}),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||s.detail||n.statusText||"Download request failed");const r=Po.find(l=>l.id===t);this.wanDownloadStatus=s.ok?`Download triggered via Forge (${s.batchId||"preview job"}). ${(r==null?void 0:r.label)||t}`:s.reason||"Skipped",s.manual&&(r!=null&&r.hfCommand)&&(this.wanDownloadStatus+=` — or run: ${r.hfCommand}`)}catch(i){const n=Po.find(s=>s.id===t);this.wanDownloadStatus=`${i.message||i}${n!=null&&n.hfCommand?` — manual: ${n.hfCommand}`:""}`}finally{this.wanDownloadBusy=!1,this.queueDeforumSettingsSave()}},async maybeCaptureActiveStyleExample(t){!this.promptStyleAutoExample||!this.activePromptStyleId||!t||await this.setPromptStyleExampleFromPath(this.activePromptStyleId,t)},promptHistoryKey(){return`defora_prompt_history_${this.session||"default"}`},initPromptHistory(){try{const t=window.SpeechRecognition||window.webkitSpeechRecognition;this.speechPromptSupported=!!t}catch{this.speechPromptSupported=!1}try{const t=window.localStorage&&window.localStorage.getItem(this.promptHistoryKey());if(!t)return;const e=JSON.parse(t);Array.isArray(e)&&(this.promptHistory=e.filter(i=>typeof i=="string"&&i.trim()).slice(0,50))}catch{}},savePromptHistory(){try{if(!window.localStorage)return;window.localStorage.setItem(this.promptHistoryKey(),JSON.stringify(this.promptHistory.slice(0,50)))}catch{}},queuePromptHistorySave(t){const e=String(t||"").trim();e&&(clearTimeout(this.promptHistoryDebounceTimer),this.promptHistoryDebounceTimer=setTimeout(()=>{this.addPromptToHistory(e)},650))},addPromptToHistory(t){const e=String(t||"").trim();if(!e)return;const i=[e,...this.promptHistory.filter(n=>n!==e)];this.promptHistory=i.slice(0,50),this.savePromptHistory()},togglePromptHistory(t){const e=typeof t=="boolean"?t:!this.promptHistoryOpen;this.promptHistoryOpen=e,e&&this.initPromptHistory()},restorePromptFromHistory(t){const e=String(t||"").trim();e&&(this.performance.genericPrompt=e,this.onPerformanceInput(),this.promptHistoryOpen=!1)},clearGenericPrompt(){this.performance.genericPrompt="",this.speechPromptError="",this.onPerformanceInput()},toggleSpeechPrompt(){this.speechPromptListening?this.stopSpeechPrompt():this.startSpeechPrompt()},startSpeechPrompt(){this.speechPromptError="";const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(!t){this.speechPromptSupported=!1,this.speechPromptError="Microphone input not supported in this browser.";return}try{if(this._speechPromptRecognizer)try{this._speechPromptRecognizer.abort()}catch{}const e=new t;this._speechPromptRecognizer=e,e.lang=navigator&&navigator.language?navigator.language:"en-US",e.interimResults=!0,e.continuous=!1;let i="";e.onstart=()=>{this.speechPromptListening=!0},e.onerror=n=>{const s=n&&n.error?String(n.error):"error";this.speechPromptError=s==="not-allowed"?"Microphone permission denied.":`Speech error: ${s}`,this.speechPromptListening=!1},e.onend=()=>{if(this.speechPromptListening=!1,i.trim()){const n=String(this.performance.genericPrompt||"").trim(),s=n?`${n}, ${i.trim()}`:i.trim();this.performance.genericPrompt=s,this.onPerformanceInput(),this.addPromptToHistory(s)}},e.onresult=n=>{try{const s=n&&n.results?n.results:[];let r="";for(let d=n.resultIndex||0;d{this[n]=null;const s=this.previewQueuedKind;this.previewQueuedKind=null,s==="deforum"?(await this.generateDeforumPreviewFrame(),this.flushQueuedPreview()):await this.generatePreviewFrame()},e)},flushQueuedPreview(){if(this.deforumPlaying||this.previewGenerating||!this.previewQueuedKind)return;const t=this.previewQueuedKind;this.previewQueuedKind=null,clearTimeout(this.previewDebounceTimer),clearTimeout(this.deforumPreviewTimer);const e=t==="deforum"?"deforumPreviewTimer":"previewDebounceTimer";this[e]=setTimeout(async()=>{this[e]=null,t==="deforum"?(await this.generateDeforumPreviewFrame(),this.flushQueuedPreview()):await this.generatePreviewFrame()},0)},schedulePreviewFrame(){this.queuePreviewRequest("auto",180)},scheduleDeforumPreview(){this.queuePreviewRequest("deforum",300)},getDeforumField(t){return na(this.deforumSettings,t)},formatDeforumFieldValue(t,e){if(!t)return String(e??"");const i=e??"";if(t.type==="slider"||t.type==="number"){const n=Number(i);if(!Number.isFinite(n))return"";const s=String(t.step??""),r=s.includes(".")?s.split(".")[1].length:0;return n.toFixed(r)}return String(i)},deforumFieldOptions(t){if(!t)return[];let e=[];t.key==="sampler"?e=[...this.engineSamplerOptions]:t.key==="scheduler"?e=[...this.engineSchedulerOptions]:e=Array.isArray(t.options)?[...t.options]:[];const i=String(this.getDeforumField(t.key)??"").trim();return i&&!e.includes(i)&&e.unshift(i),e},isDeforumDynamicSelect(t){return!!(t&&(t.key==="sampler"||t.key==="scheduler"))},onDeforumSelectInput(t,e){if(!(!t||!t.key)){if(t.key==="sampler"){this.onEngineSamplerChange(e);return}if(t.key==="scheduler"){this.onEngineSchedulerChange(e);return}this.onDeforumFieldInput(t.key,e,"text")}},async ensureForgeSamplerSchedulerLists(){const t=Array.isArray(this.forge.samplers)&&this.forge.samplers.length>0,e=Array.isArray(this.forge.schedulers)&&this.forge.schedulers.length>0;if(!(t&&e))try{await this.refreshForgeOptions()}catch{}},deforumToggleKeyForPath(t){return zm[t]||t},isDeforumFieldToggleable(t){if(/^cn_\d+_/.test(String(t||""))||s1.has(t))return!1;const e=this.deforumToggleKeyForPath(t);return lu.includes(e)},isDeforumFieldDisabledByAnimationMode(t){return!t||this.deforumMode2d3d!=="2D"?!1:n1(t)},isDeforumFieldGroupDisabledByAnimationMode(t){return this.deforumMode2d3d==="2D"&&t===nf},isDeforumFieldEnabled(t){const i=String(t||"").match(/^cn_(\d+)_(\w+)$/);if(i){const s=i[1];return i[2]==="enabled"?!0:!!na(this.deforumSettings,`cn_${s}_enabled`)}if(this.isDeforumFieldDisabledByAnimationMode(t))return!1;if(!this.isDeforumFieldToggleable(t))return!0;const n=this.deforumToggleKeyForPath(t);return this.deforumFieldEnabled[n]!==!1},setDeforumMode2d3d(t){const e=sf(t);this.deforumMode2d3d!==e&&this.onDeforumFieldInput("animation_mode",e,"text"),e==="2D"&&this.deforumActiveTab===nf&&(this.deforumActiveTab="motion",this.saveSessionState())},setDeforumFieldEnabled(t,e){const i=String(t||"");if(/^cn_\d+_/.test(i))return;const n=this.deforumToggleKeyForPath(t);this.isDeforumFieldToggleable(n)&&(this.deforumFieldEnabled={...Qs(this.deforumFieldEnabled),[n]:e!==!1},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},activeDeforumSettings(){const t=this.normalizedDeforumSettings();return lu.forEach(e=>{this.isDeforumFieldEnabled(e)||ed(t,e)}),this.deforumMode2d3d==="2D"&&eg.forEach(e=>ed(t,e)),Object.entries(zm).forEach(([e,i])=>{this.isDeforumFieldEnabled(i)||ed(t,e)}),t},onDeforumSectionToggle(t,e){this.deforumSectionOpen[t]=e.target.open},setSeedRandomEnabled(t){var i,n;if(t){const s=Number((i=this.deforumSettings)==null?void 0:i.seed);Number.isFinite(s)&&s>=0&&(this.seedFixedBackup=s),this.onDeforumFieldInput("seed",-1,"number");return}let e=Number(this.seedFixedBackup);(!Number.isFinite(e)||e<0)&&(e=Number.isFinite(Number((n=this.hud)==null?void 0:n.seed))&&this.hud.seed>=0?Number(this.hud.seed):Math.floor(Math.random()*2147483647)),this.onDeforumFieldInput("seed",e,"number")},onDeforumSeedInput(t){const e=parseInt(String(t),10);!Number.isFinite(e)||e<0||this.onDeforumFieldInput("seed",e,"number")},onDeforumFieldInput(t,e,i){if(this.isDeforumFieldDisabledByAnimationMode(t))return;let n=e;if(i==="number"){const s=parseFloat(e);n=Number.isFinite(s)?s:0}else i==="bool"?n=!!e:t==="init_image"&&e===""&&(n=null);if(rf(this.deforumSettings,t,n),t==="prompts.0"){const s=String(n||""),r=s.split(/\s+--neg\s+/i);r.length>1?(this.prompts.pos=r[0].trim(),this.prompts.neg=r.slice(1).join(" --neg ").trim()):this.prompts.pos=s.trim()}if(t==="negative_prompts"&&(this.prompts.neg=String(n||"")),t==="seed"&&Number.isFinite(n)&&n>=0&&(this.seedFixedBackup=n,this.hud.seed=n),t==="steps"&&Number.isFinite(n)&&this.syncStepsAcrossControls(n,{syncGpuModal:!0}),t==="steps_schedule"){const s=String(n||""),r=(s.match(/\(([^()]+)\)/)||[])[1]||s,l=Math.max(1,Math.round(this.readFirstNumericValue(r,Number(this.forge.options&&this.forge.options.steps)||Number(this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.steps)||6)));this.syncStepsAcrossControls(l,{syncGpuModal:!0,syncSchedule:!1})}if(t==="sampler"&&(this.forge.options.sampler_name=String(n||"")),t==="scheduler"&&(this.forge.options.scheduler=String(n||"")),t==="W"&&Number.isFinite(n)&&this.syncResolutionAcrossControls(n,this.deforumSettings&&this.deforumSettings.H,{syncGpuModal:!0}),t==="H"&&Number.isFinite(n)&&this.syncResolutionAcrossControls(this.deforumSettings&&this.deforumSettings.W,n,{syncGpuModal:!0}),t==="fps"&&Number.isFinite(n)&&!this._syncingGlobalFps){this._syncingGlobalFps=!0;try{this.syncFpsAcrossControls(n,{syncDeforum:!0})}finally{this._syncingGlobalFps=!1}}t==="sd_model_name"&&(this.forge.selectedModel=this.normalizeModelName(n)),this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch(t,n),t==="steps"&&this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),t==="steps_schedule"&&this.pushDeforumLivePatch("steps",this.deforumSettings.steps),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},onEngineResolutionChange(t){const[e,i]=String(t).split("x").map(Number);e>0&&i>0&&(this.syncResolutionAcrossControls(e,i,{syncGpuModal:!0}),this.onDeforumFieldInput("W",e,"number"),this.onDeforumFieldInput("H",i,"number"))},onImg2imgResolutionInput(t,e){const i={fallbackWidth:Number(this.img2img&&this.img2img.width)||1024,fallbackHeight:Number(this.img2img&&this.img2img.height)||576},n=this.currentResolution(i),s=t==="width"?e:n.width,r=t==="height"?e:n.height,l=this.syncResolutionAcrossControls(s,r,{syncGpuModal:!0});return this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview(),l},onGpuForgeModalResolutionInput(t,e){const i=this.gpuPool&&this.gpuPool.forgeModal;if(!i||!i.options)return null;const n=t==="width"?e:i.options.width,s=t==="height"?e:i.options.height,r=this.syncResolutionAcrossControls(n,s,{syncGpuModal:!0});return this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview(),r},pushDeforumLivePatch(t,e){if(!this.isDeforumFieldEnabled(t))return;const i=u1(t,e);this.sendControl("liveParam",i)},syncDeforumSettingsJson(){try{this.deforumSettingsJson=JSON.stringify(this.activeDeforumSettings(),null,2),this.deforumSettingsJsonError=""}catch(t){this.deforumSettingsJsonError=String(t.message||t)}},runDeforumSettingsVerify({forSave:t=!1}={}){if(this.deforumAdvancedOpen)try{this.applyDeforumSettingsJson()}catch{return this.deforumVerifyResults={ok:!1,errors:[{field:"JSON",message:this.deforumSettingsJsonError||"Invalid JSON"}],warnings:[]},this.deforumSettingsStatus="Fix JSON before verifying",this.deforumVerifyResults}const e=t?this.activeDeforumSettings():this.normalizedDeforumSettings();this.deforumVerifyResults=m1(e,{onlyDefinedKeys:t});const{errors:i,warnings:n}=this.deforumVerifyResults;return!i.length&&!n.length?this.deforumSettingsStatus="Settings look good":this.deforumSettingsStatus=`${i.length} error(s), ${n.length} optimization hint(s)`,this.deforumVerifyResults},guardDeforumSettingsBeforeRun(t="continue"){const e=typeof window<"u";if(this.deforumAdvancedOpen&&this.deforumSettingsJsonError)return e?window.alert(`Fix JSON errors before you ${t}.`):this.deforumSettingsStatus=`Fix JSON errors before you ${t}`,!1;if(this.deforumAdvancedOpen)try{this.applyDeforumSettingsJson()}catch{return e?window.alert(`Invalid settings JSON — fix errors before you ${t}.`):this.deforumSettingsStatus=`Invalid JSON — cannot ${t}`,!1}const i=/save/i.test(String(t)),n=this.runDeforumSettingsVerify({forSave:i});if(n.errors.length){const s=n.errors.map(r=>`• ${r.field}: ${r.message}`).join(` + `,transparent:!1,depthWrite:!1,blending:Gs});this.customLightsMaterial=n,this.customLightsRoot.add(new ed(i,n));const s=new Yr(.022,16,8),r=[16755200,17663,4521864];this.customLightsGlows=r.map(l=>{const o=new Ut(s,new Ws({color:l}));return this.customLightsRoot.add(o),o}),this.customLightsLights=[new B,new B,new B]},updateCustomLightsScene(t,e){if(!this.customLightsRoot||!this.customLightsMaterial)return;this.customLightsRoot.visible=!0;const i=t,n=.55+$t(Number(e.spread)||.68)*.3,s=Math.max(.1,Number(e.speed)||.75),r=i*s,l=this.customLightsLights[0],o=this.customLightsLights[1],u=this.customLightsLights[2];l.set(Math.sin(r*.7)*n,Math.cos(r*.5)*n,Math.cos(r*.3)*n),o.set(Math.cos(r*.3)*n,Math.sin(r*.5)*n,Math.sin(r*.7)*n),u.set(Math.sin(r*.7)*n,Math.cos(r*.3)*n,Math.sin(r*.5)*n);const c=this.customLightsMaterial.uniforms;c.uL1.value.copy(l),c.uL2.value.copy(o),c.uL3.value.copy(u),c.uRadius.value=.85+$t(Number(e.glow)||.78)*.55,this.customLightsGlows[0].position.copy(l),this.customLightsGlows[1].position.copy(o),this.customLightsGlows[2].position.copy(u),this.customLightsRoot.rotation.y=r*.1},createLfoGroups(){this.lfoGroups=Array.from({length:6}).map((t,e)=>{const i=Nk(),n=new Ve(i[e%i.length]),s=new Pn,r=new Ut(new Nh(.8,.08,16,72),new Us({color:n,emissive:n.clone().multiplyScalar(.55),transparent:!0,opacity:.5}));s.add(r);const l=new Ut(new Yr(.22,20,20),new Ws({color:n,transparent:!0,opacity:.95}));s.add(l);const o=new Ut(new Yr(.58,18,18),new Ws({color:n,transparent:!0,opacity:.14}));return s.add(o),s.userData={ring:r,core:l,aura:o,color:n},s.visible=!1,this.scene.add(s),s})},resolvedSettings(){const t={...Ir(),...this.settings||{}};return{mode:["instancing","volume","orbital","nebula","raycast","marching","ocean","customlights","transition","protoplanet","periodic_table"].includes(t.mode)?t.mode:"instancing",instCount:qt(Math.round(Number(t.instCount)||Ir().instCount),1e3,vd),beamCount:qt(Math.round(Number(t.beamCount)||7),3,12),speed:qt(Number(t.speed)||.75,.1,2.5),spread:qt(Number(t.spread)||.68,.2,2.5),glow:qt(Number(t.glow)||.78,.1,1.4),hue:$t(t.hue==null?.6:Number(t.hue)),pulse:$t(t.pulse==null?.36:Number(t.pulse)),drift:$t(t.drift==null?.44:Number(t.drift)),mist:$t(t.mist==null?.58:Number(t.mist)),orbit:$t(t.orbit==null?.52:Number(t.orbit)),lineType:t.lineType==="line"?"line":"segments",lineWidth:qt(Number(t.lineWidth)||2.4,1,10),lineThreshold:qt(t.lineThreshold==null?.8:Number(t.lineThreshold),0,10),lineTranslation:qt(t.lineTranslation==null?0:Number(t.lineTranslation),0,10),lineWorldUnits:t.lineWorldUnits!==!1,lineVisualizeThreshold:!!t.lineVisualizeThreshold,lineAlphaToCoverage:t.lineAlphaToCoverage!==!1,lineAnimate:t.lineAnimate!==!1,mcMaterial:["shiny","chrome","liquid","matte","flat","plastic","colors","multiColors"].includes(t.mcMaterial)?t.mcMaterial:"shiny",mcNumBlobs:qt(Math.round(Number(t.mcNumBlobs)||10),1,50),mcResolution:qt(Math.round(Number(t.mcResolution)||28),14,100),mcIsolation:qt(Math.round(Number(t.mcIsolation)||80),10,300),mcFloor:t.mcFloor!==!1,mcWallX:!!t.mcWallX,mcWallZ:!!t.mcWallZ,ocElevation:qt(Number(t.ocElevation)||2,0,90),ocAzimuth:qt(Number(t.ocAzimuth)||180,-180,180),ocExposure:qt(Number(t.ocExposure)||.1,0,1),ocDistortion:qt(Number(t.ocDistortion)||3.7,0,8),ocSize:qt(Number(t.ocSize)||1,.1,10),ocCloudCoverage:$t(t.ocCloudCoverage==null?.4:Number(t.ocCloudCoverage)),ocCloudDensity:$t(t.ocCloudDensity==null?.5:Number(t.ocCloudDensity)),ocCloudElevation:$t(t.ocCloudElevation==null?.5:Number(t.ocCloudElevation)),txTransition:$t(t.txTransition==null?.5:Number(t.txTransition)),txTransitionAnimate:t.txTransitionAnimate!==!1,txSceneAnimate:t.txSceneAnimate!==!1,txUseTexture:t.txUseTexture!==!1,txTexture:qt(Math.round(Number(t.txTexture)||0),0,Dr-1),txCycle:t.txCycle!==!1,txThreshold:$t(t.txThreshold==null?.1:Number(t.txThreshold)),...Ao(t),ppRestartSerial:Math.max(0,Math.round(Number(t.ppRestartSerial)||0)),...Co(t)}},transitionTextureUrl(t){return`/textures/transition/transition${qt(Math.round(Number(t)||0),0,Dr-1)+1}.png`},loadTransitionTextures(){if(this.transitionTextures.length>=Dr)return;const t=new rd;this.transitionTextures=[];for(let e=0;e{i.dispose()});i.colorSpace=Ti,this.transitionTextures.push(i)}},buildTransitionInstancedMesh(t,e,i){const n=new IP(t,e,i),s=new Wt,r=new Ve,l=t.type==="BoxGeometry";for(let o=0;o=.98,c=this.transitionLastMix<=.02||this.transitionLastMix>=.98;u&&!c&&(this.transitionCycleTextureIndex=(this.transitionCycleTextureIndex+1)%Dr)}this.transitionLastMix=r,this.transitionRuntimeMix=r,this.transitionRenderPass.setTransition(r),this.transitionRenderPass.useTexture(!!e.txUseTexture),this.transitionRenderPass.setTextureThreshold($t(e.txThreshold));const o=e.txCycle&&e.txTransitionAnimate?this.transitionCycleTextureIndex:l;this.transitionTextures[o]&&this.transitionRenderPass.setTexture(this.transitionTextures[o])},renderTransitionFrame(){if(!this.renderer||!this.transitionRenderPass)return;const t=this.transitionRuntimeMix;t<=.001&&this.transitionFxB?this.renderer.render(this.transitionFxB.scene,this.transitionFxB.camera):t>=.999&&this.transitionFxA?this.renderer.render(this.transitionFxA.scene,this.transitionFxA.camera):this.transitionComposer&&this.transitionComposer.render()},disposeTransitionPostprocess(){this.transitionRenderPass&&(this.transitionRenderPass.dispose(),this.transitionRenderPass=null),this.transitionComposer&&(this.transitionComposer.passes.slice().forEach(e=>{e!==this.transitionRenderPass&&typeof e.dispose=="function"&&e.dispose()}),this.transitionComposer=null),this.transitionTextures.forEach(e=>{e&&typeof e.dispose=="function"&&e.dispose()}),this.transitionTextures=[];const t=e=>{var i;e&&(e.mesh&&(e.mesh.geometry&&e.mesh.geometry.dispose(),e.mesh.material&&e.mesh.material.dispose()),(i=e.scene)==null||i.traverse(n=>{n.geometry&&n!==e.mesh&&typeof n.geometry.dispose=="function"&&n.geometry.dispose(),n.material&&n!==e.mesh&&(Array.isArray(n.material)?n.material:[n.material]).forEach(r=>{r&&typeof r.dispose=="function"&&r.dispose()})}))};t(this.transitionFxA),t(this.transitionFxB),this.transitionFxA=null,this.transitionFxB=null,this.transitionAnimPhase=0,this.transitionLastMix=-1},createProtoplanetScene(){if(this.protoplanetScene||!this.renderer)return;this.protoplanetScene=new Ur,this.protoplanetScene.background=new Ve(329485),this.protoplanetCamera=new li(75,1,5,15e3),this.protoplanetCamera.position.set(0,120,400);const t=Vd,e=t*t,i=new Bt,n=new Float32Array(e*3);let s=0;const r=$s().ppRadius;for(let h=0;h{var n;return(n=i==null?void 0:i.dispose)==null?void 0:n.call(i)}),(e=this.protoplanetPositionVariable)!=null&&e.renderTargets&&this.protoplanetPositionVariable.renderTargets.forEach(i=>{var n;return(n=i==null?void 0:i.dispose)==null?void 0:n.call(i)})),this.protoplanetParticles&&(this.protoplanetParticles.geometry&&this.protoplanetParticles.geometry.dispose(),this.protoplanetParticles.material&&this.protoplanetParticles.material.dispose()),this.protoplanetScene=null,this.protoplanetCamera=null,this.protoplanetParticles=null,this.protoplanetGpuCompute=null,this.protoplanetVelocityVariable=null,this.protoplanetPositionVariable=null,this.protoplanetVelocityUniforms=null,this.protoplanetParticleUniforms=null,this.protoplanetInitError=null,this.protoplanetStaticSignature="",this.protoplanetLastRestartSerial=-1},createPeriodicTableScene(){if(this.periodicScene||typeof document>"u")return;const t=this.$refs.host;if(!t)return;Ek();const e=er.length/5;this.periodicScene=new Ur,this.periodicCamera=new li(40,1,1,1e4),this.periodicCamera.position.z=3e3,this.periodicObjects=[];const i=lh();for(let l=0;l=0&&(this.periodicAutoCycleLayoutIndex=s)},rebuildPeriodicTargets(t){const e=Co(t),i=this.periodicObjects.length;this.periodicTargets=Ef(i,e.ptSpacing),this.periodicLastSpacing=e.ptSpacing},updatePeriodicTableScene(t,e,i){var c;if(this.periodicScene||this.createPeriodicTableScene(),!this.periodicScene||!this.periodicCamera||!this.periodicCss3dRenderer)return;const n=Co(e),s=`${n.ptCardOpacity}|${n.ptHue}|${n.ptCardScale}`;s!==this.periodicStyleKey&&(Fk(this.periodicObjects,{opacity:n.ptCardOpacity,hue:n.ptHue,scale:n.ptCardScale}),this.periodicStyleKey=s),n.ptSpacing!==this.periodicLastSpacing?(this.rebuildPeriodicTargets(e),this.periodicTransformToLayout(n.ptLayout,e)):n.ptLayout!==this.periodicLastLayout&&this.periodicTransformToLayout(n.ptLayout,e);const r=Ik(this.periodicTweens,i*1e3);if(n.ptAutoCycle&&!r){if(this.periodicAutoCycleTimer+=i,this.periodicAutoCycleTimer>=n.ptAutoCycleSec){this.periodicAutoCycleTimer=0,this.periodicAutoCycleLayoutIndex=(this.periodicAutoCycleLayoutIndex+1)%zo.length;const h=zo[this.periodicAutoCycleLayoutIndex];this.periodicTransformToLayout(h,e)}}else n.ptAutoCycle||(this.periodicAutoCycleTimer=0);const l=Math.max(.05,Number(e.speed)||.75)*.1,o=2200+$t(e.orbit==null?.52:Number(e.orbit))*1400,u=t*l;this.periodicCamera.position.set(Math.sin(u)*o*.45,120+Math.sin(t*l*.65)*60,Math.cos(u)*o),this.periodicCamera.lookAt(0,0,0),(c=this.renderer)!=null&&c.domElement&&(this.renderer.domElement.style.display="none"),this.periodicCss3dRenderer.domElement&&(this.periodicCss3dRenderer.domElement.style.display="block")},renderPeriodicTableFrame(){!this.periodicCss3dRenderer||!this.periodicScene||!this.periodicCamera||this.periodicCss3dRenderer.render(this.periodicScene,this.periodicCamera)},setPeriodicRendererVisible(t){var e,i;(e=this.periodicCss3dRenderer)!=null&&e.domElement&&(this.periodicCss3dRenderer.domElement.style.display=t?"block":"none"),(i=this.renderer)!=null&&i.domElement&&(this.renderer.domElement.style.display=t?"none":"")},disposePeriodicTableScene(){var t,e;this.periodicScene&&this.periodicObjects.forEach(i=>{var n;this.periodicScene.remove(i),(n=i.element)!=null&&n.parentNode&&i.element.parentNode.removeChild(i.element)}),(e=(t=this.periodicCss3dRenderer)==null?void 0:t.domElement)!=null&&e.parentNode&&this.periodicCss3dRenderer.domElement.parentNode.removeChild(this.periodicCss3dRenderer.domElement),kk(),this.periodicScene=null,this.periodicCamera=null,this.periodicCss3dRenderer=null,this.periodicObjects=[],this.periodicTargets=null,this.periodicTweens=[],this.periodicLastLayout="",this.periodicLastSpacing=-1,this.periodicStyleKey="",this.periodicAutoCycleTimer=0,this.setPeriodicRendererVisible(!1)},handleResize(){if(!this.renderer||!this.camera||!this.$refs.host)return;const t=Math.max(1,this.$refs.host.clientWidth||0),e=Math.max(1,this.$refs.host.clientHeight||0);this.camera.aspect=t/e,this.camera.updateProjectionMatrix(),this.renderer.setSize(t,e,!1),this.transitionComposer&&this.resizeTransitionViews(t,e),this.protoplanetCamera&&(this.protoplanetCamera.aspect=t/e,this.protoplanetCamera.updateProjectionMatrix(),this.protoplanetParticleUniforms&&(this.protoplanetParticleUniforms.cameraConstant.value=np(this.protoplanetCamera,e))),this.periodicCamera&&this.periodicCss3dRenderer&&(this.periodicCamera.aspect=t/e,this.periodicCamera.updateProjectionMatrix(),this.periodicCss3dRenderer.setSize(t,e))},shapeSample(t,e){const i=e%(Math.PI*2);return t==="Square"?Math.sin(i)>=0?1:-1:t==="Saw"?i/Math.PI-1:t==="Triangle"?2*Math.asin(Math.sin(i))/Math.PI:Math.sin(i)},updateParticles(t,e,i){if(!this.particleSystem||!this.particleBase)return;const n=this.particleSystem.geometry.getAttribute("position"),s=n.array,r=.08+e*.5+i*.25;for(let l=0;l{if(u.visible=c{s.visible=!0;const l=t*(.08+n.speed*.08)+r*1.3,o=1.4+n.spread*2.2+r*.35,u=-4+r*1.35,c=5+n.glow*7+i*2+r*1.3,h=(n.hue+r*.06+t*.01)%1;s.position.set(Math.cos(l)*o,Math.sin(l*1.2)*(1.4+n.drift*1.8),u),s.scale.setScalar(c),s.material.color.setHSL(h,.78,.64),s.material.opacity=.06+n.glow*.08+e*.08})},updateRaycastLines(t,e,i,n){if(!this.fatLineRoot||!this.fatLine||!this.fatSegments||!this.fatThresholdLine||!this.fatThresholdSegments)return;const s=n.lineType==="line",r=n.lineWidth+n.lineThreshold,l=n.lineTranslation-5;this.fatLineRoot.visible=!0,this.fatLineRoot.position.set(l,0,0),this.fatLineRoot.rotation.y=n.lineAnimate?t*.18:.65,this.fatLineRoot.rotation.x=n.lineAnimate?Math.sin(t*.17)*.14:-.16,this.fatLineRoot.rotation.z=n.lineAnimate?Math.cos(t*.11)*.06:0,this.fatLine.visible=s,this.fatSegments.visible=!s,this.fatThresholdLine.visible=n.lineVisualizeThreshold&&s,this.fatThresholdSegments.visible=n.lineVisualizeThreshold&&!s,[this.fatLine.material,this.fatSegments.material].forEach(o=>{o.worldUnits=n.lineWorldUnits,o.linewidth=n.lineWidth,o.alphaToCoverage=n.lineAlphaToCoverage,o.opacity=.88+e*.08+i*.04,o.needsUpdate=!0}),[this.fatThresholdLine.material,this.fatThresholdSegments.material].forEach(o=>{o.worldUnits=n.lineWorldUnits,o.linewidth=r,o.alphaToCoverage=n.lineAlphaToCoverage,o.opacity=.12+e*.06,o.visible=n.lineVisualizeThreshold,o.needsUpdate=!0})},updateMarchingField(t,e){if(!this.marchingRoot||!this.marchingEffect||!this.marchingMaterials)return;const i=this.marchingMaterials[e.mcMaterial]||this.marchingMaterials.shiny;(this.marchingMaterialKey!==e.mcMaterial||this.marchingEffect.material!==i)&&(this.marchingEffect.material=i,this.marchingMaterialKey=e.mcMaterial),this.marchingEffect.enableColors!==["colors","multiColors"].includes(e.mcMaterial)&&(this.marchingEffect.enableColors=["colors","multiColors"].includes(e.mcMaterial)),this.marchingEffect.enableUvs&&(this.marchingEffect.enableUvs=!1),this.marchingResolution!==e.mcResolution&&(this.marchingEffect.init(Math.floor(e.mcResolution)),this.marchingResolution=e.mcResolution),this.marchingEffect.isolation!==e.mcIsolation&&(this.marchingEffect.isolation=e.mcIsolation),this.marchingRoot.visible=!0,this.marchingRoot.rotation.y=t*.18,this.marchingRoot.rotation.x=Math.sin(t*.11)*.08,this.marchingEffect.reset();const n=Vk(),s=1.2/((Math.sqrt(e.mcNumBlobs)-1)/4+1),r=12,l=t*e.speed*.5;for(let o=0;o{const u=r[o],c=!!(u&&u.on);if(l.visible=c,!c)return;const h=Math.max(.1,Number(u.speed)||1),d=$t(u.depth==null?.2:u.depth),m=Number(u.phase)||0,g=t*(.35+h*.25),b=m+g,w=2.4+o*.78+d*1.6+e*.35,v=this.shapeSample(u.shape,b)*(.35+d*1.2+s*.25);l.position.set(Math.cos(b+o*.65)*w*.88,v+Math.sin(b*.45)*(.25+i*.2),Math.sin(b*.8+o)*(1.1+n*1.1)),l.rotation.x+=.005+h*.0025,l.rotation.y+=.008+h*.003,l.rotation.z=b*.75;const{ring:y,core:S,aura:P,color:M}=l.userData,k=.75+d*1.8+e*.6,C=.65+d*.8+i*.9,L=1.15+d*1.4+s*.8;y.scale.setScalar(k),S.scale.setScalar(C),P.scale.setScalar(L),y.material.opacity=.28+d*.35+e*.2,P.material.opacity=.08+e*.18+s*.1,S.material.opacity=.7+i*.25,y.material.emissive.copy(M).multiplyScalar(.4+e*.8)})},updateCamera(t,e){if(this.camera){if(e.mode==="raycast")this.camera.position.set(-18+Math.sin(t*.12)*2.5,0,30);else if(e.mode==="marching")this.camera.position.set(-14,12,26);else if(e.mode==="ocean"){this.camera.position.set(24+Math.sin(t*.08)*2,16+Math.cos(t*.06)*1.5,38),this.camera.lookAt(0,6,0);return}else if(e.mode==="interactive_points"){this.camera.position.set(0,0,12+e.orbit*4),this.camera.lookAt(0,0,0);return}else if(e.mode==="interactive_raycast_points"){this._raycastCameraSeeded||(this.camera.position.set(8,8,8),this.camera.lookAt(0,0,0),this._raycastCameraSeeded=!0);return}else if(e.mode==="lensflares"){const i=t*(.05+e.speed*.08),n=18+e.orbit*4;this.camera.position.set(Math.cos(i)*n,6+Math.sin(t*.12)*2,Math.sin(i)*n),this.camera.lookAt(0,0,0);return}else if(e.mode==="instancing"){this.camera.fov!==50&&(this.camera.fov=50,this.camera.near=.5,this.camera.far=20,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,3.2+e.orbit*.8),this.camera.lookAt(0,0,0);return}else if(e.mode==="customlights"){this.camera.fov!==70&&(this.camera.fov=70,this.camera.near=.1,this.camera.far=10,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,1.5),this.camera.lookAt(0,0,0);return}else if(e.mode==="transition"){this.camera.fov!==50&&(this.camera.fov=50,this.camera.near=.1,this.camera.far=100,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,20),this.camera.lookAt(0,0,0);return}else{if(e.mode==="protoplanet")return;if(e.mode==="periodic_table")return;this.camera.fov!==45&&(this.camera.fov=45,this.camera.near=.1,this.camera.far=100,this.camera.updateProjectionMatrix()),this.camera.position.set(0,0,18-e.orbit*2)}this.camera.lookAt(0,0,0)}},animate(){if(!this.renderer||!this.scene||!this.camera||!this.clock)return;const t=()=>{var k;const e=this.clock.getElapsedTime(),i=this.audioMetrics||{},n=$t(i.level),s=$t(i.bass),r=$t(i.mid),l=$t(i.treble),o=$t(i.pulse),u=$t(this.morph),c=this.resolvedSettings(),h=this.activeTab==="LIVE"?1:.65,d=c.mode==="raycast",m=c.mode==="marching",g=c.mode==="ocean",b=c.mode==="instancing",w=c.mode==="customlights",v=c.mode==="transition",y=c.mode==="protoplanet",S=c.mode==="periodic_table",P=d||m||g||b||w||v||y||S,M=this.clock.getDelta();if((k=this.scene)!=null&&k.fog&&(this.scene.fog.density=b||w?0:.045),this.particleSystem&&(this.particleSystem.visible=!P),this.haloMesh&&(this.haloMesh.visible=!P),this.beamMeshes.forEach(C=>{C.visible=!P&&C.visible}),this.fogSprites.forEach(C=>{C.visible=!P}),w?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.initCustomLightsScene(),this.updateCustomLightsScene(e,c)):this.customLightsRoot&&(this.customLightsRoot.visible=!1),d?(this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.customLightsRoot&&(this.customLightsRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateRaycastLines(e,n*h,s,c)):m?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateMarchingField(e,c)):g?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateOceanScene(e,c,M)):b?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateInstancingScene(e,c,n*h)):interactivePointsMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateInteractivePoints(e,c,n*h)):interactiveRaycastMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateInteractiveRaycastPoints(e,c,M,n*h)):lensflaresMode?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updateLensflares(e,c)):v?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.customLightsRoot&&(this.customLightsRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.setPeriodicRendererVisible(!1),this.updateTransitionScenes(M,c,n*h)):y?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.customLightsRoot&&(this.customLightsRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.setPeriodicRendererVisible(!1),this.updateProtoplanetScene(e,c)):S?(this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.customLightsRoot&&(this.customLightsRoot.visible=!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.lfoGroups.forEach(C=>{C.visible=!1}),this.updatePeriodicTableScene(e,c,M)):(this.setPeriodicRendererVisible(!1),this.instancingRoot&&(this.instancingRoot.visible=!1),this.fatLineRoot&&(this.fatLineRoot.visible=!1),this.marchingRoot&&(this.marchingRoot.visible=!1),this.oceanRoot&&(this.oceanRoot.visible=!1),this.interactivePointsRoot&&(this.interactivePointsRoot.visible=!1),this.interactiveRaycastRoot&&(this.interactiveRaycastRoot.visible=!1),this.lensflareRoot&&(this.lensflareRoot.visible=!1),this.applyLensflareSceneStyle(!1),this.restoreRendererToneMapping(),this.scene&&(this.scene.environment=null),this.updateParticles(e,n*h,o),this.updateHalo(e,n*h,s,u,c),this.updateVolumeBeams(e,n*h,s,l,c),this.updateFogSprites(e,n*h,o,c),this.updateLfoGroups(e,n*h,s,r,l)),this.updateCamera(e,c),this.$refs.host){const C=this.$refs.host.clientWidth||0,L=this.$refs.host.clientHeight||0,x=this.renderer.domElement;C>=2&&L>=2&&x&&(x.width<2||x.height<2)&&this.handleResize()}v?this.renderTransitionFrame():y?this.renderProtoplanetFrame():S?this.renderPeriodicTableFrame():this.renderer.render(this.scene,this.camera),this.rafId=requestAnimationFrame(t)};this.rafId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(t)},teardownScene(){if(typeof window<"u"&&window.removeEventListener("resize",this.handleResize),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.rafId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this.rafId),this.rafId=null,this.scene&&this.scene.traverse(t=>{t.geometry&&typeof t.geometry.dispose=="function"&&t.geometry.dispose(),t.material&&(Array.isArray(t.material)?t.material:[t.material]).forEach(i=>{i&&typeof i.dispose=="function"&&i.dispose()})}),this.renderer){this.renderer.dispose();const t=this.renderer.domElement;t&&t.parentNode&&t.parentNode.removeChild(t)}this.beamMap&&this.beamMap.dispose(),this.mistMap&&this.mistMap.dispose(),this.marchingMaterials&&Object.values(this.marchingMaterials).forEach(t=>{t&&typeof t.dispose=="function"&&t.dispose()}),this.oceanPmremTarget&&this.oceanPmremTarget.dispose(),this.oceanPmrem&&this.oceanPmrem.dispose(),this.oceanNormalsTexture&&this.oceanNormalsTexture.dispose(),this.oceanWater&&(this.oceanWater.geometry&&this.oceanWater.geometry.dispose(),this.oceanWater.material&&this.oceanWater.material.dispose()),this.oceanSky&&this.oceanSky.material&&this.oceanSky.material.dispose(),this.oceanMesh&&(this.oceanMesh.geometry&&this.oceanMesh.geometry.dispose(),this.oceanMesh.material&&this.oceanMesh.material.dispose()),this.instancingMesh&&(this.instancingMesh.geometry&&this.instancingMesh.geometry.dispose(),this.instancingMesh.material&&this.instancingMesh.material.dispose()),this.deforumBackdropTexture&&this.deforumBackdropTexture.dispose(),this.deforumBackdropMesh&&(this.deforumBackdropMesh.geometry&&this.deforumBackdropMesh.geometry.dispose(),this.deforumBackdropMesh.material&&this.deforumBackdropMesh.material.dispose()),this.disposeTransitionPostprocess(),this.disposeProtoplanetScene(),this.disposePeriodicTableScene(),this.renderer=null,this.scene=null,this.camera=null,this.clock=null,this.particleSystem=null,this.particleBase=null,this.haloMesh=null,this.beamMeshes=[],this.fogSprites=[],this.beamMap=null,this.mistMap=null,this.lfoGroups=[],this.fatLineRoot=null,this.fatLine=null,this.fatThresholdLine=null,this.fatSegments=null,this.fatThresholdSegments=null,this.marchingRoot=null,this.marchingEffect=null,this.marchingMaterials=null,this.marchingResolution=28,this.marchingMaterialKey="shiny",this.oceanRoot=null,this.oceanSky=null,this.oceanWater=null,this.oceanMesh=null,this.oceanSun=null,this.oceanPmrem=null,this.oceanPmremTarget=null,this.oceanNormalsTexture=null,this.oceanSettingsKey="",this.instancingRoot=null,this.instancingMesh=null,this.deforumBackdropMesh=null,this.deforumBackdropTexture=null,this.deforumBackdropUrl="",this.deforumBackdropOpacity=0}}},Gk={ref:"host",class:"three-background"};function Hk(t,e,i,n,s,r){return p(),f("div",Gk,null,512)}const Wk=it($k,[["render",Hk],["__scopeId","data-v-74f9bc89"]]),qk={name:"LiveView",components:{GlassPanel:nr},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},methods:{openDeforumParameters(){this.liveEngineDrawerOpen=!0,this.promoteToDeforum(),this.paramPanelOpen=!0,this.saveSessionState()},openEngineWebglLayer(){this.liveEngineDrawerOpen=!0,this.selectVideoLayer("webgl"),this.saveSessionState()}}},jk={class:"live-view","data-testid":"live-view"},Xk={class:"live-view__scroll"},Kk={class:"live-view__summary-grid"},Yk={class:"live-view__summary-row"},Jk={class:"live-view__summary-value"},Zk={class:"live-view__summary-row"},Qk={class:"live-view__summary-value"},eR={key:0,class:"live-view__summary-row"},tR={class:"live-view__summary-value"},iR={key:0,class:"live-view__param-list"},nR={class:"live-view__param-list-meta"},sR={key:1,class:"framesync-subtitle live-view__summary-empty"},rR={class:"live-view__shortcut-actions"};function oR(t,e,i,n,s,r){const l=Ie("GlassPanel");return p(),f("div",jk,[a("div",Xk,[ve(l,{size:"md",class:"live-view__summary","data-testid":"live-context-summary"},{header:Ht(()=>[...e[3]||(e[3]=[ie("Live summary",-1)])]),default:Ht(()=>[a("div",Kk,[a("div",Yk,[e[4]||(e[4]=a("span",{class:"framesync-subtitle"},"Preview layer",-1)),a("strong",Jk,_(t.liveActiveLayerLabel),1)]),a("div",Zk,[e[5]||(e[5]=a("span",{class:"framesync-subtitle"},"Deforum",-1)),a("strong",Qk,_(t.deforumPlaying?"Animating":"Ready"),1)]),t.prompts&&t.prompts.morphOn?(p(),f("div",eR,[e[6]||(e[6]=a("span",{class:"framesync-subtitle"},"Morph",-1)),a("strong",tR," A "+_(Math.round((1-t.performance.crossfader)*100))+"% · B "+_(Math.round(t.performance.crossfader*100))+"% ",1)])):N("",!0)]),t.liveContextSummaryParams.length?(p(),f("ul",iR,[(p(!0),f(G,null,re(t.liveContextSummaryParams,o=>(p(),f("li",{key:"live-sum-"+o.key,class:"live-view__param-list-item"},[a("span",null,_(o.label),1),a("span",nR,_(o.source)+" · "+_(Number(o.val).toFixed(2)),1)]))),128))])):(p(),f("p",sR," Pin parameters from the panel below, or route LFO / audio in Modulation. "))]),_:1}),ve(l,{size:"md",class:"live-view__shortcuts"},{header:Ht(()=>[...e[7]||(e[7]=[ie("Engine shortcuts",-1)])]),default:Ht(()=>[e[8]||(e[8]=a("p",{class:"framesync-subtitle live-view__shortcuts-copy"}," Full Deforum schedules (sampler, ControlNet, motion strings) live in the Engine drawer. ",-1)),a("div",rR,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"live-open-deforum-parameters",onClick:e[0]||(e[0]=(...o)=>r.openDeforumParameters&&r.openDeforumParameters(...o))}," Deforum settings "),a("button",{type:"button",class:"framesync-button","data-testid":"live-open-deforum-prompts",onClick:e[1]||(e[1]=o=>t.openEngineDeforumSettingsTab("prompts"))}," Prompt schedules "),a("button",{type:"button",class:"framesync-button","data-testid":"live-open-engine-webgl",onClick:e[2]||(e[2]=(...o)=>r.openEngineWebglLayer&&r.openEngineWebglLayer(...o))}," WebGL visual ")])]),_:1})])])}const aR=it(qk,[["render",oR]]),lR=[{id:"webgl",label:"WebGL",layerKind:"webgl",layerId:"webgl",backend:"webgl",builtin:!0,mixable:!0,panel:"WebGLPluginPanel"},{id:"deforum",label:"Deforum",layerKind:"deforum",layerId:"deforum",backend:"forge-deforum",builtin:!0,mixable:!0,panel:"DeforumPluginPanel"},{id:"wan",label:"WAN Video",layerKind:"wan",layerId:"wan",backend:"forge-wan",builtin:!0,mixable:!0,panel:"WanPluginPanel"},{id:"animatelcm",label:"AnimateLCM",layerKind:"animatelcm",layerId:"animatelcm",backend:"forge-animatelcm",builtin:!0,mixable:!0,panel:"AnimateLcmPluginPanel"},{id:"svd",label:"SVD",layerKind:"svd",layerId:"svd",backend:"forge-svd",builtin:!0,mixable:!0,panel:"SvdPluginPanel"}];function uR(t){return lR.find(e=>e.id===t)||null}const dR={name:"CommonVisualStrip",props:{app:{type:Object,required:!0},pluginId:{type:String,default:""}},setup(t){return Tt(t)},computed:{resolvedPluginId(){return this.pluginId||this.activeAnimationPluginId||""},resolvedPlugin(){return uR(this.resolvedPluginId)},stripItems(){return this.commonVisualItemsForPlugin(this.resolvedPluginId)}}},cR={class:"common-visual-strip","data-testid":"common-visual-strip"},hR={class:"deforum-control-panel__section-head"},mR={key:0,class:"common-visual-strip__plugin"},pR={class:"deforum-macro-knobs__grid"},fR=["data-testid"],gR={class:"deforum-macro-knob__label"},yR=["min","max","step","value","disabled","onInput"],vR={class:"deforum-macro-knob__readout"};function bR(t,e,i,n,s,r){return p(),f("section",cR,[a("div",hR,[e[0]||(e[0]=a("span",{class:"framesync-subtitle deforum-control-panel__section-title"},"Common visuals",-1)),r.resolvedPlugin?(p(),f("span",mR,_(r.resolvedPlugin.label),1)):N("",!0)]),a("div",pR,[(p(!0),f(G,null,re(r.stripItems,l=>(p(),f("label",{key:"common-visual-"+l.paramId,class:U(["deforum-macro-knob",{"deforum-macro-knob--disabled":l.disabled}]),"data-testid":"common-visual-"+l.paramId},[a("span",gR,_(l.label),1),a("input",{type:"range",class:"framesync-input deforum-macro-knob__input",min:l.min,max:l.max,step:l.step,value:l.value,disabled:l.disabled,onInput:o=>t.onCommonVisualInput(l.paramId,o.target.value,r.resolvedPluginId)},null,40,yR),a("code",vR,_(l.readout),1)],10,fR))),128))])])}const _R=it(dR,[["render",bR]]),SR={name:"PresetSelectorBar",props:{app:{type:Object,default:null}},setup(t){const e=Hr("deforaApp",null),i=t.app||e;return Tt({app:i})},mounted(){this.availablePresets.length||this.refreshPresets()},methods:{onPresetChange(t){t&&this.loadPreset(t)}}},wR={class:"preset-selector-bar","data-testid":"preset-selector-bar"},MR={class:"preset-selector-bar__row"},xR=["value"],PR=["value"],TR=["disabled"],AR={key:0,class:"framesync-subtitle preset-selector-bar__status"};function CR(t,e,i,n,s,r){return p(),f("div",wR,[e[5]||(e[5]=a("div",{class:"framesync-subtitle preset-selector-bar__label"},"Preset",-1)),a("div",MR,[a("select",{class:"framesync-select preset-selector-bar__select","data-testid":"preset-select",value:t.currentPreset||"",onChange:e[0]||(e[0]=l=>r.onPresetChange(l.target.value))},[e[4]||(e[4]=a("option",{value:""},"— select —",-1)),(p(!0),f(G,null,re(t.availablePresets,l=>(p(),f("option",{key:"preset-opt-"+l,value:l},_(l),9,PR))),128))],40,xR),K(a("input",{class:"framesync-input preset-selector-bar__name","data-testid":"preset-name-input","onUpdate:modelValue":e[1]||(e[1]=l=>t.newPresetName=l),placeholder:"New name"},null,512),[[ae,t.newPresetName]]),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"preset-add",title:"Save current state as preset",onClick:e[2]||(e[2]=(...l)=>t.saveCurrentPreset&&t.saveCurrentPreset(...l))}," + Add "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--danger","data-testid":"preset-delete",title:"Delete selected preset",disabled:!t.currentPreset,onClick:e[3]||(e[3]=l=>t.deletePreset(t.currentPreset))}," Delete ",8,TR)]),t.presetStatus?(p(),f("div",AR,_(t.presetStatus),1)):N("",!0)])}const ER=it(SR,[["render",CR]]),kR={name:"LiveEngineControls",components:{PresetSelectorBar:ER},props:{app:{type:Object,default:null},compact:{type:Boolean,default:!1},forceWebgl:{type:Boolean,default:!1},forcePerformance:{type:Boolean,default:!1},showCompositor:{type:Boolean,default:!0},showWebgl:{type:Boolean,default:!0}},setup(t){const e=Hr("deforaApp",null),i=t.app||e;return Tt({app:i,compact:t.compact,forceWebgl:t.forceWebgl,forcePerformance:t.forcePerformance,showCompositor:t.showCompositor,showWebgl:t.showWebgl})}},RR={key:1,class:"live-engine-controls__section live-engine-controls__section--compositor","data-testid":"preview-compositor-controls"},LR={class:"live-engine-controls__toggle"},DR=["checked"],IR={class:"live-engine-controls__toggle"},FR=["checked"],NR={class:"slider-row"},OR={class:"live-engine-controls__compositor-row","data-testid":"compositor-lfo-links"},UR=["data-testid","onClick"],VR={key:2,class:"live-engine-controls__section live-engine-controls__section--webgl","data-testid":"live-webgl-controls"},BR={class:"live-engine-controls__section-head"},zR=["value"],$R={class:"slider-row"},GR={class:"slider-row"},HR={class:"slider-row"},WR={class:"slider-row"},qR={class:"slider-row"},jR={class:"slider-row"},XR={class:"slider-row"},KR={class:"slider-row"},YR={class:"slider-row"},JR={key:2,class:"slider-row"},ZR={key:3,class:"slider-row"},QR={key:4,class:"slider-row"},eL={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},tL={class:"slider-row"},iL={class:"slider-row"},nL={class:"slider-row"},sL={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},rL={class:"chips"},oL={key:2,class:"framesync-stack",style:{"margin-top":"10px"}},aL={class:"chips"},lL={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},uL={class:"slider-row"},dL={class:"slider-row"},cL={class:"slider-row"},hL={class:"slider-row"},mL={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},pL={class:"chips"},fL={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},gL={class:"chips"},yL=["data-testid","onClick"],vL={class:"slider-row"},bL={class:"slider-row"},_L={class:"slider-row"},SL={class:"slider-row"},wL={class:"slider-row"},ML={class:"slider-row"},xL={class:"slider-row"},PL={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},TL={class:"chips"},AL={key:2,class:"slider-row"},CL={key:3,class:"framesync-subtitle live-engine-controls__hint"},EL={class:"slider-row"},kL={class:"slider-row"},RL={class:"slider-row"},LL={class:"slider-row"},DL={class:"slider-row"},IL={class:"slider-row"},FL={class:"slider-row"},NL={class:"slider-row"},OL={class:"slider-row"},UL={class:"slider-row"},VL={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},BL={key:1,class:"framesync-subtitle live-engine-controls__hint"},zL={class:"slider-row"},$L=["disabled"],GL={class:"slider-row"},HL={class:"slider-row"},WL={class:"slider-row"},qL={class:"slider-row"},jL={key:0,class:"framesync-stack",style:{"margin-top":"10px"}},XL={key:1,class:"framesync-stack",style:{"margin-top":"10px"}},KL={class:"chips"},YL=["disabled"],JL={key:2,class:"framesync-subtitle live-engine-controls__hint"},ZL={class:"slider-row"},QL={class:"slider-row"},e3={class:"slider-row"},t3={class:"slider-row"},i3={class:"slider-row"},n3={key:0,class:"slider-row"},s3={key:1,class:"slider-row"},r3={key:2,class:"slider-row"},o3={class:"slider-row"},a3={class:"slider-row"},l3={class:"slider-row"},u3={class:"slider-row"},d3={class:"slider-row"},c3={class:"slider-row"},h3={key:3,class:"live-engine-controls__section live-engine-controls__section--composite","data-testid":"forge-overlay-controls"},m3={class:"slider-row"};function p3(t,e,i,n,s,r){const l=Ie("PresetSelectorBar");return p(),f("div",{class:U(["live-engine-controls",{"live-engine-controls--compact":i.compact}]),"data-testid":"live-engine-controls"},[i.showWebgl&&!i.compact?(p(),ht(l,{key:0,app:i.app},null,8,["app"])):N("",!0),i.showCompositor?(p(),f("div",RR,[e[146]||(e[146]=a("div",{class:"live-engine-controls__section-head"},[a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"Preview compositor")],-1)),a("label",LR,[a("input",{type:"checkbox",checked:t.defaultAnimation.autoTransitionToDeforum!==!1,"data-testid":"auto-transition-deforum",onChange:e[0]||(e[0]=o=>{t.defaultAnimation.autoTransitionToDeforum=o.target.checked,t.onDefaultAnimationInput()})},null,40,DR),e[142]||(e[142]=a("span",null,"Auto-switch to Deforum when frames arrive",-1))]),a("label",IR,[a("input",{type:"checkbox",checked:!!t.defaultAnimation.rememberCompositorLayerOnStartup,"data-testid":"remember-compositor-layer",onChange:e[1]||(e[1]=o=>{t.defaultAnimation.rememberCompositorLayerOnStartup=o.target.checked,t.onDefaultAnimationInput()})},null,40,FR),e[143]||(e[143]=a("span",null,"Remember last preview layer on reload",-1))]),a("div",NR,[e[144]||(e[144]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Crossfade duration",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"5000",step:"50","onUpdate:modelValue":e[2]||(e[2]=o=>t.defaultAnimation.previewCompositorCrossfadeMs=o),"data-testid":"preview-compositor-crossfade-ms",onInput:e[3]||(e[3]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.previewCompositorCrossfadeMs,void 0,{number:!0}]])]),t.defaultAnimation.autoTransitionToDeforum===!1?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact","data-testid":"promote-to-deforum",onClick:e[4]||(e[4]=o=>t.promoteToDeforum())}," Promote to Deforum now ")):N("",!0),a("div",OR,[e[145]||(e[145]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge mix LFO",-1)),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{active:!t.defaultAnimation.forgeLayerOpacityLfoLink}]),onClick:e[5]||(e[5]=o=>t.setForgeLayerOpacityLfoLink(null))}," Manual ",2),(p(!0),f(G,null,re(t.lfos.slice(0,6),o=>(p(),f("button",{key:"compositor-lfo-"+o.id,type:"button",class:U(["framesync-button framesync-button--compact",{active:t.defaultAnimation.forgeLayerOpacityLfoLink===o.id}]),"data-testid":"compositor-lfo-link-"+o.id,onClick:u=>t.setForgeLayerOpacityLfoLink(o.id)},_("LFO "+o.id),11,UR))),128))]),e[147]||(e[147]=a("p",{class:"framesync-subtitle live-engine-controls__hint"}," LFO modulates forge opacity on WebGL + Deforum (Both). Use MODULATION to route audio into LFO depth. ",-1))])):N("",!0),i.showWebgl&&(i.forceWebgl||!i.forcePerformance&&(t.isWebglLayerActive||t.isBlendLayerActive))?(p(),f("div",VR,[a("div",BR,[e[148]||(e[148]=a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"WebGL visual",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"reset-webgl-visual",onClick:e[6]||(e[6]=(...o)=>t.resetDefaultAnimationSettings&&t.resetDefaultAnimationSettings(...o))}," ↺ Reset visual ")]),a("div",{class:"framesync-stack",style:Pt(i.compact?"margin-top:6px;":"margin-top:10px;")},[e[150]||(e[150]=a("div",{class:"framesync-subtitle"},"Animation style",-1)),a("select",{class:"framesync-select",value:t.defaultAnimation.mode,onChange:e[7]||(e[7]=o=>t.setDefaultAnimationMode(o.target.value))},[...e[149]||(e[149]=[$i('',11)])],40,zR)],4),t.defaultAnimation.mode==="instancing"?(p(),f(G,{key:0},[a("div",$R,[e[151]||(e[151]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Instance count",-1)),K(a("input",{class:"framesync-input",type:"range",min:"1000",max:"50000",step:"500","onUpdate:modelValue":e[8]||(e[8]=o=>t.defaultAnimation.instCount=o),onInput:e[9]||(e[9]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.instCount,void 0,{number:!0}]])]),a("div",GR,[e[152]||(e[152]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Spread",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"2.5",step:"0.01","onUpdate:modelValue":e[10]||(e[10]=o=>t.defaultAnimation.spread=o),onInput:e[11]||(e[11]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.spread,void 0,{number:!0}]])]),a("div",HR,[e[153]||(e[153]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Motion rate",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[12]||(e[12]=o=>t.defaultAnimation.speed=o),onInput:e[13]||(e[13]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",WR,[e[154]||(e[154]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Color shift",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[14]||(e[14]=o=>t.defaultAnimation.hue=o),onInput:e[15]||(e[15]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.hue,void 0,{number:!0}]])]),a("div",qR,[e[155]||(e[155]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Shimmer",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[16]||(e[16]=o=>t.defaultAnimation.glow=o),onInput:e[17]||(e[17]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",jR,[e[156]||(e[156]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera depth",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[18]||(e[18]=o=>t.defaultAnimation.orbit=o),onInput:e[19]||(e[19]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.orbit,void 0,{number:!0}]])])],64)):t.defaultAnimation.mode==="customlights"?(p(),f(G,{key:1},[a("div",XR,[e[157]||(e[157]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[20]||(e[20]=o=>t.defaultAnimation.speed=o),onInput:e[21]||(e[21]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",KR,[e[158]||(e[158]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Light radius",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[22]||(e[22]=o=>t.defaultAnimation.glow=o),onInput:e[23]||(e[23]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",YR,[e[159]||(e[159]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Orbit spread",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"2.5",step:"0.01","onUpdate:modelValue":e[24]||(e[24]=o=>t.defaultAnimation.spread=o),onInput:e[25]||(e[25]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.spread,void 0,{number:!0}]])])],64)):t.defaultAnimation.mode==="volume"?(p(),f("div",JR,[e[160]||(e[160]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Beam count",-1)),K(a("input",{class:"framesync-input",type:"range",min:"3",max:"12",step:"1","onUpdate:modelValue":e[26]||(e[26]=o=>t.defaultAnimation.beamCount=o),onInput:e[27]||(e[27]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.beamCount,void 0,{number:!0}]])])):t.defaultAnimation.mode==="orbital"?(p(),f("div",ZR,[e[161]||(e[161]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Orbit size",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.0",step:"0.01","onUpdate:modelValue":e[28]||(e[28]=o=>t.defaultAnimation.orbit=o),onInput:e[29]||(e[29]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.orbit,void 0,{number:!0}]])])):t.defaultAnimation.mode==="nebula"?(p(),f("div",QR,[e[162]||(e[162]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Mist",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[30]||(e[30]=o=>t.defaultAnimation.mist=o),onInput:e[31]||(e[31]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.mist,void 0,{number:!0}]])])):t.defaultAnimation.mode==="raycast"?(p(),f(G,{key:5},[i.compact?N("",!0):(p(),f("div",eL,[e[164]||(e[164]=a("div",{class:"framesync-subtitle"},"Line type",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[32]||(e[32]=o=>t.defaultAnimation.lineType=o),onChange:e[33]||(e[33]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},[...e[163]||(e[163]=[a("option",{value:"segments"},"LineSegmentsGeometry",-1),a("option",{value:"line"},"LineGeometry",-1)])],544),[[Rt,t.defaultAnimation.lineType]])])),a("div",tL,[e[165]||(e[165]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Width",-1)),K(a("input",{class:"framesync-input",type:"range",min:"1",max:"10",step:"0.1","onUpdate:modelValue":e[34]||(e[34]=o=>t.defaultAnimation.lineWidth=o),onInput:e[35]||(e[35]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.lineWidth,void 0,{number:!0}]])]),a("div",iL,[e[166]||(e[166]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Threshold",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"10",step:"0.1","onUpdate:modelValue":e[36]||(e[36]=o=>t.defaultAnimation.lineThreshold=o),onInput:e[37]||(e[37]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.lineThreshold,void 0,{number:!0}]])]),a("div",nL,[e[167]||(e[167]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Translation",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"10",step:"0.1","onUpdate:modelValue":e[38]||(e[38]=o=>t.defaultAnimation.lineTranslation=o),onInput:e[39]||(e[39]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.lineTranslation,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",sL,[e[168]||(e[168]=a("div",{class:"framesync-subtitle"},"Line material",-1)),a("div",rL,[a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.lineWorldUnits}]),onClick:e[40]||(e[40]=o=>{t.defaultAnimation.lineWorldUnits=!0,t.onDefaultAnimationInput()})},"World units",2),a("button",{type:"button",class:U(["chip",{active:!t.defaultAnimation.lineWorldUnits}]),onClick:e[41]||(e[41]=o=>{t.defaultAnimation.lineWorldUnits=!1,t.onDefaultAnimationInput()})},"Pixels",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.lineAlphaToCoverage}]),onClick:e[42]||(e[42]=o=>{t.defaultAnimation.lineAlphaToCoverage=!t.defaultAnimation.lineAlphaToCoverage,t.onDefaultAnimationInput()})},"Alpha coverage",2)])])),i.compact?N("",!0):(p(),f("div",oL,[e[169]||(e[169]=a("div",{class:"framesync-subtitle"},"Behavior",-1)),a("div",aL,[a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.lineVisualizeThreshold}]),onClick:e[43]||(e[43]=o=>{t.defaultAnimation.lineVisualizeThreshold=!t.defaultAnimation.lineVisualizeThreshold,t.onDefaultAnimationInput()})},"Visualize threshold",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.lineAnimate}]),onClick:e[44]||(e[44]=o=>{t.defaultAnimation.lineAnimate=!t.defaultAnimation.lineAnimate,t.onDefaultAnimationInput()})},"Animate",2)])]))],64)):t.defaultAnimation.mode==="marching"?(p(),f(G,{key:6},[i.compact?N("",!0):(p(),f("div",lL,[e[171]||(e[171]=a("div",{class:"framesync-subtitle"},"Material",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[45]||(e[45]=o=>t.defaultAnimation.mcMaterial=o),onChange:e[46]||(e[46]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},[...e[170]||(e[170]=[$i('',8)])],544),[[Rt,t.defaultAnimation.mcMaterial]])])),a("div",uL,[e[172]||(e[172]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"8",step:"0.05","onUpdate:modelValue":e[47]||(e[47]=o=>t.defaultAnimation.speed=o),onInput:e[48]||(e[48]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",dL,[e[173]||(e[173]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Blob count",-1)),K(a("input",{class:"framesync-input",type:"range",min:"1",max:"50",step:"1","onUpdate:modelValue":e[49]||(e[49]=o=>t.defaultAnimation.mcNumBlobs=o),onInput:e[50]||(e[50]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.mcNumBlobs,void 0,{number:!0}]])]),a("div",cL,[e[174]||(e[174]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Resolution",-1)),K(a("input",{class:"framesync-input",type:"range",min:"14",max:"100",step:"1","onUpdate:modelValue":e[51]||(e[51]=o=>t.defaultAnimation.mcResolution=o),onInput:e[52]||(e[52]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.mcResolution,void 0,{number:!0}]])]),a("div",hL,[e[175]||(e[175]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Isolation",-1)),K(a("input",{class:"framesync-input",type:"range",min:"10",max:"300",step:"1","onUpdate:modelValue":e[53]||(e[53]=o=>t.defaultAnimation.mcIsolation=o),onInput:e[54]||(e[54]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.mcIsolation,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",mL,[e[176]||(e[176]=a("div",{class:"framesync-subtitle"},"Field helpers",-1)),a("div",pL,[a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.mcFloor}]),onClick:e[55]||(e[55]=o=>{t.defaultAnimation.mcFloor=!t.defaultAnimation.mcFloor,t.onDefaultAnimationInput()})},"Floor",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.mcWallX}]),onClick:e[56]||(e[56]=o=>{t.defaultAnimation.mcWallX=!t.defaultAnimation.mcWallX,t.onDefaultAnimationInput()})},"Wall X",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.mcWallZ}]),onClick:e[57]||(e[57]=o=>{t.defaultAnimation.mcWallZ=!t.defaultAnimation.mcWallZ,t.onDefaultAnimationInput()})},"Wall Z",2)])]))],64)):t.defaultAnimation.mode==="periodic_table"?(p(),f(G,{key:7},[i.compact?N("",!0):(p(),f("div",fL,[e[177]||(e[177]=a("div",{class:"framesync-subtitle"},"Layout",-1)),a("div",gL,[(p(),f(G,null,re(["table","sphere","helix","grid"],o=>a("button",{key:"pt-layout-"+o,type:"button",class:U(["chip",{active:t.defaultAnimation.ptLayout===o}]),"data-testid":"pt-layout-"+o,onClick:u=>{t.defaultAnimation.ptLayout=o,t.onDefaultAnimationInput()}},_(o),11,yL)),64))])])),a("div",vL,[e[178]||(e[178]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Transition (ms)",-1)),K(a("input",{class:"framesync-input",type:"range",min:"400",max:"6000",step:"100","onUpdate:modelValue":e[58]||(e[58]=o=>t.defaultAnimation.ptTransitionMs=o),"data-testid":"pt-transition-ms",onInput:e[59]||(e[59]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptTransitionMs,void 0,{number:!0}]])]),a("div",bL,[e[179]||(e[179]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Layout spacing",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.5",max:"1.5",step:"0.01","onUpdate:modelValue":e[60]||(e[60]=o=>t.defaultAnimation.ptSpacing=o),onInput:e[61]||(e[61]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptSpacing,void 0,{number:!0}]])]),a("div",_L,[e[180]||(e[180]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Card opacity",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.15",max:"0.85",step:"0.01","onUpdate:modelValue":e[62]||(e[62]=o=>t.defaultAnimation.ptCardOpacity=o),onInput:e[63]||(e[63]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptCardOpacity,void 0,{number:!0}]])]),a("div",SL,[e[181]||(e[181]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Card scale",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.6",max:"1.4",step:"0.01","onUpdate:modelValue":e[64]||(e[64]=o=>t.defaultAnimation.ptCardScale=o),onInput:e[65]||(e[65]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptCardScale,void 0,{number:!0}]])]),a("div",wL,[e[182]||(e[182]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Card tint",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[66]||(e[66]=o=>t.defaultAnimation.ptHue=o),onInput:e[67]||(e[67]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptHue,void 0,{number:!0}]])]),a("div",ML,[e[183]||(e[183]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera distance",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[68]||(e[68]=o=>t.defaultAnimation.orbit=o),onInput:e[69]||(e[69]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.orbit,void 0,{number:!0}]])]),a("div",xL,[e[184]||(e[184]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera speed",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[70]||(e[70]=o=>t.defaultAnimation.speed=o),onInput:e[71]||(e[71]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",PL,[e[185]||(e[185]=a("div",{class:"framesync-subtitle"},"Auto cycle",-1)),a("div",TL,[a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.ptAutoCycle}]),"data-testid":"pt-auto-cycle",onClick:e[72]||(e[72]=o=>{t.defaultAnimation.ptAutoCycle=!t.defaultAnimation.ptAutoCycle,t.onDefaultAnimationInput()})},"Cycle layouts",2)])])),t.defaultAnimation.ptAutoCycle?(p(),f("div",AL,[e[186]||(e[186]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cycle interval (s)",-1)),K(a("input",{class:"framesync-input",type:"range",min:"3",max:"30",step:"1","onUpdate:modelValue":e[73]||(e[73]=o=>t.defaultAnimation.ptAutoCycleSec=o),onInput:e[74]||(e[74]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ptAutoCycleSec,void 0,{number:!0}]])])):N("",!0),i.compact?N("",!0):(p(),f("p",CL,[...e[187]||(e[187]=[ie(" 118 element cards in 3D layouts using CSS3DRenderer — from the ",-1),a("a",{href:"https://threejs.org/examples/#css3d_periodictable",target:"_blank",rel:"noopener noreferrer"},"three.js CSS3D periodic table",-1),ie(" example. ",-1)])]))],64)):t.defaultAnimation.mode==="protoplanet"?(p(),f(G,{key:8},[a("div",EL,[e[188]||(e[188]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Gravity",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1000",step:"1","onUpdate:modelValue":e[75]||(e[75]=o=>t.defaultAnimation.ppGravityConstant=o),"data-testid":"pp-gravity",onInput:e[76]||(e[76]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppGravityConstant,void 0,{number:!0}]])]),a("div",kL,[e[189]||(e[189]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Density",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.001",max:"10",step:"0.001","onUpdate:modelValue":e[77]||(e[77]=o=>t.defaultAnimation.ppDensity=o),onInput:e[78]||(e[78]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppDensity,void 0,{number:!0}]])]),a("div",RL,[e[190]||(e[190]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Disk radius",-1)),K(a("input",{class:"framesync-input",type:"range",min:"10",max:"1000",step:"1","onUpdate:modelValue":e[79]||(e[79]=o=>t.defaultAnimation.ppRadius=o),onInput:e[80]||(e[80]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppRadius,void 0,{number:!0}]])]),a("div",LL,[e[191]||(e[191]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Initial velocity",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"150",step:"0.5","onUpdate:modelValue":e[81]||(e[81]=o=>t.defaultAnimation.ppVelocity=o),onInput:e[82]||(e[82]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppVelocity,void 0,{number:!0}]])]),a("div",DL,[e[192]||(e[192]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Vertical spread",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"50",step:"0.1","onUpdate:modelValue":e[83]||(e[83]=o=>t.defaultAnimation.ppHeight=o),onInput:e[84]||(e[84]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppHeight,void 0,{number:!0}]])]),a("div",IL,[e[193]||(e[193]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Radial exponent",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"2",step:"0.01","onUpdate:modelValue":e[85]||(e[85]=o=>t.defaultAnimation.ppExponent=o),onInput:e[86]||(e[86]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppExponent,void 0,{number:!0}]])]),a("div",FL,[e[194]||(e[194]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Max particle mass",-1)),K(a("input",{class:"framesync-input",type:"range",min:"1",max:"50",step:"0.1","onUpdate:modelValue":e[87]||(e[87]=o=>t.defaultAnimation.ppMaxMass=o),onInput:e[88]||(e[88]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppMaxMass,void 0,{number:!0}]])]),a("div",NL,[e[195]||(e[195]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Debris tint",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[89]||(e[89]=o=>t.defaultAnimation.ppHue=o),onInput:e[90]||(e[90]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ppHue,void 0,{number:!0}]])]),a("div",OL,[e[196]||(e[196]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera orbit",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[91]||(e[91]=o=>t.defaultAnimation.orbit=o),onInput:e[92]||(e[92]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.orbit,void 0,{number:!0}]])]),a("div",UL,[e[197]||(e[197]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Camera speed",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[93]||(e[93]=o=>t.defaultAnimation.speed=o),onInput:e[94]||(e[94]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",VL,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"pp-restart-simulation",onClick:e[95]||(e[95]=(...o)=>t.restartProtoplanetSimulation&&t.restartProtoplanetSimulation(...o))}," Restart simulation ")])),i.compact?N("",!0):(p(),f("p",BL,[...e[198]||(e[198]=[ie(" GPU particle disk with gravity and merging — from the ",-1),a("a",{href:"https://threejs.org/examples/#webgl_gpgpu_protoplanet",target:"_blank",rel:"noopener noreferrer"},"three.js GPGPU protoplanet",-1),ie(" example. Disk layout changes apply on restart; gravity and density update live. ",-1)])]))],64)):t.defaultAnimation.mode==="transition"?(p(),f(G,{key:9},[a("div",zL,[e[199]||(e[199]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Mix (A↔B)",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[96]||(e[96]=o=>t.defaultAnimation.txTransition=o),"data-testid":"tx-transition-mix",disabled:t.defaultAnimation.txTransitionAnimate,onInput:e[97]||(e[97]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,40,$L),[[ae,t.defaultAnimation.txTransition,void 0,{number:!0}]])]),a("div",GL,[e[200]||(e[200]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Mask threshold",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[98]||(e[98]=o=>t.defaultAnimation.txThreshold=o),onInput:e[99]||(e[99]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.txThreshold,void 0,{number:!0}]])]),a("div",HL,[e[201]||(e[201]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Instance count",-1)),K(a("input",{class:"framesync-input",type:"range",min:"100",max:"2000",step:"50","onUpdate:modelValue":e[100]||(e[100]=o=>t.defaultAnimation.instCount=o),onInput:e[101]||(e[101]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.instCount,void 0,{number:!0}]])]),a("div",WL,[e[202]||(e[202]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Scene spin",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[102]||(e[102]=o=>t.defaultAnimation.speed=o),onInput:e[103]||(e[103]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",qL,[e[203]||(e[203]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Spin spread",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"2.5",step:"0.01","onUpdate:modelValue":e[104]||(e[104]=o=>t.defaultAnimation.spread=o),onInput:e[105]||(e[105]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.spread,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",jL,[e[205]||(e[205]=a("div",{class:"framesync-subtitle"},"Dissolve mask",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[106]||(e[106]=o=>t.defaultAnimation.txTexture=o),"data-testid":"tx-transition-texture",onChange:e[107]||(e[107]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},[...e[204]||(e[204]=[a("option",{value:0},"Perlin",-1),a("option",{value:1},"Squares",-1),a("option",{value:2},"Cells",-1),a("option",{value:3},"Distort",-1),a("option",{value:4},"Gradient",-1),a("option",{value:5},"Radial",-1)])],544),[[Rt,t.defaultAnimation.txTexture,void 0,{number:!0}]])])),i.compact?N("",!0):(p(),f("div",XL,[e[206]||(e[206]=a("div",{class:"framesync-subtitle"},"Transition",-1)),a("div",KL,[a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.txSceneAnimate}]),"data-testid":"tx-scene-animate",onClick:e[108]||(e[108]=o=>{t.defaultAnimation.txSceneAnimate=!t.defaultAnimation.txSceneAnimate,t.onDefaultAnimationInput()})},"Animate scenes",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.txTransitionAnimate}]),"data-testid":"tx-transition-animate",onClick:e[109]||(e[109]=o=>{t.defaultAnimation.txTransitionAnimate=!t.defaultAnimation.txTransitionAnimate,t.onDefaultAnimationInput()})},"Animate mix",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.txUseTexture}]),onClick:e[110]||(e[110]=o=>{t.defaultAnimation.txUseTexture=!t.defaultAnimation.txUseTexture,t.onDefaultAnimationInput()})},"Use mask texture",2),a("button",{type:"button",class:U(["chip",{active:t.defaultAnimation.txCycle}]),disabled:!t.defaultAnimation.txTransitionAnimate,onClick:e[111]||(e[111]=o=>{t.defaultAnimation.txCycle=!t.defaultAnimation.txCycle,t.onDefaultAnimationInput()})},"Cycle masks",10,YL)])])),i.compact?N("",!0):(p(),f("p",JL,[...e[207]||(e[207]=[ie(" Cross-fades two instanced scenes (cubes vs icosahedra) with optional dissolve masks — based on the ",-1),a("a",{href:"https://threejs.org/examples/#webgl_postprocessing_transition",target:"_blank",rel:"noopener noreferrer"},"three.js postprocessing transition",-1),ie(" example. ",-1)])]))],64)):t.defaultAnimation.mode==="ocean"?(p(),f(G,{key:10},[a("div",ZL,[e[208]||(e[208]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Sun elevation",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"90",step:"0.1","onUpdate:modelValue":e[112]||(e[112]=o=>t.defaultAnimation.ocElevation=o),onInput:e[113]||(e[113]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocElevation,void 0,{number:!0}]])]),a("div",QL,[e[209]||(e[209]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Sun azimuth",-1)),K(a("input",{class:"framesync-input",type:"range",min:"-180",max:"180",step:"0.1","onUpdate:modelValue":e[114]||(e[114]=o=>t.defaultAnimation.ocAzimuth=o),onInput:e[115]||(e[115]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocAzimuth,void 0,{number:!0}]])]),a("div",e3,[e[210]||(e[210]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Exposure",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.0001","onUpdate:modelValue":e[116]||(e[116]=o=>t.defaultAnimation.ocExposure=o),onInput:e[117]||(e[117]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocExposure,void 0,{number:!0}]])]),a("div",t3,[e[211]||(e[211]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Distortion scale",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"8",step:"0.1","onUpdate:modelValue":e[118]||(e[118]=o=>t.defaultAnimation.ocDistortion=o),onInput:e[119]||(e[119]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocDistortion,void 0,{number:!0}]])]),a("div",i3,[e[212]||(e[212]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Wave size",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"10",step:"0.1","onUpdate:modelValue":e[120]||(e[120]=o=>t.defaultAnimation.ocSize=o),onInput:e[121]||(e[121]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocSize,void 0,{number:!0}]])]),i.compact?N("",!0):(p(),f("div",n3,[e[213]||(e[213]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud coverage",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[122]||(e[122]=o=>t.defaultAnimation.ocCloudCoverage=o),onInput:e[123]||(e[123]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocCloudCoverage,void 0,{number:!0}]])])),i.compact?N("",!0):(p(),f("div",s3,[e[214]||(e[214]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud density",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[124]||(e[124]=o=>t.defaultAnimation.ocCloudDensity=o),onInput:e[125]||(e[125]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocCloudDensity,void 0,{number:!0}]])])),i.compact?N("",!0):(p(),f("div",r3,[e[215]||(e[215]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Cloud elevation",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[126]||(e[126]=o=>t.defaultAnimation.ocCloudElevation=o),onInput:e[127]||(e[127]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.ocCloudElevation,void 0,{number:!0}]])]))],64)):["raycast","marching","ocean","instancing","transition","protoplanet","periodic_table","interactive_points","interactive_raycast_points","lensflares"].includes(t.defaultAnimation.mode)?N("",!0):(p(),f(G,{key:11},[a("div",o3,[e[216]||(e[216]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Speed",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"2.5",step:"0.01","onUpdate:modelValue":e[128]||(e[128]=o=>t.defaultAnimation.speed=o),onInput:e[129]||(e[129]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.speed,void 0,{number:!0}]])]),a("div",a3,[e[217]||(e[217]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Spread",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.2",max:"1.4",step:"0.01","onUpdate:modelValue":e[130]||(e[130]=o=>t.defaultAnimation.spread=o),onInput:e[131]||(e[131]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.spread,void 0,{number:!0}]])]),a("div",l3,[e[218]||(e[218]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Glow",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0.1",max:"1.4",step:"0.01","onUpdate:modelValue":e[132]||(e[132]=o=>t.defaultAnimation.glow=o),onInput:e[133]||(e[133]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.glow,void 0,{number:!0}]])]),a("div",u3,[e[219]||(e[219]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Hue",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[134]||(e[134]=o=>t.defaultAnimation.hue=o),onInput:e[135]||(e[135]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.hue,void 0,{number:!0}]])]),a("div",d3,[e[220]||(e[220]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Pulse",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[136]||(e[136]=o=>t.defaultAnimation.pulse=o),onInput:e[137]||(e[137]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.pulse,void 0,{number:!0}]])]),a("div",c3,[e[221]||(e[221]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Drift",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[138]||(e[138]=o=>t.defaultAnimation.drift=o),onInput:e[139]||(e[139]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.drift,void 0,{number:!0}]])])],64))])):N("",!0),i.showCompositor&&!i.forcePerformance&&t.showForgeOverWebgl?(p(),f("div",h3,[e[223]||(e[223]=a("div",{class:"live-engine-controls__section-head"},[a("span",{class:"framesync-subtitle live-engine-controls__section-title"},"Layer over WebGL")],-1)),a("div",m3,[e[222]||(e[222]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge opacity",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[140]||(e[140]=o=>t.defaultAnimation.forgeLayerOpacity=o),"data-testid":"forge-layer-opacity",onInput:e[141]||(e[141]=o=>{t.defaultAnimation.forgeLayerOpacityLfoBase=t.defaultAnimation.forgeLayerOpacity,t.onDefaultAnimationInput()})},null,544),[[ae,t.defaultAnimation.forgeLayerOpacity,void 0,{number:!0}]])]),e[224]||(e[224]=a("p",{class:"framesync-subtitle live-engine-controls__hint"}," Set to 0 to hide Deforum/WAN preview frames over the WebGL stage. Blend mode uses screen compositing. ",-1))])):N("",!0)],2)}const f3=it(kR,[["render",p3]]),g3={name:"WebGLPluginPanel",components:{LiveEngineControls:f3},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}};function y3(t,e,i,n,s,r){const l=Ie("LiveEngineControls");return p(),ht(l,{app:i.app,"show-compositor":!1,"show-webgl":!0,"force-webgl":""},null,8,["app"])}const v3=it(g3,[["render",y3]]),b3={name:"DeforumJobToolbar",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},_3={class:"deforum-job-toolbar framesync-panel","data-testid":"deforum-job-toolbar"},S3={class:"deforum-job-toolbar__head"},w3={class:"framesync-subtitle deforum-job-toolbar__summary"},M3={class:"deforum-job-toolbar__actions"},x3=["disabled","title"],P3=["disabled"],T3=["disabled"],A3=["disabled"],C3={class:"deforum-advanced-toggle"},E3={key:0,class:"deforum-advanced-json"},k3={key:0,class:"deforum-json-error"},R3={key:1,class:"framesync-subtitle deforum-job-toolbar__status"};function L3(t,e,i,n,s,r){return p(),f("div",_3,[a("div",S3,[a("span",{class:U(["perf-mode-badge",t.deforumPlaying?"mode-animate":"mode-preview"])},_(t.deforumPlaying?"Animating":"Ready"),3),a("p",w3,[e[10]||(e[10]=ie(" Batch ",-1)),a("strong",null,_(t.deforumSettings.batch_name||"—"),1),ie(" · "+_(t.deforumSettings.max_frames||0)+" frames @ "+_(t.deforumSettings.fps||24)+" fps ",1)])]),a("div",M3,[a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{active:t.deforumPlaying}]),onClick:e[0]||(e[0]=(...l)=>t.toggleDeforumPlay&&t.toggleDeforumPlay(...l))},_(t.deforumPlaying?"Pause":"Play"),3),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=(...l)=>t.stopDeforumPlay&&t.stopDeforumPlay(...l))},"Stop"),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"deforum-undo-segment-toolbar",disabled:!t.deforumContinuationCanUndo,title:t.deforumContinuationUndoTitle,onClick:e[2]||(e[2]=(...l)=>t.undoDeforumContinuationSegment&&t.undoDeforumContinuationSegment(...l))},"Undo segment",8,x3),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.previewGenerating,onClick:e[3]||(e[3]=(...l)=>t.generateDeforumPreviewFrame&&t.generateDeforumPreviewFrame(...l))},_(t.previewGenerating?"…":"Preview frame"),9,P3),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.deforumSettingsLoading,onClick:e[4]||(e[4]=(...l)=>t.loadDeforumSettings&&t.loadDeforumSettings(...l))}," Reload ",8,T3),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.deforumSettingsSaving,onClick:e[5]||(e[5]=(...l)=>t.saveDeforumSettings&&t.saveDeforumSettings(...l))}," Save ",8,A3),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"deforum-settings-verify",onClick:e[6]||(e[6]=(...l)=>t.runDeforumSettingsVerify&&t.runDeforumSettingsVerify(...l))}," Verify "),a("label",C3,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[7]||(e[7]=l=>t.deforumAdvancedOpen=l)},null,512),[[Ci,t.deforumAdvancedOpen]]),e[11]||(e[11]=ie(" JSON ",-1))])]),t.deforumAdvancedOpen?(p(),f("div",E3,[K(a("textarea",{class:"framesync-input deforum-json-editor","onUpdate:modelValue":e[8]||(e[8]=l=>t.deforumSettingsJson=l),rows:"8",spellcheck:"false",onBlur:e[9]||(e[9]=(...l)=>t.applyDeforumSettingsJson&&t.applyDeforumSettingsJson(...l))},null,544),[[ae,t.deforumSettingsJson]]),t.deforumSettingsJsonError?(p(),f("p",k3,_(t.deforumSettingsJsonError),1)):N("",!0)])):N("",!0),t.deforumSettingsStatus?(p(),f("p",R3,_(t.deforumSettingsStatus),1)):N("",!0)])}const D3=it(b3,[["render",L3]]),I3={translation_x:{key:"translation_x",label:"Pan X",shortLabel:"X",icon:"arrow-right",range:null},translation_y:{key:"translation_y",label:"Pan Y",shortLabel:"Y",icon:"chevron-up",range:null},translation_z:{key:"translation_z",label:"Depth Z",shortLabel:"Z",icon:"panel-bottom",range:10},angle:{key:"angle",label:"Angle",shortLabel:"Ang",icon:"rotate-ccw",range:1},zoom:{key:"zoom",label:"Zoom",shortLabel:"Zm",icon:"size-full",range:1},rotation_z:{key:"rotation_z",label:"Tilt",shortLabel:"Tlt",icon:"rotate-ccw",range:180}};function Rf(t){return I3[t]||null}function F3(t,e,i){const n=(i||[]).map(r=>r.key).filter(Boolean);if(!n.length)return t;let s=Math.max(0,n.indexOf(t));for(let r=0;r[]},variant:{type:String,default:"move"},testId:{type:String,default:"xy-controller"},showReadout:{type:Boolean,default:!0},compact:{type:Boolean,default:!0},springBack:{type:Boolean,default:!0},springDurationMs:{type:Number,default:280}},emits:["input","drag-start","release","update:xAxis","update:yAxis"],data(){return{normX:0,normY:0,dragging:!1,springing:!1,_springRaf:null,_activePointerId:null}},computed:{xAxisMeta(){return Rf(this.xAxis)||{label:this.xAxis,icon:"sliders"}},yAxisMeta(){return Rf(this.yAxis)||{label:this.yAxis,icon:"sliders"}},xAxisLabel(){return this.xAxisMeta.label||this.xAxis},yAxisLabel(){return this.yAxisMeta.label||this.yAxis},xAxisIcon(){return this.xAxisMeta.icon||"sliders"},yAxisIcon(){return this.yAxisMeta.icon||"sliders"},puckStyle(){const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1),i=this.dragging||this.springing?this.normX*t:Number(this.x)||0,n=this.dragging||this.springing?this.normY*e:Number(this.y)||0,s=(i/t+1)*50,r=(1-(n/e+1)*.5)*100;return{left:Math.min(100,Math.max(0,s))+"%",top:Math.min(100,Math.max(0,r))+"%"}},readoutText(){const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1),i=this.dragging||this.springing?this.normX*t:Number(this.x)||0,n=this.dragging||this.springing?this.normY*e:Number(this.y)||0;return i.toFixed(2)+", "+n.toFixed(2)}},watch:{x(){this.syncFromProps()},y(){this.syncFromProps()},rangeX(){this.syncFromProps()},rangeY(){this.syncFromProps()},xAxis(){this.syncFromProps()},yAxis(){this.syncFromProps()}},mounted(){this.syncFromProps()},beforeUnmount(){this.cancelSpring()},methods:{cycleAxis(t){const e=t==="x"?this.xAxis:this.yAxis,i=t==="x"?this.yAxis:this.xAxis,n=F3(e,i,this.axisOptions);n!==e&&this.$emit(t==="x"?"update:xAxis":"update:yAxis",n)},syncFromProps(){if(this.dragging||this.springing)return;const t=Math.max(1e-4,Number(this.rangeX)||1),e=Math.max(1e-4,Number(this.rangeY)||1);this.normX=this.clampNorm((Number(this.x)||0)/t),this.normY=this.clampNorm((Number(this.y)||0)/e)},clampNorm(t){const e=Number(t);return Number.isFinite(e)?Math.max(-1,Math.min(1,e)):0},padRect(){const t=this.$refs.padEl;return t?t.getBoundingClientRect():{left:0,top:0,width:1,height:1}},pointerToNorm(t,e){const i=this.padRect(),n=i.width||1,s=i.height||1,r=Math.max(0,Math.min(n,t-i.left)),l=Math.max(0,Math.min(s,e-i.top));return{normX:this.clampNorm(r/n*2-1),normY:this.clampNorm(1-l/s*2)}},emitValues(){const t=Number(this.rangeX)||1,e=Number(this.rangeY)||1;this.$emit("input",{x:this.normX*t,y:this.normY*e,normX:this.normX,normY:this.normY,xAxis:this.xAxis,yAxis:this.yAxis,dragging:this.dragging,springing:this.springing})},cancelSpring(){this._springRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._springRaf),this._springRaf=null,this.springing=!1},startSpringBack(){if(!this.springBack){this.emitValues();return}this.cancelSpring(),this.springing=!0;const t=this.normX,e=this.normY;if(Math.abs(t)<.001&&Math.abs(e)<.001){this.normX=0,this.normY=0,this.springing=!1,this.emitValues();return}const i=performance.now(),n=Math.max(80,Number(this.springDurationMs)||280),s=r=>{const l=Math.min(1,(r-i)/n),o=1-Math.pow(1-l,2.6);if(this.normX=t*(1-o),this.normY=e*(1-o),this.emitValues(),l<1){this._springRaf=requestAnimationFrame(s);return}this.normX=0,this.normY=0,this.springing=!1,this._springRaf=null,this.emitValues()};this._springRaf=requestAnimationFrame(s)},onPointerDown(t){if(this._activePointerId!=null)return;this.cancelSpring(),this.dragging=!0,this._activePointerId=t.pointerId;try{t.currentTarget.setPointerCapture(t.pointerId)}catch{}const{normX:e,normY:i}=this.pointerToNorm(t.clientX,t.clientY);this.normX=e,this.normY=i,this.$emit("drag-start"),this.emitValues(),t.preventDefault()},onPointerMove(t){if(!this.dragging||t.pointerId!==this._activePointerId)return;const{normX:e,normY:i}=this.pointerToNorm(t.clientX,t.clientY);this.normX=e,this.normY=i,this.emitValues(),t.preventDefault()},onPointerUp(t){t.pointerId===this._activePointerId&&this.finishDrag(t.currentTarget,t.pointerId)},onPointerLeave(t){!this.dragging||t.pointerId!==this._activePointerId||this.finishDrag(t.currentTarget,t.pointerId)},finishDrag(t,e){if(this.dragging){try{t.releasePointerCapture(e)}catch{}this.dragging=!1,this._activePointerId=null,this.$emit("release"),this.startSpringBack()}}}},O3=["data-testid"],U3={class:"xy-controller__chrome"},V3=["title","data-testid"],B3={key:0,class:"xy-controller__readout motion-readout"},z3=["title","data-testid"],$3={key:0,class:"motion-pad-hero__readout motion-readout"};function G3(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("div",{class:U(["xy-controller",["xy-controller--"+(i.compact?"compact":"regular"),"xy-controller--"+i.variant,{"xy-controller--dragging":s.dragging,"xy-controller--spring":s.springing,"xy-controller--latched":!i.springBack}]]),"data-testid":i.testId},[a("div",U3,[a("button",{type:"button",class:"xy-controller__axis-btn xy-controller__axis-btn--x",title:"X axis: "+r.xAxisLabel+" — click to change","data-testid":i.testId+"-axis-x",onClick:e[0]||(e[0]=o=>r.cycleAxis("x"))},[ve(l,{name:r.xAxisIcon},null,8,["name"]),e[7]||(e[7]=a("span",{class:"xy-controller__axis-tag"},"X",-1))],8,V3),i.compact&&i.showReadout?(p(),f("code",B3,_(r.readoutText),1)):N("",!0),a("button",{type:"button",class:"xy-controller__axis-btn xy-controller__axis-btn--y",title:"Y axis: "+r.yAxisLabel+" — click to change","data-testid":i.testId+"-axis-y",onClick:e[1]||(e[1]=o=>r.cycleAxis("y"))},[ve(l,{name:r.yAxisIcon},null,8,["name"]),e[8]||(e[8]=a("span",{class:"xy-controller__axis-tag"},"Y",-1))],8,z3)]),a("div",{ref:"padEl",class:U(["xy-controller__pad motion-pad-hero","motion-pad-hero--"+i.variant]),onPointerdown:e[2]||(e[2]=(...o)=>r.onPointerDown&&r.onPointerDown(...o)),onPointermove:e[3]||(e[3]=(...o)=>r.onPointerMove&&r.onPointerMove(...o)),onPointerup:e[4]||(e[4]=(...o)=>r.onPointerUp&&r.onPointerUp(...o)),onPointercancel:e[5]||(e[5]=(...o)=>r.onPointerUp&&r.onPointerUp(...o)),onPointerleave:e[6]||(e[6]=(...o)=>r.onPointerLeave&&r.onPointerLeave(...o))},[e[9]||(e[9]=a("div",{class:"motion-pad-hero__crosshair motion-pad-hero__crosshair--x"},null,-1)),e[10]||(e[10]=a("div",{class:"motion-pad-hero__crosshair motion-pad-hero__crosshair--y"},null,-1)),a("div",{class:U(["motion-pad-hero__puck",{"motion-pad-hero__puck--look":i.variant==="look"}]),style:Pt(r.puckStyle)},null,6),!i.compact&&i.showReadout?(p(),f("code",$3,_(r.readoutText),1)):N("",!0)],34)],10,O3)}const H3=it(N3,[["render",G3]]),W3={name:"DeforumMotionPads",components:{XYController:H3,UiIcon:oi},props:{app:{type:Object,required:!0},hero:{type:Boolean,default:!1},compact:{type:Boolean,default:!0},showReadout:{type:Boolean,default:!0},showAxisSliders:{type:Boolean,default:!0}},setup(t){return Tt(t)}},q3={key:0,class:"deforum-control-panel__section-head"},j3={key:0,class:"deforum-motion-pads__readout motion-readout"},X3={class:"deforum-motion-pads__mode-row"},K3=["title"],Y3={class:"motion-controls-compact","data-testid":"motion-controls-compact"},J3={key:1,class:"motion-axis-sliders motion-axis-sliders--2d"},Z3={class:"motion-axis-slider"},Q3=["value"],eD={class:"motion-axis-slider__value motion-readout"},tD={class:"motion-axis-slider"},iD=["value"],nD={class:"motion-axis-slider__value motion-readout"},sD={key:2,class:"motion-axis-sliders"},rD={class:"motion-axis-slider"},oD=["value"],aD={class:"motion-axis-slider__value motion-readout"},lD={class:"motion-axis-slider"},uD=["value"],dD={class:"motion-axis-slider__value motion-readout"},cD={class:"motion-axis-slider"},hD=["value"],mD={class:"motion-axis-slider__value motion-readout"};function pD(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("XYController");return p(),f("section",{class:U(["deforum-motion-pads",{"deforum-motion-pads--hero":i.hero,"deforum-motion-pads--compact":i.compact}]),"data-testid":"deforum-motion-pads"},[i.compact?N("",!0):(p(),f("div",q3,[e[11]||(e[11]=a("span",{class:"framesync-subtitle deforum-control-panel__section-title"},"Camera XY",-1)),i.showReadout&&!i.hero?(p(),f("code",j3,[t.isDeforumMotion2d?(p(),f(G,{key:0},[ie(" Move "+_(t.motionPadReadout.x.toFixed(2))+", "+_(t.motionPadReadout.y.toFixed(2))+", Zoom "+_(t.motionPadReadout.zoom.toFixed(2))+", Tilt "+_(t.motionPadReadout.lookX.toFixed(2)),1)],64)):(p(),f(G,{key:1},[ie(" X "+_(t.motionPadReadout.x.toFixed(2))+", Y "+_(t.motionPadReadout.y.toFixed(2))+", Z "+_(t.motionPadReadout.z.toFixed(2))+", Zoom "+_(t.motionPadReadout.zoom.toFixed(2))+", Tilt "+_(t.motionPadReadout.tilt.toFixed(2)),1)],64))])):N("",!0)])),a("div",X3,[e[12]||(e[12]=a("span",{class:"deforum-motion-pads__mode-label"},"XY pad",-1)),a("button",{type:"button",class:U(["framesync-button framesync-button--compact deforum-motion-pads__mode-btn",{"framesync-button--live":!t.motionPadSpringBack}]),"data-testid":"motion-pad-latch-toggle",title:t.motionPadSpringBack?"Spring: puck returns to center when you let go":"Latch: puck stays where you leave it",onClick:e[0]||(e[0]=u=>t.toggleMotionPadSpringBack())},[ve(l,{name:t.motionPadSpringBack?"move":"lock"},null,8,["name"]),ie(" "+_(t.motionPadSpringBack?"Spring":"Latch"),1)],10,K3)]),a("div",Y3,[(p(!0),f(G,null,re(t.motionXYPadSlots,u=>(p(),ht(o,{key:u.id,compact:"","spring-back":t.motionPadSpringBack,x:t.motionAxisTargetValue(u.xAxis),y:t.motionAxisTargetValue(u.yAxis),"range-x":t.motionAxisRangeForKey(u.xAxis),"range-y":t.motionAxisRangeForKey(u.yAxis),"x-axis":u.xAxis,"y-axis":u.yAxis,"axis-options":t.motionAxisOptionsList,variant:u.id==="look"?"look":"move","test-id":u.id==="primary"?"motion-pad-move":u.id==="look"?"motion-pad-look":"motion-pad-"+u.id,"onUpdate:xAxis":c=>t.setMotionXYPadAxis(u.id,"x",c),"onUpdate:yAxis":c=>t.setMotionXYPadAxis(u.id,"y",c),onDragStart:c=>t.motionPadDragStart(u.id),onInput:c=>t.applyMotionPadAxisValues(c.xAxis||u.xAxis,c.yAxis||u.yAxis,c.x,c.y,{previewOnly:c.dragging&&t.motionSmoothnessActive()}),onRelease:c=>t.motionPadMouseUp(u.id)},null,8,["spring-back","x","y","range-x","range-y","x-axis","y-axis","axis-options","variant","test-id","onUpdate:xAxis","onUpdate:yAxis","onDragStart","onInput","onRelease"]))),128))]),i.showAxisSliders&&t.isDeforumMotion2d?(p(),f("div",J3,[a("label",Z3,[e[13]||(e[13]=a("span",{class:"motion-axis-slider__label"},"Zoom",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-1",max:"1",step:"0.01","data-testid":"motion-zoom-slider",value:t.motionAxisTargetValue("zoom"),onInput:e[1]||(e[1]=u=>t.motionSmoothnessActive()?t.previewMotionAxis("zoom",u.target.value):t.setMotionAxis("zoom",u.target.value)),onChange:e[2]||(e[2]=u=>t.motionSmoothnessActive()&&t.setMotionAxis("zoom",u.target.value))},null,40,Q3),a("code",eD,_(t.motionAxisTargetValue("zoom").toFixed(2)),1)]),a("label",tD,[e[14]||(e[14]=a("span",{class:"motion-axis-slider__label"},"Tilt",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-1",max:"1",step:"0.01","data-testid":"motion-tilt-slider",value:t.motionAxisTargetValue("angle"),onInput:e[3]||(e[3]=u=>t.motionSmoothnessActive()?t.previewMotionAxis("angle",u.target.value):t.setMotionAxis("angle",u.target.value)),onChange:e[4]||(e[4]=u=>t.motionSmoothnessActive()&&t.setMotionAxis("angle",u.target.value))},null,40,iD),a("code",nD,_(t.motionAxisTargetValue("angle").toFixed(2)),1)])])):i.showAxisSliders?(p(),f("div",sD,[a("label",rD,[e[15]||(e[15]=a("span",{class:"motion-axis-slider__label"},"Z",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-10",max:"10",step:"0.05",value:t.motionAxisTargetValue("translation_z"),onInput:e[5]||(e[5]=u=>t.motionSmoothnessActive()?t.previewMotionAxis("translation_z",u.target.value):t.setMotionAxis("translation_z",u.target.value)),onChange:e[6]||(e[6]=u=>t.motionSmoothnessActive()&&t.setMotionAxis("translation_z",u.target.value))},null,40,oD),a("code",aD,_(t.motionAxisTargetValue("translation_z").toFixed(2)),1)]),a("label",lD,[e[16]||(e[16]=a("span",{class:"motion-axis-slider__label"},"Zoom",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"0.5",max:"2",step:"0.01","data-testid":"motion-zoom-slider",value:t.motionAxisTargetValue("zoom"),onInput:e[7]||(e[7]=u=>t.motionSmoothnessActive()?t.previewMotionAxis("zoom",u.target.value):t.setMotionAxis("zoom",u.target.value)),onChange:e[8]||(e[8]=u=>t.motionSmoothnessActive()&&t.setMotionAxis("zoom",u.target.value))},null,40,uD),a("code",dD,_(t.motionAxisTargetValue("zoom").toFixed(2)),1)]),a("label",cD,[e[17]||(e[17]=a("span",{class:"motion-axis-slider__label"},"Tilt",-1)),a("input",{class:"framesync-input motion-axis-slider__input",type:"range",min:"-180",max:"180",step:"0.5","data-testid":"motion-tilt-slider",value:t.motionAxisTargetValue("rotation_z"),onInput:e[9]||(e[9]=u=>t.motionSmoothnessActive()?t.previewMotionAxis("rotation_z",u.target.value):t.setMotionAxis("rotation_z",u.target.value)),onChange:e[10]||(e[10]=u=>t.motionSmoothnessActive()&&t.setMotionAxis("rotation_z",u.target.value))},null,40,hD),a("code",mD,_(t.motionAxisTargetValue("rotation_z").toFixed(2)),1)])])):N("",!0)],2)}const Qy=it(W3,[["render",pD]]),Lf={type:"change"},zh={type:"start"},ev={type:"end"},ll=new ha,Df=new qn,fD=Math.cos(70*Ol.DEG2RAD),ni=new B,Ri=2*Math.PI,It={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},bd=1e-6;class gD extends hT{constructor(e,i=null){super(e,i),this.state=It.NONE,this.target=new B,this.cursor=new B,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:jr.ROTATE,MIDDLE:jr.DOLLY,RIGHT:jr.PAN},this.touches={ONE:Vr.ROTATE,TWO:Vr.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._cursorStyle="auto",this._domElementKeyEvents=null,this._lastPosition=new B,this._lastQuaternion=new ns,this._lastTargetPosition=new B,this._quat=new ns().setFromUnitVectors(e.up,new B(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new jp,this._sphericalDelta=new jp,this._scale=1,this._panOffset=new B,this._rotateStart=new Xe,this._rotateEnd=new Xe,this._rotateDelta=new Xe,this._panStart=new Xe,this._panEnd=new Xe,this._panDelta=new Xe,this._dollyStart=new Xe,this._dollyEnd=new Xe,this._dollyDelta=new Xe,this._dollyDirection=new B,this._mouse=new Xe,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=vD.bind(this),this._onPointerDown=yD.bind(this),this._onPointerUp=bD.bind(this),this._onContextMenu=TD.bind(this),this._onMouseWheel=wD.bind(this),this._onKeyDown=MD.bind(this),this._onTouchStart=xD.bind(this),this._onTouchMove=PD.bind(this),this._onMouseDown=_D.bind(this),this._onMouseMove=SD.bind(this),this._interceptControlDown=AD.bind(this),this._interceptControlUp=CD.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}set cursorStyle(e){this._cursorStyle=e,e==="grab"?this.domElement.style.cursor="grab":this.domElement.style.cursor="auto"}get cursorStyle(){return this._cursorStyle}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction=""}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(Lf),this.update(),this.state=It.NONE}pan(e,i){this._pan(e,i),this.update()}dollyIn(e){this._dollyIn(e),this.update()}dollyOut(e){this._dollyOut(e),this.update()}rotateLeft(e){this._rotateLeft(e),this.update()}rotateUp(e){this._rotateUp(e),this.update()}update(e=null){const i=this.object.position;ni.copy(i).sub(this.target),ni.applyQuaternion(this._quat),this._spherical.setFromVector3(ni),this.autoRotate&&this.state===It.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Ri:n>Math.PI&&(n-=Ri),s<-Math.PI?s+=Ri:s>Math.PI&&(s-=Ri),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const l=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=l!=this._spherical.radius}if(ni.setFromSpherical(this._spherical),ni.applyQuaternion(this._quatInverse),i.copy(this.target).add(ni),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let l=null;if(this.object.isPerspectiveCamera){const o=ni.length();l=this._clampDistance(o*this._scale);const u=o-l;this.object.position.addScaledVector(this._dollyDirection,u),this.object.updateMatrixWorld(),r=!!u}else if(this.object.isOrthographicCamera){const o=new B(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const u=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=u!==this.object.zoom;const c=new B(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),l=ni.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;l!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(l).add(this.object.position):(ll.origin.copy(this.object.position),ll.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(ll.direction))bd||8*(1-this._lastQuaternion.dot(this.object.quaternion))>bd||this._lastTargetPosition.distanceToSquared(this.target)>bd?(this.dispatchEvent(Lf),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?Ri/60*this.autoRotateSpeed*e:Ri/60/60*this.autoRotateSpeed}_getZoomScale(e){const i=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*i)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,i){ni.setFromMatrixColumn(i,0),ni.multiplyScalar(-e),this._panOffset.add(ni)}_panUp(e,i){this.screenSpacePanning===!0?ni.setFromMatrixColumn(i,1):(ni.setFromMatrixColumn(i,0),ni.crossVectors(this.object.up,ni)),ni.multiplyScalar(e),this._panOffset.add(ni)}_pan(e,i){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;ni.copy(s).sub(this.target);let r=ni.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*i*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(i*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,i){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=e-n.left,r=i-n.top,l=n.width,o=n.height;this._mouse.x=s/l*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const i=this.domElement;this._rotateLeft(Ri*this._rotateDelta.x/i.clientHeight),this._rotateUp(Ri*this._rotateDelta.y/i.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let i=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(Ri*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),i=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-Ri*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),i=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(Ri*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),i=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-Ri*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),i=!0;break}i&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._panStart.set(n,s)}}_handleTouchStartDolly(e){const i=this._getSecondPointerPosition(e),n=e.pageX-i.x,s=e.pageY-i.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),s=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const i=this.domElement;this._rotateLeft(Ri*this._rotateDelta.x/i.clientHeight),this._rotateUp(Ri*this._rotateDelta.y/i.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),n=.5*(e.pageX+i.x),s=.5*(e.pageY+i.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const i=this._getSecondPointerPosition(e),n=e.pageX-i.x,s=e.pageY-i.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const l=(e.pageX+i.x)*.5,o=(e.pageY+i.y)*.5;this._updateZoomParameters(l,o)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let i=0;ir.frame-l.frame),i}function Fr(t,e){if(!Array.isArray(t)||!t.length)return 0;const i=Number(e)||0;if(i<=t[0].frame)return t[0].value;for(let n=1;n({})},motionValues:{type:Object,default:()=>({})},preferLiveValues:{type:Boolean,default:!0},playing:{type:Boolean,default:!0}},data(){return{playheadFrame:0,displayFrame:0,displayPoint:{x:0,y:0,z:0},totalFrames:120,_raf:0,_lastTs:0,_pathPoints:[]}},computed:{liveMotionOverrides(){if(!this.preferLiveValues)return{};const t=this.motionValues||{},e={};return["translation_x","translation_y","translation_z","rotation_3d_x","rotation_3d_y","rotation_3d_z"].forEach(i=>{t[i]!=null&&Number.isFinite(Number(t[i]))&&(e[i]=Number(t[i]))}),e},previewFrameCount(){var e;const t=Number((e=this.deforumSettings)==null?void 0:e.max_frames)||120;return Math.max(24,Math.min(240,t))},previewFps(){var e;const t=Number((e=this.deforumSettings)==null?void 0:e.fps)||24;return Math.max(8,Math.min(60,t))}},watch:{deforumSettings:{deep:!0,handler(){this.rebuildPath()}},motionValues:{deep:!0,handler(){this.rebuildPath()}},preferLiveValues(){this.rebuildPath()},playing(t){t?this.startLoop():this.stopLoop()}},mounted(){this.initScene(),this.rebuildPath(),this.playing&&this.startLoop(),this._onResize=()=>this.resize(),window.addEventListener("resize",this._onResize)},beforeUnmount(){this.stopLoop(),window.removeEventListener("resize",this._onResize),this.disposeScene()},methods:{initScene(){const t=this.$refs.host;if(!t)return;this.scene=new Ur,this.scene.background=new Ve(395536),this.scene.fog=new Eh(395536,40,220);const e=t.clientWidth||640,i=t.clientHeight||220;this.viewCamera=new li(48,e/i,.1,500),this.viewCamera.position.set(28,22,34),this.renderer=new Yy({antialias:!0,alpha:!1}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),this.renderer.setSize(e,i,!1),t.appendChild(this.renderer.domElement),this.controls=new gD(this.viewCamera,this.renderer.domElement),this.controls.enableDamping=!0,this.controls.target.set(0,0,0);const n=new dT(80,40,3007231,1713208);n.position.y=-.01,this.scene.add(n);const s=new cT(8);this.scene.add(s),this.pathMaterial=new su({color:8353757,linewidth:1}),this.pathGeometry=new Bt,this.pathLine=new Ry(this.pathGeometry,this.pathMaterial),this.scene.add(this.pathLine),this.playheadMaterial=new Jr({color:3007231,emissive:667712,metalness:.2,roughness:.35}),this.playheadMesh=new Ut(new Yr(.55,16,16),this.playheadMaterial),this.scene.add(this.playheadMesh);const r=new Dh(.35,1.2,12);this.facingMaterial=new Jr({color:15235504,emissive:3149856}),this.facingMesh=new Ut(r,this.facingMaterial),this.facingMesh.rotation.x=Math.PI/2,this.playheadMesh.add(this.facingMesh);const l=new zy(16777215,1.1);l.position.set(12,24,16),this.scene.add(l),this.scene.add(new Ec(4478310,.65))},resize(){const t=this.$refs.host;if(!t||!this.renderer||!this.viewCamera)return;const e=t.clientWidth||640,i=t.clientHeight||220;this.renderer.setSize(e,i,!1),this.viewCamera.aspect=e/i,this.viewCamera.updateProjectionMatrix()},rebuildPath(){this.totalFrames=this.previewFrameCount,this._pathPoints=RD({settings:this.deforumSettings||{},live:this.liveMotionOverrides,frameCount:this.totalFrames}),this.updatePathGeometry(),this.playheadFrame=Math.min(this.playheadFrame,this.totalFrames),this.applyPlayhead(this.playheadFrame)},updatePathGeometry(){if(!this.pathGeometry)return;const t=this._pathPoints,e=new Float32Array(t.length*3);if(t.forEach((i,n)=>{e[n*3]=i.x,e[n*3+1]=i.y,e[n*3+2]=i.z}),this.pathGeometry.setAttribute("position",new Qt(e,3)),this.pathGeometry.computeBoundingSphere(),t.length>1&&this.controls){let i=1/0,n=-1/0,s=1/0,r=-1/0,l=1/0,o=-1/0;t.forEach(m=>{i=Math.min(i,m.x),n=Math.max(n,m.x),s=Math.min(s,m.y),r=Math.max(r,m.y),l=Math.min(l,m.z),o=Math.max(o,m.z)});const u=(i+n)/2,c=(s+r)/2,h=(l+o)/2,d=Math.max(n-i,r-s,o-l,6);this.controls.target.set(u,c,h),this.viewCamera.position.set(u+d*1.4,c+d*.9,h+d*1.4)}},applyPlayhead(t){const e=this._pathPoints;if(!e.length||!this.playheadMesh)return;const i=Math.max(0,Math.min(e.length-1,Math.round(t))),n=e[i];this.displayFrame=n.frame,this.displayPoint={x:n.x,y:n.y,z:n.z},this.playheadMesh.position.set(n.x,n.y,n.z),this.playheadMesh.rotation.set(n.pitch||0,n.yaw||0,n.roll||0)},startLoop(){this.stopLoop(),this._lastTs=0;const t=e=>{if(this._raf=requestAnimationFrame(t),!this.playing)return;this._lastTs||(this._lastTs=e);const i=(e-this._lastTs)/1e3;this._lastTs=e,this.playheadFrame+=i*this.previewFps,this.playheadFrame>this.totalFrames&&(this.playheadFrame=0),this.applyPlayhead(this.playheadFrame),this.controls&&this.controls.update(),this.renderer&&this.scene&&this.viewCamera&&this.renderer.render(this.scene,this.viewCamera)};this._raf=requestAnimationFrame(t)},stopLoop(){this._raf&&cancelAnimationFrame(this._raf),this._raf=0,this._lastTs=0},disposeScene(){this.stopLoop(),this.controls&&this.controls.dispose(),this.pathGeometry&&this.pathGeometry.dispose(),this.pathMaterial&&this.pathMaterial.dispose(),this.playheadMaterial&&this.playheadMaterial.dispose(),this.facingMaterial&&this.facingMaterial.dispose(),this.renderer&&(this.renderer.dispose(),this.renderer.domElement&&this.renderer.domElement.parentNode&&this.renderer.domElement.parentNode.removeChild(this.renderer.domElement)),this.scene=null}}},DD={class:"motion-path-preview","data-testid":"motion-path-preview"},ID={class:"motion-path-preview__header"},FD={class:"motion-path-preview__readout motion-readout"},ND={ref:"host",class:"motion-path-preview__stage"};function OD(t,e,i,n,s,r){return p(),f("div",DD,[a("div",ID,[e[0]||(e[0]=a("div",{class:"framesync-subtitle motion-path-preview__title"},"3D motion preview",-1)),a("code",FD," Frame "+_(s.displayFrame)+" / "+_(s.totalFrames)+", X "+_(s.displayPoint.x.toFixed(1))+", Y "+_(s.displayPoint.y.toFixed(1))+", Z "+_(s.displayPoint.z.toFixed(1)),1)]),a("div",ND,null,512)])}const tv=it(LD,[["render",OD]]),UD={name:"DeforumSettingsBody",components:{MotionPathPreview:tv},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},VD={class:"deforum-settings-body-wrap","data-testid":"deforum-settings-body"},BD={class:"deforum-settings-groups"},zD={class:"deforum-mode-toggle",role:"group","aria-label":"Deforum animation mode","data-testid":"deforum-mode-toggle"},$D={key:0,class:"deforum-mode-toggle__hint"},GD={class:"sub-pills deforum-settings-tabs"},HD=["disabled","onClick"],WD={key:1,class:"framesync-panel deforum-settings-panel"},qD={class:"deforum-settings-grid"},jD={class:"deforum-field-head"},XD={class:"deforum-field-label"},KD={key:0,class:"deforum-field-toggle"},YD=["onClick"],JD={key:0,class:"deforum-field-slider"},ZD=["min","max","step","value","disabled","onInput"],QD={class:"deforum-field-slider__value"},eI=["data-testid","value","disabled","onChange"],tI=["value"],iI={key:2,class:"deforum-seed-control","data-testid":"deforum-seed-control"},nI=["disabled"],sI=["max","step","value","disabled"],rI={key:1,class:"deforum-seed-control__hint"},oI=["data-testid","min","max","step","value","disabled","onInput"],aI={key:4,class:"chips deforum-field-bool"},lI=["disabled","onClick"],uI=["disabled","onClick"],dI=["rows","value","disabled","onInput"],cI=["value","disabled","onInput"];function hI(t,e,i,n,s,r){const l=Ie("MotionPathPreview");return p(),f("section",VD,[e[4]||(e[4]=a("p",{class:"deforum-settings-body-wrap__intro framesync-subtitle"}," Deforum batch, motion schedules, prompts, and ControlNet (CN1–CN5). Resolution and sampling are under Global config. ",-1)),a("div",BD,[a("div",zD,[a("button",{type:"button",class:U(["deforum-mode-toggle__btn",{active:t.deforumMode2d3d==="2D"}]),"data-testid":"deforum-mode-2d",onClick:e[0]||(e[0]=o=>t.setDeforumMode2d3d("2D"))}," 2D ",2),a("button",{type:"button",class:U(["deforum-mode-toggle__btn",{active:t.deforumMode2d3d==="3D"}]),"data-testid":"deforum-mode-3d",onClick:e[1]||(e[1]=o=>t.setDeforumMode2d3d("3D"))}," 3D ",2)]),t.deforumMode3dActive?N("",!0):(p(),f("p",$D," 3D motion schedules are disabled in 2D mode. ")),a("div",GD,[(p(!0),f(G,null,re(t.deforumLayerFieldGroups,o=>(p(),f("button",{key:"deforum-tab-"+o.id,type:"button",class:U(["sub-pill",{active:t.deforumActiveTab===o.id,"sub-pill--disabled":t.isDeforumFieldGroupDisabledByAnimationMode(o.id)}]),disabled:t.isDeforumFieldGroupDisabledByAnimationMode(o.id),onClick:u=>{t.deforumActiveTab=o.id,t.saveSessionState()}},_(o.label),11,HD))),128))]),t.activeDeforumFieldGroup?(p(),f("div",WD,[t.deforumMode3dActive&&(t.deforumActiveTab==="motion"||t.deforumActiveTab==="motion3d")?(p(),ht(l,{key:0,"deforum-settings":t.deforumSettings,"motion-values":{},"prefer-live-values":!1},null,8,["deforum-settings"])):N("",!0),a("div",qD,[(p(!0),f(G,null,re(t.activeDeforumFieldGroup.fields,o=>(p(),f(G,{key:o.key},[o.key!=="sd_model_name"?(p(),f("label",{key:0,class:U(["deforum-field",["deforum-field-"+(o.type||"text"),{"deforum-field--disabled":!t.isDeforumFieldEnabled(o.key),"deforum-field--mode-locked":t.isDeforumFieldDisabledByAnimationMode(o.key)}]])},[a("span",jD,[a("span",XD,_(o.label),1),t.isDeforumFieldToggleable(o.key)?(p(),f("span",KD,[a("button",{type:"button",class:U(["chip chip--compact",{active:t.isDeforumFieldEnabled(o.key)}]),onClick:ft(u=>t.setDeforumFieldEnabled(o.key,!t.isDeforumFieldEnabled(o.key)),["prevent"])},_(t.isDeforumFieldEnabled(o.key)?"On":"Off"),11,YD)])):N("",!0)]),o.type==="slider"?(p(),f("div",JD,[a("input",{type:"range",class:"framesync-input",min:o.min,max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:u=>t.onDeforumFieldInput(o.key,u.target.value,"number")},null,40,ZD),a("span",QD,_(t.formatDeforumFieldValue(o,t.getDeforumField(o.key))),1)])):o.type==="select"?(p(),f("select",{key:1,class:"framesync-select","data-testid":"deforum-field-"+o.key,value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onChange:u=>t.onDeforumSelectInput(o,u.target.value)},[(p(!0),f(G,null,re(t.deforumFieldOptions(o),u=>(p(),f("option",{key:o.key+"-opt-"+u,value:u},_(u),9,tI))),128))],40,eI)):o.key==="seed"?(p(),f("div",iI,[a("button",{type:"button",class:U(["chip chip--compact",{active:t.seedRandomEnabled}]),disabled:!t.isDeforumFieldEnabled(o.key),"data-testid":"seed-random-toggle",onClick:e[2]||(e[2]=u=>t.setSeedRandomEnabled(!t.seedRandomEnabled))}," Random ",10,nI),t.seedRandomEnabled?(p(),f("span",rI,"Random (−1)")):(p(),f("input",{key:0,type:"number",class:"framesync-input deforum-seed-control__input","data-testid":"deforum-field-seed",min:"0",max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:e[3]||(e[3]=u=>t.onDeforumSeedInput(u.target.value))},null,40,sI))])):o.type==="number"?(p(),f("input",{key:3,type:"number",class:"framesync-input","data-testid":"deforum-field-"+o.key,min:o.min,max:o.max,step:o.step||1,value:t.getDeforumField(o.key),disabled:!t.isDeforumFieldEnabled(o.key),onInput:u=>t.onDeforumFieldInput(o.key,u.target.value,"number")},null,40,oI)):o.type==="bool"?(p(),f("div",aI,[a("button",{type:"button",class:U(["chip",{active:!!t.getDeforumField(o.key)}]),disabled:!t.isDeforumFieldEnabled(o.key),onClick:u=>t.onDeforumFieldInput(o.key,!0,"bool")},"On",10,lI),a("button",{type:"button",class:U(["chip",{active:!t.getDeforumField(o.key)}]),disabled:!t.isDeforumFieldEnabled(o.key),onClick:u=>t.onDeforumFieldInput(o.key,!1,"bool")},"Off",10,uI)])):o.type==="textarea"?(p(),f("textarea",{key:5,class:"framesync-input",rows:o.rows||3,value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onInput:u=>t.onDeforumFieldInput(o.key,u.target.value,"text")},null,40,dI)):(p(),f("input",{key:6,type:"text",class:"framesync-input",value:t.getDeforumField(o.key)??"",disabled:!t.isDeforumFieldEnabled(o.key),onInput:u=>t.onDeforumFieldInput(o.key,u.target.value,"text")},null,40,cI))],2)):N("",!0)],64))),128))])])):N("",!0)])])}const mI=it(UD,[["render",hI]]),pI={name:"DeforumControlPanel",components:{CommonVisualStrip:_R,DeforumMotionPads:Qy,DeforumSettingsBody:mI},props:{app:{type:Object,required:!0},visualPluginId:{type:String,default:"deforum"},motionPadsShowReadout:{type:Boolean,default:!1},motionPadsShowAxisSliders:{type:Boolean,default:!0}},setup(t){return Tt(t)}},fI={class:"deforum-control-panel","data-testid":"deforum-control-panel"},gI={class:"sub-pills deforum-control-panel__tabs",role:"tablist","aria-label":"Deforum controls"},yI=["aria-selected","data-testid","onClick"];function vI(t,e,i,n,s,r){const l=Ie("DeforumSettingsBody"),o=Ie("DeforumMotionPads"),u=Ie("CommonVisualStrip");return p(),f("div",fI,[a("div",gI,[(p(!0),f(G,null,re(t.deforumControlTabs,c=>(p(),f("button",{key:"deforum-ctrl-tab-"+c.id,type:"button",role:"tab",class:U(["sub-pill",{active:t.deforumControlTab===c.id}]),"aria-selected":t.deforumControlTab===c.id?"true":"false","data-testid":"deforum-control-tab-"+c.id,onClick:h=>t.setDeforumControlTab(c.id)},_(c.label),11,yI))),128))]),K(ve(l,{app:i.app},null,8,["app"]),[[Ii,t.deforumControlTab==="settings"]]),K(ve(o,{app:i.app,"show-readout":i.motionPadsShowReadout,"show-axis-sliders":i.motionPadsShowAxisSliders},null,8,["app","show-readout","show-axis-sliders"]),[[Ii,t.deforumControlTab==="motion"]]),K(ve(u,{app:i.app,"plugin-id":i.visualPluginId},null,8,["app","plugin-id"]),[[Ii,t.deforumControlTab==="macros"]])])}const iv=it(pI,[["render",vI]]),bI={name:"DeforumPluginPanel",components:{DeforumJobToolbar:D3,DeforumControlPanel:iv},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},_I={class:"deforum-plugin-panel animation-plugin-panel","data-testid":"deforum-plugin-panel"};function SI(t,e,i,n,s,r){const l=Ie("DeforumJobToolbar"),o=Ie("DeforumControlPanel");return p(),f("div",_I,[ve(l,{app:i.app},null,8,["app"]),ve(o,{app:i.app,"visual-plugin-id":"deforum","motion-pads-show-readout":""},null,8,["app"])])}const wI=it(bI,[["render",SI]]),MI={name:"WanPluginPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},xI={class:"wan-engine-controls animation-plugin-panel","data-testid":"wan-plugin-panel"},PI={class:"wan-engine-controls__speed"},TI={class:"chips"},AI=["data-testid","onClick"],CI={class:"wan-engine-controls__motion"},EI={class:"motion-preset-row"},kI=["data-testid","onClick"],RI={class:"animatelcm-plugin-panel__motion-loras wan-engine-controls__loras"},LI={class:"chips"},DI=["data-testid","title","onClick"],II={key:0,class:"animatelcm-plugin-panel__lora-weight"},FI=["value"],NI={class:"wan-engine-controls__init","data-testid":"wan-init-section"},OI={class:"wan-engine-controls__toggle"},UI=["checked","disabled"],VI={key:0,class:"img2img-dropzone__preview"},BI=["src"],zI={key:1,class:"img2img-dropzone__empty"},$I={class:"wan-engine-controls__init-actions"},GI=["disabled"],HI=["disabled"],WI={key:0,class:"wan-engine-controls__init-i2v"},qI={class:"framesync-stack wan-engine-controls__field"},jI=["value"],XI=["value"],KI={class:"framesync-stack wan-engine-controls__field"},YI=["value"],JI={class:"wan-engine-controls__download","data-testid":"wan-download-section"},ZI={class:"wan-engine-controls__download-row"},QI=["disabled","data-testid","title","onClick"],eF={class:"wan-engine-controls__toggle"},tF=["checked"],iF={class:"wan-engine-controls__toggle"},nF=["checked"],sF={key:0,class:"framesync-subtitle wan-engine-controls__download-status","data-testid":"wan-download-status"},rF={class:"wan-engine-controls__advanced"},oF={class:"wan-engine-controls__grid"},aF={key:0,class:"wan-engine-controls__toggle"},lF=["checked","data-testid","onChange"],uF={key:1,class:"framesync-stack wan-engine-controls__field"},dF={class:"framesync-subtitle"},cF=["data-testid","value","onChange"],hF=["value"],mF=["data-testid","min","max","step","value","onInput"],pF=["data-testid","value","onInput"];function fF(t,e,i,n,s,r){return p(),f("div",xI,[e[26]||(e[26]=a("div",{class:"framesync-subtitle"},"WAN Video · steer generation",-1)),e[27]||(e[27]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"},[ie(" Uses Deforum "),a("code",null,"animation_mode: Wan Video"),ie(" on Forge. Prompts come from the Prompts tab; models download on Forge when auto-download is enabled. ")],-1)),a("div",PI,[e[11]||(e[11]=a("div",{class:"framesync-subtitle"},"Speed preset",-1)),a("div",TI,[(p(!0),f(G,null,re(t.wanSpeedPresetNames,l=>(p(),f("button",{key:"wan-speed-"+l,type:"button",class:U(["chip",{active:t.wanEngine.wan_speed_preset===l,"chip--live":l==="Turbo"||l==="Fast"}]),"data-testid":"wan-speed-preset-"+l,onClick:o=>t.applyWanSpeedPreset(l)},_(l),11,AI))),128))]),e[12]||(e[12]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"}," Turbo/Fast use fewer inference steps + flash attention (similar to LCM-style quick passes). ",-1))]),a("div",CI,[e[13]||(e[13]=a("div",{class:"framesync-subtitle"},"Motion preset",-1)),a("div",EI,[(p(!0),f(G,null,re(t.wanMotionPresetNames,l=>(p(),f("button",{key:"wan-motion-"+l,type:"button",class:U(["chip",{active:t.wanEngine.wan_motion_preset===l}]),"data-testid":"wan-motion-preset-"+l,onClick:o=>t.applyWanMotionPreset(l)},_(l),11,kI))),128))])]),a("div",RI,[e[15]||(e[15]=a("div",{class:"framesync-subtitle"},"Motion LoRA (prompt tags)",-1)),a("div",LI,[(p(!0),f(G,null,re(t.wanMotionLoras,l=>(p(),f("button",{key:"wan-lora-"+l.id,type:"button",class:U(["chip",{active:t.activeWanMotionLoras.includes(l.id)}]),"data-testid":"wan-motion-lora-"+l.id,title:l.id,onClick:o=>t.toggleWanMotionLora(l.id)},_(l.label),11,DI))),128))]),t.activeWanMotionLoras.length>0?(p(),f("div",II,[e[14]||(e[14]=a("div",{class:"framesync-subtitle"},"LoRA weight",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"wan-motion-lora-weight",min:"0",max:"1.5",step:"0.05",value:t.wanEngine.motion_lora_weight,onInput:e[0]||(e[0]=l=>t.onWanEngineFieldChange("motion_lora_weight",l.target.value,"number"))},null,40,FI)])):N("",!0)]),a("div",NI,[e[20]||(e[20]=a("div",{class:"framesync-subtitle"},"Image init (I2V)",-1)),e[21]||(e[21]=a("p",{class:"framesync-subtitle wan-engine-controls__hint"},[ie(" Start the first clip from a still image. Forge uses Deforum "),a("code",null,"use_init"),ie(" + I2V chaining for later clips. ")],-1)),a("label",OI,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_use_init_image,disabled:!t.wanEngine.wan_init_image,"data-testid":"wan-field-wan_use_init_image",onChange:e[1]||(e[1]=l=>t.onWanEngineFieldChange("wan_use_init_image",l.target.checked,"boolean"))},null,40,UI),e[16]||(e[16]=a("span",null,"Use init image for first frame",-1))]),a("div",{class:U(["img2img-dropzone wan-engine-controls__init-drop",{"img2img-dropzone--filled":!!t.wanEngine.wan_init_image}]),"data-testid":"wan-init-dropzone",onDragover:e[3]||(e[3]=ft(()=>{},["prevent"])),onDrop:e[4]||(e[4]=ft((...l)=>t.handleWanInitImageDrop&&t.handleWanInitImageDrop(...l),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input","data-testid":"wan-init-file-input",onChange:e[2]||(e[2]=(...l)=>t.handleWanInitImageFile&&t.handleWanInitImageFile(...l))},null,32),t.wanEngine.wan_init_image?(p(),f("div",VI,[a("img",{src:t.wanEngine.wan_init_image,alt:"Wan init preview",class:"img2img-dropzone__image"},null,8,BI)])):(p(),f("div",zI,[...e[17]||(e[17]=[a("div",{class:"img2img-dropzone__title"},"Init image",-1),a("div",{class:"img2img-dropzone__hint"},"Drag and drop or click to browse",-1)])]))],34),a("div",$I,[a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.img2img.dataUrl,"data-testid":"wan-init-from-img2img",onClick:e[5]||(e[5]=(...l)=>t.useImg2imgAsWanInit&&t.useImg2imgAsWanInit(...l))}," Use Prompts → IMAGE input ",8,GI),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.wanEngine.wan_init_image,"data-testid":"wan-init-clear",onClick:e[6]||(e[6]=(...l)=>t.clearWanInitImage&&t.clearWanInitImage(...l))}," Clear init ",8,HI)]),t.wanEngine.wan_init_image?(p(),f("div",WI,[a("div",qI,[e[18]||(e[18]=a("div",{class:"framesync-subtitle"},"I2V model (first frame + chaining)",-1)),a("select",{class:"framesync-select","data-testid":"wan-field-wan_i2v_model",value:t.wanEngine.wan_i2v_model,onChange:e[7]||(e[7]=l=>t.onWanEngineFieldChange("wan_i2v_model",l.target.value,"select"))},[(p(!0),f(G,null,re(t.wanI2vModelOptions,l=>(p(),f("option",{key:"wan-i2v-"+l,value:l},_(l),9,XI))),128))],40,jI)]),a("div",KI,[e[19]||(e[19]=a("div",{class:"framesync-subtitle"},"Init strength (I2V conditioning)",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"wan-field-wan_i2v_init_strength",min:"0",max:"1",step:"0.05",value:t.wanEngine.wan_i2v_init_strength,onInput:e[8]||(e[8]=l=>t.onWanEngineFieldChange("wan_i2v_init_strength",l.target.value,"number"))},null,40,YI)])])):N("",!0)]),a("div",JI,[e[24]||(e[24]=a("div",{class:"framesync-subtitle"},"Models on Forge",-1)),a("div",ZI,[(p(!0),f(G,null,re(t.wanDownloadPackages,l=>(p(),f("button",{key:"wan-dl-"+l.id,type:"button",class:"framesync-button framesync-button--compact",disabled:t.wanDownloadBusy,"data-testid":"wan-download-"+l.id,title:l.hfCommand,onClick:o=>t.requestWanModelDownload(l.id)},_(t.wanDownloadBusy?"…":"↓")+" "+_(l.label),9,QI))),128))]),a("label",eF,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_auto_download,"data-testid":"wan-field-wan_auto_download",onChange:e[9]||(e[9]=l=>t.onWanEngineFieldChange("wan_auto_download",l.target.checked,"boolean"))},null,40,tF),e[22]||(e[22]=a("span",null,"Auto-download missing Wan models on Forge",-1))]),a("label",iF,[a("input",{type:"checkbox",checked:!!t.wanEngine.wan_qwen_auto_download,"data-testid":"wan-field-wan_qwen_auto_download",onChange:e[10]||(e[10]=l=>t.onWanEngineFieldChange("wan_qwen_auto_download",l.target.checked,"boolean"))},null,40,nF),e[23]||(e[23]=a("span",null,"Auto-download Qwen enhancer models",-1))]),t.wanDownloadStatus?(p(),f("p",sF,_(t.wanDownloadStatus),1)):N("",!0)]),a("details",rF,[e[25]||(e[25]=a("summary",{class:"framesync-subtitle"},"Advanced Wan settings",-1)),a("div",oF,[(p(!0),f(G,null,re(t.wanEngineControlFields,l=>(p(),f(G,{key:"wan-field-"+l.key},[l.type==="boolean"?(p(),f("div",aF,[a("label",null,[a("input",{type:"checkbox",checked:!!t.wanEngine[l.key],"data-testid":"wan-field-"+l.key,onChange:o=>t.onWanEngineFieldChange(l.key,o.target.checked,"boolean")},null,40,lF),a("span",null,_(l.label),1)])])):(p(),f("div",uF,[a("div",dF,_(l.label),1),l.type==="select"?(p(),f("select",{key:0,class:"framesync-select","data-testid":"wan-field-"+l.key,value:t.wanEngine[l.key],onChange:o=>t.onWanEngineFieldChange(l.key,o.target.value,"select")},[(p(!0),f(G,null,re(l.options,o=>(p(),f("option",{key:l.key+"-"+o,value:o},_(o),9,hF))),128))],40,cF)):l.type==="number"?(p(),f("input",{key:1,type:"number",class:"framesync-input","data-testid":"wan-field-"+l.key,min:l.min,max:l.max,step:l.step,value:t.wanEngine[l.key],onInput:o=>t.onWanEngineFieldChange(l.key,o.target.value,"number")},null,40,mF)):(p(),f("input",{key:2,type:"text",class:"framesync-input","data-testid":"wan-field-"+l.key,value:t.wanEngine[l.key],onInput:o=>t.onWanEngineFieldChange(l.key,o.target.value,"text")},null,40,pF))]))],64))),128))])])])}const gF=it(MI,[["render",fF]]),yF={name:"AnimateLcmPluginPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},computed:{motionQuickPresets(){return["Static","Orbit","Tunnel","Handheld","Chaos"]},activeMotionLoras(){var t;return Array.isArray((t=this.animateLcmEngine)==null?void 0:t.motion_loras)?this.animateLcmEngine.motion_loras:[]}}},vF={class:"animatelcm-plugin-panel animation-plugin-panel","data-testid":"animatelcm-plugin-panel"},bF={class:"animatelcm-plugin-panel__motion-type"},_F={class:"chips"},SF=["data-testid","onClick"],wF={class:"motion-preset-row"},MF=["onClick"],xF={class:"animatelcm-plugin-panel__motion-loras"},PF={class:"chips"},TF=["data-testid","title","onClick"],AF={key:0,class:"animatelcm-plugin-panel__lora-weight"},CF=["value"],EF={class:"wan-engine-controls__grid"},kF={key:0},RF={key:1,class:"framesync-stack wan-engine-controls__field"},LF={class:"framesync-subtitle"},DF=["data-testid","min","max","step","value","onInput"];function IF(t,e,i,n,s,r){return p(),f("div",vF,[e[4]||(e[4]=a("div",{class:"framesync-subtitle"},"AnimateLCM · fast temporal generation",-1)),e[5]||(e[5]=a("p",{class:"framesync-subtitle animatelcm-plugin-panel__hint"}," Runs as its own Forge animation mode. Independent from Settings → LCM Engine (global sampling shortcut). ",-1)),a("div",bF,[e[1]||(e[1]=a("div",{class:"framesync-subtitle"},"Motion type",-1)),a("div",_F,[(p(!0),f(G,null,re(t.animateLcmMotionTypes,l=>(p(),f("button",{key:"alcm-type-"+l.id,type:"button",class:U(["chip",{active:t.animateLcmEngine.motion_type===l.id}]),"data-testid":"animatelcm-motion-type-"+l.id,onClick:o=>t.setAnimateLcmMotionType(l.id)},_(l.label),11,SF))),128))])]),a("div",wF,[(p(!0),f(G,null,re(r.motionQuickPresets,l=>(p(),f("button",{key:"alcm-preset-"+l,type:"button",class:U(["chip",{active:t.animateLcmEngine.motion_preset===l}]),onClick:o=>t.applyAnimateLcmMotionPreset(l)},_(l),11,MF))),128))]),a("div",xF,[e[3]||(e[3]=a("div",{class:"framesync-subtitle"},"Motion LoRA",-1)),a("div",PF,[(p(!0),f(G,null,re(t.animateLcmMotionLoras,l=>(p(),f("button",{key:"alcm-lora-"+l.id,type:"button",class:U(["chip",{active:r.activeMotionLoras.includes(l.id)}]),"data-testid":"animatelcm-motion-lora-"+l.id,title:l.id,onClick:o=>t.toggleAnimateLcmMotionLora(l.id)},_(l.label),11,TF))),128))]),r.activeMotionLoras.length>0?(p(),f("div",AF,[e[2]||(e[2]=a("div",{class:"framesync-subtitle"},"LoRA weight",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"animatelcm-motion-lora-weight",min:"0",max:"1.5",step:"0.05",value:t.animateLcmEngine.motion_lora_weight,onInput:e[0]||(e[0]=l=>t.onAnimateLcmFieldChange("motion_lora_weight",l.target.value,"number"))},null,40,CF)])):N("",!0)]),a("div",EF,[(p(!0),f(G,null,re(t.animateLcmControlFields,l=>(p(),f(G,{key:"alcm-field-"+l.key},[l.key==="motion_type"||l.key==="motion_preset"||l.key==="motion_lora_weight"?(p(),f("div",kF)):(p(),f("div",RF,[a("div",LF,_(l.label),1),a("input",{type:"number",class:"framesync-input","data-testid":"animatelcm-field-"+l.key,min:l.min,max:l.max,step:l.step,value:t.animateLcmEngine[l.key],onInput:o=>t.onAnimateLcmFieldChange(l.key,o.target.value,"number")},null,40,DF)]))],64))),128))])])}const FF=it(yF,[["render",IF]]),NF={name:"SvdPluginPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},OF={class:"svd-engine-controls animation-plugin-panel","data-testid":"svd-plugin-panel"},UF={key:0,class:"svd-engine-controls__badge","data-testid":"svd-support-badge"},VF={class:"chip chip--live"},BF={class:"framesync-subtitle"},zF={class:"svd-engine-controls__presets"},$F={class:"chips"},GF=["data-testid","onClick"],HF={class:"svd-engine-controls__init"},WF={class:"wan-engine-controls__init-actions"},qF=["disabled"],jF={key:0,class:"framesync-subtitle svd-engine-controls__init-hint"},XF={class:"wan-engine-controls__grid"},KF={key:0,class:"framesync-stack wan-engine-controls__field"},YF={class:"framesync-subtitle"},JF=["value"],ZF=["value"],QF={key:1,class:"framesync-stack wan-engine-controls__field"},eN={class:"framesync-subtitle"},tN=["data-testid","value","onChange"],iN=["value"],nN={key:2,class:"framesync-stack wan-engine-controls__field"},sN={class:"framesync-subtitle"},rN=["data-testid","min","max","step","value","onInput"],oN=["data-testid","value","onInput"],aN={key:2,class:"framesync-subtitle svd-engine-controls__field-hint"};function lN(t,e,i,n,s,r){return p(),f("div",OF,[e[5]||(e[5]=a("div",{class:"framesync-subtitle"},"SVD · Stable Video Diffusion",-1)),e[6]||(e[6]=a("p",{class:"framesync-subtitle svd-engine-controls__hint"},[ie(" Uses Forge "),a("code",null,"sd_forge_svd"),ie(" with Img2Vid-XT-1.1 defaults (1024×576, 25 frames, motion 127, 6 fps). Upload or generate an init image at the target resolution. ")],-1)),t.svdEngineSummary?(p(),f("div",UF,[a("span",VF,_(t.svdEngineSummary.modelFamily),1),a("span",BF,_(t.svdEngineSummary.resolution)+" · "+_(t.svdEngineSummary.frames)+"f @ "+_(t.svdEngineSummary.fps)+"fps",1)])):N("",!0),a("div",zF,[e[3]||(e[3]=a("div",{class:"framesync-subtitle"},"Preset",-1)),a("div",$F,[(p(!0),f(G,null,re(t.svdPresetNames,l=>(p(),f("button",{key:"svd-preset-"+l,type:"button",class:U(["chip",{active:t.svdEngine.svd_preset===l,"chip--live":l==="XT 1.1"}]),"data-testid":"svd-preset-"+l.replace(/\s+/g,"-").toLowerCase(),onClick:o=>t.applySvdPreset(l)},_(l),11,GF))),128))])]),a("div",HF,[e[4]||(e[4]=a("div",{class:"framesync-subtitle"},"Init image (img2vid)",-1)),a("div",WF,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"svd-init-from-prompts",onClick:e[0]||(e[0]=(...l)=>t.applySvdInitFromPromptsImage&&t.applySvdInitFromPromptsImage(...l))}," Use Prompts → IMAGE input "),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.svdEngine.svd_init_image,"data-testid":"svd-init-clear",onClick:e[1]||(e[1]=(...l)=>t.clearSvdInitImage&&t.clearSvdInitImage(...l))}," Clear init ",8,qF)]),t.svdEngine.svd_init_image?N("",!0):(p(),f("p",jF," No init image — preview generates a still at "+_(t.svdEngine.width)+"×"+_(t.svdEngine.height)+", then runs SVD. ",1))]),a("div",XF,[(p(!0),f(G,null,re(t.svdEngineControlFields,l=>(p(),f(G,{key:"svd-field-"+l.key},[l.key==="svd_resolution"?(p(),f("div",KF,[a("div",YF,_(l.label),1),a("select",{class:"framesync-select","data-testid":"svd-field-svd_resolution",value:t.svdEngine.svd_resolution,onChange:e[2]||(e[2]=o=>t.onSvdResolutionPresetChange(o.target.value))},[(p(!0),f(G,null,re(l.options,o=>(p(),f("option",{key:"svd-res-"+o,value:o},_(o),9,ZF))),128))],40,JF)])):l.type==="select"?(p(),f("div",QF,[a("div",eN,_(l.label),1),a("select",{class:"framesync-select","data-testid":"svd-field-"+l.key,value:t.svdEngine[l.key],onChange:o=>t.onSvdEngineFieldChange(l.key,o.target.value,"select")},[(p(!0),f(G,null,re(l.options,o=>(p(),f("option",{key:l.key+"-"+o,value:o},_(o),9,iN))),128))],40,tN)])):(p(),f("div",nN,[a("div",sN,_(l.label),1),l.type==="number"?(p(),f("input",{key:0,type:"number",class:"framesync-input","data-testid":"svd-field-"+l.key,min:l.min,max:l.max,step:l.step,value:t.svdEngine[l.key],onInput:o=>t.onSvdEngineFieldChange(l.key,o.target.value,"number")},null,40,rN)):(p(),f("input",{key:1,type:"text",class:"framesync-input","data-testid":"svd-field-"+l.key,value:t.svdEngine[l.key],onInput:o=>t.onSvdEngineFieldChange(l.key,o.target.value,"text")},null,40,oN)),l.hint?(p(),f("p",aN,_(l.hint),1)):N("",!0)]))],64))),128))])])}const uN=it(NF,[["render",lN]]),dN={name:"CompositorControls",components:{UiIcon:oi},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},cN={class:"compositor-panel","data-testid":"preview-compositor-controls"},hN={class:"compositor-panel__head"},mN={class:"compositor-panel__cards"},pN={class:"compositor-card"},fN={class:"compositor-card__row"},gN=["aria-pressed"],yN={class:"compositor-big-toggle__label"},vN={class:"compositor-card"},bN={class:"compositor-card__row"},_N=["aria-pressed"],SN={class:"compositor-big-toggle__label"},wN={class:"compositor-card compositor-card--slider"},MN={class:"compositor-card__slider-head"},xN={class:"compositor-card__value"},PN={key:0,class:"compositor-card compositor-card--action"},TN={class:"compositor-card","data-testid":"compositor-deforum-backdrop"},AN={class:"compositor-card__row"},CN={class:"compositor-card__toggle"},EN=["checked"],kN={key:0,class:"compositor-card__slider-row"},RN={class:"compositor-card__hint"},LN={class:"compositor-card compositor-card--lfo","data-testid":"compositor-lfo-links"},DN={class:"compositor-lfo-grid"},IN=["data-testid","onClick"];function FN(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("section",cN,[a("header",hN,[ve(l,{class:"compositor-panel__icon",name:"film","aria-hidden":"true"}),e[9]||(e[9]=a("div",{class:"compositor-panel__head-copy"},[a("h3",{class:"compositor-panel__title"},"Preview compositor"),a("p",{class:"compositor-panel__subtitle"},"Crossfade, auto-switch, and forge mix routing")],-1))]),a("div",mN,[a("article",pN,[a("div",fN,[e[11]||(e[11]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Auto-switch to Deforum"),a("span",{class:"compositor-card__hint"},"Jump preview to Deforum when new frames arrive")],-1)),a("button",{type:"button",class:U(["compositor-big-toggle",{"compositor-big-toggle--on":t.defaultAnimation.autoTransitionToDeforum!==!1}]),"data-testid":"auto-transition-deforum","aria-pressed":t.defaultAnimation.autoTransitionToDeforum!==!1?"true":"false",onClick:e[0]||(e[0]=o=>{t.defaultAnimation.autoTransitionToDeforum=t.defaultAnimation.autoTransitionToDeforum===!1,t.onDefaultAnimationInput()})},[e[10]||(e[10]=a("span",{class:"compositor-big-toggle__track","aria-hidden":"true"},[a("span",{class:"compositor-big-toggle__thumb"})],-1)),a("span",yN,_(t.defaultAnimation.autoTransitionToDeforum!==!1?"On":"Off"),1)],10,gN)])]),a("article",vN,[a("div",bN,[e[13]||(e[13]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Remember preview layer"),a("span",{class:"compositor-card__hint"},"Restore last active layer after reload")],-1)),a("button",{type:"button",class:U(["compositor-big-toggle",{"compositor-big-toggle--on":!!t.defaultAnimation.rememberCompositorLayerOnStartup}]),"data-testid":"remember-compositor-layer","aria-pressed":t.defaultAnimation.rememberCompositorLayerOnStartup?"true":"false",onClick:e[1]||(e[1]=o=>{t.defaultAnimation.rememberCompositorLayerOnStartup=!t.defaultAnimation.rememberCompositorLayerOnStartup,t.onDefaultAnimationInput()})},[e[12]||(e[12]=a("span",{class:"compositor-big-toggle__track","aria-hidden":"true"},[a("span",{class:"compositor-big-toggle__thumb"})],-1)),a("span",SN,_(t.defaultAnimation.rememberCompositorLayerOnStartup?"On":"Off"),1)],10,_N)])]),a("article",wN,[a("div",MN,[e[14]||(e[14]=a("span",{class:"compositor-card__label"},"Crossfade duration",-1)),a("span",xN,_(t.defaultAnimation.previewCompositorCrossfadeMs?t.defaultAnimation.previewCompositorCrossfadeMs>=1e3?(t.defaultAnimation.previewCompositorCrossfadeMs/1e3).toFixed(t.defaultAnimation.previewCompositorCrossfadeMs%1e3===0?0:1)+"s":Math.round(t.defaultAnimation.previewCompositorCrossfadeMs)+"ms":"Instant"),1)]),K(a("input",{class:"framesync-input compositor-card__range",type:"range",min:"0",max:"5000",step:"50","onUpdate:modelValue":e[2]||(e[2]=o=>t.defaultAnimation.previewCompositorCrossfadeMs=o),"data-testid":"preview-compositor-crossfade-ms",onInput:e[3]||(e[3]=(...o)=>t.onDefaultAnimationInput&&t.onDefaultAnimationInput(...o))},null,544),[[ae,t.defaultAnimation.previewCompositorCrossfadeMs,void 0,{number:!0}]])]),t.defaultAnimation.autoTransitionToDeforum===!1?(p(),f("article",PN,[a("button",{type:"button",class:"framesync-button compositor-panel__promote","data-testid":"promote-to-deforum",onClick:e[4]||(e[4]=o=>t.promoteToDeforum())}," Promote to Deforum now ")])):N("",!0),a("article",TN,[a("div",AN,[e[15]||(e[15]=a("div",{class:"compositor-card__copy"},[a("span",{class:"compositor-card__label"},"Deforum frame in WebGL"),a("span",{class:"compositor-card__hint"},"Latest generated frame as standby background")],-1)),a("label",CN,[a("input",{type:"checkbox",checked:t.defaultAnimation.deforumBackdropEnabled!==!1,"data-testid":"deforum-backdrop-enabled",onChange:e[5]||(e[5]=o=>{t.defaultAnimation.deforumBackdropEnabled=o.target.checked,t.onDefaultAnimationInput(),t.syncDeforumBackdropToWebGL()})},null,40,EN)])]),t.defaultAnimation.deforumBackdropEnabled!==!1?(p(),f("div",kN,[a("span",RN,"Backdrop mix "+_(Math.round((t.defaultAnimation.deforumBackdropMix||0)*100))+"%",1),K(a("input",{class:"framesync-input compositor-card__range",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[6]||(e[6]=o=>t.defaultAnimation.deforumBackdropMix=o),"data-testid":"deforum-backdrop-mix",onInput:e[7]||(e[7]=o=>{t.onDefaultAnimationInput(),t.syncDeforumBackdropToWebGL()})},null,544),[[ae,t.defaultAnimation.deforumBackdropMix,void 0,{number:!0}]])])):N("",!0)]),a("article",LN,[e[16]||(e[16]=a("span",{class:"compositor-card__label"},"Forge mix LFO",-1)),e[17]||(e[17]=a("p",{class:"compositor-card__hint compositor-card__hint--block"}," LFO modulates forge opacity on WebGL + Deforum (Both). Route audio into LFO depth from MODULATION. ",-1)),a("div",DN,[a("button",{type:"button",class:U(["compositor-lfo-chip",{active:!t.defaultAnimation.forgeLayerOpacityLfoLink}]),onClick:e[8]||(e[8]=o=>t.setForgeLayerOpacityLfoLink(null))}," Manual ",2),(p(!0),f(G,null,re(t.lfos.slice(0,6),o=>(p(),f("button",{key:"compositor-lfo-"+o.id,type:"button",class:U(["compositor-lfo-chip",{active:t.defaultAnimation.forgeLayerOpacityLfoLink===o.id}]),"data-testid":"compositor-lfo-link-"+o.id,onClick:u=>t.setForgeLayerOpacityLfoLink(o.id)}," LFO "+_(o.id),11,IN))),128))])])])])}const NN=it(dN,[["render",FN]]),ON={name:"EngineGlobalConfigPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},methods:{openFullEngineSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","ENGINE")},globalFieldOptions(t){return t.key==="sampler"?this.deforumFieldOptions(t):t.key==="scheduler"?this.deforumFieldOptions(t):t.options||[]},onGlobalEngineFieldInput(t,e){if(!(t!=null&&t.key))return;if(t.key==="sampler"){this.onEngineSamplerChange(e);return}if(t.key==="scheduler"){this.onEngineSchedulerChange(e);return}if(t.key==="steps"){this.onEngineStepsChange(e);return}if(t.key==="W"||t.key==="H"){this.onDeforumFieldInput(t.key,e,"number");const n=t.key==="W"?Number(e):Number(this.deforumSettings.W),s=t.key==="H"?Number(e):Number(this.deforumSettings.H);Number.isFinite(n)&&Number.isFinite(s)&&this.syncResolutionAcrossControls(n,s,{syncGpuModal:!0});return}if(t.key==="fps"){this.setGlobalFps(Number(e));return}const i=t.type==="number"||t.type==="slider"?"number":"text";this.onDeforumFieldInput(t.key,e,i)}}},UN={class:"engine-global-config framesync-panel","data-testid":"engine-global-config"},VN={class:"engine-global-config__summary"},BN=["disabled"],zN={class:"engine-global-config__model-value"},$N={key:0,class:"engine-global-config__lcm"},GN=["checked"],HN={class:"deforum-settings-grid engine-global-config__grid"},WN={class:"deforum-field-head"},qN={class:"deforum-field-label"},jN={key:0,class:"deforum-field-slider"},XN=["min","max","step","value","disabled","data-testid","onInput"],KN={class:"deforum-field-slider__value"},YN=["data-testid","value","onChange"],JN=["value"],ZN={key:2,class:"deforum-seed-control","data-testid":"engine-global-seed"},QN=["max","step","value"],eO={key:1,class:"deforum-seed-control__hint"},tO=["data-testid","min","max","step","value","onInput"],iO={class:"engine-global-config__footer"},nO=["disabled"];function sO(t,e,i,n,s,r){return p(),f("section",UN,[e[8]||(e[8]=a("div",{class:"engine-global-config__head"},[a("div",{class:"framesync-subtitle engine-global-config__title"},"Global config"),a("p",{class:"framesync-subtitle engine-global-config__hint"}," Resolution, sampling, and checkpoint — shared by Deforum and preview generation. ")],-1)),a("div",VN,[a("button",{type:"button",class:"engine-global-config__model","data-testid":"engine-global-model-picker",disabled:t.forge.switching,onClick:e[0]||(e[0]=l=>t.openEngineModelPicker())},[e[6]||(e[6]=a("span",{class:"framesync-subtitle"},"Checkpoint",-1)),a("span",zN,_(t.engineCurrentModelName||"Select model"),1)],8,BN),t.lcmEngineEnabled?(p(),f("label",$N,[a("input",{type:"checkbox",checked:t.lcmEngineEnabled,"data-testid":"engine-global-lcm-toggle",onChange:e[1]||(e[1]=l=>t.setLcmEngineEnabled(l.target.checked))},null,40,GN),e[7]||(e[7]=a("span",null,"LCM engine",-1))])):N("",!0)]),a("div",HN,[(p(!0),f(G,null,re(t.deforumGlobalEngineGroup&&t.deforumGlobalEngineGroup.fields||[],l=>(p(),f(G,{key:"global-field-"+l.key},[l.key!=="sd_model_name"?(p(),f("label",{key:0,class:U(["deforum-field","deforum-field-"+(l.type||"text")])},[a("span",WN,[a("span",qN,_(l.label),1)]),l.type==="slider"?(p(),f("div",jN,[a("input",{type:"range",class:"framesync-input",min:l.min,max:l.max,step:l.step||1,value:t.getDeforumField(l.key),disabled:t.lcmEngineEnabled&&l.key==="steps","data-testid":"engine-global-field-"+l.key,onInput:o=>r.onGlobalEngineFieldInput(l,o.target.value)},null,40,XN),a("span",KN,_(t.formatDeforumFieldValue(l,t.getDeforumField(l.key))),1)])):l.type==="select"?(p(),f("select",{key:1,class:"framesync-select","data-testid":"engine-global-field-"+l.key,value:t.getDeforumField(l.key)??"",onChange:o=>r.onGlobalEngineFieldInput(l,o.target.value)},[(p(!0),f(G,null,re(r.globalFieldOptions(l),o=>(p(),f("option",{key:l.key+"-opt-"+o,value:o},_(o),9,JN))),128))],40,YN)):l.key==="seed"?(p(),f("div",ZN,[a("button",{type:"button",class:U(["chip chip--compact",{active:t.seedRandomEnabled}]),"data-testid":"seed-random-toggle",onClick:e[2]||(e[2]=o=>t.setSeedRandomEnabled(!t.seedRandomEnabled))}," Random ",2),t.seedRandomEnabled?(p(),f("span",eO,"Random (−1)")):(p(),f("input",{key:0,type:"number",class:"framesync-input deforum-seed-control__input",min:"0",max:l.max,step:l.step||1,value:t.getDeforumField(l.key),onInput:e[3]||(e[3]=o=>t.onDeforumSeedInput(o.target.value))},null,40,QN))])):l.type==="number"?(p(),f("input",{key:3,type:"number",class:"framesync-input","data-testid":"engine-global-field-"+l.key,min:l.min,max:l.max,step:l.step||1,value:t.getDeforumField(l.key),onInput:o=>r.onGlobalEngineFieldInput(l,o.target.value)},null,40,tO)):N("",!0)],2)):N("",!0)],64))),128))]),a("div",iO,[a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.forge.switching||!t.engineCurrentModelName,onClick:e[4]||(e[4]=l=>t.reapplyEngineModelDefaults())}," Optimize for model ",8,nO),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"engine-global-open-settings",onClick:e[5]||(e[5]=l=>r.openFullEngineSettings())}," Full engine settings → ")])])}const rO=it(ON,[["render",sO]]),oO={name:"EngineLayerControls",components:{WebGLPluginPanel:v3,DeforumPluginPanel:wI,WanPluginPanel:gF,AnimateLcmPluginPanel:FF,SvdPluginPanel:uN},props:{app:{type:Object,required:!0},layerId:{type:String,required:!0}},setup(t){return Tt(t)}},aO=["data-testid"],lO={key:5,class:"engine-layer-controls__blend"},uO={class:"slider-row"},dO={key:6,class:"engine-layer-controls__input"};function cO(t,e,i,n,s,r){var d,m,g,b,w,v,y;const l=Ie("WebGLPluginPanel"),o=Ie("DeforumPluginPanel"),u=Ie("WanPluginPanel"),c=Ie("AnimateLcmPluginPanel"),h=Ie("SvdPluginPanel");return p(),f("div",{class:"engine-layer-controls","data-testid":"engine-layer-controls-"+i.layerId},[((d=t.findVideoLayer(i.layerId))==null?void 0:d.kind)==="webgl"?(p(),ht(l,{key:0,app:i.app},null,8,["app"])):((m=t.findVideoLayer(i.layerId))==null?void 0:m.kind)==="deforum"?(p(),ht(o,{key:1,app:i.app},null,8,["app"])):((g=t.findVideoLayer(i.layerId))==null?void 0:g.kind)==="wan"?(p(),ht(u,{key:2,app:i.app},null,8,["app"])):((b=t.findVideoLayer(i.layerId))==null?void 0:b.kind)==="animatelcm"?(p(),ht(c,{key:3,app:i.app},null,8,["app"])):((w=t.findVideoLayer(i.layerId))==null?void 0:w.kind)==="svd"?(p(),ht(h,{key:4,app:i.app},null,8,["app"])):((v=t.findVideoLayer(i.layerId))==null?void 0:v.kind)==="blend"?(p(),f("div",lO,[e[3]||(e[3]=a("p",{class:"framesync-subtitle engine-layer-controls__hint"}," Composites WebGL under a Forge layer using screen blend. ",-1)),a("div",uO,[e[2]||(e[2]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Forge opacity",-1)),K(a("input",{class:"framesync-input",type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[0]||(e[0]=S=>t.defaultAnimation.forgeLayerOpacity=S),"data-testid":"forge-layer-opacity",onInput:e[1]||(e[1]=S=>{t.defaultAnimation.forgeLayerOpacityLfoBase=t.defaultAnimation.forgeLayerOpacity,t.onDefaultAnimationInput()})},null,544),[[ae,t.defaultAnimation.forgeLayerOpacity,void 0,{number:!0}]])])])):((y=t.findVideoLayer(i.layerId))==null?void 0:y.kind)==="input"?(p(),f("div",dO,[...e[4]||(e[4]=[a("p",{class:"framesync-subtitle engine-layer-controls__hint"},[ie(" Link a library or cloud video source from "),a("strong",null,"Add source"),ie(" below. ")],-1)])])):N("",!0)],8,aO)}const hO=it(oO,[["render",cO]]),mO={name:"AnimationEnginePanel",components:{UiIcon:oi,EngineGlobalConfigPanel:rO,EngineLayerControls:hO,CompositorControls:NN},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},pO={class:"animation-engine-panel","data-testid":"animation-engine-panel"},fO={key:0,class:"live-frame-processing-banner","data-testid":"live-frame-processing-banner","aria-live":"polite"},gO={class:"lazy-loading-indicator lazy-loading-indicator--inline"},yO={class:"live-frame-processing-banner__hint"},vO={class:"animation-engine-panel__head"},bO={class:"animation-engine-panel__title-block"},_O={class:"framesync-title"},SO={class:"animation-engine-panel__head-actions"},wO={class:"animation-engine-layer-list","data-testid":"animation-engine-layer-list"},MO=["data-testid"],xO={class:"animation-engine-layer-row__top"},PO={class:"animation-engine-layer-row__main"},TO=["aria-pressed","data-testid","onClick"],AO={class:"animation-engine-layer-row__label"},CO={class:"animation-engine-layer-row__status"},EO={class:"animation-engine-layer-row__mix"},kO={class:"animation-engine-layer-row__mix-head"},RO={class:"animation-engine-layer-row__opacity-value"},LO=["value","disabled","data-testid","onInput"],DO=["title","aria-pressed","data-testid","onClick"],IO={class:"animation-engine-layer-row__visibility-label"},FO=["data-testid","open"],NO={class:"animation-engine-layer-row__controls-summary"},OO={class:"animation-engine-layer-row__controls-body"},UO={class:"animation-engine-panel__compositor-section","data-testid":"animation-engine-compositor-section"},VO={class:"animation-engine-panel__compositor-summary"},BO={class:"animation-engine-panel__compositor-body"};function zO(t,e,i,n,s,r){const l=Ie("EngineGlobalConfigPanel"),o=Ie("UiIcon"),u=Ie("EngineLayerControls"),c=Ie("CompositorControls");return p(),f("div",pO,[t.showFrameProcessingInChrome?(p(),f("div",fO,[a("span",gO,[e[1]||(e[1]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",null,_(t.frameProcessingLabel),1),e[2]||(e[2]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))]),a("span",yO,_(t.frameProcessingHint),1)])):N("",!0),ve(l,{app:i.app},null,8,["app"]),a("div",vO,[a("div",bO,[a("div",_O,[ve(o,{class:"framesync-title-icon",name:"film"}),e[3]||(e[3]=a("span",{class:"framesync-accent"},"All layers",-1))]),e[4]||(e[4]=a("span",{class:"framesync-subtitle animation-engine-panel__subtitle"},"Compositor & per-layer controls",-1))]),a("div",SO,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"animation-engine-promote-deforum",title:"Switch preview to Deforum layer",onClick:e[0]||(e[0]=h=>t.promoteToDeforum())}," Deforum → ")])]),a("ul",wO,[(p(!0),f(G,null,re(t.builtinEngineLayers,h=>(p(),f("li",{key:"engine-layer-row-"+h.id,class:U(["animation-engine-layer-row",{"animation-engine-layer-row--active":t.activeVideoLayerId===h.id,"animation-engine-layer-row--hidden":!t.isVideoLayerPreviewVisible(h)}]),"data-testid":"animation-engine-row-"+h.id},[a("div",xO,[a("div",PO,[a("button",{type:"button",class:U(["animation-engine-layer-row__select",{"animation-engine-layer-row__select--active":t.activeVideoLayerId===h.id}]),"aria-pressed":t.activeVideoLayerId===h.id?"true":"false","data-testid":"animation-engine-"+h.id,onClick:d=>t.selectVideoLayer(h.id)},[a("span",{class:U(["animation-engine-card__dot","animation-engine-card__dot--"+t.layerStatus(h)]),"aria-hidden":"true"},null,2),a("span",AO,_(h.label),1),a("span",CO,_(t.videoLayerStatusShort(h)),1)],10,TO),a("div",EO,[a("div",kO,[e[5]||(e[5]=a("span",{class:"animation-engine-layer-row__mix-label"},"Opacity",-1)),a("span",RO,_(Math.round(t.readVideoLayerOpacity(h)*100))+"% ",1)]),a("input",{type:"range",min:"0",max:"1",step:"0.01",class:"animation-engine-layer-row__opacity-slider framesync-input",value:t.readVideoLayerOpacity(h),disabled:!t.isVideoLayerPreviewVisible(h),"data-testid":"animation-engine-opacity-"+h.id,onInput:d=>t.setVideoLayerOpacity(h.id,d.target.value)},null,40,LO)])]),a("button",{type:"button",class:U(["animation-engine-layer-row__visibility-toggle",{"animation-engine-layer-row__visibility-toggle--on":t.isVideoLayerPreviewVisible(h)}]),title:t.isVideoLayerPreviewVisible(h)?"Hide layer in preview":"Show layer in preview","aria-pressed":t.isVideoLayerPreviewVisible(h)?"true":"false","data-testid":"animation-engine-visibility-"+h.id,onClick:ft(d=>t.toggleVideoLayerPreview(h.id),["stop"])},[ve(o,{class:"animation-engine-layer-row__visibility-icon",name:t.isVideoLayerPreviewVisible(h)?"eye":"eye-off","aria-hidden":"true"},null,8,["name"]),a("span",IO,_(t.isVideoLayerPreviewVisible(h)?"On":"Off"),1)],10,DO)]),a("details",{class:"animation-engine-layer-row__controls","data-testid":"animation-engine-controls-"+h.id,open:h.kind==="webgl"||h.kind==="deforum"},[a("summary",NO,[e[6]||(e[6]=a("span",{class:"animation-engine-layer-row__controls-label"},"Controls",-1)),ve(o,{class:"animation-engine-layer-row__controls-chevron",name:"chevron-down","aria-hidden":"true"})]),a("div",OO,[ve(u,{app:i.app,"layer-id":h.id},null,8,["app","layer-id"])])],8,FO)],10,MO))),128))]),a("details",UO,[a("summary",VO,[e[7]||(e[7]=a("span",{class:"animation-engine-panel__compositor-label"},"Compositor",-1)),ve(o,{class:"animation-engine-panel__compositor-chevron",name:"chevron-down","aria-hidden":"true"})]),a("div",BO,[ve(c,{app:i.app},null,8,["app"])])])])}const $O=it(mO,[["render",zO]]),GO={name:"LibraryMediaCard",components:{UiIcon:oi},props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},hovered:{type:Boolean,default:!1},showVideoPreview:{type:Boolean,default:!1},showActions:{type:Boolean,default:!0},cardTestId:{type:String,default:"library-media-card"},badges:{type:Array,default:()=>[]}},emits:["click","dblclick","watch","edit","mouseenter","mouseleave","video-ref"],data(){return{mediaLoading:!0}},watch:{"item.id"(){this.mediaLoading=!0},showVideoPreview(){this.mediaLoading=!0}},methods:{setVideoRef(t){this.$emit("video-ref",{id:this.item.id,el:t})},onMediaReady(){this.mediaLoading=!1},onMediaError(){this.mediaLoading=!1}}},HO=["data-testid","data-item-id","data-video-path"],WO={class:"library-browser__media"},qO={key:0,class:"library-browser__media-loading lazy-loading-indicator lazy-loading-indicator--overlay","aria-hidden":"true"},jO=["src"],XO=["src","alt"],KO=["src"],YO={key:4,class:"library-browser__placeholder","aria-hidden":"true"},JO={key:5,class:"library-browser__badges"},ZO={class:"library-browser__copy"},QO={class:"library-browser__title"},e4={key:0,class:"library-browser__meta"},t4={key:0,class:"library-browser__card-actions"};function i4(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("article",{class:U(["library-browser__card",{"library-browser__card--selected":i.selected,"library-browser__card--hover":i.hovered}]),"data-testid":i.cardTestId,"data-item-id":i.item.id,"data-video-path":i.item.videoPath||void 0,onMouseenter:e[8]||(e[8]=o=>t.$emit("mouseenter")),onMouseleave:e[9]||(e[9]=o=>t.$emit("mouseleave")),onClick:e[10]||(e[10]=o=>t.$emit("click",i.item)),onDblclick:e[11]||(e[11]=o=>t.$emit("dblclick",i.item))},[a("div",WO,[s.mediaLoading?(p(),f("div",qO,[...e[12]||(e[12]=[a("span",{class:"lazy-loading-indicator__spinner"},null,-1)])])):N("",!0),i.showVideoPreview&&i.item.videoUrl?(p(),f("video",{key:1,ref:r.setVideoRef,class:"library-browser__video",muted:"",loop:"",playsinline:"",preload:"metadata",src:i.item.videoUrl,onLoadeddata:e[0]||(e[0]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[1]||(e[1]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,jO)):i.item.thumbUrl?(p(),f("img",{key:2,class:"library-browser__thumb",src:i.item.thumbUrl,alt:i.item.title,loading:"lazy",onLoad:e[2]||(e[2]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[3]||(e[3]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,XO)):i.item.videoUrl?(p(),f("video",{key:3,class:"library-browser__video library-browser__video--poster",muted:"",playsinline:"",preload:"metadata",src:i.item.videoUrl,onLoadeddata:e[4]||(e[4]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[5]||(e[5]=(...o)=>r.onMediaError&&r.onMediaError(...o))},null,40,KO)):(p(),f("div",YO,[ve(l,{name:"film"})])),i.badges.length?(p(),f("div",JO,[(p(!0),f(G,null,re(i.badges,(o,u)=>(p(),f("span",{key:"badge-"+u,class:U(["library-browser__badge",o.variant?`library-browser__badge--${o.variant}`:null])},_(o.label),3))),128))])):N("",!0)]),a("div",ZO,[a("h3",QO,_(i.item.title),1),i.item.meta?(p(),f("p",e4,_(i.item.meta),1)):N("",!0)]),i.showActions&&i.item.videoUrl?(p(),f("div",t4,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[6]||(e[6]=ft(o=>t.$emit("watch",i.item),["stop"]))}," Watch "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[7]||(e[7]=ft(o=>t.$emit("edit",i.item),["stop"]))}," Edit ")])):N("",!0)],42,HO)}const nv=it(GO,[["render",i4]]),n4={name:"ProjectsBrowser",components:{LibraryMediaCard:nv},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{projects:[],loading:!1,status:"",selectedId:null,hoveredId:null,fullscreenProject:null,previewVideos:{},dropzoneActive:!1,dropzoneDepth:0}},mounted(){this.active&&this.loadProjects(),document.addEventListener("keydown",this.onFullscreenKey)},beforeUnmount(){document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllPreviewVideos()},methods:{async loadProjects(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/projects"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load projects");this.projects=(Array.isArray(e.projects)?e.projects:[]).map(i=>({...i,meta:this.formatProjectMeta(i)}))}catch(t){this.status=t.message||"Projects unavailable",this.projects=[]}finally{this.loading=!1}},projectBadges(t){const e=[];return t.frameCount>0&&e.push({label:`${t.frameCount} frame${t.frameCount===1?"":"s"}`}),t.hasVideo&&e.push({label:"Video",variant:"video"}),e},formatProjectMeta(t){const e=[];if(t.frameCount>0&&e.push(`${t.frameCount} frame${t.frameCount===1?"":"s"}`),t.hasVideo&&e.push("video ready"),t.updatedAt){const i=new Date(t.updatedAt);Number.isNaN(i.getTime())||e.push(i.toLocaleDateString(void 0,{month:"short",day:"numeric"}))}return e.join(" · ")||"Empty project"},shouldPreviewVideo(t){return!!(t.hasVideo&&t.videoUrl&&(this.hoveredId===t.id||this.selectedId===t.id))},onPreviewVideoRef({id:t,el:e}){e?this.previewVideos[t]=e:delete this.previewVideos[t]},pauseAllPreviewVideos(){Object.values(this.previewVideos).forEach(t=>{try{t.pause()}catch{}})},selectProject(t){this.selectedId=(t==null?void 0:t.id)||null;const e=t?{...t,meta:this.formatProjectMeta(t)}:null;this.app.librarySelectedProject=e,this.app.librarySelectedVideo=e,t!=null&&t.hasVideo&&(t!=null&&t.videoUrl)&&this.$nextTick(()=>{var i,n;(n=(i=this.previewVideos[t.id])==null?void 0:i.play)==null||n.call(i).catch(()=>{})})},openProject(t){!(t!=null&&t.hasVideo)||!t.videoUrl||(this.fullscreenProject=t,this.$nextTick(()=>{var e,i;(i=(e=this.$refs.modalVideoEl)==null?void 0:e.play)==null||i.call(e).catch(()=>{})}))},closeFullscreen(){this.fullscreenProject=null},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeFullscreen()},onFullscreenKey(t){this.fullscreenProject&&t.key==="Escape"&&(t.stopPropagation(),this.closeFullscreen())},openProjectInEditor(t){if(!(t!=null&&t.videoPath)){this.status="This project has no video yet";return}this.app.openInVideoEditor({path:t.videoPath,rootId:t.rootId||"uploads",name:t.title,url:t.videoUrl})},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadVideoFile(t){if(!t)return;const e=String(t.name||"upload.mp4"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(i)){this.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await t.arrayBuffer(),r=new URLSearchParams({name:e,dir:"projects"}),l=await fetch(`/api/video-swarm/upload?${r.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":e},body:s}),o=await l.json();if(!l.ok)throw new Error(o.error||"Upload failed");this.status="Video added to Projects",await this.loadProjects();const u=this.projects.find(c=>c.videoPath===o.path);u&&this.selectProject(u)}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadVideoFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).forEach(s=>{this.uploadVideoFile(s)})}},watch:{active(t){t&&!this.projects.length&&!this.loading&&this.loadProjects()},hoveredId(t){this.$nextTick(()=>{Object.entries(this.previewVideos).forEach(([e,i])=>{var n;i&&(e===t||e===this.selectedId?(n=i.play)==null||n.call(i).catch(()=>{}):(i.pause(),i.currentTime=0))})})}}},s4={class:"library-browser__panel projects-browser","data-testid":"projects-browser"},r4={class:"library-browser__toolbar framesync-panel"},o4={class:"library-browser__actions"},a4=["disabled"],l4=["disabled"],u4={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},d4={key:0,class:"framesync-subtitle library-browser__status"},c4={key:0,class:"library-browser__dropzone-hint"},h4={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading projects"},m4={key:2,class:"library-browser__empty"},p4={key:3,class:"library-browser__grid"},f4={class:"library-browser__modal-inner"},g4={class:"library-browser__modal-head"},y4={class:"library-browser__modal-actions"},v4=["src"];function b4(t,e,i,n,s,r){const l=Ie("LibraryMediaCard");return p(),f("div",s4,[a("div",r4,[e[12]||(e[12]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Generations grouped by session — frame counts, previews, and exports. ")],-1)),a("div",o4,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"projects-upload-video",title:"Upload video to a new project",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Video ",8,a4),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"projects-refresh",onClick:e[1]||(e[1]=o=>r.loadProjects())},[s.loading?(p(),f("span",u4)):N("",!0),e[11]||(e[11]=ie(" Refresh ",-1))],10,l4),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"library-browser__upload-input","data-testid":"projects-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(p(),f("div",d4,_(s.status),1)):N("",!0)]),a("div",{class:U(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"projects-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(p(),f("div",c4," Drop video files to add a project ")):N("",!0),s.loading?(p(),f("div",h4,[(p(),f(G,null,re(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[13]||(e[13]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.projects.length?(p(),f("div",p4,[(p(!0),f(G,null,re(s.projects,o=>(p(),ht(l,{key:o.id,"card-test-id":"project-card",item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"show-video-preview":r.shouldPreviewVideo(o),"show-actions":o.hasVideo,badges:r.projectBadges(o),onMouseenter:u=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=u=>s.hoveredId=null),onClick:r.selectProject,onDblclick:r.openProject,onWatch:r.openProject,onEdit:r.openProjectInEditor,onVideoRef:r.onPreviewVideoRef},null,8,["item","selected","hovered","show-video-preview","show-actions","badges","onMouseenter","onClick","onDblclick","onWatch","onEdit","onVideoRef"]))),128))])):(p(),f("div",m4," No projects yet — generate frames on LIVE or upload a video with + Video. "))],34),s.fullscreenProject?(p(),f("div",{key:0,class:"library-browser__modal","data-testid":"projects-fullscreen",onClick:e[10]||(e[10]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",f4,[a("div",g4,[a("strong",null,_(s.fullscreenProject.title),1),a("div",y4,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=o=>r.openProjectInEditor(s.fullscreenProject))}," Open in editor "),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"library-fullscreen-close",onClick:e[9]||(e[9]=(...o)=>r.closeFullscreen&&r.closeFullscreen(...o))}," Close ")])]),s.fullscreenProject.videoUrl?(p(),f("video",{key:0,ref:"modalVideoEl",class:"library-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:s.fullscreenProject.videoUrl},null,8,v4)):N("",!0)])])):N("",!0)])}const _4=it(n4,[["render",b4]]),S4={name:"VideosBrowser",components:{LibraryMediaCard:nv},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{videos:[],loading:!1,status:"",selectedId:null,hoveredId:null,fullscreenVideo:null,previewVideos:{},dropzoneActive:!1,dropzoneDepth:0}},mounted(){this.active&&this.loadVideos(),document.addEventListener("keydown",this.onFullscreenKey)},beforeUnmount(){document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllPreviewVideos()},methods:{async loadVideos(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/videos"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load videos");this.videos=Array.isArray(e.videos)?e.videos:[]}catch(t){this.status=t.message||"Videos unavailable",this.videos=[]}finally{this.loading=!1}},videoBadges(t){const e=[{label:"Video",variant:"video"}];return t.source==="recording"&&e.push({label:"Recording",variant:"recording"}),t.source==="run"&&e.push({label:"Run",variant:"run"}),e},shouldPreviewVideo(t){return this.hoveredId===t.id||this.selectedId===t.id},onPreviewVideoRef({id:t,el:e}){e?this.previewVideos[t]=e:delete this.previewVideos[t]},pauseAllPreviewVideos(){Object.values(this.previewVideos).forEach(t=>{try{t.pause()}catch{}})},selectVideo(t){this.selectedId=(t==null?void 0:t.id)||null,this.app.librarySelectedVideo=t||null,this.app.librarySelectedProject=t||null,t!=null&&t.videoUrl&&this.$nextTick(()=>{var e,i;(i=(e=this.previewVideos[t.id])==null?void 0:e.play)==null||i.call(e).catch(()=>{})})},openVideo(t){t!=null&&t.videoUrl&&(this.fullscreenVideo=t,this.$nextTick(()=>{var e,i;(i=(e=this.$refs.modalVideoEl)==null?void 0:e.play)==null||i.call(e).catch(()=>{})}))},closeFullscreen(){this.fullscreenVideo=null},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeFullscreen()},onFullscreenKey(t){this.fullscreenVideo&&t.key==="Escape"&&(t.stopPropagation(),this.closeFullscreen())},openVideoInEditor(t){if(!(t!=null&&t.videoPath)){this.status="No video file for this item";return}this.app.openInVideoEditor({path:t.videoPath,rootId:t.rootId||"uploads",name:t.title,url:t.videoUrl})},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadVideoFile(t){if(!t)return;const e=String(t.name||"upload.mp4"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(i)){this.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await t.arrayBuffer(),r=new URLSearchParams({name:e,dir:"projects"}),l=await fetch(`/api/video-swarm/upload?${r.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":e},body:s}),o=await l.json();if(!l.ok)throw new Error(o.error||"Upload failed");this.status="Video added",await this.loadVideos();const u=this.videos.find(c=>c.videoPath===o.path);u&&this.selectVideo(u)}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadVideoFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).forEach(s=>{this.uploadVideoFile(s)})}},watch:{active(t){t&&!this.videos.length&&!this.loading&&this.loadVideos()},hoveredId(t){this.$nextTick(()=>{Object.entries(this.previewVideos).forEach(([e,i])=>{var n;i&&(e===t||e===this.selectedId?(n=i.play)==null||n.call(i).catch(()=>{}):(i.pause(),i.currentTime=0))})})}}},w4={class:"library-browser__panel videos-browser","data-testid":"videos-browser"},M4={class:"library-browser__toolbar framesync-panel"},x4={class:"library-browser__actions"},P4=["disabled"],T4=["disabled"],A4={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},C4={key:0,class:"framesync-subtitle library-browser__status"},E4={key:0,class:"library-browser__dropzone-hint"},k4={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading videos"},R4={key:2,class:"library-browser__empty"},L4={key:3,class:"library-browser__grid"},D4={class:"library-browser__modal-inner"},I4={class:"library-browser__modal-head"},F4={class:"library-browser__modal-actions"},N4=["src"];function O4(t,e,i,n,s,r){const l=Ie("LibraryMediaCard");return p(),f("div",w4,[a("div",M4,[e[12]||(e[12]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Every export, recording, and upload — thumbnails update as files appear. ")],-1)),a("div",x4,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"videos-upload-video",title:"Upload a video",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Video ",8,P4),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"videos-refresh",onClick:e[1]||(e[1]=o=>r.loadVideos())},[s.loading?(p(),f("span",A4)):N("",!0),e[11]||(e[11]=ie(" Refresh ",-1))],10,T4),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"library-browser__upload-input","data-testid":"videos-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(p(),f("div",C4,_(s.status),1)):N("",!0)]),a("div",{class:U(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"videos-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(p(),f("div",E4," Drop video files here ")):N("",!0),s.loading?(p(),f("div",k4,[(p(),f(G,null,re(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[13]||(e[13]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.videos.length?(p(),f("div",L4,[(p(!0),f(G,null,re(s.videos,o=>(p(),ht(l,{key:o.id,"card-test-id":"video-card",item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"show-video-preview":r.shouldPreviewVideo(o),badges:r.videoBadges(o),onMouseenter:u=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=u=>s.hoveredId=null),onClick:r.selectVideo,onDblclick:r.openVideo,onWatch:r.openVideo,onEdit:r.openVideoInEditor,onVideoRef:r.onPreviewVideoRef},null,8,["item","selected","hovered","show-video-preview","badges","onMouseenter","onClick","onDblclick","onWatch","onEdit","onVideoRef"]))),128))])):(p(),f("div",R4," No videos yet — record on LIVE, export a run, or upload with + Video. "))],34),s.fullscreenVideo?(p(),f("div",{key:0,class:"library-browser__modal","data-testid":"videos-fullscreen",onClick:e[10]||(e[10]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",D4,[a("div",I4,[a("strong",null,_(s.fullscreenVideo.title),1),a("div",F4,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=o=>r.openVideoInEditor(s.fullscreenVideo))}," Open in editor "),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"library-fullscreen-close",onClick:e[9]||(e[9]=(...o)=>r.closeFullscreen&&r.closeFullscreen(...o))}," Close ")])]),s.fullscreenVideo.videoUrl?(p(),f("video",{key:0,ref:"modalVideoEl",class:"library-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:s.fullscreenVideo.videoUrl},null,8,N4)):N("",!0)])])):N("",!0)])}const U4=it(S4,[["render",O4]]),V4={name:"LibraryAudioCard",components:{UiIcon:oi},props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},hovered:{type:Boolean,default:!1},useLabel:{type:String,default:"Use in session"}},emits:["click","use","mouseenter","mouseleave","preview-state"],data(){return{mediaLoading:!0,playing:!1,durationSec:null}},computed:{durationLabel(){if(!this.durationSec||!Number.isFinite(this.durationSec))return"";const t=Math.floor(this.durationSec/60),e=Math.floor(this.durationSec%60);return t>0?`${t}:${String(e).padStart(2,"0")}`:`${e}s`}},watch:{"item.id"(){this.mediaLoading=!0,this.playing=!1,this.durationSec=null,this.pausePreview()},selected(t){t||this.pausePreview()},playing(t){this.$emit("preview-state",{id:this.item.id,playing:t})}},beforeUnmount(){this.pausePreview()},methods:{onMediaReady(){this.mediaLoading=!1;const t=this.$refs.audioEl;t&&Number.isFinite(t.duration)&&t.duration>0&&(this.durationSec=t.duration)},onMediaError(){this.mediaLoading=!1},togglePreview(){var e;const t=this.$refs.audioEl;t&&(this.playing?t.pause():(e=t.play)==null||e.call(t).catch(()=>{}))},pausePreview(){const t=this.$refs.audioEl;if(t){try{t.pause()}catch{}this.playing=!1}}}},B4=["data-item-id","data-audio-path"],z4={class:"library-audio-card__media library-browser__media"},$4={key:0,class:"library-browser__media-loading lazy-loading-indicator lazy-loading-indicator--overlay","aria-hidden":"true"},G4=["src"],H4={class:"library-browser__badges"},W4={key:0,class:"library-browser__badge"},q4={class:"library-browser__copy"},j4={class:"library-browser__title"},X4={key:0,class:"library-browser__meta"},K4={class:"library-browser__card-actions"};function Y4(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("article",{class:U(["library-browser__card library-audio-card",{"library-browser__card--selected":i.selected,"library-browser__card--hover":i.hovered,"library-audio-card--playing":s.playing}]),"data-testid":"audio-card","data-item-id":i.item.id,"data-audio-path":i.item.audioPath||void 0,onMouseenter:e[7]||(e[7]=o=>t.$emit("mouseenter")),onMouseleave:e[8]||(e[8]=o=>t.$emit("mouseleave")),onClick:e[9]||(e[9]=o=>t.$emit("click",i.item))},[a("div",z4,[s.mediaLoading?(p(),f("div",$4,[...e[10]||(e[10]=[a("span",{class:"lazy-loading-indicator__spinner"},null,-1)])])):N("",!0),a("div",{class:U(["library-audio-card__wave",{"library-audio-card__wave--active":s.playing||i.selected}]),"aria-hidden":"true"},[(p(),f(G,null,re(16,o=>a("span",{key:"bar-"+o,class:"library-audio-card__bar",style:Pt({animationDelay:`${o%5*.08}s`})},null,4)),64))],2),ve(l,{class:"library-audio-card__icon",name:"mic"}),a("audio",{ref:"audioEl",class:"library-audio-card__audio",preload:"metadata",src:i.item.audioUrl,onLoadedmetadata:e[0]||(e[0]=(...o)=>r.onMediaReady&&r.onMediaReady(...o)),onError:e[1]||(e[1]=(...o)=>r.onMediaError&&r.onMediaError(...o)),onPlay:e[2]||(e[2]=o=>s.playing=!0),onPause:e[3]||(e[3]=o=>s.playing=!1),onEnded:e[4]||(e[4]=o=>s.playing=!1)},null,40,G4),a("div",H4,[e[11]||(e[11]=a("span",{class:"library-browser__badge library-browser__badge--audio"},"Audio",-1)),r.durationLabel?(p(),f("span",W4,_(r.durationLabel),1)):N("",!0)])]),a("div",q4,[a("h3",j4,_(i.item.title),1),i.item.meta?(p(),f("p",X4,_(i.item.meta),1)):N("",!0)]),a("div",K4,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=ft((...o)=>r.togglePreview&&r.togglePreview(...o),["stop"]))},_(s.playing?"Pause":"Preview"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"audio-use-in-session",onClick:e[6]||(e[6]=ft(o=>t.$emit("use",i.item),["stop"]))},_(i.useLabel),1)])],42,B4)}const J4=it(V4,[["render",Y4]]),Z4={name:"AudioBrowser",components:{LibraryAudioCard:J4},props:{app:{type:Object,required:!0},active:{type:Boolean,default:!0}},data(){return{tracks:[],loading:!1,status:"",selectedId:null,hoveredId:null,dropzoneActive:!1,dropzoneDepth:0,playingId:null}},computed:{libraryUseLabel(){var t;return(t=this.app)!=null&&t.librarySourceMode?"Use as source":"Use in session"}},mounted(){this.active&&this.loadAudio()},methods:{async loadAudio(){this.loading=!0,this.status="";try{const t=await fetch("/api/video-swarm/audio"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load audio");this.tracks=Array.isArray(e.audio)?e.audio:[]}catch(t){this.status=t.message||"Audio unavailable",this.tracks=[]}finally{this.loading=!1}},selectTrack(t){this.selectedId=(t==null?void 0:t.id)||null,this.app.librarySelectedAudio=t||null},useTrackInSession(t){if(!(t!=null&&t.audioPath)){this.status="No audio file for this item";return}if(typeof this.app.useLibraryAudio=="function"){const e=!!this.app.librarySourceMode;this.app.useLibraryAudio(t,{webgl:e}),this.status=e?"Driving WebGL visualizer":"Loaded into session — open AUDIO tab to react"}else this.status="Session audio handoff unavailable"},onPreviewState({id:t,playing:e}){this.playingId=e?t:this.playingId===t?null:this.playingId},openUploadPicker(){var t;(t=this.$refs.uploadInputEl)==null||t.click()},async uploadAudioFile(t){if(!t)return;const e=String(t.name||"upload.wav"),i=e.includes(".")?e.slice(e.lastIndexOf(".")).toLowerCase():"";if(i&&![".wav",".mp3",".ogg",".flac",".m4a"].includes(i)){this.status="Unsupported file type (use wav, mp3, ogg, flac, m4a)";return}this.loading=!0,this.status=`Uploading ${e}…`;try{const s=await new Promise((u,c)=>{const h=new FileReader;h.onload=()=>u(h.result),h.onerror=()=>c(h.error||new Error("Could not read file")),h.readAsDataURL(t)}),r=await fetch("/api/audio-upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,data:s})}),l=await r.json();if(!r.ok||l.error)throw new Error(l.error||"Upload failed");this.status="Audio added",await this.loadAudio();const o=this.tracks.find(u=>u.audioPath===l.path);o&&(this.selectTrack(o),this.app.librarySourceMode&&this.useTrackInSession(o))}catch(s){this.status=s.message||"Upload failed"}finally{this.loading=!1}},onUploadInputChange(t){var i;const e=Array.from(((i=t.target)==null?void 0:i.files)||[]);t.target.value="",e.forEach(n=>{this.uploadAudioFile(n)})},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth+=1,this.dropzoneActive=!0},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneActive=!0},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1)},onDropFiles(t){var i,n;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,Array.from(((n=t.dataTransfer)==null?void 0:n.files)||[]).filter(s=>{const r=String(s.name||"").toLowerCase();return/\.(wav|mp3|ogg|flac|m4a)$/.test(r)||String(s.type||"").startsWith("audio/")}).forEach(s=>{this.uploadAudioFile(s)})}},watch:{active(t){t&&!this.tracks.length&&!this.loading&&this.loadAudio()}}},Q4={class:"library-browser__panel audio-browser","data-testid":"audio-browser"},e5={class:"library-browser__toolbar framesync-panel"},t5={class:"library-browser__actions"},i5=["disabled"],n5=["disabled"],s5={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},r5={key:0,class:"framesync-subtitle library-browser__status"},o5={key:0,class:"library-browser__dropzone-hint"},a5={key:1,class:"library-browser__skeleton-grid","aria-busy":"true","aria-label":"Loading audio"},l5={key:2,class:"library-browser__empty"},u5={key:3,class:"library-browser__grid"};function d5(t,e,i,n,s,r){const l=Ie("LibraryAudioCard");return p(),f("div",Q4,[a("div",e5,[e[9]||(e[9]=a("div",{class:"library-browser__head"},[a("p",{class:"framesync-subtitle library-browser__subtitle"}," Uploaded and generated audio — preview tracks and load them into the reactive session. ")],-1)),a("div",t5,[a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:s.loading,"data-testid":"audio-upload",title:"Upload audio file",onClick:e[0]||(e[0]=o=>r.openUploadPicker())}," + Audio ",8,i5),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{"framesync-button--loading":s.loading}]),disabled:s.loading,"data-testid":"audio-refresh",onClick:e[1]||(e[1]=o=>r.loadAudio())},[s.loading?(p(),f("span",s5)):N("",!0),e[8]||(e[8]=ie(" Refresh ",-1))],10,n5),a("input",{ref:"uploadInputEl",type:"file",accept:"audio/wav,audio/mpeg,audio/ogg,audio/flac,audio/mp4,audio/x-m4a,.wav,.mp3,.ogg,.flac,.m4a",multiple:"",class:"library-browser__upload-input","data-testid":"audio-upload-input",onChange:e[2]||(e[2]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),s.status?(p(),f("div",r5,_(s.status),1)):N("",!0)]),a("div",{class:U(["library-browser__dropzone",{"library-browser__dropzone--active":s.dropzoneActive}]),"data-testid":"audio-dropzone",onDragenter:e[4]||(e[4]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[5]||(e[5]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[6]||(e[6]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[7]||(e[7]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive?(p(),f("div",o5," Drop audio files here ")):N("",!0),s.loading?(p(),f("div",a5,[(p(),f(G,null,re(6,o=>a("div",{key:"skel-"+o,class:"library-browser__skeleton-card"},[...e[10]||(e[10]=[a("div",{class:"library-browser__skeleton-media"},null,-1),a("div",{class:"library-browser__skeleton-line library-browser__skeleton-line--wide"},null,-1),a("div",{class:"library-browser__skeleton-line"},null,-1)])])),64))])):s.tracks.length?(p(),f("div",u5,[(p(!0),f(G,null,re(s.tracks,o=>(p(),ht(l,{key:o.id,item:o,selected:s.selectedId===o.id,hovered:s.hoveredId===o.id,"use-label":r.libraryUseLabel,onMouseenter:u=>s.hoveredId=o.id,onMouseleave:e[3]||(e[3]=u=>s.hoveredId=null),onClick:r.selectTrack,onUse:r.useTrackInSession,onPreviewState:r.onPreviewState},null,8,["item","selected","hovered","use-label","onMouseenter","onClick","onUse","onPreviewState"]))),128))])):(p(),f("div",l5," No audio yet — upload on AUDIO tab or drop a file here with + Audio. "))],34)])}const c5=it(Z4,[["render",d5]]),h5=24,m5={name:"VideoSwarmBrowser",components:{UiIcon:oi},props:{app:{type:Object,required:!0}},computed:{systemFiles(){return this.app.systemFiles},videoSwarmIsCloudRoot(){return this.app.videoSwarmIsCloudRoot},videoSwarmIsVideosOnly(){return this.app.videoSwarmIsVideosOnly},videoSwarmCloudPathLabel(){return this.app.videoSwarmCloudPathLabel},videoSwarmDisplayFolders(){return this.app.videoSwarmDisplayFolders},videoSwarmDisplayVideos(){return this.app.videoSwarmDisplayVideos},videoSwarmFullscreenVideo(){return this.app.videoSwarmFullscreenVideo},videoSwarmVisibleStart:{get(){return this.app.videoSwarmVisibleStart},set(t){this.app.videoSwarmVisibleStart=t}},videoSwarmVisibleEnd:{get(){return this.app.videoSwarmVisibleEnd},set(t){this.app.videoSwarmVisibleEnd=t}},libraryOutputHint(){var s,r;const t=String(((s=this.systemFiles)==null?void 0:s.rootId)||"frames"),i=(((r=this.systemFiles)==null?void 0:r.roots)||[]).find(l=>l.id===t);return(i==null?void 0:i.kind)==="cloud"?"Cloud-linked folder — open the drive link, then add direct video URLs for playback.":{uploads:"Converted outputs: img2img / txt2img (preview_*.png), stage recordings (defora_rec_*.mp4), demo-output.mp4, uploaded audio — also at /uploads/…",frames:"Live Deforum preview frames (frame_*.png) as they render; also in RUNS → Frames rail.",runs:"One folder per job (run.json, defora-job.json). Exported MP4s may sit inside the run folder or under Uploads.",hls:"HLS encoder output — .m3u8 playlist and .ts segments for stream preview (Settings → Output).",videoswarm:"Manual exports and editor handoff staging — use + Folder / + Video or Open in editor."}[t]||"Browse folders and videos under the selected library root."}},data(){return{hoveredPath:null,contextMenu:{open:!1,x:0,y:0,video:null,index:-1},tileVideos:{},modalVideoEl:null,dropzoneActive:!1,dropzoneDepth:0}},watch:{"systemFiles.videos"(){this.videoSwarmVisibleStart=0,this.videoSwarmVisibleEnd=48,this.$nextTick(()=>this.updateVisibleWindow())},"systemFiles.fullscreenIndex"(t){document.removeEventListener("keydown",this.onFullscreenKey),!(t<0)&&(this.$nextTick(()=>{var i;const e=this.$refs.modalVideoEl;e&&((i=e.play)==null||i.call(e).catch(()=>{}))}),document.addEventListener("keydown",this.onFullscreenKey))}},mounted(){this.initSystemFilesBrowser(),document.addEventListener("click",this.closeContextMenu)},beforeUnmount(){document.removeEventListener("click",this.closeContextMenu),document.removeEventListener("keydown",this.onFullscreenKey),this.pauseAllTileVideos()},methods:{initSystemFilesBrowser(...t){return this.app.initSystemFilesBrowser(...t)},browseSystemFiles(...t){return this.app.browseSystemFiles(...t)},refreshSystemFilesBrowse(...t){return this.app.refreshSystemFilesBrowse(...t)},openNewFolderDialog(...t){return this.app.openNewFolderDialog(...t)},createSystemFolder(...t){return this.app.createSystemFolder(...t)},cancelNewFolderDialog(...t){return this.app.cancelNewFolderDialog(...t)},uploadSystemVideoFiles(...t){return this.app.uploadSystemVideoFiles(...t)},toggleSystemFilesRecursive(...t){return this.app.toggleSystemFilesRecursive(...t)},toggleSystemFilesShowNames(...t){return this.app.toggleSystemFilesShowNames(...t)},toggleSystemFilesVideosOnly(...t){return this.app.toggleSystemFilesVideosOnly(...t)},setSystemFilesSort(...t){return this.app.setSystemFilesSort(...t)},setSystemFilesZoom(...t){return this.app.setSystemFilesZoom(...t)},connectCloudStorage(...t){return this.app.connectCloudStorage(...t)},cloudProviderLabel(...t){return this.app.cloudProviderLabel(...t)},openCloudStorageLink(...t){return this.app.openCloudStorageLink(...t)},disconnectCloudStorage(...t){return this.app.disconnectCloudStorage(...t)},addCloudStorageVideo(...t){return this.app.addCloudStorageVideo(...t)},openInVideoEditor(...t){return this.app.openInVideoEditor(...t)},deleteSystemFile(...t){return this.app.deleteSystemFile(...t)},copySystemFilePath(...t){return this.app.copySystemFilePath(...t)},openSystemFileFullscreen(...t){return this.app.openSystemFileFullscreen(...t)},closeSystemFileFullscreen(...t){return this.app.closeSystemFileFullscreen(...t)},stepSystemFileFullscreen(...t){return this.app.stepSystemFileFullscreen(...t)},toggleSystemFileSelection(...t){return this.app.toggleSystemFileSelection(...t)},systemFileMediaUrl(...t){return this.app.systemFileMediaUrl(...t)},formatVideoSwarmFileSize(...t){return this.app.formatVideoSwarmFileSize(...t)},saveSessionState(...t){return this.app.saveSessionState(...t)},setViewMode(t){t==="videos-only"&&this.videoSwarmIsCloudRoot||this.systemFiles.viewMode!==t&&(this.systemFiles.viewMode=t,this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState())},openUploadPicker(){if(this.videoSwarmIsCloudRoot)return;const t=this.$refs.uploadInputEl;t&&t.click()},onUploadInputChange(t){var i;const e=(i=t.target)==null?void 0:i.files;this.uploadSystemVideoFiles(e),t.target&&(t.target.value="")},onDropEnter(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneDepth+=1,this.dropzoneActive=!0)},onDropOver(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneActive=!0)},onDropLeave(t){var e;(e=t==null?void 0:t.preventDefault)==null||e.call(t),!this.videoSwarmIsCloudRoot&&(this.dropzoneDepth=Math.max(0,this.dropzoneDepth-1),this.dropzoneDepth===0&&(this.dropzoneActive=!1))},onDropFiles(t){var i,n;if((i=t==null?void 0:t.preventDefault)==null||i.call(t),this.dropzoneDepth=0,this.dropzoneActive=!1,this.videoSwarmIsCloudRoot)return;const e=(n=t.dataTransfer)==null?void 0:n.files;this.uploadSystemVideoFiles(e)},onRootChange(t){const e=(this.systemFiles.roots||[]).find(i=>i.id===t);if(e){if(e.kind==="cloud"){this.browseSystemFiles("",{rootId:e.id});return}this.browseSystemFiles(e.path,{rootId:e.id})}},selectCloudRoot(t){!t||!t.id||(this.systemFiles.cloudConnectOpen=!1,this.browseSystemFiles("",{rootId:`cloud:${t.id}`}))},openSystemFolder(t){!t||!t.path||this.browseSystemFiles(t.path,{rootId:t.rootId||this.systemFiles.rootId})},onGridScroll(){this.updateVisibleWindow()},updateVisibleWindow(){const t=this.$refs.gridEl,e=(this.systemFiles.videos||[]).length;if(!t||!e){this.videoSwarmVisibleStart=0,this.videoSwarmVisibleEnd=48;return}const i=t.querySelector(".video-swarm-browser__tile"),n=i?i.offsetHeight+10:180,s=Math.max(1,Math.floor(t.clientWidth/Math.max((i==null?void 0:i.offsetWidth)||200,120))),r=Math.ceil(t.clientHeight/n)+2,l=Math.max(0,Math.floor(t.scrollTop/n)-1),o=Math.max(0,l*s),u=Math.min(e,o+r*s+h5);this.videoSwarmVisibleStart=o,this.videoSwarmVisibleEnd=u},shouldLoadVideo(t){return!!(t&&(this.hoveredPath===t.path||this.systemFiles.selectedPaths.includes(t.path)))},registerTileVideo(t,e){e?this.tileVideos[t]=e:delete this.tileVideos[t]},onTileEnter(t){this.hoveredPath=t.path,this.$nextTick(()=>{var i;const e=this.tileVideos[t.path];e&&((i=e.play)==null||i.call(e).catch(()=>{}))})},onTileLeave(t){this.hoveredPath===t.path&&(this.hoveredPath=null);const e=this.tileVideos[t.path];e&&(e.pause(),e.currentTime=0)},pauseAllTileVideos(){Object.values(this.tileVideos).forEach(t=>{try{t.pause()}catch{}})},onVideoLoaded(t){var e;if(this.hoveredPath===t){const i=this.tileVideos[t];(e=i==null?void 0:i.play)==null||e.call(i).catch(()=>{})}},onTileClick(t,e){if(t.ctrlKey||t.metaKey){this.toggleSystemFileSelection(e.path);return}this.systemFiles.selectedPaths=[e.path]},onTileDblClick(t,e){var i;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.openSystemFileFullscreen(e)},onTileContextMenu(t,e){var i;(i=t==null?void 0:t.preventDefault)==null||i.call(t),this.openTileMenu(t,e)},openTileMenu(t,e){const n=(this.systemFiles.videos||[]).findIndex(s=>s.path===e.path);this.contextMenu={open:!0,x:t.clientX,y:t.clientY,video:e,index:n}},closeContextMenu(){this.contextMenu.open=!1},openContextFullscreen(){this.contextMenu.index>=0&&this.openSystemFileFullscreen(this.contextMenu.index),this.closeContextMenu()},deleteContextVideo(){this.contextMenu.video&&this.deleteSystemFile(this.contextMenu.video.path),this.closeContextMenu()},onFullscreenBackdropClick(t){t.target===t.currentTarget&&this.closeSystemFileFullscreen()},onFullscreenKey(t){if(!(this.systemFiles.fullscreenIndex<0)&&(t.key==="Escape"&&this.closeSystemFileFullscreen(),t.key==="ArrowLeft"&&this.stepSystemFileFullscreen(-1),t.key==="ArrowRight"&&this.stepSystemFileFullscreen(1),t.key===" ")){t.preventDefault();const e=this.$refs.modalVideoEl;if(!e)return;e.paused?e.play():e.pause()}}}},p5={class:"video-swarm-browser","data-testid":"video-swarm-browser"},f5={class:"video-swarm-browser__toolbar framesync-panel"},g5={class:"video-swarm-browser__toolbar-row"},y5={class:"video-swarm-browser__roots"},v5=["value","disabled"],b5=["value"],_5=["disabled"],S5=["disabled"],w5=["disabled"],M5={class:"video-swarm-browser__chips chips"},x5=["disabled"],P5=["disabled"],T5=["disabled"],A5=["disabled"],C5=["value","disabled"],E5={class:"video-swarm-browser__zoom"},k5=["value","disabled"],R5=["disabled"],L5={key:0,class:"video-swarm-browser__cloud-connect","data-testid":"video-swarm-cloud-connect"},D5={class:"video-swarm-browser__cloud-connect-row"},I5={key:0,class:"video-swarm-browser__cloud-list"},F5=["onClick"],N5=["onClick"],O5=["onClick"],U5={key:1,class:"video-swarm-browser__newfolder","data-testid":"video-swarm-new-folder-dialog"},V5={class:"video-swarm-browser__path"},B5={key:0},z5={key:1},$5={key:2,class:"video-swarm-browser__count"},G5={key:3,class:"video-swarm-browser__count"},H5={key:4,class:"video-swarm-browser__count"},W5={key:2,class:"video-swarm-browser__outputs-hint framesync-subtitle","data-testid":"video-swarm-outputs-hint"},q5={key:3,class:"framesync-subtitle video-swarm-browser__status"},j5={key:0,class:"video-swarm-browser__cloud-panel framesync-panel","data-testid":"video-swarm-cloud-panel"},X5={class:"framesync-header"},K5={class:"framesync-title"},Y5={class:"framesync-accent"},J5={class:"video-swarm-browser__cloud-panel-actions"},Z5={class:"framesync-subtitle"},Q5={class:"video-swarm-browser__cloud-video-form"},eU={key:0,class:"video-swarm-browser__dropzone-hint"},tU={key:1,class:"video-swarm-browser__empty"},iU={key:2,class:"video-swarm-browser__empty"},nU=["data-folder-path","title","onClick"],sU={key:0,class:"video-swarm-browser__label"},rU=["data-video-path","onClick","onDblclick","onContextmenu","onMouseenter","onMouseleave"],oU=["src","onLoadeddata"],aU={key:2,class:"video-swarm-browser__label"},lU={class:"video-swarm-browser__meta"},uU={class:"video-swarm-browser__modal-inner"},dU={class:"video-swarm-browser__modal-head"},cU={class:"video-swarm-browser__modal-actions"},hU=["src"];function mU(t,e,i,n,s,r){const l=Ie("UiIcon");return p(),f("div",p5,[a("div",f5,[a("div",g5,[a("div",y5,[a("select",{class:"framesync-select",value:r.systemFiles.rootId,disabled:r.systemFiles.loading,"data-testid":"video-swarm-root-select",onChange:e[0]||(e[0]=o=>r.onRootChange(o.target.value))},[(p(!0),f(G,null,re(r.systemFiles.roots,o=>(p(),f("option",{key:"vfs-root-"+o.id,value:o.id},_(o.label),9,b5))),128))],40,v5),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!r.systemFiles.parent||r.systemFiles.loading||r.videoSwarmIsCloudRoot||r.videoSwarmIsVideosOnly,title:"Parent folder",onClick:e[1]||(e[1]=o=>r.browseSystemFiles(r.systemFiles.parent))}," ↑ Up ",8,_5),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-new-folder",title:"New folder",onClick:e[2]||(e[2]=o=>r.openNewFolderDialog())}," + Folder ",8,S5),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-upload-video",title:"Upload video file",onClick:e[3]||(e[3]=o=>r.openUploadPicker())}," + Video ",8,w5),a("input",{ref:"uploadInputEl",type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-matroska,video/x-m4v,video/*,.mp4,.webm,.mov,.mkv,.m4v,.avi",multiple:"",class:"video-swarm-browser__upload-input","data-testid":"video-swarm-upload-input",onChange:e[4]||(e[4]=(...o)=>r.onUploadInputChange&&r.onUploadInputChange(...o))},null,544)]),a("div",M5,[a("button",{type:"button",class:U(["chip",{active:!r.videoSwarmIsVideosOnly}]),disabled:r.systemFiles.loading,"data-testid":"video-swarm-view-browse",onClick:e[5]||(e[5]=o=>r.setViewMode("browse"))}," Browse ",10,x5),a("button",{type:"button",class:U(["chip",{active:r.videoSwarmIsVideosOnly}]),disabled:r.systemFiles.loading||r.videoSwarmIsCloudRoot,"data-testid":"video-swarm-view-videos-only",onClick:e[6]||(e[6]=o=>r.setViewMode("videos-only"))}," Videos only ",10,P5),a("button",{type:"button",class:U(["chip",{active:r.systemFiles.recursive}]),disabled:r.systemFiles.loading||r.videoSwarmIsVideosOnly||r.videoSwarmIsCloudRoot,onClick:e[7]||(e[7]=(...o)=>r.toggleSystemFilesRecursive&&r.toggleSystemFilesRecursive(...o))}," Subfolders ",10,T5),a("button",{type:"button",class:U(["chip",{active:r.systemFiles.showFilenames}]),disabled:r.systemFiles.loading,onClick:e[8]||(e[8]=(...o)=>r.toggleSystemFilesShowNames&&r.toggleSystemFilesShowNames(...o))}," Names ",10,A5)]),a("select",{class:"framesync-select video-swarm-browser__sort",value:r.systemFiles.sortKey,disabled:r.systemFiles.loading,onChange:e[9]||(e[9]=o=>r.setSystemFilesSort(o.target.value))},[...e[43]||(e[43]=[$i('',6)])],40,C5),a("label",E5,[e[44]||(e[44]=a("span",{class:"framesync-subtitle"},"Zoom",-1)),a("input",{type:"range",min:"0",max:"4",step:"1",value:r.systemFiles.zoomLevel,disabled:r.systemFiles.loading,onInput:e[10]||(e[10]=o=>r.setSystemFilesZoom(Number(o.target.value)))},null,40,k5)]),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{active:r.systemFiles.cloudConnectOpen}]),"data-testid":"video-swarm-connect-cloud",onClick:e[11]||(e[11]=o=>r.systemFiles.cloudConnectOpen=!r.systemFiles.cloudConnectOpen)}," Connect cloud ",2),a("button",{type:"button",class:"framesync-button",disabled:r.systemFiles.loading,onClick:e[12]||(e[12]=o=>r.refreshSystemFilesBrowse(!0))}," Refresh ",8,R5)]),r.systemFiles.cloudConnectOpen?(p(),f("div",L5,[e[46]||(e[46]=a("div",{class:"video-swarm-browser__cloud-connect-title"},"Connect cloud storage",-1)),a("div",D5,[K(a("select",{"onUpdate:modelValue":e[13]||(e[13]=o=>t.cloudDriveDraft.provider=o),class:"framesync-select"},[...e[45]||(e[45]=[a("option",{value:"google_drive"},"Google Drive",-1),a("option",{value:"dropbox"},"Dropbox",-1),a("option",{value:"onedrive"},"OneDrive",-1),a("option",{value:"other"},"Other",-1)])],512),[[Rt,t.cloudDriveDraft.provider]]),K(a("input",{"onUpdate:modelValue":e[14]||(e[14]=o=>t.cloudDriveDraft.url=o),type:"url",class:"framesync-input",placeholder:"https://drive.google.com/… folder or file share link","data-testid":"video-swarm-cloud-url",onKeyup:e[15]||(e[15]=Mu(o=>r.connectCloudStorage(),["enter"]))},null,544),[[ae,t.cloudDriveDraft.url,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[16]||(e[16]=o=>r.connectCloudStorage())},"Connect")]),e[47]||(e[47]=a("div",{class:"framesync-subtitle video-swarm-browser__cloud-hint"}," Saves the share link in the browser. Open the drive in a new tab, then add direct video URLs below for playback. ",-1)),(r.systemFiles.cloudSources||[]).length?(p(),f("div",I5,[(p(!0),f(G,null,re(r.systemFiles.cloudSources,o=>(p(),f("div",{key:"cloud-src-"+o.id,class:"video-swarm-browser__cloud-item"},[a("button",{type:"button",class:"video-swarm-browser__cloud-item-main",onClick:u=>r.selectCloudRoot(o)},[a("strong",null,_(r.cloudProviderLabel(o.provider)),1),a("span",null,_(o.label),1)],8,F5),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:u=>r.openCloudStorageLink(o)},"Open",8,N5),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:u=>r.disconnectCloudStorage(o.id)},"Remove",8,O5)]))),128))])):N("",!0)])):N("",!0),r.systemFiles.newFolderOpen?(p(),f("div",U5,[K(a("input",{"onUpdate:modelValue":e[17]||(e[17]=o=>r.systemFiles.newFolderName=o),type:"text",class:"framesync-input",placeholder:"New folder name","data-testid":"video-swarm-new-folder-name",onKeyup:e[18]||(e[18]=Mu(o=>r.createSystemFolder(),["enter"]))},null,544),[[ae,r.systemFiles.newFolderName,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[19]||(e[19]=o=>r.createSystemFolder())},"Create"),a("button",{type:"button",class:"framesync-button",onClick:e[20]||(e[20]=o=>r.cancelNewFolderDialog())},"Cancel")])):N("",!0),a("div",V5,[r.videoSwarmIsCloudRoot?(p(),f("code",z5,_(r.videoSwarmCloudPathLabel),1)):(p(),f("code",B5,_(r.systemFiles.currentPath||"—"),1)),r.videoSwarmIsVideosOnly?(p(),f("span",$5,"Videos only · all subfolders")):r.systemFiles.folderCount!=null&&r.systemFiles.folderCount>0?(p(),f("span",G5,_(r.systemFiles.folderCount)+" folders ",1)):N("",!0),r.systemFiles.videoCount!=null?(p(),f("span",H5,_(r.systemFiles.videoCount)+" videos ",1)):N("",!0)]),r.libraryOutputHint?(p(),f("div",W5,_(r.libraryOutputHint),1)):N("",!0),r.systemFiles.status?(p(),f("div",q5,_(r.systemFiles.status),1)):N("",!0)]),r.videoSwarmIsCloudRoot&&r.systemFiles.cloudSource?(p(),f("div",j5,[a("div",X5,[a("div",K5,[a("span",Y5,_(r.cloudProviderLabel(r.systemFiles.cloudSource.provider)),1)]),a("div",J5,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[21]||(e[21]=o=>r.openCloudStorageLink(r.systemFiles.cloudSource))},"Open in browser"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[22]||(e[22]=o=>r.disconnectCloudStorage(r.systemFiles.cloudSource.id))},"Disconnect")])]),a("div",Z5,_(r.systemFiles.cloudSource.url),1),a("div",Q5,[K(a("input",{"onUpdate:modelValue":e[23]||(e[23]=o=>r.systemFiles.cloudVideoDraft.name=o),type:"text",class:"framesync-input",placeholder:"Label (optional)"},null,512),[[ae,r.systemFiles.cloudVideoDraft.name,void 0,{trim:!0}]]),K(a("input",{"onUpdate:modelValue":e[24]||(e[24]=o=>r.systemFiles.cloudVideoDraft.url=o),type:"url",class:"framesync-input",placeholder:"Direct video URL (https://…mp4)","data-testid":"video-swarm-cloud-video-url",onKeyup:e[25]||(e[25]=Mu(o=>r.addCloudStorageVideo(r.systemFiles.cloudSource.id),["enter"]))},null,544),[[ae,r.systemFiles.cloudVideoDraft.url,void 0,{trim:!0}]]),a("button",{type:"button",class:"framesync-button",onClick:e[26]||(e[26]=o=>r.addCloudStorageVideo(r.systemFiles.cloudSource.id))},"Add video")])])):N("",!0),a("div",{class:U(["video-swarm-browser__dropzone",{"video-swarm-browser__dropzone--active":s.dropzoneActive,"video-swarm-browser__dropzone--disabled":r.videoSwarmIsCloudRoot}]),"data-testid":"video-swarm-dropzone",onDragenter:e[28]||(e[28]=(...o)=>r.onDropEnter&&r.onDropEnter(...o)),onDragover:e[29]||(e[29]=(...o)=>r.onDropOver&&r.onDropOver(...o)),onDragleave:e[30]||(e[30]=(...o)=>r.onDropLeave&&r.onDropLeave(...o)),onDrop:e[31]||(e[31]=(...o)=>r.onDropFiles&&r.onDropFiles(...o))},[s.dropzoneActive&&!r.videoSwarmIsCloudRoot?(p(),f("div",eU," Drop video files to upload ")):N("",!0),r.systemFiles.loading?(p(),f("div",tU,"Scanning folder…")):!r.videoSwarmDisplayFolders.length&&!r.videoSwarmDisplayVideos.length?(p(),f("div",iU,_(r.videoSwarmIsCloudRoot?"No videos linked yet — add a direct URL above.":"No folders or videos — use + Video or drag files here."),1)):(p(),f("div",{key:3,ref:"gridEl",class:U(["video-swarm-browser__grid","video-swarm-browser__grid--zoom-"+r.systemFiles.zoomLevel]),onScroll:e[27]||(e[27]=(...o)=>r.onGridScroll&&r.onGridScroll(...o))},[(p(!0),f(G,null,re(r.videoSwarmDisplayFolders,o=>(p(),f("button",{key:"folder-"+o.path,type:"button",class:"video-swarm-browser__tile video-swarm-browser__tile--folder","data-testid":"video-swarm-folder","data-folder-path":o.path,title:o.name,onClick:u=>r.openSystemFolder(o)},[ve(l,{class:"video-swarm-browser__folder-icon",name:"folder","aria-hidden":"true"}),r.systemFiles.showFilenames?(p(),f("div",sU,_(o.name),1)):N("",!0)],8,nU))),128)),(p(!0),f(G,null,re(r.videoSwarmDisplayVideos,(o,u)=>(p(),f("button",{key:o.path,type:"button",class:U(["video-swarm-browser__tile",{"video-swarm-browser__tile--selected":r.systemFiles.selectedPaths.includes(o.path),"video-swarm-browser__tile--hover":s.hoveredPath===o.path}]),"data-video-path":o.path,onClick:c=>r.onTileClick(c,o,u),onDblclick:c=>r.onTileDblClick(c,u),onContextmenu:c=>r.onTileContextMenu(c,o),onMouseenter:c=>r.onTileEnter(o),onMouseleave:c=>r.onTileLeave(o)},[r.shouldLoadVideo(o)?(p(),f("video",{key:0,ref_for:!0,ref:c=>r.registerTileVideo(o.path,c),class:"video-swarm-browser__video",muted:"",loop:"",playsinline:"",preload:"metadata",src:r.systemFileMediaUrl(o.path),onLoadeddata:c=>r.onVideoLoaded(o.path)},null,40,oU)):(p(),ht(l,{key:1,class:"video-swarm-browser__placeholder",name:"play","aria-hidden":"true"})),r.systemFiles.showFilenames?(p(),f("div",aU,_(o.name),1)):N("",!0),a("div",lU,_(r.formatVideoSwarmFileSize(o.size)),1)],42,rU))),128))],34))],34),r.systemFiles.fullscreenIndex>=0&&r.videoSwarmFullscreenVideo?(p(),f("div",{key:1,class:"video-swarm-browser__modal","data-testid":"video-swarm-fullscreen",onClick:e[38]||(e[38]=(...o)=>r.onFullscreenBackdropClick&&r.onFullscreenBackdropClick(...o))},[a("div",uU,[a("div",dU,[a("strong",null,_(r.videoSwarmFullscreenVideo.name),1),a("div",cU,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[32]||(e[32]=o=>r.stepSystemFileFullscreen(-1))},"← Prev"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[33]||(e[33]=o=>r.stepSystemFileFullscreen(1))},"Next →"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[34]||(e[34]=o=>r.copySystemFilePath(r.videoSwarmFullscreenVideo.path))},"Copy path"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[35]||(e[35]=o=>r.openInVideoEditor(r.videoSwarmFullscreenVideo))},"Open in editor"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[36]||(e[36]=o=>r.deleteSystemFile(r.videoSwarmFullscreenVideo.path))},"Delete"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[37]||(e[37]=(...o)=>r.closeSystemFileFullscreen&&r.closeSystemFileFullscreen(...o))},"Close")])]),a("video",{ref:"modalVideoEl",class:"video-swarm-browser__modal-video",controls:"",autoplay:"",playsinline:"",src:r.systemFileMediaUrl(r.videoSwarmFullscreenVideo.path)},null,8,hU)])])):N("",!0),s.contextMenu.open?(p(),f("div",{key:2,class:"video-swarm-browser__menu",style:Pt({top:s.contextMenu.y+"px",left:s.contextMenu.x+"px"})},[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[39]||(e[39]=(...o)=>r.openContextFullscreen&&r.openContextFullscreen(...o))},"Open"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[40]||(e[40]=o=>r.openInVideoEditor(s.contextMenu.video))},"Open in editor"),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[41]||(e[41]=o=>{var u;return r.copySystemFilePath((u=s.contextMenu.video)==null?void 0:u.path)})},"Copy path"),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[42]||(e[42]=(...o)=>r.deleteContextVideo&&r.deleteContextVideo(...o))},"Delete")],4)):N("",!0)])}const pU=it(m5,[["render",mU]]),fU={name:"LibraryBrowserShell",components:{UiIcon:oi,ProjectsBrowser:_4,VideosBrowser:U4,AudioBrowser:c5,VideoSwarmBrowser:pU},props:{app:{type:Object,required:!0},initialTab:{type:String,default:"projects"}},data(){return{activeTab:["projects","videos","audio","files"].includes(this.initialTab)?this.initialTab:"projects"}},methods:{setTab(t){this.activeTab=["projects","videos","audio","files"].includes(t)?t:"projects"}}},gU={class:"library-browser","data-testid":"library-browser"},yU={class:"library-browser__tabs sub-pills",role:"tablist","aria-label":"Library collections","data-testid":"library-browser-tabs"},vU=["aria-selected"],bU=["aria-selected"],_U=["aria-selected"],SU=["aria-selected"];function wU(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("ProjectsBrowser"),u=Ie("VideosBrowser"),c=Ie("AudioBrowser"),h=Ie("VideoSwarmBrowser");return p(),f("div",gU,[a("div",yU,[a("button",{type:"button",role:"tab",class:U(["sub-pill library-browser__tab",{active:s.activeTab==="projects"}]),"aria-selected":s.activeTab==="projects"?"true":"false","data-testid":"library-tab-projects",onClick:e[0]||(e[0]=d=>r.setTab("projects"))},[ve(l,{name:"folder"}),e[4]||(e[4]=a("span",null,"Projects",-1))],10,vU),a("button",{type:"button",role:"tab",class:U(["sub-pill library-browser__tab",{active:s.activeTab==="videos"}]),"aria-selected":s.activeTab==="videos"?"true":"false","data-testid":"library-tab-videos",onClick:e[1]||(e[1]=d=>r.setTab("videos"))},[ve(l,{name:"film"}),e[5]||(e[5]=a("span",null,"Videos",-1))],10,bU),a("button",{type:"button",role:"tab",class:U(["sub-pill library-browser__tab",{active:s.activeTab==="audio"}]),"aria-selected":s.activeTab==="audio"?"true":"false","data-testid":"library-tab-audio",onClick:e[2]||(e[2]=d=>r.setTab("audio"))},[ve(l,{name:"mic"}),e[6]||(e[6]=a("span",null,"Audio",-1))],10,_U),a("button",{type:"button",role:"tab",class:U(["sub-pill library-browser__tab",{active:s.activeTab==="files"}]),"aria-selected":s.activeTab==="files"?"true":"false","data-testid":"library-tab-files",onClick:e[3]||(e[3]=d=>r.setTab("files"))},[ve(l,{name:"folder"}),e[7]||(e[7]=a("span",null,"Files",-1))],10,SU)]),K(ve(o,{class:"library-browser__pane",app:i.app,active:s.activeTab==="projects"},null,8,["app","active"]),[[Ii,s.activeTab==="projects"]]),K(ve(u,{class:"library-browser__pane",app:i.app,active:s.activeTab==="videos"},null,8,["app","active"]),[[Ii,s.activeTab==="videos"]]),K(ve(c,{class:"library-browser__pane",app:i.app,active:s.activeTab==="audio"},null,8,["app","active"]),[[Ii,s.activeTab==="audio"]]),K(ve(h,{class:"library-browser__pane library-browser__pane--files",app:i.app},null,8,["app"]),[[Ii,s.activeTab==="files"]])])}const MU=it(fU,[["render",wU]]),xU={name:"LibraryView",components:{UiIcon:oi,LibraryBrowserShell:MU},props:{app:{type:Object,required:!0},workspace:{type:Boolean,default:!1}},setup(t){return Tt(t)}},PU={class:"framesync-panel library-storage-browser"},TU={key:0,class:"framesync-header library-storage-browser__header"},AU={class:"framesync-title"},CU={class:"library-storage-browser__actions"};function EU(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("LibraryBrowserShell");return p(),f("div",{class:U(["library-shell",{"library-shell--fullscreen":t.libraryFullscreen&&!i.workspace,"library-shell--workspace":i.workspace}])},[a("div",PU,[i.workspace?N("",!0):(p(),f("div",TU,[a("div",AU,[ve(l,{class:"framesync-title-icon",name:"folder"}),e[2]||(e[2]=a("span",{class:"framesync-accent"},"Library",-1))]),e[3]||(e[3]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Projects, videos, and audio — browse, preview, open in the editor",-1))])),a("div",CU,[i.workspace&&t.librarySourceMode?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"use-library-as-source",onClick:e[0]||(e[0]=u=>t.applyLibrarySelectionAsSource())}," Use as source ")):N("",!0),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"open-in-video-editor",onClick:e[1]||(e[1]=u=>t.openInVideoEditor())}," Open in editor ")]),ve(o,{app:i.app},null,8,["app"])])],2)}const kU=it(xU,[["render",EU],["__scopeId","data-v-73077ca3"]]),RU={name:"EditorShell",props:{title:{type:String,default:"Editor"},titleAccent:{type:String,default:""},titleRest:{type:String,default:""},subtitle:{type:String,default:""},status:{type:String,default:""},statusLive:{type:Boolean,default:!1},testId:{type:String,default:""}}},LU=["data-testid"],DU={class:"framesync-header editor-shell__header"},IU={class:"editor-shell__titles"},FU={class:"framesync-title"},NU={key:0},OU={key:1,class:"framesync-accent"},UU={key:2,class:"framesync-accent"},VU={key:0,class:"framesync-subtitle editor-shell__subtitle"},BU={key:0,class:"editor-shell__actions"},zU={key:0,class:"editor-shell__pills sub-pills"},$U={class:"editor-shell__body"};function GU(t,e,i,n,s,r){return p(),f("div",{class:"editor-shell framesync-panel","data-testid":i.testId||"editor-shell"},[a("div",DU,[a("div",IU,[a("div",FU,[i.titleAccent?(p(),f("span",NU,_(i.titleAccent),1)):N("",!0),i.titleAccent?(p(),f("span",OU,_(i.titleRest),1)):(p(),f("span",UU,_(i.title),1))]),i.subtitle?(p(),f("span",VU,_(i.subtitle),1)):N("",!0)]),t.$slots.actions?(p(),f("div",BU,[No(t.$slots,"actions")])):N("",!0)]),t.$slots.pills?(p(),f("div",zU,[No(t.$slots,"pills")])):N("",!0),i.status?(p(),f("div",{key:1,class:U(["editor-shell__status",{"editor-shell__status--live":i.statusLive}])},_(i.status),3)):N("",!0),a("div",$U,[No(t.$slots,"default")])],8,LU)}const HU=it(RU,[["render",GU]]),WU={name:"EditorView",components:{EditorShell:HU},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},methods:{navigateFreecut(t){this.editorFreecutRoute=t==="projects"?"projects":String(t||"projects"),this.editorStatus=t==="projects"?"Browsing projects":"Opening editor",this.saveSessionState()},openFreecutNewTab(){typeof window>"u"||window.open(this.freecutFrameSrc,"_blank","noopener,noreferrer")},onFreecutLoad(){this.editorStatus="FreeCut ready",this.editorStatusLive=!0,this.editorImportUrl&&this.postImportToFreecut()},postImportToFreecut(){const t=this.$refs.freecutFrame,e=i_(this.editorImportUrl);if(!(!t||!t.contentWindow||!e))try{t.contentWindow.postMessage(e,window.location.origin),this.editorStatus="Sent import URL to FreeCut"}catch{this.editorStatus="Copy the import URL into FreeCut media library"}},importFromLibrary(){if(!this.editorImportUrl){this.editorStatus="Select a video in Library first";return}this.postImportToFreecut(),this.editorPendingImportPath="",this.editorPendingImportRootId="",this.editorPendingImportUrl=this.editorImportUrl,this.saveSessionState()},async copyImportUrl(){if(this.editorImportUrl)try{await navigator.clipboard.writeText(this.editorImportUrl),this.editorStatus="Import URL copied"}catch{this.editorStatus="Could not copy URL — select and copy manually"}}}},qU={class:"editor-view","data-testid":"editor-view"},jU=["disabled"],XU=["disabled"],KU={key:0,class:"editor-view__import"},YU={class:"editor-view__import-url"},JU=["src"];function ZU(t,e,i,n,s,r){const l=Ie("EditorShell");return p(),f("div",qU,[ve(l,{"title-accent":"Video","title-rest":"Editor",subtitle:"FreeCut — multi-track timeline, keyframes, WebGPU preview, and export",status:t.editorStatus,"status-live":t.editorStatusLive,"test-id":"video-editor-shell"},{actions:Ht(()=>[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[0]||(e[0]=o=>r.navigateFreecut("projects"))}," Projects "),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=(...o)=>r.openFreecutNewTab&&r.openFreecutNewTab(...o))}," Open tab "),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live",disabled:!t.editorImportUrl,onClick:e[2]||(e[2]=(...o)=>r.copyImportUrl&&r.copyImportUrl(...o))}," Copy import URL ",8,jU),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:!t.editorImportUrl,onClick:e[3]||(e[3]=(...o)=>r.importFromLibrary&&r.importFromLibrary(...o))}," Import from library ",8,XU)]),default:Ht(()=>[t.editorImportUrl?(p(),f("div",KU,[e[5]||(e[5]=a("span",{class:"framesync-subtitle"},"Library handoff",-1)),a("code",YU,_(t.editorImportUrl),1),e[6]||(e[6]=a("span",{class:"framesync-subtitle editor-view__import-hint"}," Paste into FreeCut media library → Import from URL, or use Import from library once the editor is ready. ",-1))])):N("",!0),a("iframe",{ref:"freecutFrame",class:"editor-view__frame","data-testid":"freecut-editor-frame",src:t.freecutFrameSrc,title:"FreeCut video editor",allow:"clipboard-write; storage-access *",onLoad:e[4]||(e[4]=(...o)=>r.onFreecutLoad&&r.onFreecutLoad(...o))},null,40,JU)]),_:1},8,["status","status-live"])])}const sv=it(WU,[["render",ZU]]),QU={name:"LibraryWorkspaceOverlay",components:{UiIcon:oi,LibraryView:kU,EditorView:sv},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},e8={key:0,class:"library-workspace","data-testid":"library-workspace",role:"dialog","aria-modal":"true","aria-label":"Library and video editor"},t8={class:"library-workspace__chrome"},i8={class:"library-workspace__tabs",role:"tablist"},n8=["aria-selected"],s8=["aria-selected"],r8={class:"library-workspace__body"},o8={class:"library-workspace__pane library-workspace__pane--editor","data-testid":"editor-workspace"};function a8(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("LibraryView"),u=Ie("EditorView");return p(),ht(_1,{name:"library-workspace-slide"},{default:Ht(()=>[t.libraryWorkspaceOpen?(p(),f("div",e8,[a("div",t8,[a("div",i8,[a("button",{type:"button",role:"tab",class:U(["library-workspace__tab",{"library-workspace__tab--active":t.libraryWorkspacePane==="browser"}]),"aria-selected":t.libraryWorkspacePane==="browser"?"true":"false","data-testid":"library-workspace-tab-browser",onClick:e[0]||(e[0]=c=>t.setLibraryWorkspacePane("browser"))},[ve(l,{name:"folder"}),e[3]||(e[3]=a("span",null,"Library",-1))],10,n8),a("button",{type:"button",role:"tab",class:U(["library-workspace__tab",{"library-workspace__tab--active":t.libraryWorkspacePane==="editor"}]),"aria-selected":t.libraryWorkspacePane==="editor"?"true":"false","data-testid":"library-workspace-tab-editor",onClick:e[1]||(e[1]=c=>t.setLibraryWorkspacePane("editor"))},[ve(l,{name:"film"}),e[4]||(e[4]=a("span",null,"Video editor",-1))],10,s8)]),a("button",{type:"button",class:"library-workspace__close framesync-button framesync-button--compact","data-testid":"close-library-workspace",title:"Close library",onClick:e[2]||(e[2]=c=>t.closeLibraryWorkspace())},[ve(l,{name:"chevron-up"}),e[5]||(e[5]=a("span",null,"Close",-1))])]),a("div",r8,[K(ve(o,{class:"library-workspace__pane",app:i.app,workspace:""},null,8,["app"]),[[Ii,t.libraryWorkspacePane==="browser"]]),K(a("div",o8,[ve(u,{app:i.app},null,8,["app"])],512),[[Ii,t.libraryWorkspacePane==="editor"]])])])):N("",!0)]),_:1})}const l8=it(QU,[["render",a8]]),u8={name:"ModelSourcePill",props:{source:{type:String,default:""}},computed:{tone(){const t=String(this.source||"").toLowerCase();return t==="sd-forge"?"forge":t==="cache"?"cache":t==="placeholder"?"placeholder":"other"},label(){const t=String(this.source||"").toLowerCase();return t==="sd-forge"?"Forge":t==="cache"?"Cache":t==="placeholder"?"Placeholder":this.source||"Unknown"}}},d8={class:"model-source-pill__label"};function c8(t,e,i,n,s,r){return p(),f("span",{class:U(["model-source-pill",`model-source-pill--${r.tone}`])},[e[0]||(e[0]=a("span",{class:"model-source-pill__dot","aria-hidden":"true"},null,-1)),a("span",d8,_(r.label),1)],2)}const h8=it(u8,[["render",c8]]),m8={name:"PromptsView",components:{ModelSourcePill:h8},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},p8={class:"sub-pills"},f8={key:0},g8={class:"rack"},y8={class:"framesync-panel prompt-style-bar","data-testid":"prompt-style-bar"},v8={class:"framesync-header"},b8={class:"prompt-style-bar__row"},_8=["value"],S8=["value"],w8={class:"framesync-checkbox prompt-style-bar__auto"},M8={key:0,class:"framesync-subtitle prompt-style-bar__hint"},x8={key:0},P8={key:1},T8={class:"rack"},A8={class:"framesync-panel prompts-schedule-hint","data-testid":"prompts-schedule-hint"},C8={class:"rack"},E8={class:"framesync-panel"},k8={class:"framesync-header"},R8={class:"prompt-toolbar"},L8={key:0,class:"morph-live-hint","data-testid":"prompt-morph-live-hint"},D8={class:"framesync-subtitle morph-live-hint__copy"},I8={key:0},F8={key:1},N8={key:0,class:"morph-slot-weights",style:{"margin-top":"12px"}},O8={class:"morph-slot-head"},U8={class:"framesync-checkbox morph-slot-weight-name"},V8=["onUpdate:modelValue"],B8={class:"morph-slot-meta"},z8={class:"morph-slot-chip morph-slot-chip--range"},$8={class:"morph-slot-chip morph-slot-chip--weight"},G8={class:"morph-slot-flow"},H8={class:"morph-slot-lane morph-slot-lane--a"},W8=["onUpdate:modelValue","disabled","onInput"],q8={class:"morph-slot-flow__bridge"},j8={class:"morph-slot-flow__readout"},X8={class:"morph-slot-flow__mix"},K8={class:"morph-slot-flow__preview"},Y8={class:"morph-slot-flow__mix morph-slot-flow__mix--b"},J8=["onUpdate:modelValue","disabled","onInput"],Z8={class:"morph-slot-lane morph-slot-lane--b"},Q8=["onUpdate:modelValue","disabled","onInput"],eV={class:"morph-slot-preview"},tV={key:1},iV={class:"rack"},nV={class:"framesync-panel"},sV={class:"framesync-header"},rV={key:0,class:"img2img-panel"},oV={class:"img2img-dropgrid"},aV={key:0,class:"img2img-dropzone__preview"},lV=["src"],uV={key:1,class:"img2img-dropzone__empty"},dV={key:0,class:"img2img-dropzone__preview"},cV=["src"],hV={key:1,class:"img2img-dropzone__empty"},mV={class:"img2img-dropgrid__actions"},pV=["disabled"],fV=["disabled"],gV={class:"img2img-controls-grid"},yV={class:"img2img-control-card img2img-control-card--primary"},vV={class:"img2img-control-card__value"},bV=["value"],_V={class:"img2img-control-card"},SV={class:"img2img-control-card"},wV={key:0,class:"img2img-control-card"},MV={class:"img2img-control-card__value"},xV=["value"],PV={key:1,class:"img2img-control-card"},TV={key:2,class:"img2img-control-card"},AV={class:"framesync-buttons"},CV={class:"framesync-footer img2img-panel__actions"},EV={key:0,class:"framesync-subtitle img2img-panel__status"},kV={key:1,class:"framesync-subtitle img2img-panel__output"},RV=["href"],LV={key:2},DV={class:"rack generate-story"},IV={class:"framesync-panel"},FV={class:"framesync-header"},NV={class:"generate-story__ollama-row"},OV={class:"generate-sequencer__hero-grid"},UV={class:"generate-sequencer__hero-card"},VV={class:"generate-sequencer__hero-value"},BV={class:"generate-sequencer__hero-meta"},zV={class:"generate-sequencer__hero-card"},$V={class:"generate-sequencer__hero-value"},GV={class:"generate-sequencer__hero-meta"},HV={class:"generate-sequencer__hero-card"},WV={class:"generate-sequencer__hero-value generate-sequencer__hero-value--compact"},qV={class:"generate-sequencer__hero-card"},jV={class:"generate-sequencer__hero-value generate-sequencer__hero-value--status generate-sequencer__hero-value--compact"},XV={class:"generate-sequencer__hero-meta"},KV={class:"generate-story__config"},YV={class:"framesync-stack generate-story__theme-field"},JV={class:"img2img-controls-grid generate-story__controls-grid"},ZV={class:"img2img-control-card img2img-control-card--primary"},QV={key:0,class:"img2img-control-card"},eB={class:"img2img-control-card"},tB={class:"img2img-control-card__value"},iB=["value"],nB={class:"img2img-control-card"},sB={class:"img2img-control-card"},rB={class:"prompt-toolbar generate-story__actions"},oB=["disabled"],aB=["disabled"],lB={key:0,class:"generate-sequencer__status-text"},uB={key:1,class:"generate-story__llm-log","data-testid":"story-llm-request-panel"},dB={class:"generate-story__llm-json","data-testid":"story-llm-request-json"},cB={key:2,class:"generate-story__story-result"},hB={class:"framesync-header"},mB={key:0,class:"pill"},pB={class:"generate-story__story-text"},fB={class:"prompt-toolbar generate-story__actions"},gB={key:3,class:"generate-story__preview"},yB={class:"framesync-header"},vB={key:0,class:"generate-story__image-wrap"},bB=["src"],_B={key:3},SB={class:"rack"},wB={class:"framesync-panel"},MB={class:"framesync-header"},xB={class:"prompt-toolbar"},PB={class:"lora-family-pill"},TB={key:0,class:"lora-picker-panel"},AB={class:"framesync-subtitle lora-browser-summary"},CB={key:0},EB={key:1},kB={class:"lora-picker-families"},RB={class:"lora-picker-family__title"},LB={class:"lora-picker-list"},DB={class:"lora-picker-row__copy"},IB={class:"lora-picker-row__name"},FB={class:"lora-picker-row__path"},NB={class:"lora-picker-row__actions"},OB=["onClick"],UB=["onClick"],VB=["onClick"],BB=["onClick"],zB={key:0,class:"lora-picker-empty"},$B={key:0},GB={key:1},HB={class:"lora-active-groups"},WB={class:"lora-active-group lora-active-group--common"},qB={class:"lora-active-group__title"},jB={class:"lora-active-group__body"},XB={class:"lora-active-group__copy"},KB={class:"lora-active-group__name"},YB={class:"lora-active-group__value"},JB=["value","onInput"],ZB=["onClick"],QB={key:0,class:"lora-active-group__empty"},e6={class:"lora-active-group lora-active-group--a"},t6={class:"lora-active-group__title"},i6={class:"lora-active-group__body"},n6={class:"lora-active-group__copy"},s6={class:"lora-active-group__name"},r6={class:"lora-active-group__value"},o6=["value","onInput"],a6=["onClick"],l6={key:0,class:"lora-active-group__empty"},u6={class:"lora-active-group lora-active-group--b"},d6={class:"lora-active-group__title"},c6={class:"lora-active-group__body"},h6={class:"lora-active-group__copy"},m6={class:"lora-active-group__name"},p6={class:"lora-active-group__value"},f6=["value","onInput"],g6=["onClick"],y6={key:0,class:"lora-active-group__empty"},v6={class:"lora-crossfader-hint","data-testid":"lora-crossfader-hint"},b6={class:"framesync-footer",style:{"margin-top":"12px"}},_6={key:4},S6={class:"rack"},w6={class:"framesync-panel"},M6={class:"framesync-header"},x6={class:"prompt-toolbar"},P6={class:"controlnet-slot-strip",style:{"margin-top":"12px",display:"flex","flex-direction":"column",gap:"6px"}},T6=["onClick"],A6=["onClick"],C6={class:"rack"},E6={class:"framesync-panel"},k6={class:"framesync-header"},R6={class:"framesync-title"},L6={class:"framesync-accent"},D6={class:"framesync-stack",style:{"margin-top":"12px"}},I6=["value"],F6={class:"framesync-subtitle",style:{"margin-top":"4px"}},N6={class:"framesync-stack",style:{"margin-top":"12px"}},O6={style:{display:"flex",gap:"8px","flex-wrap":"wrap"}},U6={key:0,class:"framesync-stack",style:{"margin-top":"12px"}},V6={ref:"webcamVideo",autoplay:"",playsinline:"",style:{width:"100%","max-width":"320px","border-radius":"6px",border:"1px solid var(--border)",display:"none"}},B6={ref:"webcamCanvas",style:{display:"none"}},z6={style:{display:"flex",gap:"8px","margin-top":"8px"}},$6={key:1,class:"framesync-stack",style:{"margin-top":"12px"}},G6={class:"framesync-footer",style:{"margin-top":"10px"}},H6={class:"framesync-stack",style:{"margin-top":"12px"}},W6={style:{display:"flex","justify-content":"space-between","align-items":"center"}},q6={style:{color:"var(--text-primary)","font-size":"12px"}},j6={class:"controlnet-weight-card",style:{"margin-top":"4px","font-size":"11px",color:"var(--text-secondary)"}},X6={class:"framesync-stack",style:{"margin-top":"12px"}},K6={style:{display:"flex","justify-content":"space-between","align-items":"center"}},Y6={style:{color:"var(--text-primary)","font-size":"12px"}},J6={class:"framesync-stack",style:{"margin-top":"12px"}},Z6={style:{display:"flex","justify-content":"space-between","align-items":"center"}},Q6={style:{color:"var(--text-primary)","font-size":"12px"}};function ez(t,e,i,n,s,r){const l=Ie("ModelSourcePill");return p(),f("div",null,[a("div",p8,[a("button",{class:U(["sub-pill",{active:t.currentSubTab.PROMPTS==="PROMPTS"}]),onClick:e[0]||(e[0]=o=>t.switchSubTab("PROMPTS","PROMPTS"))},"PROMPTS",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.PROMPTS==="IMAGE"}]),onClick:e[1]||(e[1]=o=>t.switchSubTab("PROMPTS","IMAGE"))},"IMAGE",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.PROMPTS==="LORA"}]),onClick:e[2]||(e[2]=o=>t.switchSubTab("PROMPTS","LORA"))},"LORA",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.PROMPTS==="CONTROLNET"}]),onClick:e[3]||(e[3]=o=>t.switchSubTab("PROMPTS","CONTROLNET"))},"CONTROLNET",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.PROMPTS==="STORY"}]),onClick:e[4]||(e[4]=o=>t.switchSubTab("PROMPTS","STORY"))},"STORY",2)]),t.currentSubTab.PROMPTS==="PROMPTS"?(p(),f("div",f8,[a("div",g8,[a("div",y8,[a("div",v8,[e[69]||(e[69]=a("div",{class:"framesync-title"},[ie("Style "),a("span",{class:"framesync-accent"},"modifier")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[5]||(e[5]=o=>{t.switchTab("SETTINGS"),t.switchSubTab("SETTINGS","STYLES")})}," Manage styles ")]),a("div",b8,[a("select",{class:"framesync-select prompt-style-bar__select","data-testid":"prompt-style-select",value:t.activePromptStyleId||"",onChange:e[6]||(e[6]=o=>t.selectActivePromptStyle(o.target.value||null))},[e[70]||(e[70]=a("option",{value:""},"No style (base prompts only)",-1)),(p(!0),f(G,null,re(t.promptStyles,o=>(p(),f("option",{key:"prompt-style-opt-"+o.id,value:o.id},_(o.name),9,S8))),128))],40,_8),a("label",w8,[K(a("input",{"onUpdate:modelValue":e[7]||(e[7]=o=>t.promptStyleAutoExample=o),type:"checkbox",onChange:e[8]||(e[8]=o=>t.saveSessionState())},null,544),[[Ci,t.promptStyleAutoExample]]),e[71]||(e[71]=ie(" Save preview as style example ",-1))])]),t.activePromptStyle?(p(),f("p",M8,[e[72]||(e[72]=ie(" Appends to prompts: ",-1)),t.activePromptStyle.positive?(p(),f("span",x8,"+"+_(t.activePromptStyle.positive.slice(0,120))+_(t.activePromptStyle.positive.length>120?"…":""),1)):N("",!0),t.activePromptStyle.negative?(p(),f("span",P8," · neg +"+_(t.activePromptStyle.negative.slice(0,80))+_(t.activePromptStyle.negative.length>80?"…":""),1)):N("",!0)])):N("",!0)])]),a("div",T8,[a("div",A8,[e[73]||(e[73]=a("p",{class:"framesync-subtitle prompts-schedule-hint__copy"}," Frame-by-frame prompt and negative schedules are edited in the Engine drawer (Deforum → Prompts tab), not here. ",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact framesync-button--live","data-testid":"prompts-open-engine-schedules",onClick:e[9]||(e[9]=o=>t.openEngineDeforumSettingsTab("prompts"))}," Open prompt schedules ")])]),a("div",C8,[a("div",E8,[a("div",k8,[e[74]||(e[74]=a("div",{class:"framesync-title"},[ie("Prompt "),a("span",{class:"framesync-accent"},"Morphing")],-1)),a("div",R8,[a("button",{class:U(["framesync-button",{"framesync-button--live":t.prompts.morphOn}]),onClick:e[10]||(e[10]=o=>t.setMorph(!0))},"Enabled",2),a("button",{class:U(["framesync-button",{active:!t.prompts.morphOn}]),onClick:e[11]||(e[11]=o=>t.setMorph(!1))},"Disabled",2),t.prompts.morphOn?(p(),f("button",{key:0,class:"framesync-button",onClick:e[12]||(e[12]=o=>{t.morphCollapsed=!t.morphCollapsed,t.saveSessionState()})},_(t.morphCollapsed?"Edit morph slots":"Collapse slots"),1)):N("",!0)])]),t.prompts.morphOn?(p(),f("div",L8,[a("div",D8,[e[75]||(e[75]=ie(" Prompt morph blend is on the ",-1)),e[76]||(e[76]=a("strong",null,"LIVE",-1)),ie(" stage (Morph HUD, bottom-right). A/B mix: "+_(Math.round((1-t.prompts.morphBlend)*100))+"% · "+_(Math.round(t.prompts.morphBlend*100))+"% ",1),t.promptMorphBlendLinkStatus?(p(),f("span",I8," · "+_(t.promptMorphBlendLinkStatus),1)):N("",!0)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[13]||(e[13]=o=>t.switchTab("LIVE"))}," Open LIVE morph ")])):N("",!0),t.prompts.morphOn&&!t.morphCollapsed?(p(),f("div",F8,[t.prompts.morphOn?(p(),f("div",N8,[(p(!0),f(G,null,re(t.morphSlots,o=>(p(),f("div",{key:"mw-"+o.id,class:U(["morph-slot-weight-row",{inactive:!o.on,"morph-slot-weight-row--flowing":o.on&&t.morphSlotInRange(o),"morph-slot-weight-row--waiting":o.on&&!t.morphSlotInRange(o)}]),style:Pt({"--morph-flow-progress":`${(t.morphBlendInSlotRange(o)*100).toFixed(1)}%`})},[a("div",O8,[a("label",U8,[K(a("input",{type:"checkbox","onUpdate:modelValue":u=>o.on=u,onChange:e[14]||(e[14]=(...u)=>t.applyPromptMorphing&&t.applyPromptMorphing(...u))},null,40,V8),[[Ci,o.on]]),ie(" "+_(o.name),1)]),a("div",B8,[a("span",z8,_(o.range),1),a("span",$8,"Weight "+_(o.weight.toFixed(2)),1),a("span",{class:U(["morph-slot-chip",o.on&&t.morphSlotInRange(o)?"morph-slot-chip--active":"morph-slot-chip--idle"])},_(o.on?t.morphSlotInRange(o)?"Flowing":"Waiting":"Muted"),3)])]),a("div",G8,[a("label",H8,[e[77]||(e[77]=a("span",{class:"morph-slot-editor__label"},"A phrase",-1)),K(a("input",{type:"text","onUpdate:modelValue":u=>o.a=u,class:"framesync-input morph-slot-editor__input",disabled:!o.on,onInput:u=>t.onMorphSlotPhraseInput(o)},null,40,W8),[[ae,o.a,void 0,{trim:!0}]])]),a("div",q8,[e[78]||(e[78]=a("div",{class:"morph-slot-flow__track"},[a("span",{class:"morph-slot-flow__glow"}),a("span",{class:"morph-slot-flow__marker"})],-1)),a("div",j8,[a("span",X8,"A "+_(((1-t.prompts.morphBlend)*100).toFixed(0))+"%",1),a("span",K8,_(t.morphSlotPreview(o)),1),a("span",Y8,"B "+_((t.prompts.morphBlend*100).toFixed(0))+"%",1)]),K(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":u=>o.weight=u,class:"framesync-input morph-slot-weight-slider",disabled:!o.on,onInput:u=>t.onMorphSlotWeightInput(o)},null,40,J8),[[ae,o.weight,void 0,{number:!0}]])]),a("label",Z8,[e[79]||(e[79]=a("span",{class:"morph-slot-editor__label"},"B phrase",-1)),K(a("input",{type:"text","onUpdate:modelValue":u=>o.b=u,class:"framesync-input morph-slot-editor__input",disabled:!o.on,onInput:u=>t.onMorphSlotPhraseInput(o)},null,40,Q8),[[ae,o.b,void 0,{trim:!0}]])])]),a("code",eV,_(t.morphSlotPreview(o)),1)],6))),128))])):N("",!0)])):N("",!0)])])])):t.currentSubTab.PROMPTS==="IMAGE"?(p(),f("div",tV,[a("div",iV,[a("div",nV,[a("div",sV,[e[80]||(e[80]=a("div",{class:"framesync-title"},[ie("img2img "),a("span",{class:"framesync-accent"},"(Forge)")],-1)),a("button",{class:"framesync-button",onClick:e[15]||(e[15]=o=>t.img2img.show=!t.img2img.show)},_(t.img2img.show?"Hide":"Show"),1)]),t.img2img.show?(p(),f("div",rV,[e[91]||(e[91]=a("div",{class:"framesync-subtitle img2img-panel__summary"},[ie(" Use an "),a("strong",null,"input image"),ie(" with optional "),a("strong",null,"mask"),ie(" for inpainting. Drag files into the boxes below or click to browse. ")],-1)),a("div",oV,[a("label",{class:U(["img2img-dropzone",{"img2img-dropzone--filled":!!t.img2img.dataUrl}]),onDragover:e[17]||(e[17]=ft(()=>{},["prevent"])),onDragenter:e[18]||(e[18]=ft(()=>{},["prevent"])),onDrop:e[19]||(e[19]=ft(o=>t.handleImg2imgDrop(o,"input"),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input",onChange:e[16]||(e[16]=(...o)=>t.handleImg2imgFile&&t.handleImg2imgFile(...o))},null,32),t.img2img.dataUrl?(p(),f("div",aV,[a("img",{src:t.img2img.dataUrl,alt:"Input preview",class:"img2img-dropzone__image"},null,8,lV)])):(p(),f("div",uV,[...e[81]||(e[81]=[a("div",{class:"img2img-dropzone__title"},"Input image",-1),a("div",{class:"img2img-dropzone__hint"},"Drag and drop an image here",-1),a("div",{class:"img2img-dropzone__meta"},"or click to browse",-1)])]))],34),a("label",{class:U(["img2img-dropzone img2img-dropzone--mask",{"img2img-dropzone--filled":!!t.img2img.maskDataUrl}]),onDragover:e[21]||(e[21]=ft(()=>{},["prevent"])),onDragenter:e[22]||(e[22]=ft(()=>{},["prevent"])),onDrop:e[23]||(e[23]=ft(o=>t.handleImg2imgDrop(o,"mask"),["prevent"]))},[a("input",{type:"file",accept:"image/*",class:"img2img-dropzone__input",onChange:e[20]||(e[20]=(...o)=>t.handleImg2imgMask&&t.handleImg2imgMask(...o))},null,32),t.img2img.maskDataUrl?(p(),f("div",dV,[a("img",{src:t.img2img.maskDataUrl,alt:"Mask preview",class:"img2img-dropzone__image"},null,8,cV)])):(p(),f("div",hV,[...e[82]||(e[82]=[a("div",{class:"img2img-dropzone__title"},"Mask image",-1),a("div",{class:"img2img-dropzone__hint"},"Optional inpaint mask",-1),a("div",{class:"img2img-dropzone__meta"},"white repaints, black keeps",-1)])]))],34)]),a("div",mV,[a("button",{class:"framesync-button",disabled:!t.img2img.dataUrl,onClick:e[24]||(e[24]=(...o)=>t.clearImg2imgInput&&t.clearImg2imgInput(...o))},"Clear input",8,pV),a("button",{class:"framesync-button",disabled:!t.img2img.maskDataUrl,onClick:e[25]||(e[25]=(...o)=>t.clearImg2imgMask&&t.clearImg2imgMask(...o))},"Clear mask",8,fV)]),a("div",gV,[a("div",yV,[e[83]||(e[83]=a("div",{class:"framesync-subtitle"},"Denoising strength",-1)),a("div",vV,_(t.img2img.denoisingStrength.toFixed(2)),1),a("input",{type:"range",min:"0",max:"1",step:"0.01",value:t.img2img.denoisingStrength,class:"framesync-input img2img-control-card__slider",onInput:e[26]||(e[26]=o=>t.img2img.denoisingStrength=parseFloat(o.target.value))},null,40,bV)]),a("div",_V,[e[84]||(e[84]=a("div",{class:"framesync-subtitle"},"Width",-1)),K(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[27]||(e[27]=o=>t.img2img.width=o),min:"64",max:"2048",step:"64"},null,512),[[ae,t.img2img.width,void 0,{number:!0}]])]),a("div",SV,[e[85]||(e[85]=a("div",{class:"framesync-subtitle"},"Height",-1)),K(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[28]||(e[28]=o=>t.img2img.height=o),min:"64",max:"2048",step:"64"},null,512),[[ae,t.img2img.height,void 0,{number:!0}]])]),t.img2img.maskDataUrl?(p(),f("div",wV,[e[86]||(e[86]=a("div",{class:"framesync-subtitle"},"Mask blur",-1)),a("div",MV,_(t.img2img.maskBlur),1),a("input",{type:"range",min:"0",max:"64",step:"1",value:t.img2img.maskBlur,class:"framesync-input img2img-control-card__slider",onInput:e[29]||(e[29]=o=>t.img2img.maskBlur=parseInt(o.target.value,10))},null,40,xV)])):N("",!0),t.img2img.maskDataUrl?(p(),f("div",PV,[e[88]||(e[88]=a("div",{class:"framesync-subtitle"},"Inpainting fill",-1)),K(a("select",{class:"framesync-select img2img-control-card__input","onUpdate:modelValue":e[30]||(e[30]=o=>t.img2img.inpaintingFill=o)},[...e[87]||(e[87]=[a("option",{value:"0"},"Fill",-1),a("option",{value:"1"},"Original",-1),a("option",{value:"2"},"Latent noise",-1),a("option",{value:"3"},"Latent nothing",-1)])],512),[[Rt,t.img2img.inpaintingFill,void 0,{number:!0}]])])):N("",!0),t.img2img.maskDataUrl?(p(),f("div",TV,[e[89]||(e[89]=a("div",{class:"framesync-subtitle"},"Masked area",-1)),a("div",AV,[a("button",{class:U(["framesync-button",{active:t.img2img.inpaintFullRes}]),onClick:e[31]||(e[31]=o=>t.img2img.inpaintFullRes=!0)},"Full res",2),a("button",{class:U(["framesync-button",{active:!t.img2img.inpaintFullRes}]),onClick:e[32]||(e[32]=o=>t.img2img.inpaintFullRes=!1)},"Whole image",2)])])):N("",!0)]),a("div",CV,[a("button",{class:"framesync-button",onClick:e[33]||(e[33]=(...o)=>t.runImg2img&&t.runImg2img(...o))},_(t.img2img.loading?"Running…":"Run img2img"),1)]),t.img2img.status?(p(),f("div",EV,_(t.img2img.status),1)):N("",!0),t.img2img.lastPath?(p(),f("div",kV,[e[90]||(e[90]=ie(" Output: ",-1)),a("a",{href:t.img2img.lastPath,target:"_blank",style:{color:"var(--warn)"}},_(t.img2img.lastPath),9,RV)])):N("",!0)])):N("",!0)])])])):t.currentSubTab.PROMPTS==="STORY"?(p(),f("div",LV,[a("div",DV,[a("div",IV,[a("div",FV,[e[92]||(e[92]=a("div",{class:"framesync-title"},[ie("Story "),a("span",{class:"framesync-accent"},"Generator")],-1)),a("span",{class:U(["generate-sequencer__status",{"generate-sequencer__status--live":t.storyGeneratorStatusLive}])},_(t.storyGeneratorStatusLabel),3)]),a("div",NV,[a("span",{class:U(["generate-story__ollama-status",{"generate-story__ollama-status--ready":t.storyOllamaStatusTone==="ready","generate-story__ollama-status--warn":t.storyOllamaStatusTone==="warn","generate-story__ollama-status--off":t.storyOllamaStatusTone==="off"}])},_(t.storyOllamaStatusLabel),3),t.storyOllamaNeedsConfigure?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",onClick:e[34]||(e[34]=(...o)=>t.openGpuSettings&&t.openGpuSettings(...o))}," Configure ")):N("",!0)]),a("div",OV,[a("div",UV,[e[93]||(e[93]=a("div",{class:"framesync-subtitle"},"Scenes",-1)),a("div",VV,_(t.storyGeneratorSceneCount),1),a("div",BV,_(t.storyGeneratorSceneMeta),1)]),a("div",zV,[e[94]||(e[94]=a("div",{class:"framesync-subtitle"},"Frames",-1)),a("div",$V,_(t.storyGeneratorFrameCount),1),a("div",GV,_(t.storyGeneratorTimelineMeta),1)]),a("div",HV,[e[95]||(e[95]=a("div",{class:"framesync-subtitle"},"Resolution",-1)),a("div",WV,_(t.storyGeneratorResolutionLabel),1),e[96]||(e[96]=a("div",{class:"generate-sequencer__hero-meta"},"From Deforum timeline settings",-1))]),a("div",qV,[e[97]||(e[97]=a("div",{class:"framesync-subtitle"},"Engine",-1)),a("div",jV,_(t.storyGeneratorSourceLabel),1),a("div",XV,_(t.availableOllamaNodes.length?`${t.availableOllamaNodes.length} Ollama node(s) ready`:"Local template fallback"),1)])]),a("div",KV,[a("label",YV,[e[98]||(e[98]=a("div",{class:"framesync-subtitle"},"Theme / story concept",-1)),K(a("input",{class:"framesync-input generate-story__theme-input","data-testid":"story-theme-input","onUpdate:modelValue":e[35]||(e[35]=o=>t.generator.theme=o),placeholder:"e.g. A Space Traveler, Ancient Forest, Cyberpunk City…"},null,512),[[ae,t.generator.theme]])]),a("div",JV,[a("div",ZV,[e[100]||(e[100]=a("div",{class:"framesync-subtitle"},"Style preset",-1)),K(a("select",{class:"framesync-select img2img-control-card__input","onUpdate:modelValue":e[36]||(e[36]=o=>t.generator.stylePreset=o)},[...e[99]||(e[99]=[$i('',7)])],512),[[Rt,t.generator.stylePreset]])]),t.generator.stylePreset==="custom"?(p(),f("div",QV,[e[101]||(e[101]=a("div",{class:"framesync-subtitle"},"Custom style",-1)),K(a("input",{class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[37]||(e[37]=o=>t.generator.customStyle=o),placeholder:"Your style keywords"},null,512),[[ae,t.generator.customStyle]])])):N("",!0),a("div",eB,[e[102]||(e[102]=a("div",{class:"framesync-subtitle"},"Scene count",-1)),a("div",tB,_(t.storyGeneratorSceneCount),1),a("input",{type:"range",min:"2",max:"12",step:"1",value:t.generator.numScenes,class:"framesync-input img2img-control-card__slider",onInput:e[38]||(e[38]=o=>t.generator.numScenes=parseInt(o.target.value,10))},null,40,iB)]),a("div",nB,[e[103]||(e[103]=a("div",{class:"framesync-subtitle"},"FPS",-1)),K(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[39]||(e[39]=o=>t.generator.fps=o),min:"1",max:"60",step:"1"},null,512),[[ae,t.generator.fps,void 0,{number:!0}]])]),a("div",sB,[e[104]||(e[104]=a("div",{class:"framesync-subtitle"},"Total frames",-1)),K(a("input",{type:"number",class:"framesync-input img2img-control-card__input","onUpdate:modelValue":e[40]||(e[40]=o=>t.generator.totalFrames=o),min:"24",max:"9999",step:"1"},null,512),[[ae,t.generator.totalFrames,void 0,{number:!0}]])])])]),a("div",rB,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"story-generate-btn",disabled:t.generator.isGenerating,onClick:e[41]||(e[41]=(...o)=>t.generateStory&&t.generateStory(...o))},_(t.generator.isGenerating?"Generating…":"Generate Story"),9,oB),a("button",{type:"button",class:"framesync-button",disabled:t.generator.isGenerating,onClick:e[42]||(e[42]=(...o)=>t.generateImage&&t.generateImage(...o))},"Generate Image",8,aB)]),t.generator.status?(p(),f("div",lB,_(t.generator.status),1)):N("",!0),t.storyLlmRequestJsonForUi?(p(),f("div",uB,[e[105]||(e[105]=a("div",{class:"framesync-subtitle generate-story__section-title"},"LLM request JSON",-1)),a("pre",dB,_(t.storyLlmRequestJsonForUi),1)])):N("",!0),t.generator.result?(p(),f("div",cB,[a("div",hB,[e[106]||(e[106]=a("div",{class:"framesync-subtitle generate-story__section-title"},"Story plan",-1)),t.generator.result.source&&t.generator.result.source.model?(p(),f("span",mB,_(t.generator.result.source.model),1)):N("",!0)]),a("pre",pB,_(t.generator.result.formatted),1),a("div",fB,[a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[43]||(e[43]=(...o)=>t.approveStory&&t.approveStory(...o))},"Apply to prompts"),a("button",{type:"button",class:"framesync-button",onClick:e[44]||(e[44]=(...o)=>t.rejectStory&&t.rejectStory(...o))},"Discard")])])):N("",!0),t.generator.lastPath?(p(),f("div",gB,[a("div",yB,[e[107]||(e[107]=a("div",{class:"framesync-subtitle generate-story__section-title"},"Preview image",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[45]||(e[45]=o=>t.storyResultCollapsed=!t.storyResultCollapsed)},_(t.storyResultCollapsed?"Show":"Hide"),1)]),t.storyResultCollapsed?N("",!0):(p(),f("div",vB,[a("img",{src:t.generator.lastPath,alt:"Story preview",class:"generate-story__image"},null,8,bB)]))])):N("",!0)])])])):t.currentSubTab.PROMPTS==="LORA"?(p(),f("div",_B,[a("div",SB,[a("div",wB,[a("div",MB,[e[108]||(e[108]=a("div",{class:"framesync-title"},[ie("Active "),a("span",{class:"framesync-accent"},"LoRAs")],-1)),a("div",xB,[a("span",PB,_(t.currentLoraModelFamilyLabel),1),t.loras.source?(p(),ht(l,{key:0,source:t.loras.source},null,8,["source"])):N("",!0),a("button",{class:"framesync-button",onClick:e[46]||(e[46]=(...o)=>t.refreshLoras&&t.refreshLoras(...o))},"Refresh"),a("button",{class:"framesync-button lora-picker-trigger",onClick:e[47]||(e[47]=o=>t.loraPickerOpen=!t.loraPickerOpen)},_(t.loraPickerOpen?"Close":"+"),1)])]),t.loraPickerOpen?(p(),f("div",TB,[a("div",AB,[t.currentLoraModelFamily?(p(),f("span",CB,"Select from "+_(t.currentLoraModelFamilyLabel)+"-compatible LoRAs and assign them to Common, A, or B.",1)):(p(),f("span",EB,"Select from the compatible LoRA list and assign them to Common, A, or B."))]),a("div",kB,[(p(!0),f(G,null,re(t.compatibleLoraFamilies,o=>(p(),f("section",{key:"picker-"+o.key,class:"lora-picker-family"},[a("div",RB,_(o.label),1),a("div",LB,[(p(!0),f(G,null,re(o.items,u=>(p(),f("div",{key:u.id,class:"lora-picker-row"},[a("div",DB,[a("div",IB,_(u.name),1),a("div",FB,_(u.path),1)]),a("div",NB,[a("button",{class:U(["framesync-button prompt-group-button prompt-group-button--common",{active:u.group==="COMMON"}]),onClick:ft(c=>t.assignLoraToGroup(u,"COMMON"),["stop"])},"Common",10,OB),a("button",{class:U(["framesync-button prompt-group-button prompt-group-button--a",{active:u.group==="A"}]),onClick:ft(c=>t.assignLoraToGroup(u,"A"),["stop"])},"A",10,UB),a("button",{class:U(["framesync-button prompt-group-button prompt-group-button--b",{active:u.group==="B"}]),onClick:ft(c=>t.assignLoraToGroup(u,"B"),["stop"])},"B",10,VB),u.group?(p(),f("button",{key:0,class:"framesync-button",onClick:ft(c=>t.unassignLora(u),["stop"])},"Remove",8,BB)):N("",!0)])]))),128))])]))),128))]),t.compatibleLoraFamilies.length?N("",!0):(p(),f("div",zB,[t.currentLoraModelFamily?(p(),f("span",$B,"No "+_(t.currentLoraModelFamilyLabel)+" LoRAs found. Refresh or check SD-Forge connection.",1)):(p(),f("span",GB,"No LoRA models found. Refresh or check SD-Forge connection."))]))])):N("",!0),a("div",HB,[a("div",WB,[a("div",qB,"Common Group ("+_(t.loras.common.length)+")",1),a("div",jB,[(p(!0),f(G,null,re(t.loras.common,o=>(p(),f("div",{key:o.id,class:"lora-active-group__row"},[a("div",XB,[a("span",KB,_(o.name),1),a("span",YB,_(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:u=>t.updateGroupedLoraStrength("COMMON",o,u.target.value)},null,40,JB),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:u=>t.unassignLora(o)},"Remove",8,ZB)]))),128)),t.loras.common.length===0?(p(),f("div",QB," No LoRAs in Common group ")):N("",!0)])]),a("div",e6,[a("div",t6,"A Group ("+_(t.loras.groupA.length)+")",1),a("div",i6,[(p(!0),f(G,null,re(t.loras.groupA,o=>(p(),f("div",{key:o.id,class:"lora-active-group__row"},[a("div",n6,[a("span",s6,_(o.name),1),a("span",r6,_(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:u=>t.updateGroupedLoraStrength("A",o,u.target.value)},null,40,o6),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:u=>t.unassignLora(o)},"Remove",8,a6)]))),128)),t.loras.groupA.length===0?(p(),f("div",l6," No LoRAs in A group ")):N("",!0)])]),a("div",u6,[a("div",d6,"B Group ("+_(t.loras.groupB.length)+")",1),a("div",c6,[(p(!0),f(G,null,re(t.loras.groupB,o=>(p(),f("div",{key:o.id,class:"lora-active-group__row"},[a("div",h6,[a("span",m6,_(o.name),1),a("span",p6,_(o.strength.toFixed(2)),1)]),a("input",{type:"range",min:"0",max:"2",step:"0.01",value:o.strength,class:"framesync-input lora-active-group__slider",onInput:u=>t.updateGroupedLoraStrength("B",o,u.target.value)},null,40,f6),a("button",{type:"button",class:"framesync-button framesync-button--danger framesync-button--compact lora-active-group__remove",onClick:u=>t.unassignLora(o)},"Remove",8,g6)]))),128)),t.loras.groupB.length===0?(p(),f("div",y6," No LoRAs in B group ")):N("",!0)])])]),a("div",v6,[e[109]||(e[109]=a("div",{class:"framesync-subtitle lora-crossfader-hint__copy"},[ie(" LoRA morph blend is on the "),a("strong",null,"LIVE"),ie(" stage (Morph HUD, bottom-right). Assign LoRAs to Common, A, and B below — crossfade weights are controlled from LIVE. ")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[48]||(e[48]=o=>{t.switchTab("LIVE"),t.setLiveBottomDrawerTab("CROSSFADER")})}," Open crossfader ")]),a("div",b6,[a("button",{class:"framesync-button",onClick:e[49]||(e[49]=(...o)=>t.applyLoras&&t.applyLoras(...o))},"Apply LoRAs"),a("button",{class:"framesync-button",onClick:e[50]||(e[50]=(...o)=>t.exportLoraPreset&&t.exportLoraPreset(...o))},"Export preset")])])])])):t.currentSubTab.PROMPTS==="CONTROLNET"?(p(),f("div",_6,[a("div",S6,[a("div",w6,[a("div",M6,[e[110]||(e[110]=a("div",{class:"framesync-title"},[ie("ControlNet "),a("span",{class:"framesync-accent"},"Slots")],-1)),a("div",x6,[t.cn.source?(p(),ht(l,{key:0,source:t.cn.source},null,8,["source"])):N("",!0),a("button",{class:"framesync-button",onClick:e[51]||(e[51]=(...o)=>t.loadControlNetModels&&t.loadControlNetModels(...o))},"Refresh")])]),a("div",P6,[(p(!0),f(G,null,re(t.cn.slots,o=>(p(),f("div",{key:o.id,class:"controlnet-slot-row",style:{display:"flex",gap:"6px","align-items":"center"}},[a("button",{class:U(["framesync-button",{active:t.cn.active===o.id}]),style:{flex:"1"},onClick:u=>t.cn.active=o.id},_(o.label),11,T6),a("button",{class:U(["framesync-button controlnet-slot-row__toggle",{active:o.enabled}]),onClick:u=>{o.enabled=!o.enabled,t.updateControlNet(o)}},_(o.enabled?"On":"Off"),11,A6)]))),128))])])]),a("div",C6,[a("div",E6,[a("div",k6,[a("div",R6,[a("span",L6,_(t.activeSlot.label),1),e[111]||(e[111]=ie(" Settings",-1))])]),a("div",D6,[e[112]||(e[112]=a("div",{class:"framesync-subtitle"},"Model",-1)),K(a("select",{class:"framesync-select","data-testid":"controlnet-model-select","onUpdate:modelValue":e[52]||(e[52]=o=>t.activeSlot.model=o),onChange:e[53]||(e[53]=o=>t.updateControlNet(t.activeSlot))},[(p(!0),f(G,null,re(t.activeControlNetModelChoices,o=>(p(),f("option",{key:o.id,value:o.name},_(o.name)+_(o.current&&o.incompatible?" (current, incompatible)":o.current?" (current)":""),9,I6))),128))],544),[[Rt,t.activeSlot.model]]),a("div",F6,_(t.controlNetModelSummary),1)]),a("div",N6,[e[113]||(e[113]=a("div",{class:"framesync-subtitle"},"Image source",-1)),a("div",O6,[a("button",{type:"button",class:U(["framesync-button",{active:t.activeSlot.imageSource==="file"}]),onClick:e[54]||(e[54]=o=>t.activeSlot.imageSource="file")},"File",2),a("button",{type:"button",class:U(["framesync-button",{active:t.activeSlot.imageSource==="webcam"}]),onClick:e[55]||(e[55]=o=>t.activeSlot.imageSource="webcam")},"Webcam",2),a("button",{type:"button",class:U(["framesync-button",{active:t.activeSlot.imageSource==="screen"}]),onClick:e[56]||(e[56]=o=>t.activeSlot.imageSource="screen")},"Screen",2)]),a("input",{ref:"cnImageInput",type:"file",accept:"image/*",style:{display:"none"},onChange:e[57]||(e[57]=(...o)=>t.onControlNetFileSelected&&t.onControlNetFileSelected(...o))},null,544)]),t.activeSlot.imageSource==="webcam"?(p(),f("div",U6,[e[115]||(e[115]=a("div",{class:"framesync-subtitle"},"Webcam input",-1)),a("video",V6,null,512),a("canvas",B6,null,512),a("div",z6,[a("button",{type:"button",class:U(["framesync-button",{active:t.cn.webcamActive}]),onClick:e[58]||(e[58]=(...o)=>t.toggleWebcam&&t.toggleWebcam(...o))},_(t.cn.webcamActive?"Stop":"Start")+" Webcam",3),K(a("select",{class:"framesync-input","onUpdate:modelValue":e[59]||(e[59]=o=>t.webcamCaptureRate=o),style:{"max-width":"120px","font-size":"11px"}},[...e[114]||(e[114]=[a("option",{value:1e3},"1 fps",-1),a("option",{value:500},"2 fps",-1),a("option",{value:200},"5 fps",-1),a("option",{value:100},"10 fps",-1)])],512),[[Rt,t.webcamCaptureRate,void 0,{number:!0}]])])])):N("",!0),t.activeSlot.imageSource==="screen"?(p(),f("div",$6,[e[116]||(e[116]=a("div",{class:"framesync-subtitle"},"Screen capture",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[60]||(e[60]=(...o)=>t.startScreenCapture&&t.startScreenCapture(...o))},"Start screen capture")])):N("",!0),a("div",G6,[a("button",{type:"button",class:"framesync-button",onClick:e[61]||(e[61]=o=>t.uploadControlNetImage(t.activeSlot))},"Upload image"),a("button",{type:"button",class:U(["framesync-button",{active:t.activeSlot.enabled}]),onClick:e[62]||(e[62]=o=>{t.activeSlot.enabled=!t.activeSlot.enabled,t.updateControlNet(t.activeSlot)})},_(t.activeSlot.enabled?"Enabled":"Disabled"),3)]),a("div",H6,[a("div",W6,[e[117]||(e[117]=a("div",{class:"framesync-subtitle"},"Weight",-1)),a("span",q6,_(t.activeSlot.weight.toFixed(2)),1)]),K(a("input",{type:"range",min:"0",max:"2",step:"0.01","onUpdate:modelValue":e[63]||(e[63]=o=>t.activeSlot.weight=o),onInput:e[64]||(e[64]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ae,t.activeSlot.weight,void 0,{number:!0}]]),a("div",j6,_(t.controlNetWeightLabel),1)]),a("div",X6,[a("div",K6,[e[118]||(e[118]=a("div",{class:"framesync-subtitle"},"Start step",-1)),a("span",Y6,_(t.activeSlot.start.toFixed(2)),1)]),K(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[65]||(e[65]=o=>t.activeSlot.start=o),onInput:e[66]||(e[66]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ae,t.activeSlot.start,void 0,{number:!0}]])]),a("div",J6,[a("div",Z6,[e[119]||(e[119]=a("div",{class:"framesync-subtitle"},"End step",-1)),a("span",Q6,_(t.activeSlot.end.toFixed(2)),1)]),K(a("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":e[67]||(e[67]=o=>t.activeSlot.end=o),onInput:e[68]||(e[68]=o=>t.updateControlNet(t.activeSlot)),class:"framesync-input"},null,544),[[ae,t.activeSlot.end,void 0,{number:!0}]])])])])])):N("",!0)])}const tz=it(m8,[["render",ez]]),iz={name:"GenerateView",components:{GlassPanel:nr,UiIcon:oi},props:{app:{type:Object,required:!0},storyOnly:{type:Boolean,default:!1}},data(){return{storyStripOpen:!1}},setup(t){return Tt(t)}},nz={key:0,class:"generate-story-strip"},sz=["aria-expanded"],rz={key:0,class:"generate-story-strip__pill"},oz={key:1,class:"generate-story-strip__pill generate-story-strip__pill--dim"},az={key:0,class:"generate-story-strip__body"},lz={key:0,class:"generate-story-strip__line"},uz={key:1,class:"generate-story-strip__text"},dz={key:1,class:"rack generate-view generate-view--dock","data-testid":"generate-view-dock"},cz={class:"generate-dock-panel-glass__header"},hz={class:"generate-dock-panel"},mz={class:"generate-dock-sync","data-testid":"generate-dock-sync"},pz={class:"generate-dock-sync__metric"},fz={class:"generate-dock-sync__value motion-readout"},gz={class:"generate-dock-sync__metric"},yz={class:"generate-dock-sync__value motion-readout"},vz={class:"generate-dock-sync__metric"},bz={class:"generate-dock-sync__value motion-readout"},_z={class:"generate-dock-sync__metric"},Sz={class:"generate-dock-sync__value motion-readout"},wz={class:"generate-dock-actions"};function Mz(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("GlassPanel");return i.storyOnly?(p(),f("div",nz,[a("button",{type:"button",class:"generate-story-strip__toggle","aria-expanded":s.storyStripOpen?"true":"false",onClick:e[0]||(e[0]=u=>s.storyStripOpen=!s.storyStripOpen)},[e[4]||(e[4]=a("span",null,"Story",-1)),t.generator.result&&t.generator.result.source&&t.generator.result.source.model?(p(),f("span",rz,_(t.generator.result.source.model),1)):t.generator.status?(p(),f("span",oz,_(t.generator.status),1)):N("",!0),ve(l,{class:"generate-story-strip__chevron",name:s.storyStripOpen?"chevron-up":"chevron-down"},null,8,["name"])],8,sz),s.storyStripOpen?(p(),f("div",az,[t.generator.status?(p(),f("div",lz,_(t.generator.status),1)):N("",!0),t.generator.result&&t.generator.result.formatted?(p(),f("pre",uz,_(t.generator.result.formatted),1)):N("",!0),t.generator.result?N("",!0):(p(),f("button",{key:2,type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=u=>{t.switchTab("PROMPTS"),t.switchSubTab("PROMPTS","STORY")})}," Open Story Generator "))])):N("",!0)])):(p(),f("div",dz,[ve(o,{size:"lg",class:"generate-dock-panel-glass"},{header:Ht(()=>[a("span",cz,[e[5]||(e[5]=a("span",null,"Animation sequencer",-1)),a("span",{class:U(["generate-sequencer__status",{"generate-sequencer__status--live":t.sequencerPlaying}])},_(t.sequencerPlaying?"Playing":"Stopped"),3)])]),default:Ht(()=>[a("div",hz,[a("div",mz,[a("div",pz,[e[6]||(e[6]=a("span",{class:"generate-dock-sync__label"},"Playhead",-1)),a("code",fz,_(t.sequencerPlayhead.toFixed(2))+"s",1)]),a("div",gz,[e[7]||(e[7]=a("span",{class:"generate-dock-sync__label"},"Duration",-1)),a("code",yz,_(Number(t.sequencer.durationSec||0).toFixed(2))+"s",1)]),a("div",vz,[e[8]||(e[8]=a("span",{class:"generate-dock-sync__label"},"Frame",-1)),a("code",bz,_(t.sequencerJobFrameNumber)+"/"+_(t.sequencerJobTotalFrames),1)]),a("div",_z,[e[9]||(e[9]=a("span",{class:"generate-dock-sync__label"},"FPS",-1)),a("code",Sz,_(t.masterFps),1)])]),e[10]||(e[10]=a("p",{class:"generate-sequencer__live-hint"},[ie(" Preview stays above the timeline dock. Transport, scrubber, and tracks share one playhead — open "),a("strong",null,"Edit"),ie(" on the dock for clip details. ")],-1)),a("div",wz,[a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{active:t.motionSequencerSideOpen}]),"data-testid":"generate-open-sequencer-editor",onClick:e[2]||(e[2]=u=>{t.motionSequencerSideOpen=!t.motionSequencerSideOpen,t.saveSessionState()})},_(t.motionSequencerSideOpen?"Hide editor":"Open editor"),3),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[3]||(e[3]=u=>t.switchTab("MOTION"))}," Motion controls ")])])]),_:1})]))}const rv=it(iz,[["render",Mz]]),xz={name:"MotionView",components:{GlassPanel:nr,UiIcon:oi,MotionPathPreview:tv,DeforumControlPanel:iv,DeforumMotionPads:Qy,GenerateView:rv},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},computed:{motionQuickPresets(){return["Static","Orbit","Tunnel","Handheld","Chaos"]},motionPathLiveValues(){var t,e,i;return{translation_x:Number((t=this.motionPadValues)==null?void 0:t.translation_x)||0,translation_y:Number((e=this.motionPadValues)==null?void 0:e.translation_y)||0,translation_z:Number((i=this.motionPadValues)==null?void 0:i.translation_z)||0}}}},Pz={class:"rack motion-view motion-view--hero","data-testid":"motion-controls-panel"},Tz={class:"motion-panel-glass__header"},Az={class:"motion-panel"},Cz={class:"motion-preset-row motion-preset-row--hero"},Ez=["onClick"],kz={class:"motion-preset-toolbar motion-preset-toolbar--compact"},Rz={label:"Built-in"},Lz=["value"],Dz={key:0,label:"Saved"},Iz=["value"],Fz={class:"motion-hero-stage","data-testid":"motion-hero-stage"},Nz=["open"],Oz={class:"motion-smoothness","data-testid":"motion-smoothness"},Uz={class:"motion-smoothness__toggle"},Vz={key:0,class:"motion-smoothness__frames"},Bz=["value"],zz={key:1,class:"motion-smoothness__hint"};function $z(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("DeforumMotionPads"),u=Ie("DeforumControlPanel"),c=Ie("MotionPathPreview"),h=Ie("GlassPanel"),d=Ie("GenerateView");return p(),f("div",Pz,[ve(h,{size:"lg",class:"motion-panel-glass"},{header:Ht(()=>[a("span",Tz,[e[8]||(e[8]=a("span",null,"Motion performance",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"reset-motion-default",title:"Reset all motion axes to zero",onClick:e[0]||(e[0]=(...m)=>t.resetMotionToDefault&&t.resetMotionToDefault(...m))}," ↺ Reset to default ")])]),default:Ht(()=>[a("div",Az,[a("div",Cz,[(p(!0),f(G,null,re(r.motionQuickPresets,m=>(p(),f("button",{key:m,type:"button",class:U(["chip",{active:t.motionSelectedPreset===m}]),onClick:g=>t.applyMotionPresetAndSelect(m)},_(m),11,Ez))),128))]),a("div",kz,[K(a("select",{class:"framesync-select motion-preset-select","onUpdate:modelValue":e[1]||(e[1]=m=>t.motionSelectedPreset=m)},[a("optgroup",Rz,[(p(!0),f(G,null,re(Object.keys(t.motionPresets),m=>(p(),f("option",{key:m,value:m},_(m),9,Lz))),128))]),t.savedMotionPresetNames.length?(p(),f("optgroup",Dz,[(p(!0),f(G,null,re(t.savedMotionPresetNames,m=>(p(),f("option",{key:`saved-${m}`,value:m},_(m),9,Iz))),128))])):N("",!0)],512),[[Rt,t.motionSelectedPreset]]),a("button",{type:"button",class:"framesync-button motion-preset-icon-btn",title:"Load preset","aria-label":"Load preset",onClick:e[2]||(e[2]=(...m)=>t.loadSelectedMotionPreset&&t.loadSelectedMotionPreset(...m))},[ve(l,{name:"load"})]),a("button",{type:"button",class:"framesync-button motion-preset-icon-btn",title:"Save current motion","aria-label":"Save current motion",onClick:e[3]||(e[3]=(...m)=>t.saveCurrentMotionStyle&&t.saveCurrentMotionStyle(...m))},[ve(l,{name:"save"})])]),a("div",Fz,[ve(o,{app:i.app,hero:"","show-readout":"","show-axis-sliders":t.motionFineTuneOpen},null,8,["app","show-axis-sliders"])]),a("button",{type:"button",class:U(["framesync-button framesync-button--compact motion-fine-tune-toggle",{active:t.motionFineTuneOpen}]),"data-testid":"motion-fine-tune-toggle",onClick:e[4]||(e[4]=m=>{t.motionFineTuneOpen=!t.motionFineTuneOpen,t.saveSessionState()})},_(t.motionFineTuneOpen?"Hide axis sliders":"Fine-tune axes"),3),ve(u,{app:i.app,"show-settings":!1,"show-motion-pads":!1,"motion-pads-show-readout":""},null,8,["app"]),a("details",{class:"motion-advanced-panel",open:!t.isDeforumMotion2d},[e[11]||(e[11]=a("summary",{class:"motion-advanced-panel__summary"},"Smoothness & path preview",-1)),a("div",Oz,[a("label",Uz,[K(a("input",{type:"checkbox","data-testid":"motion-smoothness-enabled","onUpdate:modelValue":e[5]||(e[5]=m=>t.motionSmoothness.enabled=m),onChange:e[6]||(e[6]=(...m)=>t.saveSessionState&&t.saveSessionState(...m))},null,544),[[Ci,t.motionSmoothness.enabled]]),e[9]||(e[9]=a("span",null,"Smoothness",-1))]),t.motionSmoothness.enabled?(p(),f("label",Vz,[e[10]||(e[10]=a("span",null,"Frames",-1)),a("input",{class:"framesync-input motion-smoothness__frames-input",type:"number",min:"1",max:"999",step:"1","data-testid":"motion-smoothness-frames",value:t.motionSmoothness.frames,onChange:e[7]||(e[7]=m=>t.onMotionSmoothnessFramesChange(m.target.value))},null,40,Bz)])):N("",!0),t.motionSmoothness.enabled?(p(),f("span",zz," Ramp schedule changes over the frame count from the current playhead or selected frame. ")):N("",!0)]),t.isDeforumMotion2d?N("",!0):(p(),ht(c,{key:0,"deforum-settings":t.deforumSettings,"motion-values":r.motionPathLiveValues,"prefer-live-values":!0},null,8,["deforum-settings","motion-values"]))],8,Nz)])]),_:1}),ve(d,{app:i.app},null,8,["app"])])}const Gz=it(xz,[["render",$z]]),If={sine:t=>Math.sin(t),triangle:t=>{const e=(t/(Math.PI*2)%1+1)%1;return e<.5?4*e-1:3-4*e},saw:t=>2*((t/(Math.PI*2)%1+1)%1)-1,square:t=>Math.sin(t)>=0?1:-1},Hz={name:"Waveform",props:{shape:{type:String,default:"Sine"},phase:{type:Number,default:0},depth:{type:Number,default:.8},active:{type:Boolean,default:!1},width:{type:Number,default:80},height:{type:Number,default:30},cycles:{type:Number,default:2}},computed:{strokeColor(){return this.active?"var(--live)":"var(--text-dim)"},points(){const{width:t,height:e,shape:i,phase:n,depth:s,cycles:r}=this,l=e/2,o=(e/2-2)*Math.min(1,Math.max(0,s)),u=(i||"sine").toLowerCase(),c=If[u]||If.sine,h=[],d=t;if(u==="noise")for(let m=0;m<=d;m++){const g=l+Math.sin(m*.8+n)*Math.cos(m*1.3+n*.7)*o;h.push(`${m},${g.toFixed(1)}`)}else for(let m=0;m<=d;m++){const g=m/d*Math.PI*2*r+(n||0),b=l-c(g)*o;h.push(`${m},${b.toFixed(1)}`)}return h.join(" ")}}},Wz=["width","height","viewBox"],qz=["points","stroke"];function jz(t,e,i,n,s,r){return p(),f("svg",{width:i.width,height:i.height,viewBox:`0 0 ${i.width} ${i.height}`,class:U(["waveform",{"waveform--active":i.active}]),"aria-hidden":"true"},[a("polyline",{points:r.points,fill:"none",stroke:r.strokeColor,"stroke-width":"1.5","stroke-linejoin":"round","stroke-linecap":"round"},null,8,qz)],10,Wz)}const Xz=it(Hz,[["render",jz],["__scopeId","data-v-fb4eb07f"]]),Kz={name:"TargetCell",emits:["toggle"],props:{label:{type:String,required:!0},paramKey:{type:String,required:!0},owners:{type:Array,default:()=>[]},selected:{type:Boolean,default:!1},focused:{type:Boolean,default:!1}},computed:{tooltip(){return this.owners.length?`${this.label} ← ${this.owners.join(", ")}`:this.label}}},Yz=["title"],Jz={class:"target-cell-label"},Zz={key:0,class:"target-cell-owners"},Qz={key:0,class:"target-cell-extra"};function e$(t,e,i,n,s,r){return p(),f("button",{class:U(["target-cell",{"target-cell--routed":i.owners.length>0,"target-cell--selected":i.selected,"target-cell--focused":i.focused}]),title:r.tooltip,onClick:e[0]||(e[0]=l=>t.$emit("toggle",i.paramKey)),type:"button"},[a("span",Jz,_(i.label),1),i.owners.length?(p(),f("div",Zz,[(p(!0),f(G,null,re(i.owners.slice(0,3),l=>(p(),f("span",{key:l,class:"target-cell-owner"},_(l),1))),128)),i.owners.length>3?(p(),f("span",Qz,"+"+_(i.owners.length-3),1)):N("",!0)])):N("",!0)],10,Yz)}const t$=it(Kz,[["render",e$],["__scopeId","data-v-6d546a48"]]),aa=20,Ks=16e3;function fs(t,e=aa,i=Ks){const n=Number(t);return Number.isFinite(n)?Math.min(i,Math.max(e,n)):e}function Po(t,e=aa,i=Ks){const n=fs(t,e,i);return(Math.log(n)-Math.log(e))/(Math.log(i)-Math.log(e))}function Ff(t,e=aa,i=Ks){const n=Math.max(0,Math.min(1,Number(t)||0));return Math.exp(Math.log(e)+n*(Math.log(i)-Math.log(e)))}function ov(t,e,i,n,{barColor:s,bgColor:r}={}){const l=Math.max(1,Math.floor(i)),o=Math.max(1,Math.floor(n));if(t.fillStyle=r||"rgb(8, 9, 13)",t.fillRect(0,0,l,o),!e||!e.length)return;const u=Math.min(96,Math.max(32,Math.floor(l/4))),c=Math.max(1,Math.floor(e.length/u)),h=1,d=Math.max(2,(l-h*(u-1))/u);for(let m=0;m[]},levels:{type:Array,default:()=>[]},activeIndex:{type:Number,default:0},previewIndex:{type:Number,default:-1},spectrumBins:{type:Array,default:()=>[]},live:{type:Boolean,default:!1},bandLabels:{type:Array,default:()=>["Low","Mid","High"]},bandColors:{type:Array,default:()=>[]},canvasWidth:{type:Number,default:640},canvasHeight:{type:Number,default:120}},emits:["select-band","update-band"],data(){return{dragState:null}},watch:{spectrumBins:{handler(){this.paint()},deep:!0},levels:{handler(){this.paint()},deep:!0},mappings:{handler(){this.paint()},deep:!0},live(){this.paint()}},mounted(){this.paint()},methods:{cssVar(t,e=""){try{return getComputedStyle(document.documentElement).getPropertyValue(t).trim()||e}catch{return e}},toRgba(t,e){const i=Number(e);if(!Number.isFinite(i))return String(t||"");const n=String(t||"").trim();if(n.startsWith("#")&&(n.length===7||n.length===4)){const s=n.length===4?`#${n[1]}${n[1]}${n[2]}${n[2]}${n[3]}${n[3]}`:n,r=parseInt(s.slice(1,3),16),l=parseInt(s.slice(3,5),16),o=parseInt(s.slice(5,7),16);if([r,l,o].every(u=>Number.isFinite(u)))return`rgba(${r}, ${l}, ${o}, ${i})`}return n},bandLabel(t){return this.bandLabels[t]||`Band ${t+1}`},bandLevel(t){return Math.max(0,Math.min(1,Number(this.levels[t])||0))},bandLevelPct(t){return Math.round(this.bandLevel(t)*100)},bandMeterPct(t){return Math.max(4,this.bandLevel(t)*100)},bandStyle(t,e){const i=aa,n=Ks,s=Po(t&&t.freq_min,i,n)*100,r=Po(t&&t.freq_max,i,n)*100,l=e??this.mappings.indexOf(t),o=[this.cssVar("--band-low"),this.cssVar("--band-mid"),this.cssVar("--band-high")],u=this.bandColors[l]||o[l]||this.cssVar("--live")||"var(--live)",c=this.bandLevel(l);return{left:`${Math.min(s,r)}%`,width:`${Math.max(2,Math.abs(r-s))}%`,"--band-color":u,"--band-level":String(c)}},paint(){const t=this.$refs.canvasEl;if(!t||!t.getContext)return;const e=t.getContext("2d"),i=this.live&&this.spectrumBins.length?this.spectrumBins:null;ov(e,i,t.width,t.height,{bgColor:this.cssVar("--bg-0")||"rgb(8, 9, 13)",barColor:this.toRgba(this.cssVar("--band-high")||this.cssVar("--success"),.9)})},canvasRect(){const t=this.$refs.canvasEl;return t?t.getBoundingClientRect():{width:1,left:0}},xToHz(t){const e=this.canvasRect(),n=(t-e.left)/Math.max(1,e.width);return Ff(n)},hitTest(t,e){const i=this.canvasRect(),n=(t-i.left)/Math.max(1,i.width)*100,r=10/Math.max(1,i.width)*100;for(let l=this.mappings.length-1;l>=0;l-=1){const o=this.mappings[l];if(!o)continue;const u=Po(o.freq_min)*100,c=Po(o.freq_max)*100,h=Math.min(u,c),d=Math.max(u,c);if(!(nd+1))return Math.abs(n-h)<=r?{index:l,mode:"left"}:Math.abs(n-d)<=r?{index:l,mode:"right"}:{index:l,mode:"move"}}return null},onPointerDown(t){const e=this.hitTest(t.clientX,t.clientY);if(!e)return;const i=this.mappings[e.index];if(!i)return;this.$emit("select-band",e.index);const n=this.canvasRect();this.dragState={index:e.index,mode:e.mode,startX:t.clientX,startRatio:(t.clientX-n.left)/Math.max(1,n.width),startMin:Number(i.freq_min)||aa,startMax:Number(i.freq_max)||Ks,pointerId:t.pointerId},t.currentTarget.setPointerCapture(t.pointerId),t.preventDefault()},onPointerMove(t){if(!this.dragState||this.dragState.pointerId!==t.pointerId||!this.mappings[this.dragState.index])return;const i=this.canvasRect(),s=(t.clientX-i.left)/Math.max(1,i.width)-this.dragState.startRatio;let r=this.dragState.startMin,l=this.dragState.startMax;const o=20;if(this.dragState.mode==="left")r=fs(this.xToHz(t.clientX)),l=fs(Math.max(r+o,this.dragState.startMax));else if(this.dragState.mode==="right")l=fs(this.xToHz(t.clientX)),r=fs(Math.min(l-o,this.dragState.startMin));else{const u=this.dragState.startMax-this.dragState.startMin;r=fs(Ff(Po(this.dragState.startMin)+s)),l=fs(r+u),l>=Ks&&(l=Ks,r=fs(l-u))}this.$emit("update-band",{index:this.dragState.index,freq_min:Math.round(r),freq_max:Math.round(l)}),t.preventDefault()},onPointerUp(t){if(!(!this.dragState||t.pointerId!=null&&this.dragState.pointerId!==t.pointerId)){try{t.currentTarget.releasePointerCapture(this.dragState.pointerId)}catch{}this.dragState=null}}}},n$=["width","height"],s$={class:"audio-spectrum-editor__bands","aria-hidden":"true"},r$={class:"audio-spectrum-editor__band-label"},o$={key:0,class:"audio-spectrum-editor__band-level"},a$={key:0,class:"audio-spectrum-editor__hint"};function l$(t,e,i,n,s,r){return p(),f("div",{class:U(["audio-spectrum-editor",{"audio-spectrum-editor--live":i.live,"audio-spectrum-editor--dragging":s.dragState}])},[a("canvas",{ref:"canvasEl",class:"audio-spectrum-editor__canvas",width:i.canvasWidth,height:i.canvasHeight,onPointerdown:e[0]||(e[0]=(...l)=>r.onPointerDown&&r.onPointerDown(...l)),onPointermove:e[1]||(e[1]=(...l)=>r.onPointerMove&&r.onPointerMove(...l)),onPointerup:e[2]||(e[2]=(...l)=>r.onPointerUp&&r.onPointerUp(...l)),onPointercancel:e[3]||(e[3]=(...l)=>r.onPointerUp&&r.onPointerUp(...l)),onPointerleave:e[4]||(e[4]=(...l)=>r.onPointerUp&&r.onPointerUp(...l))},null,40,n$),a("div",s$,[(p(!0),f(G,null,re(i.mappings,(l,o)=>(p(),f("div",{key:"audio-band-"+o,class:U(["audio-spectrum-editor__band",{"audio-spectrum-editor__band--active":o===i.activeIndex,"audio-spectrum-editor__band--dragging":s.dragState&&s.dragState.index===o,"audio-spectrum-editor__band--preview":o===i.previewIndex,"audio-spectrum-editor__band--reactive":i.live&&(i.levels[o]||0)>.04}]),style:Pt(r.bandStyle(l,o))},[a("div",{class:"audio-spectrum-editor__band-meter",style:Pt({height:r.bandMeterPct(o)+"%"})},null,4),a("span",r$,_(r.bandLabel(o)),1),i.live?(p(),f("span",o$,_(r.bandLevelPct(o))+"%",1)):N("",!0)],6))),128))]),i.live?N("",!0):(p(),f("div",a$,"Upload and play audio to see the live spectrum."))],2)}const u$=it(i$,[["render",l$]]),d$={name:"ModulationMappingsPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},c$={class:"modulation-mappings"},h$={class:"modulation-mappings__toolbar"},m$={class:"framesync-checkbox modulation-mappings__filter"},p$={key:0,class:"live-hud-empty"},f$={key:0,class:"sub-pills modulation-mappings__group-tabs"},g$=["onClick"],y$={key:1,class:"modulation-mappings__rows"},v$={class:"modulation-mapping-row__head"},b$={class:"modulation-mapping-row__label"},_$={key:0,class:"modulation-mapping-row__badges"},S$={class:"modulation-mapping-row__control"},w$=["min","max","step","value","onInput"],M$={class:"modulation-mapping-row__value"},x$={class:"modulation-mapping-row__actions"},P$=["onClick"],T$=["onClick"],A$={class:"modulation-map-picker__dialog framesync-panel"},C$={class:"framesync-header"},E$={class:"framesync-title"},k$={class:"framesync-accent"},R$={class:"modulation-map-picker__lfo-list"},L$=["onClick"],D$={class:"modulation-map-picker__lfo-title"},I$={class:"modulation-map-picker__lfo-meta"},F$={key:0,class:"modulation-route-pill"},N$={class:"modulation-map-picker__slots"},O$=["onClick"];function U$(t,e,i,n,s,r){return p(),f("div",c$,[a("div",h$,[a("label",m$,[K(a("input",{type:"checkbox","data-testid":"mappings-active-only","onUpdate:modelValue":e[0]||(e[0]=l=>t.mappingsActiveOnly=l)},null,512),[[Ci,t.mappingsActiveOnly]]),e[5]||(e[5]=ie(" Active only ",-1))])]),(t.modulationMappingsVisibleGroups||[]).length?(p(),f(G,{key:1},[(t.modulationMappingsVisibleGroups||[]).length>1?(p(),f("div",f$,[(p(!0),f(G,null,re(t.modulationMappingsVisibleGroups||[],l=>(p(),f("button",{key:"map-grp-"+l.label,type:"button",class:U(["sub-pill",{active:t.mappingsActiveGroupLabel===l.label}]),onClick:o=>t.mappingsGroupTab=l.label},_(l.shortLabel||l.label),11,g$))),128))])):N("",!0),t.mappingsActiveGroup?(p(),f("div",y$,[(p(!0),f(G,null,re(t.mappingsActiveGroup.items,l=>(p(),f("div",{key:"map-row-"+l.key,class:U(["modulation-mapping-row",{"modulation-mapping-row--mapped":t.paramHasActiveMapping(l.key)}])},[a("div",v$,[a("span",b$,_(l.label),1),t.paramMappingLabels(l.key).length?(p(),f("div",_$,[(p(!0),f(G,null,re(t.paramMappingLabels(l.key),(o,u)=>(p(),f("span",{key:"map-badge-"+l.key+"-"+u,class:"modulation-route-pill"},_(o),1))),128))])):N("",!0)]),a("div",S$,[a("input",{type:"range",class:"framesync-input modulation-mapping-row__slider",min:t.paramControlMeta(l.key).min,max:t.paramControlMeta(l.key).max,step:t.paramControlMeta(l.key).step,value:t.paramControlMeta(l.key).value,onInput:o=>t.setLiveModValue(l.key,o.target.value)},null,40,w$),a("code",M$,_(t.formatMappingParamValue(l.key)),1)]),a("div",x$,[a("button",{type:"button",class:"framesync-button framesync-button--compact","data-testid":"modulation-map-btn",onClick:o=>t.openModulationMapPicker(l.key)}," Map ",8,P$),t.paramHasActiveMapping(l.key)?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",title:"Clear mappings",onClick:o=>t.clearParamMapping(l.key)}," Clear ",8,T$)):N("",!0)])],2))),128))])):N("",!0)],64)):(p(),f("div",p$,_(t.mappingsActiveOnly?"No active mappings in this view":"No parameters"),1)),t.modulationMapPicker&&t.modulationMapPicker.paramKey?(p(),f("div",{key:2,class:"modulation-map-picker","data-testid":"modulation-map-picker",onClick:e[4]||(e[4]=(...l)=>t.onModulationMapPickerBackdropClick&&t.onModulationMapPickerBackdropClick(...l))},[a("div",A$,[a("div",C$,[a("div",E$,[e[6]||(e[6]=ie(" Map ",-1)),a("span",k$,_(t.modulationMapPickerParamLabel),1)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=(...l)=>t.closeModulationMapPicker&&t.closeModulationMapPicker(...l))}," Close ")]),t.modulationMapPicker.step==="lfo"?(p(),f(G,{key:0},[e[7]||(e[7]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}},"Choose an LFO to route this parameter.",-1)),a("div",R$,[(p(!0),f(G,null,re(t.lfos,l=>(p(),f("button",{key:"map-lfo-"+l.id,type:"button",class:U(["modulation-map-picker__lfo",{"modulation-map-picker__lfo--on":l.on}]),onClick:o=>t.mapModulationParamToLfo(l.id)},[a("span",D$,"LFO "+_(l.id),1),a("span",I$,_(l.on?"On":"Off")+" · "+_(l.shape)+" · "+_(l.bpm)+" BPM · ×"+_(l.speed),1),(l.targets||[]).includes(t.modulationMapPicker.paramKey)?(p(),f("span",F$,"routed")):N("",!0)],10,L$))),128))]),a("button",{type:"button",class:"framesync-button",style:{"margin-top":"10px"},onClick:e[2]||(e[2]=l=>t.modulationMapPicker.step="choose")}," Back ")],64)):(p(),f(G,{key:1},[e[8]||(e[8]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}},"Assign to a live control in the bottom modulation drawer.",-1)),a("div",N$,[(p(!0),f(G,null,re(t.liveModSlotPickerOptions,l=>(p(),f("button",{key:"map-slot-"+l.index,type:"button",class:U(["framesync-button modulation-map-picker__slot",{active:t.paramLiveModSlotIndex(t.modulationMapPicker.paramKey)===l.index}]),onClick:o=>t.assignModulationMapToSlot(l.index)},_(l.label),11,O$))),128))]),a("button",{type:"button",class:"framesync-button",style:{"margin-top":"12px"},onClick:e[3]||(e[3]=l=>t.modulationMapPicker.step="lfo")}," Map to LFO… ")],64))])])):N("",!0)])}const V$=it(d$,[["render",U$]]),B$={name:"ModulationView",components:{Waveform:Xz,TargetCell:t$,AudioSpectrumEditor:u$,ModulationMappingsPanel:V$,GlassPanel:nr},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)},computed:{isAudioTab(){return this.currentTab==="AUDIO"},modulationPane(){return this.isAudioTab?"AUDIO_REACTIVE":this.currentSubTab&&this.currentSubTab.MODULATION||"LFO"},modulationMappingMiniBars(){const t=this.audioSpectrumBins,e=8,i=22050;return(this.audioMappings||[]).map(n=>{if(!t||!t.length)return Array(e).fill(0);const s=t.length,r=Math.max(0,Math.floor(n.freq_min/i*s)),l=Math.min(s-1,Math.ceil(n.freq_max/i*s)),u=Math.max(1,l-r+1)/e,c=[];for(let h=0;hi.key===t.param))==null?void 0:e.label)||t.param:"Unmapped"},activeBandOutputPreview(){const t=this.activeAudioMapping;if(!t)return"—";const e=Math.max(0,Math.min(1,Number(this.audioMappingLevels[this.activeAudioMappingIndex])||0)),i=Number(t.out_min)||0,n=Number(t.out_max)||1,s=i+(n-i)*e,r=Math.abs(n-i)>10?1:.01;return Number.isFinite(s)?s.toFixed(r>=1?0:2):"—"}},methods:{openAudioTab(){typeof this.switchTab=="function"?this.switchTab("AUDIO"):this.switchSubTab("MODULATION","AUDIO_REACTIVE")}}},z$={class:"rack modulation-view"},$$={class:"framesync-panel modulation-panel"},G$={key:0,class:"framesync-header"},H$={class:"modulation-summary"},W$={key:1,class:"sub-pills modulation-subtabs"},q$={class:"modulation-panel__actions modulation-panel__actions--section"},j$={class:"modulation-lfo-grid"},X$=["onClick"],K$={class:"modulation-lfo-card__header"},Y$={class:"switch modulation-lfo-card__switch"},J$=["onUpdate:modelValue"],Z$={class:"modulation-lfo-card__title"},Q$={class:"modulation-lfo-card__meta"},e9={key:0,class:"modulation-lfo-card__compact"},t9={class:"modulation-lfo-card__controls"},i9={class:"modulation-lfo-card__control"},n9=["onUpdate:modelValue"],s9=["value"],r9={class:"modulation-lfo-card__control"},o9=["onUpdate:modelValue"],a9={class:"modulation-lfo-card__control"},l9=["onUpdate:modelValue"],u9={class:"modulation-lfo-card__control"},d9=["onUpdate:modelValue"],c9={class:"modulation-lfo-card__footer"},h9={key:1,class:"modulation-route-pill modulation-route-pill--idle"},m9=["onClick"],p9={class:"modulation-target-board"},f9={class:"modulation-target-board__header"},g9={key:0,class:"modulation-target-board__hint"},y9={class:"modulation-target-board__grid"},v9={key:4,class:"modulation-audio-panel"},b9={class:"modulation-audio-dropzone__title"},_9={class:"modulation-audio-dropzone__hint"},S9={class:"framesync-checkbox",style:{"margin-top":"14px"}},w9=["disabled"],M9={key:0,class:"modulation-audio-sync-settings"},x9={class:"modulation-audio-sync-settings__lead"},P9={key:0,class:"framesync-panel modulation-audio-panel modulation-audio-panel--audio-tab","data-testid":"audio-tab-reference-upload"},T9={class:"modulation-audio-dropzone__title"},A9={class:"modulation-audio-dropzone__hint"},C9={class:"framesync-checkbox modulation-audio-panel__sync-toggle"},E9=["disabled"],k9={class:"audio-reactive-panel"},R9={key:0,class:"framesync-title"},L9={class:"framesync-subtitle audio-reactive-panel__intro"},D9={key:0},I9={key:0,class:"audio-band-presets audio-band-presets--hero"},F9=["onClick"],N9={class:"audio-reactive-mappings"},O9=["onClick"],U9={class:"audio-reactive-mapping-card__head"},V9={class:"audio-map-card__target-name"},B9={class:"modulation-lfo-card__meta"},z9=["x","y","height"],$9={class:"audio-reactive-mapping-card__level"},G9={key:1,class:"audio-reactive-detail"},H9={class:"audio-band-presets audio-band-presets--detail"},W9=["onClick"],q9={class:"audio-band-reactivity__head"},j9=["disabled"],X9={class:"audio-band-reactivity__viz"},K9=["x","y","height"],Y9={class:"audio-band-reactivity__meter-wrap"},J9={class:"audio-band-reactivity__meter"},Z9={class:"audio-band-reactivity__meter-value"},Q9={key:0,class:"audio-band-reactivity__output"},e7={class:"audio-band-reactivity__output-label"},t7={class:"audio-band-reactivity__output-value"},i7={class:"modulation-lfo-card__controls modulation-audio-band-card__controls modulation-audio-band-card__controls--compact"},n7={class:"modulation-lfo-card__control modulation-audio-band-card__control--wide"},s7=["value"],r7={class:"modulation-lfo-card__control"},o7={class:"audio-reactive-hz-pair"},a7={class:"modulation-lfo-card__control"},l7={class:"audio-reactive-hz-pair"},u7={key:2,class:"audio-reactive-panel__status"},d7={class:"framesync-header modulation-macros__header"},c7={class:"modulation-panel__actions"},h7=["disabled"],m7=["disabled"],p7={key:0,class:"framesync-subtitle modulation-macros__hint"},f7={key:1,class:"modulation-macro-strip"},g7={class:"switch modulation-macro-pill__switch"},y7=["onUpdate:modelValue"],v7=["onUpdate:modelValue"],b7=["value"],_7=["onUpdate:modelValue"],S7=["value"],w7=["onUpdate:modelValue"],M7=["onUpdate:modelValue"];function x7(t,e,i,n,s,r){const l=Ie("Waveform"),o=Ie("TargetCell"),u=Ie("ModulationMappingsPanel"),c=Ie("AudioSpectrumEditor"),h=Ie("GlassPanel");return p(),f("div",z$,[ve(h,{size:"lg",class:"modulation-panel-glass"},{default:Ht(()=>[a("div",$$,[r.isAudioTab?N("",!0):(p(),f("div",G$,[e[30]||(e[30]=a("div",{class:"framesync-title"},[ie(" Modulation "),a("span",{class:"framesync-accent"},"Patch Bay")],-1)),a("span",H$,_(t.modulationSubtabSummary),1)])),r.isAudioTab?N("",!0):(p(),f("div",W$,[a("button",{class:U(["sub-pill",{active:r.modulationPane==="LFO"}]),onClick:e[0]||(e[0]=d=>t.switchSubTab("MODULATION","LFO"))},"LFO",2),a("button",{class:U(["sub-pill",{active:r.modulationPane==="AV_SYNC"}]),onClick:e[1]||(e[1]=d=>t.switchSubTab("MODULATION","AV_SYNC"))},"Audio",2),a("button",{class:U(["sub-pill",{active:r.modulationPane==="AUDIO_REACTIVE"}]),onClick:e[2]||(e[2]=d=>r.openAudioTab())},"Reactive",2),a("button",{class:U(["sub-pill",{active:r.modulationPane==="BEAT_MACROS"}]),onClick:e[3]||(e[3]=d=>t.switchSubTab("MODULATION","BEAT_MACROS"))},"Beat",2),a("button",{class:U(["sub-pill",{active:r.modulationPane==="MAPPINGS"}]),onClick:e[4]||(e[4]=d=>t.switchSubTab("MODULATION","MAPPINGS"))},"Mappings",2)])),r.modulationPane==="LFO"?(p(),f(G,{key:2},[a("div",q$,[a("button",{class:U(["framesync-button",{active:t.lfoOn}]),onClick:e[5]||(e[5]=d=>t.lfoOn=!t.lfoOn)},_(t.lfoOn?"On":"Off"),3),a("button",{class:"framesync-button",onClick:e[6]||(e[6]=(...d)=>t.resetLfos&&t.resetLfos(...d))},"Reset")]),a("div",j$,[(p(!0),f(G,null,re(t.lfos,d=>(p(),f("div",{key:"lfo-"+d.id,class:U(["modulation-lfo-card",{"modulation-lfo-card--active":d.on,"modulation-lfo-card--selected":t.selectedModulationLfo&&t.selectedModulationLfo.id===d.id}]),onClick:m=>t.modulationSelectedLfoId=d.id},[a("div",K$,[a("label",Y$,[K(a("input",{type:"checkbox","onUpdate:modelValue":m=>d.on=m},null,8,J$),[[Ci,d.on]]),a("span",Z$,[e[31]||(e[31]=a("span",{class:"modulation-lfo-card__dot"},null,-1)),a("span",null,"LFO "+_(d.id),1)])]),a("code",Q$,_(d.shape)+" · "+_(d.bpm),1)]),ve(l,{shape:d.shape,phase:d.renderPhase!=null?d.renderPhase:d.phase,depth:d.depth,active:d.on,width:240,height:t.selectedModulationLfo&&t.selectedModulationLfo.id===d.id?88:64,class:"modulation-lfo-card__waveform"},null,8,["shape","phase","depth","active","height"]),t.selectedModulationLfo&&t.selectedModulationLfo.id===d.id?N("",!0):(p(),f("div",e9,_(d.bpm)+" BPM · depth "+_(Number(d.depth).toFixed(2))+" · "+_((d.targets||[]).length?(d.targets||[]).length+" route"+((d.targets||[]).length===1?"":"s"):"no routes"),1)),K(a("div",t9,[a("label",i9,[e[32]||(e[32]=a("span",{class:"framesync-subtitle"},"Shape",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":m=>d.shape=m},[(p(!0),f(G,null,re(t.lfoShapes,m=>(p(),f("option",{key:m,value:m},_(m),9,s9))),128))],8,n9),[[Rt,d.shape]])]),a("label",r9,[e[33]||(e[33]=a("span",{class:"framesync-subtitle"},"BPM",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":m=>d.bpm=m,min:"20",max:"300"},null,8,o9),[[ae,d.bpm,void 0,{number:!0}]])]),a("label",a9,[e[34]||(e[34]=a("span",{class:"framesync-subtitle"},"Speed",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":m=>d.speed=m,min:"0.1",max:"10",step:"0.1"},null,8,l9),[[ae,d.speed,void 0,{number:!0}]])]),a("label",u9,[e[35]||(e[35]=a("span",{class:"framesync-subtitle"},"Depth",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":m=>d.depth=m,min:"0",max:"1",step:"0.01"},null,8,d9),[[ae,d.depth,void 0,{number:!0}]])])],512),[[Ii,t.selectedModulationLfo&&t.selectedModulationLfo.id===d.id]]),a("div",c9,[(d.targets||[]).length?(p(!0),f(G,{key:0},re(d.targets||[],m=>{var g;return p(),f("span",{class:"modulation-route-pill",key:"lfo-route-"+d.id+"-"+m},_(((g=t.sequencerParamMetaMap[m])==null?void 0:g.label)||m),1)}),128)):(p(),f("span",h9,"off")),a("button",{type:"button",class:"framesync-button modulation-lfo-card__route-button",onClick:m=>t.onLfoRouteButtonClick(d.id)},"+ route",8,m9)])],10,X$))),128))]),a("div",p9,[a("div",f9,[a("div",null,[e[36]||(e[36]=a("div",{class:"framesync-subtitle"},"Targets",-1)),t.selectedModulationLfo?(p(),f("div",g9," Armed: LFO "+_(t.selectedModulationLfo.id)+". Click a target to toggle its route. Standby / Three.js targets drive the WebGL animation engine (not Deforum). ",1)):N("",!0)])]),a("div",y9,[(p(!0),f(G,null,re(t.modulationTargets,d=>(p(),ht(o,{key:"shared-target-"+d.key,label:d.label,"param-key":d.key,selected:t.selectedModulationLfo?t.selectedModulationLfo.targets.includes(d.key):!1,focused:t.modulationRouteFocusKey===d.key,owners:t.targetOwners[d.key]||[],onToggle:m=>t.selectedModulationLfo&&t.toggleLfoTarget(t.selectedModulationLfo,d.key)},null,8,["label","param-key","selected","focused","owners","onToggle"]))),128))])])],64)):r.modulationPane==="MAPPINGS"?(p(),ht(u,{key:3,app:i.app},null,8,["app"])):r.modulationPane==="AV_SYNC"?(p(),f("div",v9,[e[43]||(e[43]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Reference "),a("span",{class:"framesync-accent"},"Audio")])],-1)),e[44]||(e[44]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}}," Upload the track you use for modulation. Enable sync to lock playback to the HLS clock. ",-1)),a("div",{class:U(["modulation-audio-dropzone",{"modulation-audio-dropzone--filled":t.audio.objectUrl}]),"data-testid":"audio-dropzone",onDragover:e[9]||(e[9]=(...d)=>t.onModulationAudioDragover&&t.onModulationAudioDragover(...d)),onDrop:e[10]||(e[10]=(...d)=>t.onModulationAudioDrop&&t.onModulationAudioDrop(...d)),onClick:e[11]||(e[11]=d=>t.$refs.audioFileInput&&t.$refs.audioFileInput.click())},[a("input",{ref:"audioFileInput",type:"file",accept:"audio/*",class:"modulation-audio-dropzone__input",onChange:e[7]||(e[7]=(...d)=>t.onAudioUpload&&t.onAudioUpload(...d))},null,544),t.audio.uploadedFile?(p(),f(G,{key:0},[a("span",b9,_(t.audio.uploadedFile),1),a("span",_9,_(t.audioStatus||"Ready"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[8]||(e[8]=(...d)=>t.clearAudioFile&&t.clearAudioFile(...d))},"Remove")],64)):(p(),f(G,{key:1},[e[37]||(e[37]=a("span",{class:"modulation-audio-dropzone__title"},"Drop audio here",-1)),e[38]||(e[38]=a("span",{class:"modulation-audio-dropzone__hint"},"or click to browse · max 50MB",-1))],64))],34),a("label",S9,[K(a("input",{type:"checkbox","data-testid":"av-sync-enable","onUpdate:modelValue":e[12]||(e[12]=d=>t.avSyncEnabled=d),disabled:!t.audio.objectUrl},null,8,w9),[[Ci,t.avSyncEnabled]]),e[39]||(e[39]=ie(" Enable sync ",-1))]),t.avSyncEnabled&&t.audio.objectUrl?(p(),f("div",M9,[e[41]||(e[41]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" If the music feels "),a("em",null,"ahead"),ie(" of the pictures (normal for live HLS + encoder delay), raise "),a("strong",null,"Video lead"),ie(" until it lines up. ")],-1)),a("label",x9,[e[40]||(e[40]=a("span",{class:"framesync-subtitle"},"Video lead (sec)",-1)),K(a("input",{type:"number","data-testid":"av-sync-lead",class:"framesync-input","onUpdate:modelValue":e[13]||(e[13]=d=>t.avSyncLeadSec=d),min:"0",max:"120",step:"0.25"},null,512),[[ae,t.avSyncLeadSec,void 0,{number:!0}]])]),e[42]||(e[42]=a("div",{class:"framesync-subtitle",style:{"margin-top":"4px","font-size":"10px"}},"≈ encoder buffer + HLS fragments (often 2–10s).",-1))])):N("",!0)])):r.modulationPane==="AUDIO_REACTIVE"?(p(),f(G,{key:5},[r.isAudioTab?(p(),f("div",P9,[e[48]||(e[48]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Reference "),a("span",{class:"framesync-accent"},"Audio")])],-1)),e[49]||(e[49]=a("div",{class:"framesync-subtitle modulation-audio-panel__intro"}," Upload the track for band analysis and AV sync. Same file as Modulation → Audio. ",-1)),a("div",{class:U(["modulation-audio-dropzone",{"modulation-audio-dropzone--filled":t.audio.objectUrl}]),"data-testid":"audio-dropzone",onDragover:e[16]||(e[16]=(...d)=>t.onModulationAudioDragover&&t.onModulationAudioDragover(...d)),onDrop:e[17]||(e[17]=(...d)=>t.onModulationAudioDrop&&t.onModulationAudioDrop(...d)),onClick:e[18]||(e[18]=d=>t.$refs.audioTabFileInput&&t.$refs.audioTabFileInput.click())},[a("input",{ref:"audioTabFileInput",type:"file",accept:"audio/*",class:"modulation-audio-dropzone__input",onChange:e[14]||(e[14]=(...d)=>t.onAudioUpload&&t.onAudioUpload(...d))},null,544),t.audio.uploadedFile?(p(),f(G,{key:0},[a("span",T9,_(t.audio.uploadedFile),1),a("span",A9,_(t.audioStatus||"Ready"),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[15]||(e[15]=ft((...d)=>t.clearAudioFile&&t.clearAudioFile(...d),["stop"]))},"Remove")],64)):(p(),f(G,{key:1},[e[45]||(e[45]=a("span",{class:"modulation-audio-dropzone__title"},"Drop audio here",-1)),e[46]||(e[46]=a("span",{class:"modulation-audio-dropzone__hint"},"or click to browse · max 50MB",-1))],64))],34),a("label",C9,[K(a("input",{type:"checkbox","data-testid":"av-sync-enable","onUpdate:modelValue":e[19]||(e[19]=d=>t.avSyncEnabled=d),disabled:!t.audio.objectUrl},null,8,E9),[[Ci,t.avSyncEnabled]]),e[47]||(e[47]=ie(" Enable AV sync (HLS clock) ",-1))])])):N("",!0),a("div",k9,[a("div",{class:U(["framesync-header audio-reactive-panel__header",{"audio-reactive-panel__header--toolbar":r.isAudioTab}])},[r.isAudioTab?N("",!0):(p(),f("div",R9,[...e[50]||(e[50]=[ie("Audio ",-1),a("span",{class:"framesync-accent"},"Reactive",-1)])])),a("button",{type:"button",class:U(["framesync-button",{"framesync-button--live":t.audioReactiveActive}]),onClick:e[20]||(e[20]=(...d)=>t.startAudioStream&&t.startAudioStream(...d))},_(t.audioReactiveActive?"Running":"Start"),3)],2),a("div",L9,[e[51]||(e[51]=ie(" Map frequency bands to live parameters. Meters animate from real audio analysis — drag bands on the spectrum to retune. ",-1)),r.isAudioTab?(p(),f("span",D9," Upload reference audio under Modulation → Audio.")):N("",!0)]),t.activeAudioMapping||t.audioMappings.length?(p(),f("div",I9,[e[52]||(e[52]=a("span",{class:"audio-band-presets__label"},"Quick bands",-1)),(p(!0),f(G,null,re(t.audioBandChips,d=>(p(),f("button",{key:"audio-preset-hero-"+d.key,type:"button",class:"chip",onClick:m=>t.applyAudioBandPreset(t.activeAudioMappingIndex>=0?t.activeAudioMappingIndex:0,d.key)},_(d.label),9,F9))),128)),a("button",{type:"button",class:"chip chip--ghost",onClick:e[21]||(e[21]=(...d)=>t.addAudioMapping&&t.addAudioMapping(...d))},"+ map")])):N("",!0),ve(c,{class:"audio-reactive-panel__spectrum audio-reactive-panel__spectrum--hero","canvas-height":148,mappings:t.audioMappings,levels:t.audioMappingLevels,"active-index":t.activeAudioMappingIndex,"preview-index":t.audioBandPreviewIndex,"spectrum-bins":t.audioSpectrumBins,live:t.audioSpectrumEditorLive,"band-labels":t.audioSpectrumBandLabels,"band-colors":t.audioSpectrumBandColors,onSelectBand:t.onAudioSpectrumSelectBand,onUpdateBand:t.updateAudioMappingBand},null,8,["mappings","levels","active-index","preview-index","spectrum-bins","live","band-labels","band-colors","onSelectBand","onUpdateBand"]),a("div",N9,[(p(!0),f(G,null,re(t.audioMappings,(d,m)=>{var g,b;return p(),f("button",{key:"audio-meter-"+m,type:"button",class:U(["audio-reactive-mapping-card",{"audio-reactive-mapping-card--active":t.activeAudioMappingIndex===m,"audio-reactive-mapping-card--live":t.audioSpectrumPlaying||t.audioReactiveActive,"audio-reactive-mapping-card--preview":t.audioBandPreviewIndex===m}]),onClick:w=>t.onAudioSpectrumSelectBand(m)},[a("div",U9,[a("span",V9,_(d.param?((g=t.lfoTargets.find(w=>w.key===d.param))==null?void 0:g.label)||d.param:"Unmapped"),1),a("code",B9,_(d.freq_min)+"–"+_(d.freq_max)+" Hz",1)]),(p(),f("svg",{class:U(["audio-mini-bars",{"audio-mini-bars--live":t.audioSpectrumPlaying||t.audioReactiveActive}]),viewBox:"0 0 88 28",preserveAspectRatio:"none","aria-hidden":"true"},[(p(!0),f(G,null,re(r.modulationMappingMiniBars[m],(w,v)=>(p(),f("rect",{key:v,x:v*11,y:28-Math.max(2,w*26),width:"9",height:Math.max(2,w*26),class:U(["audio-mini-bars__bar",{"audio-mini-bars__bar--on":w>.04}]),rx:"1.5"},null,10,z9))),128))],2)),a("div",$9,_(Math.round((t.audioMappingLevels[m]||0)*100))+"% · "+_(((b=t.audioBandTabDefs[m])==null?void 0:b.label)||"Band"),1)],10,O9)}),128))]),t.activeAudioMapping?(p(),f("div",G9,[a("div",H9,[(p(!0),f(G,null,re(t.audioBandChips,d=>(p(),f("button",{key:"audio-preset-"+d.key,type:"button",class:"chip",onClick:m=>t.applyAudioBandPreset(t.activeAudioMappingIndex,d.key)},_(d.label),9,W9))),128))]),a("div",{class:U(["audio-band-reactivity",{"audio-band-reactivity--live":t.audioSpectrumPlaying||t.audioReactiveActive,"audio-band-reactivity--preview":t.audioBandPreviewIndex===t.activeAudioMappingIndex}])},[a("div",q9,[e[53]||(e[53]=a("div",null,[a("div",{class:"framesync-subtitle"},"Band reactivity"),a("div",{class:"audio-band-reactivity__hint"}," Live level from the current audio in this bandwidth — output shows mapped parameter value. ")],-1)),a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{"framesync-button--live":t.audioBandPreviewIndex===t.activeAudioMappingIndex}]),disabled:!t.audio.objectUrl,"data-testid":"audio-band-preview",onClick:e[22]||(e[22]=d=>t.toggleAudioBandPreview(t.activeAudioMappingIndex))},_(t.audioBandPreviewIndex===t.activeAudioMappingIndex?"Stop preview":"Preview band"),11,j9)]),a("div",X9,[(p(),f("svg",{class:U(["audio-band-reactivity__spectrum",{"audio-band-reactivity__spectrum--live":t.audioSpectrumPlaying||t.audioReactiveActive}]),viewBox:"0 0 88 36",preserveAspectRatio:"none","aria-hidden":"true"},[(p(!0),f(G,null,re(r.activeBandMiniBars,(d,m)=>(p(),f("rect",{key:"react-bar-"+m,x:m*11,y:36-Math.max(2,d*32),width:"9",height:Math.max(2,d*32),class:U(["audio-band-reactivity__spectrum-bar",{"audio-band-reactivity__spectrum-bar--on":d>.04}]),rx:"1.5"},null,10,K9))),128))],2)),a("div",Y9,[e[54]||(e[54]=a("div",{class:"audio-band-reactivity__meter-label"},"Input",-1)),a("div",J9,[a("div",{class:"audio-band-reactivity__meter-fill",style:Pt({width:r.activeBandLevelPct+"%"})},null,4)]),a("div",Z9,_(r.activeBandLevelPct)+"%",1)]),t.activeAudioMapping.param?(p(),f("div",Q9,[a("span",e7,"→ "+_(r.activeBandTargetLabel),1),a("span",t7,_(r.activeBandOutputPreview),1)])):N("",!0)])],2),a("div",{class:U(["modulation-lfo-card modulation-audio-band-card",{"modulation-lfo-card--active":t.audioReactiveActive||t.audioSpectrumPlaying}])},[a("div",i7,[a("label",n7,[e[56]||(e[56]=a("span",{class:"framesync-subtitle"},"Target",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[23]||(e[23]=d=>t.activeAudioMapping.param=d)},[e[55]||(e[55]=a("option",{value:""},"Select target…",-1)),(p(!0),f(G,null,re(t.lfoTargets,d=>(p(),f("option",{key:"audio-target-"+t.activeAudioMappingIndex+"-"+d.key,value:d.key},_(d.label),9,s7))),128))],512),[[Rt,t.activeAudioMapping.param]])]),a("label",r7,[e[58]||(e[58]=a("span",{class:"framesync-subtitle"},"Hz",-1)),a("span",o7,[K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[24]||(e[24]=d=>t.activeAudioMapping.freq_min=d),min:"20",max:"20000",step:"1","aria-label":"Min Hz"},null,512),[[ae,t.activeAudioMapping.freq_min,void 0,{number:!0}]]),e[57]||(e[57]=a("span",{class:"audio-reactive-hz-pair__sep"},"–",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[25]||(e[25]=d=>t.activeAudioMapping.freq_max=d),min:"20",max:"20000",step:"1","aria-label":"Max Hz"},null,512),[[ae,t.activeAudioMapping.freq_max,void 0,{number:!0}]])])]),a("label",a7,[e[60]||(e[60]=a("span",{class:"framesync-subtitle"},"Out",-1)),a("span",l7,[K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[26]||(e[26]=d=>t.activeAudioMapping.out_min=d),step:"any","aria-label":"Out min"},null,512),[[ae,t.activeAudioMapping.out_min,void 0,{number:!0}]]),e[59]||(e[59]=a("span",{class:"audio-reactive-hz-pair__sep"},"–",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[27]||(e[27]=d=>t.activeAudioMapping.out_max=d),step:"any","aria-label":"Out max"},null,512),[[ae,t.activeAudioMapping.out_max,void 0,{number:!0}]])])])])],2)])):N("",!0),t.audioStatus?(p(),f("div",u7,_(t.audioStatus),1)):N("",!0)])],64)):r.modulationPane==="BEAT_MACROS"?(p(),f("div",{key:6,class:U(["modulation-macros modulation-macros--audio",{"modulation-macros--disabled":!t.audio.objectUrl}])},[a("div",d7,[e[61]||(e[61]=a("div",{class:"framesync-title"},[ie("Beat "),a("span",{class:"framesync-accent"},"Macros")],-1)),a("div",c7,[a("button",{class:U(["framesync-button",{active:t.beatMacroOn}]),onClick:e[28]||(e[28]=d=>t.beatMacroOn=!t.beatMacroOn),disabled:!t.audio.objectUrl},_(t.beatMacroOn?"On":"Off"),11,h7),t.macrosRack.length<6?(p(),f("button",{key:0,class:"framesync-button",onClick:e[29]||(e[29]=(...d)=>t.addMacro&&t.addMacro(...d)),disabled:!t.audio.objectUrl},"+ Add Macro",8,m7)):N("",!0)])]),t.audio.objectUrl?(p(),f("div",f7,[(p(!0),f(G,null,re(t.macrosRack,(d,m)=>(p(),f("div",{key:"macro-"+m,class:U(["modulation-macro-pill",{"modulation-macro-pill--active":d.on}]),style:Pt(d.on?{"--macro-beat-dur":(60/(d.bpm||120)).toFixed(3)+"s"}:{})},[a("label",g7,[K(a("input",{type:"checkbox","onUpdate:modelValue":g=>d.on=g},null,8,y7),[[Ci,d.on]]),ie(" Macro "+_(m+1),1)]),K(a("select",{class:"framesync-select modulation-macro-pill__select","onUpdate:modelValue":g=>d.target=g},[e[62]||(e[62]=a("option",{value:""},"None",-1)),(p(!0),f(G,null,re(t.modulationTargets,g=>(p(),f("option",{key:"macro-target-"+m+"-"+g.key,value:g.key},_(g.label),9,b7))),128))],8,v7),[[Rt,d.target]]),K(a("select",{class:"framesync-select modulation-macro-pill__select","onUpdate:modelValue":g=>d.shape=g},[(p(!0),f(G,null,re([...t.lfoShapes,"Noise"],g=>(p(),f("option",{key:"macro-shape-"+m+"-"+g,value:g},_(g),9,S7))),128))],8,_7),[[Rt,d.shape]]),K(a("input",{type:"number",class:"framesync-input modulation-macro-pill__input","onUpdate:modelValue":g=>d.bpm=g,min:"20",max:"300"},null,8,w7),[[ae,d.bpm,void 0,{number:!0}]]),K(a("input",{type:"number",class:"framesync-input modulation-macro-pill__input","onUpdate:modelValue":g=>d.depth=g,min:"0",max:"1",step:"0.01"},null,8,M7),[[ae,d.depth,void 0,{number:!0}]])],6))),128))])):(p(),f("div",p7," Upload an audio file on the Audio tab to unlock beat macros. "))],2)):N("",!0)])]),_:1})])}const P7=it(B$,[["render",x7]]),T7={name:"FrameRailPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},A7={class:"frame-rail frame-rail--embedded","data-testid":"runs-browser-frames"},C7={class:"frame-rail__header"},E7={class:"frame-rail__title-wrap"},k7={key:0,class:"frame-rail__meta"},R7={key:2,class:"frame-rail__live-tag"},L7={key:1,class:"frame-rail__meta"},D7={class:"frame-rail__actions"},I7={key:0,class:"frame-rail__controls"},F7=["disabled","title"],N7=["disabled"],O7=["max","value"],U7=["disabled"],V7={key:0,ref:"frameRail",class:"frame-rail__list","data-testid":"runs-browser-frames-rail"},B7=["data-frame-index","onClick"],z7={class:"frame-rail__thumb-wrap"},$7=["src","alt","onLoad","onError"],G7={key:0,class:"frame-rail__thumb-loading","aria-hidden":"true"},H7={class:"frame-rail__label"},W7={key:0,class:"frame-rail__item frame-rail__item--pending","data-testid":"frame-rail-pending","aria-hidden":"true"},q7={key:1,class:"frame-rail__empty"},j7={class:"lazy-loading-indicator"},X7={key:0,class:"lazy-loading-indicator__spinner","aria-hidden":"true"},K7={key:1,class:"lazy-loading-indicator__dots","aria-hidden":"true"},Y7={class:"framesync-subtitle",style:{"margin-top":"6px"}};function J7(t,e,i,n,s,r){return p(),f("div",A7,[a("div",C7,[a("div",E7,[e[4]||(e[4]=a("span",{class:"frame-rail__title"},"Frames",-1)),t.frameStripThumbs.length?(p(),f("span",k7,[ie(_(t.selectedFrameLabel)+" · "+_(t.frameStripThumbs.length)+" ",1),t.frameRailSourceLabel?(p(),f(G,{key:0},[ie(" from "+_(t.frameRailSourceLabel),1)],64)):(p(),f(G,{key:1},[ie(" generated")],64)),t.deforumPlaying&&t.frameRailFollowLatest&&!t.frameRailSourceLabel?(p(),f("span",R7,"Live")):N("",!0)])):(p(),f("span",L7,"Waiting for rendered frames…"))]),a("div",D7,[t.frameStripThumbs.length?(p(),f("div",I7,[a("button",{type:"button",class:"frame-rail__step frame-rail__step--undo","data-testid":"deforum-undo-segment",disabled:!t.deforumContinuationCanUndo,title:t.deforumContinuationUndoTitle,onClick:e[0]||(e[0]=(...l)=>t.undoDeforumContinuationSegment&&t.undoDeforumContinuationSegment(...l))},"Undo",8,F7),a("button",{type:"button",class:"frame-rail__step",onClick:e[1]||(e[1]=l=>t.stepFrameSelection(-1)),disabled:t.selectedFrameIndex<=0},"Prev",8,N7),a("input",{class:"frame-rail__scrubber",type:"range",min:"0",max:Math.max(0,t.frameStripThumbs.length-1),value:Math.max(0,t.selectedFrameIndex),onInput:e[2]||(e[2]=l=>t.selectFrame(Number(l.target.value),{userInitiated:!0}))},null,40,O7),a("button",{type:"button",class:"frame-rail__step",onClick:e[3]||(e[3]=l=>t.stepFrameSelection(1)),disabled:t.selectedFrameIndex>=t.frameStripThumbs.length-1},"Next",8,U7)])):N("",!0)])]),t.frameStripThumbs.length?(p(),f("div",V7,[(p(!0),f(G,null,re(t.frameStripThumbs,(l,o)=>(p(),f("button",{key:"frame-rail-"+(l.name||o),type:"button",class:U(["frame-rail__item",{"frame-rail__item--active":o===t.selectedFrameIndex,"frame-rail__item--loading":t.isFrameThumbLoading(l)}]),"data-frame-index":o,"data-testid":"frame-rail-item",onClick:u=>t.selectFrame(o,{userInitiated:!0})},[a("div",z7,[a("img",{class:"frame-rail__thumb",src:l.src||l.url,alt:l.name||"Frame "+o,onLoad:u=>t.onFrameThumbImageLoad(l),onError:u=>t.onFrameThumbImageError(l)},null,40,$7),t.isFrameThumbLoading(l)?(p(),f("div",G7,[...e[5]||(e[5]=[a("span",{class:"lazy-loading-indicator lazy-loading-indicator--thumb"},[a("span",{class:"lazy-loading-indicator__spinner"})],-1)])])):N("",!0)]),a("span",H7,_(t.frameLabel(l)),1)],10,B7))),128)),t.deforumPlaying&&t.frameRailFollowLatest?(p(),f("div",W7,[...e[6]||(e[6]=[$i('
Next…',2)])])):N("",!0)],512)):(p(),f("div",q7,[a("span",j7,[t.framesEmptyStatus.kind==="loading"?(p(),f("span",X7)):N("",!0),a("span",null,_(t.framesEmptyStatus.label),1),t.framesEmptyStatus.kind==="loading"?(p(),f("span",K7,[...e[7]||(e[7]=[a("span",null,null,-1),a("span",null,null,-1),a("span",null,null,-1)])])):N("",!0)]),a("div",Y7,_(t.framesEmptyStatus.detail),1)]))])}const Z7=it(T7,[["render",J7]]),Q7={name:"RunsBrowserPanel",props:{app:{type:Object,required:!0}},components:{FrameRailPanel:Z7,UiIcon:oi},setup(t){return Tt(t)}},eG={class:"rack runs-browser","data-testid":"runs-browser"},tG={class:"framesync-panel runs-browser__panel"},iG={class:"framesync-header"},nG={class:"runs-browser__meta"},sG={class:"runs-browser__count"},rG={key:0,class:"runs-monitor__refreshed"},oG=["disabled"],aG={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},lG={class:"runs-browser__main-tabs sub-pills","data-testid":"runs-browser-main-tabs"},uG={key:0,class:"runs-browser__tab-badge"},dG={key:0,class:"runs-browser__tab-badge"},cG={key:0,class:"runs-browser__tab-badge runs-browser__tab-badge--dim"},hG={key:0,class:"runs-browser__frames-pane","data-testid":"runs-browser-frames-pane"},mG={class:"runs-monitor-bar"},pG=["disabled"],fG={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},gG={class:"framesync-checkbox runs-monitor__auto"},yG={class:"runs-activity-summary","data-testid":"runs-activity-summary"},vG={class:"runs-activity-summary__label"},bG={key:0,class:"runs-active-jobs__warn"},_G={key:1,class:"runs-active-jobs__status"},SG={class:"runs-job-log","data-testid":"runs-job-log"},wG={class:"runs-job-log__time"},MG={class:"runs-job-log__msg"},xG={key:0,class:"runs-job-log__json","data-testid":"runs-job-log-ollama-json"},PG={key:1,class:"runs-job-log__empty"},TG={class:"runs-browser__table-wrap runs-browser__table-wrap--active","data-testid":"runs-active-jobs"},AG={class:"runs-browser__table runs-browser__table--compact"},CG=["onClick"],EG={class:"runs-browser__preview"},kG=["src","alt"],RG={key:1,class:"runs-browser__thumb runs-browser__thumb--empty"},LG={class:"runs-browser__run-id"},DG={class:"runs-browser__worker"},IG={class:"runs-browser__live-frames"},FG={class:"runs-browser__progress"},NG={class:"runs-browser__progress-label"},OG=["title"],UG={class:"runs-browser__eta"},VG={class:"runs-browser__actions"},BG=["onClick"],zG={key:0},$G={class:"runs-browser__filters runs-browser__filters--compact"},GG={class:"runs-browser__sortbar runs-browser__sortbar--compact"},HG={class:"runs-browser__table-wrap"},WG={class:"runs-browser__table runs-browser__table--compact"},qG=["onClick"],jG={class:"runs-browser__preview"},XG=["src","alt"],KG={key:1,class:"runs-browser__thumb runs-browser__thumb--empty"},YG={class:"runs-browser__run-id"},JG={class:"runs-browser__model"},ZG={class:"runs-browser__progress"},QG={class:"runs-browser__progress-label"},eH=["title"],tH={class:"runs-browser__date"},iH={class:"runs-browser__actions"},nH=["onClick"],sH=["onClick"],rH=["onClick"],oH={key:0},aH={key:0,class:"runs-detail-card","data-testid":"runs-detail-card"},lH={class:"runs-detail-card__header"},uH={class:"framesync-title"},dH={class:"runs-detail-card__id"},cH={class:"runs-detail-card__header-actions"},hH={class:"runs-detail-card__tabs sub-pills"},mH={key:0,class:"runs-detail-json__diff-badge"},pH={key:0,class:"runs-detail-card__outputs","data-testid":"runs-detail-outputs"},fH={key:0,class:"runs-detail-card__video-wrap"},gH=["src"],yH={class:"runs-detail-card__output-links"},vH=["href"],bH=["href"],_H={key:1,class:"runs-detail-card__outputs runs-detail-card__outputs--empty"},SH={class:"runs-detail-card__grid runs-detail-card__grid--compact"},wH={class:"runs-browser__seed"},MH={class:"runs-detail-card__full"},xH={class:"runs-detail-card__prompt"},PH={class:"runs-detail-card__full"},TH={class:"runs-detail-card__prompt"},AH={class:"runs-detail-card__full"},CH={key:2,class:"runs-detail-card__frames"},EH={class:"framesync-subtitle"},kH={class:"runs-detail-card__frames-list"},RH=["href"],LH=["src","alt"],DH={key:1,class:"runs-detail-json","data-testid":"runs-detail-json"},IH={class:"runs-detail-json__toolbar"},FH={class:"framesync-checkbox runs-detail-json__filter"},NH={key:0,class:"runs-detail-json__diff-hint"},OH={class:"runs-detail-json__table-wrap"},UH={class:"runs-detail-json__table"},VH={class:"runs-detail-json__key"},BH={class:"runs-detail-json__value"},zH={class:"runs-detail-json__current"},$H={key:0},GH={key:1,class:"runs-detail-json__na"},HH={key:2,class:"runs-detail-json__changed",title:"Differs from current UI value"},WH={key:0},qH={colspan:"3",class:"runs-detail-json__empty"},jH={class:"runs-detail-json__raw"},XH={class:"runs-detail-json__pre"},KH={key:1,class:"runs-compare-card"},YH={class:"runs-compare-card__header"},JH={class:"framesync-title"},ZH={class:"runs-compare-card__actions"},QH={class:"runs-compare-card__table-wrap"},eW={class:"runs-compare-card__table"},tW={key:0,class:"runs-prompt-diff","data-testid":"runs-prompt-diff"},iW={class:"framesync-subtitle"},nW={class:"framesync-subtitle runs-prompt-diff__label"},sW={class:"runs-prompt-diff__columns"},rW={class:"runs-prompt-diff__col"},oW={class:"runs-prompt-diff__col"};function aW(t,e,i,n,s,r){const l=Ie("FrameRailPanel"),o=Ie("UiIcon");return p(),f("div",eG,[a("div",tG,[a("div",iG,[e[35]||(e[35]=a("div",{class:"framesync-title"},[ie("Runs "),a("span",{class:"framesync-accent"},"Monitor")],-1)),a("div",nG,[a("span",sG,[t.runsBrowserTab==="active"?(p(),f(G,{key:0},[ie(_(t.runsActiveList.length)+" active",1)],64)):t.runsBrowserTab==="frames"?(p(),f(G,{key:1},[ie(_(t.frameStripThumbs.length)+" frames",1)],64)):(p(),f(G,{key:2},[ie(_(t.runsFiltered.length)+" / "+_(t.runsPastCount),1)],64))]),t.runsLastRefreshedLabel?(p(),f("span",rG,_(t.runsLastRefreshedLabel),1)):N("",!0),a("button",{class:"framesync-button",disabled:t.runsLoading,onClick:e[0]||(e[0]=u=>t.refreshRuns())},[t.runsLoading?(p(),f("span",aG,[...e[34]||(e[34]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,oG)])]),a("div",lG,[a("button",{type:"button",class:U(["sub-pill",{active:t.runsBrowserTab==="active"}]),"data-testid":"runs-browser-tab-active",onClick:e[1]||(e[1]=u=>t.setRunsBrowserTab("active"))},[e[36]||(e[36]=ie(" Runs ",-1)),t.runsActiveList.length?(p(),f("span",uG,_(t.runsActiveList.length),1)):N("",!0)],2),a("button",{type:"button",class:U(["sub-pill",{active:t.runsBrowserTab==="frames"}]),"data-testid":"runs-browser-tab-frames",onClick:e[2]||(e[2]=u=>t.setRunsBrowserTab("frames"))},[e[37]||(e[37]=ie(" Frames ",-1)),t.frameStripThumbs.length?(p(),f("span",dG,_(t.frameStripThumbs.length),1)):N("",!0)],2),a("button",{type:"button",class:U(["sub-pill",{active:t.runsBrowserTab==="past"}]),"data-testid":"runs-browser-tab-past",onClick:e[3]||(e[3]=u=>t.setRunsBrowserTab("past"))},[e[38]||(e[38]=ie(" Past runs ",-1)),t.runsPastCount?(p(),f("span",cG,_(t.runsPastCount),1)):N("",!0)],2)]),t.runsBrowserTab==="frames"?(p(),f("div",hG,[ve(l,{app:i.app},null,8,["app"])])):t.runsBrowserTab==="active"?(p(),f(G,{key:1},[a("div",mG,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"runs-launch-test",disabled:t.runsLaunching,onClick:e[4]||(e[4]=(...u)=>t.launchTestRun&&t.launchTestRun(...u))},[t.runsLaunching?(p(),f("span",fG,[...e[39]||(e[39]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Launch test job",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Launch test job")],64))],8,pG),a("label",gG,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[5]||(e[5]=u=>t.runsAutoRefresh=u),onChange:e[6]||(e[6]=(...u)=>t.onRunsAutoRefreshChange&&t.onRunsAutoRefreshChange(...u))},null,544),[[Ci,t.runsAutoRefresh]]),ie(" Auto-refresh ("+_(t.runsPollIntervalSec)+"s) ",1)]),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[7]||(e[7]=(...u)=>t.clearRunsJobLog&&t.clearRunsJobLog(...u))},"Clear log")]),a("div",yG,[a("span",vG,_(t.runsActiveSummaryLabel),1),t.deforumBatchesStatus?(p(),f("span",bG,_(t.deforumBatchesStatus),1)):N("",!0),t.runsStatus?(p(),f("span",_G,_(t.runsStatus),1)):N("",!0)]),a("div",SG,[(p(!0),f(G,null,re(t.runsJobLog,u=>(p(),f("div",{key:u.id,class:U(["runs-job-log__line","runs-job-log__line--"+(u.level||"info")])},[a("time",wG,_(t.formatRunsLogTime(u.ts)),1),a("span",MG,_(u.message),1)],2))),128)),t.runsJobLogStoryOllamaJson?(p(),f("pre",xG,_(t.runsJobLogStoryOllamaJson),1)):N("",!0),t.runsJobLog.length?N("",!0):(p(),f("p",PG,"No log entries yet — launch a test job to see activity."))]),a("div",TG,[a("table",AG,[e[41]||(e[41]=a("thead",null,[a("tr",null,[a("th"),a("th",null,"Job"),a("th",null,"Status"),a("th",null,"Worker"),a("th",null,"Frames"),a("th",null,"Progress"),a("th",null,"ETA"),a("th")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(t.runsActiveList,u=>(p(),f("tr",{key:u.run_id,class:U({"runs-row-active":t.runsDetailView&&t.runsDetailView.run_id===u.run_id}),onClick:c=>t.onRunRowClick(u,c)},[a("td",EG,[t.runListingThumbUrl(u)?(p(),f("img",{key:0,src:t.runListingThumbUrl(u),class:"runs-browser__thumb",alt:u.run_id},null,8,kG)):(p(),f("div",RG,"—"))]),a("td",LG,_(t.runListingId(u)),1),a("td",null,[a("span",{class:U(["runs-status-pill","runs-status-pill--"+u.status])},_(u.status),3)]),a("td",DG,_(t.runWorkerName(u)),1),a("td",IG,_(t.runLiveFramesLabel(u)),1),a("td",FG,[a("div",NG,_(t.runFrameProgressLabel(u)),1),t.runFrameProgressPct(u)!=null?(p(),f("div",{key:0,class:"runs-browser__progress-bar",title:t.runFrameProgressLabel(u)},[a("span",{class:"runs-browser__progress-fill",style:Pt({width:t.runFrameProgressPct(u)+"%"})},null,4)],8,OG)):N("",!0)]),a("td",UG,_(t.runEtaLabel(u)),1),a("td",null,[a("div",VG,[t.canKillQueuedRun(u)?(p(),f("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact runs-browser__action runs-browser__action--danger",onClick:c=>t.killQueuedRun(u),title:"Cancel queued batch"},"Kill",8,BG)):N("",!0)])])],10,CG))),128)),t.runsActiveList.length===0?(p(),f("tr",zG,[...e[40]||(e[40]=[a("td",{colspan:"8",class:"runs-browser__empty"}," No active jobs. Launch a test job or start a Deforum batch. ",-1)])])):N("",!0)])])])],64)):(p(),f(G,{key:2},[a("div",$G,[K(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[8]||(e[8]=u=>t.runsFilter.search=u),placeholder:"Search…",onInput:e[9]||(e[9]=(...u)=>t.applyRunsFilters&&t.applyRunsFilters(...u))},null,544),[[ae,t.runsFilter.search,void 0,{trim:!0}]]),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[10]||(e[10]=u=>t.runsFilter.status=u),onChange:e[11]||(e[11]=(...u)=>t.applyRunsFilters&&t.applyRunsFilters(...u))},[...e[42]||(e[42]=[$i('',5)])],544),[[Rt,t.runsFilter.status]]),K(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[12]||(e[12]=u=>t.runsFilter.tag=u),placeholder:"Tag",onInput:e[13]||(e[13]=(...u)=>t.applyRunsFilters&&t.applyRunsFilters(...u))},null,544),[[ae,t.runsFilter.tag,void 0,{trim:!0}]]),K(a("input",{type:"text",class:"framesync-input","onUpdate:modelValue":e[14]||(e[14]=u=>t.runsFilter.model=u),placeholder:"Model",onInput:e[15]||(e[15]=(...u)=>t.applyRunsFilters&&t.applyRunsFilters(...u))},null,544),[[ae,t.runsFilter.model,void 0,{trim:!0}]])]),a("div",GG,[e[44]||(e[44]=a("span",{class:"runs-browser__sort-label"},"Sort:",-1)),K(a("select",{class:"framesync-select runs-browser__sort-select","onUpdate:modelValue":e[16]||(e[16]=u=>t.runsSort.field=u),onChange:e[17]||(e[17]=(...u)=>t.applyRunsFilters&&t.applyRunsFilters(...u))},[...e[43]||(e[43]=[$i('',5)])],544),[[Rt,t.runsSort.field]]),a("button",{class:"framesync-button runs-browser__sort-order",onClick:e[18]||(e[18]=u=>{t.runsSort.order=t.runsSort.order==="desc"?"asc":"desc",t.applyRunsFilters()})},_(t.runsSort.order==="desc"?"Desc":"Asc"),1),e[45]||(e[45]=a("span",{class:"runs-browser__hint"},"Ctrl+click row to compare",-1)),e[46]||(e[46]=a("div",{class:"runs-browser__spacer"},null,-1)),a("button",{class:"framesync-button runs-browser__export",onClick:e[19]||(e[19]=u=>t.exportRuns("json"))},"JSON"),a("button",{class:"framesync-button runs-browser__export",onClick:e[20]||(e[20]=u=>t.exportRuns("csv"))},"CSV")]),a("div",HG,[a("table",WG,[e[48]||(e[48]=a("thead",null,[a("tr",null,[a("th"),a("th",null,"Run ID"),a("th",null,"Status"),a("th",null,"Model"),a("th",null,"Progress"),a("th",null,"Date"),a("th")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(t.runsFiltered,u=>(p(),f("tr",{key:u.run_id,class:U({"runs-row-selected":t.runsSelected.includes(u.run_id),"runs-row-active":t.runsDetailView&&t.runsDetailView.run_id===u.run_id}),onClick:c=>t.onRunRowClick(u,c)},[a("td",jG,[t.runListingThumbUrl(u)?(p(),f("img",{key:0,src:t.runListingThumbUrl(u),class:"runs-browser__thumb",alt:u.run_id},null,8,XG)):(p(),f("div",KG,"—"))]),a("td",YG,_(u.run_id),1),a("td",null,[a("span",{class:U(["runs-status-pill","runs-status-pill--"+u.status])},_(u.status),3)]),a("td",JG,_(u.model||"-"),1),a("td",ZG,[a("div",QG,_(t.runFrameProgressLabel(u)),1),t.runFrameProgressPct(u)!=null?(p(),f("div",{key:0,class:"runs-browser__progress-bar",title:t.runFrameProgressLabel(u)},[a("span",{class:"runs-browser__progress-fill",style:Pt({width:t.runFrameProgressPct(u)+"%"})},null,4)],8,eH)):N("",!0)]),a("td",tH,_(t.formatDate(u.started_at)),1),a("td",null,[a("div",iH,[t.canKillQueuedRun(u)?(p(),f("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact runs-browser__action runs-browser__action--danger",onClick:c=>t.killQueuedRun(u),title:"Cancel queued batch"},"Kill",8,nH)):N("",!0),u._isBatch?N("",!0):(p(),f("button",{key:1,class:"framesync-button runs-browser__action",onClick:c=>t.rerunRun(u),title:"Rerun"},"↻",8,sH)),u._isBatch?N("",!0):(p(),f("button",{key:2,type:"button",class:"framesync-icon-button runs-browser__action",onClick:c=>t.deleteRun(u),title:"Delete","aria-label":"Delete run"},[ve(o,{name:"close"})],8,rH))])])],10,qG))),128)),t.runsFiltered.length===0?(p(),f("tr",oH,[...e[47]||(e[47]=[a("td",{colspan:"7",class:"runs-browser__empty"}," No past runs found. Adjust filters or complete a job. ",-1)])])):N("",!0)])])])],64))]),t.runsDetailView?(p(),f("div",aH,[a("div",lH,[a("div",uH,[e[49]||(e[49]=ie("Run ",-1)),a("span",dH,_(t.runsDetailView.run_id),1)]),a("div",cH,[t.canKillQueuedRun(t.runsDetailView)?(p(),f("button",{key:0,class:"framesync-button framesync-button--danger framesync-button--compact",onClick:e[21]||(e[21]=u=>t.killQueuedRun(t.runsDetailView))},"Kill")):N("",!0),a("button",{class:"framesync-button framesync-button--compact",onClick:e[22]||(e[22]=u=>t.closeRunsDetailView())},"Close")])]),a("div",hH,[a("button",{type:"button",class:U(["sub-pill",{active:t.runsDetailTab==="summary"}]),onClick:e[23]||(e[23]=u=>t.runsDetailTab="summary")},"Summary",2),a("button",{type:"button",class:U(["sub-pill",{active:t.runsDetailTab==="json"}]),"data-testid":"runs-detail-json-tab",onClick:e[24]||(e[24]=u=>t.runsDetailTab="json")},[e[50]||(e[50]=ie(" JSON ",-1)),t.runDetailJsonDiffCount(t.runsDetailView)?(p(),f("span",mH,_(t.runDetailJsonDiffCount(t.runsDetailView)),1)):N("",!0)],2)]),t.runsDetailTab==="summary"?(p(),f(G,{key:0},[t.runHasOutputMaterial(t.runsDetailView)?(p(),f("div",pH,[e[51]||(e[51]=a("div",{class:"framesync-subtitle"},"Output",-1)),t.runPrimaryVideoUrl(t.runsDetailView)?(p(),f("div",fH,[a("video",{class:"runs-detail-card__video",controls:"",playsinline:"",preload:"metadata",src:t.runPrimaryVideoUrl(t.runsDetailView)},null,8,gH)])):N("",!0),a("div",yH,[t.runPrimaryVideoUrl(t.runsDetailView)?(p(),f("a",{key:0,class:"framesync-button framesync-button--compact",href:t.runPrimaryVideoUrl(t.runsDetailView),target:"_blank",rel:"noopener"},"Open video",8,vH)):N("",!0),t.runPrimaryVideoUrl(t.runsDetailView)?(p(),f("button",{key:1,type:"button",class:"framesync-button framesync-button--compact",onClick:e[25]||(e[25]=u=>t.openRunVideoInEditor(t.runsDetailView))},"Open in editor")):N("",!0),t.runsDetailView.frames_browse_url||t.runsDetailView.frames&&t.runsDetailView.frames.length?(p(),f("button",{key:2,type:"button",class:"framesync-button framesync-button--compact",onClick:e[26]||(e[26]=u=>t.openRunMaterialInBrowser(t.runsDetailView))},"Browse frames"+_(t.runsDetailView.frames&&t.runsDetailView.frames.length?` (${t.runsDetailView.frames.length})`:""),1)):N("",!0),(p(!0),f(G,null,re((t.runsDetailView.outputs||[]).filter(u=>u.kind==="preview_frame"&&u.url),u=>(p(),f("a",{key:u.url,class:"framesync-button framesync-button--compact",href:u.url,target:"_blank",rel:"noopener"},"Preview frame",8,bH))),128))])])):(p(),f("div",_H,[...e[52]||(e[52]=[a("span",{class:"framesync-subtitle"},"Output",-1),a("span",{class:"runs-detail-card__no-output"},"No video or frames yet",-1)])])),a("div",SH,[a("div",null,[e[53]||(e[53]=a("div",{class:"framesync-subtitle"},"Status",-1)),a("span",{class:U(["runs-status-pill","runs-status-pill--"+t.runsDetailView.status])},_(t.runsDetailView.status),3)]),a("div",null,[e[54]||(e[54]=a("div",{class:"framesync-subtitle"},"Model",-1)),a("div",null,_(t.runsDetailView.model||"-"),1)]),a("div",null,[e[55]||(e[55]=a("div",{class:"framesync-subtitle"},"Frames",-1)),a("div",null,_(t.runFrameProgressLabel(t.runsDetailView)),1)]),a("div",null,[e[56]||(e[56]=a("div",{class:"framesync-subtitle"},"Seed",-1)),a("div",wH,_(t.runsDetailView.seed||"-"),1)]),a("div",null,[e[57]||(e[57]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("div",null,_(t.runsDetailView.steps||"-"),1)]),a("div",null,[e[58]||(e[58]=a("div",{class:"framesync-subtitle"},"Strength",-1)),a("div",null,_(t.runsDetailView.strength||"-"),1)]),a("div",null,[e[59]||(e[59]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("div",null,_(t.runsDetailView.cfg||"-"),1)]),a("div",null,[e[60]||(e[60]=a("div",{class:"framesync-subtitle"},"Tag",-1)),a("div",null,_(t.runsDetailView.tag||"-"),1)]),a("div",null,[e[61]||(e[61]=a("div",{class:"framesync-subtitle"},"GPU",-1)),a("div",null,_(t.runsDetailView._gpu||t.runsDetailView._batchNode&&t.runsDetailView._batchNode.name||"-"),1)]),a("div",MH,[e[62]||(e[62]=a("div",{class:"framesync-subtitle"},"Positive Prompt",-1)),a("div",xH,_(t.runsDetailView.prompt_positive||"-"),1)]),a("div",PH,[e[63]||(e[63]=a("div",{class:"framesync-subtitle"},"Negative Prompt",-1)),a("div",TH,_(t.runsDetailView.prompt_negative||"-"),1)]),a("div",AH,[e[64]||(e[64]=a("div",{class:"framesync-subtitle"},"Notes",-1)),K(a("textarea",{class:"framesync-input runs-detail-card__notes","onUpdate:modelValue":e[27]||(e[27]=u=>t.runsDetailView.notes=u),placeholder:"Add notes..."},null,512),[[ae,t.runsDetailView.notes]]),a("button",{class:"framesync-button runs-detail-card__save",onClick:e[28]||(e[28]=u=>t.saveRunNotes(t.runsDetailView))},"Save notes")])]),t.runsDetailView.frames&&t.runsDetailView.frames.length?(p(),f("div",CH,[a("div",EH,"Frames ("+_(t.runsDetailView.frames.length)+")",1),a("div",kH,[(p(!0),f(G,null,re(t.runsDetailView.frames.slice(0,24),u=>(p(),f("a",{key:u,href:`/api/runs/${t.runsDetailView.run_id}/frames/${u}`,target:"_blank",rel:"noopener",class:"runs-detail-card__frame-link"},[a("img",{src:`/api/runs/${t.runsDetailView.run_id}/frames/${u}`,class:"runs-detail-card__frame",alt:u},null,8,LH)],8,RH))),128))])])):N("",!0)],64)):(p(),f("div",DH,[a("div",IH,[a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[29]||(e[29]=u=>t.copyRunDetailJson(t.runsDetailView))},"Copy JSON"),a("label",FH,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[30]||(e[30]=u=>t.runsDetailJsonShowDiffOnly=u)},null,512),[[Ci,t.runsDetailJsonShowDiffOnly]]),e[65]||(e[65]=ie(" Show differences only ",-1))]),t.runDetailJsonDiffCount(t.runsDetailView)?(p(),f("span",NH,_(t.runDetailJsonDiffCount(t.runsDetailView))+" value(s) differ from current UI settings ",1)):N("",!0)]),a("div",OH,[a("table",UH,[e[66]||(e[66]=a("thead",null,[a("tr",null,[a("th",null,"Key"),a("th",null,"Run value"),a("th",null,"Current")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(t.runDetailJsonRows(t.runsDetailView),u=>(p(),f("tr",{key:u.path,class:U({"runs-detail-json__row--diff":u.differs})},[a("td",VH,_(u.path),1),a("td",BH,_(u.displayValue),1),a("td",zH,[u.hasCurrent?(p(),f("span",$H,_(u.displayCurrent),1)):(p(),f("span",GH,"—")),u.differs?(p(),f("span",HH,"≠")):N("",!0)])],2))),128)),t.runDetailJsonRows(t.runsDetailView).length===0?(p(),f("tr",WH,[a("td",qH,_(t.runsDetailJsonShowDiffOnly?"No differences from current settings":"No values"),1)])):N("",!0)])])]),a("details",jH,[e[67]||(e[67]=a("summary",null,"Raw JSON",-1)),a("pre",XH,_(t.runDetailJsonPretty(t.runsDetailView)),1)])]))])):N("",!0),t.runsSelected.length>=2?(p(),f("div",KH,[a("div",YH,[a("div",JH,"Compare Runs ("+_(t.runsSelected.length)+")",1),a("div",ZH,[a("button",{class:"framesync-button runs-browser__export",onClick:e[31]||(e[31]=u=>t.exportRunComparison("json"))},"JSON"),a("button",{class:"framesync-button runs-browser__export",onClick:e[32]||(e[32]=u=>t.exportRunComparison("csv"))},"CSV"),a("button",{class:"framesync-button",onClick:e[33]||(e[33]=u=>t.runsSelected=[])},"Clear")])]),a("div",QH,[a("table",eW,[a("thead",null,[a("tr",null,[e[68]||(e[68]=a("th",null,"Property",-1)),(p(!0),f(G,null,re(t.runsSelected,u=>(p(),f("th",{key:u,class:"runs-browser__seed"},_(u),1))),128))])]),a("tbody",null,[(p(!0),f(G,null,re(t.runsCompareFields,u=>(p(),f("tr",{key:u},[a("td",null,_(u),1),(p(!0),f(G,null,re(t.runsSelected,c=>(p(),f("td",{key:c,class:"runs-browser__seed"},_(t.getRunProp(c,u)),1))),128))]))),128))])])]),t.runsSelected.length===2&&t.runsPromptDiff?(p(),f("div",tW,[a("div",iW,"Prompt diff ("+_(t.runsPromptDiff.runA)+" vs "+_(t.runsPromptDiff.runB)+")",1),(p(),f(G,null,re(["positive","negative"],u=>a("div",{key:u,class:"runs-prompt-diff__block"},[a("div",nW,_(u==="positive"?"Positive":"Negative"),1),a("div",sW,[a("div",rW,[(p(!0),f(G,null,re(t.runsPromptDiff[u],(c,h)=>(p(),f("div",{key:u+"-l-"+h,class:U(["runs-prompt-diff__line","runs-prompt-diff__line--"+c.kind])},_(c.left||" "),3))),128))]),a("div",oW,[(p(!0),f(G,null,re(t.runsPromptDiff[u],(c,h)=>(p(),f("div",{key:u+"-r-"+h,class:U(["runs-prompt-diff__line","runs-prompt-diff__line--"+c.kind])},_(c.right||" "),3))),128))])])])),64))])):N("",!0)])):N("",!0)])}const av=it(Q7,[["render",aW]]),lW={name:"StreamView",components:{GlassPanel:nr,UiIcon:oi},props:{app:{type:Object,required:!0}},setup(t){const e=Tt(t),i=va(null),n=va(!1),s=va(!1),r=va(null);let l=null,o=null,u=null;const c=hl(()=>(Array.isArray(e.streaming&&e.streaming.destinations)?e.streaming.destinations:[]).filter(z=>z&&String(z.target||"").trim())),h=E=>{n.value=!!E,typeof e.setHlsPreviewStreamValid=="function"?e.setHlsPreviewStreamValid(E):e.hlsPreviewStreamValid=!!E},d=hl(()=>{const E=String(e.streaming&&e.streaming.activeStatus||"unknown");return E==="running"?"live":E==="error"?"error":E==="stopped"?"idle":"dim"}),m=hl(()=>{const E=String(e.streaming&&e.streaming.activeStatus||"unknown");return E==="running"?"Streaming":E==="error"?"Error":E==="stopped"?"Stopped":"Standby"}),g=E=>!!(E&&e.streaming&&e.streaming.activeStatus==="running"&&e.streaming.activeDestinationId===E.id),b=E=>E==="srt"?"srt://host:port?streamid=publish:demo":E==="whip"?"https://example.com/whip/endpoint":"rtmp://host/app/stream-key",w=(E="rtmp")=>typeof e.newStreamDestination=="function"?{...e.newStreamDestination(E)}:{id:`stream_draft_${Date.now()}`,name:"Custom Stream",protocol:E||"rtmp",target:"",fps:24,resolution:"1024x576",overlay:"",transition:"",kbps:null,health:"idle"},v=(E="rtmp")=>{r.value=w(E),s.value=!0},y=()=>{s.value=!1,r.value=null},S=()=>{const E=r.value;if(!E||!String(E.target||"").trim())return;const z=typeof e.normalizeStreamDestination=="function"?e.normalizeStreamDestination(E,(e.streaming.destinations||[]).length):E;e.streaming.destinations.push(z),typeof e.saveSessionState=="function"&&e.saveSessionState(),y()},P=E=>typeof e.streamDestinationViewUrl=="function"?e.streamDestinationViewUrl(E):String(E&&E.target||"#"),M=E=>{const z=E&&E.kbps;return Number.isFinite(Number(z))?`${Math.round(Number(z))}`:"—"},k=E=>{const z=E&&E.fps;return Number.isFinite(Number(z))?String(Math.round(Number(z))):"—"},C=E=>{const z=String(E&&E.health||"idle").toLowerCase();return z==="healthy"?"live":z==="degraded"?"warn":z==="error"||z==="offline"?"error":g(E)?"live":"dim"},L=E=>{const z=String(E&&E.health||"").toLowerCase();return z==="healthy"?"Healthy":z==="degraded"?"Degraded":z==="error"?"Error":z==="offline"?"Offline":g(E)?"Live":"Idle"},x=()=>{o&&(clearInterval(o),o=null),l&&typeof l.destroy=="function"&&l.destroy(),l=null;const E=i.value;E&&(typeof E.pause=="function"&&E.pause(),E.removeAttribute("src"),typeof E.load=="function"&&E.load())},T=async()=>{await Yc();const E=i.value;if(!E)return;h(!1),l&&typeof l.destroy=="function"&&l.destroy(),l=null;const z=String(e.hlsStreamHref||"/hls/live/deforum.m3u8"),Y=z.includes("?")?`${z}&t=${Date.now()}`:`${z}?t=${Date.now()}`,$=()=>h(!0),W=()=>h(!1);if(E.oncanplay=$,E.onplaying=$,E.onerror=W,E.canPlayType("application/vnd.apple.mpegurl")){E.src=Y,E.load(),typeof e.autoplayVideo=="function"&&e.autoplayVideo(E);return}const q=typeof window<"u"?window.Hls:null;if(q&&typeof q.isSupported=="function"&&q.isSupported()){const te=q.Events||{MANIFEST_PARSED:"manifest_parsed",ERROR:"error"};l=new q({liveSyncDurationCount:3}),l.loadSource(Y),l.attachMedia(E),typeof l.on=="function"&&(l.on(te.MANIFEST_PARSED,()=>{h(!0),typeof e.autoplayVideo=="function"&&e.autoplayVideo(E)}),l.on(te.ERROR,W));return}E.src=Y,E.load(),typeof e.autoplayVideo=="function"&&e.autoplayVideo(E)},F=()=>{o&&clearInterval(o),o=setInterval(()=>{n.value||T()},5e3)},I=()=>{u&&clearInterval(u),u=setInterval(()=>{typeof e.refreshStreamStatus=="function"&&e.refreshStreamStatus()},4e3)};return Zc(()=>{T(),F(),I(),typeof e.refreshStreamStatus=="function"&&e.refreshStreamStatus()}),Qc(()=>{x(),h(!1),u&&(clearInterval(u),u=null)}),Io(()=>e.hlsStreamHref,()=>{T()}),Io(()=>e.streamSrc,()=>{T()}),{app:e,previewEl:i,previewValid:n,addDestinationOpen:s,draft:r,activeDestinations:c,statusTone:d,streamStatusLabel:m,isActive:g,placeholderFor:b,openAddDestinationForm:v,closeAddDestinationForm:y,saveDestination:S,viewUrlFor:P,formatKbps:M,formatFps:k,healthTone:C,healthLabel:L}}},uW={class:"stream-shell"},dW={class:"stream-card__header"},cW={class:"stream-hls-controls"},hW={key:0,class:"framesync-subtitle",style:{margin:"0"}},mW={class:"stream-preview","data-testid":"stream-hls-preview"},pW={ref:"previewEl",class:"stream-preview__video",muted:"",autoplay:"",playsinline:"",controls:""},fW={class:"stream-endpoints"},gW=["href"],yW={class:"stream-endpoint__value"},vW=["href"],bW={class:"stream-endpoint__value"},_W={key:0,class:"stream-card__status"},SW={class:"stream-active-section"},wW={class:"stream-active-header"},MW={key:0,class:"stream-empty","data-testid":"stream-active-empty"},xW={key:1,class:"stream-active-list","data-testid":"stream-active-list"},PW={class:"stream-active-row__main"},TW={class:"stream-active-row__title"},AW={class:"stream-active-row__target"},CW={class:"stream-active-row__metrics"},EW={class:"stream-metric"},kW={class:"stream-metric"},RW={class:"stream-metric"},LW={class:"stream-active-row__actions"},DW=["href"],IW=["onClick"],FW=["disabled"],NW=["onClick"],OW={class:"stream-card__header"},UW={class:"stream-quick-add"},VW={class:"stream-destination__grid"},BW={class:"stream-field stream-field--wide"},zW={class:"stream-field stream-field--wide"},$W=["placeholder"],GW={class:"stream-field"},HW={class:"stream-field"},WW={class:"stream-field"},qW={class:"stream-field stream-field--wide"},jW={class:"stream-destination__actions"},XW=["disabled"];function KW(t,e,i,n,s,r){const l=Ie("UiIcon"),o=Ie("GlassPanel");return p(),f("div",uW,[ve(o,{size:"lg",class:"stream-card stream-card--preview"},{header:Ht(()=>[a("span",dW,[e[13]||(e[13]=a("span",null,"Stream preview",-1)),a("span",{class:U(["stream-status-pill",`stream-status-pill--${n.statusTone}`])},_(n.streamStatusLabel),3)])]),default:Ht(()=>[e[16]||(e[16]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" Configure the live HLS feed and enable main-stage streaming from "),a("strong",null,"Settings → Output"),ie(" or the status strip once the preview is valid. ")],-1)),a("div",cW,[a("span",{class:U(["stream-preview-status",n.previewValid?"stream-preview-status--live":"stream-preview-status--idle"]),"data-testid":"stream-preview-status"},_(n.previewValid?"HLS feed ready":"Waiting for HLS feed…"),3),n.app.hlsWatchEnabled?(p(),f("span",hW," Main stage is showing the live HLS feed. ")):N("",!0)]),a("div",mW,[a("video",pW,null,512)]),a("div",fW,[a("a",{class:"stream-endpoint",href:n.app.hlsStreamHref,target:"_blank",rel:"noreferrer"},[ve(l,{class:"stream-endpoint__icon",name:"broadcast"}),e[14]||(e[14]=a("span",{class:"stream-endpoint__label"},"HLS",-1)),a("code",yW,_(n.app.hlsStreamHref),1)],8,gW),a("a",{class:"stream-endpoint",href:n.app.rtmpStreamHref,target:"_blank",rel:"noreferrer"},[ve(l,{class:"stream-endpoint__icon",name:"broadcast"}),e[15]||(e[15]=a("span",{class:"stream-endpoint__label"},"RTMP",-1)),a("code",bW,_(n.app.rtmpStreamHref),1)],8,vW)]),n.app.streaming.status?(p(),f("div",_W,_(n.app.streaming.status),1)):N("",!0)]),_:1}),a("div",SW,[a("div",wW,[e[17]||(e[17]=a("div",{class:"framesync-title"},[ie("Active "),a("span",{class:"framesync-accent"},"streams")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"stream-add-destination-btn",onClick:e[0]||(e[0]=u=>n.openAddDestinationForm())}," Add destination ")]),!n.activeDestinations.length&&!n.addDestinationOpen?(p(),f("div",MW," No destinations yet. Add one to forward the live feed. ")):N("",!0),n.activeDestinations.length?(p(),f("div",xW,[(p(!0),f(G,null,re(n.activeDestinations,u=>(p(),f("div",{key:u.id,class:U(["stream-active-row",{"stream-active-row--live":n.isActive(u)}])},[a("div",PW,[a("div",TW,_(u.name||"Stream"),1),a("code",AW,_(u.target||"—"),1)]),a("div",CW,[a("div",EW,[e[18]||(e[18]=a("span",{class:"stream-metric__label"},"kbps",-1)),a("strong",null,_(n.formatKbps(u)),1)]),a("div",kW,[e[19]||(e[19]=a("span",{class:"stream-metric__label"},"fps",-1)),a("strong",null,_(n.formatFps(u)),1)]),a("div",RW,[e[20]||(e[20]=a("span",{class:"stream-metric__label"},"health",-1)),a("span",{class:U(["stream-health-pill",`stream-health-pill--${n.healthTone(u)}`])},_(n.healthLabel(u)),3)])]),a("div",LW,[a("a",{class:"framesync-button stream-view-link",href:n.viewUrlFor(u),target:"_blank",rel:"noreferrer","data-testid":"stream-view-link"}," View ",8,DW),a("button",{type:"button",class:"framesync-button",onClick:c=>n.app.startStreamDestination(u.id)},_(n.isActive(u)?"Restart":"Start"),9,IW),a("button",{type:"button",class:"framesync-button",disabled:!n.isActive(u),onClick:e[1]||(e[1]=c=>n.app.stopOutboundStream())}," Stop ",8,FW),a("button",{type:"button",class:"framesync-button",onClick:c=>n.app.removeStreamDestination(u.id)}," Remove ",8,NW)])],2))),128))])):N("",!0)]),n.addDestinationOpen?(p(),ht(o,{key:0,size:"lg",class:"stream-card stream-card--destinations","data-testid":"stream-destination-form"},{header:Ht(()=>[a("span",OW,[e[21]||(e[21]=a("span",null,"Possible destinations",-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[2]||(e[2]=u=>n.closeAddDestinationForm())},"Cancel")])]),default:Ht(()=>[a("div",UW,[e[22]||(e[22]=a("span",{class:"framesync-subtitle",style:{margin:"0"}},"Protocol",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[3]||(e[3]=u=>n.draft.protocol="rtmp")},"RTMP"),a("button",{type:"button",class:"framesync-button",onClick:e[4]||(e[4]=u=>n.draft.protocol="srt")},"SRT"),a("button",{type:"button",class:"framesync-button",onClick:e[5]||(e[5]=u=>n.draft.protocol="whip")},"WHIP")]),a("div",VW,[a("label",BW,[e[23]||(e[23]=a("span",{class:"framesync-subtitle"},"Name",-1)),K(a("input",{"onUpdate:modelValue":e[6]||(e[6]=u=>n.draft.name=u),class:"framesync-input",type:"text",placeholder:"Destination name"},null,512),[[ae,n.draft.name]])]),a("label",zW,[e[24]||(e[24]=a("span",{class:"framesync-subtitle"},"Target URL",-1)),K(a("input",{"onUpdate:modelValue":e[7]||(e[7]=u=>n.draft.target=u),class:"framesync-input",type:"text",placeholder:n.placeholderFor(n.draft.protocol)},null,8,$W),[[ae,n.draft.target]])]),a("label",GW,[e[25]||(e[25]=a("span",{class:"framesync-subtitle"},"FPS",-1)),K(a("input",{"onUpdate:modelValue":e[8]||(e[8]=u=>n.draft.fps=u),class:"framesync-input",type:"number",min:"1",max:"60",step:"1"},null,512),[[ae,n.draft.fps,void 0,{number:!0}]])]),a("label",HW,[e[26]||(e[26]=a("span",{class:"framesync-subtitle"},"Resolution",-1)),K(a("input",{"onUpdate:modelValue":e[9]||(e[9]=u=>n.draft.resolution=u),class:"framesync-input",type:"text",placeholder:"1024x576"},null,512),[[ae,n.draft.resolution]])]),a("label",WW,[e[28]||(e[28]=a("span",{class:"framesync-subtitle"},"Transition",-1)),K(a("select",{"onUpdate:modelValue":e[10]||(e[10]=u=>n.draft.transition=u),class:"framesync-select"},[...e[27]||(e[27]=[a("option",{value:""},"None",-1),a("option",{value:"fade"},"Fade",-1),a("option",{value:"wipe"},"Wipe",-1),a("option",{value:"dissolve"},"Dissolve",-1)])],512),[[Rt,n.draft.transition]])]),a("label",qW,[e[29]||(e[29]=a("span",{class:"framesync-subtitle"},"Overlay image path",-1)),K(a("input",{"onUpdate:modelValue":e[11]||(e[11]=u=>n.draft.overlay=u),class:"framesync-input",type:"text",placeholder:"/absolute/path/to/overlay.png"},null,512),[[ae,n.draft.overlay]])])]),a("div",jW,[a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"stream-save-destination",disabled:!String(n.draft.target||"").trim(),onClick:e[12]||(e[12]=u=>n.saveDestination())}," Save destination ",8,XW)])]),_:1})):N("",!0)])}const YW=it(lW,[["render",KW],["__scopeId","data-v-5c3b8013"]]),JW={name:"StylesSettingsPanel",props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},ZW={class:"styles-settings","data-testid":"styles-settings-panel"},QW={class:"rack"},eq={class:"framesync-panel"},tq={class:"framesync-header"},iq={class:"styles-settings__header-actions"},nq={class:"styles-settings__count"},sq=["disabled"],rq={key:0,class:"framesync-subtitle styles-settings__status"},oq={class:"styles-settings__body"},aq={class:"styles-settings__list rack"},lq=["data-testid","onClick"],uq={key:0,class:"styles-settings__thumb"},dq=["src","alt"],cq={key:1,class:"styles-settings__thumb styles-settings__thumb--generating","aria-label":"Generating preview"},hq={key:2,class:"styles-settings__thumb styles-settings__thumb--empty","aria-hidden":"true"},mq={class:"styles-settings__item-copy"},pq={class:"styles-settings__item-title"},fq={class:"styles-settings__item-meta"},gq={key:3,class:"styles-settings__active-tag"},yq={key:0,class:"styles-settings__editor rack"},vq={class:"framesync-panel"},bq={class:"framesync-header"},_q={class:"styles-settings__header-actions"},Sq={key:0,class:"styles-settings__example-preview styles-settings__example-preview--generating"},wq={class:"framesync-subtitle"},Mq={key:1,class:"styles-settings__example-preview"},xq=["src","alt"],Pq={key:2,class:"styles-settings__example-preview styles-settings__example-preview--empty"},Tq={class:"styles-settings__field"},Aq={class:"styles-settings__field"},Cq={class:"styles-settings__field"},Eq={class:"styles-settings__field"},kq={class:"styles-settings__field"},Rq={class:"framesync-footer styles-settings__editor-actions"},Lq=["disabled"],Dq=["disabled"],Iq={class:"framesync-button styles-settings__upload"};function Fq(t,e,i,n,s,r){return p(),f("div",ZW,[a("div",QW,[a("div",eq,[a("div",tq,[e[17]||(e[17]=a("div",{class:"framesync-title"},[ie("Prompt "),a("span",{class:"framesync-accent"},"Styles")],-1)),a("div",iq,[a("span",nq,_(t.filteredPromptStyles.length)+" / "+_(t.promptStyles.length),1),a("button",{type:"button",class:"framesync-button framesync-button--compact",disabled:t.promptStylesLoading||t.promptStylesImporting,"data-testid":"prompt-styles-import-forge",onClick:e[0]||(e[0]=l=>t.importPromptStylesFromForge())},_(t.promptStylesImporting?"Importing…":"Import from Forge"),9,sq),a("button",{type:"button",class:"framesync-button framesync-button--compact",onClick:e[1]||(e[1]=l=>t.startNewPromptStyle())}," + New style ")])]),e[18]||(e[18]=a("p",{class:"framesync-subtitle styles-settings__intro"}," Select a style to edit its name, description, preview scene, and prompt modifiers. Missing preview images are generated with txt2img using the preview scene plus this style’s append text. ",-1)),t.promptStylesStatus?(p(),f("div",rq,_(t.promptStylesStatus),1)):N("",!0),K(a("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>t.promptStyleSearch=l),type:"search",class:"framesync-input styles-settings__search",placeholder:"Search styles…","data-testid":"prompt-styles-search"},null,512),[[ae,t.promptStyleSearch,void 0,{trim:!0}]])])]),a("div",oq,[a("div",aq,[(p(!0),f(G,null,re(t.filteredPromptStyles,l=>(p(),f("button",{key:l.id,type:"button",class:U(["styles-settings__item",{active:t.promptStyleEditorId===l.id,selected:t.activePromptStyleId===l.id}]),"data-testid":"prompt-style-item-"+l.id,onClick:o=>t.openPromptStyleEditor(l.id)},[l.exampleImage?(p(),f("div",uq,[a("img",{src:l.exampleImage,alt:l.name,loading:"lazy"},null,8,dq)])):t.promptStylePreviewGeneratingId===l.id?(p(),f("div",cq,[...e[19]||(e[19]=[a("span",{class:"styles-settings__thumb-label"},"Generating…",-1)])])):(p(),f("div",hq)),a("div",mq,[a("div",pq,_(l.name),1),a("div",fq,_(l.description||l.source||"custom"),1)]),t.activePromptStyleId===l.id?(p(),f("span",gq,"Active")):N("",!0)],10,lq))),128))]),t.promptStyleDraft?(p(),f("div",yq,[a("div",vq,[a("div",bq,[e[20]||(e[20]=a("div",{class:"framesync-title"},[ie("Style "),a("span",{class:"framesync-accent"},"editor")],-1)),a("div",_q,[a("button",{type:"button",class:U(["framesync-button framesync-button--compact",{"framesync-button--live":t.activePromptStyleId===t.promptStyleDraft.id}]),"data-testid":"prompt-style-use-active",onClick:e[3]||(e[3]=l=>t.selectActivePromptStyle(t.promptStyleDraft.id))},_(t.activePromptStyleId===t.promptStyleDraft.id?"Active on Prompts":"Use on Prompts"),3),t.activePromptStyleId===t.promptStyleDraft.id?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",onClick:e[4]||(e[4]=l=>t.selectActivePromptStyle(null))}," Clear active ")):N("",!0)])]),t.promptStylePreviewGeneratingId===t.promptStyleDraft.id?(p(),f("div",Sq,[a("span",wq,"Generating preview with “"+_(t.promptStyleDraftPreviewPrompt)+"”…",1)])):t.promptStyleDraft.exampleImage?(p(),f("div",Mq,[a("img",{src:t.promptStyleDraft.exampleImage,alt:t.promptStyleDraft.name+" example"},null,8,xq)])):(p(),f("div",Pq,[...e[21]||(e[21]=[a("span",{class:"framesync-subtitle"},"No preview yet — select this style to generate one automatically.",-1)])])),a("label",Tq,[e[22]||(e[22]=a("span",{class:"framesync-subtitle"},"Name",-1)),K(a("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>t.promptStyleDraft.name=l),type:"text",class:"framesync-input","data-testid":"prompt-style-name"},null,512),[[ae,t.promptStyleDraft.name,void 0,{trim:!0}]])]),a("label",Aq,[e[23]||(e[23]=a("span",{class:"framesync-subtitle"},"Description",-1)),K(a("textarea",{"onUpdate:modelValue":e[6]||(e[6]=l=>t.promptStyleDraft.description=l),class:"framesync-input",rows:"3",placeholder:"What this style is for, mood, subject matter, references…","data-testid":"prompt-style-description"},null,512),[[ae,t.promptStyleDraft.description]])]),a("label",Cq,[e[24]||(e[24]=a("span",{class:"framesync-subtitle"},"Preview scene (txt2img)",-1)),K(a("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>t.promptStyleDraft.previewPrompt=l),type:"text",class:"framesync-input",placeholder:"bunny and cat in space","data-testid":"prompt-style-preview-prompt"},null,512),[[ae,t.promptStyleDraft.previewPrompt,void 0,{trim:!0}]]),e[25]||(e[25]=a("span",{class:"framesync-subtitle styles-settings__field-hint"}," Base scene for the thumbnail; positive and negative append below are added when generating the preview. ",-1))]),a("label",Eq,[e[26]||(e[26]=a("span",{class:"framesync-subtitle"},"Positive append",-1)),K(a("textarea",{"onUpdate:modelValue":e[8]||(e[8]=l=>t.promptStyleDraft.positive=l),class:"framesync-input",rows:"3","data-testid":"prompt-style-positive"},null,512),[[ae,t.promptStyleDraft.positive]])]),a("label",kq,[e[27]||(e[27]=a("span",{class:"framesync-subtitle"},"Negative append",-1)),K(a("textarea",{"onUpdate:modelValue":e[9]||(e[9]=l=>t.promptStyleDraft.negative=l),class:"framesync-input",rows:"3","data-testid":"prompt-style-negative"},null,512),[[ae,t.promptStyleDraft.negative]])]),a("div",Rq,[a("button",{type:"button",class:"framesync-button","data-testid":"prompt-style-save",onClick:e[10]||(e[10]=l=>t.savePromptStyleDraft())}," Save "),a("button",{type:"button",class:"framesync-button framesync-button--live","data-testid":"prompt-style-generate-preview",disabled:!!t.promptStylePreviewGeneratingId,onClick:e[11]||(e[11]=l=>t.generatePromptStyleExample(t.promptStyleDraft.id))},_(t.promptStylePreviewGeneratingId===t.promptStyleDraft.id?"Generating…":"Generate preview"),9,Lq),a("button",{type:"button",class:"framesync-button",disabled:!t.performance.lastPreviewPath&&!t.generator.lastPath,"data-testid":"prompt-style-example-from-preview",onClick:e[12]||(e[12]=l=>t.setPromptStyleExampleFromPreview(t.promptStyleDraft.id))}," Example from last preview ",8,Dq),a("label",Iq,[e[28]||(e[28]=ie(" Upload example ",-1)),a("input",{type:"file",accept:"image/*",class:"styles-settings__upload-input",onChange:e[13]||(e[13]=l=>t.onPromptStyleExampleFile(l,t.promptStyleDraft.id))},null,32)]),t.promptStyleDraft.exampleImage?(p(),f("button",{key:0,type:"button",class:"framesync-button",onClick:e[14]||(e[14]=l=>t.clearPromptStyleExample(t.promptStyleDraft.id))}," Clear example ")):N("",!0),t.promptStyles.find(l=>l.id===t.promptStyleDraft.id)?(p(),f("button",{key:2,type:"button",class:"framesync-button","data-testid":"prompt-style-delete",onClick:e[16]||(e[16]=l=>t.deletePromptStyle(t.promptStyleDraft.id))}," Delete ")):(p(),f("button",{key:1,type:"button",class:"framesync-button",onClick:e[15]||(e[15]=l=>{t.promptStyleDraft=null,t.promptStyleEditorId=null})}," Cancel "))])])])):N("",!0)])])}const Nq=it(JW,[["render",Fq],["__scopeId","data-v-929085f3"]]),Oq={name:"SettingsView",components:{RunsBrowserPanel:av,StreamView:YW,StylesSettingsPanel:Nq,GlassPanel:nr,UiIcon:oi},props:{app:{type:Object,required:!0}},setup(t){return Tt(t)}},Uq={class:"settings-tab-shell"},Vq={class:"sub-pills settings-subtabs"},Bq={key:0},zq={class:"rack"},$q={class:"engine-main-summary engine-main-summary--glass"},Gq=["disabled","title"],Hq={class:"engine-main-card__value engine-main-card__value--model"},Wq={class:"engine-main-card__meta"},qq={class:"engine-main-card engine-main-card--stat"},jq={class:"engine-main-card__value"},Xq={class:"engine-main-card engine-main-card--stat"},Kq={class:"engine-main-card__value"},Yq={class:"engine-main-card engine-main-card--stat"},Jq={class:"engine-main-card__value engine-main-card__value--small"},Zq={class:"engine-main-inline-status-row"},Qq={class:"engine-main-inline-status"},ej={class:"engine-advanced-panel framesync-panel"},tj={class:"framesync-row engine-main-grid",style:{"grid-template-columns":"1fr 1fr 0.8fr 0.8fr",gap:"10px","margin-top":"12px"}},ij={class:"framesync-stack"},nj=["value"],sj=["value"],rj={class:"framesync-stack"},oj=["value"],aj=["value"],lj={class:"framesync-stack"},uj=["value","disabled","title"],dj={class:"framesync-stack"},cj=["value"],hj={class:"framesync-row",style:{"grid-template-columns":"repeat(4, 1fr)",gap:"10px","margin-top":"12px"}},mj={class:"framesync-stack"},pj=["value"],fj={class:"framesync-stack"},gj=["value"],yj={class:"framesync-stack"},vj={class:"framesync-stack"},bj={class:"engine-main-inline-status"},_j={class:"lcm-engine-panel","data-testid":"lcm-engine-panel"},Sj={class:"lcm-engine-panel__toggle"},wj=["checked"],Mj={key:0,class:"lcm-engine-panel__fields"},xj={class:"framesync-stack"},Pj=["value"],Tj={class:"framesync-stack lcm-engine-panel__lora"},Aj=["value"],Cj={class:"framesync-footer",style:{"margin-top":"12px"}},Ej=["disabled"],kj={class:"engine-seed-control","data-testid":"engine-seed-control"},Rj=["value"],Lj={key:1,class:"engine-seed-control__random-hint"},Dj={class:"framesync-button",style:{cursor:"default"}},Ij={class:"framesync-button",style:{cursor:"default"}},Fj={class:"engine-model-picker__dialog",role:"dialog","aria-modal":"true","aria-label":"Checkpoint selector"},Nj={class:"engine-model-picker__header"},Oj={class:"framesync-subtitle engine-model-picker__subtitle"},Uj={class:"engine-model-picker__header-actions"},Vj=["disabled"],Bj={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},zj={class:"sub-pills engine-model-picker__tabs"},$j=["onClick"],Gj={class:"engine-model-picker__tab-count"},Hj={key:0,class:"framesync-subtitle engine-model-picker__status"},Wj={key:1,class:"framesync-subtitle engine-model-picker__status"},qj={key:2,class:"engine-model-picker__empty"},jj={key:3,class:"engine-model-picker__list"},Xj=["disabled","onClick"],Kj={class:"engine-model-picker__item-title"},Yj={class:"engine-model-picker__item-meta"},Jj={key:1},Zj={class:"rack"},Qj={class:"framesync-panel"},eX={key:0,style:{color:"var(--text-secondary)","margin-top":"12px","font-size":"12px"}},tX={key:1},iX={class:"framesync-footer",style:{"margin-top":"12px"}},nX=["onClick"],sX={class:"framesync-footer",style:{"margin-top":"8px"}},rX={class:"framesync-button"},oX={style:{"margin-top":"12px",background:"var(--bg-0)",border:"1px solid var(--border)","border-radius":"8px",overflow:"hidden"}},aX={class:"table"},lX=["onUpdate:modelValue"],uX=["onUpdate:modelValue"],dX=["onUpdate:modelValue"],cX={label:"Modulation 1–6"},hX=["value"],mX=["value"],pX=["onClick"],fX={class:"rack"},gX={class:"framesync-panel"},yX={class:"framesync-header"},vX={style:{display:"flex",gap:"8px","align-items":"center"}},bX={key:0,style:{"margin-top":"8px",padding:"8px 12px",background:"rgba(127,119,221,0.08)",border:"1px solid var(--accent)","border-radius":"6px","font-size":"12px",color:"var(--accent-text)"}},_X={class:"framesync-row",style:{"grid-template-columns":"repeat(2, 1fr)",gap:"10px","margin-top":"12px"}},SX={class:"framesync-subtitle"},wX={style:{background:"var(--bg-0)",border:"1px solid var(--border)","border-radius":"6px",overflow:"hidden"}},MX={style:{width:"100%","font-size":"11px","border-collapse":"collapse"}},xX={style:{padding:"4px 8px",color:"var(--text-primary)"}},PX={style:{padding:"4px 8px"}},TX={key:0,style:{display:"inline-flex","align-items":"center",gap:"4px"}},AX={style:{background:"var(--bg-2)",border:"1px solid var(--border-strong)","border-radius":"3px",padding:"2px 6px","font-family":"monospace","font-size":"10px",color:"var(--success)"}},CX=["onClick"],EX={key:1,style:{color:"var(--text-dim)"}},kX={style:{padding:"4px 8px"}},RX={key:0,style:{display:"inline-flex","align-items":"center",gap:"4px"}},LX={style:{background:"var(--bg-2)",border:"1px solid var(--border-strong)","border-radius":"3px",padding:"2px 6px","font-size":"10px",color:"var(--warn)"}},DX=["onClick"],IX={key:1,style:{color:"var(--text-dim)"}},FX={style:{padding:"4px 8px","text-align":"center"}},NX=["onClick"],OX={class:"rack"},UX={class:"framesync-panel"},VX={class:"framesync-footer",style:{"margin-top":"12px"}},BX=["onClick"],zX=["disabled"],$X={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},GX={class:"framesync-stack",style:{"margin-top":"12px"}},HX={class:"framesync-footer",style:{"margin-top":"10px"}},WX={key:0,class:"framesync-subtitle",style:{"margin-top":"8px","text-align":"center"}},qX={class:"framesync-header",style:{"margin-top":"20px","padding-top":"12px","border-top":"1px solid var(--border)"}},jX=["disabled"],XX={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},KX={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"10px"}},YX={class:"framesync-stack"},JX={class:"framesync-stack"},ZX={class:"framesync-footer",style:{"margin-top":"8px"}},QX={key:1,class:"framesync-list",style:{"margin-top":"10px","font-size":"11px","padding-left":"16px"}},eK={style:{color:"var(--text-dim)"}},tK=["onClick"],iK=["onClick"],nK={key:2,style:{"margin-top":"10px","font-size":"11px",color:"var(--text-dim)"}},sK={key:3,class:"framesync-subtitle",style:{"margin-top":"8px"}},rK={key:2},oK={class:"rack"},aK={class:"framesync-panel","data-testid":"service-health-panel"},lK={class:"framesync-header"},uK=["disabled"],dK={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},cK={class:"service-health-grid"},hK={class:"service-health-card"},mK={class:"service-health-card__head"},pK={class:"service-health-card"},fK={class:"service-health-card__head"},gK={class:"service-health-card__meta"},yK={key:0},vK={key:1},bK={class:"service-health-card"},_K={class:"service-health-card__head"},SK={class:"service-health-card__meta"},wK={class:"service-health-card"},MK={class:"service-health-card__head"},xK={class:"service-health-card__meta"},PK={key:0},TK={key:1},AK={key:2},CK={class:"service-health-card"},EK={class:"service-health-card__head"},kK={class:"framesync-subtitle",style:{"margin-top":"10px"}},RK={class:"framesync-panel infra-panel","data-testid":"infrastructure-panel"},LK={class:"framesync-header"},DK=["disabled"],IK={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},FK={class:"infra-section","data-testid":"infra-mediator-list"},NK={key:0,class:"infra-panel__empty"},OK={key:1,class:"infra-mediator-list"},UK=["data-testid"],VK={class:"infra-mediator-card__head"},BK={key:0,class:"infra-mediator-card__meta"},zK={key:1,class:"infra-panel__empty"},$K={key:2,class:"infra-mediator-card","data-testid":"infra-mediator-card"},GK={class:"infra-mediator-card__head"},HK={class:"infra-mediator-card__source"},WK={class:"infra-mediator-card__meta"},qK={key:3,class:"infra-panel__empty"},jK={class:"infra-section"},XK={key:0,class:"infra-panel__empty"},KK={key:1,class:"infra-panel__empty"},YK={key:2,class:"gpu-pool-table-wrap","data-testid":"infra-transcoder-table"},JK={class:"gpu-pool-table infra-transcoder-table"},ZK={class:"infra-address"},QK={key:0,class:"infra-address-sub"},eY={class:"framesync-panel","data-testid":"gpu-pool-panel"},tY={class:"framesync-header"},iY={class:"framesync-checkbox gpu-pool-enable"},nY={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr 1fr",gap:"10px","margin-top":"12px"}},sY={class:"framesync-stack"},rY=["disabled"],oY={class:"framesync-stack"},aY={class:"gpu-pool-healthy-count"},lY={class:"framesync-stack",style:{"justify-content":"flex-end"}},uY=["disabled"],dY={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},cY={class:"framesync-row",style:{"grid-template-columns":"2fr 1fr",gap:"10px","margin-top":"10px"}},hY={class:"framesync-stack"},mY=["disabled"],pY=["value"],fY={class:"framesync-stack",style:{"justify-content":"flex-end"}},gY=["disabled"],yY={key:0,class:"framesync-subtitle",style:{"margin-top":"10px"}},vY={class:"gpu-pool-add",style:{"margin-top":"14px",padding:"12px",border:"1px solid var(--border)","border-radius":"10px"}},bY={class:"framesync-row",style:{"grid-template-columns":"2fr 1fr 1fr",gap:"8px","margin-top":"8px"}},_Y=["disabled"],SY=["disabled"],wY=["disabled"],MY={key:0,class:"framesync-footer",style:{"margin-top":"8px","align-items":"center",gap:"8px","flex-wrap":"wrap"}},xY=["disabled"],PY=["value"],TY=["disabled"],AY={class:"framesync-footer",style:{"margin-top":"8px"}},CY=["disabled"],EY={key:1,style:{"margin-top":"14px",display:"grid",gap:"10px"}},kY={class:"gpu-node-card__header"},RY={class:"gpu-node-card__identity"},LY={style:{"font-size":"12px"}},DY={style:{"font-size":"10px",color:"var(--text-dim)"}},IY={style:{"font-size":"10px",color:"var(--text-dim)"}},FY={key:0,style:{"font-size":"10px",color:"var(--text-dim)"}},NY={key:1,style:{"font-size":"10px",color:"var(--text-dim)"}},OY={class:"gpu-node-card__stats"},UY={title:"Current model",style:{"font-size":"10px",color:"var(--text-secondary)","max-width":"140px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},VY={title:"VRAM",style:{"font-size":"10px",color:"var(--text-dim)"}},BY={title:"GPU utilization",style:{"font-size":"10px",color:"var(--text-dim)"}},zY={title:"Active jobs",style:{"font-size":"10px",color:"var(--text-dim)"}},$Y={key:0,title:"Forge queue (running/pending)",style:{"font-size":"10px",color:"var(--text-dim)"}},GY={key:1,title:"Forge progress",style:{"font-size":"10px",color:"var(--text-dim)"}},HY={class:"framesync-footer",style:{"flex-wrap":"wrap",gap:"4px",margin:"0"}},WY=["onClick"],qY=["onClick"],jY=["onClick"],XY=["onClick"],KY=["onClick"],YY=["onClick"],JY={key:0,class:"framesync-footer",style:{margin:"8px 0 0","align-items":"center",gap:"8px","flex-wrap":"wrap"}},ZY=["value"],QY={key:1,class:"gpu-node-log"},eJ={key:0,class:"gpu-node-log__empty"},tJ={class:"gpu-node-log__path"},iJ={class:"gpu-node-log__duration"},nJ={key:0,class:"gpu-node-log__error"},sJ={class:"gpu-node-log__time"},rJ={key:2,style:{"margin-top":"14px","font-size":"12px",color:"var(--text-dim)"}},oJ={key:3,class:"framesync-subtitle",style:{"margin-top":"10px"}},aJ={class:"gpu-forge-modal__dialog"},lJ={class:"gpu-forge-modal__header"},uJ={class:"framesync-subtitle gpu-forge-modal__subtitle"},dJ={class:"framesync-row gpu-forge-modal__identity",style:{"grid-template-columns":"1fr 1.6fr 0.6fr",gap:"10px","margin-top":"12px"}},cJ={class:"framesync-stack"},hJ=["disabled"],mJ={class:"framesync-stack"},pJ=["disabled"],fJ={class:"framesync-stack"},gJ=["disabled"],yJ={class:"framesync-footer",style:{"margin-top":"12px"}},vJ=["disabled"],bJ={key:0,class:"lazy-loading-indicator lazy-loading-indicator--button"},_J=["disabled"],SJ=["disabled"],wJ={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},MJ={class:"framesync-stack"},xJ={class:"framesync-stack"},PJ={class:"forge-tab__endpoint"},TJ={class:"framesync-subtitle forge-tab__note"},AJ={class:"gpu-forge-modal__mediator","data-testid":"gpu-forge-mediator-section"},CJ={class:"framesync-subtitle forge-tab__note",style:{"margin-top":"6px"}},EJ={class:"framesync-row",style:{"grid-template-columns":"1.4fr 0.8fr 0.8fr",gap:"10px","margin-top":"10px"}},kJ={class:"framesync-stack"},RJ=["disabled"],LJ={class:"framesync-stack"},DJ=["disabled"],IJ={class:"framesync-stack"},FJ=["disabled"],NJ={class:"framesync-footer",style:{"margin-top":"10px","align-items":"center","flex-wrap":"wrap",gap:"8px"}},OJ=["disabled"],UJ={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},VJ={class:"framesync-stack"},BJ=["value"],zJ={class:"framesync-stack"},$J=["value"],GJ={class:"framesync-row",style:{"grid-template-columns":"1fr",gap:"10px","margin-top":"12px"}},HJ={class:"framesync-stack"},WJ=["value"],qJ={class:"framesync-row forge-tab__options-grid",style:{"grid-template-columns":"repeat(3, 1fr)",gap:"10px","margin-top":"12px"}},jJ={class:"framesync-stack"},XJ={class:"framesync-stack"},KJ={class:"framesync-stack"},YJ={key:0,class:"forge-tab__metadata"},JJ={class:"chips",style:{"margin-top":"8px"}},ZJ={key:1,class:"framesync-subtitle",style:{"margin-top":"12px"}},QJ={key:3},eZ={key:4,class:"settings-plugins-tab","data-testid":"settings-plugins-registry"},tZ={class:"rack"},iZ={class:"framesync-panel"},nZ={class:"framesync-header"},sZ={key:0,class:"framesync-list settings-plugins-tab__list"},rZ={key:0},oZ={key:1,class:"framesync-subtitle settings-plugins-tab__empty"},aZ={key:5},lZ={class:"rack"},uZ={class:"framesync-panel"},dZ={class:"framesync-header"},cZ={key:0,style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},hZ={class:"framesync-row",style:{"grid-template-columns":"1fr 1fr",gap:"10px","margin-top":"12px"}},mZ={class:"framesync-stack"},pZ={class:"framesync-stack"},fZ=["value"],gZ={class:"framesync-subtitle",style:{"margin-top":"14px"}},yZ={key:0,class:"framesync-list",style:{"font-size":"11px","padding-left":"16px","margin-top":"6px"}},vZ={key:0,style:{color:"var(--warn)"}},bZ={key:1,style:{"font-size":"11px",color:"var(--text-dim)","margin-top":"6px"}},_Z={class:"framesync-footer",style:{"margin-top":"8px"}},SZ={key:2,class:"framesync-list",style:{"margin-top":"8px","font-size":"11px","padding-left":"16px"}},wZ=["onClick"],MZ={key:3,class:"framesync-subtitle",style:{"margin-top":"10px",color:"var(--success)"}},xZ={key:4,style:{"font-size":"11px","margin-top":"6px"}},PZ=["onClick"],TZ={key:5,style:{"font-size":"11px",color:"var(--text-dim)","margin-top":"6px"}},AZ={key:6,"data-testid":"settings-output-stream"},CZ={key:7,class:"system-runs-tab","data-testid":"settings-system-runs"};function EZ(t,e,i,n,s,r){const l=Ie("GlassPanel"),o=Ie("UiIcon"),u=Ie("StylesSettingsPanel"),c=Ie("StreamView"),h=Ie("RunsBrowserPanel");return p(),f("div",Uq,[a("div",Vq,[a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="ENGINE"}]),onClick:e[0]||(e[0]=d=>t.switchSubTab("SETTINGS","ENGINE"))},"ENGINE",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="OUTPUT"}]),onClick:e[1]||(e[1]=d=>t.switchSubTab("SETTINGS","OUTPUT"))},"OUTPUT",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="GPUS"}]),onClick:e[2]||(e[2]=d=>t.switchSubTab("SETTINGS","GPUS"))},"GPUS",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="RUNS"||t.currentSubTab.SETTINGS==="SYSTEM"}]),onClick:e[3]||(e[3]=d=>t.switchSubTab("SETTINGS","RUNS"))},"RUNS",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="MIDI"}]),onClick:e[4]||(e[4]=d=>t.switchSubTab("SETTINGS","MIDI"))},"CONTROLLERS / MIDI",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="STYLES"}]),onClick:e[5]||(e[5]=d=>t.switchSubTab("SETTINGS","STYLES"))},"STYLES",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="PLUGINS"}]),onClick:e[6]||(e[6]=d=>t.switchSubTab("SETTINGS","PLUGINS"))},"PLUGINS",2),a("button",{class:U(["sub-pill",{active:t.currentSubTab.SETTINGS==="COLLAB"}]),onClick:e[7]||(e[7]=d=>t.switchSubTab("SETTINGS","COLLAB"))},"COLLAB",2)]),t.currentSubTab.SETTINGS==="ENGINE"?(p(),f("div",Bq,[a("div",zq,[ve(l,{size:"lg",class:"engine-model-glass"},{header:Ht(()=>[...e[84]||(e[84]=[ie("Checkpoint",-1)])]),default:Ht(()=>[a("div",$q,[a("button",{type:"button",class:"engine-main-card engine-main-card--wide engine-main-card--picker",disabled:t.forge.switching,title:t.engineCurrentModelName?"Change checkpoint":"Select checkpoint","data-testid":"engine-model-picker",onClick:e[8]||(e[8]=d=>t.openEngineModelPicker())},[e[85]||(e[85]=a("div",{class:"framesync-subtitle"},"Current model",-1)),a("div",Hq,_(t.engineCurrentModelName||"Select checkpoint"),1),a("div",Wq,_(t.engineOptimizedProfileLabel)+" · "+_(t.engineCurrentModelFamilyLabel),1),e[86]||(e[86]=a("div",{class:"engine-main-card__hint"},"Click to browse checkpoints",-1))],8,Gq),a("div",qq,[e[87]||(e[87]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("div",jq,_(t.engineCurrentCfgScale.toFixed(1)),1)]),a("div",Xq,[e[88]||(e[88]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("div",Kq,_(t.engineCurrentSteps),1)]),a("div",Yq,[e[89]||(e[89]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),a("div",Jq,_(t.deforumSettings.sampler||"—"),1)])]),a("div",Zq,[a("span",{class:U(["model-status-pill","model-"+t.modelStatusKind])},[e[90]||(e[90]=a("span",{class:"model-status-dot"},null,-1)),ie(" "+_(t.modelStatusLabel),1)],2),a("span",Qq,_(t.deforumSettingsStatus||"Idle"),1)])]),_:1}),a("details",ej,[e[105]||(e[105]=a("summary",{class:"engine-advanced-panel__summary"},"Advanced sampling & resolution",-1)),a("div",tj,[a("div",ij,[e[91]||(e[91]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.sampler,onChange:e[9]||(e[9]=d=>t.onEngineSamplerChange(d.target.value))},[(p(!0),f(G,null,re(t.engineSamplerOptions,d=>(p(),f("option",{key:"engine-sampler-"+d,value:d},_(d),9,sj))),128))],40,nj)]),a("div",rj,[e[92]||(e[92]=a("div",{class:"framesync-subtitle"},"Scheduler",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.scheduler,onChange:e[10]||(e[10]=d=>t.onEngineSchedulerChange(d.target.value))},[(p(!0),f(G,null,re(t.engineSchedulerOptions,d=>(p(),f("option",{key:"engine-scheduler-"+d,value:d},_(d),9,aj))),128))],40,oj)]),a("div",lj,[e[93]||(e[93]=a("div",{class:"framesync-subtitle"},"Steps",-1)),a("input",{type:"number",class:"framesync-input",value:t.engineCurrentSteps,min:"1",max:"150",step:"1",disabled:t.lcmEngineEnabled,title:t.lcmEngineEnabled?"Steps are controlled by LCM Engine":"","data-testid":"engine-steps-input",onInput:e[11]||(e[11]=d=>t.onEngineStepsChange(d.target.value))},null,40,uj)]),a("div",dj,[e[94]||(e[94]=a("div",{class:"framesync-subtitle"},"CFG",-1)),a("input",{type:"number",class:"framesync-input",value:t.engineCurrentCfgScale,min:"0",max:"30",step:"0.1",onInput:e[12]||(e[12]=d=>t.onEngineCfgScaleChange(d.target.value))},null,40,cj)])]),a("div",hj,[a("div",mj,[e[96]||(e[96]=a("div",{class:"framesync-subtitle"},"Resolution",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.W+"x"+t.deforumSettings.H,onChange:e[13]||(e[13]=d=>t.onEngineResolutionChange(d.target.value))},[...e[95]||(e[95]=[a("option",{value:"512x512"},"512×512",-1),a("option",{value:"960x540"},"960×540",-1),a("option",{value:"1024x1024"},"1024×1024",-1)])],40,pj)]),a("div",fj,[e[98]||(e[98]=a("div",{class:"framesync-subtitle"},"Global FPS",-1)),a("select",{class:"framesync-select",value:t.deforumSettings.fps,onChange:e[14]||(e[14]=d=>t.setGlobalFps(+d.target.value))},[...e[97]||(e[97]=[a("option",{value:8},"8",-1),a("option",{value:12},"12",-1),a("option",{value:24},"24",-1),a("option",{value:30},"30",-1)])],40,gj)]),a("div",yj,[e[99]||(e[99]=a("div",{class:"framesync-subtitle"},"Model source",-1)),a("span",{class:U(["model-source-pill","src-"+(t.forge.modelsSource||"placeholder")])},_(t.forge.modelsSource||"unknown"),3)]),a("div",vj,[e[100]||(e[100]=a("div",{class:"framesync-subtitle"},"Status",-1)),a("div",bj,_(t.deforumSettingsStatus||"Idle"),1)])]),a("div",_j,[a("label",Sj,[a("input",{type:"checkbox",checked:t.lcmEngineEnabled,"data-testid":"lcm-engine-toggle",onChange:e[15]||(e[15]=d=>t.setLcmEngineEnabled(d.target.checked))},null,40,wj),e[101]||(e[101]=a("span",null,"LCM Engine",-1))]),t.lcmEngineEnabled?(p(),f("div",Mj,[a("div",xj,[e[102]||(e[102]=a("div",{class:"framesync-subtitle"},"LCM steps",-1)),a("input",{type:"number",class:"framesync-input","data-testid":"lcm-engine-steps",min:"1",max:"20",step:"1",value:t.lcmEngine.steps,onInput:e[16]||(e[16]=d=>t.onLcmEngineStepsChange(d.target.value))},null,40,Pj)]),a("div",Tj,[e[103]||(e[103]=a("div",{class:"framesync-subtitle"},"LCM LoRA tag",-1)),a("input",{type:"text",class:"framesync-input","data-testid":"lcm-engine-lora",value:t.lcmEngine.loraTag,onInput:e[17]||(e[17]=d=>t.onLcmEngineLoraChange(d.target.value))},null,40,Aj)])])):N("",!0)]),a("div",Cj,[a("button",{class:"framesync-button",disabled:t.forge.switching||!t.engineCurrentModelName,onClick:e[18]||(e[18]=d=>t.reapplyEngineModelDefaults())},"Optimize for model",8,Ej),a("div",kj,[e[104]||(e[104]=a("span",{class:"engine-seed-control__label"},"Seed",-1)),a("button",{type:"button",class:U(["chip chip--compact",{active:t.seedRandomEnabled}]),"data-testid":"seed-random-toggle",onClick:e[19]||(e[19]=d=>t.setSeedRandomEnabled(!t.seedRandomEnabled))}," Random ",2),t.seedRandomEnabled?(p(),f("span",Lj,"−1 · random each run")):(p(),f("input",{key:0,type:"number",class:"framesync-input engine-seed-control__input","data-testid":"seed-value-input",min:"0",max:"2147483647",step:"1",value:t.deforumSettings.seed,onInput:e[20]||(e[20]=d=>t.onDeforumSeedInput(d.target.value))},null,40,Rj))]),a("span",Dj,_(t.deforumSettings.W)+"×"+_(t.deforumSettings.H)+" @ "+_(t.deforumSettings.fps)+" fps",1),a("span",Ij,"Profile: "+_(t.engineOptimizedProfileLabel),1)])]),t.engineModelPickerOpen?(p(),f("div",{key:0,class:"engine-model-picker",onClick:e[23]||(e[23]=(...d)=>t.onEngineModelPickerBackdropClick&&t.onEngineModelPickerBackdropClick(...d))},[a("div",Fj,[a("div",Nj,[a("div",null,[e[106]||(e[106]=a("div",{class:"framesync-title"},[ie("Select "),a("span",{class:"framesync-accent"},"Checkpoint")],-1)),a("div",Oj,_(t.forge.modelsSource?"Source: "+(t.forge.modelsSource||"unknown"):"Loading checkpoints from Forge"),1)]),a("div",Uj,[a("button",{type:"button",class:"framesync-button",disabled:t.forge.loading,onClick:e[21]||(e[21]=d=>t.refreshForgeModels())},[t.forge.loading?(p(),f("span",Bj,[...e[107]||(e[107]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,Vj),a("button",{type:"button",class:"framesync-button",onClick:e[22]||(e[22]=d=>t.closeEngineModelPicker())},"Close")])]),a("div",zj,[(p(!0),f(G,null,re(t.engineModelFamilyTabs,d=>(p(),f("button",{key:"engine-model-tab-"+d.key,type:"button",class:U(["sub-pill",{active:t.engineModelPickerTab===d.key}]),onClick:m=>t.setEngineModelPickerTab(d.key)},[ie(_(d.label)+" ",1),a("span",Gj,_((t.groupedEngineModels[d.key]||[]).length),1)],10,$j))),128))]),t.forge.switching?(p(),f("div",Hj,"Switching checkpoint…")):t.forge.loading&&!t.forge.models.length?(p(),f("div",Wj,"Loading checkpoints…")):t.activeEngineModelList.length?(p(),f("div",jj,[(p(!0),f(G,null,re(t.activeEngineModelList,d=>(p(),f("button",{key:d.model_name||d.title,type:"button",class:U(["engine-model-picker__item",{active:t.normalizeModelName(d.model_name||d.title)===t.engineCurrentModelName}]),disabled:t.forge.switching,onClick:m=>t.selectEngineModel(d)},[a("span",Kj,_(d.title||d.model_name),1),a("span",Yj,_(d.model_name||d.title),1)],10,Xj))),128))])):(p(),f("div",qj," No checkpoints in this family. Try another tab or refresh the model list. "))])])):N("",!0)])])):t.currentSubTab.SETTINGS==="MIDI"?(p(),f("div",Jj,[a("div",Zj,[a("div",Qj,[e[112]||(e[112]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Controllers "),a("span",{class:"framesync-accent"},"/ MIDI")])],-1)),t.midi.supported?(p(),f("div",tX,[a("div",iX,[(p(!0),f(G,null,re(t.midi.devices,d=>(p(),f("button",{class:U(["framesync-button",{active:t.midi.selected===d.id}]),key:d.id,onClick:m=>t.midi.selected=d.id},_(d.name),11,nX))),128)),a("button",{class:"framesync-button",onClick:e[24]||(e[24]=d=>t.scanMidi())},"Rescan")]),a("div",sX,[e[108]||(e[108]=a("button",{class:"framesync-button"},"Learn mode",-1)),a("button",{class:"framesync-button",onClick:e[25]||(e[25]=(...d)=>t.addMidiMapping&&t.addMidiMapping(...d))},"+ Add Mapping"),a("button",rX,"Status: "+_(t.midiStatus),1)]),e[111]||(e[111]=a("div",{class:"framesync-subtitle",style:{"margin-top":"10px"}},[ie(" Quick targets: "),a("strong",null,"Modulation 1–6"),ie(" map to the LIVE drawer performance widgets. ")],-1)),a("div",oX,[a("table",aX,[e[110]||(e[110]=a("thead",null,[a("tr",null,[a("th",null,"Control"),a("th",null,"CC"),a("th",null,"Target"),a("th",null,"Actions")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(t.midi.mappings,(d,m)=>(p(),f("tr",{key:"midi"+m},[a("td",null,[K(a("input",{class:"framesync-input","onUpdate:modelValue":g=>d.control=g,onChange:e[26]||(e[26]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"100px",padding:"4px"}},null,40,lX),[[ae,d.control]])]),a("td",null,[K(a("input",{class:"framesync-input",type:"number","onUpdate:modelValue":g=>d.cc=g,onChange:e[27]||(e[27]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"60px",padding:"4px"}},null,40,uX),[[ae,d.cc,void 0,{number:!0}]])]),a("td",null,[K(a("select",{class:"framesync-select","onUpdate:modelValue":g=>d.key=g,onChange:e[28]||(e[28]=(...g)=>t.saveMidiMappings&&t.saveMidiMappings(...g)),style:{width:"120px",padding:"4px"}},[e[109]||(e[109]=a("option",{value:""},"None",-1)),a("optgroup",cX,[(p(),f(G,null,re(6,g=>a("option",{key:"modslot-"+g,value:"mod_slot_"+g},_("Modulation "+g),9,hX)),64))]),(p(!0),f(G,null,re(t.modulationTargets,g=>(p(),f("option",{key:"mopt"+g.key,value:g.key},_(g.label),9,mX))),128))],40,dX),[[Rt,d.key]])]),a("td",null,[a("button",{class:"framesync-button",onClick:g=>t.deleteMidiMapping(m),style:{padding:"4px 8px",cursor:"pointer"}},"Delete",8,pX)])]))),128))])])])])):(p(),f("div",eX,"WebMIDI not supported or not enabled."))])]),a("div",fX,[a("div",gX,[a("div",yX,[e[113]||(e[113]=a("div",{class:"framesync-title"},[ie("Parameter "),a("span",{class:"framesync-accent"},"Bindings")],-1)),a("div",vX,[a("button",{class:U(["framesync-button",{active:t.bindingLearnMode}]),onClick:e[29]||(e[29]=(...d)=>t.toggleBindingLearn&&t.toggleBindingLearn(...d))},_(t.bindingLearnMode?"Stop learn":"Learn"),3),a("button",{class:"framesync-button",onClick:e[30]||(e[30]=(...d)=>t.resetBindings&&t.resetBindings(...d))},"Defaults")])]),t.bindingLearnMode?(p(),f("div",bX," Learn mode active. Press a key or move a MIDI controller, then click a parameter to bind. ")):N("",!0),a("div",_X,[(p(!0),f(G,null,re(t.bindingGroups,d=>(p(),f("div",{class:"framesync-stack",key:d.label},[a("div",SX,_(d.label),1),a("div",wX,[a("table",MX,[e[114]||(e[114]=a("thead",null,[a("tr",{style:{color:"var(--text-dim)","border-bottom":"1px solid var(--border)"}},[a("th",{style:{"text-align":"left",padding:"4px 8px"}},"Parameter"),a("th",{style:{"text-align":"left",padding:"4px 8px"}},"Key"),a("th",{style:{"text-align":"left",padding:"4px 8px"}},"MIDI CC"),a("th",{style:{padding:"4px 8px"}},"Actions")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(d.items,m=>(p(),f("tr",{key:m.key,style:{"border-bottom":"1px solid var(--border)"}},[a("td",xX,_(m.label),1),a("td",PX,[t.getKeyBinding(m.key)?(p(),f("span",TX,[a("kbd",AX,_(t.getKeyBinding(m.key)),1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Clear key binding",onClick:g=>t.clearKeyBinding(m.key)},[ve(o,{name:"close"})],8,CX)])):(p(),f("span",EX,"—"))]),a("td",kX,[t.getMidiBinding(m.key)?(p(),f("span",RX,[a("span",LX,"CC "+_(t.getMidiBinding(m.key)),1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Clear MIDI binding",onClick:g=>t.clearMidiBinding(m.key)},[ve(o,{name:"close"})],8,DX)])):(p(),f("span",IX,"—"))]),a("td",FX,[t.bindingLearnMode?(p(),f("button",{key:0,class:"framesync-button framesync-button--compact",onClick:g=>t.bindingTargetKey=m.key},"Bind here",8,NX)):N("",!0)])]))),128))])])])]))),128))])])]),a("div",OX,[a("div",UX,[e[121]||(e[121]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Preset "),a("span",{class:"framesync-accent"},"Management")])],-1)),a("div",VX,[(p(!0),f(G,null,re(t.availablePresets,d=>(p(),f("button",{class:U(["framesync-button",{active:t.currentPreset===d}]),key:d,onClick:m=>t.loadPreset(d)},_(d),11,BX))),128)),a("button",{class:"framesync-button",disabled:t.presetsLoading,onClick:e[31]||(e[31]=(...d)=>t.refreshPresets&&t.refreshPresets(...d))},[t.presetsLoading?(p(),f("span",$X,[...e[115]||(e[115]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,zX)]),a("div",GX,[e[116]||(e[116]=a("div",{class:"framesync-subtitle"},"New preset name",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[32]||(e[32]=d=>t.newPresetName=d),placeholder:"my-preset"},null,512),[[ae,t.newPresetName]])]),a("div",HX,[a("button",{class:"framesync-button",onClick:e[33]||(e[33]=(...d)=>t.saveCurrentPreset&&t.saveCurrentPreset(...d))},"Save current as preset"),t.currentPreset?(p(),f("button",{key:0,class:"framesync-button framesync-button--danger",onClick:e[34]||(e[34]=d=>t.deletePreset(t.currentPreset))},"Delete "+_(t.currentPreset),1)):N("",!0)]),t.presetStatus?(p(),f("div",WX,_(t.presetStatus),1)):N("",!0),a("div",qX,[e[118]||(e[118]=a("div",{class:"framesync-title"},[ie("Shared "),a("span",{class:"framesync-accent"},"Presets")],-1)),a("button",{class:"framesync-button",disabled:t.sharedPresetsLoading,onClick:e[35]||(e[35]=(...d)=>t.refreshSharedPresets&&t.refreshSharedPresets(...d))},[t.sharedPresetsLoading?(p(),f("span",XX,[...e[117]||(e[117]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,jX)]),a("div",KX,[a("div",YX,[e[119]||(e[119]=a("div",{class:"framesync-subtitle"},"Share as",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[36]||(e[36]=d=>t.sharedPresetName=d),placeholder:"shared-preset-name"},null,512),[[ae,t.sharedPresetName]])]),a("div",JX,[e[120]||(e[120]=a("div",{class:"framesync-subtitle"},"Your name",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[37]||(e[37]=d=>t.collab.userName=d),placeholder:"Performer",onChange:e[38]||(e[38]=(...d)=>t.saveCollabUserName&&t.saveCollabUserName(...d))},null,544),[[ae,t.collab.userName]])])]),a("div",ZX,[a("button",{class:"framesync-button",onClick:e[39]||(e[39]=(...d)=>t.shareCurrentPreset&&t.shareCurrentPreset(...d))},"Share current state")]),t.sharedPresets.length?(p(),f("ul",QX,[(p(!0),f(G,null,re(t.sharedPresets,d=>(p(),f("li",{key:d.name,style:{"margin-bottom":"6px",display:"flex","flex-wrap":"wrap",gap:"6px","align-items":"center"}},[a("strong",null,_(d.name),1),a("span",eK,"by "+_(d.sharedBy),1),a("button",{class:"framesync-button framesync-button--compact",onClick:m=>t.loadSharedPreset(d.name)},"Load",8,tK),a("button",{class:"framesync-button framesync-button--danger framesync-button--compact",onClick:m=>t.deleteSharedPreset(d.name)},"Delete",8,iK)]))),128))])):(p(),f("div",nK,"No shared presets yet.")),t.sharedPresetsStatus?(p(),f("div",sK,_(t.sharedPresetsStatus),1)):N("",!0)])])])):t.currentSubTab.SETTINGS==="GPUS"?(p(),f("div",rK,[a("div",oK,[a("div",aK,[a("div",lK,[e[123]||(e[123]=a("div",{class:"framesync-title"},[ie("Service "),a("span",{class:"framesync-accent"},"Health")],-1)),a("button",{class:"framesync-button framesync-button--compact",onClick:e[40]||(e[40]=(...d)=>t.refreshServiceHealth&&t.refreshServiceHealth(...d)),disabled:t.serviceHealth.loading},[t.serviceHealth.loading?(p(),f("span",dK,[...e[122]||(e[122]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,uK)]),a("div",cK,[a("div",hK,[a("div",mK,[e[124]||(e[124]=a("strong",null,"Web",-1)),a("span",{class:U(["gpu-status-pill",t.serviceHealth.web&&t.serviceHealth.web.ok?"st-healthy":"st-unhealthy"])},_(t.serviceHealth.web&&t.serviceHealth.web.ok?"healthy":"down"),3)]),e[125]||(e[125]=a("div",{class:"service-health-card__meta"},[ie("HTTP "),a("code",null,"/health")],-1))]),a("div",pK,[a("div",fK,[e[126]||(e[126]=a("strong",null,"HLS",-1)),a("span",{class:U(["gpu-status-pill",t.serviceHealth.hls&&t.serviceHealth.hls.updated?t.serviceHealth.hls.ageMs!=null&&t.serviceHealth.hls.ageMs<15e3?"st-healthy":t.serviceHealth.hls.ageMs!=null&&t.serviceHealth.hls.ageMs<6e4?"st-unknown":"st-unhealthy":"st-unknown"])},_(t.serviceHealth.hls&&t.serviceHealth.hls.updated?"ok":"unknown"),3)]),a("div",gK,[e[127]||(e[127]=ie(" Playlist updated: ",-1)),t.serviceHealth.hls&&t.serviceHealth.hls.updated?(p(),f("span",yK,_(Math.round((t.serviceHealth.hls.ageMs||0)/1e3))+"s ago ",1)):(p(),f("span",vK,"—"))])]),a("div",bK,[a("div",_K,[e[128]||(e[128]=a("strong",null,"SD-Forge",-1)),a("span",{class:U(["gpu-status-pill",t.apiHealth.sdForge&&t.apiHealth.sdForge.available?"st-healthy":"st-unhealthy"])},_(t.apiHealth.sdForge&&t.apiHealth.sdForge.available?"available":"offline"),3)]),a("div",SK,"Last checked: "+_(t.apiHealth.sdForge&&t.apiHealth.sdForge.lastChecked?t.formatDate(t.apiHealth.sdForge.lastChecked):"—"),1)]),a("div",wK,[a("div",MK,[e[129]||(e[129]=a("strong",null,"Mediator",-1)),a("span",{class:U(["gpu-status-pill",t.mediatorHealthSummary.ok?"st-healthy":"st-unhealthy"])},_(t.mediatorHealthSummary.label),3)]),a("div",xK,[t.sdForgeGpuNodes.length?(p(),f("span",PK,_(t.sdForgeGpuNodes.length)+" forge instance(s)",1)):t.infrastructure.mediator?(p(),f("span",TK,[a("code",null,_(t.infrastructure.mediator.address),1)])):(p(),f("span",AK,"—"))])]),a("div",CK,[a("div",EK,[e[130]||(e[130]=a("strong",null,"Streamer",-1)),a("span",{class:U(["gpu-status-pill",t.serviceHealth.stream&&t.serviceHealth.stream.status==="running"?"st-healthy":(t.serviceHealth.stream&&t.serviceHealth.stream.status==="stopped","st-unknown")])},_(t.serviceHealth.stream?t.serviceHealth.stream.status:"unknown"),3)]),e[131]||(e[131]=a("div",{class:"service-health-card__meta"},[a("code",null,"/api/stream/status")],-1))])]),a("div",kK," Last refresh: "+_(t.serviceHealth.lastChecked?t.formatDate(t.serviceHealth.lastChecked):"—"),1)]),a("div",RK,[a("div",LK,[e[133]||(e[133]=a("div",{class:"framesync-title"},[ie("Stack "),a("span",{class:"framesync-accent"},"Services")],-1)),a("button",{class:"framesync-button framesync-button--compact",onClick:e[41]||(e[41]=d=>t.refreshGpuPool(!0)),disabled:t.infrastructure.loading||t.gpuPool.loading},[t.infrastructure.loading||t.gpuPool.loading?(p(),f("span",IK,[...e[132]||(e[132]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh")],64))],8,DK)]),a("div",FK,[e[139]||(e[139]=a("div",{class:"framesync-subtitle"},"Mediator per SD-Forge instance",-1)),t.gpuPool.loading&&!t.sdForgeGpuNodes.length?(p(),f("div",NK,"Loading forge mediators…")):t.sdForgeGpuNodes.length?(p(),f("div",OK,[(p(!0),f(G,null,re(t.sdForgeGpuNodes,d=>(p(),f("div",{key:"infra-mediator-"+d.id,class:"infra-mediator-card","data-testid":d.id===t.sdForgeGpuNodes[0].id?"infra-mediator-card":void 0},[a("div",VK,[a("strong",null,_(d.name),1),d.mediator?(p(),f("span",{key:0,class:U(["gpu-status-pill",t.mediatorStatusClass(d.mediator.deforumationStatus)])}," Deforumation "+_(d.mediator.deforumationStatus),3)):N("",!0),d.mediator?(p(),f("span",{key:1,class:U(["gpu-status-pill",t.mediatorStatusClass(d.mediator.deforumStatus)])}," Deforum "+_(d.mediator.deforumStatus),3)):N("",!0)]),d.mediator?(p(),f("div",BK,[a("span",null,[e[134]||(e[134]=ie("Host ",-1)),a("code",null,_(d.mediator.host),1)]),a("span",null,[e[135]||(e[135]=ie("Deforumation ",-1)),a("code",null,_(d.mediator.deforumationWsUrl),1)]),a("span",null,[e[136]||(e[136]=ie("Deforum bridge ",-1)),a("code",null,_(d.mediator.deforumWsUrl),1)])])):(p(),f("div",zK,"No mediator settings — disable node and Edit to configure."))],8,UK))),128))])):t.infrastructure.mediator?(p(),f("div",$K,[a("div",GK,[a("span",{class:U(["gpu-status-pill",t.infrastructure.mediator.status==="healthy"?"st-healthy":"st-unhealthy"])},_(t.infrastructure.mediator.status),3),a("strong",null,_(t.infrastructure.mediator.address),1),a("span",HK,_(t.infrastructure.mediator.source),1)]),a("div",WK,[a("span",null,[e[137]||(e[137]=ie("Deforumation ",-1)),a("code",null,_(t.infrastructure.mediator.wsUrl),1)]),a("span",null,[e[138]||(e[138]=ie("Deforum ",-1)),a("code",null,_(t.infrastructure.mediator.deforumWsUrl),1),ie(" · "+_(t.infrastructure.mediator.deforumStatus),1)])])])):(p(),f("div",qK,"No SD-Forge instances with mediator configuration.")),e[140]||(e[140]=a("p",{class:"infra-panel__hint"},[ie(" Each forge host runs its own mediator (e.g. "),a("code",null,"vimage5"),ie(" → "),a("code",null,"vimage5:8765"),ie(" / "),a("code",null,":8766"),ie("). Edit an instance (disable first) to change host and ports, or use "),a("strong",null,"Check ports"),ie(" in the forge editor. ")],-1))]),a("div",jK,[e[142]||(e[142]=a("div",{class:"framesync-subtitle"},"FFmpeg transcoder nodes",-1)),t.infrastructure.loading&&!t.infrastructure.transcoders.length?(p(),f("div",XK,"Loading transcoders…")):t.infrastructure.transcoders.length?(p(),f("div",YK,[a("table",JK,[e[141]||(e[141]=a("thead",null,[a("tr",null,[a("th",null,"Name"),a("th",null,"Address"),a("th",null,"CPU"),a("th",null,"Jobs"),a("th",null,"Status")])],-1)),a("tbody",null,[(p(!0),f(G,null,re(t.infrastructure.transcoders,d=>(p(),f("tr",{key:d.id},[a("td",null,[a("strong",null,_(d.name),1)]),a("td",null,[a("code",ZK,_(d.address),1),d.rtmpTarget&&d.rtmpTarget!==d.address?(p(),f("span",QK,_(d.rtmpTarget),1)):N("",!0)]),a("td",null,_(d.cpuLabel),1),a("td",null,_(d.jobsLabel),1),a("td",null,[a("span",{class:U(["gpu-status-pill","st-"+(d.status==="streaming"?"healthy":d.status==="idle"?"unknown":"unhealthy")])},_(d.status),3)])]))),128))])])])):(p(),f("div",KK,"No transcoder nodes configured.")),e[143]||(e[143]=a("p",{class:"infra-panel__hint"},[ie(" Configure extra nodes with "),a("code",null,"TRANSCODER_NODES"),ie(" (format: "),a("code",null,"name|host:port|rtmp://target|statusUrl"),ie("). Optional "),a("code",null,"statusUrl"),ie(" returns JSON "),a("code",null,'{ "cpu": 12.5, "activeJobs": 1 }'),ie(". ")],-1))])]),a("div",eY,[a("div",tY,[e[145]||(e[145]=a("div",{class:"framesync-title"},[ie("GPU "),a("span",{class:"framesync-accent"},"Pool")],-1)),a("label",iY,[K(a("input",{type:"checkbox","onUpdate:modelValue":e[42]||(e[42]=d=>t.gpuPool.enabled=d),onChange:e[43]||(e[43]=(...d)=>t.saveGpuPoolSettings&&t.saveGpuPoolSettings(...d))},null,544),[[Ci,t.gpuPool.enabled]]),e[144]||(e[144]=ie(" Load balancing ",-1))])]),a("div",nY,[a("div",sY,[e[147]||(e[147]=a("div",{class:"framesync-subtitle"},"Strategy",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[44]||(e[44]=d=>t.gpuPool.strategy=d),onChange:e[45]||(e[45]=(...d)=>t.saveGpuPoolSettings&&t.saveGpuPoolSettings(...d)),disabled:t.gpuPool.loading},[...e[146]||(e[146]=[a("option",{value:"round_robin"},"Round robin",-1),a("option",{value:"least_busy"},"Least busy",-1),a("option",{value:"priority"},"Priority",-1),a("option",{value:"random"},"Random",-1)])],40,rY),[[Rt,t.gpuPool.strategy]])]),a("div",oY,[e[148]||(e[148]=a("div",{class:"framesync-subtitle"},"Healthy / total",-1)),a("div",aY,_(t.gpuPool.healthyNodes)+" / "+_(t.gpuPool.nodes.length),1)]),a("div",lY,[a("button",{class:"framesync-button",onClick:e[46]||(e[46]=d=>t.refreshGpuPool(!0)),disabled:t.gpuPool.loading},[t.gpuPool.loading?(p(),f("span",dY,[...e[149]||(e[149]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh stats",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh stats")],64))],8,uY)])]),a("div",cY,[a("div",hY,[e[151]||(e[151]=a("div",{class:"framesync-subtitle"},"Default SD-Forge model",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[47]||(e[47]=d=>t.gpuPool.defaultForgeModel=d),disabled:t.gpuPool.loading||t.forge.switching||!t.forge.models||!t.forge.models.length},[e[150]||(e[150]=a("option",{value:""},"(no default)",-1)),(p(!0),f(G,null,re(t.forge.models||[],d=>(p(),f("option",{key:"gpu-default-model-"+(d.title||d.model_name),value:d.title||d.model_name},_(d.title||d.model_name),9,pY))),128))],8,mY),[[Rt,t.gpuPool.defaultForgeModel]])]),a("div",fY,[a("button",{class:"framesync-button",onClick:e[48]||(e[48]=d=>t.saveDefaultForgeModel({preload:!0})),disabled:t.gpuPool.loading||t.forge.switching||!t.gpuPool.defaultForgeModel,title:"Switch model on healthy SD-Forge nodes now so new jobs start instantly"}," Save + preload ",8,gY)])]),t.gpuPool.defaultForgeModelStatus?(p(),f("div",yY,_(t.gpuPool.defaultForgeModelStatus),1)):N("",!0),e[157]||(e[157]=a("p",{style:{"font-size":"11px",color:"var(--text-dim)",margin:"12px 0 0"}},[ie(" Add SD-Forge (A1111 API), ComfyUI, or Ollama instances. Disable a node to edit or remove it. Generation load balancing uses enabled "),a("strong",null,"SD-Forge"),ie(" nodes for img2img/txt2img/Deforum, while the story generator uses configured "),a("strong",null,"Ollama"),ie(" nodes. ")],-1)),a("div",vY,[e[154]||(e[154]=a("div",{class:"framesync-subtitle"},"Add instance (saved disabled — enable after editing)",-1)),a("div",bY,[K(a("input",{class:"framesync-input","onUpdate:modelValue":e[49]||(e[49]=d=>t.gpuPool.draft.url=d),placeholder:"http://host:7860, :8188, or :11434",disabled:t.gpuPool.loading},null,8,_Y),[[ae,t.gpuPool.draft.url]]),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[50]||(e[50]=d=>t.gpuPool.draft.name=d),placeholder:"Name",disabled:t.gpuPool.loading},null,8,SY),[[ae,t.gpuPool.draft.name]]),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[51]||(e[51]=d=>t.gpuPool.draft.backend=d),disabled:t.gpuPool.loading},[...e[152]||(e[152]=[a("option",{value:"sd-forge"},"SD-Forge",-1),a("option",{value:"comfyui"},"ComfyUI",-1),a("option",{value:"ollama"},"Ollama",-1)])],8,wY),[[Rt,t.gpuPool.draft.backend]])]),t.gpuPool.draft.backend==="ollama"?(p(),f("div",MY,[K(a("select",{class:"framesync-select","onUpdate:modelValue":e[52]||(e[52]=d=>t.gpuPool.draft.model=d),disabled:t.gpuPool.loading,style:{"min-width":"220px"}},[e[153]||(e[153]=a("option",{value:""},"Select Ollama model…",-1)),(p(!0),f(G,null,re(t.ollamaModelOptions(t.gpuPool.draft.url),d=>(p(),f("option",{key:"draft-"+d,value:d},_(d),9,PY))),128))],8,xY),[[Rt,t.gpuPool.draft.model]]),a("button",{class:"framesync-button",onClick:e[53]||(e[53]=(...d)=>t.refreshGpuDraftModels&&t.refreshGpuDraftModels(...d)),disabled:t.gpuPool.loading||!t.gpuPool.draft.url},"Load models",8,TY)])):N("",!0),a("div",AY,[a("button",{class:"framesync-button",onClick:e[54]||(e[54]=(...d)=>t.addGpuNode&&t.addGpuNode(...d)),disabled:t.gpuPool.loading||!t.gpuPool.draft.url},"+ Add instance",8,CY)])]),t.gpuPool.nodes.length?(p(),f("div",EY,[(p(!0),f(G,null,re(t.gpuPool.nodes,d=>(p(),f("div",{key:d.id,class:U(["gpu-node-card",{"gpu-row-disabled":!d.enabled}])},[a("div",kY,[a("div",RY,[a("span",{class:U(["gpu-status-pill","st-"+(d.enabled?d.status:"disabled")])},_(d.enabled?d.status:"disabled"),3),t.gpuPool.editId===d.id?(p(),f(G,{key:0},[K(a("input",{class:"framesync-input","onUpdate:modelValue":e[55]||(e[55]=m=>t.gpuPool.editDraft.name=m),style:{"font-size":"11px",width:"120px"}},null,512),[[ae,t.gpuPool.editDraft.name]]),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[56]||(e[56]=m=>t.gpuPool.editDraft.url=m),style:{"font-size":"10px",flex:"1","min-width":"160px"}},null,512),[[ae,t.gpuPool.editDraft.url]]),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[57]||(e[57]=m=>t.gpuPool.editDraft.backend=m),style:{"font-size":"11px",width:"100px"}},[...e[155]||(e[155]=[a("option",{value:"sd-forge"},"SD-Forge",-1),a("option",{value:"comfyui"},"ComfyUI",-1),a("option",{value:"ollama"},"Ollama",-1)])],512),[[Rt,t.gpuPool.editDraft.backend]])],64)):(p(),f(G,{key:1},[a("strong",LY,_(d.name),1),a("span",DY,_(d.url),1),a("span",IY,_(d.backend),1),d.backend==="ollama"&&(d.model||d.currentModel)?(p(),f("span",FY,"model: "+_(d.model||d.currentModel),1)):N("",!0),d.backend==="sd-forge"&&d.mediator?(p(),f("span",NY," mediator: "+_(d.mediator.host)+" · "+_(d.mediator.deforumStatus)+"/"+_(d.mediator.deforumationStatus),1)):N("",!0)],64))]),a("div",OY,[a("span",UY,_(d.model||d.currentModel||"—"),1),a("span",VY,_(t.formatGpuMemory(d)),1),a("span",BY,_(d.gpuUtilization!=null?d.gpuUtilization+"%":"—"),1),a("span",zY,_(d.activeJobs)+" jobs",1),d.backend==="sd-forge"?(p(),f("span",$Y," q "+_(d.queueRunning!=null?d.queueRunning:"—")+"/"+_(d.queuePending!=null?d.queuePending:"—"),1)):N("",!0),d.backend==="sd-forge"?(p(),f("span",GY,_(d.progress!=null?Math.round(d.progress*100)+"%":"—"),1)):N("",!0)]),a("div",HY,[d.enabled?(p(),f("button",{key:0,class:"framesync-button framesync-button--compact",onClick:m=>t.disableGpuNode(d)},"Disable",8,WY)):(p(),f(G,{key:1},[a("button",{class:"framesync-button framesync-button--compact",onClick:m=>t.enableGpuNode(d)},"Enable",8,qY),t.gpuPool.editId!==d.id?(p(),f("button",{key:0,class:"framesync-button framesync-button--compact",onClick:m=>t.startEditGpuNode(d)},"Edit",8,jY)):(p(),f("button",{key:1,class:"framesync-button framesync-button--compact",onClick:m=>t.saveGpuNodeEdit(d)},"Save",8,XY)),a("button",{class:"framesync-button framesync-button--danger framesync-button--compact",onClick:m=>t.removeGpuNode(d)},"Remove",8,KY)],64)),a("button",{class:"framesync-button framesync-button--compact",onClick:m=>t.gpuPool.expandedLog=t.gpuPool.expandedLog===d.id?null:d.id},_(t.gpuPool.expandedLog===d.id?"Hide log":"Log")+_(d.requestLog&&d.requestLog.length?" ("+d.requestLog.length+")":""),9,YY)])]),t.gpuPool.editId===d.id&&t.gpuPool.editDraft.backend==="ollama"?(p(),f("div",JY,[K(a("select",{class:"framesync-select","onUpdate:modelValue":e[58]||(e[58]=m=>t.gpuPool.editDraft.model=m),style:{"min-width":"220px"}},[e[156]||(e[156]=a("option",{value:""},"Select Ollama model…",-1)),(p(!0),f(G,null,re(t.ollamaModelOptions(t.gpuPool.editDraft.url),m=>(p(),f("option",{key:"edit-"+d.id+"-"+m,value:m},_(m),9,ZY))),128))],512),[[Rt,t.gpuPool.editDraft.model]]),a("button",{class:"framesync-button framesync-button--compact",onClick:e[59]||(e[59]=(...m)=>t.refreshGpuEditModels&&t.refreshGpuEditModels(...m))},"Load models")])):N("",!0),t.gpuPool.expandedLog===d.id?(p(),f("div",QY,[!d.requestLog||!d.requestLog.length?(p(),f("div",eJ,"No requests logged yet.")):N("",!0),(p(!0),f(G,null,re(d.requestLog||[],(m,g)=>(p(),f("div",{key:g,class:U(["gpu-node-log__entry",{"gpu-node-log__entry--error":!m.ok}])},[a("span",{class:U(["gpu-node-log__badge","gpu-node-log__badge--"+m.type])},_(m.type),3),a("span",tJ,_(m.path),1),a("span",{class:"gpu-node-log__status",style:Pt(m.ok?"color:var(--live-text)":"color:var(--error)")},_(m.statusCode||(m.ok?"ok":"err")),5),a("span",iJ,_(m.durationMs)+"ms",1),m.error?(p(),f("span",nJ,_(m.error),1)):N("",!0),a("span",sJ,_(new Date(m.ts).toLocaleTimeString()),1)],2))),128))])):N("",!0)],2))),128))])):(p(),f("div",rJ,"No GPU instances configured.")),t.gpuPool.status?(p(),f("div",oJ,_(t.gpuPool.status),1)):N("",!0)])]),t.gpuPool.forgeModal.open?(p(),f("div",{key:0,class:"gpu-forge-modal",onClick:e[77]||(e[77]=(...d)=>t.onGpuForgeModalBackdropClick&&t.onGpuForgeModalBackdropClick(...d))},[a("div",aJ,[a("div",lJ,[a("div",null,[e[158]||(e[158]=a("div",{class:"framesync-title"},[ie("Edit "),a("span",{class:"framesync-accent"},"SD-Forge"),ie(" instance")],-1)),a("div",uJ,_(t.gpuPool.forgeModal.nodeName||"Forge node"),1)]),a("button",{class:"framesync-button",onClick:e[60]||(e[60]=d=>t.closeGpuForgeModal())},"Close")]),a("div",dJ,[a("div",cJ,[e[159]||(e[159]=a("div",{class:"framesync-subtitle"},"Name",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[61]||(e[61]=d=>t.gpuPool.forgeModal.nodeName=d),disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,hJ),[[ae,t.gpuPool.forgeModal.nodeName,void 0,{trim:!0}]])]),a("div",mJ,[e[160]||(e[160]=a("div",{class:"framesync-subtitle"},"URL",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[62]||(e[62]=d=>t.gpuPool.forgeModal.url=d),disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,pJ),[[ae,t.gpuPool.forgeModal.url,void 0,{trim:!0}]])]),a("div",fJ,[e[161]||(e[161]=a("div",{class:"framesync-subtitle"},"Priority",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[63]||(e[63]=d=>t.gpuPool.forgeModal.priority=d),min:"1",max:"99",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying},null,8,gJ),[[ae,t.gpuPool.forgeModal.priority,void 0,{number:!0}]])])]),a("div",yJ,[a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.loading,onClick:e[64]||(e[64]=d=>t.refreshGpuForgeModalOptions())},[t.gpuPool.forgeModal.loading?(p(),f("span",bJ,[...e[162]||(e[162]=[a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1),a("span",null,"Refresh Forge",-1),a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1)])])):(p(),f(G,{key:1},[ie("Refresh Forge")],64))],8,vJ),a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.saving,onClick:e[65]||(e[65]=d=>t.applyGpuForgeModalOptions())},"Apply options",8,_J),a("button",{class:"framesync-button",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying,onClick:e[66]||(e[66]=d=>t.saveGpuForgeModal())},"Save instance",8,SJ)]),a("div",wJ,[a("div",MJ,[e[163]||(e[163]=a("div",{class:"framesync-subtitle"},"Current model",-1)),a("code",null,_(t.gpuPool.forgeModal.currentModel||"—"),1)]),a("div",xJ,[e[164]||(e[164]=a("div",{class:"framesync-subtitle"},"Endpoint",-1)),a("code",PJ,_(t.gpuPool.forgeModal.url||"—"),1)])]),a("div",TJ,[e[165]||(e[165]=ie(" This is the per-instance Forge configuration for ",-1)),a("strong",null,_(t.gpuPool.forgeModal.nodeName||"this node"),1),e[166]||(e[166]=ie(". Saved values reopen here next time, and ",-1)),e[167]||(e[167]=a("strong",null,"Apply options",-1)),e[168]||(e[168]=ie(" pushes them to this Forge instance only. ",-1))]),a("div",AJ,[e[174]||(e[174]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},[ie("Mediator "),a("span",{class:"framesync-accent"},"(Deforum)")],-1)),a("p",CJ,[e[169]||(e[169]=ie(" Co-located on the forge host — defaults to instance name (",-1)),a("code",null,_(t.gpuPool.forgeModal.nodeName||"hostname"),1),e[170]||(e[170]=ie("). ",-1))]),a("div",EJ,[a("div",kJ,[e[171]||(e[171]=a("div",{class:"framesync-subtitle"},"Host",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[67]||(e[67]=d=>t.gpuPool.forgeModal.mediator.host=d),placeholder:"vimage5",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,RJ),[[ae,t.gpuPool.forgeModal.mediator.host,void 0,{trim:!0}]])]),a("div",LJ,[e[172]||(e[172]=a("div",{class:"framesync-subtitle"},"Deforum port",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[68]||(e[68]=d=>t.gpuPool.forgeModal.mediator.deforumPort=d),min:"1",max:"65535",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,DJ),[[ae,t.gpuPool.forgeModal.mediator.deforumPort,void 0,{number:!0}]])]),a("div",IJ,[e[173]||(e[173]=a("div",{class:"framesync-subtitle"},"Deforumation port",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[69]||(e[69]=d=>t.gpuPool.forgeModal.mediator.deforumationPort=d),min:"1",max:"65535",disabled:t.gpuPool.forgeModal.saving||t.gpuPool.forgeModal.applying||t.gpuPool.forgeModal.mediator.probing},null,8,FJ),[[ae,t.gpuPool.forgeModal.mediator.deforumationPort,void 0,{number:!0}]])])]),a("div",NJ,[a("button",{class:"framesync-button framesync-button--compact",disabled:t.gpuPool.forgeModal.mediator.probing||!t.gpuPool.forgeModal.nodeId,onClick:e[70]||(e[70]=d=>t.probeGpuForgeMediatorPorts())},_(t.gpuPool.forgeModal.mediator.probing?"Checking…":"Check ports"),9,OJ),t.gpuPool.forgeModal.mediator.deforumStatus?(p(),f("span",{key:0,class:U(["gpu-status-pill",t.mediatorStatusClass(t.gpuPool.forgeModal.mediator.deforumStatus)])}," Deforum "+_(t.gpuPool.forgeModal.mediator.deforumPort)+": "+_(t.gpuPool.forgeModal.mediator.deforumStatus),3)):N("",!0),t.gpuPool.forgeModal.mediator.deforumationStatus?(p(),f("span",{key:1,class:U(["gpu-status-pill",t.mediatorStatusClass(t.gpuPool.forgeModal.mediator.deforumationStatus)])}," Deforumation "+_(t.gpuPool.forgeModal.mediator.deforumationPort)+": "+_(t.gpuPool.forgeModal.mediator.deforumationStatus),3)):N("",!0)])]),a("div",UJ,[a("div",VJ,[e[176]||(e[176]=a("div",{class:"framesync-subtitle"},"Sampler",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[71]||(e[71]=d=>t.gpuPool.forgeModal.options.sampler_name=d)},[e[175]||(e[175]=a("option",{value:""},"Auto",-1)),(p(!0),f(G,null,re(t.engineSamplerOptions,d=>(p(),f("option",{key:"gpu-forge-sampler-"+d,value:d},_(d),9,BJ))),128))],512),[[Rt,t.gpuPool.forgeModal.options.sampler_name]])]),a("div",zJ,[e[178]||(e[178]=a("div",{class:"framesync-subtitle"},"Scheduler",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[72]||(e[72]=d=>t.gpuPool.forgeModal.options.scheduler=d)},[e[177]||(e[177]=a("option",{value:""},"Auto",-1)),(p(!0),f(G,null,re(t.engineSchedulerOptions,d=>(p(),f("option",{key:"gpu-forge-sch-"+d,value:d},_(d),9,$J))),128))],512),[[Rt,t.gpuPool.forgeModal.options.scheduler]])])]),a("div",GJ,[a("div",HJ,[e[180]||(e[180]=a("div",{class:"framesync-subtitle"},"VAE",-1)),K(a("select",{class:"framesync-select","onUpdate:modelValue":e[73]||(e[73]=d=>t.gpuPool.forgeModal.options.sd_vae=d)},[e[179]||(e[179]=a("option",{value:""},"Auto",-1)),(p(!0),f(G,null,re(t.gpuPool.forgeModal.vaeList,d=>(p(),f("option",{key:"gpu-forge-vae-"+d,value:d},_(d),9,WJ))),128))],512),[[Rt,t.gpuPool.forgeModal.options.sd_vae]])])]),a("div",qJ,[a("div",jJ,[e[181]||(e[181]=a("div",{class:"framesync-subtitle"},"Width",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[74]||(e[74]=d=>t.gpuPool.forgeModal.options.width=d),min:"64",max:"4096",step:"64"},null,512),[[ae,t.gpuPool.forgeModal.options.width,void 0,{number:!0}]])]),a("div",XJ,[e[182]||(e[182]=a("div",{class:"framesync-subtitle"},"Height",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[75]||(e[75]=d=>t.gpuPool.forgeModal.options.height=d),min:"64",max:"4096",step:"64"},null,512),[[ae,t.gpuPool.forgeModal.options.height,void 0,{number:!0}]])]),a("div",KJ,[e[183]||(e[183]=a("div",{class:"framesync-subtitle"},"Batch",-1)),K(a("input",{type:"number",class:"framesync-input","onUpdate:modelValue":e[76]||(e[76]=d=>t.gpuPool.forgeModal.options.batch_size=d),min:"1",max:"16"},null,512),[[ae,t.gpuPool.forgeModal.options.batch_size,void 0,{number:!0}]])])]),t.gpuPool.forgeModal.modelInfo?(p(),f("div",YJ,[e[184]||(e[184]=a("div",{class:"framesync-subtitle"},"Model metadata",-1)),a("div",JJ,[(p(!0),f(G,null,re(t.gpuPool.forgeModal.modelInfo,(d,m)=>(p(),f("span",{key:"gpu-forge-meta-"+m,class:"chip"},_(m)+": "+_(d),1))),128))])])):N("",!0),t.gpuPool.forgeModal.status?(p(),f("div",ZJ,_(t.gpuPool.forgeModal.status),1)):N("",!0)])])):N("",!0)])):t.currentSubTab.SETTINGS==="STYLES"?(p(),f("div",QJ,[ve(u,{app:i.app},null,8,["app"])])):t.currentSubTab.SETTINGS==="PLUGINS"?(p(),f("div",eZ,[a("div",tZ,[a("div",iZ,[a("div",nZ,[e[185]||(e[185]=a("div",{class:"framesync-title"},[ie("Plugins "),a("span",{class:"framesync-accent"},"Registry")],-1)),a("button",{type:"button",class:"framesync-button",onClick:e[78]||(e[78]=(...d)=>t.refreshPlugins&&t.refreshPlugins(...d))},"Refresh")]),e[186]||(e[186]=a("p",{class:"framesync-subtitle settings-plugins-tab__intro"}," Server-side animation and modulation plugins available to the live engine. ",-1)),t.pluginsRegistry.length?(p(),f("ul",sZ,[(p(!0),f(G,null,re(t.pluginsRegistry,d=>(p(),f("li",{key:d.id||d.name},[ie(_(d.name||d.id),1),d.description?(p(),f("span",rZ," — "+_(d.description),1)):N("",!0)]))),128))])):(p(),f("p",oZ,"No plugins reported — try Refresh."))])])])):t.currentSubTab.SETTINGS==="COLLAB"?(p(),f("div",aZ,[a("div",lZ,[a("div",uZ,[a("div",dZ,[e[187]||(e[187]=a("div",{class:"framesync-title"},[a("span",{class:"framesync-accent"},"Collaboration")],-1)),a("button",{class:U(["framesync-button",{"framesync-button--live":t.collabEnabled}]),onClick:e[79]||(e[79]=(...d)=>t.toggleCollaboration&&t.toggleCollaboration(...d))},_(t.collabEnabled?"WS "+t.wsStatus:"WS offline"),3)]),t.collabEnabled?(p(),f(G,{key:1},[a("div",hZ,[a("div",mZ,[e[188]||(e[188]=a("div",{class:"framesync-subtitle"},"Display name",-1)),K(a("input",{class:"framesync-input","onUpdate:modelValue":e[80]||(e[80]=d=>t.collab.userName=d),onChange:e[81]||(e[81]=d=>{t.saveCollabUserName,t.collabIdentify()})},null,544),[[ae,t.collab.userName]])]),a("div",pZ,[e[189]||(e[189]=a("div",{class:"framesync-subtitle"},"Your session ID",-1)),a("input",{class:"framesync-input",value:t.collab.userId||"—",readonly:""},null,8,fZ)])]),a("div",gZ,"Connected users ("+_(t.collab.users.length)+")",1),t.collab.users.length?(p(),f("ul",yZ,[(p(!0),f(G,null,re(t.collab.users,d=>(p(),f("li",{key:d.id},[ie(_(d.name)+" ",1),d.lockedParams&&d.lockedParams.length?(p(),f("span",vZ," — locks: "+_(d.lockedParams.join(", ")),1)):N("",!0)]))),128))])):(p(),f("div",bZ,"Only you (open another browser tab to test multi-user).")),e[190]||(e[190]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},"Session recording",-1)),a("div",_Z,[a("button",{class:U(["framesync-button",{"framesync-button--live":t.collab.recording}]),onClick:e[82]||(e[82]=(...d)=>t.toggleSessionRecording&&t.toggleSessionRecording(...d))},_(t.collab.recording?"Stop recording":"Start recording"),3),a("button",{class:"framesync-button",onClick:e[83]||(e[83]=(...d)=>t.listSessionRecordings&&t.listSessionRecordings(...d))},"List recordings")]),t.collab.recordings.length?(p(),f("ul",SZ,[(p(!0),f(G,null,re(t.collab.recordings,d=>(p(),f("li",{key:d.filename,style:{display:"flex",gap:"8px","align-items":"center"}},[ie(_(d.filename)+" ",1),a("button",{class:"framesync-button framesync-button--compact",onClick:m=>t.playbackSessionRecording(d.filename)},"Play",8,wZ)]))),128))])):N("",!0),t.collab.status?(p(),f("div",MZ,_(t.collab.status),1)):N("",!0),e[191]||(e[191]=a("div",{class:"framesync-subtitle",style:{"margin-top":"14px"}},"Parameter locks (click param label in LIVE drawer)",-1)),Object.keys(t.collab.locks).length?(p(),f("div",xZ,[(p(!0),f(G,null,re(t.collab.locks,(d,m)=>(p(),f("span",{key:m,class:"pill",style:{margin:"2px 4px 2px 0"}},[ie(_(m)+" → "+_(d)+" ",1),a("button",{type:"button",class:"framesync-icon-button","aria-label":"Unlock parameter",onClick:g=>t.unlockParam(m)},[ve(o,{name:"close"})],8,PZ)]))),128))])):(p(),f("div",TZ,"No active locks."))],64)):(p(),f("div",cZ," Collaboration is offline. Press the WS button to bring the collaboration panel back and reconnect. "))])])])):t.currentSubTab.SETTINGS==="OUTPUT"?(p(),f("div",AZ,[ve(c,{app:i.app},null,8,["app"])])):t.currentSubTab.SETTINGS==="RUNS"||t.currentSubTab.SETTINGS==="SYSTEM"?(p(),f("div",CZ,[ve(h,{app:i.app},null,8,["app"])])):N("",!0)])}const kZ=it(Oq,[["render",EZ]]);var Vs={};function RZ(t){return[{id:"webgl",layerKind:"webgl"},{id:"deforum",layerKind:"deforum"},{id:"wan",layerKind:"wan"},{id:"animatelcm",layerKind:"animatelcm"},{id:"svd",layerKind:"svd"}].find(i=>i.layerKind===t)||null}const LZ=["rgb(45, 226, 255)","rgb(255, 83, 217)","rgb(90, 242, 169)","rgb(255, 138, 26)","rgb(167, 139, 250)","rgb(244, 114, 182)","rgb(52, 211, 153)","rgb(251, 191, 36)"],DZ="rgb(26, 58, 82)",Nf="rgb(58, 90, 120)",IZ="rgb(12, 48, 72)",FZ="rgb(90, 143, 184)",Of={distilled_cfg_scale_schedule:"cfg_scale_schedule"},NZ={name:"App",components:{StatusStrip:lS,GlassPanel:nr,LiveParamRow:SS,UiIcon:oi,SequencerControlsPanel:fx,GenerateView:rv,ThreeBackground:Wk,LiveView:aR,AnimationEnginePanel:$O,LibraryWorkspaceOverlay:l8,EditorView:sv,PromptsView:tz,MotionView:Gz,ModulationView:P7,SettingsView:kZ,RunsBrowserPanel:av},data(){return{showFrames:!1,isPlaying:!1,isRecording:!1,deforumPlaying:!1,deforumSessionStartedAt:null,previewGenerating:!1,heldPreviewFramePath:"",previewDebounceTimer:null,previewRequestQueue:[],previewQueueProcessing:!1,previewQueueMaxSize:4,videoReady:!1,framesRefreshBackoffMs:1e3,frameRefreshTimer:null,apiHealthBackoffMs:15e3,runsLoading:!1,presetsLoading:!1,sharedPresetsLoading:!1,pluginsLoading:!1,lorasLoading:!1,cnLoading:!1,deforumSettingsLoading:!1,deforumSettingsSaving:!1,paramPanelOpen:!1,deforumPanelOpen:!1,liveDrawerOpen:!0,rightPanelOpen:!0,sidePanelDock:"auto",sidePanelDockBounds:{top:0,left:0,height:0},_sidePanelDockOnResize:null,_sidePanelDockResizeObserver:null,videoStageSize:"full",liveAnimationBoxOpen:!1,enginePanelDetailsOpen:!1,enginePanelDetailsTab:"ENGINE",deforumPreloadStatus:"",_preloadDeforumStarted:!1,libraryFullscreen:!1,libraryWorkspaceOpen:!1,libraryWorkspacePane:"browser",liveBottomDrawerOpen:!1,liveBottomDrawerTab:"MODULATION",deforumSettings:{...Sa},seedFixedBackup:Math.floor(Math.random()*2147483647),deforumFieldGroups:[...sh],deforumFieldEnabled:lr(),deforumActiveTab:"canvas",deforumControlTab:"settings",deforumSectionOpen:{},deforumAdvancedOpen:!1,sessionDeforumSettingsLoaded:!1,deforumSettingsJson:"",deforumSettingsJsonError:"",deforumSettingsStatus:"",deforumContinuationCheckpoints:[],deforumVerifyResults:null,deforumSaveTimer:null,deforumPreviewTimer:null,crossfadeSlotTypes:Z1,performance:{genericPrompt:"",crossfader:.5,newSlotType:"prompt",slots:[],status:"",lastPreviewPath:null},forge:{host:typeof process<"u"&&Vs&&Vs.SD_FORGE_HOST?Vs.SD_FORGE_HOST:"192.168.2.101",port:typeof process<"u"&&Vs&&Vs.SD_FORGE_PORT?Vs.SD_FORGE_PORT:"7860",available:!1,loading:!1,switching:!1,models:[],modelsSource:"",currentModel:"",selectedModel:"",lastModel:"",modelInfo:null,samplers:[],schedulers:[],vaeList:[],options:{}},streamUrl:"",streaming:{status:"",activeStatus:"unknown",activeDestinationId:null,destinations:[]},lfoOn:!0,beatMacroOn:!0,apiHealth:{sdForge:null},serviceHealth:{loading:!1,lastChecked:null,web:{ok:!0},hls:{updated:null,ageMs:null},stream:{status:"unknown"}},forgeHost:Vs.SD_FORGE_HOST||"192.168.2.101",availablePresets:[],currentPreset:null,newPresetName:"",presetStatus:"",sharedPresets:[],sharedPresetName:"",sharedPresetBy:"",sharedPresetsStatus:"",collab:{userId:null,userName:typeof localStorage<"u"&&localStorage.getItem("defora_user_name")||"Performer",users:[],locks:{},recording:!1,recordings:[],status:""},collabEnabled:!0,gpuPool:{enabled:!1,strategy:"least_busy",defaultForgeModel:"",healthyNodes:0,nodes:[],loading:!1,status:"",draft:{url:"",name:"",backend:"sd-forge",priority:1,model:""},editId:null,editDraft:{name:"",url:"",backend:"sd-forge",priority:1,model:""},forgeModal:{open:!1,nodeId:"",nodeName:"",url:"",priority:1,model:"",currentModel:"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[],schedulers:[],vaeList:[],modelInfo:null,options:{},mediator:{host:"",deforumPort:8765,deforumationPort:8766,deforumStatus:"",deforumationStatus:"",probing:!1}},expandedLog:null,modelOptions:{},defaultForgeModelStatus:""},infrastructure:{loading:!1,mediator:null,transcoders:[],updatedAt:null},generator:{theme:"",stylePreset:"Masterpiece, Realistic",customStyle:"",fps:24,resolution:"1024x576",totalFrames:96,numScenes:4,isGenerating:!1,status:"",lastPath:null,result:null,llmRequestLog:null},session:"clown_set_01",_syncingGlobalFps:!1,tabs:[{id:"LIVE",label:"LIVE",hint:"Monitor",icon:"broadcast"},{id:"PROMPTS",label:"PROMPTS",hint:"Words",icon:"sparkles"},{id:"MOTION",label:"MOTION",hint:"Move",icon:"shuffle"},{id:"MODULATION",label:"MODULATION",hint:"React",icon:"wave"},{id:"AUDIO",label:"AUDIO",hint:"Reactive",icon:"mic"},{id:"SETTINGS",label:"SETTINGS",hint:"Engine",icon:"gear"}],currentTab:"LIVE",currentSubTab:{LIVE:"MONITOR",PROMPTS:"PROMPTS",MODULATION:"LFO",SETTINGS:"ENGINE",MOTION:"PERFORMANCE"},editorFreecutRoute:"projects",editorPendingImportPath:"",editorPendingImportRootId:"",editorPendingImportUrl:"",editorStatus:"",editorStatusLive:!1,liveSourcePanel:"library",liveSources:[],liveSourceStatus:"",videoLayers:[{id:"webgl",kind:"webgl",label:"WebGL",builtin:!0},{id:"deforum",kind:"deforum",label:"Deforum",builtin:!0},{id:"wan",kind:"wan",label:"WAN Video",builtin:!0},{id:"animatelcm",kind:"animatelcm",label:"AnimateLCM",builtin:!0},{id:"svd",kind:"svd",label:"SVD",builtin:!0},{id:"input",kind:"input",label:"Input",builtin:!0,playbackUrl:null}],wanEngine:{...eo},wanDownloadStatus:"",wanDownloadBusy:!1,animateLcmEngine:{...Rl},svdEngine:{...ah},svdStatus:"",_userPickedPreviewLayer:!1,activeVideoLayerId:"webgl",videoLayerAddOpen:!1,layersSidebarOpen:!1,savedScenes:[],defaultSceneName:"default",inputLayerPlaybackUrl:null,inputLayerLabel:"Input",inputVideoReady:!1,cloudDriveDraft:{url:"",provider:"google_drive"},systemFiles:{roots:[],rootId:"uploads",currentPath:"",parent:"",folders:[],videos:[],videoCount:null,folderCount:null,loading:!1,status:"",recursive:!1,viewMode:"browse",showFilenames:!0,sortKey:"name-asc",zoomLevel:2,selectedPaths:[],fullscreenIndex:-1,cloudSources:[],cloudSource:null,cloudConnectOpen:!1,cloudVideoDraft:{name:"",url:""},newFolderOpen:!1,newFolderName:"",_rootsLoaded:!1},videoSwarmVisibleStart:0,videoSwarmVisibleEnd:48,librarySubTab:"BROWSER",librarySelectedProject:null,librarySelectedVideo:null,librarySelectedAudio:null,liveEngineDrawerOpen:!1,restoreSessionPromptOpen:!1,viewportWidth:typeof window<"u"?window.innerWidth:1400,pendingSessionStateRaw:"",promptHistoryOpen:!1,promptHistory:[],speechPromptSupported:!1,speechPromptListening:!1,speechPromptError:"",stats:{lat:120},hud:{seed:42490527},timecode:"00:00.00",liveVibe:[{key:"cfg",label:"Vibe (CFG)",val:.63,min:0,max:1.5,step:.01},{key:"strength",label:"Strength",val:.78,min:0,max:1.5,step:.01},{key:"noise",label:"Noise/Glitch",val:.2,min:0,max:1,step:.01},{key:"cfgscale",label:"CFG scale",val:5,min:0,max:15,step:.1}],liveCam:[{key:"zoom",label:"Zoom",val:.8,min:-5,max:5,step:.05,sourceable:!0},{key:"panx",label:"Pan X",val:.1,min:-1,max:1,step:.01,sourceable:!1},{key:"pany",label:"Pan Y",val:0,min:-1,max:1,step:.01,sourceable:!1},{key:"tilt",label:"Tilt / Rotate",val:0,min:-180,max:180,step:.5,sourceable:!1}],paramSources:{cfg:"Manual",strength:"Manual",noise:"Beat",cfgscale:"Manual",zoom:"Beat"},liveParamAliases:{panx:"translation_x",pany:"translation_y",zoom:"zoom_2d",tilt:"rotation_z",noise:"noise_multiplier"},modulationRouteFocusKey:null,pinnedParams:(()=>{try{const t=typeof localStorage<"u"&&localStorage.getItem("defora_pinned_params");return t?JSON.parse(t):[]}catch{return[]}})(),promptStyles:[],promptStylesLoading:!1,promptStylesImporting:!1,promptStylesStatus:"",activePromptStyleId:null,promptStyleEditorId:null,promptStyleDraft:null,promptStyleSearch:"",promptStyleAutoExample:!0,lcmEngine:{...ur},prompts:{pos:"",neg:"",morphOn:!0,loraCrossfaderOn:!1,crossfaderValue:.5,loraCrossfaderLfoLink:null,loraCrossfaderLfoBase:.5,morphBlend:.5,morphBlendLfoLink:null,morphBlendLfoBase:.5},img2img:{show:!0,dataUrl:null,maskDataUrl:null,maskBlur:4,inpaintingFill:1,inpaintFullRes:!0,denoisingStrength:.55,width:1024,height:1024,loading:!1,status:"",lastPath:null},pluginsRegistry:[],morphSlots:[{id:1,on:!0,name:"clean → mad",a:"clean evil",b:"mad clown",range:"0.40–1.00",weight:1},{id:2,on:!0,name:"box → tunnel",a:"small box",b:"neon tunnel",range:"0.00–0.60",weight:1},{id:3,on:!1,name:"style fade",a:"photographic",b:"anime render",range:"0.20–0.80",weight:1}],loras:{available:[],common:[],groupA:[],groupB:[],source:"unknown",familyCollapsed:{sd15:!0,sdxl:!0,flux:!0,svd:!0}},motionPresets:{Static:{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0},Orbit:{translation_z:2,rotation_y:15,translation_x:0,translation_y:0,rotation_z:0},Tunnel:{translation_z:5,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0},Handheld:{translation_z:.5,translation_x:.2,translation_y:.1,rotation_z:2,rotation_y:0},Chaos:{translation_z:1.5,translation_x:.5,translation_y:.3,rotation_z:5,rotation_y:10},"Spin +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:1,rotation_y:0},"Spin +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:2,rotation_y:0},"Spin +4":{translation_z:0,translation_x:0,translation_y:0,rotation_z:4,rotation_y:0},"Spin +8":{translation_z:0,translation_x:0,translation_y:0,rotation_z:8,rotation_y:0},"Spin -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-1,rotation_y:0},"Spin -2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-2,rotation_y:0},"Spin -4":{translation_z:0,translation_x:0,translation_y:0,rotation_z:-4,rotation_y:0},"Yaw +0.5":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:.5},"Yaw +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:1},"Yaw +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:2},"Yaw +3":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:3},"Yaw -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:-1},"Yaw -2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:-2},"Pitch +0.5":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:.5},"Pitch +1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:1},"Pitch +2":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:2},"Pitch -1":{translation_z:0,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0,rotation_x:-1},"Pan R":{translation_z:0,translation_x:5,translation_y:0,rotation_z:0,rotation_y:0},"Pan L":{translation_z:0,translation_x:-5,translation_y:0,rotation_z:0,rotation_y:0},"Pan Up":{translation_z:0,translation_x:0,translation_y:-5,rotation_z:0,rotation_y:0},"Pan Down":{translation_z:0,translation_x:0,translation_y:5,rotation_z:0,rotation_y:0},"Zoom Out":{translation_z:-2,translation_x:0,translation_y:0,rotation_z:0,rotation_y:0}},motionStyles:["Calm","Travel","Spin","Handheld","Chaos"],motionStylesSaved:{},motionSelectedPreset:"Static",motionPadValues:{translation_x:0,translation_y:0,translation_z:0,zoom:1,rotation_z:0,look_x:0,look_y:0},motionSmoothness:{enabled:!1,frames:1},motionPadSpringBack:!0,xyPad:{dragging:!1,activePad:null,padSize:420,dragStartValues:null},motionXYPadSlots:[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"},{id:"look",xAxis:"angle",yAxis:"zoom"}],audio:{track:"",bpm:114.8,uploadedFile:null,objectUrl:null},audioSpectrogramDataUrl:null,audioSpectrogramStatus:"",_spectrogramGen:0,avSyncEnabled:!1,avSyncLeadSec:4,liveModSlotParamKeys:["","","","","","","",""],modulationMapPicker:null,mappingsActiveOnly:!1,mappingsGroupTab:"",audioBeatMacrosCollapsed:!0,audioStatus:"Idle",audioMappings:[{param:"strength",band:"low",freq_min:20,freq_max:250,out_min:0,out_max:1.5},{param:"cfg",band:"mid",freq_min:250,freq_max:2e3,out_min:0,out_max:30},{param:"translation_z",band:"high",freq_min:2e3,freq_max:8e3,out_min:-5,out_max:5}],audioMappingLevels:[0,0,0],audioSelectedMappingIndex:0,audioBandPreviewIndex:-1,audioActiveBandTab:"low",audioSpectrumBins:[],_audioSpectrumPaintTs:0,audioBandPresets:{sub:{label:"Sub",freq_min:20,freq_max:60},bass:{label:"Bass",freq_min:60,freq_max:250},lowmid:{label:"Lo-mid",freq_min:250,freq_max:500},mid:{label:"Mid",freq_min:500,freq_max:2e3},high:{label:"High",freq_min:2e3,freq_max:8e3},air:{label:"Air",freq_min:8e3,freq_max:16e3}},lfoBpm:120,modulationSelectedLfoId:1,lfoTargets:[{key:"cfg",label:"Vibe (CFG)",min:0,max:30,default:6,group:"Style"},{key:"strength",label:"Strength",min:0,max:1.5,default:.7,group:"Style"},{key:"noise_multiplier",label:"Noise/Glitch",min:0,max:3,default:1,group:"Style"},{key:"translation_z",label:"Zoom",min:-10,max:10,default:0,group:"Camera"},{key:"translation_x",label:"Pan X",min:-10,max:10,default:0,group:"Camera"},{key:"translation_y",label:"Pan Y",min:-10,max:10,default:0,group:"Camera"},{key:"rotation_y",label:"Rotate Y",min:-180,max:180,default:0,group:"Camera"},{key:"rotation_z",label:"Tilt",min:-180,max:180,default:0,group:"Camera"},{key:"fov",label:"FOV",min:1,max:180,default:70,group:"Camera"},{key:"rotation_3d_x",label:"Rotate X (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_x"},{key:"rotation_3d_y",label:"Rotate Y (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_y"},{key:"rotation_3d_z",label:"Rotate Z (3D)",min:-180,max:180,default:0,group:"Camera 3D",deforumKey:"rotation_3d_z"},{key:"zoom_2d",label:"Zoom (2D)",min:.5,max:2,default:1,group:"Camera 2D",deforumKey:"zoom"},{key:"angle_2d",label:"Angle (2D)",min:-90,max:90,default:0,group:"Camera 2D",deforumKey:"angle"},{key:"near_clip",label:"Near Clip",min:1,max:1e3,default:200,group:"Camera 3D",deforumKey:"near_schedule"},{key:"far_clip",label:"Far Clip",min:100,max:1e5,default:1e4,group:"Camera 3D",deforumKey:"far_schedule"},{key:"cn_CN1_weight",label:"CN1 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN2_weight",label:"CN2 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN3_weight",label:"CN3 Weight",min:0,max:2,default:.4,group:"ControlNet"},{key:"cn_CN1_start",label:"CN1 Start",min:0,max:1,default:0,group:"ControlNet"},{key:"cn_CN2_start",label:"CN2 Start",min:0,max:1,default:0,group:"ControlNet"},{key:"cn_CN1_end",label:"CN1 End",min:0,max:1,default:.9,group:"ControlNet"},{key:"cn_CN2_end",label:"CN2 End",min:0,max:1,default:.9,group:"ControlNet"}],animationTargets:[{key:"anim_instCount",field:"instCount",label:"Instance count",min:1e3,max:5e4,default:12e3,group:"Standby — Instancing"},{key:"anim_spread",field:"spread",label:"Spread",min:.2,max:2.5,default:.68,group:"Standby — Instancing"},{key:"anim_speed",field:"speed",label:"Speed",min:.1,max:2.5,default:.75,group:"Standby — Instancing"},{key:"anim_hue",field:"hue",label:"Hue",min:0,max:1,default:.6,group:"Standby — Instancing"},{key:"anim_glow",field:"glow",label:"Glow",min:.1,max:1.4,default:.78,group:"Standby — Instancing"},{key:"anim_orbit",field:"orbit",label:"Orbit",min:0,max:1,default:.52,group:"Standby — Instancing"},{key:"anim_beamCount",field:"beamCount",label:"Beam count",min:3,max:12,default:7,group:"Standby — Volume"},{key:"anim_pulse",field:"pulse",label:"Pulse",min:0,max:1,default:.36,group:"Standby — Volume"},{key:"anim_drift",field:"drift",label:"Drift",min:0,max:1,default:.44,group:"Standby — Volume"},{key:"anim_mist",field:"mist",label:"Mist",min:0,max:1,default:.58,group:"Standby — Nebula"},{key:"anim_lineWidth",field:"lineWidth",label:"Line width",min:1,max:10,default:2.4,group:"Standby — Raycast"},{key:"anim_lineThreshold",field:"lineThreshold",label:"Line threshold",min:0,max:10,default:.8,group:"Standby — Raycast"},{key:"anim_lineTranslation",field:"lineTranslation",label:"Line translation",min:0,max:10,default:0,group:"Standby — Raycast"},{key:"anim_mcNumBlobs",field:"mcNumBlobs",label:"Blob count",min:1,max:50,default:10,group:"Standby — Marching"},{key:"anim_mcResolution",field:"mcResolution",label:"MC resolution",min:14,max:100,default:28,group:"Standby — Marching"},{key:"anim_mcIsolation",field:"mcIsolation",label:"MC isolation",min:10,max:300,default:80,group:"Standby — Marching"},{key:"anim_ocElevation",field:"ocElevation",label:"Sun elevation",min:0,max:90,default:2,group:"Standby — Ocean"},{key:"anim_ocDistortion",field:"ocDistortion",label:"Distortion",min:0,max:8,default:3.7,group:"Standby — Ocean"},{key:"anim_ocCloudCoverage",field:"ocCloudCoverage",label:"Cloud coverage",min:0,max:1,default:.4,group:"Standby — Ocean"}],lfoShapes:["Sine","Triangle","Saw","Square"],lfos:Array.from({length:6}).map((t,e)=>({id:e+1,on:e===0,targets:e===0?["cfg"]:[],shape:"Sine",bpm:120,speed:1,depth:.1,base:null,phase:0,renderPhase:0})),macrosRack:[{id:"macro-0",on:!0,target:"cfg",shape:"Sine",bpm:120,depth:.7,offset:.1,show:!0},{id:"macro-1",on:!0,target:"translation_z",shape:"Saw",bpm:90,depth:.6,offset:.2,show:!1},{id:"macro-2",on:!1,target:"noise_multiplier",shape:"Noise",bpm:140,depth:.3,offset:0,show:!1}],framesync:{presets:["Basic Strength Schedule","Basic Noise Schedule","Basic Init"],factoryPresets:["Basic Strength Schedule","Basic Noise Schedule","Basic Init"],selectedPreset:"Basic Strength Schedule",primaryWave:"Cosine",waveShapes:["Cosine","Sine","Saw","Triangle","Square","Noise"],amplitude:1,shift:0,bend:1,noise:0,fps:24,frameCount:120,bpm:120,shiftFrames:0,syncRates:["1","1/2","1/4","1/8","1/16","1/32","2","4","8"],syncRate:"1/4",decimals:2,metrics:[{label:"Max",value:"1.00",sub:"32bars"},{label:"Min",value:"-1.00",sub:"16bars"},{label:"Avg",value:"0.00",sub:"4bars"},{label:"Abs Avg",value:"0.63",sub:"1bar"},{label:"Duration",value:"5.00s",sub:"1/2"}],timingTable:[{label:"32bar",time:"58.0s",frames:"1392.0"},{label:"16bar",time:"28.0s",frames:"768.0"},{label:"8bar",time:"16.0s",frames:"384.0"},{label:"4bar",time:"8.0s",frames:"192.0"},{label:"2bar",time:"4.0s",frames:"96.0"},{label:"1bar",time:"2.0s",frames:"48.0"},{label:"1/2",time:"1.0s",frames:"24.0"}],featureCoverage:["Wave presets","LFO modulation","Audio-driven sync","Tempo & shift","Metrics + timing table","Preset import/export"]},cn:{slots:[{id:"CN1",label:"CN1",model:"Canny",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN2",label:"CN2 •",model:"Depth",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN3",label:"CN3",model:"Pose",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN4",label:"CN4",model:"Tile",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"},{id:"CN5",label:"CN5",model:"Control",weight:.4,start:0,end:.9,enabled:!1,imageSource:"file"}],active:"CN2",availableModels:[],source:"unknown",webcamActive:!1,webcamStream:null,webcamVideo:null,webcamCanvas:null,webcamCaptureInterval:null},webcamCaptureRate:500,midi:{supported:typeof navigator<"u"&&!!navigator.requestMIDIAccess,devices:[],selected:null,mappings:[{control:"LaunchControl CC21",cc:21,key:"cfg"},{control:"LaunchControl CC22",cc:22,key:"strength"},{control:"LaunchControl CC23",cc:23,key:"cfgscale"}]},keyBindings:{translation_z:"w",translation_x:"a",translation_y:"s",rotation_y:"d",rotation_z:"q",fov:"f",cfg:"z",strength:"x",noise_multiplier:"c"},bindingLearnMode:!1,bindingTargetKey:null,bindingLearnTimeout:null,midiStatus:"Ready",ws:null,wsStatus:"disconnected",wsReconnectTimer:null,streamSrc:"/hls/live/deforum.m3u8",hlsWatchEnabled:!1,hlsPreviewStreamValid:!1,standbyPreviewVideoUrl:"",defaultAnimation:{preferDeforumVideo:!1,showStandbyClip:!1,autoTransitionToDeforum:!0,mode:"customlights",instCount:12e3,beamCount:7,speed:.75,spread:.68,glow:.78,hue:.6,pulse:.36,drift:.44,mist:.58,orbit:.52,lineType:"segments",lineWidth:2.4,lineThreshold:.8,lineTranslation:0,lineWorldUnits:!0,lineVisualizeThreshold:!1,lineAlphaToCoverage:!0,lineAnimate:!0,mcMaterial:"shiny",mcNumBlobs:10,mcResolution:28,mcIsolation:80,mcFloor:!0,mcWallX:!1,mcWallZ:!1,ocElevation:2,ocAzimuth:180,ocExposure:.1,ocDistortion:3.7,ocSize:1,ocCloudCoverage:.4,ocCloudDensity:.5,ocCloudElevation:.5,forgeLayerOpacity:0,rememberCompositorLayerOnStartup:!1,previewCompositorCrossfadeMs:800,forgeLayerOpacityLfoLink:null,forgeLayerOpacityLfoBase:0,deforumBackdropEnabled:!0,deforumBackdropMix:.35},frameRailRunId:null,thumbs:[],frameThumbLoadingKeys:{},framesTimer:null,playerEl:null,timeHandler:null,hls:null,videoReadyHandler:null,videoWaitingHandler:null,videoPlayHandler:null,videoPauseHandler:null,liveParamTimers:{},liveParamPending:{},lastParamSent:{},controlDelayMs:75,errorHandler:null,playbackTimer:null,lfoTimer:null,lastLfoTick:null,beatTimer:null,lastBeatTime:null,beatCount:0,beatPhase:0,lastMacroTrigger:{},sequencer:{version:1,durationSec:8,fps:24,loop:!0,tracks:[],markers:[],clips:[],bpmSync:!1,bpm:120,bars:4,beatsPerBar:4},sequencerPlayhead:0,jobPlaybackTimeSec:0,sequencerPlaying:!1,sequencerTimer:null,sequencerSaveName:"default_clip",sequencerLoadPick:"",sequencerList:[],sequencerStatus:"",sequencerNewParam:"translation_x",sequencerKeyframeVal:0,sequencerMarkerName:"Scene",sequencerClipDurationSec:2,sequencerSelectedTrackId:null,sequencerSelectedClipId:null,generateDockExpanded:!1,motionSequencerSideOpen:!1,selectedFrameIndex:-1,timelineHoverTime:null,timelineHoverPercent:0,timelineCanvasCtx:null,lfoTargetPick:{},avSyncCollapsed:!0,morphCollapsed:!0,loraPickerOpen:!1,loraCrossfaderPickerGroup:null,loraCrossfaderCollapsed:!1,engineModelPickerOpen:!1,engineModelPickerTab:"sd15",forgeAdvancedCollapsed:!0,storyResultCollapsed:!1,lfoCanvasRefs:{},_lfoAnimFrame:null,runsAll:[],runsFiltered:[],runsFilter:{search:"",status:"",tag:"",model:""},runsSort:{field:"started_at",order:"desc"},deforumBatches:[],deforumBatchesStatus:"",deforumBatchNodes:[],runsSelected:[],runsCompareFields:["status","model","frame_count","seed","steps","strength","cfg","tag","prompt_positive","prompt_negative","notes"],runsDetailView:null,runsDetailTab:"summary",runsDetailJsonShowDiffOnly:!1,runsBrowserTab:"active",runsStatus:"",runsAutoRefresh:!0,runsPollIntervalSec:5,_runsPollTimer:null,runsLaunching:!1,runsJobLog:[],_runsJobLogSeq:0,_runsActivityKey:"",runsLastRefreshedAt:null,genData:{defaultThemes:["A journey through light","Neon cathedral","Ocean depths"],sceneDescriptors:{opening:["ethereal","quiet"],buildup:["rising","vivid"],climax:["intense","surreal"],closing:["soft","fading"]},environments:[["forest","meadow"],["city","alley"],["space","nebula"]],lighting:["golden hour","neon rim light","moonlit"],quality:["masterpiece","best quality"],techSpecs:["8k","sharp focus"],artists:{default:["artgerm","greg rutkowski"],"Masterpiece, Realistic":["photorealistic"]},negatives:["blurry","low quality"],cameraBehaviors:["STATIC","ORBIT","TUNNEL"]}}},computed:{appViewModel(){return this},gpuActiveCount(){return Math.max(0,Number(this.gpuPool&&this.gpuPool.healthyNodes)||0)},gpuTotalCount(){return Array.isArray(this.gpuPool&&this.gpuPool.nodes)?this.gpuPool.nodes.length:0},recentRunsRail(){return(Array.isArray(this.runsAll)?this.runsAll:[]).slice().sort((e,i)=>new Date(i.started_at||0)-new Date(e.started_at||0)).slice(0,4)},runsActiveGpuJobs(){return(Array.isArray(this.deforumBatches)?this.deforumBatches:[]).map(e=>{const i=e.batch_id||e.id||e.batchId||"",n=String(e.status||e.state||"queued").toLowerCase();let s=n;return n.includes("run")||n.includes("progress")||n.includes("generat")?s="running":n.includes("queue")||n.includes("pending")||n.includes("wait")?s="queued":n.includes("cancel")?s="cancelled":n.includes("fail")||n.includes("error")?s="failed":(n.includes("complete")||n.includes("done")||n.includes("success"))&&(s="completed"),{batchId:i,runId:i?`batch:${i}`:"",status:s,model:e.model||e.sd_model_name||e.sd_model_checkpoint||"",frames:e.frame_count??e.frames??e.max_frames??null,progress:e.progress??e.phase_progress??null,node:e._node||null,nodeName:e._node&&e._node.name||e._node&&e._node.url||"forge",startedAt:e.started_at||e.created_at||e.createdAt||null,_batch:e}}).filter(e=>e.batchId&&(e.status==="queued"||e.status==="running"))},runsGpuNodeSummaries(){const t=(this.gpuPool.nodes||[]).filter(i=>i&&i.enabled&&i.backend==="sd-forge"),e={};return this.runsActiveGpuJobs.forEach(i=>{const n=i.node&&i.node.id||i.nodeName||"unknown";e[n]||(e[n]=[]),e[n].push(i)}),t.length?t.map(i=>({id:i.id,name:i.name||i.url,url:i.url,status:i.status,activeJobs:i.activeJobs,queueRunning:i.queueRunning,queuePending:i.queuePending,progress:i.progress,jobs:e[i.id]||[]})):(this.deforumBatchNodes||[]).map(i=>({id:i.id||i.url,name:i.name||i.url,url:i.url,status:null,activeJobs:(e[i.id||i.url]||[]).length,queueRunning:null,queuePending:null,progress:null,jobs:e[i.id||i.url]||e[i.name||i.url]||[]}))},runsMonitorActive(){return this.currentTab==="RUNS"||this.currentTab==="SETTINGS"&&(this.currentSubTab.SETTINGS==="RUNS"||this.currentSubTab.SETTINGS==="SYSTEM")},runsLastRefreshedLabel(){if(!this.runsLastRefreshedAt)return"";try{return`Updated ${new Date(this.runsLastRefreshedAt).toLocaleTimeString()}`}catch{return""}},runsActiveList(){return(this.runsAll||[]).filter(t=>t.status==="running"||t.status==="queued")},runsActiveRunningCount(){return this.runsActiveList.filter(t=>t.status==="running").length},runsActiveQueuedCount(){return this.runsActiveList.filter(t=>t.status==="queued").length},runsActiveWorkerCount(){const t=this.runsActiveList.map(e=>this.runWorkerName(e)).filter(e=>e&&e!=="—");return new Set(t).size},runsActiveSummaryLabel(){const t=this.runsActiveRunningCount,e=this.runsActiveQueuedCount,i=this.runsActiveWorkerCount,n=i?` · ${i} worker${i===1?"":"s"}`:"";return`${t} running · ${e} queued${n}`},runsPastCount(){return(this.runsAll||[]).filter(t=>t.status!=="running"&&t.status!=="queued").length},rtmpStreamHref(){const t=this.infrastructure&&Array.isArray(this.infrastructure.transcoders)?this.infrastructure.transcoders:[],e=t.find(i=>i&&i.rtmpTarget)||t[0];return e&&e.rtmpTarget?e.rtmpTarget:"rtmp://vimage3:1935/live/deforum"},hlsStreamHref(){return"/hls/live/deforum.m3u8"},frameStripThumbs(){const t=this.frameRailRunId,e=this.runsDetailView;return t&&e&&e.run_id===t&&Array.isArray(e.frames)&&e.frames.length?e.frames.map((i,n)=>{const s=String(i),r=`/api/runs/${encodeURIComponent(e.run_id)}/frames/${encodeURIComponent(s)}`;return{name:s,src:r,url:r,path:r,frame:n+1}}):(this.thumbs||[]).filter(i=>!!(i&&(i.src||i.url||i.path)))},frameRailSourceLabel(){const t=this.frameRailRunId;return t?`Run ${t}`:""},framesEmptyStatus(){if(!(!!(this.forge&&this.forge.available)||!!(this.apiHealth&&this.apiHealth.sdForge&&this.apiHealth.sdForge.available)))return{label:"Waiting for frames…",detail:"Unknown (offline)",kind:"unknown"};const e=Math.max(0,Number(this.framesRefreshBackoffMs)||0),i=e?Math.max(1,Math.round(e/1e3)):0;return this.previewGenerating?{label:"Rendering…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}:this.deforumPlaying?{label:"Animating…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}:{label:"Waiting for frames…",detail:i?`Next check ~${i}s`:"Checking soon",kind:"loading"}},selectedFrameThumb(){if(!this.frameStripThumbs.length)return null;if(!Number.isFinite(Number(this.selectedFrameIndex)))return this.frameStripThumbs[this.frameStripThumbs.length-1]||null;const t=Math.min(this.frameStripThumbs.length-1,Math.max(0,Number(this.selectedFrameIndex)));return this.frameStripThumbs[t]||null},selectedFrameLabel(){return this.selectedFrameThumb?`Frame ${this.frameLabel(this.selectedFrameThumb)}`:"No frames"},currentProjectLabel(){return String(this.session||"").trim()||"Project"},currentBatchLabel(){return String(this.deforumSettings&&this.deforumSettings.batch_name||"").trim()||"—"},deforumGeneratedFrameCount(){return this.frameStripThumbs.length},deforumStreamFrameLabel(){const t=this.deforumGeneratedFrameCount;if(!t)return"";const e=this.frameStripThumbs[t-1],i=e?this.frameLabel(e):t;return t===1?`1 frame generated (#${i})`:`${t} frames generated · latest #${i}`},deforumContinuationCanUndo(){return fy(this.deforumContinuationCheckpoints)&&!this.deforumPlaying},deforumContinuationUndoTitle(){const t=this.deforumContinuationCheckpoints||[];return t.length<2?"Undo last animation segment (available after pausing with new frames)":`Undo to frame ${t[t.length-2].frame}, then change settings and Play to redo`},latestGeneratedFramePath(){const t=this.frameStripThumbs;if(!t.length)return"";const e=t[t.length-1];return e&&(e.src||e.url||e.path)||""},activePreviewStillPath(){return this.deforumPlaying?this.latestGeneratedFramePath||this.performance.lastPreviewPath||this.generator.lastPath||this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||"":this.currentTab==="LIVE"?this.performance.lastPreviewPath||this.generator.lastPath||this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||"":!this.showMotionSequencerDock&&this.selectedFrameThumb?this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path||this.performance.lastPreviewPath||this.generator.lastPath||"":this.performance.lastPreviewPath||this.generator.lastPath||""},displayedPreviewStillPath(){return this.heldPreviewFramePath?this.heldPreviewFramePath:this.activePreviewStillPath},showFrameProcessing(){return this.previewGenerating?!0:this.isWebglSoloPreview?!1:!!(this.deforumPlaying&&!this.showDeforumVideo&&this.displayedPreviewStillPath)},showFrameProcessingOnStage(){return!this.showFrameProcessing||this.isWebglSoloPreview?!1:!!(this.showPreviewStill||this.deforumPlaying&&!this.showDeforumVideo&&this.displayedPreviewStillPath)},showFrameProcessingInChrome(){return this.showFrameProcessing&&!this.showFrameProcessingOnStage&&!this.previewGenerating},frameProcessingLabel(){return this.previewGenerating?"Rendering preview frame":this.deforumPlaying?"Generating frames":"Processing"},frameProcessingHint(){return this.previewGenerating?"Keeping the current frame visible until the new preview is ready.":this.deforumPlaying?"Keeping the last frame on screen until the live feed is ready.":"Processing…"},showMotionSequencerDock(){return this.currentTab==="MOTION"||this.currentTab==="GENERATE"},showRightPanel(){return this.rightPanelOpen},showEngineDrawerShell(){return!this.libraryWorkspaceOpen},libraryEditorOpen:{get(){return this.libraryWorkspaceOpen&&this.libraryWorkspacePane==="editor"},set(t){t?(this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane="editor"):this.libraryWorkspacePane==="editor"&&(this.libraryWorkspaceOpen=!1)}},edgeDockOverlayMode(){return this.libraryWorkspaceOpen?!1:this.videoStageSize==="full"?!0:this.viewportWidth<1360},edgeDockSingleRightPanel(){return this.viewportWidth<920},rightPanelEdgeLabel(){return{LIVE:"Live",PROMPTS:"Prompts",MOTION:"Motion",GENERATE:"Generate",MODULATION:"Mod",AUDIO:"Audio",SETTINGS:"Settings",RUNS:"Runs"}[this.currentTab]||"Panel"},sidePanelUsesEdgeDock(){return!0},rightPanelToggleIcon(){return this.rightPanelOpen?"chevron-up":"chevron-down"},rightPanelToggleTitle(){return this.sidePanelUsesEdgeDock?this.rightPanelOpen?"Collapse panel":"Expand panel":this.rightPanelOpen?"Collapse controls":"Show controls"},contextPanelChevronIcon(){return this.rightPanelOpen?"chevron-left":"chevron-right"},contextPanelToggleLabel(){return this.rightPanelOpen?"Hide controls panel":"Show controls panel"},engineDrawerToggleLabel(){return this.liveEngineDrawerOpen?"Hide engine panel":"Show engine panel"},engineDrawerChevronIcon(){return this.liveEngineDrawerOpen?"chevron-right":"chevron-left"},layersSidebarToggleLabel(){return this.layersSidebarOpen?"Hide layers panel":"Show layers panel"},layersSidebarChevronIcon(){return this.layersSidebarOpen?"chevron-right":"chevron-left"},shouldAutoRevealDeforumVideo(){return!this.showMainStageHls||!this.isDeforumLayerActive&&!this.isBlendLayerActive?!1:this.deforumGeneratedFrameCount>0||this.deforumPlaying&&this.videoReady},deforumLayerAutoFadeIn(){if(!this.showDeforumVideo||!this.shouldAutoRevealDeforumVideo)return!1;const t=this.findVideoLayer("deforum");return t?this.readVideoLayerOpacity(t)<=.001:!1},sidePanelDockStyle(){if(this.sidePanelUsesEdgeDock)return null;const t=this.sidePanelDockBounds||{},e=Number(t.top),i=Number(t.left),n=Number(t.height);return!Number.isFinite(n)||n<8?null:{top:`${Number.isFinite(e)?e:0}px`,left:`${Number.isFinite(i)?i:0}px`,height:`${n}px`}},canStartHlsWatch(){return this.hlsPreviewStreamValid&&!this.hlsWatchEnabled},showMainStageHls(){return this.hlsWatchEnabled},showDeforumVideo(){var t;if(!this.showMainStageHls)return!1;if(this.isBlendLayerActive){if(!this.layerKindVisible("blend")&&!this.shouldAutoRevealDeforumVideo)return!1}else if(this.isForgeAnimationLayerActive){const e=(t=this.activeVideoLayer)==null?void 0:t.kind;if(!this.layerKindVisible(e)&&!(e==="deforum"&&this.shouldAutoRevealDeforumVideo))return!1}else return!1;return this.isWebglLayerActive&&!this.isBlendLayerActive||!this.isForgeAnimationLayerActive&&!this.isBlendLayerActive||!this.videoReady?!1:this.deforumPlaying||this.deforumGeneratedFrameCount>0},showStandbyPreviewVideo(){return!(!this.standbyPreviewVideoUrl||!!!(this.defaultAnimation&&this.defaultAnimation.showStandbyClip)&&!this.showMainStageHls||this.libraryWorkspaceOpen||this.showLayerInputVideo||this.showPreviewStill)},showDefaultAnimation(){return this.showStandbyPreviewVideo||this.showPreviewStill?!1:this.isBlendLayerActive?this.layerKindVisible("webgl"):this.isWebglLayerActive?this.layerKindVisible("webgl"):this.isForgeAnimationLayerActive?!this.showDeforumVideo&&this.layerKindVisible("webgl"):!this.activeLayerPlaybackUrl&&!this.showLayerInputVideo?this.layerKindVisible("webgl"):!1},activeVideoLayer(){const t=Array.isArray(this.videoLayers)?this.videoLayers:[];return t.find(e=>e.id===this.activeVideoLayerId)||t[0]||null},activePromptStyle(){return this.activePromptStyleId&&(this.promptStyles||[]).find(t=>t.id===this.activePromptStyleId)||null},seedRandomEnabled(){var t;return Number((t=this.deforumSettings)==null?void 0:t.seed)===-1},filteredPromptStyles(){const t=String(this.promptStyleSearch||"").trim().toLowerCase(),e=Array.isArray(this.promptStyles)?this.promptStyles:[];return t?e.filter(i=>String(i.name||"").toLowerCase().includes(t)||String(i.positive||"").toLowerCase().includes(t)||String(i.negative||"").toLowerCase().includes(t)):e},builtinEngineLayers(){return(Array.isArray(this.videoLayers)?this.videoLayers:[]).filter(t=>t&&t.builtin)},runningPreviewVideoLayers(){return(Array.isArray(this.videoLayers)?this.videoLayers:[]).filter(e=>e&&e.builtin&&this.isVideoLayerPreviewVisible(e)&&this.isVideoLayerRunning(e))},isWebglLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="webgl"},isWebglSoloPreview(){return this.isWebglLayerActive&&!this.isBlendLayerActive},showForgeOverWebgl(){return this.isWebglSoloPreview?!1:this.isBlendLayerActive||this.isForgeAnimationLayerActive},effectiveForgeLayerOpacity(){var i;if(this.isWebglSoloPreview)return 0;const t=this.activeVideoLayer;if(t&&(t.kind==="deforum"||t.kind==="wan"||t.kind==="svd"||t.kind==="blend")){const n=this.readVideoLayerOpacity(t);if(this.isVideoLayerPreviewVisible(t)&&n<=.001){if(t.kind==="deforum"&&this.shouldAutoRevealDeforumVideo)return 1;if(!this.isVideoLayerPreviewVisible(t)||!this.layerKindVisible(t.kind))return 0}else if(!this.layerKindVisible(t.kind))return 0;return n}const e=Number((i=this.defaultAnimation)==null?void 0:i.forgeLayerOpacity);return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0},webglLayerStyle(){return this.videoLayerRenderStyle("webgl")},inputLayerStyle(){return this.videoLayerRenderStyle("input")},forgeOverlayStyle(){var i;const t=this.effectiveForgeLayerOpacity,e=Math.max(0,Math.min(5e3,Math.round(Number((i=this.defaultAnimation)==null?void 0:i.previewCompositorCrossfadeMs)||800)));return t<=0?{opacity:"0",visibility:"hidden",pointerEvents:"none",transition:`opacity ${e}ms ease, visibility 0s linear ${e}ms`}:{opacity:String(t),visibility:"visible",pointerEvents:"none",transition:`opacity ${e}ms ease`}},previewStageStyle(){var i;const t=Math.max(0,Math.min(5e3,Math.round(Number((i=this.defaultAnimation)==null?void 0:i.previewCompositorCrossfadeMs)||800))),e=this.effectiveForgeLayerOpacity;return{"--preview-compositor-crossfade-ms":`${t}ms`,"--preview-forge-layer-opacity":String(e)}},isDeforumLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="deforum"},isWanLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="wan"},isAnimateLcmLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="animatelcm"},isSvdLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="svd"},animateLcmMotionTypes(){return ly},animateLcmMotionLoras(){return uy},animateLcmControlFields(){return oh},svdEngineControlFields(){return q0(this.svdEngine)},svdPresetNames(){return V0},svdEngineSummary(){return K0(this.svdEngine)},isForgeAnimationLayerActive(){var e;const t=(e=this.activeVideoLayer)==null?void 0:e.kind;return t==="deforum"||t==="wan"||t==="animatelcm"||t==="svd"},activeAnimationPlugin(){var t;return RZ((t=this.activeVideoLayer)==null?void 0:t.kind)||null},activeAnimationPluginId(){var t;return((t=this.activeAnimationPlugin)==null?void 0:t.id)||null},wanEngineControlFields(){return F0(this.wanEngine)},wanSpeedPresetNames(){return x0},wanMotionPresetNames(){return P0},wanMotionLoras(){return iy},wanDownloadPackages(){return Bo},wanI2vModelOptions(){return ry},activeWanMotionLoras(){var t;return Array.isArray((t=this.wanEngine)==null?void 0:t.motion_loras)?this.wanEngine.motion_loras:[]},isBlendLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="blend"},isInputLayerActive(){var t;return((t=this.activeVideoLayer)==null?void 0:t.kind)==="input"},activeLayerPlaybackUrl(){const t=this.activeVideoLayer;return t?t.kind==="input"?this.inputLayerPlaybackUrl||t.playbackUrl||"":t.kind==="library"&&t.playbackUrl||"":""},showLayerInputVideo(){const t=this.activeVideoLayer;return!t||!this.activeLayerPlaybackUrl||!this.layerKindVisible("input")?!1:t.kind==="input"||t.kind==="library"},appView(){return this},videoLayerStatusLabel(){var e,i;const t=this.activeVideoLayer;if(!t)return"—";if(t.kind==="webgl")return"WebGL engine";if(t.kind==="blend")return this.showDeforumVideo?"WebGL + Deforum":"WebGL · waiting for Deforum";if(t.kind==="deforum"){const n=this.deforumGeneratedFrameCount,s=n?` · ${n} frame${n===1?"":"s"}`:"";return this.showDeforumVideo?`Deforum live${s}`:this.videoReady?`Deforum ready${s}`:this.deforumPlaying?`Deforum warming up${s}`:n?`Deforum · ${n} frame${n===1?"":"s"}`:"Waiting for Deforum"}if(t.kind==="wan"){const n=this.deforumGeneratedFrameCount,s=n?` · ${n} frame${n===1?"":"s"}`:"",r=String(((e=this.wanEngine)==null?void 0:e.wan_t2v_model)||"Wan").trim();return this.showDeforumVideo?`WAN live · ${r}${s}`:this.deforumPlaying?`WAN generating · ${r}${s}`:`WAN Video · ${r}`}if(t.kind==="svd"){const n=this.deforumGeneratedFrameCount,s=n?` · ${n} frame${n===1?"":"s"}`:"",r=this.svdEngineSummary,l=String(((i=this.svdEngine)==null?void 0:i.svd_checkpoint)||"SVD").trim();return this.showDeforumVideo?`SVD live · ${(r==null?void 0:r.modelFamily)||"SVD"}${s}`:this.deforumPlaying?`SVD generating · ${l}${s}`:`SVD · ${(r==null?void 0:r.modelFamily)||l}`}return t.kind==="animatelcm"?this.deforumPlaying?"AnimateLCM · generating":"AnimateLCM · idle":t.kind==="input"?this.activeLayerPlaybackUrl?`Input · ${this.inputLayerLabel||"Video"}`:"Input · no source":t.kind==="library"?`Layer · ${t.label||"Video"}`:t.kind==="cloud"?`Cloud · ${t.label||"Link"}`:t.label||"Layer"},showPreviewStill(){if(this.isWebglSoloPreview)return!1;const t=this.activeVideoLayer;if(t&&(t.kind==="deforum"||t.kind==="wan"||t.kind==="svd"||t.kind==="blend")){if(this.readVideoLayerOpacity(t)<=.001&&(this.showDeforumVideo||this.shouldAutoRevealDeforumVideo))return!1}else if(this.effectiveForgeLayerOpacity<=0)return!1;const e=this.currentTab!=="LIVE"||this.isForgeAnimationLayerActive||this.isBlendLayerActive;return!!(!this.showDeforumVideo&&this.displayedPreviewStillPath&&e)},backgroundAudioMetrics(){const t=Array.isArray(this.audioMappingLevels)?this.audioMappingLevels.map(l=>Math.max(0,Math.min(1,Number(l)||0))):[],e=t[0]||0,i=t[1]||0,n=t[2]||0,s=t.length?t.reduce((l,o)=>l+o,0)/t.length:0,r=this.audioSpectrumPlaying;return{active:s>.01||r,level:s,bass:e,mid:i,treble:n,pulse:Math.min(1,e*.7+s*.3)}},availableOllamaNodes(){return(this.gpuPool.nodes||[]).filter(t=>t&&t.enabled&&t.backend==="ollama")},healthyOllamaNodes(){return this.availableOllamaNodes.filter(t=>t.status==="healthy")},storyOllamaStatusLabel(){const t=this.healthyOllamaNodes;if(t.length){const i=t[0],n=i.model||i.currentModel,s=i.name||i.url||"Ollama",r=t.length>1?` (+${t.length-1} more)`:"";return n?`Ollama ready — ${n} on ${s}${r}`:`Ollama ready — ${s}${r}`}const e=this.availableOllamaNodes;if(e.length){const i=e[0];return`Ollama unreachable — ${i.name||i.url}`}return this.gpuPool&&this.gpuPool.loading?"Checking Ollama…":"Ollama not configured"},storyOllamaStatusTone(){return this.healthyOllamaNodes.length?"ready":this.availableOllamaNodes.length?"warn":"off"},storyOllamaNeedsConfigure(){return this.healthyOllamaNodes.length===0},storyGeneratorSourceLabel(){const t=this.generator&&this.generator.result&&this.generator.result.source;if(t&&t.model)return`Ollama ${t.model}${t.node&&t.node.name?" on "+t.node.name:""}`;const e=this.availableOllamaNodes[0];return e?`Ollama ${e.model||e.currentModel||e.name}`:"Local fallback"},storyGeneratorStatusLabel(){return this.generator.isGenerating?"Generating":this.generator.result?"Ready":"Idle"},storyGeneratorStatusLive(){return!!this.generator.isGenerating||!!this.generator.result},storyGeneratorSceneCount(){return Math.max(2,Number(this.generator.numScenes)||4)},storyGeneratorFrameCount(){return Number(this.deforumSettings&&this.deforumSettings.max_frames)||Number(this.generator.totalFrames)||96},storyGeneratorFps(){return this.masterFps},storyGeneratorSceneMeta(){const t=this.storyGeneratorSceneCount,e=this.storyGeneratorFrameCount;return`~${Math.ceil(e/t)} frames per scene`},storyGeneratorTimelineMeta(){const t=this.storyGeneratorFps;return`${(this.storyGeneratorFrameCount/t).toFixed(1)}s timeline`},storyLlmRequestJsonForUi(){const t=this.generator&&this.generator.llmRequestLog;return!t||!t.ollamaRequest?"":tp(t.ollamaRequest)},runsJobLogStoryOllamaJson(){const t=(this.runsJobLog||[]).find(e=>e.kind==="story_llm_request"&&e.ollamaRequest);return t?tp(t.ollamaRequest):""},storyGeneratorResolutionLabel(){const t=Number(this.deforumSettings&&this.deforumSettings.W)||Number((this.generator.resolution||"1024x576").split("x")[0])||1024,e=Number(this.deforumSettings&&this.deforumSettings.H)||Number((this.generator.resolution||"1024x576").split("x")[1])||576;return`${t}×${e}`},promptMorphBlendLinkedLfo(){const t=Number(this.prompts.morphBlendLfoLink||0);return t&&this.lfos.find(e=>e.id===t)||null},promptMorphBlendLinkStatus(){const t=this.promptMorphBlendLinkedLfo;return t?t.on?`Linked to LFO ${t.id}`:`Linked to LFO ${t.id} (currently off)`:"Manual control"},loraCrossfaderLinkedLfo(){const t=Number(this.prompts.loraCrossfaderLfoLink||0);return t&&this.lfos.find(e=>e.id===t)||null},loraCrossfaderLinkStatus(){const t=this.loraCrossfaderLinkedLfo;return t?t.on?`Linked to LFO ${t.id}`:`Linked to LFO ${t.id} (currently off)`:"Manual control"},currentLoraModelFamily(){return this.detectModelFamilyFromValue(this.forge.modelInfo,this.forge.currentModel||this.forge.selectedModel||this.forge.lastModel)},currentLoraModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[this.currentLoraModelFamily]||"Unknown"},loraBrowserFamilies(){const t=[{key:"sd15",label:"SD1.5"},{key:"sdxl",label:"SDXL"},{key:"flux",label:"FLUX"},{key:"svd",label:"SVD"}],e=this.currentLoraModelFamily;return t.map(i=>({...i,items:this.loras.available.filter(n=>(n.family||"sd15")===i.key),compatible:!e||e===i.key,collapsed:this.loras.familyCollapsed[i.key]!==!1})).filter(i=>!e||i.compatible)},compatibleLoraFamilies(){return this.loraBrowserFamilies.map(t=>({...t,items:t.items.filter(Boolean)})).filter(t=>t.items.length)},videoSwarmIsCloudRoot(){return this.isCloudStorageRoot(this.systemFiles.rootId)},videoSwarmIsVideosOnly(){return this.systemFiles.viewMode==="videos-only"},videoSwarmCloudPathLabel(){const t=this.systemFiles.cloudSource;return t?`${this.cloudProviderLabel(t.provider)} — ${t.label}`:"Cloud storage"},videoSwarmDisplayFolders(){return this.videoSwarmIsVideosOnly||this.videoSwarmIsCloudRoot?[]:Array.isArray(this.systemFiles.folders)?this.systemFiles.folders:[]},videoSwarmDisplayVideos(){return(Array.isArray(this.systemFiles.videos)?this.systemFiles.videos:[]).slice(this.videoSwarmVisibleStart,this.videoSwarmVisibleEnd)},videoSwarmFullscreenVideo(){const t=this.systemFiles.videos||[],e=this.systemFiles.fullscreenIndex;return e>=0&&e0&&this.loras.groupB.length>0},loraCrossfaderBlending(){return!!this.prompts.loraCrossfaderOn&&this.loraCrossfaderReady},loraCrossfaderStatusLabel(){return this.prompts.loraCrossfaderOn?"Enabled":"Disabled"},loraCrossfaderSummary(){const t=this.loras.groupA.length,e=this.loras.groupB.length,i=((1-this.prompts.crossfaderValue)*100).toFixed(0),n=(this.prompts.crossfaderValue*100).toFixed(0);return this.prompts.loraCrossfaderOn?!t&&!e?"Assign LoRAs to A and B groups to crossfade.":this.loraCrossfaderReady?`A ${t} · B ${e} · mix ${i}% / ${n}%`:`Needs LoRAs in both groups. Current assignment: A ${t}, B ${e}.`:"Crossfader is off. Click Enabled to blend A/B LoRA groups."},modelStatusKind(){return this.forge.switching||this.forge.loading?"loading":this.forge.available||this.apiHealth.sdForge&&this.apiHealth.sdForge.available?"ready":"offline"},modelStatusLabel(){return this.modelStatusKind==="loading"?"Loading":this.modelStatusKind==="ready"?"Ready":"Offline"},engineCurrentModelName(){return this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name||this.forge.currentModel||this.forge.selectedModel||this.forge.lastModel)},engineCurrentModelFamily(){return this.detectModelFamilyFromValue(this.forge.modelInfo,this.engineCurrentModelName)},engineCurrentModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[this.engineCurrentModelFamily]||"Generic"},engineModelFamilyTabs(){return[{key:"sd15",label:"SD1.5"},{key:"sdxl",label:"SDXL"},{key:"flux",label:"Flux"},{key:"zimage",label:"Z-Image"},{key:"other",label:"Other"}]},groupedEngineModels(){const t={sd15:[],sdxl:[],flux:[],zimage:[],other:[]};return(this.forge.models||[]).forEach(e=>{const i=this.detectModelFamilyFromValue(e.metadata,`${e.title||""} ${e.model_name||""}`),n=t[i]?i:"other";t[n].push(e)}),Object.keys(t).forEach(e=>{t[e].sort((i,n)=>String(i.title||i.model_name||"").localeCompare(String(n.title||n.model_name||"")))}),t},activeEngineModelList(){const t=this.engineModelPickerTab||"sd15";return this.groupedEngineModels[t]||[]},engineCurrentCfgScale(){const t=Number(this.forge.options&&this.forge.options.cfg_scale)||Number((this.liveVibe.find(e=>e.key==="cfgscale")||{}).val)||1;return this.readFirstNumericValue(this.deforumSettings&&(this.deforumSettings.cfg_scale_schedule||this.deforumSettings.distilled_cfg_scale_schedule)||"",t)},engineCurrentSteps(){return this.lcmEngine&&this.lcmEngine.enabled?Math.max(1,Math.round(Number(this.lcmEngine.steps)||1)):this.currentStepsValue()},lcmEngineEnabled(){return!!(this.lcmEngine&&this.lcmEngine.enabled)},engineSamplerOptions(){return[...new Set([this.deforumSettings&&this.deforumSettings.sampler,this.forge.options&&this.forge.options.sampler_name,this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.sampler_name,...this.forge.samplers||[],...t0].map(t=>String(t||"").trim()).filter(Boolean))]},engineSchedulerOptions(){return[...new Set([this.deforumSettings&&this.deforumSettings.scheduler,this.forge.options&&this.forge.options.scheduler,this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.scheduler,...this.forge.schedulers||[],...i0].map(t=>String(t||"").trim()).filter(Boolean))]},sdForgeGpuNodes(){return(this.gpuPool.nodes||[]).filter(t=>t&&t.backend==="sd-forge")},mediatorHealthSummary(){const t=this.sdForgeGpuNodes.filter(i=>i.mediator);if(!t.length){const i=this.infrastructure&&this.infrastructure.mediator;if(i){const n=i.status==="healthy"&&i.deforumStatus==="healthy";return{label:i.status||"unknown",ok:n}}return{label:"unknown",ok:!1}}const e=t.filter(i=>i.mediator.deforumStatus==="healthy"&&i.mediator.deforumationStatus==="healthy").length;return e===t.length?{label:"healthy",ok:!0}:e>0?{label:`${e}/${t.length} ok`,ok:!1}:{label:"unreachable",ok:!1}},deforumLayerFieldGroups(){return this.deforumFieldGroups.filter(t=>t&&t.id!=="global")},deforumGlobalEngineGroup(){return Yg},deforumControlTabs(){return[{id:"settings",label:"Settings"},{id:"motion",label:"Motion"},{id:"macros",label:"Macros"}]},editorImportUrl(){const t=String(this.editorPendingImportUrl||"").trim();if(t)return t;const e=String(this.editorPendingImportPath||"").trim();if(!e)return"";const i=typeof window<"u"?window.location.origin:"";return t_(i,e,this.editorPendingImportRootId)},freecutFrameSrc(){const t=String(this.editorFreecutRoute||"projects").trim();let e=hy();return t.startsWith("editor/")&&(e=Q0(t.slice(7))),e_(e,this.editorImportUrl)},activeDeforumFieldGroup(){const t=this.deforumLayerFieldGroups;return t.find(e=>e.id===this.deforumActiveTab)||t[0]||null},deforumMode2d3d(){var t;return zm((t=this.deforumSettings)==null?void 0:t.animation_mode)},deforumMode3dActive(){return this.deforumMode2d3d==="3D"},engineOptimizedDefaults(){return this.optimizedDefaultsForModel(this.engineCurrentModelName)},engineOptimizedProfileLabel(){return this.engineOptimizedDefaults&&this.engineOptimizedDefaults.profileLabel||"Manual / custom"},paramPanelGroups(){return[{label:"Style",items:this.liveVibe},{label:"Camera",items:this.liveCam}]},pinnedParamItems(){const t=[...this.liveVibe,...this.liveCam];return this.pinnedParams.map(e=>t.find(i=>i.key===e)).filter(Boolean)},modulatingNowItems(){return[...this.liveVibe,...this.liveCam].filter(t=>this.paramSources[t.key]&&this.paramSources[t.key]!=="Manual").map(t=>({key:t.key,label:t.label,source:this.paramSources[t.key],val:t.val,min:t.min,max:t.max,pct:Math.round((t.val-t.min)/(t.max-t.min||1)*100)}))},liveActiveLayerLabel(){const t=this.findVideoLayer(this.activeVideoLayerId);return(t==null?void 0:t.label)||"—"},liveContextSummaryParams(){const t=this.modulatingNowItems||[];if(t.length)return t.slice(0,4);const e=(this.pinnedParamItems||[]).slice(0,4);return e.length?e.map(i=>({key:i.key,label:i.label,val:i.val,source:this.paramSources[i.key]||"Manual"})):[...this.liveVibe||[],...this.liveCam||[]].slice(0,3).map(i=>({key:i.key,label:i.label,val:i.val,source:this.paramSources[i.key]||"Manual"}))},audioReactiveActive(){return["Audio sent to mediator","Streaming"].includes(this.audioStatus)},audioSpectrumPlaying(){const t=this.$refs&&this.$refs.avSyncAudio;return!!(t&&this.audio.objectUrl&&!t.paused&&!t.ended)},audioSpectrumEditorLive(){return!!(this.audio.objectUrl||this.audioSpectrumBins&&this.audioSpectrumBins.length)},animationModeGroupLabel(){const t=this.defaultAnimation&&this.defaultAnimation.mode||"instancing";return`Standby — ${{instancing:"Instancing",volume:"Volume",nebula:"Nebula",raycast:"Raycast",marching:"Marching",ocean:"Ocean",interactive_points:"Interactive points",interactive_raycast_points:"Raycast points",lensflares:"Lens flares",transition:"Scene transition",protoplanet:"GPGPU protoplanet",periodic_table:"Periodic table (CSS3D)",customlights:"Custom lights"}[t]||"Instancing"}`},modulationMappingsGroups(){const t=new Map;this.animationTargets.forEach(n=>{const s=n.group||"Animation";t.has(s)||t.set(s,[]),t.get(s).push(n)}),this.lfoTargets.forEach(n=>{const s=n.group||"Deforum";t.has(s)||t.set(s,[]),t.get(s).push(n)});const e=this.animationModeGroupLabel,i=[...t.entries()].map(([n,s])=>({label:n,shortLabel:String(n).replace(/^Standby — /,""),items:s}));return i.sort((n,s)=>n.label===e?-1:s.label===e?1:n.label.localeCompare(s.label)),i},modulationMappingsVisibleGroups(){let t=this.modulationMappingsGroups;return this.mappingsActiveOnly&&(t=t.map(e=>({...e,items:e.items.filter(i=>this.paramHasActiveMapping(i.key))})).filter(e=>e.items.length)),t},mappingsActiveGroupLabel(){var i;const t=this.modulationMappingsVisibleGroups||[],e=this.mappingsGroupTab||this.animationModeGroupLabel;return t.some(n=>n.label===e)?e:((i=t[0])==null?void 0:i.label)||""},mappingsActiveGroup(){const t=this.modulationMappingsVisibleGroups||[],e=this.mappingsActiveGroupLabel;return t.find(i=>i.label===e)||t[0]||null},modulationMapPickerParamLabel(){var i;const t=(i=this.modulationMapPicker)==null?void 0:i.paramKey;if(!t)return"";const e=this.modulationTargetByKey(t);return(e==null?void 0:e.label)||t},videoSwarmIsCloudRoot(){return this.isCloudStorageRoot(this.systemFiles.rootId)},videoSwarmIsVideosOnly(){return this.systemFiles.viewMode==="videos-only"},videoSwarmCloudPathLabel(){const t=this.systemFiles.cloudSource;return t?`${this.cloudProviderLabel(t.provider)} — ${t.label}`:"Cloud storage"},videoSwarmDisplayFolders(){return this.videoSwarmIsVideosOnly||this.videoSwarmIsCloudRoot?[]:Array.isArray(this.systemFiles.folders)?this.systemFiles.folders:[]},videoSwarmDisplayVideos(){return(Array.isArray(this.systemFiles.videos)?this.systemFiles.videos:[]).slice(this.videoSwarmVisibleStart,this.videoSwarmVisibleEnd)},videoSwarmFullscreenVideo(){const t=this.systemFiles.videos||[],e=this.systemFiles.fullscreenIndex;return e>=0&&e=0&&ts.key===i);return n>=0?n:0},activeAudioMapping(){return this.audioMappings[this.activeAudioMappingIndex]||this.audioMappings[0]||null},audioSpectrumBandLabels(){return this.audioBandTabDefs.map(t=>t.label)},audioSpectrumBandColors(){try{const t=getComputedStyle(document.documentElement),e=i=>t.getPropertyValue(i).trim();return[e("--band-low"),e("--band-mid"),e("--band-high")].filter(Boolean)}catch{return[]}},liveModulating(){const t={};[...this.liveVibe,...this.liveCam].forEach(i=>{t[i.key]=i}),this.modulationTargets.forEach(i=>{var n;if(!t[i.key]){const s=(n=Object.entries(this.liveParamAliases).find(([,u])=>u===i.key))==null?void 0:n[0],r=s?this.liveHudParamByKey(s):null;if(r){t[i.key]={key:i.key,label:i.label,val:Number(r.val??0),min:r.min??0,max:r.max??1,step:r.step??.01};return}const l=i.field,o=l&&this.defaultAnimation?Number(this.defaultAnimation[l]):i.default||0;t[i.key]={key:i.key,label:i.label,val:Number.isFinite(o)?o:i.default||0,min:i.min||0,max:i.max||1,step:i.step??.01}}});const e={};return this.lfos.filter(i=>i.on&&i.targets.length).forEach(i=>{i.targets.forEach(n=>{e[n]||(e[n]={key:n,sources:[]}),e[n].sources.push(`LFO ${i.id}`)})}),this.macrosRack.filter(i=>i.on&&i.target).forEach(i=>{const n=i.target;e[n]||(e[n]={key:n,sources:[]}),e[n].sources.push("Macro")}),this.audioReactiveActive&&this.audioMappings.forEach(i=>{!i||!i.param||(e[i.param]||(e[i.param]={key:i.param,sources:[]}),e[i.param].sources.push("Audio"))}),[{key:"translation_x",active:Math.abs(Number(this.motionPadValues.translation_x)||0)>.01},{key:"translation_y",active:Math.abs(Number(this.motionPadValues.translation_y)||0)>.01}].forEach(({key:i,active:n})=>{n&&(e[i]||(e[i]={key:i,sources:[]}),e[i].sources.push("XY"))}),Object.values(e).map(i=>({...t[i.key]||{key:i.key,label:i.key,val:0,min:0,max:1},source:i.sources.join(" + ")}))},liveModulationSlots(){const t=l=>{const o=this.liveModSlotParamKeys[l];if(!o)return null;const u=this.modulationTargetByKey(o),c=this.paramControlMeta(o),h=this.paramSources[o]||this.paramSources[this.liveParamCanonicalKey(o)]||"Manual";return{key:o,label:u&&u.label||o,val:c.hud?c.hud.val:c.value,min:c.min,max:c.max,step:c.step,source:h}},e=l=>{const o=Number(l);return Number.isFinite(o)?Math.abs(o)>=10?o.toFixed(1):o.toFixed(2):"—"},i=l=>{if(!l)return 35;const o=Number(l.min??0),u=Number(l.max??1),h=(Number(l.val??0)-o)/(u-o||1);return Math.round(30+Math.max(0,Math.min(1,h))*70)},n=(l,o)=>{if(!(l!=null&&l.key))return{kind:"slider",label:o,paramKey:"",mappingLabel:"",min:0,max:1,step:.01,value:0,valueLabel:"—",shade:35};const u=this.paramControlMeta(l.key),c=u.hud?u.hud.val:u.value,h={...l,val:c,min:u.min,max:u.max};return{kind:"slider",label:l.label||o,paramKey:l.key,mappingLabel:l!=null&&l.source&&l.source!=="Manual"?l.source:"",min:u.min,max:u.max,step:u.step,value:c,valueLabel:e(c),shade:i(h)}},s=(l,o)=>{if(!(l!=null&&l.key))return{kind:"knob",label:o,paramKey:"",mappingLabel:"",min:0,max:1,step:.01,value:0,valueLabel:"—"};const u=this.paramControlMeta(l.key),c=u.hud?u.hud.val:u.value;return{kind:"knob",label:l.label||o,paramKey:l.key,mappingLabel:l!=null&&l.source&&l.source!=="Manual"?l.source:"",min:u.min,max:u.max,step:u.step,value:c,valueLabel:e(c)}},r=(l,o,u)=>{const c=l!=null&&l.key?this.paramControlMeta(l.key):null,h=o!=null&&o.key?this.paramControlMeta(o.key):null,d=Number((c==null?void 0:c.min)??(l==null?void 0:l.min)??0),m=Number((c==null?void 0:c.max)??(l==null?void 0:l.max)??1),g=Number((h==null?void 0:h.min)??(o==null?void 0:o.min)??0),b=Number((h==null?void 0:h.max)??(o==null?void 0:o.max)??1),w=Number(c!=null&&c.hud?c.hud.val:(c==null?void 0:c.value)??(l==null?void 0:l.val)??0),v=Number(h!=null&&h.hud?h.hud.val:(h==null?void 0:h.value)??(o==null?void 0:o.val)??0),y=(w-d)/(m-d||1),S=(v-g)/(b-g||1),P=Math.max(0,Math.min(1,Number.isFinite(y)?y:0)),M=Math.max(0,Math.min(1,Number.isFinite(S)?S:0));return{kind:"xypad",label:u,paramKey:"",paramKeyX:(l==null?void 0:l.key)||"",paramKeyY:(o==null?void 0:o.key)||"",mappingLabel:[l==null?void 0:l.source,o==null?void 0:o.source].filter(k=>k&&k!=="Manual").join(" · "),x:P,y:M,xLabel:e(w),yLabel:e(v),puckStyle:{left:`${P*100}%`,top:`${(1-M)*100}%`}}};return[n(t(0),"Slider 1"),n(t(1),"Slider 2"),r(t(2),t(3),"XY Pad 1"),r(t(4),t(5),"XY Pad 2"),s(t(6),"Knob 1"),s(t(7),"Knob 2")]},sessionCatalog(){try{if(typeof window>"u"||!window.localStorage)return[];const t=window.localStorage,e=new Set;for(let n=0;n{const s=t.getItem(`defora_session_${n}__touchedAt`),r=s!=null?Number(s):NaN,l=(this.runsAll||[]).filter(c=>{const h=String(c&&c.run_id?c.run_id:"");return h?h===n||h.startsWith(`${n}_`)||h.startsWith(`${n}-`)||h.includes(n):!1});let o=0,u=0;return l.forEach(c=>{(Number(c&&(c.frame_count??c.frames??c.length_frames??0))||0)>1?u+=1:o+=1}),{name:n,touchedAt:Number.isFinite(r)?r:0,images:o,videos:u,runs:l.length}}).sort((n,s)=>(s.touchedAt||0)-(n.touchedAt||0)||n.name.localeCompare(s.name))}catch{return[]}},targetOwners(){const t={};return this.lfos.forEach(e=>{e.on&&e.targets.forEach(i=>{t[i]||(t[i]=[]),t[i].push(`LFO ${e.id}`)})}),this.macrosRack.forEach((e,i)=>{!e.on||!e.target||(t[e.target]||(t[e.target]=[]),t[e.target].push(`Macro ${i+1}`))}),t},activeSlot(){return this.cn.slots.find(t=>t.id===this.cn.active)||this.cn.slots[0]},currentControlNetModelFamily(){return this.engineCurrentModelFamily||this.currentLoraModelFamily||""},currentControlNetModelFamilyLabel(){return{sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",svd:"SVD"}[this.currentControlNetModelFamily]||"Generic"},controlNetCompatibleModels(){const t=this.currentControlNetModelFamily;return(this.cn.availableModels||[]).filter(e=>{const i=this.detectModelFamilyFromValue(null,`${e&&e.name?e.name:""} ${e&&e.id?e.id:""}`);return!t||!i||i===t})},activeControlNetModelIsCompatible(){const t=String(this.activeSlot&&this.activeSlot.model||"").trim();if(!t)return!0;const e=this.detectModelFamilyFromValue(null,t);return!this.currentControlNetModelFamily||!e?!0:e===this.currentControlNetModelFamily},activeControlNetModelChoices(){const t=String(this.activeSlot&&this.activeSlot.model||"").trim(),e=this.controlNetCompatibleModels.some(n=>n&&n.name===t);return!t||e?this.controlNetCompatibleModels:[{...(this.cn.availableModels||[]).find(n=>n&&n.name===t)||{id:`current-${t.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,name:t,category:"current"},current:!0,incompatible:!this.activeControlNetModelIsCompatible},...this.controlNetCompatibleModels]},controlNetModelSummary(){const t=this.controlNetCompatibleModels.length;return this.currentControlNetModelFamily?`Showing ${t} ${this.currentControlNetModelFamilyLabel}-compatible models.`:`Showing ${t} available models.`},controlNetWeightPercent(){return Math.max(0,Math.min(100,(Number(this.activeSlot&&this.activeSlot.weight)||0)/2*100))},controlNetWeightLabel(){const t=Number(this.activeSlot&&this.activeSlot.weight)||0;return t<.35?"Very subtle":t<.75?"Subtle":t<1.1?"Balanced":t<1.5?"Strong":"Very strong"},modulationTargets(){return[...this.lfoTargets,...this.animationTargets]},lfoTargetGroups(){const t={};return this.modulationTargets.forEach(e=>{const i=e.group||"Other";t[i]||(t[i]=[]),t[i].push(e)}),Object.entries(t).map(([e,i])=>({label:e,items:i}))},sequencerParamOptions(){const t=this.modulationTargets.map(e=>({key:e.key,label:e.label}));return this.cn.slots.forEach(e=>{t.push({key:`cn_${e.id}_weight`,label:`CN ${e.id} Weight`,group:"ControlNet"}),t.push({key:`cn_${e.id}_start`,label:`CN ${e.id} Start`,group:"ControlNet"}),t.push({key:`cn_${e.id}_end`,label:`CN ${e.id} End`,group:"ControlNet"})}),t},audioBandChips(){return Object.entries(this.audioBandPresets).map(([t,e])=>({key:t,label:e.label,freq_min:e.freq_min,freq_max:e.freq_max}))},sortedSequencerMarkers(){return[...this.sequencer&&this.sequencer.markers||[]].sort((e,i)=>e.t-i.t)},sortedSequencerClips(){return[...this.sequencer&&this.sequencer.clips||[]].sort((e,i)=>e.t-i.t)},sequencerClipSummary(){const t=this.sortedSequencerClips,e=i=>t.filter(n=>n.type===i).length;return{prompt:e("prompt"),lora:e("lora"),controlnet:e("controlnet")}},masterFps(){const t=Number(this.deforumSettings&&this.deforumSettings.fps);return Math.max(1,Math.min(120,Number.isFinite(t)&&t>0?Math.round(t):24))},sequencerJobFps(){return this.masterFps},sequencerJobTotalFrames(){const t=Number(this.deforumSettings&&this.deforumSettings.max_frames);if(Number.isFinite(t)&&t>0)return Math.floor(t);const e=this.sequencerJobFps,i=Number(this.sequencer&&this.sequencer.durationSec)||0;return Math.max(1,Math.ceil(i*e))},sequencerJobTimeSec(){return this.sequencerPlaying?Number(this.sequencerPlayhead)||0:this.deforumPlaying&&this.showMotionSequencerDock?Number(this.jobPlaybackTimeSec)||0:Number(this.sequencerPlayhead)||0},sequencerJobFrameIndex(){const t=this.sequencerJobFps,e=this.sequencerJobTotalFrames,i=Math.floor((Number(this.sequencerJobTimeSec)||0)*t+1e-6);return Math.min(e-1,Math.max(0,i))},sequencerJobFrameNumber(){return this.sequencerJobFrameIndex+1},sequencerJobFrameLabel(){return`Frame ${this.sequencerJobFrameNumber} / ${this.sequencerJobTotalFrames}`},sequencerJobFrameProgressPct(){const t=this.sequencerJobTotalFrames;return t<=1?0:this.sequencerJobFrameIndex/(t-1)*100},sequencerJobFrameLive(){return!!this.sequencerPlaying||!!this.deforumPlaying},sequencerCalculatedDuration(){if(!this.sequencer.bpmSync)return"—";const t=Math.max(1,this.sequencer.bpm||120);return((this.sequencer.bars||4)*(this.sequencer.beatsPerBar||4)/t*60).toFixed(2)},selectedSequencerTrack(){return this.sequencer.tracks.find(t=>t.id===this.sequencerSelectedTrackId)||this.sequencer.tracks[0]||null},sequencerParamMetaMap(){const t={};return this.modulationTargets.forEach(e=>{t[e.key]={label:e.label,min:Number(e.min??0),max:Number(e.max??1)}}),this.cn.slots.forEach(e=>{t[`cn_${e.id}_weight`]={label:`CN ${e.id} Weight`,min:0,max:2},t[`cn_${e.id}_start`]={label:`CN ${e.id} Start`,min:0,max:1},t[`cn_${e.id}_end`]={label:`CN ${e.id} End`,min:0,max:1}}),t},selectedModulationLfo(){return this.lfos.find(t=>t.id===this.modulationSelectedLfoId)||this.lfos[0]||null},isDeforumMotion2d(){var e;return String(((e=this.deforumSettings)==null?void 0:e.animation_mode)||"2D").trim().toUpperCase()==="2D"},motionMovePadRange(){return this.isDeforumMotion2d?1:10},motionAxisOptionsList(){const t=this.isDeforumMotion2d?["translation_x","translation_y","angle","zoom"]:["translation_x","translation_y","translation_z","zoom","rotation_z"],e={translation_x:{key:"translation_x",label:"Pan X",shortLabel:"X",icon:"arrow-right"},translation_y:{key:"translation_y",label:"Pan Y",shortLabel:"Y",icon:"chevron-up"},translation_z:{key:"translation_z",label:"Depth Z",shortLabel:"Z",icon:"panel-bottom"},angle:{key:"angle",label:"Angle",shortLabel:"Ang",icon:"rotate-ccw"},zoom:{key:"zoom",label:"Zoom",shortLabel:"Zm",icon:"size-full"},rotation_z:{key:"rotation_z",label:"Tilt",shortLabel:"Tlt",icon:"rotate-ccw"}};return t.map(i=>e[i]).filter(Boolean)},motionPadPuckStyle(){return this.motionPadPuckStyleFor("move")},motionLookPadPuckStyle(){return this.motionPadPuckStyleFor("look")},motionPadReadout(){return{x:Number(this.motionPadValues.translation_x||0),y:Number(this.motionPadValues.translation_y||0),z:Number(this.motionPadValues.translation_z||0),zoom:Number(this.motionPadValues.zoom??1),tilt:Number(this.motionPadValues.rotation_z??0),lookX:Number(this.motionPadValues.look_x??0),lookY:Number(this.motionPadValues.look_y??0)}},savedMotionPresetNames(){return Object.keys(this.motionStylesSaved||{}).sort((t,e)=>t.localeCompare(e))},morphHudSummary(){const t=Array.isArray(this.performance.slots)?this.performance.slots:[],e=i=>{if(!t.length)return`No ${i} slots`;const n=t.slice(0,2).map(r=>{if(r.type==="param"&&r.paramKey){const l=this.modulationTargetByKey(r.paramKey);return l?l.label:this.slotTypeLabel(r.type)}if(r.type==="style"){const l=this.promptStyleLabel(r.valueA),o=this.promptStyleLabel(r.valueB);return l&&o?`${l}↔${o}`:l||o||this.slotTypeLabel(r.type)}return this.slotTypeLabel(r.type)}),s=t.length>2?` +${t.length-2}`:"";return`${i} · ${n.join(" / ")}${s}`};return{a:e("A"),b:e("B")}},bindingGroups(){const t={};return this.modulationTargets.forEach(e=>{const i=e.group||"Other";t[i]||(t[i]=[]),t[i].push(e)}),Object.entries(t).map(([e,i])=>({label:e,items:i}))},modulationSubtabSummary(){const t=this.normalizeModulationSubTab(this.currentSubTab.MODULATION);if(t==="LFO")return`${this.lfos.filter(i=>i.on).length}/${this.lfos.length} LFO active`;if(t==="AV_SYNC")return this.avSyncEnabled&&this.audio.objectUrl?"Sync on":this.audio.objectUrl?"Sync off":"Upload track";if(t==="AUDIO_REACTIVE")return this.audioReactiveActive?"Audio live":"Audio idle";if(t==="BEAT_MACROS")return this.beatMacroOn?"Beat macros on":"Beat macros off";if(t==="MAPPINGS"){const e=this.mappingsActiveOnly?this.modulationMappingsVisibleGroups.reduce((i,n)=>i+n.items.length,0):this.modulationMappingsGroups.reduce((i,n)=>i+n.items.length,0);return e?`${e} parameters`:"No mappings"}return""}},watch:{sequencer:{handler(){this.$nextTick(()=>this.drawTimeline())},deep:!0},"sequencer.fps"(t){this._syncingGlobalFps||this.setGlobalFps(t,{source:"sequencer"})},"generator.fps"(t){this._syncingGlobalFps||this.setGlobalFps(t,{source:"generator"})},sequencerPlayhead(){this.$nextTick(()=>this.drawTimeline())},"performance.crossfader"(){this.applyCrossfadeMorph(),this.saveSessionState()},session(t){this.saveSessionState(),this.deforumSettings&&(this.deforumSettings={...this.deforumSettings,batch_name:t})},showDefaultAnimation(t){t&&this.$nextTick(()=>this.kickstandbyAnimation())},audioMappings:{deep:!0,handler(){if(this.audioBandPreviewIndex<0)return;const t=this.audioMappings[this.audioBandPreviewIndex];t&&this.updateAudioBandpassFilter(t)}},deforumGeneratedFrameCount(t){t>0&&this.maybePromoteDeforumPreview()},isDeforumMotion2d(t){this.motionXYPadSlots=t?[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"},{id:"look",xAxis:"angle",yAxis:"zoom"}]:[{id:"primary",xAxis:"translation_x",yAxis:"translation_y"}]},deforumPlaying(t){t?(this.frameRailFollowLatest=!0,this.pinHeldPreviewFrame(),this.maybePromoteDeforumPreview(),this.scheduleFrameRefresh(0)):(this.clearHeldPreviewFrame(),this.clearFrameThumbLoadingState())},videoReady(t){t&&(this.maybePromoteDeforumPreview(),this.showDeforumVideo&&this.clearHeldPreviewFrame())},showDeforumVideo(t){t&&this.clearHeldPreviewFrame()},currentTab(){this.syncRunsMonitorPolling()},"currentSubTab.SETTINGS"(t){this.currentTab==="SETTINGS"&&(this.syncRunsMonitorPolling(),t==="SYSTEM"&&this.refreshRuns(),t==="PLUGINS"&&this.refreshPlugins())},runsAutoRefresh(){this.syncRunsMonitorPolling(),this.saveSessionState()},liveEngineDrawerOpen(t){this.$nextTick(()=>this.updateSidePanelDockBounds()),t&&this.preloadDeforumPipeline()},liveAnimationBoxOpen(t){this.enginePanelDetailsOpen!==t&&(this.enginePanelDetailsOpen=t)},enginePanelDetailsOpen(t){this.liveAnimationBoxOpen!==t&&(this.liveAnimationBoxOpen=t)},currentTab(t,e){(e==="STREAM"||e==="LIBRARY")&&t!==e&&e==="STREAM"&&this.hlsWatchEnabled&&this.disableHlsWatch()},hlsPreviewStreamValid(t){!t&&this.hlsWatchEnabled&&this.disableHlsWatch()},deforumActiveTab(t){t==="sampling"&&this.ensureForgeSamplerSchedulerLists()},"currentSubTab.LIVE"(t){t==="DEFORUM_JOB"&&this.ensureForgeSamplerSchedulerLists()},sidePanelUsesEdgeDock(){this.updateSidePanelDockBounds(),this.$nextTick(()=>this.bindSidePanelDockTracking())},videoStageSize(){this.updateSidePanelDockBounds()},libraryWorkspaceOpen(){this.updateSidePanelDockBounds()},currentTab(){this.updateSidePanelDockBounds()},rightPanelOpen(){this.updateSidePanelDockBounds()}},mounted(){this.checkAndPromptSessionRestore()||this.loadSessionState();try{if(typeof window<"u"&&window.localStorage){const i=window.localStorage.getItem("defora_tab");i==="EDITOR"||i==="LIBRARY"?this.openLibraryWorkspace(i==="EDITOR"?"editor":"browser"):i==="STREAM"&&(this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","OUTPUT"))}}catch{}this.initVideoLayers(),this.initDefaultScene(),this.applyStartupVideoPreview(),this.applyContextPanelStartupDefaults(),this.ensureStandbyAnimationAtStartup(),this.syncMotionPadFromPayload(this.motionPresets[this.motionSelectedPreset]||{translation_x:0,translation_y:0}),this.applyCrossfadeMorph(),this.loadMotionStyles(),this.loadBindings(),this.refreshPresets(),this.refreshSharedPresets(),this.refreshGpuPool(!1),this.loadControlNetModels(),this.refreshPlugins(),this.loadPromptStyles(),this.syncDeforumSettingsJson();const t=this.loadDeforumSettings({syncServerModel:!1}),e=this.refreshForgeAll();if(t.finally(()=>{this.deforumPlaying||this.schedulePreviewFrame(),this.preloadDeforumPipeline()}),Promise.allSettled([t,e]).then(()=>{this.restoreLastModel(),this.ensureDefaultForgeModelPreloaded(),this.preloadDeforumPipeline()}),this.scanMidi(),this.connectWebSocket(),this.loadStandbyPreviewVideo(),typeof fetch=="function"){const i=this.loadCachedFrameThumbs();i.length&&(this.thumbs=i,this.updateFrameSelection(""));const n=()=>{this.refreshFrames().finally(()=>{this.framesTimer=setTimeout(n,this.framesRefreshBackoffMs||5e3)})};n();const s=()=>{this.refreshApiHealth().finally(()=>{this.apiStatusTimer=setTimeout(s,this.apiHealthBackoffMs||15e3)})};s()}this.playbackTimer=setInterval(()=>this.ensureLivePlayback(),4e3),this.lfoTimer=setInterval(()=>this.runLfos(),120),this.beatTimer=setInterval(()=>this.processBeat(),50),this.startLfoAnimation(),this.setupKeyboardShortcuts(),typeof window<"u"&&(this._viewportResizeHandler=()=>{this.viewportWidth=window.innerWidth},window.addEventListener("resize",this._viewportResizeHandler,{passive:!0})),this.refreshRuns(),this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200),this.kickstandbyAnimation(),this.bindSidePanelDockTracking()}),this.initPromptHistory(),this.refreshServiceHealth(),this.syncRunsMonitorPolling()},beforeUnmount(){this.unbindSidePanelDockTracking(),this._viewportResizeHandler&&typeof window<"u"&&(window.removeEventListener("resize",this._viewportResizeHandler),this._viewportResizeHandler=null),this.disposeLiveAudioAnalyser(),this.stopSequencerPlayback(),this.framesTimer&&clearTimeout(this.framesTimer),this.apiStatusTimer&&clearTimeout(this.apiStatusTimer),this.playbackTimer&&clearInterval(this.playbackTimer),this.lfoTimer&&clearInterval(this.lfoTimer),this.beatTimer&&clearInterval(this.beatTimer),this.previewDebounceTimer&&clearTimeout(this.previewDebounceTimer),this.deforumPreviewTimer&&clearTimeout(this.deforumPreviewTimer),this.previewRequestQueue=[],this.previewQueueProcessing=!1,this.frameRefreshTimer&&clearTimeout(this.frameRefreshTimer),this.wsReconnectTimer&&clearTimeout(this.wsReconnectTimer),this.stopRunsPolling(),this.stopLfoAnimation(),this.playerEl&&this.detachPlayerListeners(this.playerEl),this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),typeof document<"u"&&document.removeEventListener("keydown",this._keyHandler)},methods:{cssVar(t){return getComputedStyle(document.documentElement).getPropertyValue(t).trim()},themeColor(t,e){return this.cssVar(t)||e},sanitizeSessionName(t){return String(t||"").trim().replace(/\s+/g,"_").replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,60)||"default"},selectSession(t){const e=this.sanitizeSessionName(t);this.session=e;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_session",e)}catch{}this.loadSessionState(),this.saveSessionState()},createNewSession(){const t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),e=this.sanitizeSessionName(`session_${t}`);this.selectSession(e)},resetUiLayoutDefaults(){this.paramPanelOpen=!1,this.deforumPanelOpen=!1,this.liveDrawerOpen=!0,this.rightPanelOpen=!0,this.sidePanelDock="auto",this.videoStageSize="full",this.liveAnimationBoxOpen=!1,this.enginePanelDetailsOpen=!1,this.enginePanelDetailsTab="ENGINE",this.liveEngineDrawerOpen=!1,this.layersSidebarOpen=!1,this.libraryFullscreen=!1,this.libraryWorkspaceOpen=!1,this.libraryWorkspacePane="browser",this.generateDockExpanded=!1,this.motionSequencerSideOpen=!1,this.saveSessionState()},purgeSession(t){try{if(typeof window>"u"||!window.localStorage)return;const e=this.sanitizeSessionName(t);window.localStorage.removeItem(`defora_session_${e}`),window.localStorage.removeItem(`defora_session_${e}__touchedAt`),window.localStorage.removeItem(`defora_session_${e}__restoreDeclinedAt`),e===this.session&&this.selectSession("default")}catch{}},restoreSession(t){try{if(typeof window>"u"||!window.localStorage)return;const e=this.sanitizeSessionName(t),i=window.localStorage.getItem(`defora_session_${e}`);if(!i)return;this.pendingSessionStateRaw=i,this.session=e;try{window.localStorage.setItem("defora_session",e)}catch{}this.clearSessionRestoreDeclined(),this.loadSessionState(),this.saveSessionState()}catch{}},async refreshApiHealth(){var t,e,i;if(typeof fetch=="function")try{const n=await fetch("/api/status");if(!n.ok){this.apiHealthBackoffMs=Math.min(12e4,(this.apiHealthBackoffMs||15e3)*2);return}const s=await n.json();if(s&&s.sdForge){const r=!!((e=(t=this.apiHealth)==null?void 0:t.sdForge)!=null&&e.available||(i=this.forge)!=null&&i.available);this.apiHealth={sdForge:{...s.sdForge}},this.forge.available=!!s.sdForge.available,!r&&this.forge.available&&this.preloadDeforumPipeline()}this.apiHealthBackoffMs=15e3}catch{this.apiHealthBackoffMs=Math.min(12e4,(this.apiHealthBackoffMs||15e3)*2)}},async refreshServiceHealth(){if(typeof fetch!="function")return;const t=Date.now();this.serviceHealth.loading=!0,this.serviceHealth.lastChecked=new Date().toISOString();const e={web:{ok:!1},hls:{updated:null,ageMs:null},stream:{status:"unknown"}},i=async s=>{try{return await s.json()}catch{return null}};await Promise.allSettled([(async()=>{try{const s=await fetch("/health",{cache:"no-store"});e.web.ok=!!s.ok}catch{e.web.ok=!1}})(),(async()=>{try{const s=await fetch("/api/health",{cache:"no-store"});if(!s.ok)return;const r=await i(s),l=r&&r.updated!=null?Number(r.updated):null;e.hls.updated=Number.isFinite(l)?l:null,e.hls.updated!=null&&(e.hls.ageMs=Math.max(0,Date.now()-e.hls.updated))}catch{}})(),(async()=>{try{const s=await fetch("/api/stream/status",{cache:"no-store"});if(!s.ok)return;const r=await i(s);e.stream.status=r&&r.status?String(r.status):"unknown"}catch{}})()]),this.serviceHealth.web=e.web,this.serviceHealth.hls=e.hls,this.serviceHealth.stream=e.stream,this.serviceHealth.lastChecked=new Date().toISOString(),this.serviceHealth.loading=!1;const n=Date.now()-t;n>1500&&this.performance&&this.performance.status===""&&(this.performance.status=`Service health refreshed (${n}ms)`,setTimeout(()=>{this.performance.status&&this.performance.status.startsWith("Service health refreshed")&&(this.performance.status="")},2500))},appendRunsJobLog(t,e="info"){let i;t&&typeof t=="object"&&(t.kind||t.message)?i={id:t.id||`log-${++this._runsJobLogSeq}`,ts:t.ts||new Date().toISOString(),level:t.level||e,kind:t.kind||null,message:String(t.message||t.kind||"log"),clientRequest:t.clientRequest||null,ollamaRequest:t.ollamaRequest||null}:i={id:`log-${++this._runsJobLogSeq}`,ts:new Date().toISOString(),message:String(t||""),level:e,kind:null,clientRequest:null,ollamaRequest:null},this.mergeRunsJobLogEntry(i)},mergeRunsJobLogEntry(t){if(!t||!t.id)return;const e=(this.runsJobLog||[]).filter(i=>i.id!==t.id);this.runsJobLog=[t,...e].slice(0,80)},clearRunsJobLog(){this.runsJobLog=[],typeof fetch=="function"&&fetch("/api/runs/job-log",{method:"DELETE"}).catch(()=>{})},applyStoryLlmRequestLog(t){if(!t||!t.ollamaRequest)return;this.generator.llmRequestLog={clientRequest:t.clientRequest||null,ollamaRequest:t.ollamaRequest,logId:t.logId||null};const e=h_(t.clientRequest,t.ollamaRequest,{id:t.logId});this.mergeRunsJobLogEntry(e)},async persistStoryLlmRequestLog(t,{model:e=""}={}){const i=ep(t),n=c_(i,{model:e});if(typeof fetch!="function")return this.applyStoryLlmRequestLog({clientRequest:i,ollamaRequest:n}),{clientRequest:i,ollamaRequest:n};try{const s=await fetch("/api/runs/job-log",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({kind:"story_llm_request",clientRequest:i,ollamaRequest:n})}),r=await s.json();if(s.ok&&r.llmLog)return this.applyStoryLlmRequestLog(r.llmLog),r.llmLog;s.ok&&r.entry&&this.applyStoryLlmRequestLog({clientRequest:r.entry.clientRequest,ollamaRequest:r.entry.ollamaRequest,logId:r.entry.id})}catch{this.applyStoryLlmRequestLog({clientRequest:i,ollamaRequest:n})}return{clientRequest:i,ollamaRequest:n}},async refreshRunsJobLogFromServer(){if(typeof fetch=="function")try{const t=await fetch("/api/runs/job-log?limit=80",{cache:"no-store"});if(!t.ok)return;const e=await t.json(),i=Array.isArray(e.entries)?e.entries:[];if(!i.length)return;this.runsJobLog=i.slice().reverse();const n=i.filter(s=>s.kind==="story_llm_request").pop();n&&n.ollamaRequest&&(this.generator.llmRequestLog={clientRequest:n.clientRequest,ollamaRequest:n.ollamaRequest,logId:n.id})}catch{}},formatRunsLogTime(t){if(!t)return"";try{return new Date(t).toLocaleTimeString()}catch{return""}},onRunsAutoRefreshChange(){this.runsAutoRefresh?this.startRunsPolling():this.stopRunsPolling(),this.saveSessionState()},syncRunsMonitorPolling(){this.runsMonitorActive&&this.runsAutoRefresh?this.startRunsPolling():this.stopRunsPolling()},startRunsPolling(){if(this.stopRunsPolling(),!this.runsAutoRefresh)return;const t=Math.max(2e3,(Number(this.runsPollIntervalSec)||5)*1e3);this._runsPollTimer=setInterval(()=>{this.runsMonitorActive&&this.refreshRuns({fromPoll:!0})},t)},stopRunsPolling(){this._runsPollTimer&&(clearInterval(this._runsPollTimer),this._runsPollTimer=null)},noteRunsActivityAfterRefresh(){if(!this.runsMonitorActive)return;const t=this.runsAll.filter(s=>s.status==="running").length,e=this.runsAll.filter(s=>s.status==="queued").length,i=this.runsActiveGpuJobs.length,n=`${t}|${e}|${i}|${this.runsAll.length}`;n!==this._runsActivityKey&&(this._runsActivityKey=n,this.appendRunsJobLog(`Activity: ${t} running, ${e} queued, ${i} GPU batch(es), ${this.runsAll.length} total`,"info"))},async launchTestRun(){if(!(this.runsLaunching||typeof fetch!="function")){this.runsLaunching=!0,this.appendRunsJobLog("Launching test job…","info");try{let t=await fetch("/api/deforum/warmup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({maxFrames:24,fps:12})}),e=t.ok?await t.json():null;if(t.ok&&e&&e.ok&&e.batchId){const i=e.status==="already_running"?"already running":"submitted";this.appendRunsJobLog(`Warmup batch ${i}: ${e.batchId}`,"info"),this.refreshRuns();return}if(t=await fetch("/api/runs/launch-demo",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),e=t.ok?await t.json():null,t.ok&&e&&e.ok&&e.run_id)this.appendRunsJobLog(`Demo run logged: ${e.run_id} (${e.status||"queued"})`,"success"),this.refreshRuns();else{const i=e&&e.error||`Launch failed (${t.status})`;this.appendRunsJobLog(i,"error"),this.runsStatus=i}}catch(t){const e=t&&t.message?t.message:String(t);this.appendRunsJobLog(`Launch error: ${e}`,"error"),this.runsStatus="Failed to launch test job"}finally{this.runsLaunching=!1}}},async refreshRuns(t={}){if(typeof fetch=="function"){t.fromPoll||(this.runsLoading=!0);try{const e=await fetch("/api/runs");if(!e.ok)return;const i=await e.json();this.runsAll=i.runs||[],this.applyRunsFilters(),this.refreshGpuPool(!0);try{const n=await fetch("/api/deforum/batches?all=1",{cache:"no-store"});if(n.ok){const s=await n.json(),r=Array.isArray(s.batches)?s.batches:[];this.deforumBatches=r,this.deforumBatchNodes=Array.isArray(s.nodes)?s.nodes:[];const l=Array.isArray(s.errors)?s.errors:[];this.deforumBatchesStatus=l.length?`Some GPUs unavailable (${l.length})`:""}else this.deforumBatches=[],this.deforumBatchNodes=[],this.deforumBatchesStatus="Deforum batches unavailable"}catch{this.deforumBatches=[],this.deforumBatchNodes=[],this.deforumBatchesStatus="Deforum batches unavailable"}if(this.deforumBatches.length){const n=i.runs||[],s=this.deforumBatches.map(l=>{const o=l.batch_id||l.id||l.batchId||"",u=String(l.status||l.state||"queued").toLowerCase(),c=l.started_at||l.created_at||l.createdAt||null,h=l.model||l.sd_model_name||l.sd_model_checkpoint||"",d=l._node||null,m=n.find(v=>v.run_id===o||v.run_id===`batch:${o}`),g=(m==null?void 0:m.frames_total)??l.max_frames??l.frame_count??l.frames??null;let b=(m==null?void 0:m.frames_done)??l.frames_done??l.frames_completed??l.current_frame??null;b==null&&typeof l.progress=="number"&&g&&(b=Math.round(l.progress*Number(g)));let w=(m==null?void 0:m.frames_progress_pct)??null;return w==null&&b!=null&&g&&(w=Math.min(100,Math.round(Number(b)/Number(g)*100))),{run_id:o?`batch:${o}`:`batch:unknown:${Math.random().toString(36).slice(2,8)}`,status:u.includes("run")||u.includes("progress")?"running":u.includes("queue")||u.includes("pending")?"queued":u.includes("cancel")?"cancelled":u,model:h,tag:"deforum-batch",started_at:c,frame_count:g,frames_total:g,frames_done:b,frames_progress_pct:w,has_thumbnail:!!(m!=null&&m.has_thumbnail),latest_frame:(m==null?void 0:m.latest_frame)??null,thumb_rev:(m==null?void 0:m.thumb_rev)??(m==null?void 0:m.latest_frame)??null,_isBatch:!0,_batch:l,_batchNode:d,_gpu:d&&d.name||d&&d.url||""}}),r=this.runsAll.filter(l=>!String(l.run_id||"").startsWith("batch:"));this.runsAll=[...s,...r]}this.applyRunsFilters(),this.runsLastRefreshedAt=Date.now(),this.runsMonitorActive&&this.refreshRunsJobLogFromServer(),this.noteRunsActivityAfterRefresh()}catch{this.runsStatus="Failed to load runs",this.runsMonitorActive&&this.appendRunsJobLog("Failed to load runs","error")}finally{t.fromPoll||(this.runsLoading=!1)}}},openMidiSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","MIDI")},openGpuSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","GPUS")},openRunsSettings(){this.switchTab("SETTINGS"),this.switchSubTab("SETTINGS","SYSTEM"),this.runsBrowserTab="active",this.refreshRuns(),this.syncRunsMonitorPolling()},openRecentRun(t){t&&(this.switchTab("RUNS"),this.showRunDetails(t))},openRunsDrawerSystem(){this.switchTab("RUNS")},openFramesInRunsPanel(){this.switchTab("RUNS"),this.setRunsBrowserTab("frames"),this.syncRunsMonitorPolling()},openFramesInRunsPanel(){this.liveBottomDrawerOpen=!0,this.liveBottomDrawerTab="SYSTEM",this.setRunsBrowserTab("frames"),this.syncRunsMonitorPolling()},applyRunsFilters(){let t=(this.runsAll||[]).filter(o=>o.status!=="running"&&o.status!=="queued");const{search:e,status:i,tag:n,model:s}=this.runsFilter;if(i&&(t=t.filter(o=>o.status===i)),n&&(t=t.filter(o=>(o.tag||"").toLowerCase().includes(n.toLowerCase()))),s&&(t=t.filter(o=>(o.model||"").toLowerCase().includes(s.toLowerCase()))),e){const o=e.toLowerCase();t=t.filter(u=>(u.run_id||"").toLowerCase().includes(o)||(u.tag||"").toLowerCase().includes(o)||(u.model||"").toLowerCase().includes(o)||(u.prompt_positive||"").toLowerCase().includes(o)||(u.notes||"").toLowerCase().includes(o))}const{field:r,order:l}=this.runsSort;t.sort((o,u)=>{let c=o[r]||"",h=u[r]||"";return typeof c=="number"&&typeof h=="number"?l==="desc"?h-c:c-h:(c=String(c).toLowerCase(),h=String(h).toLowerCase(),l==="desc"?h.localeCompare(c):c.localeCompare(h))}),this.runsFiltered=t},toggleRunSelect(t){const e=this.runsSelected.indexOf(t);e>=0?this.runsSelected.splice(e,1):this.runsSelected.push(t)},async showRunDetails(t){var e;if(t){if(this.runsDetailTab="summary",this.runsDetailJsonShowDiffOnly=!1,t._isBatch){this.runsDetailView={...t},this.frameRailRunId=null;return}if(this.frameRailRunId=t.run_id||null,typeof fetch=="function")try{const i=await fetch(`/api/runs/${t.run_id}`);if(!i.ok)return;this.runsDetailView=await i.json(),this.frameRailRunId=((e=this.runsDetailView)==null?void 0:e.run_id)||this.frameRailRunId}catch{this.runsStatus="Failed to load run details"}}},onRunRowClick(t,e){var i,n;if(t&&!((n=(i=e==null?void 0:e.target)==null?void 0:i.closest)!=null&&n.call(i,"button, a, input, select, textarea, label"))){if(e&&(e.metaKey||e.ctrlKey)){this.toggleRunSelect(t.run_id);return}this.showRunDetails(t)}},openRecentRunFromRail(t){t&&(this.switchTab("RUNS"),this.showRunDetails(t))},runPrimaryVideoUrl(t){if(!t)return"";if(t.primary_video&&t.primary_video.url)return t.primary_video.url;if(Array.isArray(t.videos)&&t.videos.length)return`/api/runs/${encodeURIComponent(t.run_id)}/video/${encodeURIComponent(t.videos[0])}`;const e=(t.outputs||[]).find(i=>i.kind==="video");return(e==null?void 0:e.url)||""},runHasOutputMaterial(t){return t?!!(t.has_video||t.has_frames||Array.isArray(t.frames)&&t.frames.length||Array.isArray(t.outputs)&&t.outputs.length):!1},async openRunMaterialInBrowser(t){if(!t)return;const e=(t.outputs||[]).find(s=>s.kind==="frames"),i=(e==null?void 0:e.browse_path)||null,n=(e==null?void 0:e.rootId)||"runs";i&&(this.openLibraryWorkspace("browser"),this.librarySubTab="BROWSER",await this.initSystemFilesBrowser(),await this.browseSystemFiles(i,{rootId:n}))},openRunVideoInEditor(t){const e=((t==null?void 0:t.outputs)||[]).find(n=>n.kind==="video");if(e!=null&&e.browse_path){this.openInVideoEditor({path:e.browse_path,rootId:e.rootId||"runs",name:e.name||"Run video"});return}const i=this.runPrimaryVideoUrl(t);i&&(this.editorPendingImportUrl=i.startsWith("http")?i:`${window.location.origin}${i}`,this.editorPendingImportPath="",this.editorPendingImportRootId="runs",this.editorFreecutRoute="projects",this.editorStatus="Ready to import run video",this.editorStatusLive=!0,this.openLibraryVideoEditor())},canKillQueuedRun(t){return!!(t&&t._isBatch&&t.status==="queued")},async killQueuedRun(t){if(typeof fetch!="function"||!this.canKillQueuedRun(t))return;const e=String(t.run_id||"").replace(/^batch:/,""),i=t._batchNode&&t._batchNode.id||"";if(e&&confirm(`Cancel queued batch ${e}?`))try{const n=i?`?nodeId=${encodeURIComponent(i)}`:"",s=await fetch(`/api/deforum/batches/${encodeURIComponent(e)}/cancel${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i?{nodeId:i}:{})}),r=await s.json().catch(()=>({}));s.ok&&r.ok!==!1?(this.runsStatus=`Cancelled batch ${e}`,await this.refreshRuns()):this.runsStatus=r.error||`Failed to cancel batch ${e}`}catch{this.runsStatus="Failed to cancel batch"}},async rerunRun(t){if(typeof fetch=="function"&&confirm(`Rerun ${t.run_id}?`))try{const i=await(await fetch(`/api/runs/${t.run_id}/rerun`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({overrides:{}})})).json();this.runsStatus=i.success?`Rerun request saved for ${t.run_id}`:i.error}catch{this.runsStatus="Failed to submit rerun"}},async deleteRun(t){if(typeof fetch=="function"&&confirm(`Delete ${t.run_id}? This cannot be undone.`))try{const i=await(await fetch(`/api/runs/${t.run_id}`,{method:"DELETE"})).json();i.success?(await this.refreshRuns(),this.runsStatus=`Deleted ${t.run_id}`):this.runsStatus=i.error}catch{this.runsStatus="Failed to delete run"}},async saveRunNotes(t){if(typeof fetch=="function")try{const i=await(await fetch(`/api/runs/${t.run_id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:t.notes})})).json();this.runsStatus=i.success?"Notes saved":i.error}catch{this.runsStatus="Failed to save notes"}},async exportRuns(t){if(typeof fetch=="function")try{const e=await fetch(`/api/runs/export?format=${t}`);if(!e.ok)return;const i=await e.blob(),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download=`runs_export.${t}`,s.click(),URL.revokeObjectURL(n)}catch{this.runsStatus="Failed to export"}},getRunProp(t,e){const i=this.runsAll.find(s=>s.run_id===t);if(!i)return"-";const n=i[e];return n==null||n===""?"-":(e==="prompt_positive"||e==="prompt_negative")&&String(n).length>80?String(n).slice(0,80)+"…":n},async exportRunComparison(t){if(this.runsSelected.length<2){this.runsStatus="Select at least 2 runs to compare";return}try{const e=await fetch("/api/runs/compare",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({run_ids:this.runsSelected,format:t})});if(!e.ok){const i=await e.json().catch(()=>({}));throw new Error(i.error||`HTTP ${e.status}`)}if(t==="csv"){const i=await e.blob(),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download="runs_comparison.csv",s.click(),URL.revokeObjectURL(n)}else{const i=await e.json(),n=new Blob([JSON.stringify(i.comparison,null,2)],{type:"application/json"}),s=URL.createObjectURL(n),r=document.createElement("a");r.href=s,r.download="runs_comparison.json",r.click(),URL.revokeObjectURL(s)}this.runsStatus=`Exported comparison (${this.runsSelected.length} runs)`}catch(e){this.runsStatus=e.message||"Compare export failed"}},formatDate(t){if(!t)return"-";try{const e=new Date(t);return e.toLocaleDateString()+" "+e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return t}},runListingId(t){return String((t==null?void 0:t.run_id)||"").replace(/^batch:/,"")},runListingThumbUrl(t){if(!t)return"";const e=this.runListingId(t);if(!e||!t.has_thumbnail&&!(Number(t.frames_done)>0)&&!t.latest_frame)return"";const i=`/api/runs/${encodeURIComponent(e)}/thumb`,n=t.thumb_rev||t.latest_frame||t.frames_done||"";return n?`${i}?v=${encodeURIComponent(n)}`:i},runFramesDone(t){if(!t)return null;if(Number.isFinite(t.frames_done))return t.frames_done;if(t._isBatch&&t._batch){const e=t._batch,i=this.runFramesTotal(t);if(Number.isFinite(e.frames_done))return e.frames_done;if(Number.isFinite(e.frames_completed))return e.frames_completed;if(Number.isFinite(e.current_frame))return e.current_frame;if(typeof e.progress=="number"&&i)return Math.round(e.progress*i)}return null},runFramesTotal(t){if(!t)return null;if(Number.isFinite(t.frames_total)&&t.frames_total>0)return t.frames_total;const e=t.frame_count??t.length_frames??null;if(Number.isFinite(e)&&e>0)return e;if(t._isBatch&&t._batch){const i=t._batch,n=i.max_frames??i.frame_count??i.frames??null;if(Number.isFinite(n)&&n>0)return n}return null},runFrameProgressPct(t){if(!t)return null;if(Number.isFinite(t.frames_progress_pct))return t.frames_progress_pct;const e=this.runFramesDone(t),i=this.runFramesTotal(t);return e!=null&&i!=null&&i>0?Math.min(100,Math.round(e/i*100)):null},runFrameProgressLabel(t){const e=this.runFramesDone(t),i=this.runFramesTotal(t);if(e==null&&i==null)return"-";const n=this.runFrameProgressPct(t),s=e??"?",r=i??"?";return n!=null?`${s}/${r} · ${n}%`:`${s}/${r}`},runWorkerName(t){return t&&(t._gpu||t._batchNode&&t._batchNode.name||t._batch&&t._batch._node&&t._batch._node.name||t.job&&t.job.snapshot&&t.job.snapshot.node&&t.job.snapshot.node.name)||"—"},runLiveFramesLabel(t){const e=this.runFramesDone(t);if(e==null)return"—";const i=this.runFramesTotal(t);return i!=null?`${e} / ${i} frames`:`${e} frames`},formatDurationShort(t){const e=Number(t);return!Number.isFinite(e)||e<0?"—":e<45?`~${Math.max(1,Math.round(e))}s left`:e<3600?`~${Math.round(e/60)}m left`:`~${(e/3600).toFixed(1)}h left`},runEtaLabel(t){if(!t)return"—";if(t.status==="queued")return"Waiting in queue";const e=this.runFramesDone(t),i=this.runFramesTotal(t);if(i!=null&&e!=null&&e>=i)return"Finishing…";if(e==null||e<=0||!i)return"Estimating…";const n=t.started_at?new Date(t.started_at).getTime():NaN;if(!Number.isFinite(n))return"Estimating…";const s=Math.max(1,(Date.now()-n)/1e3),r=e/s;if(!Number.isFinite(r)||r<=0)return"Estimating…";const l=Math.max(0,i-e);return l<=0?"Finishing…":this.formatDurationShort(l/r)},runDetailCurrentContext(){var t,e;return y0({deforumSettings:this.normalizedDeforumSettings(),forgeModel:((t=this.forge)==null?void 0:t.selectedModel)||((e=this.forge)==null?void 0:e.currentModel)})},runDetailJsonRows(t){return Xm(t,this.runDetailCurrentContext(),{diffOnly:!!this.runsDetailJsonShowDiffOnly})},runDetailJsonPretty(t){return S0(t)},runDetailJsonDiffCount(t){return Xm(t,this.runDetailCurrentContext(),{diffOnly:!0}).length},async copyRunDetailJson(t){var i;const e=this.runDetailJsonPretty(t);if(e)try{if(typeof navigator<"u"&&((i=navigator.clipboard)!=null&&i.writeText))await navigator.clipboard.writeText(e);else{const n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}this.runsStatus="Run JSON copied"}catch{this.runsStatus="Failed to copy JSON"}},layersSidebarToggle(){this.layersSidebarOpen=!this.layersSidebarOpen,this.saveSessionState()},setLiveBottomDrawerTab(t){const i=["MODULATION","CROSSFADER","SYSTEM"].includes(t)?t:"MODULATION";this.liveBottomDrawerTab=i,this.liveBottomDrawerOpen=!0,this.saveSessionState()},toggleLiveBottomDrawer(){this.liveBottomDrawerOpen=!this.liveBottomDrawerOpen,this.saveSessionState()},toggleRightPanel(){this.rightPanelOpen=!this.rightPanelOpen,this.liveDrawerOpen=this.rightPanelOpen,this.saveSessionState()},toggleEngineDrawer(){this.liveEngineDrawerOpen=!this.liveEngineDrawerOpen,this.saveSessionState()},updateSidePanelDockBounds(){this.$nextTick(()=>{if(this.sidePanelUsesEdgeDock)return;const t=this.$refs.videoStageRef;if(!t||typeof t.getBoundingClientRect!="function")return;const e=t.getBoundingClientRect();e.height<8||(this.sidePanelDockBounds={top:e.top,left:e.left,height:e.height})})},bindSidePanelDockTracking(){if(typeof window>"u")return;const t=()=>this.updateSidePanelDockBounds();if(this._sidePanelDockOnResize||(window.addEventListener("resize",t,{passive:!0}),this._sidePanelDockOnResize=t),this._sidePanelDockResizeObserver&&(this._sidePanelDockResizeObserver.disconnect(),this._sidePanelDockResizeObserver=null),typeof ResizeObserver=="function"){const e=this.$refs.videoStageRef;e&&(this._sidePanelDockResizeObserver=new ResizeObserver(t),this._sidePanelDockResizeObserver.observe(e))}t()},unbindSidePanelDockTracking(){this._sidePanelDockOnResize&&(window.removeEventListener("resize",this._sidePanelDockOnResize),this._sidePanelDockOnResize=null),this._sidePanelDockResizeObserver&&(this._sidePanelDockResizeObserver.disconnect(),this._sidePanelDockResizeObserver=null)},switchTab(t){if(t==="EDITOR"||t==="LIBRARY"){this.openLibraryWorkspace(t==="EDITOR"?"editor":"browser");return}if(t==="STREAM"){this.currentTab="SETTINGS",this.switchSubTab("SETTINGS","OUTPUT");try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","SETTINGS")}catch{}this.refreshStreamStatus(),this.saveSessionState();return}if(t==="AUDIO"){this.currentTab="AUDIO",this.currentSubTab.MODULATION="AUDIO_REACTIVE";try{typeof window<"u"&&window.localStorage&&(window.localStorage.setItem("defora_tab","AUDIO"),window.localStorage.setItem("defora_subtab_MODULATION","AUDIO_REACTIVE"))}catch{}this.saveSessionState();return}if(t==="RUNS"){this.currentTab="SETTINGS",this.currentSubTab.SETTINGS="RUNS",this.refreshRuns(),this.syncRunsMonitorPolling();try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","SETTINGS")}catch{}this.saveSessionState();return}if(t==="GENERATE"){this.currentTab="MOTION",this.motionSequencerSideOpen=!0,this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200)});try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab","MOTION")}catch{}this.saveSessionState();return}this.currentTab=t,t==="MOTION"&&this.$nextTick(()=>{this.refreshSequencerList(),setTimeout(()=>this.drawTimeline(),200)});try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_tab",t)}catch{}this.saveSessionState()},normalizeModulationSubTab(t){return t==="AUDIO"?"AUDIO_REACTIVE":t==="ACTIVE"||t==="ACTIVE_MODS"?"MAPPINGS":t==="CROSSFADER"?"LFO":["LFO","AV_SYNC","AUDIO_REACTIVE","BEAT_MACROS","MAPPINGS"].includes(t)?t:"LFO"},normalizeLiveSubTab(t){const e=["MONITOR","DEFORUM_JOB"];return t==="ADD_SOURCE"?"MONITOR":e.includes(t)?t:"MONITOR"},normalizeMotionSubTab(t){return t==="SEQUENCER"?(this.motionSequencerSideOpen=!0,"PERFORMANCE"):t==="PERFORMANCE"?t:"PERFORMANCE"},switchSubTab(t,e){if(t==="SETTINGS"&&e==="RUNS"){this.openRunsSettings();return}t==="SETTINGS"&&e==="FORGE"&&(e="GPUS"),t==="SETTINGS"&&e==="KEYS"&&(e="ENGINE"),t==="SETTINGS"&&(e==="BINDINGS"||e==="PRESETS")&&(e="MIDI"),t==="MODULATION"&&(e=this.normalizeModulationSubTab(e)),t==="LIVE"&&(e=this.normalizeLiveSubTab(e)),t==="MOTION"&&(e=this.normalizeMotionSubTab(e)),t==="LIVE"&&(e==="DEFORUM_JOB"?(this.enginePanelDetailsTab="JOB",this.liveEngineDrawerOpen||(this.liveEngineDrawerOpen=!0),this.ensureForgeSamplerSchedulerLists()):this.enginePanelDetailsTab="ENGINE"),this.currentSubTab[t]=e;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_subtab_"+t,e)}catch{}t==="PROMPTS"&&e!=="LORA"&&(this.loraPickerOpen=!1),t==="PROMPTS"&&e==="LORA"&&!this.lorasLoading&&!this.loras.available.length&&this.refreshLoras(),t==="LIVE"&&e==="ADD_SOURCE"&&(e="MONITOR",this.toggleVideoLayerAdd(!0)),t==="LIVE"&&this.videoLayerAddOpen&&!this.systemFiles._rootsLoaded&&this.initSystemFilesBrowser(),t==="SETTINGS"&&(e==="SYSTEM"&&this.refreshRuns(),this.syncRunsMonitorPolling())},setRunsBrowserTab(t){if(!(t!=="active"&&t!=="past"&&t!=="frames")){if(this.runsBrowserTab=t,t==="frames"){this.showFrames=!0;const e=this.runsDetailView;e!=null&&e.run_id&&Array.isArray(e.frames)&&e.frames.length&&(this.frameRailRunId=e.run_id),this.refreshFrames()}else(t==="active"||t==="past")&&this.refreshRuns();this.saveSessionState()}},toggleLoraCrossfaderPicker(t){t!=="A"&&t!=="B"||(this.loraCrossfaderPickerGroup=this.loraCrossfaderPickerGroup===t?null:t,this.loraCrossfaderPickerGroup&&!this.lorasLoading&&!this.loras.available.length&&this.refreshLoras())},togglePlayPause(){this.toggleDeforumPlay()},stopVideo(){this.stopDeforumPlay()},toggleDeforumPlay(){this.deforumPlaying?this.pauseDeforumAnimation():this.startDeforumAnimation()},async startDeforumAnimation(){if(!this.guardDeforumSettingsBeforeRun("start the Deforum job"))return;if(!this.deforumSessionStartedAt){const i=(this.runsActiveGpuJobs||[]).filter(n=>n.startedAt?Date.now()-new Date(n.startedAt).getTime()<36e5:!1);if(i.length){const n=Math.floor((Date.now()-new Date(i[0].startedAt).getTime())/6e4),s=n<1?"less than a minute":`${n} minute${n!==1?"s":""}`;if(!window.confirm(`A Deforum job has been running for ${s}. Stop it and start a new job?`))return}}this.applyCrossfadeMorph(),this.deforumSettings&&(this.deforumSettings.batch_name=this.session),this.persistDeforumContinuationFromLatest({queueSave:!1,saveSession:!1});const t=this.deforumContinuationStartFrameValue();this.sendControl("liveParam",{start_frame:t,should_resume:1}),this.pinHeldPreviewFrame(),this.frameRailFollowLatest=!0,this.deforumPlaying=!0,this.deforumSessionStartedAt||(this.deforumSessionStartedAt=Date.now()),this.performance.status="Deforum animation playing",this.isPlaying=!0,this.openFramesInRunsPanel(),this.scheduleFrameRefresh(0)},pauseDeforumAnimation(){this.persistDeforumContinuationFromLatest({checkpoint:!0}),this.sendControl("liveParam",{is_paused_rendering:1}),this.deforumPlaying=!1,this.performance.status="Animation paused — parameter changes update preview",this.isPlaying=!1},stopDeforumPlay(){this.persistDeforumContinuationFromLatest({checkpoint:!0}),this.sendControl("liveParam",{is_paused_rendering:1,should_resume:0}),this.deforumPlaying=!1,this.clearHeldPreviewFrame(),this.deforumSessionStartedAt=null,this.performance.status="",this.isPlaying=!1;const t=this.playerEl||document.getElementById("player");t&&(t.pause(),t.currentTime=0),this.syncFrameSelectionFromPlayback(0)},async runStartupWarmup(){var t,e;if(!(this.deforumPlaying||typeof fetch!="function")&&(e=(t=this.apiStatus)==null?void 0:t.sdForge)!=null&&e.available)try{const i=await fetch("/api/deforum/warmup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({maxFrames:48,fps:12})});if(!i.ok)return;const n=await i.json();n.ok&&n.status!=="already_running"&&(this.performance.status="Startup clip generating… (WebGL stays visible until frames arrive)")}catch{}},async toggleStreamRecord(){if(this.isRecording){this.isRecording=!1;try{const e=await(await fetch("/api/stream/stop-record",{method:"POST"})).json();this.performance.status=e.success?"Recording stopped":e.error||"Stop failed"}catch{this.performance.status="Stop record failed"}}else{this.isRecording=!0;const t=`/tmp/defora_rec_${Date.now()}.mp4`;try{const i=await(await fetch("/api/stream/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({output:t,fps:24})})).json(),n=String(i.error||i.message||"").trim();this.performance.status=i.success?`Recording → ${t}`:n.includes("python")?"Recording unavailable (Python not installed on server)":n||"Record failed",i.success||(this.isRecording=!1)}catch(e){this.isRecording=!1;const i=String(e.message||e);this.performance.status=i.includes("python")?"Recording unavailable (Python not installed on server)":"Record failed"}}},async toggleRecord(){return this.toggleStreamRecord()},newStreamDestination(t="rtmp"){const e=["rtmp","srt","whip"].includes(t)?t:"rtmp",i={rtmp:"Custom RTMP",srt:"Custom SRT",whip:"Custom WHIP"},{width:n,height:s}=this.currentResolution();return{id:`stream_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,name:i[e]||"Custom Stream",protocol:e,target:"",fps:Number(this.generator&&this.generator.fps)||24,resolution:`${n}x${s}`,overlay:"",transition:"",kbps:null,health:"idle"}},normalizeStreamDestination(t,e=0){const i=t&&typeof t=="object"?t:{};return{id:i.id?String(i.id):`stream_saved_${e}`,name:String(i.name||"Custom Stream"),protocol:["rtmp","srt","whip"].includes(i.protocol)?i.protocol:"rtmp",target:String(i.target||"").trim(),fps:Number(i.fps)||24,resolution:String(i.resolution||"1024x576"),overlay:String(i.overlay||""),transition:String(i.transition||""),kbps:Number.isFinite(Number(i.kbps))?Number(i.kbps):null,health:String(i.health||"idle")}},addStreamDestination(t="rtmp"){const e=this.newStreamDestination(t);return this.streaming.destinations.push(e),this.saveSessionState(),e},streamDestinationViewUrl(t){const e=String(t&&t.target||"").trim();if(/^https?:\/\//i.test(e))return e;const i=String(this.hlsStreamHref||"/hls/live/deforum.m3u8");return typeof window<"u"&&window.location&&window.location.origin?`${window.location.origin}${i.startsWith("/")?i:`/${i}`}`:i},applyStreamMetricsToDestinations(t={}){const e=!!(t&&t.running),i=this.streaming.activeDestinationId,n=Number.isFinite(Number(t&&t.kbps))?Number(t.kbps):null,s=Number.isFinite(Number(t&&t.fps))?Number(t.fps):null,r=String(t&&t.health||(e?"healthy":"offline"));this.streaming.destinations=(this.streaming.destinations||[]).map(l=>e&&i===l.id?{...l,kbps:n,fps:s||l.fps,health:r}:l.health==="healthy"||l.health==="degraded"?{...l,health:"idle",kbps:null}:l)},removeStreamDestination(t){this.streaming.destinations=this.streaming.destinations.filter(e=>e.id!==t),this.streaming.activeDestinationId===t&&(this.streaming.activeDestinationId=null),this.saveSessionState()},async refreshStreamStatus(){try{const e=await(await fetch("/api/stream/status",{cache:"no-store"})).json(),i=e.metrics&&typeof e.metrics=="object"?e.metrics:{};if(this.streaming.activeStatus=e.status||i.status||"unknown",this.streaming.status=(e.output||"").trim()||(this.streaming.activeStatus==="running"?"Outbound stream is running.":"No outbound stream running."),this.streaming.activeStatus!=="running")this.streaming.activeDestinationId=null,this.applyStreamMetricsToDestinations({running:!1,health:"offline"});else{if(!this.streaming.activeDestinationId&&i.target){const s=(this.streaming.destinations||[]).find(r=>String(r.target||"").trim()===String(i.target).trim());s&&(this.streaming.activeDestinationId=s.id)}this.applyStreamMetricsToDestinations(i)}}catch(t){this.streaming.activeStatus="error",this.streaming.status=t.message||"Failed to read stream status",this.applyStreamMetricsToDestinations({running:!1,health:"error"})}},async startStreamDestination(t){const e=this.streaming.destinations.find(n=>n.id===t);if(!e)return;const i=String(e.target||"").trim();if(!i){this.streaming.status="Destination URL is required.";return}try{const n=await fetch("/api/stream/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({target:i,fps:Number(e.fps)||24,resolution:e.resolution||void 0,protocol:e.protocol||void 0,overlay:e.overlay?String(e.overlay).trim():void 0,transition:e.transition?String(e.transition).trim():void 0})}),s=await n.json();if(!n.ok||!s.success)throw new Error(s.error||s.message||"Could not start outbound stream");this.streaming.activeDestinationId=t,this.streaming.activeStatus="running",this.streaming.status=(s.message||"").trim()||`Streaming to ${e.name}`,this.streamUrl=i,e.health="healthy",this.saveSessionState(),this.refreshStreamStatus()}catch(n){this.streaming.activeStatus="error",this.streaming.status=n.message||"Could not start outbound stream";const s=this.streaming.destinations.find(r=>r.id===t);s&&(s.health="error")}},async stopOutboundStream(){try{const t=await fetch("/api/stream/stop",{method:"POST"}),e=await t.json();if(!t.ok||!e.success)throw new Error(e.error||e.message||"Could not stop outbound stream");this.streaming.activeDestinationId=null,this.streaming.activeStatus="stopped",this.streaming.status=(e.message||"").trim()||"Outbound stream stopped.",this.applyStreamMetricsToDestinations({running:!1,health:"offline"}),this.saveSessionState()}catch(t){this.streaming.activeStatus="error",this.streaming.status=t.message||"Could not stop outbound stream"}},normalizeDefaultAnimationSettings(t={}){const e=t&&typeof t=="object"?t:{},i=["instancing","volume","orbital","nebula","raycast","marching","ocean","customlights","transition","protoplanet","periodic_table"].includes(e.mode)?e.mode:"customlights";return{preferDeforumVideo:!!e.preferDeforumVideo,showStandbyClip:!!e.showStandbyClip,autoTransitionToDeforum:e.autoTransitionToDeforum!==!1,mode:i,instCount:Math.max(1e3,Math.min(5e4,Math.round(Number(e.instCount)||12e3))),beamCount:Math.max(3,Math.min(12,Math.round(Number(e.beamCount)||7))),speed:Math.max(.1,Math.min(2.5,Number(e.speed)||.75)),spread:Math.max(.2,Math.min(2.5,Number(e.spread)||.68)),glow:Math.max(.1,Math.min(1.4,Number(e.glow)||.78)),hue:Math.max(0,Math.min(1,Number.isFinite(Number(e.hue))?Number(e.hue):.6)),pulse:Math.max(0,Math.min(1,Number.isFinite(Number(e.pulse))?Number(e.pulse):.36)),drift:Math.max(0,Math.min(1,Number.isFinite(Number(e.drift))?Number(e.drift):.44)),mist:Math.max(0,Math.min(1,Number.isFinite(Number(e.mist))?Number(e.mist):.58)),orbit:Math.max(0,Math.min(1,Number.isFinite(Number(e.orbit))?Number(e.orbit):.52)),lineType:e.lineType==="line"?"line":"segments",lineWidth:Math.max(1,Math.min(10,Number(e.lineWidth)||2.4)),lineThreshold:Math.max(0,Math.min(10,Number.isFinite(Number(e.lineThreshold))?Number(e.lineThreshold):.8)),lineTranslation:Math.max(0,Math.min(10,Number.isFinite(Number(e.lineTranslation))?Number(e.lineTranslation):0)),lineWorldUnits:e.lineWorldUnits!==!1,lineVisualizeThreshold:!!e.lineVisualizeThreshold,lineAlphaToCoverage:e.lineAlphaToCoverage!==!1,lineAnimate:e.lineAnimate!==!1,mcMaterial:["shiny","chrome","liquid","matte","flat","plastic","colors","multiColors"].includes(e.mcMaterial)?e.mcMaterial:"shiny",mcNumBlobs:Math.max(1,Math.min(50,Math.round(Number(e.mcNumBlobs)||10))),mcResolution:Math.max(14,Math.min(100,Math.round(Number(e.mcResolution)||28))),mcIsolation:Math.max(10,Math.min(300,Math.round(Number(e.mcIsolation)||80))),mcFloor:e.mcFloor!==!1,mcWallX:!!e.mcWallX,mcWallZ:!!e.mcWallZ,ocElevation:Math.max(0,Math.min(90,Number(e.ocElevation)||2)),ocAzimuth:Math.max(-180,Math.min(180,Number.isFinite(Number(e.ocAzimuth))?Number(e.ocAzimuth):180)),ocExposure:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocExposure))?Number(e.ocExposure):.1)),ocDistortion:Math.max(0,Math.min(8,Number.isFinite(Number(e.ocDistortion))?Number(e.ocDistortion):3.7)),ocSize:Math.max(.1,Math.min(10,Number.isFinite(Number(e.ocSize))?Number(e.ocSize):1)),ocCloudCoverage:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudCoverage))?Number(e.ocCloudCoverage):.4)),ocCloudDensity:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudDensity))?Number(e.ocCloudDensity):.5)),ocCloudElevation:Math.max(0,Math.min(1,Number.isFinite(Number(e.ocCloudElevation))?Number(e.ocCloudElevation):.5)),forgeLayerOpacity:Math.max(0,Math.min(1,Number.isFinite(Number(e.forgeLayerOpacity))?Number(e.forgeLayerOpacity):0)),rememberCompositorLayerOnStartup:!!e.rememberCompositorLayerOnStartup,previewCompositorCrossfadeMs:Math.max(0,Math.min(5e3,Math.round(Number(e.previewCompositorCrossfadeMs)||800))),forgeLayerOpacityLfoLink:(()=>{const n=Number(e.forgeLayerOpacityLfoLink);return n>=1&&n<=6?n:null})(),forgeLayerOpacityLfoBase:Math.max(0,Math.min(1,Number.isFinite(Number(e.forgeLayerOpacityLfoBase))?Number(e.forgeLayerOpacityLfoBase):Number(e.forgeLayerOpacity)||0)),deforumBackdropEnabled:e.deforumBackdropEnabled!==!1,deforumBackdropMix:Math.max(0,Math.min(1,Number.isFinite(Number(e.deforumBackdropMix))?Number(e.deforumBackdropMix):.35)),txTransition:Math.max(0,Math.min(1,Number.isFinite(Number(e.txTransition))?Number(e.txTransition):.5)),txTransitionAnimate:e.txTransitionAnimate!==!1,txSceneAnimate:e.txSceneAnimate!==!1,txUseTexture:e.txUseTexture!==!1,txTexture:Math.max(0,Math.min(5,Math.round(Number(e.txTexture)||0))),txCycle:e.txCycle!==!1,txThreshold:Math.max(0,Math.min(1,Number.isFinite(Number(e.txThreshold))?Number(e.txThreshold):.1)),...Ao(e),ppRestartSerial:Math.max(0,Math.round(Number(e.ppRestartSerial)||0)),...Co(e)}},restartProtoplanetSimulation(){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,ppRestartSerial:(Number(this.defaultAnimation.ppRestartSerial)||0)+1}),this.saveSessionState()},onDefaultAnimationInput(){this.defaultAnimation=this.normalizeDefaultAnimationSettings(this.defaultAnimation),this.saveSessionState()},liveParamCanonicalKey(t){return t&&(this.liveParamAliases[t]||t)},liveHudParamByKey(t){return[...this.liveVibe,...this.liveCam].find(e=>e.key===t)||null},paramControlMeta(t){var s;const e=this.liveParamCanonicalKey(t);let i=this.liveHudParamByKey(t);if(!i){const r=(s=Object.entries(this.liveParamAliases).find(([,l])=>l===t||l===e))==null?void 0:s[0];r&&(i=this.liveHudParamByKey(r))}if(i)return{min:Number(i.min??0),max:Number(i.max??1),step:Number(i.step??.01)||.01,routeKey:e,hud:i,value:Number(i.val??0)};const n=this.modulationTargetByKey(e)||this.modulationTargetByKey(t);if(n){let r=Number(n.default??0);if(n.field&&this.defaultAnimation){const l=Number(this.defaultAnimation[n.field]);Number.isFinite(l)&&(r=l)}else n.key==="translation_x"?r=Number(this.motionPadValues.translation_x??0):n.key==="translation_y"?r=Number(this.motionPadValues.translation_y??0):n.key==="translation_z"?r=Number(this.motionPadValues.translation_z??0):n.key==="zoom_2d"&&(r=Number(this.motionPadValues.zoom??1));return{min:Number(n.min??0),max:Number(n.max??1),step:Number(n.step??.01)||.01,routeKey:n.key,hud:null,value:r}}return{min:0,max:1,step:.01,routeKey:e,hud:null,value:0}},clampParamToMeta(t,e){const i=Number((e==null?void 0:e.min)??0),n=Number((e==null?void 0:e.max)??1),s=Number((e==null?void 0:e.step)??.01)||.01;let r=this.clampVal(Number(t),i,n);if(s>0){r=Math.round(r/s)*s;const l=(String(s).split(".")[1]||"").length;l>0&&(r=Number(r.toFixed(l)))}return r},syncHudMotionFromParam(t,e){const i=Number(e);Number.isFinite(i)&&(t==="panx"?this.motionPadValues.translation_x=i:t==="pany"?this.motionPadValues.translation_y=i:t==="zoom"&&(this.motionPadValues.zoom=i))},modulationTargetByKey(t){if(!t)return null;const e=this.liveParamCanonicalKey(t);return this.lfoTargets.find(i=>i.key===e||i.key===t)||this.animationTargets.find(i=>i.key===e||i.key===t)||null},isAnimationModKey(t){return typeof t=="string"&&t.startsWith("anim_")},applyAnimationModulation(t,e){t&&(this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,[t]:e}))},routeModulationValue(t,e,i,n){const s=J0(t);if(s){this.writeCommonVisualValue(s.pluginId,s.paramId,e);return}if(String(t).startsWith("wan.")){this.onWanEngineFieldChange(String(t).slice(4),e,"number");return}const r=this.animationTargets.find(l=>l.key===t);if(r){this.applyAnimationModulation(r.field,e);return}if(t.startsWith("cn_")){const l=t.split("_"),o=l[1],u=l[2],c=this.cn.slots.find(h=>h.id===o);c&&(u==="weight"?c.weight=e:u==="start"?c.start=e:u==="end"&&(c.end=e),n[o]=c);return}i[t]=e},readCommonVisualValue(t,e){var s,r,l;const i=Od(t,e),n=Tu.find(o=>o.id===e);if(!n||i.type==="disabled")return(n==null?void 0:n.default)??0;if(i.type==="animation"){const o=i.field,u=Number((s=this.defaultAnimation)==null?void 0:s[o]);return Number.isFinite(u)?u:n.default}if(i.type==="schedule"){const o=Gm((r=this.deforumSettings)==null?void 0:r[i.key],0),u=Number(o);return Number.isFinite(u)?u:n.default}if(i.type==="wan"){const o=Number((l=this.wanEngine)==null?void 0:l[i.key]);return Number.isFinite(o)?o:n.default}return n.default},writeCommonVisualValue(t,e,i){const n=Od(t,e);if(n.type==="disabled")return;const s=Tu.find(o=>o.id===e),r=Number(i);if(!Number.isFinite(r)||!s)return;const l=this.clampVal(r,s.min,s.max);if(n.type==="animation"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,[n.field]:l}),this.saveSessionState();return}if(n.type==="schedule"){this.onDeforumFieldInput(n.key,`0:(${l})`,"text");return}n.type==="wan"&&this.onWanEngineFieldChange(n.key,l,"number")},onCommonVisualInput(t,e,i){const n=i||this.activeAnimationPluginId;n&&this.writeCommonVisualValue(n,t,e)},commonVisualItemsForPlugin(t){return t?Tu.map(e=>{const i=!Z0(t,e.id),n=i?e.default:this.readCommonVisualValue(t,e.id),s=Number.isFinite(n)?Math.abs(n)>=10?n.toFixed(1):n.toFixed(2):"—";return{...e,paramId:e.id,value:n,readout:s,disabled:i}}):[]},setDefaultAnimationMode(t){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,mode:t}),this.saveSessionState()},resetDefaultAnimationSettings(){const t=!!(this.defaultAnimation&&this.defaultAnimation.preferDeforumVideo);this.defaultAnimation=this.normalizeDefaultAnimationSettings({preferDeforumVideo:t}),this.saveSessionState()},setPreferDeforumVideo(t){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:t}),t?(this.isForgeAnimationLayerActive||(this.activeVideoLayerId="deforum"),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer()):this.isForgeAnimationLayerActive&&(this.activeVideoLayerId="webgl"),this.saveSessionState()},async loadStandbyPreviewVideo(){try{if(!(await fetch("/api/preview/standby-video",{method:"HEAD"})).ok)return;this.standbyPreviewVideoUrl="/api/preview/standby-video",this.$nextTick(()=>this.attachStandbyPreview())}catch{}},attachStandbyPreview(){const t=this.$refs.standbyPreviewEl;!t||!this.standbyPreviewVideoUrl||typeof t.play=="function"&&t.play().catch(()=>{})},setHlsPreviewStreamValid(t){this.hlsPreviewStreamValid=!!t},enableHlsWatch(){this.hlsPreviewStreamValid&&(this.hlsWatchEnabled||(this.hlsWatchEnabled=!0,this.videoReady=!1,this.attachPlayer(),this.saveSessionState()))},disableHlsWatch(){this.hlsWatchEnabled&&(this.hlsWatchEnabled=!1,this.detachHlsPlayer(),this.saveSessionState())},detachHlsPlayer(){const t=this.playerEl||document.getElementById("player");t&&(this.detachPlayerListeners(t),typeof t.pause=="function"&&t.pause(),t.removeAttribute("src"),typeof t.load=="function"&&t.load()),this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),this.videoReady=!1,this.markVideoReady(!1)},rebuildVideoLayers(){const t=Array.isArray(this.videoLayers)?this.videoLayers:[],e=s=>{const r=t.find(l=>l&&l.id===s);return r?r.previewVisible!==!1:!0},i=(s,r)=>{var o;const l=t.find(u=>u&&u.id===s);if(l&&Number.isFinite(Number(l.opacity)))return Math.max(0,Math.min(1,Number(l.opacity)));if(r==="deforum"||r==="wan"||r==="animatelcm"||r==="svd"||r==="blend"){const u=Number((o=this.defaultAnimation)==null?void 0:o.forgeLayerOpacity);return Number.isFinite(u)?Math.max(0,Math.min(1,u)):0}return r==="webgl"?1:0},n=(this.liveSources||[]).map(s=>({id:s.id,kind:s.type==="cloud"?"cloud":"library",label:s.label||"Source",playbackUrl:s.playbackUrl||null,url:s.url||null,builtin:!1,previewVisible:!0,opacity:1}));this.videoLayers=[{id:"webgl",kind:"webgl",label:"WebGL",builtin:!0,previewVisible:e("webgl"),opacity:i("webgl","webgl")},{id:"deforum",kind:"deforum",label:"Deforum",builtin:!0,previewVisible:e("deforum"),opacity:i("deforum","deforum")},{id:"wan",kind:"wan",label:"WAN Video",builtin:!0,previewVisible:e("wan"),opacity:i("wan","wan")},{id:"animatelcm",kind:"animatelcm",label:"AnimateLCM",builtin:!0,previewVisible:e("animatelcm"),opacity:i("animatelcm","animatelcm")},{id:"svd",kind:"svd",label:"SVD",builtin:!0,previewVisible:e("svd"),opacity:i("svd","svd")},{id:"input",kind:"input",label:this.inputLayerLabel||"Input",playbackUrl:this.inputLayerPlaybackUrl||null,builtin:!0,previewVisible:e("input"),opacity:i("input","input")},...n]},findVideoLayer(t){return(this.videoLayers||[]).find(e=>e&&e.id===t)||null},readVideoLayerOpacity(t){var i;if(!t)return 1;const e=Number(t.opacity);if(Number.isFinite(e))return Math.max(0,Math.min(1,e));if(t.kind==="deforum"||t.kind==="wan"||t.kind==="animatelcm"||t.kind==="svd"||t.kind==="blend"){const n=Number((i=this.defaultAnimation)==null?void 0:i.forgeLayerOpacity);return Number.isFinite(n)?Math.max(0,Math.min(1,n)):0}return 1},layerKindVisible(t){const e=(this.videoLayers||[]).find(i=>i&&i.kind===t);return e?!(!this.isVideoLayerPreviewVisible(e)||this.readVideoLayerOpacity(e)<=.001):!0},videoLayerRenderStyle(t){const e=this.findVideoLayer(t);if(!e||!this.isVideoLayerPreviewVisible(e))return{opacity:"0",visibility:"hidden",pointerEvents:"none"};const i=this.readVideoLayerOpacity(e);return i<=.001?{opacity:"0",visibility:"hidden",pointerEvents:"none"}:{opacity:String(i),visibility:"visible"}},setVideoLayerOpacity(t,e){const i=this.findVideoLayer(t);if(!i||!i.builtin)return;const n=Math.max(0,Math.min(1,Number(e)));i.opacity=n,i.kind==="deforum"||i.kind==="wan"||i.kind==="animatelcm"||i.kind==="svd"||i.kind==="blend"?this.applyForgeLayerOpacity(n,{commitBase:!0}):this.saveSessionState()},isVideoLayerPreviewVisible(t){return!!(t&&t.previewVisible!==!1)},toggleVideoLayerPreview(t){const e=this.findVideoLayer(t);if(!(!e||!e.builtin)){if(e.previewVisible=e.previewVisible===!1,e.previewVisible===!1&&this.activeVideoLayerId===t){const i=(this.videoLayers||[]).find(n=>n&&n.builtin&&n.id!==t&&n.previewVisible!==!1);i&&this.selectVideoLayer(i.id)}this.saveSessionState()}},videoLayerStatusShort(t){const e=this.layerStatus(t);return e==="green"?"Ready":e==="yellow"?"Loading":"Offline"},toggleEnginePanelDetails(t){const e=typeof t=="boolean"?t:!this.enginePanelDetailsOpen;this.enginePanelDetailsOpen=e,this.liveAnimationBoxOpen=e,e&&this.enginePanelDetailsTab==="JOB"&&this.ensureForgeSamplerSchedulerLists(),this.saveSessionState()},setEnginePanelDetailsTab(t){t!=="ENGINE"&&t!=="JOB"||(this.enginePanelDetailsTab=t,this.currentSubTab.LIVE=t==="JOB"?"DEFORUM_JOB":"MONITOR",this.currentTab==="LIVE"&&!this.liveEngineDrawerOpen&&(this.liveEngineDrawerOpen=!0),t==="JOB"&&this.ensureForgeSamplerSchedulerLists(),this.saveSessionState())},openEngineControlsInRightPanel(){this.setEnginePanelDetailsTab("ENGINE")},async probeHlsPreviewStream(){if(typeof fetch=="function")try{const t=String(this.streamSrc||"/hls/live/deforum.m3u8"),e=t.includes("?")?`${t}&probe=${Date.now()}`:`${t}?probe=${Date.now()}`;(await fetch(e,{method:"GET",cache:"no-store"})).ok&&this.setHlsPreviewStreamValid(!0)}catch{}},async preloadDeforumPipeline({force:t=!1}={}){var i,n,s;if(this._preloadDeforumStarted&&!t)return;this._preloadDeforumStarted=!0,this.deforumPreloadStatus="Preparing Deforum…",this.ensureForgeSamplerSchedulerLists(),this.probeHlsPreviewStream(),this.deforumPlaying||this.scheduleDeforumPreview(),!!((n=(i=this.apiHealth)==null?void 0:i.sdForge)!=null&&n.available||(s=this.forge)!=null&&s.available)?(await this.runStartupWarmup(),this.deforumPreloadStatus=this.deforumGeneratedFrameCount>0?"Deforum ready":"Deforum warming up in background"):this.deforumPreloadStatus="Waiting for Forge…"},initVideoLayers(){var n,s;this.rebuildVideoLayers();const t=new Set(this.videoLayers.map(r=>r.id));!!((n=this.defaultAnimation)!=null&&n.rememberCompositorLayerOnStartup)&&!!((s=this.defaultAnimation)!=null&&s.preferDeforumVideo)&&t.has("deforum")?this.activeVideoLayerId="deforum":t.has(this.activeVideoLayerId)||(this.activeVideoLayerId="webgl"),this.$nextTick(()=>{this.showLayerInputVideo&&this.attachInputVideo(this.activeLayerPlaybackUrl)})},ensureStandbyAnimationAtStartup(){var s,r,l;const t=!!((s=this.defaultAnimation)!=null&&s.rememberCompositorLayerOnStartup),e=t&&!!((r=this.defaultAnimation)!=null&&r.preferDeforumVideo),i=this.deforumPlaying&&this.videoReady;!e&&!i&&this.activeVideoLayerId!=="webgl"&&!this.isBlendLayerActive&&(this.activeVideoLayerId="webgl");const n=this.findVideoLayer("webgl");n&&!t&&(n.previewVisible=!0,(!Number.isFinite(Number(n.opacity))||Number(n.opacity)<=0)&&(n.opacity=1)),(l=this.defaultAnimation)!=null&&l.mode||(this.defaultAnimation=this.normalizeDefaultAnimationSettings(this.defaultAnimation)),this.$nextTick(()=>this.kickstandbyAnimation())},pinHeldPreviewFrame(){const t=this.activePreviewStillPath||this.displayedPreviewStillPath;t&&(this.heldPreviewFramePath=t)},clearHeldPreviewFrame(){this.heldPreviewFramePath=""},clearFrameThumbLoadingState(){this.frameThumbLoadingKeys={}},markFrameThumbLoading(t){const e=this.frameSrcKey(t);if(!e)return;const i=this.frameThumbLoadingKeys||{};i[e]||(this.frameThumbLoadingKeys={...i,[e]:!0})},markFrameThumbLoaded(t){const e=this.frameSrcKey(t);if(!e||!this.frameThumbLoadingKeys[e])return;const i={...this.frameThumbLoadingKeys};delete i[e],this.frameThumbLoadingKeys=i},isFrameThumbLoading(t){const e=this.frameSrcKey(t&&(t.src||t.url||t.path||""));return!!e&&!!this.frameThumbLoadingKeys[e]},onFrameThumbImageLoad(t){this.markFrameThumbLoaded(t&&(t.src||t.url||t.path||""))},onFrameThumbImageError(t){this.markFrameThumbLoaded(t&&(t.src||t.url||t.path||""))},onPreviewStillImageLoad(){this.markFrameThumbLoaded(this.displayedPreviewStillPath)},onPreviewStillImageError(){this.markFrameThumbLoaded(this.displayedPreviewStillPath)},applyNewGeneratedFrames(t){const e=this.frameStripThumbs,i=e.length;if(!(i<=t)){for(let n=t;n{!s||!s.builtin||s.id!=="webgl"&&(s.kind==="deforum"||s.kind==="wan"||s.kind==="animatelcm"||s.kind==="svd"||s.kind==="blend"?(s.opacity=0,s.id!=="deforum"&&(s.previewVisible=!1)):s.kind==="input"&&(s.opacity=0))}),this.applyForgeLayerOpacity(0,{commitBase:!0})}this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:t?this.defaultAnimation.preferDeforumVideo:!1,autoTransitionToDeforum:((i=this.defaultAnimation)==null?void 0:i.autoTransitionToDeforum)!==!1}),this.$nextTick(()=>this.kickstandbyAnimation())},applyContextPanelStartupDefaults(){var i,n;let t=!1;try{const s=(i=window.localStorage)==null?void 0:i.getItem(this.sessionStorageKey());if(s){const r=JSON.parse(s);t=typeof r.rightPanelOpen=="boolean"||typeof r.liveDrawerOpen=="boolean"}}catch{}t||(this.rightPanelOpen=!0,this.liveDrawerOpen=!0);let e="LIVE";try{e=((n=window.localStorage)==null?void 0:n.getItem("defora_tab"))||"LIVE"}catch{}e==="LIVE"&&!this.libraryWorkspaceOpen&&this.switchTab("MODULATION")},promoteToDeforum(){this.selectVideoLayer("deforum",{userInitiated:!0})},setDeforumControlTab(t="settings"){["settings","motion","macros"].includes(t)&&(this.deforumControlTab=t,this.saveSessionState())},openEngineDeforumSettingsTab(t="canvas"){const i=(this.deforumLayerFieldGroups||[]).map(n=>n.id).includes(t)?t:"canvas";this.liveEngineDrawerOpen=!0,this.promoteToDeforum(),this.deforumControlTab="settings",this.deforumActiveTab=i,this.saveSessionState()},applyForgeLayerOpacity(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);this.defaultAnimation.forgeLayerOpacity=n,(e||!i)&&(this.defaultAnimation.forgeLayerOpacityLfoBase=n),(this.videoLayers||[]).forEach(s=>{s&&(s.kind==="deforum"||s.kind==="wan"||s.kind==="animatelcm"||s.kind==="svd"||s.kind==="blend")&&(s.opacity=n)}),i||this.onDefaultAnimationInput(),this.syncDeforumBackdropToWebGL()},syncDeforumBackdropToWebGL(){var o,u;const t=this.$refs.threeBackgroundRef;if(!t||typeof t.setDeforumBackdropFromUrl!="function")return;if(((o=this.defaultAnimation)==null?void 0:o.deforumBackdropEnabled)===!1){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}if(!(this.isWebglLayerActive||this.isBlendLayerActive)){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}const i=(this.thumbs||[]).slice(-1)[0],n=i&&(i.src||i.url||i.path);if(!n){typeof t.clearDeforumBackdrop=="function"&&t.clearDeforumBackdrop();return}const s=this.clampVal(Number(((u=this.defaultAnimation)==null?void 0:u.deforumBackdropMix)??.35),0,1),r=this.effectiveForgeLayerOpacity,l=this.isBlendLayerActive?s*(1-r):s;t.setDeforumBackdropFromUrl(n,{opacity:l})},setForgeLayerOpacityLfoLink(t){const e=Number(t||0),i=e>=1&&e<=6?e:null;if(this.defaultAnimation.forgeLayerOpacityLfoLink=this.defaultAnimation.forgeLayerOpacityLfoLink===i?null:i,this.defaultAnimation.forgeLayerOpacityLfoBase=this.defaultAnimation.forgeLayerOpacity,this.defaultAnimation.forgeLayerOpacityLfoLink){const n=this.lfos.find(s=>s.id===this.defaultAnimation.forgeLayerOpacityLfoLink);n&&(n.on=!0),this.isForgeAnimationLayerActive||this.selectVideoLayer("deforum",{userInitiated:!1})}this.onDefaultAnimationInput()},maybePromoteDeforumPreview(){(this.defaultAnimation||{}).autoTransitionToDeforum!==!1&&(this._userPickedPreviewLayer||this.activeVideoLayerId==="webgl"&&(!this.deforumPlaying&&!this.deforumGeneratedFrameCount||this.selectVideoLayer("deforum",{userInitiated:!1})))},kickstandbyAnimation(t=0){const e=this.$refs.threeBackgroundRef;if(e&&typeof e.ensureRunning=="function"){e.ensureRunning();return}t<30&&typeof requestAnimationFrame=="function"&&requestAnimationFrame(()=>this.kickstandbyAnimation(t+1))},selectVideoLayer(t,e={}){if(!this.videoLayers.find(n=>n.id===t))return;e.userInitiated!==!1&&(this._userPickedPreviewLayer=!0),this.activeVideoLayerId=t;const i=this.activeVideoLayer;if((i==null?void 0:i.kind)==="webgl"){this.setPreferDeforumVideo(!1),this.clearHeldPreviewFrame(),this.kickstandbyAnimation();return}if((i==null?void 0:i.kind)==="blend"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.kickstandbyAnimation(),this.saveSessionState();return}if((i==null?void 0:i.kind)==="deforum"){this.setPreferDeforumVideo(!0),this.deforumPlaying||(this.scheduleDeforumPreview(),this.preloadDeforumPipeline());return}if((i==null?void 0:i.kind)==="wan"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview(),this.saveSessionState();return}if((i==null?void 0:i.kind)==="wan"){this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!0}),this.videoReady=!1,this.hlsWatchEnabled&&this.attachPlayer(),this.queueDeforumSettingsSave(),this.saveSessionState();return}this.defaultAnimation=this.normalizeDefaultAnimationSettings({...this.defaultAnimation,preferDeforumVideo:!1}),(i!=null&&i.playbackUrl||(i==null?void 0:i.kind)==="input"&&this.inputLayerPlaybackUrl)&&this.$nextTick(()=>this.attachInputVideo(this.activeLayerPlaybackUrl)),this.saveSessionState()},toggleVideoLayerAdd(t){const e=typeof t=="boolean"?t:!this.videoLayerAddOpen;this.videoLayerAddOpen=e,e&&!this.systemFiles._rootsLoaded&&this.initSystemFilesBrowser(),this.saveSessionState()},_buildSceneSnapshot(t){return{name:t,layers:(this.videoLayers||[]).map(e=>({id:e.id,kind:e.kind,opacity:typeof e.opacity=="number"?e.opacity:1,previewVisible:e.previewVisible!==!1})),activeLayerId:this.activeVideoLayerId}},syncLayerCompositing(){this.$nextTick(()=>{typeof this.onDefaultAnimationInput=="function"&&this.onDefaultAnimationInput()})},_applySceneSnapshot(t){!t||!Array.isArray(t.layers)||((this.videoLayers||[]).forEach(e=>{const i=t.layers.find(n=>n.id===e.id);i&&(e.opacity=typeof i.opacity=="number"?i.opacity:e.opacity,e.previewVisible=i.previewVisible!==!1)}),t.activeLayerId&&(this.activeVideoLayerId=t.activeLayerId),this.syncLayerCompositing(),this.saveSessionState())},saveScene(t,e=!1){const i=(t||"").trim()||"scene",n=this._buildSceneSnapshot(i),s=Array.isArray(this.savedScenes)?[...this.savedScenes]:[],r=s.findIndex(l=>l.name===i);r>=0?s[r]=n:s.push(n),this.savedScenes=s,e&&(this.defaultSceneName=i);try{localStorage.setItem("defora_scenes",JSON.stringify({scenes:s,defaultSceneName:this.defaultSceneName}))}catch{}this.saveSessionState()},loadScene(t){const e=(this.savedScenes||[]).find(i=>i.name===t);e&&this._applySceneSnapshot(e)},deleteScene(t){this.savedScenes=(this.savedScenes||[]).filter(e=>e.name!==t),this.defaultSceneName===t&&(this.defaultSceneName="default");try{localStorage.setItem("defora_scenes",JSON.stringify({scenes:this.savedScenes,defaultSceneName:this.defaultSceneName}))}catch{}this.saveSessionState()},initDefaultScene(){try{const t=localStorage.getItem("defora_scenes");if(t){const e=JSON.parse(t);if(Array.isArray(e.scenes)&&e.scenes.length){this.savedScenes=e.scenes,this.defaultSceneName=e.defaultSceneName||"default";const i=e.scenes.find(n=>n.name===(e.defaultSceneName||"default"));if(i){this._applySceneSnapshot(i);return}}}}catch{}(this.videoLayers||[]).forEach(t=>{t.id==="webgl"?(t.opacity=1,t.previewVisible=!0):t.id==="deforum"?(t.opacity=0,t.previewVisible=!0):t.id==="wan"?(t.opacity=0,t.previewVisible=!1):(t.previewVisible=!1,t.opacity=0)}),this.applyForgeLayerOpacity(0,{commitBase:!0}),this.syncLayerCompositing()},closeVideoLayer(t){t==="webgl"||t==="deforum"||t==="wan"||t==="blend"||t==="input"||(this.removeLiveSource(t),this.activeVideoLayerId===t&&this.selectVideoLayer("input"))},attachInputVideo(t){var i,n,s,r,l;const e=this.$refs.inputVideoEl;if(!(!e||!t)){this.inputVideoReady=!1,this._inputVideoReadyHandler||(this._inputVideoReadyHandler=()=>{try{this.inputVideoReady=e.readyState>=2}catch{this.inputVideoReady=!0}}),(i=e.removeEventListener)==null||i.call(e,"loadeddata",this._inputVideoReadyHandler),(n=e.removeEventListener)==null||n.call(e,"canplay",this._inputVideoReadyHandler),(s=e.addEventListener)==null||s.call(e,"loadeddata",this._inputVideoReadyHandler),(r=e.addEventListener)==null||r.call(e,"canplay",this._inputVideoReadyHandler),e.src!==t&&(e.src=t,e.load());try{const o=(l=e.play)==null?void 0:l.call(e);o&&typeof o.catch=="function"&&o.catch(()=>{})}catch{}}},openCloudLayer(t){t!=null&&t.url&&window.open(t.url,"_blank","noopener")},toggleVideoStageSize(t){const e=["small","medium","full"],i=e.includes(String(t))?String(t):null,n=["small","medium","full"],s=e.includes(this.videoStageSize)?this.videoStageSize:"medium",r=i||n[(n.indexOf(s)+1)%n.length];this.videoStageSize=r,this.saveSessionState()},isVideoLayerRunning(t){return t?t.kind==="webgl"?this.layerKindVisible("webgl"):t.kind==="deforum"||t.kind==="wan"||t.kind==="animatelcm"||t.kind==="svd"?this.deforumPlaying||this.videoReady||this.deforumGeneratedFrameCount>0||this.showFrameProcessing:t.kind==="blend"?this.showDefaultAnimation&&(this.showDeforumVideo||this.deforumPlaying||this.videoReady||this.deforumGeneratedFrameCount>0):t.kind==="input"?!!(this.inputLayerPlaybackUrl||t.playbackUrl):t.kind==="library"?!!t.playbackUrl:t.kind==="cloud"?!!t.url:this.layerStatus(t)!=="red":!1},layerStatus(t){return t?t.kind==="webgl"?"green":t.kind==="blend"?this.showDeforumVideo?"green":this.deforumPlaying||this.videoReady?"yellow":"green":t.kind==="deforum"||t.kind==="wan"||t.kind==="animatelcm"||t.kind==="svd"?this.videoReady?"green":this.deforumPlaying||this.defaultAnimation&&this.defaultAnimation.preferDeforumVideo||t.kind==="wan"||t.kind==="svd"||t.kind==="animatelcm"?"yellow":"red":t.kind==="input"?this.inputLayerPlaybackUrl?this.inputVideoReady?"green":"yellow":"red":t.kind==="library"?t.playbackUrl?this.inputVideoReady?"green":"yellow":"red":t.kind==="cloud"&&t.url?"yellow":"red":"red"},animationLayerDescription(t){var e,i;if(!t)return"";if(t.kind==="webgl")return`Standby WebGL · ${String(((e=this.defaultAnimation)==null?void 0:e.mode)||"instancing")}`;if(t.kind==="deforum")return this.deforumPlaying?"Deforum batch · animating":this.videoReady?"Deforum · live HLS feed":"Deforum · preview stills / batch";if(t.kind==="wan"){const n=String(((i=this.wanEngine)==null?void 0:i.wan_t2v_model)||"Wan").trim();return this.deforumPlaying?`WAN Video · ${n} · generating`:this.videoReady?`WAN Video · ${n} · live`:`WAN Video · ${n} · idle`}if(t.kind==="svd"){const n=this.svdEngineSummary;return this.deforumPlaying?`SVD · ${(n==null?void 0:n.modelFamily)||"XT 1.1"} · generating`:this.videoReady?`SVD · ${(n==null?void 0:n.modelFamily)||"XT 1.1"} · live`:`SVD · ${(n==null?void 0:n.modelFamily)||"XT 1.1"} · img2vid`}return t.kind==="animatelcm"?this.deforumPlaying?"AnimateLCM · generating":this.videoReady?"AnimateLCM · live":"AnimateLCM · idle":t.kind==="blend"?"Composite · WebGL under Deforum":t.kind==="input"?this.inputLayerPlaybackUrl?`Input · ${this.inputLayerLabel||"Video"}`:"Input · link a library or cloud source":t.kind==="library"?t.label||"Library video layer":t.kind==="cloud"?t.label||"Cloud link layer":t.label||""},assignInputFromSelection(){const e=(this.systemFiles.selectedPaths||[]).map(i=>(this.systemFiles.videos||[]).find(n=>n.path===i)).filter(Boolean)[0];if(!e){this.liveSourceStatus="Select a video in the library grid first";return}this.inputLayerPlaybackUrl=this.systemFilePlaybackUrl(e),this.inputLayerLabel=e.name||"Input",this.rebuildVideoLayers(),this.selectVideoLayer("input"),this.liveSourceStatus=`Assigned to Input layer: ${this.inputLayerLabel}`,this.videoLayerAddOpen=!1,this.saveSessionState()},toggleLibraryWorkspace(){this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.openLibraryWorkspace("browser")},openLibraryWorkspace(t="browser",e={}){e&&e.asSource&&(this.librarySourceMode=!0),this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane=t==="editor"?"editor":"browser",this.initSystemFilesBrowser(),this.saveSessionState()},closeLibraryWorkspace(){this.libraryWorkspaceOpen=!1,this.libraryWorkspacePane="browser",this.librarySourceMode=!1,this.saveSessionState()},setLibraryWorkspacePane(t){const e=t==="editor"?"editor":"browser";this.libraryWorkspacePane!==e&&(this.libraryWorkspacePane=e,this.saveSessionState())},openLibraryVideoEditor(){this.openLibraryWorkspace("editor")},closeLibraryEditor(){this.setLibraryWorkspacePane("browser")},openInVideoEditor(t){var n;const e=(n=this.librarySelectedProject)!=null&&n.videoPath?{path:this.librarySelectedProject.videoPath,rootId:this.librarySelectedProject.rootId||"uploads",name:this.librarySelectedProject.title,url:this.librarySelectedProject.videoUrl}:null,i=t||e||(this.systemFiles.videos||[]).find(s=>s.path===(this.systemFiles.selectedPaths||[])[0]);if(!i||!i.path){this.editorStatus="Select a video in the library first",this.editorStatusLive=!1,this.openLibraryWorkspace("browser"),this.saveSessionState();return}this.editorPendingImportPath=i.path,this.editorPendingImportRootId=i.rootId||this.systemFiles.rootId||"uploads",this.editorPendingImportUrl=i.url||this.systemFilePlaybackUrl(i),this.editorFreecutRoute="projects",this.editorStatus=`Ready to import ${i.name||"video"}`,this.editorStatusLive=!0,this.openLibraryWorkspace("editor")},useLibraryAudio(t,e={}){if(!(t!=null&&t.audioPath))return;const i=e.webgl??!!this.librarySourceMode;if(this.audio.objectUrl&&String(this.audio.objectUrl).startsWith("blob:"))try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.track=t.audioPath,this.audio.uploadedFile=t.title||t.audioName||"Audio",this.audio.objectUrl=t.audioUrl||null,this.audioBeatMacrosCollapsed=!0,this.primeAudioSpectrumPlaceholder();let n=!1;const s=()=>{if(!n){n=!0;try{this.setupLiveAudioAnalyser()}catch{}this.playAvSyncAudioForVisualizer(),this.audio.objectUrl&&(this.audioSpectrogramStatus="Analyzing…",this.scheduleAudioSpectrogramDecode(this._spectrogramGen)),i?this.applyAudioAsWebglSource():(this.audioStatus="Audio loaded from library",this.switchTab("AUDIO"))}},r=()=>{const l=this.$refs&&this.$refs.avSyncAudio;if(!l||!this.audio.objectUrl){s();return}const o=()=>{l.removeEventListener("canplay",o),s()};if(l.readyState>=2){s();return}l.addEventListener("canplay",o),typeof this.$nextTick=="function"&&this.$nextTick(()=>{l.readyState>=2&&o()})};typeof this.$nextTick=="function"?this.$nextTick(r):setTimeout(r,0),this.saveSessionState()},playAvSyncAudioForVisualizer(){const t=this.$refs&&this.$refs.avSyncAudio;if(!t||!this.audio.objectUrl)return Promise.resolve();t.loop=!0;try{const e=t.play&&t.play();return e&&typeof e.then=="function"?e.catch(()=>{}):Promise.resolve()}catch{return Promise.resolve()}},applyAudioAsWebglSource(){const t=this.findVideoLayer("webgl");t&&(t.previewVisible=!0,(!Number.isFinite(Number(t.opacity))||Number(t.opacity)<=0)&&(t.opacity=1)),this.selectVideoLayer("webgl"),this.currentTab!=="LIVE"&&this.switchTab("LIVE"),this.audioStatus="Audio driving WebGL visualizer",this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.librarySourceMode=!1},applyLibrarySelectionAsSource(){var i;const t=this.librarySelectedAudio;if(t!=null&&t.audioPath){this.useLibraryAudio(t,{webgl:!0});return}const e=(i=this.librarySelectedProject)!=null&&i.videoPath?this.librarySelectedProject:this.librarySelectedVideo;if(!(e!=null&&e.videoPath)){this.liveSourceStatus="Select audio or video in the library first";return}this.inputLayerPlaybackUrl=e.videoUrl||this.systemFilePlaybackUrl({path:e.videoPath,rootId:e.rootId||"uploads"}),this.inputLayerLabel=e.title||e.name||"Input",this.rebuildVideoLayers(),this.selectVideoLayer("input"),this.liveSourceStatus=`Assigned to Input layer: ${this.inputLayerLabel}`,this.libraryWorkspaceOpen?this.closeLibraryWorkspace():this.librarySourceMode=!1,this.saveSessionState()},isCloudStorageRoot(t){return String(t||this.systemFiles.rootId||"").startsWith("cloud:")},cloudStorageSourceId(t){const e=String(t||this.systemFiles.rootId||"");return e.startsWith("cloud:")?e.slice(6):""},cloudProviderLabel(t){return{google_drive:"Google Drive",dropbox:"Dropbox",onedrive:"OneDrive",other:"Cloud"}[String(t||"").toLowerCase()]||"Cloud"},async initSystemFilesBrowser(){try{if(!this.systemFiles._rootsLoaded){const t=await fetch("/api/video-swarm/roots"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load library roots");this.systemFiles.roots=Array.isArray(e.roots)?e.roots:[],this.systemFiles.cloudSources=Array.isArray(e.cloudSources)?e.cloudSources:[],this.systemFiles._rootsLoaded=!0}await this.refreshLibraryBrowse()}catch(t){this.systemFiles.status=t.message||"Library unavailable"}},async refreshLibraryBrowse(){const t=this.systemFiles.roots||[],e=t.find(i=>i.id===this.systemFiles.rootId)||t.find(i=>i.id==="uploads")||t.find(i=>i.id==="frames")||t[0];if(e){if(this.systemFiles.rootId=e.id,e.kind==="cloud"){await this.browseSystemFiles("",{rootId:e.id});return}await this.browseSystemFiles(e.path,{rootId:e.id})}},async refreshCloudSources(){try{const t=await fetch("/api/video-swarm/cloud-sources"),e=await t.json();if(!t.ok)throw new Error(e.error||"Could not load cloud sources");this.systemFiles.cloudSources=Array.isArray(e.sources)?e.sources:[];const i=(this.systemFiles.roots||[]).filter(n=>n.kind!=="cloud");this.systemFiles.roots=[...i,...(this.systemFiles.cloudSources||[]).map(n=>({id:`cloud:${n.id}`,label:`${this.cloudProviderLabel(n.provider)} — ${n.label}`,kind:"cloud",provider:n.provider,url:n.url,path:""}))]}catch(t){this.systemFiles.status=t.message||"Cloud storage unavailable"}},async connectCloudStorage({label:t,provider:e,url:i}={}){const n=String(i||this.cloudDriveDraft.url||"").trim();if(!n){this.systemFiles.status="Enter a cloud share link";return}try{const s=await fetch("/api/video-swarm/cloud-sources",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({label:String(t||"").trim()||this.cloudProviderLabel(e||this.cloudDriveDraft.provider),provider:e||this.cloudDriveDraft.provider||"other",url:n})}),r=await s.json();if(!s.ok)throw new Error(r.error||"Could not connect cloud storage");this.cloudDriveDraft.url="",this.systemFiles.cloudConnectOpen=!1,await this.refreshCloudSources();const l=r.source;l&&l.id&&(this.systemFiles.rootId=`cloud:${l.id}`,await this.browseSystemFiles("",{rootId:this.systemFiles.rootId})),this.systemFiles.status="Cloud storage connected"}catch(s){this.systemFiles.status=s.message||"Could not connect cloud storage"}},async disconnectCloudStorage(t){const e=String(t||"").trim();if(e&&window.confirm("Remove this cloud connection from the browser?"))try{const i=await fetch(`/api/video-swarm/cloud-sources/${encodeURIComponent(e)}`,{method:"DELETE"}),n=await i.json();if(!i.ok)throw new Error(n.error||"Could not remove cloud storage");if(await this.refreshCloudSources(),this.isCloudStorageRoot(this.systemFiles.rootId)){const s=(this.systemFiles.roots||[]).find(r=>r.kind!=="cloud")||this.systemFiles.roots[0];s&&(this.systemFiles.rootId=s.id,await this.browseSystemFiles(s.path,{rootId:s.id}))}this.systemFiles.status="Cloud storage removed"}catch(i){this.systemFiles.status=i.message||"Could not remove cloud storage"}},openCloudStorageLink(t){const e=t&&t.url?String(t.url):"";if(e)try{window.open(e,"_blank","noopener,noreferrer")}catch{this.systemFiles.status="Could not open cloud link"}},async addCloudStorageVideo(t){const e=String(t||this.cloudStorageSourceId()||"").trim(),i=String(this.systemFiles.cloudVideoDraft.url||"").trim();if(!e||!i){this.systemFiles.status="Enter a direct video URL from the cloud share";return}try{const n=await fetch(`/api/video-swarm/cloud-sources/${encodeURIComponent(e)}/videos`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:String(this.systemFiles.cloudVideoDraft.name||"").trim(),url:i})}),s=await n.json();if(!n.ok)throw new Error(s.error||"Could not add cloud video");this.systemFiles.cloudVideoDraft={name:"",url:""},this.isCloudStorageRoot(this.systemFiles.rootId)&&await this.browseSystemFiles("",{rootId:this.systemFiles.rootId}),this.systemFiles.status="Cloud video added"}catch(n){this.systemFiles.status=n.message||"Could not add cloud video"}},toggleSystemFilesVideosOnly(){this.systemFiles.viewMode=this.systemFiles.viewMode==="videos-only"?"browse":"videos-only",this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState()},openNewFolderDialog(){if(this.isCloudStorageRoot()){this.systemFiles.status="Create folders on local storage roots only";return}this.systemFiles.newFolderName="",this.systemFiles.newFolderOpen=!0},cancelNewFolderDialog(){this.systemFiles.newFolderOpen=!1,this.systemFiles.newFolderName=""},async uploadSystemVideoFile(t,{target:e="uploads"}={}){var r;if(!t)return;const i=String(t.name||"upload.mp4"),n=i.includes(".")?i.slice(i.lastIndexOf(".")).toLowerCase():"";if(n&&![".mp4",".webm",".mov",".mkv",".m4v",".avi"].includes(n)){this.systemFiles.status="Unsupported file type (use mp4, webm, mov, mkv, m4v, avi)";return}this.systemFiles.loading=!0,this.systemFiles.status=`Uploading ${i}…`;try{const l=await t.arrayBuffer(),o=new URLSearchParams({name:i,dir:e==="videoswarm"?"videoswarm":"uploads"}),u=await fetch(`/api/video-swarm/upload?${o.toString()}`,{method:"POST",headers:{"Content-Type":t.type||"application/octet-stream","X-Filename":i},body:l}),c=await u.json();if(!u.ok)throw new Error(c.error||"Upload failed");this.systemFiles.status=`Uploaded ${c.name||i}`;const h=this.systemFiles.currentPath||((r=(this.systemFiles.roots||[]).find(d=>d.id===(c.rootId||"uploads")))==null?void 0:r.path);await this.browseSystemFiles(h,{rootId:c.rootId||"uploads"}),c.path&&(this.systemFiles.selectedPaths=[c.path])}catch(l){this.systemFiles.status=l.message||"Upload failed"}finally{this.systemFiles.loading=!1}},async uploadSystemVideoFiles(t){const e=Array.from(t||[]).filter(i=>i&&i.size);if(e.length)for(const i of e)await this.uploadSystemVideoFile(i)},async createSystemFolder(){const t=String(this.systemFiles.newFolderName||"").trim();if(!t){this.systemFiles.status="Enter a folder name";return}if(this.isCloudStorageRoot()){this.systemFiles.status="Cannot create folders on cloud storage";return}try{const e=await fetch("/api/video-swarm/mkdir",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,path:this.systemFiles.currentPath,rootId:this.systemFiles.rootId})}),i=await e.json();if(!e.ok)throw new Error(i.error||"Could not create folder");this.systemFiles.newFolderOpen=!1,this.systemFiles.newFolderName="",await this.browseSystemFiles(this.systemFiles.currentPath),this.systemFiles.status=`Created folder “${t}”`}catch(e){this.systemFiles.status=e.message||"Could not create folder"}},systemFilesSortApiKey(t){const e=String(t||"name-asc").toLowerCase();return e.startsWith("mtime")||e==="date"?"date":e.startsWith("size")?"size":"name"},setSystemFilesSort(t){this.systemFiles.sortKey=t,this.browseSystemFiles(this.systemFiles.currentPath),this.saveSessionState()},refreshSystemFilesBrowse(){var e;const t=this.systemFiles.currentPath||((e=(this.systemFiles.roots||[]).find(i=>i.id===this.systemFiles.rootId))==null?void 0:e.path);this.browseSystemFiles(t)},setSystemFilesZoom(t){this.systemFiles.zoomLevel=Math.max(0,Math.min(4,Number(t)||0)),this.saveSessionState()},async copySystemFilePath(t){const e=String(t||"").trim();if(e)try{await navigator.clipboard.writeText(e),this.systemFiles.status="Path copied",setTimeout(()=>{this.systemFiles.status==="Path copied"&&(this.systemFiles.status="")},2e3)}catch{this.systemFiles.status="Could not copy path"}},async browseSystemFiles(t,{rootId:e}={}){this.systemFiles.loading=!0;try{const i=e||this.systemFiles.rootId,n=new URLSearchParams;t&&n.set("path",t),i&&n.set("rootId",i);const s=this.systemFiles.viewMode==="videos-only";s?n.set("videosOnly","1"):this.systemFiles.recursive&&n.set("recursive","1"),n.set("sort",this.systemFilesSortApiKey(this.systemFiles.sortKey));const r=await fetch(`/api/video-swarm/browse?${n.toString()}`),l=await r.json();if(!r.ok)throw new Error(l.error||"Browse failed");if(this.systemFiles.cloudSource=l.kind==="cloud"&&l.cloudSource||null,this.systemFiles.currentPath=l.path||"",this.systemFiles.parent=l.parent||"",this.systemFiles.folders=s||l.kind==="cloud"?[]:Array.isArray(l.folders)?l.folders:[],this.systemFiles.videos=Array.isArray(l.videos)?l.videos:[],this.systemFiles.folderCount=Number.isFinite(Number(l.folderCount))?Number(l.folderCount):this.systemFiles.folders.length,this.systemFiles.videoCount=Number.isFinite(Number(l.videoCount))?Number(l.videoCount):this.systemFiles.videos.length,e)this.systemFiles.rootId=e;else if(this.systemFiles.currentPath){const o=(this.systemFiles.roots||[]).find(u=>{const c=String(u.path||"");return this.systemFiles.currentPath===c||this.systemFiles.currentPath.startsWith(`${c}/`)});o&&(this.systemFiles.rootId=o.id)}this.systemFiles.status=""}catch(i){this.systemFiles.status=i.message||"Could not browse folder",this.systemFiles.folders=[],this.systemFiles.videos=[],this.systemFiles.folderCount=0,this.systemFiles.videoCount=0}finally{this.systemFiles.loading=!1}},toggleSystemFilesRecursive(){this.systemFiles.recursive=!this.systemFiles.recursive,this.browseSystemFiles(this.systemFiles.currentPath)},toggleSystemFilesShowNames(){this.systemFiles.showFilenames=!this.systemFiles.showFilenames},toggleSystemFileSelection(t){const e=Array.isArray(this.systemFiles.selectedPaths)?[...this.systemFiles.selectedPaths]:[],i=e.indexOf(t);i>=0?e.splice(i,1):e.push(t),this.systemFiles.selectedPaths=e},openSystemFileFullscreen(t){const e=this.systemFiles.videos||[];t>=0&&ts.path===t);if(i)return this.systemFilePlaybackUrl(i);const n=new URLSearchParams({path:t});return this.systemFiles.rootId&&n.set("rootId",this.systemFiles.rootId),`/api/video-swarm/file?${n.toString()}`},addLiveSourceFromVideo(t){if(!t||!t.path)return;const e={id:`src-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,type:"library",label:t.name||"Video",path:t.path,rootId:t.rootId||this.systemFiles.rootId||"frames",playbackUrl:this.systemFilePlaybackUrl(t)};this.liveSources=[...this.liveSources||[],e],this.rebuildVideoLayers(),this.selectVideoLayer(e.id),this.liveSourceStatus=`Opened layer: ${e.label}`,this.videoLayerAddOpen=!1,this.saveSessionState()},addLiveSourcesFromSelection(){const t=(this.systemFiles.selectedPaths||[]).map(e=>(this.systemFiles.videos||[]).find(i=>i.path===e)).filter(Boolean);if(!t.length){const e=(this.systemFiles.videos||[]).find(i=>i.path===(this.systemFiles.selectedPaths||[])[0]);e&&t.push(e)}if(!t.length){this.liveSourceStatus="Select a video in the library grid first";return}t.forEach(e=>this.addLiveSourceFromVideo(e))},linkCloudDriveSource(){const t=String(this.cloudDriveDraft.url||"").trim();if(!t){this.liveSourceStatus="Enter a cloud share link";return}let e;try{e=new URL(t)}catch{this.liveSourceStatus="Enter a valid https:// link";return}const i={id:`cloud-${Date.now()}`,type:"cloud",label:e.hostname.replace(/^www\./,""),url:e.href,provider:this.cloudDriveDraft.provider||"other",playbackUrl:e.href};this.liveSources=[...this.liveSources||[],i],this.rebuildVideoLayers(),this.selectVideoLayer(i.id),this.cloudDriveDraft.url="",this.liveSourceStatus=`Opened cloud layer: ${i.label}`,this.videoLayerAddOpen=!1,this.saveSessionState()},removeLiveSource(t){this.liveSources=(this.liveSources||[]).filter(e=>e.id!==t),this.rebuildVideoLayers(),this.saveSessionState()},applyLiveSourceAsFeed(t){t&&this.selectVideoLayer(t.id)},markVideoReady(t){this.videoReady=!!t},detachPlayerListeners(t=this.playerEl){t&&(this.timeHandler&&t.removeEventListener("timeupdate",this.timeHandler),this.errorHandler&&t.removeEventListener("error",this.errorHandler),this.videoReadyHandler&&(t.removeEventListener("loadeddata",this.videoReadyHandler),t.removeEventListener("canplay",this.videoReadyHandler),t.removeEventListener("playing",this.videoReadyHandler)),this.videoWaitingHandler&&(t.removeEventListener("waiting",this.videoWaitingHandler),t.removeEventListener("stalled",this.videoWaitingHandler),t.removeEventListener("emptied",this.videoWaitingHandler)),this.videoPlayHandler&&t.removeEventListener("play",this.videoPlayHandler),this.videoPauseHandler&&t.removeEventListener("pause",this.videoPauseHandler))},attachPlayer(){if(!this.hlsWatchEnabled)return;const t=document.getElementById("player");if(!t)return;this.playerEl&&this.detachPlayerListeners(this.playerEl),this.playerEl=t,this.markVideoReady(!1);const e=this.streamSrc.includes("?")?this.streamSrc+"&t="+Date.now():this.streamSrc+"?t="+Date.now();if(this.hls&&this.hls.destroy&&(this.hls.destroy(),this.hls=null),t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),this.autoplayVideo(t);else if(typeof Hls<"u"&&Hls.isSupported&&Hls.isSupported()){const i=Hls&&Hls.Events||{MANIFEST_PARSED:"manifest_parsed",ERROR:"error"};this.hls=new Hls({liveSyncDurationCount:1,liveMaxLatencyDurationCount:3,maxBufferLength:6,maxMaxBufferLength:12}),this.hls.loadSource(e),this.hls.attachMedia(t),this.hls.on&&(this.hls.on(i.MANIFEST_PARSED,()=>this.autoplayVideo(t)),this.hls.on(i.ERROR,()=>{setTimeout(()=>this.attachPlayer(),800)}))}else t.src=e;this.timeHandler=()=>{if(!isNaN(t.currentTime)){const i=t.currentTime;this.timecode=this.formatPlaybackTime(i),this.jobPlaybackTimeSec=i,this.syncFrameSelectionFromPlayback(i)}t.readyState>=2&&this.markVideoReady(!0),this.syncReferenceAudioToVideo(t)},this.errorHandler=()=>{this.markVideoReady(!1),this.hlsWatchEnabled&&setTimeout(()=>this.attachPlayer(),800)},this.videoReadyHandler=()=>{t.readyState>=2&&this.markVideoReady(!0)},this.videoWaitingHandler=()=>{this.markVideoReady(!1)},this.videoPlayHandler=()=>{this.isPlaying=!0,t.readyState>=2&&this.markVideoReady(!0),this.syncAvAudioPlayState(!0,t)},this.videoPauseHandler=()=>{this.isPlaying=!1,this.syncAvAudioPlayState(!1,t)},t.addEventListener("timeupdate",this.timeHandler),t.addEventListener("error",this.errorHandler),t.addEventListener("loadeddata",this.videoReadyHandler),t.addEventListener("canplay",this.videoReadyHandler),t.addEventListener("playing",this.videoReadyHandler),t.addEventListener("waiting",this.videoWaitingHandler),t.addEventListener("stalled",this.videoWaitingHandler),t.addEventListener("emptied",this.videoWaitingHandler),t.addEventListener("play",this.videoPlayHandler),t.addEventListener("pause",this.videoPauseHandler),this.autoplayVideo(t)},syncReferenceAudioToVideo(t){if(!this.avSyncEnabled||!this.audio.objectUrl)return;const e=t||this.playerEl,i=this.$refs.avSyncAudio;if(!e||!i||e.paused)return;const n=Number(this.avSyncLeadSec),s=Number.isFinite(n)&&n>=0?n:4,r=Math.max(0,e.currentTime-s);if(Math.abs(i.currentTime-r)>.12)try{i.currentTime=r}catch{}i.paused&&i.play().catch(()=>{})},syncAvAudioPlayState(t,e){const i=this.$refs.avSyncAudio;if(!i||!this.avSyncEnabled||!this.audio.objectUrl)return;const n=e||this.playerEl;t&&n?(this.syncReferenceAudioToVideo(n),i.play().catch(()=>{})):i.pause()},autoplayVideo(t){const e=t||this.playerEl;if(!e||typeof e.play!="function")return;let i=null;try{i=e.play()}catch{this.isPlaying=!1,this.markVideoReady(!1);return}i&&typeof i.catch=="function"&&i.then(()=>{this.isPlaying=!0,e.readyState>=2&&this.markVideoReady(!0)}).catch(()=>{this.isPlaying=!1,this.markVideoReady(!1)})},ensureLivePlayback(){!this.hlsWatchEnabled||!this.playerEl||(this.playerEl.paused||this.playerEl.readyState<2)&&this.autoplayVideo(this.playerEl)},lfoTarget(t){return!t||!t.target?null:this.lfoTargets.find(e=>e.key===t.target)||null},initLfoBase(t){const e=this.lfoTarget(t);e&&(t.base===null||t.base===void 0?t.base=e.default!=null?e.default:(e.min+e.max)/2:t.base=this.clampVal(t.base,e.min,e.max))},shapeValue(t,e){const i=e%(Math.PI*2);return t==="Square"?Math.sin(i)>=0?1:-1:t==="Saw"?i/Math.PI-1:t==="Triangle"?2*Math.asin(Math.sin(i))/Math.PI:Math.sin(i)},clampVal(t,e,i){return t==null||Number.isNaN(t)?e:Math.min(i,Math.max(e,t))},getNow(){return typeof performance<"u"&&performance.now?performance.now():Date.now()},formatPlaybackTime(t){const e=Math.max(0,Number(t)||0),i=Math.floor(e/60),n=(e%60).toFixed(2).padStart(5,"0");return`${String(i).padStart(2,"0")}:${n}`},lfoRateRadPerSec(t){const e=Number(t&&t.bpm||this.lfoBpm||120),i=Number(t&&t.speed||1);return e/60*Math.PI*2*i},interpolatedLfoPhase(t,e=this.getNow()){const i=Number(t&&t.phase)||0;if(!t||!t.on||this.lastLfoTick==null)return i;const n=Math.max(0,(e-this.lastLfoTick)/1e3);return(i+n*this.lfoRateRadPerSec(t))%(Math.PI*2)},runLfos(t=this.getNow()){if(this.audio.track)return;if(this.lastLfoTick===null){this.lastLfoTick=t;return}const e=(t-this.lastLfoTick)/1e3;if(this.lastLfoTick=t,e<=0)return;const i={},n={};this.lfos.forEach(s=>{var m;const r=Number(this.prompts.morphBlendLfoLink||0)===s.id&&s.id>=1&&s.id<=4,l=this.prompts.loraCrossfaderOn&&Number(this.prompts.loraCrossfaderLfoLink||0)===s.id&&s.id>=1&&s.id<=6,o=Number(((m=this.defaultAnimation)==null?void 0:m.forgeLayerOpacityLfoLink)||0)===s.id&&s.id>=1&&s.id<=6;if(!s.on||!s.targets.length&&!r&&!l&&!o)return;const u=this.clampVal(s.depth??0,0,1),c=e*this.lfoRateRadPerSec(s),h=(s.phase||0)+c;s.phase=h%(Math.PI*2),s.renderPhase=s.phase;const d=this.shapeValue(s.shape,s.phase);if(r){const g=this.clampVal(Number(this.prompts.morphBlendLfoBase??this.prompts.morphBlend??.5)||.5,0,1),b=u*.5,w=this.clampVal(g+d*b,0,1);this.applyPromptMorphBlend(w,{fromModulation:!0})}if(l){const g=this.clampVal(Number(this.prompts.loraCrossfaderLfoBase??this.prompts.crossfaderValue??.5)||.5,0,1),b=u*.5,w=this.clampVal(g+d*b,0,1);this.applyLoraCrossfader(w,{fromModulation:!0})}if(o){const g=this.clampVal(Number(this.defaultAnimation.forgeLayerOpacityLfoBase??this.defaultAnimation.forgeLayerOpacity??0)||0,0,1),b=u*.5,w=this.clampVal(g+d*b,0,1);this.applyForgeLayerOpacity(w,{fromModulation:!0})}s.targets.forEach(g=>{const b=this.modulationTargetByKey(g);if(!b)return;const w=s.base==null?b.default??(b.min+b.max)/2:this.clampVal(s.base,b.min,b.max);s.base===null&&(s.base=w);const v=u*(b.max-b.min)/2,y=this.clampVal(w+d*v,b.min,b.max);this.routeModulationValue(g,y,i,n)})}),Object.keys(i).length&&this.sendControl("liveParam",i),Object.values(n).forEach(s=>this.updateControlNet(s))},startLfoAnimation(){var n;this.stopLfoAnimation();const t=typeof window<"u"&&((n=window.matchMedia)==null?void 0:n.call(window,"(prefers-reduced-motion: reduce)").matches);let e=0;const i=s=>{!t&&s-e>48?(e=s,this.lfos.forEach(o=>{o.renderPhase=this.interpolatedLfoPhase(o,s);const u=this.lfoCanvasRefs[o.id];u!=null&&u.getContext&&this.drawLfoPreview(u,o,s)})):t&&this.lfos.forEach(o=>{o.renderPhase=Number(o.phase)||0});const r=this._liveSpecAnalyser,l=this._liveSpecFreqBuf;if(r&&l&&l.length){try{r.getByteFrequencyData(l)}catch{}!t&&s-(this._audioSpectrumPaintTs||0)>48&&(this._audioSpectrumPaintTs=s,this.audioSpectrumBins=Array.from(l));const u=(r.context&&r.context.sampleRate||44100)/2,c=l.length;this.audioMappings.forEach((h,d)=>{const m=Math.max(0,Math.floor(h.freq_min/u*c)),g=Math.min(c-1,Math.ceil(h.freq_max/u*c)),b=Math.max(1,g-m+1);let w=0;for(let v=m;v<=g;v++)w+=l[v];this.audioMappingLevels.length<=d&&this.audioMappingLevels.push(0),this.audioMappingLevels[d]=Math.min(1,w/(b*255))})}else this.audioSpectrumBins.length&&(this.audioSpectrumBins=[]),this.audioMappings.forEach((o,u)=>{this.audioMappingLevels.length>u&&(this.audioMappingLevels[u]=0)});this._lfoAnimFrame=requestAnimationFrame(i)};this._lfoAnimFrame=requestAnimationFrame(i)},stopLfoAnimation(){this._lfoAnimFrame!=null&&typeof cancelAnimationFrame=="function"&&(cancelAnimationFrame(this._lfoAnimFrame),this._lfoAnimFrame=null)},drawLfoPreview(t,e,i){const n=t.getContext("2d");if(!n)return;const s=t.width,r=t.height,l=r/2,o=(r/2-4)*(e.depth||.2);n.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),n.fillRect(0,0,s,r),n.strokeStyle="rgba(12, 48, 72, 0.5)",n.lineWidth=.5,n.beginPath(),n.moveTo(0,l),n.lineTo(s,l),n.stroke();const u=(e.speed||1)*.002,c=(i||0)*u;n.strokeStyle=e.on?this.themeColor("--warn","rgb(239, 159, 39)"):this.themeColor("--border","rgb(42, 45, 58)"),n.lineWidth=2,n.beginPath();const h=2;for(let d=0;d=0?1:-1)*o,d===0?n.moveTo(d,g):n.lineTo(d,g)}if(n.stroke(),e.on){n.strokeStyle="rgba(255, 138, 26, 0.15)",n.lineWidth=6,n.beginPath();for(let d=0;d=0?1:-1)*o,d===0?n.moveTo(d,b):n.lineTo(d,b)}n.stroke()}},processBeat(){const t=this.getNow(),i=60/(this.audio.bpm||120)*1e3;if(this.lastBeatTime===null){this.lastBeatTime=t,this.beatCount=0,this.beatPhase=0;return}const n=t-this.lastBeatTime;n>=i&&(this.lastBeatTime=t,this.beatCount++,this.triggerBeatMacros(t)),this.beatPhase=n/i%1},triggerBeatMacros(t=this.getNow()){const e={},i={};this.macrosRack.filter(s=>s.on).forEach(s=>{const r=this.modulationTargetByKey(s.target);if(!r||!this.shouldMacroTrigger(s,t))return;const o=r.default??(r.min+r.max)/2,u=this.clampVal(s.depth??.5,0,1),c=this.clampVal(s.offset??0,-1,1);let h;if(s.shape==="Noise")h=o+(Math.random()*2-1)*u*(r.max-r.min)/2;else{const m=this.beatPhase*Math.PI*2,g=this.shapeValue(s.shape||"Sine",m);h=o+(g+c)*u*(r.max-r.min)/2}const d=this.clampVal(h,r.min,r.max);this.routeModulationValue(s.target,d,e,i)}),Object.keys(e).length&&this.sendControl("liveParam",e),Object.values(i).forEach(s=>this.updateControlNet(s))},shouldMacroTrigger(t,e){const i=Number(t.bpm||0);if(i>0){const n=60/i*1e3,s=this.lastMacroTrigger[t.id]||0;return e-s>=n?(this.lastMacroTrigger[t.id]=e,!0):!1}return!0},connectWebSocket(){if(!this.collabEnabled){this.wsStatus="offline";return}const t=(location.protocol==="https:"?"wss://":"ws://")+location.host+"/ws",e=()=>{if(!this.collabEnabled){this.wsStatus="offline";return}if(this.ws&&(this.ws.readyState===0||this.ws.readyState===1))return;this.wsStatus="connecting";const i=new WebSocket(t);this.ws=i,i.onopen=()=>{this.ws===i&&(this.wsStatus="connected",this.wsReconnectTimer&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.collabIdentify())},i.onclose=()=>{if(this.ws===i&&(this.ws=null),this.clearCollaborationPresence(),!this.collabEnabled){this.wsStatus="offline";return}this.wsStatus="disconnected",this.wsReconnectTimer=setTimeout(e,1e3)},i.onmessage=n=>{try{const s=JSON.parse(n.data);this.handleWsMessage(s)}catch{}}};e()},clearCollaborationPresence(){this.collab.userId=null,this.collab.users=[],this.collab.locks={},this.collab.recording=!1,this.collab.recordings=[],this.collab.status=""},disconnectWebSocket({status:t="offline"}={}){this.wsReconnectTimer&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null);const e=this.ws;if(this.ws=null,this.clearCollaborationPresence(),this.wsStatus=t,e&&typeof e.close=="function"&&e.readyState<2)try{e.close()}catch{}},toggleCollaboration(){this.collabEnabled?(this.collabEnabled=!1,this.disconnectWebSocket({status:"offline"})):(this.collabEnabled=!0,this.wsStatus="disconnected",this.connectWebSocket()),this.saveSessionState()},handleWsMessage(t){if(t.type==="batch"&&Array.isArray(t.messages)){t.messages.forEach(e=>this.handleWsMessage(e));return}if(t.type==="hello"&&t.userId&&(this.collab.userId=t.userId,this.collabIdentify()),t.type==="presence"&&Array.isArray(t.users)){this.collab.users=t.users;const e={};t.users.forEach(i=>{(i.lockedParams||[]).forEach(n=>{e[n]=i.name})}),this.collab.locks=e}if(t.type==="shared_preset"&&(this.sharedPresetsStatus=`Shared preset ${t.action}: ${t.name}`,this.refreshSharedPresets(),setTimeout(()=>{this.sharedPresetsStatus=""},3e3)),t.type==="recording"&&(this.collab.recording=t.status==="started",this.collab.status=t.status==="started"?"Session recording…":"Recording saved on server"),t.type==="recordings"&&Array.isArray(t.files)&&(this.collab.recordings=t.files),t.type==="playback"&&(this.collab.status=`Playback started (${t.events||0} events)`),t.type==="error"&&(console.error("[Defora WS]",t.msg||t,t.locked||""),this.collab.status=this.collabEnabled?t.msg||"WebSocket error":""),t.type==="event"&&t.msg&&console.log("[Defora event]",t.msg),t.type==="stream"&&t.src&&(this.markVideoReady(!1),this.streamSrc=t.src+"?t="+Date.now(),this.hlsWatchEnabled&&this.attachPlayer()),t.type==="frame"&&(t.item&&this.mergeFrameThumb(t.item),this.scheduleFrameRefresh(t.item?80:0)),t.type==="warmup_started"&&(this.performance.status="Startup clip generating…",this.appendRunsJobLog(`Warmup started (batch ${t.batchId||"—"})`,"info"),this.refreshRuns({fromPoll:!0})),t.type==="warmup_done"&&(this.performance.status==="Startup clip generating…"&&(this.performance.status="Startup clip ready"),this.appendRunsJobLog(`Warmup finished: ${t.status||"done"} (batch ${t.batchId||"—"})`,"success"),this.refreshRuns({fromPoll:!0})),t.type==="run_demo_started"&&(this.appendRunsJobLog(`Demo run started: ${t.runId||"—"}`,"info"),this.refreshRuns({fromPoll:!0})),t.type==="run_demo_done"&&(this.appendRunsJobLog(`Demo run ${t.status||"done"}: ${t.runId||"—"}`,"success"),this.refreshRuns({fromPoll:!0})),t.type==="runs_job_log"&&t.entry&&(this.mergeRunsJobLogEntry(t.entry),t.entry.kind==="story_llm_request"&&t.entry.ollamaRequest&&this.applyStoryLlmRequestLog({clientRequest:t.entry.clientRequest,ollamaRequest:t.entry.ollamaRequest,logId:t.entry.id})),t.type==="deforum_settings"&&this.loadDeforumSettings({syncServerModel:!1}),t.type==="sd_model"&&t.model){const e=t.model.model_name||t.model.title||"";this.applyLoadedModelSelection(e,{queueDeforumSave:!1})}},collabIdentify(){!this.ws||this.ws.readyState!==1||this.wsSend({type:"identify",name:this.collab.userName||"Performer"})},saveCollabUserName(){try{localStorage.setItem("defora_user_name",this.collab.userName||"Performer")}catch{}},wsSend(t){!this.ws||this.ws.readyState!==1||this.ws.send(JSON.stringify(t))},modelSourceLabel(t){return f0(t)},isParamLocked(t){return!!this.collab.locks[t]},isParamLockedByMe(t){const e=this.collab.locks[t];return e&&e===(this.collab.userName||"Performer")},paramLockTitle(t){return this.collab.locks[t]?this.isParamLockedByMe(t)?"Unlock (you hold this lock)":`Locked by ${this.collab.locks[t]}`:"Lock parameter for collaboration"},toggleParamLock(t){this.isParamLockedByMe(t)?this.unlockParam(t):this.isParamLocked(t)?this.collab.status=`${t} is locked by ${this.collab.locks[t]}`:this.wsSend({type:"lock_param",param:t})},isParamPinned(t){return this.pinnedParams.includes(t)},toggleParamPin(t){const e=this.pinnedParams.indexOf(t);e===-1?this.pinnedParams.push(t):this.pinnedParams.splice(e,1);try{typeof localStorage<"u"&&localStorage.setItem("defora_pinned_params",JSON.stringify(this.pinnedParams))}catch{}},unlockParam(t){this.wsSend({type:"unlock_param",param:t})},toggleSessionRecording(){this.collab.recording?this.wsSend({type:"stop_recording"}):this.wsSend({type:"start_recording"})},listSessionRecordings(){this.wsSend({type:"list_recordings"})},playbackSessionRecording(t){this.wsSend({type:"playback_recording",recordingFile:t})},async refreshSharedPresets(){this.sharedPresetsLoading=!0;try{const{data:t}=await jt("/api/shared-presets",{},"shared-presets list");this.sharedPresets=t.presets||[]}catch(t){this.sharedPresetsStatus=t.message}finally{this.sharedPresetsLoading=!1}},async shareCurrentPreset(){const t=(this.sharedPresetName||this.newPresetName||this.currentPreset||"shared").replace(/[^a-zA-Z0-9_-]/g,"")||"shared",e={liveVibe:this.liveVibe,liveCam:this.liveCam,audio:{bpm:this.audio.bpm,track:this.audio.track},cn:{slots:this.cn.slots,active:this.cn.active},loras:{common:this.loras.common,groupA:this.loras.groupA,groupB:this.loras.groupB},prompts:{pos:this.prompts.pos,neg:this.prompts.neg,morphOn:this.prompts.morphOn,loraCrossfaderOn:this.prompts.loraCrossfaderOn,crossfaderValue:this.prompts.crossfaderValue,loraCrossfaderLfoLink:this.prompts.loraCrossfaderLfoLink,loraCrossfaderLfoBase:this.prompts.loraCrossfaderLfoBase,morphBlend:this.prompts.morphBlend,morphBlendLfoLink:this.prompts.morphBlendLfoLink,morphBlendLfoBase:this.prompts.morphBlendLfoBase},lfos:this.lfos,macrosRack:this.macrosRack,paramSources:this.paramSources};try{await jt("/api/shared-presets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,preset:e,sharedBy:this.collab.userName||"anonymous",description:"Shared from web UI"})},"share preset"),this.sharedPresetsStatus=`Shared as ${t}`,this.sharedPresetName=t,await this.refreshSharedPresets()}catch(i){this.sharedPresetsStatus=i.message}},async loadSharedPreset(t){try{const{data:e}=await jt(`/api/shared-presets/${encodeURIComponent(t)}`,{},"load shared preset"),i=e.preset||e;i.liveVibe&&(this.liveVibe=i.liveVibe),i.liveCam&&(this.liveCam=i.liveCam),i.audio&&Object.assign(this.audio,i.audio),i.cn&&Object.assign(this.cn,i.cn),i.lfos&&(this.lfos=i.lfos),i.macrosRack&&(this.macrosRack=i.macrosRack),i.prompts&&Object.assign(this.prompts,i.prompts),i.loras&&(this.loras.common=i.loras.common||[],this.loras.groupA=i.loras.groupA||[],this.loras.groupB=i.loras.groupB||[],await this.refreshLoras()),this.sharedPresetsStatus=`Loaded shared preset: ${t}`,setTimeout(()=>{this.sharedPresetsStatus=""},3e3)}catch(e){this.sharedPresetsStatus=e.message}},async deleteSharedPreset(t){if(confirm(`Delete shared preset "${t}"?`))try{await jt(`/api/shared-presets/${encodeURIComponent(t)}`,{method:"DELETE"},"delete shared preset"),await this.refreshSharedPresets(),this.sharedPresetsStatus=`Deleted ${t}`}catch(e){this.sharedPresetsStatus=e.message}},async refreshGpuPool(t=!1){var e;this.gpuPool.loading=!0,this.infrastructure.loading=!0;try{t&&await jt("/api/gpu-pool/refresh",{method:"POST"},"gpu pool refresh");const[i,n]=await Promise.allSettled([jt("/api/gpu-pool",{},"gpu pool status"),jt("/api/infrastructure",{},"infrastructure status")]);if(i.status==="fulfilled"){const s=i.value.data;this.gpuPool.enabled=!!s.enabled,this.gpuPool.strategy=s.strategy||"round_robin",this.gpuPool.defaultForgeModel=s.defaultForgeModel||"",this.gpuPool.healthyNodes=s.healthyNodes??0,this.gpuPool.nodes=s.nodes||[];const r={...this.gpuPool.modelOptions||{}};this.gpuPool.nodes.forEach(l=>{l&&l.url&&Array.isArray(l.availableModels)&&l.availableModels.length&&(r[l.url]=[...l.availableModels])}),this.gpuPool.modelOptions=r}else this.gpuPool.status=((e=i.reason)==null?void 0:e.message)||"Failed to load GPU pool";if(n.status==="fulfilled"){const s=n.value.data||{};this.infrastructure.mediator=s.mediator||null,this.infrastructure.transcoders=Array.isArray(s.transcoders)?s.transcoders:[],this.infrastructure.updatedAt=s.updatedAt||null}else this.infrastructure.mediator=null,this.infrastructure.transcoders=[]}catch(i){this.gpuPool.status=i.message}finally{this.gpuPool.loading=!1,this.infrastructure.loading=!1}},ollamaModelOptions(t){const e=this.gpuPool.modelOptions||{},i=String(t||"").trim().replace(/\/+$/,"");return(e[t]||e[i]||[]).filter(Boolean)},frameThumbsCacheKey(){return"defora.frameThumbs.v1"},frameThumbsCacheLimit(){return 48},frameSrcKey(t){return String(t||"").split("?")[0]},loadCachedFrameThumbs(){try{if(!window.localStorage)return[];const t=window.localStorage.getItem(this.frameThumbsCacheKey());if(!t)return[];const e=JSON.parse(t);return Array.isArray(e)?e.map(i=>this.normalizeFrameThumb(i)).filter(Boolean):[]}catch{return[]}},saveCachedFrameThumbs(t){try{if(!window.localStorage)return;const e=(Array.isArray(t)?t:[]).slice(-this.frameThumbsCacheLimit()).map(i=>({name:i.name,src:this.frameSrcKey(i.src||i.url||i.path||""),frame:i.frame,mtime:i.mtime})).filter(i=>i.name||i.src);window.localStorage.setItem(this.frameThumbsCacheKey(),JSON.stringify(e))}catch{}},mergeFrameThumbs(t,{keepCachedOnEmpty:e=!0}={}){const i=this.loadCachedFrameThumbs(),n=(Array.isArray(t)?t:[]).map(r=>this.normalizeFrameThumb(r)).filter(Boolean),s=new Map;return(e||n.length)&&i.forEach(r=>{r&&r.name&&s.set(r.name,r)}),n.forEach(r=>{r&&r.name&&s.set(r.name,r)}),[...s.values()].sort((r,l)=>{const o=Number(r&&r.frame),u=Number(l&&l.frame);return Number.isFinite(o)&&Number.isFinite(u)?o-u:String(r&&r.name||"").localeCompare(String(l&&l.name||""))}).slice(-this.frameThumbsCacheLimit())},normalizeFrameThumb(t){if(!t)return null;if(typeof t=="string"){const l=t,o=this.frameSrcKey(l);return{src:l,name:o.split("/").pop(),frame:this.parseFrameNumber(o),mtime:Date.now()}}const e=t.src||t.url||t.path||"",i=t.name||this.frameSrcKey(e).split("/").pop()||"",n=t.frame!=null?t.frame:this.parseFrameNumber(i||e),s=Number(t.mtime)||Date.now();return{src:e||(i?`/frames/${i}?v=${s}`:""),name:i,frame:n,mtime:s}},mergeFrameThumb(t){const e=this.normalizeFrameThumb(t);if(!e||!e.name&&!e.src)return;const i=this.frameStripThumbs.length,n=this.frameSrcKey(this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||""),s=[...this.thumbs||[]].filter(r=>r&&r.name!==e.name).concat(e).sort((r,l)=>{const o=Number(r&&r.frame),u=Number(l&&l.frame);return Number.isFinite(o)&&Number.isFinite(u)?o-u:String(r&&r.name||"").localeCompare(String(l&&l.name||""))});this.thumbs=s,this.saveCachedFrameThumbs(s),this.frameStripThumbs.length>i?this.applyNewGeneratedFrames(i):(this.updateFrameSelection(n),this.updateHeldPreviewFromLatestFrame())},scheduleFrameRefresh(t=0){clearTimeout(this.frameRefreshTimer),this.frameRefreshTimer=setTimeout(()=>{this.frameRefreshTimer=null,this.refreshFrames()},Math.max(0,Number(t)||0))},nextFramesPollDelay({failed:t=!1}={}){const e=Number(this.framesRefreshBackoffMs)||1e3;return t?Math.min(1e4,Math.max(1e3,e*2)):this.deforumPlaying?400:this.previewGenerating?this.wsStatus==="connected"?400:750:this.wsStatus!=="connected"?1500:3e3},async loadOllamaModels(t){const e=(t||"").trim();if(!e)return this.gpuPool.status="Enter an Ollama URL first.",[];const{data:i}=await jt(`/api/ollama/models?url=${encodeURIComponent(e)}`,{},"ollama models"),n=(i.models||[]).map(r=>r&&typeof r=="object"?r.name:r).filter(Boolean),s=i&&i.url?i.url:e;return this.gpuPool.modelOptions={...this.gpuPool.modelOptions||{},[s]:n},n},async refreshGpuDraftModels(){try{const t=await this.loadOllamaModels(this.gpuPool.draft.url);!this.gpuPool.draft.model&&t.length&&(this.gpuPool.draft.model=t[0]),this.gpuPool.status=t.length?`Loaded ${t.length} Ollama models.`:"No Ollama models found."}catch(t){this.gpuPool.status=t.message}},async refreshGpuEditModels(){try{const t=await this.loadOllamaModels(this.gpuPool.editDraft.url);!this.gpuPool.editDraft.model&&t.length&&(this.gpuPool.editDraft.model=t[0]),this.gpuPool.status=t.length?`Loaded ${t.length} Ollama models.`:"No Ollama models found."}catch(t){this.gpuPool.status=t.message}},gpuForgeOptionKeys(){return["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"]},normalizeGpuForgeSettings(t={},e={}){const i=t&&typeof t=="object"?t:{},n=e&&typeof e=="object"?e:{},s=new Set(["steps","cfg_scale","width","height","batch_size","clip_skip","eta_ddim","eta_ancestral","sigma_churn"]),r=new Set(["enable_emphasis","use_old_sampling","do_not_add_watermark"]),l={};for(const o of this.gpuForgeOptionKeys()){const u=i[o]!==void 0?i[o]:n[o];if(u!==void 0){if(r.has(o)){l[o]=!!u;continue}if(s.has(o)){const c=Number(u);Number.isFinite(c)&&(l[o]=c);continue}l[o]=u==null?null:String(u)}}return l},gpuForgePreferredQuery(t){return t?`?preferredNode=${encodeURIComponent(t)}`:""},inferGpuMediatorHost(t={}){const e=String(t.mediator&&t.mediator.host||t.mediatorSettings&&t.mediatorSettings.host||"").trim();if(e)return e.replace(/^https?:\/\//i,"").split(":")[0];const i=String(t.name||"").trim();if(i&&!i.includes("."))return i;try{const n=new URL(t.url||"").hostname;return n&&!/^\d+\.\d+\.\d+\.\d+$/.test(n)?n:i||n||"localhost"}catch{return i||"localhost"}},normalizeGpuMediatorSettings(t={},e={}){const i=t&&typeof t=="object"?t:{},n=String(i.host||"").trim()||this.inferGpuMediatorHost(e),s=Number(i.deforumPort??i.deforum_port??8765),r=Number(i.deforumationPort??i.deforumation_port??8766);return{host:n.replace(/^https?:\/\//i,"").split(":")[0],deforumPort:Number.isFinite(s)?s:8765,deforumationPort:Number.isFinite(r)?r:8766}},mediatorStatusClass(t){return t==="healthy"?"st-healthy":t==="unreachable"?"st-unhealthy":"st-unknown"},async probeGpuForgeMediatorPorts(){const t=this.gpuPool.forgeModal;if(!(!t.open||!t.nodeId)){t.mediator.probing=!0,t.status="Checking mediator ports…";try{const{data:e}=await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.nodeId)}/mediator-probe`,{method:"POST"},"mediator port probe"),i=e&&e.mediator?e.mediator:null;i?(t.mediator.host=i.host||t.mediator.host,t.mediator.deforumPort=i.deforumPort??t.mediator.deforumPort,t.mediator.deforumationPort=i.deforumationPort??t.mediator.deforumationPort,t.mediator.deforumStatus=i.deforumStatus||"",t.mediator.deforumationStatus=i.deforumationStatus||"",t.status=`Deforum ${i.deforumPort}: ${i.deforumStatus}; Deforumation ${i.deforumationPort}: ${i.deforumationStatus}`):t.status="Port check finished.",await this.refreshGpuPool(!1)}catch(e){t.status=e.message||"Mediator port check failed."}finally{t.mediator.probing=!1}}},onGpuForgeModalBackdropClick(t){(t==null?void 0:t.target)===(t==null?void 0:t.currentTarget)&&this.closeGpuForgeModal()},closeGpuForgeModal(){this.gpuPool.forgeModal={open:!1,nodeId:"",nodeName:"",url:"",priority:1,model:"",currentModel:"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[],schedulers:[],vaeList:[],modelInfo:null,options:{},mediator:{host:"",deforumPort:8765,deforumationPort:8766,deforumStatus:"",deforumationStatus:"",probing:!1}}},async refreshGpuForgeModalOptions(){const t=this.gpuPool.forgeModal;if(!t.open||!t.nodeId)return;const e=this.gpuForgePreferredQuery(t.nodeId),i=(this.gpuPool.nodes||[]).find(n=>n&&n.id===t.nodeId)||{};t.loading=!0,t.status="Loading Forge instance...";try{const[n,s,r,l,o]=await Promise.all([fetch(`/api/forge/options${e}`),fetch(`/api/forge/samplers${e}`),fetch(`/api/forge/schedulers${e}`),fetch(`/api/forge/vae${e}`),fetch(`/api/sd-models/current${e}`)]),[u,c,h,d,m]=await Promise.all([n.json(),s.json(),r.json(),l.json(),o.json()]);if(!this.gpuPool.forgeModal.open||this.gpuPool.forgeModal.nodeId!==t.nodeId)return;const g=this.normalizeGpuForgeSettings(i.forgeSettings||{},this.forge.options||{});this.gpuPool.forgeModal.available=!!u.available,this.gpuPool.forgeModal.options=this.normalizeGpuForgeSettings(u.options||{},g),this.gpuPool.forgeModal.samplers=Array.isArray(c.samplers)?c.samplers:[...this.forge.samplers||[]],this.gpuPool.forgeModal.schedulers=Array.isArray(h.schedulers)?h.schedulers:[...this.forge.schedulers||[]],this.gpuPool.forgeModal.vaeList=Array.isArray(d.vae)?d.vae:[...this.forge.vaeList||[]];const b=m&&m.model&&(m.model.model_name||m.model.title)||"";this.gpuPool.forgeModal.currentModel=b,this.gpuPool.forgeModal.model=i.model||b||"",this.gpuPool.forgeModal.modelInfo=m&&m.model&&m.model.metadata||null,this.gpuPool.forgeModal.status=u.available?"Forge instance ready.":u.error||"Forge instance unavailable."}catch(n){this.gpuPool.forgeModal.options=this.normalizeGpuForgeSettings(i.forgeSettings||{},this.forge.options||{}),this.gpuPool.forgeModal.samplers=[...this.forge.samplers||[]],this.gpuPool.forgeModal.schedulers=[...this.forge.schedulers||[]],this.gpuPool.forgeModal.vaeList=[...this.forge.vaeList||[]],this.gpuPool.forgeModal.currentModel=i.currentModel||i.model||"",this.gpuPool.forgeModal.model=i.model||i.currentModel||"",this.gpuPool.forgeModal.modelInfo=null,this.gpuPool.forgeModal.available=!1,this.gpuPool.forgeModal.status=n.message||"Failed to load Forge instance."}finally{this.gpuPool.forgeModal.nodeId===t.nodeId&&(this.gpuPool.forgeModal.loading=!1)}},async openGpuForgeModal(t){const e=this.normalizeGpuForgeSettings(t&&t.forgeSettings||{},this.forge.options||{}),i={name:t.name,url:t.url,mediator:t.mediator,mediatorSettings:t.mediatorSettings},n=this.normalizeGpuMediatorSettings(t.mediator||t.mediatorSettings||{},i);this.gpuPool.editId=null,this.gpuPool.forgeModal={open:!0,nodeId:t.id,nodeName:t.name||"",url:t.url||"",priority:t.priority||1,model:t.model||"",currentModel:t.currentModel||t.model||"",available:!1,loading:!1,saving:!1,applying:!1,status:"",samplers:[...this.forge.samplers||[]],schedulers:[...this.forge.schedulers||[]],vaeList:[...this.forge.vaeList||[]],modelInfo:null,options:e,mediator:{host:n.host,deforumPort:n.deforumPort,deforumationPort:n.deforumationPort,deforumStatus:t.mediator&&t.mediator.deforumStatus||"",deforumationStatus:t.mediator&&t.mediator.deforumationStatus||"",probing:!1}},await this.refreshGpuForgeModalOptions()},async persistGpuForgeModalNode(){const t=this.gpuPool.forgeModal,e={name:t.nodeName||t.url,url:t.url,backend:"sd-forge",priority:t.priority||1,model:t.model||t.currentModel||null,forgeSettings:this.normalizeGpuForgeSettings(t.options||{},this.forge.options||{}),mediatorSettings:this.normalizeGpuMediatorSettings(t.mediator||{},{name:t.nodeName,url:t.url})},{data:i}=await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.nodeId)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},"save forge gpu node"),n=i&&i.node?i.node:null;return n&&(this.gpuPool.forgeModal.nodeId=n.id||t.nodeId,this.gpuPool.forgeModal.nodeName=n.name||t.nodeName,this.gpuPool.forgeModal.url=n.url||t.url,this.gpuPool.forgeModal.priority=n.priority||t.priority,this.gpuPool.forgeModal.model=n.model||t.model),await this.refreshGpuPool(!1),n},async saveGpuForgeModal(){this.gpuPool.forgeModal.saving=!0;try{await this.persistGpuForgeModalNode(),this.gpuPool.forgeModal.status="Forge instance settings saved.",this.gpuPool.status="Forge instance settings saved."}catch(t){this.gpuPool.forgeModal.status=t.message,this.gpuPool.status=t.message}finally{this.gpuPool.forgeModal.saving=!1}},async applyGpuForgeModalOptions(){this.gpuPool.forgeModal.applying=!0;try{const t=await this.persistGpuForgeModalNode(),e=t&&t.id||this.gpuPool.forgeModal.nodeId;await jt(`/api/forge/options${this.gpuForgePreferredQuery(e)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.normalizeGpuForgeSettings(this.gpuPool.forgeModal.options||{},this.forge.options||{}))},"apply forge node options"),this.gpuPool.forgeModal.status="Forge options applied to this instance.",this.gpuPool.status="Forge options applied to this instance.",await this.refreshGpuForgeModalOptions()}catch(t){this.gpuPool.forgeModal.status=t.message,this.gpuPool.status=t.message}finally{this.gpuPool.forgeModal.applying=!1}},async saveGpuPoolSettings(){try{await jt("/api/gpu-pool",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:this.gpuPool.enabled,strategy:this.gpuPool.strategy})},"gpu pool settings"),this.gpuPool.status=this.gpuPool.enabled?"Load balancing enabled":"Load balancing disabled"}catch(t){this.gpuPool.status=t.message}},async saveDefaultForgeModel({preload:t=!0}={}){var e;try{this.gpuPool.defaultForgeModelStatus="Saving default model…";const n=(e=(await jt("/api/gpu-pool/default-forge-model",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.gpuPool.defaultForgeModel||"",preload:t===!0,singleNode:!0})},"default forge model")).data)==null?void 0:e.preloadResults;if(Array.isArray(n)&&n.length){const s=n.filter(l=>l&&l.ok).length,r=n.filter(l=>l&&!l.ok).length;this.gpuPool.defaultForgeModelStatus=`Default model saved. Preload: ${s} ok, ${r} failed.`}else this.gpuPool.defaultForgeModelStatus="Default model saved.";await this.refreshGpuPool(!0)}catch(i){this.gpuPool.defaultForgeModelStatus=i.message,this.gpuPool.status=i.message}},async addGpuNode(){const t=(this.gpuPool.draft.url||"").trim();if(t)try{await jt("/api/gpu-pool/nodes",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:t,name:this.gpuPool.draft.name||t,backend:this.gpuPool.draft.backend,enabled:!1,priority:this.gpuPool.draft.priority||1,model:this.gpuPool.draft.backend==="ollama"&&this.gpuPool.draft.model||null})},"add gpu node"),this.gpuPool.draft={url:"",name:"",backend:"sd-forge",priority:1,model:""},await this.refreshGpuPool(!1),this.gpuPool.status="Instance added (disabled). Edit if needed, then enable."}catch(e){this.gpuPool.status=e.message}},async startEditGpuNode(t){if(t.enabled){this.gpuPool.status="Disable the node before editing.";return}if(t.backend==="sd-forge"){await this.openGpuForgeModal(t);return}this.gpuPool.editId=t.id,this.gpuPool.editDraft={name:t.name,url:t.url,backend:t.backend,priority:t.priority||1,model:t.model||""}},async saveGpuNodeEdit(t){try{await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.gpuPool.editDraft)},"edit gpu node"),this.gpuPool.editId=null,await this.refreshGpuPool(!1),this.gpuPool.status="Node updated."}catch(e){this.gpuPool.status=e.message}},async disableGpuNode(t){try{await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}/disable`,{method:"POST"},"disable gpu"),await this.refreshGpuPool(!1)}catch(e){this.gpuPool.status=e.message}},async enableGpuNode(t){try{await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}/enable`,{method:"POST"},"enable gpu"),await this.refreshGpuPool(!0),this.gpuPool.status=`${t.name} enabled.`}catch(e){this.gpuPool.status=e.message}},async removeGpuNode(t){if(confirm(`Remove GPU instance "${t.name}"?`))try{await jt(`/api/gpu-pool/nodes/${encodeURIComponent(t.id)}`,{method:"DELETE"},"remove gpu"),await this.refreshGpuPool(!1),this.gpuPool.status="Node removed."}catch(e){this.gpuPool.status=e.message}},formatGpuMemory(t){if(t.memoryUsedMb==null&&t.memoryTotalMb==null)return"—";const e=t.memoryUsedMb!=null?`${t.memoryUsedMb}`:"?",i=t.memoryTotalMb!=null?`${t.memoryTotalMb}`:"?";return`${e} / ${i} MB`},sendControl(t,e){if(!this.ws||this.ws.readyState!==1)return;t==="liveParam"&&e&&typeof e=="object"&&this.syncMotionPadFromPayload(e);const i={type:"control",controlType:t,payload:e};this.ws.send(JSON.stringify(i))},syncMotionPadFromPayload(t){if(!t||typeof t!="object")return;const e=t.translation_x??t.panx,i=t.translation_y??t.pany,n=t.translation_z,s=t.zoom_2d??t.zoom,r=t.angle_2d??t.angle;if(e!=null&&Number.isFinite(Number(e))&&(this.motionPadValues.translation_x=Number(e)),i!=null&&Number.isFinite(Number(i))&&(this.motionPadValues.translation_y=Number(i)),n!=null&&Number.isFinite(Number(n))&&(this.motionPadValues.translation_z=Number(n)),s!=null&&Number.isFinite(Number(s))){const o=Number(s);this.motionPadValues.zoom=o,this.motionPadValues.look_y=this.clampVal(o,-1,1)}r!=null&&Number.isFinite(Number(r))&&(this.motionPadValues.look_x=this.clampVal(Number(r),-1,1));const l=t.rotation_z??t.tilt;l!=null&&Number.isFinite(Number(l))&&(this.motionPadValues.rotation_z=Number(l))},updateParam(t,e){if(this.isParamLocked(t.key)&&!this.isParamLockedByMe(t.key)){console.warn(`[Defora] Parameter "${t.key}" is locked by ${this.collab.locks[t.key]}`);return}const i=this.paramControlMeta(t.key),n=this.clampParamToMeta(e.target.value,i);i.hud&&(i.hud.val=n),this.syncHudMotionFromParam(t.key,n),this.queueLiveParam(t.key,n),this.deforumPlaying||this.schedulePreviewFrame()},setSource(t,e){this.paramSources[t]=e,this.sendControl("paramSource",{key:t,source:e})},clearLiveModSlotForParam(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.liveModSlotParamKeys=this.liveModSlotParamKeys.map(i=>i===e||i===t?"":i)},paramLiveModSlotIndex(t){if(!t)return-1;const e=this.liveParamCanonicalKey(t);return this.liveModSlotParamKeys.findIndex(i=>i===e||i===t)},assignParamToLiveModSlot(t,e){if(!t||e<0||e>7)return;const i=this.liveParamCanonicalKey(t);this.liveModSlotParamKeys=this.liveModSlotParamKeys.map((n,s)=>s===e?i:n===i||n===t?"":n)},paramHasActiveMapping(t){if(!t)return!1;const e=this.liveParamCanonicalKey(t);if(this.paramLiveModSlotIndex(e)>=0||(this.targetOwners[e]||this.targetOwners[t]||[]).length||this.audioMappings.some(s=>s.param===e||s.param===t)||this.macrosRack.some(s=>s.on&&(s.target===e||s.target===t)))return!0;const n=this.paramSources[e]||this.paramSources[t];return!!(n&&n!=="Manual")},paramMappingLabels(t){if(!t)return[];const e=this.liveParamCanonicalKey(t),i=[],n=this.paramLiveModSlotIndex(e);if(n>=0){const l=this.liveModSlotPickerOptions.find(o=>o.index===n);i.push(l?l.label:`Slot ${n+1}`)}(this.targetOwners[e]||this.targetOwners[t]||[]).forEach(l=>i.push(l)),this.audioMappings.forEach((l,o)=>{var u;l.param!==e&&l.param!==t||i.push(`Audio ${((u=this.audioBandTabDefs[o])==null?void 0:u.label)||o+1}`)}),this.macrosRack.forEach((l,o)=>{!l.on||l.target!==e&&l.target!==t||i.push(`Macro ${o+1}`)});const r=this.paramSources[e]||this.paramSources[t];return r&&r!=="Manual"&&!i.length&&i.push(r),i},openModulationMapPicker(t){t&&(this.modulationMapPicker={paramKey:this.liveParamCanonicalKey(t),step:"choose"})},closeModulationMapPicker(){this.modulationMapPicker=null},onModulationMapPickerBackdropClick(t){t.target===t.currentTarget&&this.closeModulationMapPicker()},formatMappingParamValue(t){const e=Number(this.paramControlMeta(t).value);return Number.isFinite(e)?Math.abs(e)>=10?e.toFixed(1):e.toFixed(2):"—"},assignModulationMapToSlot(t){const e=this.modulationMapPicker&&this.modulationMapPicker.paramKey;e&&(this.assignParamToLiveModSlot(e,t),this.closeModulationMapPicker())},mapModulationParamToLfo(t){const e=this.modulationMapPicker&&this.modulationMapPicker.paramKey;if(!e)return;const i=this.lfos.find(n=>n.id===t);i&&(i.on||(i.on=!0),i.targets.includes(e)||this.toggleLfoTarget(i,e),this.modulationSelectedLfoId=i.id,this.closeModulationMapPicker())},onAudioFileDrop(t){const e=t&&t.dataTransfer&&t.dataTransfer.files&&t.dataTransfer.files[0];e&&(e.type&&!String(e.type).startsWith("audio/")||this.handleAudioUpload({target:{files:[e],value:""}}))},onModulationAudioDragover(t){t==null||t.preventDefault()},onModulationAudioDrop(t){t==null||t.preventDefault(),this.onAudioFileDrop(t)},onLfoRouteButtonClick(t){this.modulationSelectedLfoId=t},clearParamMapping(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.clearLiveModSlotForParam(e),this.lfos.forEach(i=>{[e,t].forEach(n=>{const s=i.targets.indexOf(n);s>=0&&i.targets.splice(s,1)})}),this.audioMappings=this.audioMappings.filter(i=>i.param!==e&&i.param!==t),this.macrosRack.forEach(i=>{(i.target===e||i.target===t)&&(i.on=!1)}),this.clearMidiBinding(e),this.setSource(t,"Manual"),e!==t&&this.setSource(e,"Manual")},openModulationMapping(t){if(!t)return;const e=this.liveParamCanonicalKey(t);this.modulationRouteFocusKey=e;let i=this.selectedModulationLfo;i||(i=this.lfos.find(n=>n.on)||this.lfos[0],i&&(this.modulationSelectedLfoId=i.id)),i&&(i.on||(i.on=!0),i.targets.includes(e)||this.toggleLfoTarget(i,e)),this.switchTab("MODULATION"),this.currentSubTab.MODULATION="LFO";try{window.localStorage&&window.localStorage.setItem("defora_subtab_MODULATION","LFO")}catch{}},setLiveModValue(t,e){if(!t)return;const i=this.paramControlMeta(t),n=this.clampParamToMeta(e,i),s=this.modulationTargetByKey(t);s&&s.field?this.applyAnimationModulation(s.field,n):(i.hud&&(i.hud.val=n,this.syncHudMotionFromParam(i.hud.key,n)),this.queueLiveParam(t,n)),this.deforumPlaying||this.schedulePreviewFrame()},livePadDown(t,e){this._livePadDragging=!0,this.livePadMove(t,e)},livePadMove(t,e){if(!this._livePadDragging||!e)return;const i=t.currentTarget;if(!i||!i.getBoundingClientRect)return;const n=i.getBoundingClientRect(),s=t.touches&&t.touches[0]?t.touches[0]:t,r=(s.clientX-n.left)/(n.width||1),l=(s.clientY-n.top)/(n.height||1),o=Math.max(0,Math.min(1,r)),u=Math.max(0,Math.min(1,1-l)),c=e.paramKeyX?this.paramControlMeta(e.paramKeyX):null,h=e.paramKeyY?this.paramControlMeta(e.paramKeyY):null;if(e.paramKeyX&&c){const d=c.min+o*(c.max-c.min||1);this.setLiveModValue(e.paramKeyX,d)}if(e.paramKeyY&&h){const d=h.min+u*(h.max-h.min||1);this.setLiveModValue(e.paramKeyY,d)}},livePadUp(){this._livePadDragging=!1},sourceTip(t){const e=this.paramSources[t.key];return e==="Beat"?"Beat/LFO":e==="MIDI"?"MIDI mapping":"Manual"},applyMotionPresetAndSelect(t){this.motionSelectedPreset=t,this.applyMotionPreset(t)},loadSelectedMotionPreset(){const t=this.motionSelectedPreset;if(t){if(this.motionPresets[t]){this.applyMotionPreset(t);return}this.motionStylesSaved[t]&&this.applySavedMotionStyle(t)}},motionAxisToLiveKey(t){return t==="zoom"?"zoom_2d":t==="angle"?"angle_2d":t==="rotation_z"?"rotation_z":t==="translation_x"||t==="translation_y"||t==="translation_z"?t:null},motionLiveKeyToScheduleKey(t){const e=String(t||"");return e==="zoom_2d"?"zoom":e==="angle_2d"?"angle":e==="rotation_z"?"rotation_3d_z":e},motionSmoothnessStartFrame(){if(this.selectedFrameThumb&&this.selectedFrameThumb.frame!=null&&!Number.isNaN(Number(this.selectedFrameThumb.frame)))return Math.max(0,Math.round(Number(this.selectedFrameThumb.frame)));const t=Number(this.deforumSettings&&this.deforumSettings.fps)||24,e=Number(this.jobPlaybackTimeSec)||0;return Math.max(0,Math.round(e*t))},readMotionScheduleValue(t,e){const i=this.motionLiveKeyToScheduleKey(t),n=this.deforumSettings&&this.deforumSettings[i];return Gm(n,e)},toggleMotionPadSpringBack(){this.motionPadSpringBack=!this.motionPadSpringBack,this.saveSessionState()},motionSmoothnessActive(){const t=this.motionSmoothness||{};return t.enabled?Math.max(1,Math.round(Number(t.frames)||1))>1:!1},applyMotionParamWithSmoothness(t,e){const i=Number(e);if(!Number.isFinite(i))return;if(!this.motionSmoothnessActive()){this.emitMotionLiveParam(t,i),this.deforumPlaying||this.schedulePreviewFrame();return}const n=Math.max(1,Math.round(Number(this.motionSmoothness.frames)||1)),s=this.motionSmoothnessStartFrame(),r=this.motionLiveKeyToScheduleKey(t),l=this.deforumSettings&&this.deforumSettings[r]||"",o=this.readMotionScheduleValue(t,s),u=r0(s,n,o,i,l);this.onDeforumFieldInput(r,u,"text")},previewMotionAxis(t,e){const i=Number(e);Number.isFinite(i)&&(t==="translation_x"?this.motionPadValues.translation_x=i:t==="translation_y"?this.motionPadValues.translation_y=i:t==="translation_z"?this.motionPadValues.translation_z=i:t==="zoom"?(this.motionPadValues.zoom=i,this.isDeforumMotion2d&&(this.motionPadValues.look_y=this.clampVal(i,-1,1))):t==="angle"?this.motionPadValues.look_x=this.clampVal(i,-1,1):t==="rotation_z"&&(this.motionPadValues.rotation_z=i))},motionAxisTargetValue(t){return t==="translation_x"?Number(this.motionPadValues.translation_x??0):t==="translation_y"?Number(this.motionPadValues.translation_y??0):t==="translation_z"?Number(this.motionPadValues.translation_z??0):t==="zoom"?Number(this.motionPadValues.zoom??1):t==="angle"?Number(this.motionPadValues.look_x??0):t==="rotation_z"?Number(this.motionPadValues.rotation_z??0):0},setMotionAxis(t,e){this.previewMotionAxis(t,e);const i=this.motionAxisToLiveKey(t);if(!i)return;const n=this.liveHudParamByKey("panx"),s=this.liveHudParamByKey("pany");t==="translation_x"&&n&&this.motionMovePadRange===1&&(n.val=this.motionPadValues.translation_x),t==="translation_y"&&s&&this.motionMovePadRange===1&&(s.val=this.motionPadValues.translation_y),this.applyMotionParamWithSmoothness(i,this.motionAxisTargetValue(t))},onMotionSmoothnessFramesChange(t){const e=Math.round(Number(t));this.motionSmoothness.frames=Number.isFinite(e)?Math.max(1,Math.min(999,e)):1,this.saveSessionState()},captureMotionPadSnapshot(){const t=this.xyPad.activePad,e=t?this.captureMotionPadSnapshotForPad(t):null;return e||{translation_x:Number(this.motionPadValues.translation_x??0),translation_y:Number(this.motionPadValues.translation_y??0),look_x:Number(this.motionPadValues.look_x??0),look_y:Number(this.motionPadValues.look_y??0)}},motionXYPadSlotById(t){return(this.motionXYPadSlots||[]).find(e=>e.id===t)||null},motionAxisRangeForKey(t){return t==="translation_x"||t==="translation_y"?this.motionMovePadRange:t==="translation_z"?10:t==="rotation_z"?180:1},setMotionXYPadAxis(t,e,i){const n=this.motionXYPadSlotById(t);if(!n||!i)return;const r=n[(e==="x"?"y":"x")==="x"?"xAxis":"yAxis"];i!==r&&(e==="x"?n.xAxis=i:n.yAxis=i,this.saveSessionState())},captureMotionPadSnapshotForPad(t){const e=this.motionXYPadSlotById(t);return e?{padId:t,xAxis:e.xAxis,yAxis:e.yAxis,x:this.motionAxisTargetValue(e.xAxis),y:this.motionAxisTargetValue(e.yAxis)}:null},commitMotionPadDrag(t){const e=this.xyPad.dragStartValues;if(!e)return;const i=this.motionXYPadSlotById(t);if(i&&e.xAxis&&e.yAxis){const n=this.motionAxisTargetValue(i.xAxis),s=this.motionAxisTargetValue(i.yAxis);if(e.x!==n){const r=this.motionAxisToLiveKey(i.xAxis);r&&this.applyMotionParamWithSmoothness(r,n)}if(e.y!==s){const r=this.motionAxisToLiveKey(i.yAxis);r&&this.applyMotionParamWithSmoothness(r,s)}return}if(t==="look"||t==="move"){const n=this.captureMotionPadSnapshot();if(t==="look"){e.look_x!==n.look_x&&this.applyMotionParamWithSmoothness("angle_2d",n.look_x),e.look_y!==n.look_y&&this.applyMotionParamWithSmoothness("zoom_2d",n.look_y);return}e.translation_x!==n.translation_x&&this.applyMotionParamWithSmoothness("translation_x",n.translation_x),e.translation_y!==n.translation_y&&this.applyMotionParamWithSmoothness("translation_y",n.translation_y)}},resetMotionToDefault(){this.motionSelectedPreset="Static",this.motionPadValues.translation_x=0,this.motionPadValues.translation_y=0,this.motionPadValues.translation_z=0,this.motionPadValues.zoom=1,this.motionPadValues.rotation_z=0,this.motionPadValues.look_x=0,this.motionPadValues.look_y=0;const t=this.liveHudParamByKey("panx"),e=this.liveHudParamByKey("pany");t&&(t.val=0),e&&(e.val=0);const i=this.isDeforumMotion2d?{translation_x:0,translation_y:0,angle_2d:0,zoom_2d:0}:{translation_x:0,translation_y:0,translation_z:0,zoom_2d:0,rotation_z:0,rotation_y:0};this.sendControl("liveParam",i),this.deforumPlaying||this.schedulePreviewFrame()},resetMotionToDefault(){this.motionSelectedPreset="Static",this.motionPadValues.translation_x=0,this.motionPadValues.translation_y=0,this.motionPadValues.translation_z=0,this.motionPadValues.zoom=1,this.motionPadValues.rotation_z=0,this.motionPadValues.look_x=0,this.motionPadValues.look_y=0;const t=this.liveHudParamByKey("panx"),e=this.liveHudParamByKey("pany");t&&(t.val=0),e&&(e.val=0);const i=this.isDeforumMotion2d?{translation_x:0,translation_y:0,angle_2d:0,zoom_2d:0}:{translation_x:0,translation_y:0,translation_z:0,zoom_2d:0,rotation_z:0,rotation_y:0};this.sendControl("liveParam",i),this.deforumPlaying||this.schedulePreviewFrame()},emitMotionLiveParam(t,e){const i=Number(e);if(!Number.isFinite(i))return;const n=this.getNow(),s=this.lastParamSent[t]||0;if(this.liveParamPending[t]=i,n-s>this.controlDelayMs){this.lastParamSent[t]=n,this.sendControl("liveParam",{[t]:i});return}clearTimeout(this.liveParamTimers[t]),this.liveParamTimers[t]=setTimeout(()=>{const r=this.liveParamPending[t];delete this.liveParamPending[t],this.lastParamSent[t]=this.getNow(),this.sendControl("liveParam",{[t]:r})},this.controlDelayMs)},sendPreset(t){const e=this.motionPresets[t];e&&(this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e),console.log(`Applied motion preset: ${t}`,e))},resetVibeParams(){const t={cfg:6,strength:.65,noise:1,cfgscale:5};this.liveVibe.forEach(e=>{t[e.key]!==void 0&&(e.val=t[e.key],this.queueLiveParam(e.key,t[e.key]))})},resetCameraParams(){const t={zoom:.8,panx:0,pany:0,tilt:0};this.liveCam.forEach(e=>{t[e.key]!==void 0&&(e.val=t[e.key],this.queueLiveParam(e.key,t[e.key]))}),this.sendControl("liveParam",this.motionPresets.Static)},isKeyboardEditableTarget(t){if(!t||typeof t!="object")return!1;if(t.isContentEditable)return!0;const e=String(t.tagName||"").toUpperCase();return e==="INPUT"||e==="TEXTAREA"||e==="SELECT"},handleKeyboardEscape(){return this.bindingLearnMode?(this.bindingLearnMode=!1,this.bindingTargetKey=null,!0):this.restoreSessionPromptOpen?(this.dismissSessionRestore(!1),!0):this.modulationMapPicker&&this.modulationMapPicker.paramKey?(this.closeModulationMapPicker(),!0):this.engineModelPickerOpen?(this.closeEngineModelPicker(),!0):this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.open?(this.closeGpuForgeModal(),!0):this.systemFiles.fullscreenIndex>=0?(this.closeSystemFileFullscreen(),!0):this.libraryWorkspaceOpen?typeof document<"u"&&document.querySelector('[data-testid="projects-fullscreen"], [data-testid="videos-fullscreen"]')?!1:(this.closeLibraryWorkspace(),!0):this.loraPickerOpen?(this.loraPickerOpen=!1,!0):this.loraCrossfaderPickerGroup?(this.loraCrossfaderPickerGroup=null,!0):this.systemFiles.cloudConnectOpen?(this.systemFiles.cloudConnectOpen=!1,!0):this.systemFiles.newFolderOpen?(this.systemFiles.newFolderOpen=!1,!0):this.videoLayerAddOpen?(this.toggleVideoLayerAdd(!1),!0):this.motionSequencerSideOpen?(this.motionSequencerSideOpen=!1,this.saveSessionState(),!0):this.showEngineDrawerShell&&this.liveEngineDrawerOpen?(this.liveEngineDrawerOpen=!1,this.saveSessionState(),this.$nextTick(()=>this.updateSidePanelDockBounds()),!0):this.rightPanelOpen?(this.rightPanelOpen=!1,this.liveDrawerOpen=!1,this.saveSessionState(),!0):!1},mainTabIds(){return(Array.isArray(this.tabs)?this.tabs:[]).map(t=>t&&t.id).filter(Boolean)},navigateMainTab(t){const e=this.mainTabIds();if(!e.length||!Number.isFinite(t))return;const i=this.currentTab==="AUDIO"?"AUDIO":this.currentTab;let n=e.indexOf(i);n<0&&(n=0);const s=e[(n+t+e.length)%e.length];this.switchTab(s)},subTabIdsForCurrentTab(){return this.currentTab==="PROMPTS"?["PROMPTS","IMAGE","LORA","CONTROLNET","STORY"]:this.currentTab==="SETTINGS"?["ENGINE","OUTPUT","GPUS","RUNS","MIDI","STYLES","PLUGINS","COLLAB"]:this.currentTab==="MODULATION"||this.currentTab==="AUDIO"?["LFO","AV_SYNC","AUDIO_REACTIVE","BEAT_MACROS","MAPPINGS"]:this.currentTab==="LIVE"?["MONITOR","DEFORUM_JOB"]:[]},navigateSubTab(t){const e=this.subTabIdsForCurrentTab();if(e.length<2||!Number.isFinite(t))return;const i=this.currentTab==="AUDIO",n=i?"MODULATION":this.currentTab;let s=i?"AUDIO_REACTIVE":this.currentSubTab[n];n==="SETTINGS"&&s==="SYSTEM"&&(s="RUNS");let r=e.indexOf(s);r<0&&(r=0);const l=e[(r+t+e.length)%e.length];if(l==="AUDIO_REACTIVE"){this.switchTab("AUDIO");return}if(i||n==="MODULATION"){this.currentTab==="AUDIO"&&this.switchTab("MODULATION"),this.switchSubTab("MODULATION",l);return}this.switchSubTab(n,l)},setupKeyboardShortcuts(){if(typeof document>"u")return;const t=this;this._keyHandler=e=>{if(e.key==="Escape"){t.handleKeyboardEscape()&&(e.preventDefault(),e.stopPropagation());return}if(t.isKeyboardEditableTarget(e.target)||e.ctrlKey||e.metaKey||e.altKey)return;if(t.bindingLearnMode&&t.bindingTargetKey){const r=e.key.toLowerCase();if(r.length===1||["arrowup","arrowdown","arrowleft","arrowright","space","enter","tab"].includes(r)){t.keyBindings[t.bindingTargetKey]=r,t.saveBindings(),t.status=`Bound "${t.bindingTargetKey}" → ${r}`,t.bindingTargetKey=null,e.preventDefault();return}}const i=Object.entries(t.keyBindings).find(([,r])=>r===e.key.toLowerCase());if(i){const[r]=i,l=t.modulationTargetByKey(r);if(l){const o=t.getParamValue(r),u=(l.max-l.min)*.05,c=Math.min(l.max,Math.max(l.min,o+u));l.field?t.applyAnimationModulation(l.field,c):t.queueLiveParam(r,c),e.preventDefault();return}}if(e.key==="ArrowLeft"){t.navigateMainTab(-1),e.preventDefault();return}if(e.key==="ArrowRight"){t.navigateMainTab(1),e.preventDefault();return}if(e.key==="ArrowUp"){t.navigateSubTab(-1),e.preventDefault();return}if(e.key==="ArrowDown"){t.navigateSubTab(1),e.preventDefault();return}const n=parseInt(e.key,10),s=t.mainTabIds();if(n>=1&&n<=s.length){t.switchTab(s[n-1]),e.preventDefault();return}switch(e.key){case" ":(t.currentTab==="LIVE"||t.showMotionSequencerDock)&&(t.generatePreviewFrame(),e.preventDefault());break;case"r":t.currentTab==="LIVE"&&(t.resetVibeParams(),t.resetCameraParams(),e.preventDefault());break;case"m":t.currentTab==="PROMPTS"&&(t.prompts.morphOn=!t.prompts.morphOn,t.setMorph(t.prompts.morphOn),e.preventDefault());break;case"l":t.currentTab==="MODULATION"&&(t.lfoOn=!t.lfoOn,e.preventDefault());break;case"b":t.currentTab==="MODULATION"&&(t.switchSubTab("MODULATION","BEAT_MACROS"),t.beatMacroOn=!t.beatMacroOn,e.preventDefault());break;case"e":t.showEngineDrawerShell&&(t.toggleEngineDrawer(),e.preventDefault());break;case"p":t.libraryWorkspaceOpen||(t.toggleRightPanel(),e.preventDefault());break}},document.addEventListener("keydown",this._keyHandler)},midiTarget(t){const e=String(t||""),i=e.match(/^mod_slot_(\d)$/);if(i){const n=Math.max(1,Math.min(6,Number(i[1])||1)),r=(Array.isArray(this.liveModulationSlots)?this.liveModulationSlots:[])[n-1];return!r||r.kind==="xypad"||!r.paramKey?null:this.modulationTargetByKey(r.paramKey)}return this.modulationTargetByKey(e)},updateMidiMapping(t){return t},setMorph(t){this.prompts.morphOn=t,this.sendControl("prompts",{morphOn:t}),t&&this.applyPromptMorphing()},parseMorphRange(t){const e=String(t||"0–1").match(/([0-9.]+)\s*[–\-]\s*([0-9.]+)/);if(!e)return{min:0,max:1};const i=Math.min(parseFloat(e[1]),parseFloat(e[2])),n=Math.max(parseFloat(e[1]),parseFloat(e[2]));return{min:i,max:n}},morphSlotInRange(t){const{min:e,max:i}=this.parseMorphRange(t.range),n=this.prompts.morphBlend??.5;return n>=e&&n<=i},morphBlendInSlotRange(t){const{min:e,max:i}=this.parseMorphRange(t.range),n=this.prompts.morphBlend??.5;return i<=e?n:Math.max(0,Math.min(1,(n-e)/(i-e)))},morphSlotPreview(t){if(!t.on||!this.morphSlotInRange(t))return"—";const e=ar({type:"prompt",valueA:t.a,valueB:t.b},this.morphBlendInSlotRange(t));if(!e)return"—";const i=t.weight!=null?t.weight:1;return i<.99?`${e} ×${i.toFixed(2)}`:e},onPromptMorphBlendInput(){this.applyPromptMorphBlend(this.prompts.morphBlend,{commitBase:!0})},onMorphSlotWeightInput(t){this.applyPromptMorphing(),this.deforumPlaying||this.schedulePreviewFrame()},onMorphSlotPhraseInput(t){this.applyPromptMorphing(),this.deforumPlaying||this.schedulePreviewFrame()},applyPromptMorphBlend(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);this.prompts.morphBlend=n,(e||!i)&&(this.prompts.morphBlendLfoBase=n),this.applyPromptMorphing(),!i&&!this.deforumPlaying&&this.schedulePreviewFrame()},setPromptMorphBlendLfoLink(t){const e=Number(t||0),i=e>=1&&e<=4?e:null;if(this.prompts.morphBlendLfoLink=this.prompts.morphBlendLfoLink===i?null:i,this.prompts.morphBlendLfoBase=this.prompts.morphBlend,this.prompts.morphBlendLfoLink){const n=this.lfos.find(s=>s.id===this.prompts.morphBlendLfoLink);n&&(n.on=!0)}},setLoraCrossfaderOn(t){this.prompts.loraCrossfaderOn=!!t,this.sendControl("prompts",{loraCrossfaderOn:this.prompts.loraCrossfaderOn}),(this.loras.groupA.length||this.loras.groupB.length)&&this.applyLoras(),this.saveSessionState()},applyLoraCrossfader(t,{commitBase:e=!1,fromModulation:i=!1}={}){const n=this.clampVal(Number(t)||0,0,1);if(this.prompts.crossfaderValue=n,this.performance.crossfader=n,(e||!i)&&(this.prompts.loraCrossfaderLfoBase=n),!this.prompts.loraCrossfaderOn){i||this.saveSessionState();return}this.performance.slots.length?this.applyCrossfadeMorph():(this.loras.groupA.length||this.loras.groupB.length)&&this.applyLoras(),i||this.saveSessionState()},setLoraCrossfaderLfoLink(t){const e=Number(t||0),i=e>=1&&e<=6?e:null;if(this.prompts.loraCrossfaderLfoLink=this.prompts.loraCrossfaderLfoLink===i?null:i,this.prompts.loraCrossfaderLfoBase=this.performance.crossfader,this.prompts.loraCrossfaderLfoLink){const n=this.lfos.find(s=>s.id===this.prompts.loraCrossfaderLfoLink);n&&(n.on=!0)}},toggleLoraFamilyCollapse(t){!t||!this.loras.familyCollapsed||!(t in this.loras.familyCollapsed)||(this.loras.familyCollapsed[t]=!this.loras.familyCollapsed[t])},applyPromptMorphing(){if(!this.prompts.morphOn)return;const t=(this.prompts.pos||"").trim(),e=t?[t]:[];for(const n of this.morphSlots){if(!n.on||!this.morphSlotInRange(n))continue;const s=ar({type:"prompt",valueA:n.a,valueB:n.b},this.morphBlendInSlotRange(n));if(!s)continue;const r=Math.max(0,Math.min(1,n.weight!=null?n.weight:1));r>=.99?e.push(s):e.push(`(${s}:${r.toFixed(2)})`)}const i=e.join(", ").trim();i&&(this.prompts.pos=i,this.sendControl("prompt",{positive:i,negative:this.prompts.neg,morphBlend:this.prompts.morphBlend}))},sendPrompts(){this.sendControl("prompt",{positive:this.prompts.pos,negative:this.prompts.neg}),this.prompts.morphOn&&this.applyPromptMorphing()},addMacro(){if(this.macrosRack.length>=6)return;const t=`macro-${Date.now()}-${Math.random().toString(36).substring(2,11)}`;this.macrosRack.push({id:t,on:!0,target:"cfg",shape:"Sine",bpm:120,depth:.5,offset:0,show:!1})},removeMacro(t){this.macrosRack.length<=1||this.macrosRack.splice(t,1)},addAudioMapping(){this.audioMappings.push({param:"",band:"mid",freq_min:250,freq_max:2e3,out_min:0,out_max:1}),this.audioMappingLevels.push(0)},setAudioActiveBandTab(t){this.audioBandTabDefs.map(i=>i.key).includes(t)&&(this.audioActiveBandTab=t)},onAudioSpectrumSelectBand(t){const e=Number(t)||0;this.audioSelectedMappingIndex=e;const i=this.audioBandTabDefs[e];i&&this.setAudioActiveBandTab(i.key)},updateAudioMappingBand({index:t,freq_min:e,freq_max:i}){const n=this.audioMappings[t];n&&(n.freq_min=e,n.freq_max=i,this.audioBandPreviewIndex===t&&this.updateAudioBandpassFilter(n))},removeAudioMapping(t){this.audioBandPreviewIndex===t?this.stopAudioBandPreview():this.audioBandPreviewIndex>t&&(this.audioBandPreviewIndex-=1),this.audioMappings.splice(t,1),this.audioMappingLevels.splice(t,1),this.audioSelectedMappingIndex>=this.audioMappings.length&&(this.audioSelectedMappingIndex=Math.max(0,this.audioMappings.length-1))},applyAudioBandPreset(t,e){const i=this.audioBandPresets[e],n=this.audioMappings[t];!i||!n||(n.freq_min=i.freq_min,n.freq_max=i.freq_max,this.audioBandPreviewIndex===t&&this.updateAudioBandpassFilter(n))},toggleAudioBandPreview(t){if(!this.audio.objectUrl){this.audioStatus="Upload audio first";return}const e=Number(t);if(!Number.isFinite(e)||e<0)return;if(this.audioBandPreviewIndex===e){this.stopAudioBandPreview(),this.audioStatus="Band preview off";return}if(!this._liveSpecAnalyser)try{this.setupLiveAudioAnalyser()}catch{}this.playAvSyncAudioForVisualizer(),this.audioBandPreviewIndex=e;const i=this.audioMappings[e];i&&this.updateAudioBandpassFilter(i),this.syncAudioBandPreviewGains(),i&&(this.audioStatus=`Previewing ${i.freq_min}–${i.freq_max} Hz`)},stopAudioBandPreview(){this.audioBandPreviewIndex=-1,this.syncAudioBandPreviewGains()},updateAudioBandpassFilter(t){const e=this._liveSpecBandpass;if(!e||!t)return;const i=Math.max(20,Number(t.freq_min)||20),n=Math.min(2e4,Math.max(i+1,Number(t.freq_max)||i+100)),s=Math.sqrt(i*n),r=Math.max(1,n-i);e.type="bandpass",e.frequency.value=s,e.Q.value=Math.max(.1,Math.min(20,s/r))},syncAudioBandPreviewGains(){const t=this.audioBandPreviewIndex>=0;this._liveSpecGain&&(this._liveSpecGain.gain.value=t?0:1),this._liveSpecSoloGain&&(this._liveSpecSoloGain.gain.value=t?1:0)},readImg2imgAsset(t,{mask:e=!1}={}){if(!t)return;const i=new FileReader;i.onload=()=>{if(e){this.img2img.maskDataUrl=i.result,this.img2img.status="Mask loaded (inpaint)";return}this.img2img.dataUrl=i.result,this.img2img.status="Input image loaded"},i.onerror=()=>{this.img2img.status=e?"Could not read mask file":"Could not read input image"},i.readAsDataURL(t)},handleImg2imgFile(t){const e=t.target.files&&t.target.files[0];this.readImg2imgAsset(e)},handleImg2imgMask(t){const e=t.target.files&&t.target.files[0];this.readImg2imgAsset(e,{mask:!0})},handleImg2imgDrop(t,e="input"){const i=t&&t.dataTransfer&&t.dataTransfer.files,n=i&&i[0];n&&this.readImg2imgAsset(n,{mask:e==="mask"})},clearImg2imgInput(){this.img2img.dataUrl=null,this.img2img.status="Input image cleared"},clearImg2imgMask(){this.img2img.maskDataUrl=null,this.img2img.status="Mask cleared"},async refreshPlugins(){if(typeof fetch=="function"){this.pluginsLoading=!0;try{const t=await fetch("/api/plugins");if(!t.ok)return;const e=await t.json();this.pluginsRegistry=Array.isArray(e.plugins)?e.plugins:[]}catch{this.pluginsRegistry=[]}finally{this.pluginsLoading=!1}}},async submitImg2img(){if(!this.img2img.dataUrl){this.img2img.status="Choose an input image first";return}this.img2img.loading=!0,this.img2img.status="Submitting…";try{const t={init_image:this.img2img.dataUrl,prompt:this.prompts.pos,negative_prompt:this.prompts.neg,denoising_strength:this.img2img.denoisingStrength,width:this.img2img.width,height:this.img2img.height};this.img2img.maskDataUrl&&(t.mask_image=this.img2img.maskDataUrl,t.mask_blur=this.img2img.maskBlur,t.inpainting_fill=this.img2img.inpaintingFill,t.inpaint_full_res=this.img2img.inpaintFullRes);const e=await fetch("/api/img2img",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),i=await e.json();if(!e.ok)throw new Error(i.error||i.detail||e.statusText);this.img2img.lastPath=i.path||null,this.img2img.status=i.path?`OK → ${i.path}`:"OK"}catch(t){this.img2img.status=String(t.message||t)}finally{this.img2img.loading=!1}},runImg2img(){return this.submitImg2img()},addLfo(){const t=this.lfos.length?Math.max(...this.lfos.map(e=>e.id))+1:1;this.lfos.push({id:t,on:!0,targets:[],shape:"Sine",bpm:this.lfoBpm||120,speed:1,depth:.2,base:null,phase:0,renderPhase:0})},removeLfo(t){this.lfos.length<=1||this.lfos.splice(t,1)},resetLfo(t){const e=this.lfos[t];e&&(e.targets=[],e.shape="Sine",e.bpm=this.lfoBpm||120,e.speed=1,e.depth=.2,e.base=null,e.phase=0,e.renderPhase=0,e.on=!1)},resetLfos(){this.lfos.forEach((t,e)=>this.resetLfo(e))},toggleLfoTarget(t,e){if(!t||!e)return;const i=t.targets.indexOf(e);if(i>=0)t.targets.splice(i,1);else if(t.targets.push(e),t.base==null){const n=this.modulationTargetByKey(e);n&&(t.base=n.default??(n.min+n.max)/2)}this.modulationSelectedLfoId=t.id},addLfoTarget(t){const e=this.lfoTargetPick[t];if(!e)return;const i=this.lfos[t];if(!i||i.targets.includes(e)){this.$set?this.$set(this.lfoTargetPick,t,""):this.lfoTargetPick[t]="";return}if(i.targets.push(e),i.base===null){const n=this.modulationTargetByKey(e);n&&(i.base=n.default??(n.min+n.max)/2)}this.lfoTargetPick[t]=""},removeLfoTarget(t,e){const i=this.lfos[t];i&&i.targets.splice(e,1)},saveCurrentMotionStyle(){const t=prompt("Enter style name:");if(!t||!t.trim())return;const e={translation_x:Number(this.motionPadValues.translation_x||0),translation_y:Number(this.motionPadValues.translation_y||0),translation_z:Number(this.motionPadValues.translation_z||0),zoom_2d:Number(this.motionPadValues.zoom??1),rotation_z:0,rotation_y:0},i=t.trim();this.motionStylesSaved[i]=e,this.motionSelectedPreset=i;try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_motion_styles",JSON.stringify(this.motionStylesSaved))}catch{}},loadMotionStyles(){try{if(typeof window<"u"&&window.localStorage){const t=window.localStorage.getItem("defora_motion_styles");if(t){const e=JSON.parse(t);e&&typeof e=="object"&&(this.motionStylesSaved=e)}}}catch{}},deleteSavedMotionStyle(t){if(confirm(`Delete saved style "${t}"?`)){delete this.motionStylesSaved[t];try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem("defora_motion_styles",JSON.stringify(this.motionStylesSaved))}catch{}}},applySavedMotionStyle(t){const e=this.motionStylesSaved[t];e&&(this.motionSelectedPreset=t,this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e))},applyMotionPreset(t){const e=this.motionPresets[t];e&&(this.sendControl("liveParam",e),this.syncMotionPadFromPayload(e))},queueLiveParam(t,e){const i=this.paramControlMeta(t),n=this.clampParamToMeta(e,i),s=i.routeKey||t,r=this.animationTargets.find(c=>c.key===s||c.key===t);if(r&&r.field){this.applyAnimationModulation(r.field,n);return}i.hud&&(i.hud.val=n,this.syncHudMotionFromParam(i.hud.key,n));const l=this.getNow(),o=this.lastParamSent[s]||0;this.liveParamPending[s]=n;const u=()=>{const c=this.liveParamPending[s];delete this.liveParamPending[s],this.lastParamSent[s]=this.getNow(),this.sendControl("liveParam",{[s]:c})};if(l-o>this.controlDelayMs){u();return}clearTimeout(this.liveParamTimers[s]),this.liveParamTimers[s]=setTimeout(u,this.controlDelayMs)},async refreshFrames(){if(typeof fetch=="function")try{const t=this.frameStripThumbs.length,e=this.frameSrcKey(this.selectedFrameThumb&&(this.selectedFrameThumb.src||this.selectedFrameThumb.url||this.selectedFrameThumb.path)||""),i=await fetch("/api/frames?limit=48",{cache:"no-store"});if(!i.ok){this.framesRefreshBackoffMs=this.nextFramesPollDelay({failed:!0});return}const n=await i.json();if(Array.isArray(n.items)){const s=this.mergeFrameThumbs(n.items,{keepCachedOnEmpty:!0});this.thumbs=s.length?s:this.thumbs,this.saveCachedFrameThumbs(this.thumbs),this.frameStripThumbs.length>t?this.applyNewGeneratedFrames(t):this.updateFrameSelection(e)}this.framesRefreshBackoffMs=this.nextFramesPollDelay(),this.syncDeforumBackdropToWebGL()}catch(t){console.warn("frames fetch failed",t),this.framesRefreshBackoffMs=this.nextFramesPollDelay({failed:!0})}},parseFrameNumber(t){if(!t)return null;const e=String(t).match(/(\d{3,})/);return e?parseInt(e.pop(),10):null},async runAudioMod(){if(!this.audio.track){this.audioStatus="Set audio file first";return}const t=this.audioMappings.filter(e=>e.param&&!Number.isNaN(e.freq_min)&&!Number.isNaN(e.freq_max)).map(e=>({param:e.param,freq_min:e.freq_min,freq_max:e.freq_max,out_min:e.out_min??0,out_max:e.out_max??1}));if(!t.length){this.audioStatus="Add at least one mapping";return}try{const e=await fetch("/api/audio-map",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({audioPath:this.audio.track,fps:this.masterFps,mappings:t,live:!0})}),i=await e.json();!e.ok||i.error?this.audioStatus=i.error||"Audio processing failed":this.audioStatus=i.ok?"Audio sent to mediator":"Audio processing finished with errors"}catch(e){this.audioStatus=String(e)}},startAudioStream(){return this.runAudioMod()},frameLabel(t){return t?t.frame!=null&&!isNaN(t.frame)?t.frame:t.name?t.name.replace(/\.[^.]+$/,""):t.src||"?":"?"},scrollSelectedFrameIntoView(t=this.selectedFrameIndex){if(typeof window>"u")return;const e=this.$refs&&this.$refs.frameRail||typeof document<"u"&&document.querySelector('[data-testid="runs-browser-frames-rail"]');if(!e||typeof e.querySelector!="function")return;const i=e.querySelector(`[data-frame-index="${t}"]`);i&&typeof i.scrollIntoView=="function"&&i.scrollIntoView({block:"nearest",inline:"center",behavior:"smooth"})},selectFrame(t,{scroll:e=!0,userInitiated:i=!1}={}){var r;if(!this.frameStripThumbs.length){this.selectedFrameIndex=-1;return}const n=Math.min(this.frameStripThumbs.length-1,Math.max(0,Number(t)||0));i&&this.deforumPlaying&&(this.frameRailFollowLatest=n>=this.frameStripThumbs.length-1),this.selectedFrameIndex=n;const s=this.frameStripThumbs[n];if(s){const l=Math.max(1,Number(this.deforumSettings.fps||((r=this.sequencer)==null?void 0:r.fps)||24)||24),o=Number(this.frameStripThumbs[0]&&this.frameStripThumbs[0].frame),u=Number(s.frame);Number.isFinite(o)&&Number.isFinite(u)&&(this.timecode=this.formatPlaybackTime((u-o)/l))}e&&this.$nextTick(()=>this.scrollSelectedFrameIntoView(n))},stepFrameSelection(t){if(!this.frameStripThumbs.length)return;const e=Number.isFinite(Number(this.selectedFrameIndex))?Number(this.selectedFrameIndex):this.frameStripThumbs.length-1;this.selectFrame(e+Number(t||0))},frameIndexForTime(t){var l;if(!this.frameStripThumbs.length)return-1;const e=Math.max(1,Number(this.deforumSettings.fps||((l=this.sequencer)==null?void 0:l.fps)||24)||24),i=Number(this.frameStripThumbs[0]&&this.frameStripThumbs[0].frame);if(!Number.isFinite(i))return-1;const n=i+Math.round(Math.max(0,Number(t)||0)*e);let s=0,r=Number.POSITIVE_INFINITY;return this.frameStripThumbs.forEach((o,u)=>{const c=Number(o&&o.frame);if(!Number.isFinite(c))return;const h=Math.abs(c-n);h=0&&this.selectFrame(e,{scroll:!1})},updateFrameSelection(t=""){if(!this.frameStripThumbs.length){this.selectedFrameIndex=-1;return}if(this.deforumPlaying&&this.frameRailFollowLatest){this.followLatestGeneratedFrame();return}if(t){const e=this.frameStripThumbs.findIndex(i=>this.frameSrcKey(i.src||i.url||i.path||"")===this.frameSrcKey(t));if(e>=0){this.selectFrame(e,{scroll:!1});return}}if(this.deforumPlaying&&this.playerEl&&Number.isFinite(Number(this.playerEl.currentTime))){const e=this.frameIndexForTime(this.playerEl.currentTime);if(e>=0){this.selectFrame(e,{scroll:!1});return}}this.selectedFrameIndex>=0&&this.selectedFrameIndex{const o=Math.min(16e3,Math.max(20,Number(l)||20)),u=(Math.log(o)-Math.log(20))/(Math.log(16e3)-Math.log(20));return Math.min(100,Math.max(0,u*100))},s=n(t&&t.freq_min),r=n(t&&t.freq_max);return{left:`${Math.min(s,r)}%`,width:`${Math.max(1.5,Math.abs(r-s))}%`}},async scanMidi(){if(!navigator.requestMIDIAccess){this.midi.supported=!1;return}try{const t=await navigator.requestMIDIAccess({sysex:!1}),e=[];t.inputs.forEach(i=>{e.push({id:i.id,name:i.name}),i.onmidimessage=n=>this.handleMidi(i,n)}),this.midi.devices=e,!this.midi.selected&&e.length&&(this.midi.selected=e[0].id),this.loadMidiMappings()}catch{this.midiStatus="MIDI not available"}},loadMidiMappings(){const t=typeof window<"u"&&window.localStorage||typeof global<"u"&&global.window&&global.window.localStorage;if(t)try{const e=t.getItem("defora_midi_mappings");if(e){const i=JSON.parse(e);Array.isArray(i)&&i.length>0&&(this.midi.mappings=i,console.log("Loaded MIDI mappings from localStorage",i))}}catch(e){console.error("Failed to load MIDI mappings",e)}},saveMidiMappings(){const t=typeof window<"u"&&window.localStorage||typeof global<"u"&&global.window&&global.window.localStorage;if(!t)return!1;try{return t.setItem("defora_midi_mappings",JSON.stringify(this.midi.mappings)),console.log("Saved MIDI mappings to localStorage",this.midi.mappings),!0}catch(e){return console.error("Failed to save MIDI mappings",e),!1}},addMidiMapping(){this.midi.mappings.push({control:"New Mapping",cc:0,key:""}),this.saveMidiMappings()},deleteMidiMapping(t){this.midi.mappings.splice(t,1),this.saveMidiMappings()},updateMidiMapping(t){return this.saveMidiMappings(),t},loadBindings(){try{const t=typeof window<"u"&&window.localStorage||null;if(!t)return;const e=t.getItem("defora_key_bindings");if(e){const i=JSON.parse(e);i&&typeof i=="object"&&(this.keyBindings={...this.keyBindings,...i})}}catch{}},saveBindings(){try{const t=typeof window<"u"&&window.localStorage||null;if(!t)return;t.setItem("defora_key_bindings",JSON.stringify(this.keyBindings))}catch{}},toggleBindingLearn(){this.bindingLearnMode=!this.bindingLearnMode,this.bindingTargetKey=null,this.bindingLearnMode?this.status="Learn mode: press key or move MIDI CC, then click a parameter":this.status="Learn mode disabled"},resetBindings(){confirm("Reset all bindings to defaults?")&&(this.keyBindings={translation_z:"w",translation_x:"a",translation_y:"s",rotation_y:"d",rotation_z:"q",fov:"f",cfg:"z",strength:"x",noise_multiplier:"c"},this.saveBindings(),this.status="Bindings reset to defaults")},getKeyBinding(t){return this.keyBindings[t]||null},clearKeyBinding(t){delete this.keyBindings[t],this.saveBindings()},getMidiBinding(t){const e=this.midi.mappings.find(i=>i.key===t);return e?e.cc:null},clearMidiBinding(t){const e=this.midi.mappings.findIndex(i=>i.key===t);e>=0&&(this.midi.mappings.splice(e,1),this.saveMidiMappings())},getParamValue(t){var r;const e=this.liveParamCanonicalKey(t),i=this.liveHudParamByKey(t)||this.liveHudParamByKey((r=Object.entries(this.liveParamAliases).find(([,l])=>l===t||l===e))==null?void 0:r[0]);if(i)return i.val;const n=this.animationTargets.find(l=>l.key===t||l.key===e);if(n&&n.field&&this.defaultAnimation){const l=Number(this.defaultAnimation[n.field]);return Number.isFinite(l)?l:n.default??0}if(e==="translation_x")return Number(this.motionPadValues.translation_x??0);if(e==="translation_y")return Number(this.motionPadValues.translation_y??0);if(e==="translation_z")return Number(this.motionPadValues.translation_z??0);if(e==="zoom_2d")return Number(this.motionPadValues.zoom??1);const s=this.modulationTargetByKey(e);return s?s.default??0:0},async refreshPresets(){this.presetsLoading=!0;try{const{data:t}=await jt("/api/presets",{},"presets list");this.availablePresets=t.presets||[]}catch{}finally{this.presetsLoading=!1}},async loadPreset(t){try{const i=await(await fetch(`/api/presets/${t}`)).json();i.preset&&(i.preset.liveVibe&&(this.liveVibe=i.preset.liveVibe),i.preset.liveCam&&(this.liveCam=i.preset.liveCam),i.preset.audio&&Object.assign(this.audio,i.preset.audio),i.preset.cn&&Object.assign(this.cn,i.preset.cn),i.preset.lfos&&(this.lfos=i.preset.lfos),i.preset.macrosRack&&(this.macrosRack=i.preset.macrosRack),i.preset.loras&&(this.loras.common=i.preset.loras.common||[],this.loras.groupA=i.preset.loras.groupA||[],this.loras.groupB=i.preset.loras.groupB||[],await this.refreshLoras()),i.preset.prompts&&Object.assign(this.prompts,i.preset.prompts),this.currentPreset=t,this.presetStatus=`Loaded preset: ${t}`,setTimeout(()=>{this.presetStatus=""},3e3))}catch(e){console.error("Failed to load preset",e),this.presetStatus=`Error loading preset: ${e.message}`}},async saveCurrentPreset(){const t=this.newPresetName||"untitled",e={liveVibe:this.liveVibe,liveCam:this.liveCam,audio:{bpm:this.audio.bpm,track:this.audio.track},cn:{slots:this.cn.slots,active:this.cn.active},loras:{common:this.loras.common,groupA:this.loras.groupA,groupB:this.loras.groupB},prompts:{pos:this.prompts.pos,neg:this.prompts.neg,morphOn:this.prompts.morphOn,loraCrossfaderOn:this.prompts.loraCrossfaderOn,crossfaderValue:this.prompts.crossfaderValue,loraCrossfaderLfoLink:this.prompts.loraCrossfaderLfoLink,loraCrossfaderLfoBase:this.prompts.loraCrossfaderLfoBase,morphBlend:this.prompts.morphBlend,morphBlendLfoLink:this.prompts.morphBlendLfoLink,morphBlendLfoBase:this.prompts.morphBlendLfoBase},lfos:this.lfos,macrosRack:this.macrosRack,paramSources:this.paramSources};try{(await(await fetch(`/api/presets/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json()).ok&&(this.currentPreset=t,this.presetStatus=`Saved preset: ${t}`,this.newPresetName="",await this.refreshPresets(),setTimeout(()=>{this.presetStatus=""},3e3))}catch(i){console.error("Failed to save preset",i),this.presetStatus=`Error saving preset: ${i.message}`}},async deletePreset(t){if(confirm(`Delete preset "${t}"?`))try{await fetch(`/api/presets/${t}`,{method:"DELETE"}),this.currentPreset=null,this.presetStatus=`Deleted preset: ${t}`,await this.refreshPresets(),setTimeout(()=>{this.presetStatus=""},3e3)}catch(e){console.error("Failed to delete preset",e),this.presetStatus=`Error deleting preset: ${e.message}`}},invalidateAudioSpectrogram(){this._spectrogramGen=(this._spectrogramGen||0)+1,this.audioSpectrogramDataUrl=null,this.audioSpectrogramStatus=""},buildSpectrogramRgba(t,e){t.sampleRate,t.numberOfChannels;const i=t.length,n=t.getChannelData(0),s=i>=8192?1024:Math.max(256,Math.pow(2,Math.floor(Math.log2(i/4)))),r=s/2,l=Math.max(1,Math.floor((i-s)/r)+1),o=s/2,u=Math.max(64,l),c=Math.max(32,Math.min(o,128)),h=new Uint8ClampedArray(u*c*4),d=Math.max(1,l/u);for(let m=0;m=i)break;const L=.5*(1-Math.cos(2*Math.PI*k/(s-1))),x=n[C]*L,T=2*Math.PI*w*k/s;v+=x*Math.cos(T),y-=x*Math.sin(T)}const S=Math.sqrt(v*v+y*y)/s,P=Math.min(1,S*10),M=(w*u+m)*4;P<.25?(h[M]=0,h[M+1]=Math.floor(P*4*255),h[M+2]=255):P<.5?(h[M]=0,h[M+1]=255,h[M+2]=Math.floor((1-(P-.25)*4)*255)):P<.75?(h[M]=Math.floor((P-.5)*4*255),h[M+1]=255,h[M+2]=0):(h[M]=255,h[M+1]=Math.floor((1-(P-.75)*4)*255),h[M+2]=0),h[M+3]=255}}return{width:u,height:c,data:h}},spectrogramRgbaToDataUrl(t){if(typeof OffscreenCanvas<"u"){const e=new OffscreenCanvas(t.width,t.height),i=e.getContext("2d"),n=i.createImageData(t.width,t.height);return n.data.set(t.data),i.putImageData(n,0,0),e.toDataURL("image/png")}if(typeof document<"u"){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d"),n=i.createImageData(t.width,t.height);return n.data.set(t.data),i.putImageData(n,0,0),e.toDataURL("image/png")}return null},scheduleAudioSpectrogramDecode(t){typeof setTimeout=="function"&&setTimeout(()=>{this.runAudioSpectrogramFromObjectUrl(t).catch(()=>{})},0)},async runAudioSpectrogramFromObjectUrl(t){const e=typeof AudioContext<"u"?AudioContext:typeof webkitAudioContext<"u"?webkitAudioContext:null;if(!e||!this.audio.objectUrl||typeof fetch!="function"){t===this._spectrogramGen&&(this.audioSpectrogramStatus="");return}if(t!==this._spectrogramGen)return;let i=null;try{const s=await(await fetch(this.audio.objectUrl)).arrayBuffer();if(t!==this._spectrogramGen)return;i=new e;const r=await i.decodeAudioData(s.slice(0));if(t!==this._spectrogramGen)return;const l=this.buildSpectrogramRgba(r,{});if(!l){this.audioSpectrogramStatus="";return}const o=this.spectrogramRgbaToDataUrl(l);if(t!==this._spectrogramGen)return;this.audioSpectrogramDataUrl=o,this.audioSpectrogramStatus=""}catch{t===this._spectrogramGen&&(this.audioSpectrogramStatus="")}finally{try{i&&typeof i.close=="function"&&await i.close()}catch{}}},spectrogramFromAudioBuffer(t,e){return this.buildSpectrogramRgba(t,e||{})},disposeLiveAudioAnalyser(){this._liveSpecRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._liveSpecRaf),this._liveSpecRaf=null;const t=this.$refs&&this.$refs.avSyncAudio;if(t&&this._liveSpecMediaHandlers){const i=this._liveSpecMediaHandlers;i.play&&t.removeEventListener("play",i.play),i.pause&&t.removeEventListener("pause",i.pause),this._liveSpecMediaHandlers=null}try{this._liveSpecSource&&typeof this._liveSpecSource.disconnect=="function"&&this._liveSpecSource.disconnect()}catch{}try{this._liveSpecAnalyser&&typeof this._liveSpecAnalyser.disconnect=="function"&&this._liveSpecAnalyser.disconnect()}catch{}try{this._liveSpecGain&&typeof this._liveSpecGain.disconnect=="function"&&this._liveSpecGain.disconnect()}catch{}try{this._liveSpecBandpass&&typeof this._liveSpecBandpass.disconnect=="function"&&this._liveSpecBandpass.disconnect()}catch{}try{this._liveSpecSoloGain&&typeof this._liveSpecSoloGain.disconnect=="function"&&this._liveSpecSoloGain.disconnect()}catch{}const e=this._liveSpecCtx;if(this._liveSpecCtx=null,this._liveSpecSource=null,this._liveSpecAnalyser=null,this._liveSpecGain=null,this._liveSpecBandpass=null,this._liveSpecSoloGain=null,this._liveSpecFreqBuf=null,this.audioBandPreviewIndex=-1,e&&typeof e.close=="function")try{e.close()}catch{}},setupLiveAudioAnalyser(){const t=typeof AudioContext<"u"?AudioContext:typeof webkitAudioContext<"u"?webkitAudioContext:null;if(!t)return;this.disposeLiveAudioAnalyser();const e=this.$refs&&this.$refs.avSyncAudio;if(!(!e||!this.audio.objectUrl))try{const i=new t,n=i.createMediaElementSource(e),s=i.createAnalyser();s.fftSize=1024,s.smoothingTimeConstant=.78;const r=i.createGain();r.gain.value=1;const l=i.createBiquadFilter();l.type="bandpass";const o=i.createGain();if(o.gain.value=0,n.connect(s),s.connect(r),r.connect(i.destination),n.connect(l),l.connect(o),o.connect(i.destination),this._liveSpecCtx=i,this._liveSpecSource=n,this._liveSpecAnalyser=s,this._liveSpecGain=r,this._liveSpecBandpass=l,this._liveSpecSoloGain=o,this._liveSpecFreqBuf=new Uint8Array(s.frequencyBinCount),this.syncAudioBandPreviewGains(),this.audioBandPreviewIndex>=0){const h=this.audioMappings[this.audioBandPreviewIndex];h&&this.updateAudioBandpassFilter(h)}const u=()=>this.onLiveAudioPlay(),c=()=>this.onLiveAudioPause();e.addEventListener("play",u),e.addEventListener("pause",c),this._liveSpecMediaHandlers={play:u,pause:c},e.paused||this.onLiveAudioPlay()}catch{this.disposeLiveAudioAnalyser()}},onLiveAudioPlay(){try{this._liveSpecCtx&&this._liveSpecCtx.state==="suspended"&&typeof this._liveSpecCtx.resume=="function"&&this._liveSpecCtx.resume()}catch{}this.scheduleLiveSpectrumFrame()},onLiveAudioPause(){this._liveSpecRaf!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(this._liveSpecRaf),this._liveSpecRaf=null,this.paintLiveSpectrumCanvases(null)},scheduleLiveSpectrumFrame(){this._liveSpecRaf==null&&typeof requestAnimationFrame=="function"&&(this._liveSpecRaf=requestAnimationFrame(()=>{this._liveSpecRaf=null;const t=this.$refs&&this.$refs.avSyncAudio,e=this._liveSpecAnalyser,i=this._liveSpecFreqBuf;!e||!i||(t&&!t.paused&&!t.ended?(e.getByteFrequencyData(i),this.paintLiveSpectrumCanvases(i),this.scheduleLiveSpectrumFrame()):this.paintLiveSpectrumCanvases(null))}))},paintLiveSpectrumCanvases(t){const e=[this.$refs.liveSpectrumCanvas,this.$refs.liveSpectrumCanvasStrip].filter(Boolean);for(const i of e){if(!i||!i.getContext)continue;const n=i.getContext("2d");if(!n)continue;const s=i.width||280,r=i.height||56;if(!t||!t.length){n.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),n.fillRect(0,0,s,r);continue}ov(n,t,s,r,{bgColor:this.themeColor("--bg-0","rgb(8, 9, 13)"),barColor:"rgba(80, 250, 123, 0.9)"})}},async handleAudioUpload(t){const e=t.target.files[0];if(!e)return;this.disposeLiveAudioAnalyser(),this.invalidateAudioSpectrogram();const i=50*1024*1024;if(e.size!=null&&e.size>i){this.audioStatus="Audio file is too large. Maximum supported size is 50MB.",t&&t.target&&(t.target.value="");return}if(this.audio.objectUrl){try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.objectUrl=null}if(typeof URL<"u"&&typeof URL.createObjectURL=="function"&&typeof Blob<"u"&&e instanceof Blob)try{this.audio.objectUrl=URL.createObjectURL(e),this.audioBeatMacrosCollapsed=!0}catch{this.audio.objectUrl=null}this.audioStatus="Uploading audio…";try{const n=await new Promise((u,c)=>{const h=new FileReader;h.onload=()=>u(h.result),h.onerror=()=>c(h.error||new Error("Failed to read audio file. Ensure the file is under 50MB and try again.")),h.readAsDataURL(e)}),s=await fetch("/api/audio-upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e.name,data:n})}),r=await s.json();if(!s.ok||r.error)throw new Error(r.error||"Upload failed");this.audio.uploadedFile=e.name,this.audio.track=r.path||e.name,this.audioStatus="Audio uploaded";const l=this._spectrogramGen;this.audio.objectUrl&&(this.audioSpectrogramStatus="Analyzing…",this.scheduleAudioSpectrogramDecode(l));const o=()=>{try{this.setupLiveAudioAnalyser()}catch{}};typeof this.$nextTick=="function"?this.$nextTick(o):setTimeout(o,0),this.primeAudioSpectrumPlaceholder()}catch(n){if(this.audio.objectUrl){try{URL.revokeObjectURL(this.audio.objectUrl)}catch{}this.audio.objectUrl=null}this.audioStatus=String(n&&n.message?n.message:n),console.error("Audio upload failed:",n),this.invalidateAudioSpectrogram(),this.disposeLiveAudioAnalyser()}},onAudioUpload(t){return this.handleAudioUpload(t)},primeAudioSpectrumPlaceholder(){const t=new Array(512);for(let e=0;en.json()).then(n=>{n.error&&console.error("ControlNet upload:",n.error)}).catch(n=>console.error("ControlNet upload failed",n)),t.target.value=""},async toggleWebcam(){this.cn.webcamActive?this.stopWebcam():await this.startWebcam()},async startWebcam(){try{const t=await navigator.mediaDevices.getUserMedia({video:{width:512,height:512,facingMode:"user"}});this.cn.webcamStream=t,this.cn.webcamActive=!0;const e=this.$refs.webcamVideo;e&&(e.srcObject=t,e.style.display="block",this.cn.webcamVideo=e);const i=this.$refs.webcamCanvas;i&&(this.cn.webcamCanvas=i,i.width=512,i.height=512),this.cn.webcamCaptureInterval=setInterval(()=>this.captureWebcamFrame(),this.webcamCaptureRate)}catch(t){console.error("Failed to start webcam:",t),alert("Could not access webcam. Check browser permissions.")}},stopWebcam(){this.cn.webcamCaptureInterval&&(clearInterval(this.cn.webcamCaptureInterval),this.cn.webcamCaptureInterval=null),this.cn.webcamStream&&(this.cn.webcamStream.getTracks().forEach(e=>e.stop()),this.cn.webcamStream=null);const t=this.$refs.webcamVideo;t&&(t.style.display="none",t.srcObject=null),this.cn.webcamActive=!1},captureWebcamFrame(){const t=this.cn.webcamVideo,e=this.cn.webcamCanvas;if(!t||!e||t.readyState<2)return;e.getContext("2d").drawImage(t,0,0,512,512),e.toBlob(async n=>{if(!n)return;const s=this.cn.slots.find(l=>l.id===this.cn.active);if(!s||s.imageSource!=="webcam")return;const r=new FormData;r.append("image",n,"webcam_frame.png"),r.append("slot",this.cn.active);try{await fetch("/api/controlnet/upload-image",{method:"POST",body:r})}catch(l){console.error("Webcam frame upload failed:",l)}},"image/png")},async startScreenCapture(){try{const t=await navigator.mediaDevices.getDisplayMedia({video:{width:512,height:512}}),e=document.createElement("video");e.srcObject=t,e.autoplay=!0,e.playsInline=!0;const i=document.createElement("canvas");i.width=512,i.height=512;const n=setInterval(()=>{e.readyState<2||(i.getContext("2d").drawImage(e,0,0,512,512),i.toBlob(async s=>{if(!s)return;const r=this.cn.slots.find(o=>o.id===this.cn.active);if(!r||r.imageSource!=="screen")return;const l=new FormData;l.append("image",s,"screen_capture.png"),l.append("slot",this.cn.active);try{await fetch("/api/controlnet/upload-image",{method:"POST",body:l})}catch(o){console.error("Screen capture upload failed:",o)}},"image/png"))},this.webcamCaptureRate);t.getVideoTracks()[0].onended=()=>clearInterval(n)}catch(t){console.error("Failed to start screen capture:",t),alert("Could not start screen capture. Check browser permissions.")}},handleMidi(t,e){const[i,n,s]=e.data;if(!((i&240)===176))return;const l=this.midi.mappings.find(u=>u.cc===n),o=s/127;if(l&&l.key){const u=String(l.key||""),c=u.match(/^mod_slot_(\d)$/);if(c){const d=Math.max(1,Math.min(6,Number(c[1])||1)),g=(Array.isArray(this.liveModulationSlots)?this.liveModulationSlots:[])[d-1];if(g){if(g.kind==="xypad"){const b=this.modulationTargetByKey(g.paramKeyX);if(b){const w=b.min+o*(b.max-b.min),v={},y={};this.routeModulationValue(b.key,w,v,y),Object.keys(v).length&&this.sendControl("liveParam",v),Object.values(y).forEach(S=>this.updateControlNet(S))}}else if(g.paramKey){const b=this.modulationTargetByKey(g.paramKey);if(b){const w=b.min+o*(b.max-b.min),v={},y={};this.routeModulationValue(b.key,w,v,y),Object.keys(v).length&&this.sendControl("liveParam",v),Object.values(y).forEach(S=>this.updateControlNet(S))}else this.sendControl("liveParam",{[g.paramKey]:o})}}return}const h=this.midiTarget(u);if(h){const d=h.min+o*(h.max-h.min),m={},g={};this.routeModulationValue(h.key,d,m,g),Object.keys(m).length&&this.sendControl("liveParam",m),Object.values(g).forEach(b=>this.updateControlNet(b))}else this.sendControl("liveParam",{[u]:o})}},sortedKeyframes(t){return[...t.keyframes||[]].sort((e,i)=>e.t-i.t)},setKeyframeEasing(t,e){t&&(t.easing=e==="linear"?void 0:e)},sequencerEaseT(t,e){const i=Math.min(1,Math.max(0,t)),n=e||"linear";return n==="easeIn"?i*i*i:n==="easeOut"?1-(1-i)**3:n==="easeInOut"?i<.5?4*i*i*i:1-(-2*i+2)**3/2:i},sequencerPayload(){const t=Array.isArray(this.sequencer.markers)?[...this.sequencer.markers].map(e=>({t:Number(e.t),name:String(e.name||"").trim(),action:e.action||"jump",target:e.target||""})).filter(e=>e.name&&Number.isFinite(e.t)).sort((e,i)=>e.t-i.t):[];return{version:1,durationSec:Number(this.sequencer.durationSec),fps:Number(this.sequencer.fps),loop:!!this.sequencer.loop,markers:t,clips:this.normalizeSequencerClipsForSave(this.sequencer.clips),tracks:this.sequencer.tracks.map(e=>({id:e.id,param:e.param,keyframes:[...e.keyframes].sort((i,n)=>i.t-n.t)}))}},normalizeSequencerClipsForSave(t){const e=new Set(["prompt","lora","controlnet"]),i=Number(this.sequencer.durationSec)||0;return Array.isArray(t)?t.filter(n=>n&&e.has(n.type)&&Number.isFinite(Number(n.t))).map(n=>{const s=Math.min(Math.max(0,Number(n.t)),i);let r=n.endT==null||n.endT===""?null:Number(n.endT);return r!=null&&Number.isFinite(r)?r=Math.min(Math.max(s,r),i):r=null,{id:String(n.id||`clip-${Date.now()}`),type:n.type,t:s,endT:r,label:String(n.label||n.type).slice(0,48),payload:n.payload&&typeof n.payload=="object"?n.payload:{}}}).sort((n,s)=>n.t-s.t):[]},clampSequencerClips(){const t=Number(this.sequencer.durationSec)||0,e=this.sequencer.clips;if(Array.isArray(e))for(const i of e)!i||typeof i.t!="number"||(i.t<0&&(i.t=0),i.t>t&&(i.t=t),i.endT!=null&&typeof i.endT=="number"&&(i.endTt&&(i.endT=t)))},snapshotSequencerPromptPayload(){return{pos:String(this.prompts.pos||""),neg:String(this.prompts.neg||"")}},snapshotSequencerLoraPayload(){const t=e=>(e||[]).map(i=>({id:i.id,name:i.name,path:i.path,strength:Number(i.strength)||0}));return{common:t(this.loras.common),groupA:t(this.loras.groupA),groupB:t(this.loras.groupB),crossfaderValue:Number(this.prompts.crossfaderValue)||0,loraCrossfaderOn:!!this.prompts.loraCrossfaderOn}},snapshotSequencerControlNetPayload(){return{slots:(this.cn.slots||[]).map(t=>({id:t.id,model:t.model,weight:Number(t.weight)||0,start:Number(t.start)||0,end:Number(t.end)??1,enabled:!!t.enabled}))}},addSequencerClip(t){if(!new Set(["prompt","lora","controlnet"]).has(t))return;this.clampSequencerPlayhead();const i=Math.max(0,Number(this.sequencer.durationSec)||0);if(i<.1){this.sequencerStatus="Set timeline duration above 0s first";return}const n=Array.isArray(this.sequencer.clips)?this.sequencer.clips:[];if(n.length>=96){this.sequencerStatus="Maximum 96 timeline clips";return}const s=Math.min(Math.max(0,this.sequencerPlayhead),i),r=Math.max(.1,Number(this.sequencerClipDurationSec)||2),l=Math.min(i,s+r),o=n.filter(m=>m.type===t).length+1,u={prompt:"Prompt",lora:"LoRA",controlnet:"ControlNet"};let c={};t==="prompt"?c=this.snapshotSequencerPromptPayload():t==="lora"?c=this.snapshotSequencerLoraPayload():c=this.snapshotSequencerControlNetPayload();const h=`clip-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,d={id:h,type:t,t:s,endT:l>s?l:null,label:`${u[t]} ${o}`,payload:c};this.sequencer.clips=[...n,d],this.sequencerSelectedClipId=h,this.sequencerStatus=`Added ${d.label} at ${s.toFixed(2)}s`,this.saveSessionState(),this.$nextTick(()=>this.drawTimeline());try{this.applySequencerClip(d)}catch(m){console.warn("[sequencer] apply clip failed",m)}},removeSequencerClip(t){if(!Array.isArray(this.sequencer.clips))return;const e=this.sequencer.clips.findIndex(i=>i.id===t);e<0||(this.sequencer.clips.splice(e,1),this.sequencerSelectedClipId===t&&(this.sequencerSelectedClipId=null))},jumpToSequencerClip(t){if(!t||typeof t.t!="number")return;const e=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead=Math.min(Math.max(0,t.t),e),this.sequencerSelectedClipId=t.id,this.previewSequencerFrame()},selectSequencerClip(t){this.sequencerSelectedClipId=t},activeSequencerClipAt(t,e){const i=Number(t)||0,n=(this.sequencer.clips||[]).filter(s=>s&&s.type===e&&Number.isFinite(Number(s.t))&&i>=Number(s.t)).filter(s=>s.endT==null||iNumber(r.t)>=Number(s.t)?r:s,n[0]):null},applySequencerClip(t){if(!(!t||!t.payload)){if(t.type==="prompt"){t.payload.pos!=null&&(this.prompts.pos=String(t.payload.pos)),t.payload.neg!=null&&(this.prompts.neg=String(t.payload.neg)),this.sendPrompts();return}if(t.type==="lora"){const e=(i,n)=>{this.loras[n]=(i||[]).map(s=>({id:s.id||s.path,name:s.name||s.path,path:s.path,strength:Number(s.strength)||1}))};e(t.payload.common,"common"),e(t.payload.groupA,"groupA"),e(t.payload.groupB,"groupB"),t.payload.crossfaderValue!=null&&(this.prompts.crossfaderValue=Number(t.payload.crossfaderValue)||0),t.payload.loraCrossfaderOn!=null&&(this.prompts.loraCrossfaderOn=!!t.payload.loraCrossfaderOn),this.applyLoras();return}if(t.type==="controlnet"&&Array.isArray(t.payload.slots))for(const e of t.payload.slots){const i=this.cn.slots.find(n=>n.id===e.id);i&&(e.model!=null&&(i.model=e.model),e.weight!=null&&(i.weight=e.weight),e.start!=null&&(i.start=e.start),e.end!=null&&(i.end=e.end),e.enabled!=null&&(i.enabled=e.enabled),this.updateControlNet(i))}}},applySequencerClipsAt(t){for(const e of["prompt","lora","controlnet"]){const i=this.activeSequencerClipAt(t,e);i&&this.applySequencerClip(i)}},clipTypeLabel(t){return t==="prompt"?"Prompt":t==="lora"?"LoRA":t==="controlnet"?"ControlNet":t},clipSummaryText(t){var e,i,n,s,r,l,o,u;if(!t)return"";if(t.type==="prompt"){const c=String(((e=t.payload)==null?void 0:e.pos)||"").trim();return c.length>48?`${c.slice(0,48)}…`:c||"Empty prompt"}if(t.type==="lora"){const c=(((n=(i=t.payload)==null?void 0:i.common)==null?void 0:n.length)||0)+(((r=(s=t.payload)==null?void 0:s.groupA)==null?void 0:r.length)||0)+(((o=(l=t.payload)==null?void 0:l.groupB)==null?void 0:o.length)||0);return`${c} LoRA${c===1?"":"s"}`}if(t.type==="controlnet"){const c=(((u=t.payload)==null?void 0:u.slots)||[]).filter(h=>h.enabled).length;return`${c} slot${c===1?"":"s"} on`}return""},clampSequencerMarkers(){const t=Number(this.sequencer.durationSec)||0,e=this.sequencer.markers;if(Array.isArray(e)){for(const i of e)!i||typeof i.t!="number"||(i.t<0&&(i.t=0),i.t>t&&(i.t=t));this.clampSequencerClips()}},clampSequencerPlayhead(){const t=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead<0&&(this.sequencerPlayhead=0),this.sequencerPlayhead>t&&(this.sequencerPlayhead=t),this.clampSequencerMarkers()},addSequencerMarker(){this.clampSequencerPlayhead();const t=Number(this.sequencer.durationSec)||0;let e=(this.sequencerMarkerName||"").trim()||"Scene";if(e.length>48&&(e=e.slice(0,48)),!/^[a-zA-Z0-9_ \-.]+$/.test(e)){this.sequencerStatus="Marker label: letters, digits, space, underscore, hyphen, dot only";return}if(Array.isArray(this.sequencer.markers)||(this.sequencer.markers=[]),this.sequencer.markers.length>=64){this.sequencerStatus="Maximum 64 markers";return}const i=Math.min(Math.max(0,this.sequencerPlayhead),t);this.sequencer.markers.push({t:i,name:e,action:"jump",target:""}),this.sequencerStatus=""},removeSequencerMarker(t){const i=this.sortedSequencerMarkers[t];if(!i||!Array.isArray(this.sequencer.markers))return;const n=this.sequencer.markers.indexOf(i);n>=0&&this.sequencer.markers.splice(n,1)},jumpToSequencerMarker(t){if(!t||typeof t.t!="number")return;const e=Number(this.sequencer.durationSec)||0;this.sequencerPlayhead=Math.min(Math.max(0,t.t),e),this.previewSequencerFrame()},setMarkerAction(t,e){t&&(t.action=e,(e==="jump"||e==="generate"||e==="pause")&&(t.target=""))},setMarkerTarget(t,e){t&&(t.target=e)},markerActionPlaceholder(t){switch(t){case"preset":return"Preset name";case"morph":return"Slot #";case"param":return'{"param": value}';default:return""}},markerActionTitle(t){switch(t){case"preset":return"Name of a motion preset (e.g. Orbit, Zoom)";case"morph":return"Morph slot number to toggle (1, 2, 3...)";case"param":return'JSON object of params to apply (e.g. {"zoom": 1.5})';default:return""}},interpolateTrack(t,e){const i=Number(this.sequencer.durationSec)||0,n=Math.min(Math.max(0,e),i),s=this.sortedKeyframes(t);if(!s.length)return null;if(n<=s[0].t)return s[0].v;if(n>=s[s.length-1].t)return s[s.length-1].v;let r=0;for(;rthis.updateControlNet(n)),this.applySequencerClipsAt(t)},previewSequencerFrame(){this.clampSequencerPlayhead(),this.jobPlaybackTimeSec=Number(this.sequencerPlayhead)||0,this.applySequencerAt(this.sequencerPlayhead);const t=this.ws&&this.ws.readyState===1;!t&&this.sequencer.tracks.some(e=>e.keyframes&&e.keyframes.length)?this.sequencerStatus="Preview applied locally — connect live control for engine output":t&&(this.sequencerStatus="")},tickSequencer(){const t=Number(this.sequencer.durationSec)||0,e=1/Math.max(1,Number(this.sequencer.fps)||24);let i=this.sequencerPlayhead+e;const n=this.sequencerPlayhead;if(i>=t-1e-9)if(this.sequencer.loop)i=0;else{this.sequencerPlayhead=t,this.applySequencerAt(this.sequencerPlayhead),this.stopSequencerPlayback();return}this.sequencerPlayhead=i,this.applySequencerAt(this.sequencerPlayhead);const s=this.sequencer.markers||[];for(const r of s)r.t>n&&r.t<=i&&this.triggerMarkerAction(r)},triggerMarkerAction(t){if(!(!t||!t.action))switch(t.action){case"jump":this.sequencerPlayhead=t.t,this.previewSequencerFrame();break;case"preset":t.target&&this.motionPresets[t.target]&&(this.sendPreset(t.target),this.sequencerStatus=`Marker: applied preset "${t.target}"`);break;case"generate":this.generateStory(),this.sequencerStatus="Marker: triggered generation";break;case"morph":if(t.target){const e=parseInt(t.target)-1;e>=0&&en.keyframes&&n.keyframes.length)){this.sequencerStatus="Add keyframes to play";return}const e=this.ws&&this.ws.readyState===1;this.sequencerPlaying=!0,this.sequencerStatus=e?"":"Playing locally — connect live control for engine output";const i=Math.max(16,Math.round(1e3/Math.max(1,Number(this.sequencer.fps)||24)));this.sequencerTimer=setInterval(()=>this.tickSequencer(),i)},stopSequencerPlayback(){this.sequencerPlaying=!1,this.sequencerTimer&&(clearInterval(this.sequencerTimer),this.sequencerTimer=null)},addSequencerTrack(){const t=this.sequencerNewParam;if(this.sequencer.tracks.some(i=>i.param===t)){this.sequencerStatus="Track already exists for "+t;return}const e="tr-"+Date.now()+"-"+Math.random().toString(36).slice(2,7);this.sequencer.tracks.push({id:e,param:t,keyframes:[]}),this.sequencerSelectedTrackId=e,this.sequencerStatus=""},removeSequencerTrack(t){this.sequencer.tracks=this.sequencer.tracks.filter(e=>e.id!==t),this.sequencerSelectedTrackId===t&&(this.sequencerSelectedTrackId=null)},addSequencerKeyframe(){const t=this.sequencerSelectedTrackId||this.sequencer.tracks[0]&&this.sequencer.tracks[0].id,e=this.sequencer.tracks.find(s=>s.id===t);if(!e){this.sequencerStatus="Add a track first";return}this.clampSequencerPlayhead();const i=Math.min(Math.max(0,this.sequencerPlayhead),Number(this.sequencer.durationSec)||0),n=Number(this.sequencerKeyframeVal);if(Number.isNaN(n)){this.sequencerStatus="Invalid keyframe value";return}e.keyframes.push({t:i,v:n}),this.sequencerStatus=""},removeSequencerKeyframe(t,e){const i=this.sequencer.tracks.find(l=>l.id===t);if(!i)return;const s=this.sortedKeyframes(i)[e];if(!s)return;const r=i.keyframes.indexOf(s);r>=0&&i.keyframes.splice(r,1)},async refreshSequencerList(){if(typeof fetch=="function")try{const e=await(await fetch("/api/sequencer")).json();Array.isArray(e.timelines)&&(this.sequencerList=e.timelines)}catch{}},async saveSequencerTimeline(){const e=(this.sequencerSaveName||"timeline").trim().replace(/[^a-zA-Z0-9_-]/g,"");if(!e){this.sequencerStatus="Invalid save name";return}try{const i=await fetch("/api/sequencer/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.sequencerPayload())}),n=await i.json();if(!i.ok)throw new Error(n.error||i.statusText);this.sequencerStatus="Saved "+e,await this.refreshSequencerList()}catch(i){this.sequencerStatus=String(i.message||i)}},async loadSequencerTimeline(){const t=this.sequencerLoadPick;if(t)try{const e=await fetch("/api/sequencer/"+encodeURIComponent(t)),i=await e.json();if(!e.ok||!i.timeline)throw new Error(i.error||"load failed");const n=i.timeline;n.durationSec!=null&&(this.sequencer.durationSec=n.durationSec),n.fps!=null&&(this.sequencer.fps=n.fps),this.sequencer.loop=n.loop!==!1,this.sequencer.markers=Array.isArray(n.markers)?n.markers.map(s=>({t:Number(s.t),name:String(s.name||"").trim(),action:s.action||"jump",target:s.target||""})).filter(s=>s.name&&Number.isFinite(s.t)):[],this.sequencer.tracks=Array.isArray(n.tracks)?n.tracks.map(s=>({id:s.id||"tr-"+Math.random().toString(36).slice(2),param:s.param,keyframes:Array.isArray(s.keyframes)?s.keyframes.slice():[]})):[],this.sequencer.clips=this.normalizeSequencerClipsForSave(n.clips||[]),this.sequencerSelectedClipId=this.sequencer.clips[0]?this.sequencer.clips[0].id:null,this.sequencerSaveName=t,this.sequencerSelectedTrackId=this.sequencer.tracks[0]?this.sequencer.tracks[0].id:null,this.clampSequencerPlayhead(),this.sequencerStatus="Loaded "+t}catch(e){this.sequencerStatus=String(e.message||e)}},exportSequencerDownload(){const t=JSON.stringify(this.sequencerPayload(),null,2),e=new Blob([t],{type:"application/json"}),i=(this.sequencerSaveName||"sequencer").replace(/[^a-zA-Z0-9_-]/g,"")||"sequencer",n=document.createElement("a");n.href=URL.createObjectURL(e),n.download=i+".json",n.click(),URL.revokeObjectURL(n.href)},async applySequencerToDeforumSettings(){const t=Math.max(1,Number(this.sequencer.fps)||24),e=Math.max(.1,Number(this.sequencer.durationSec)||1),i=Math.ceil(e*t),n={};for(const s of this.sequencer.tracks){const r=this.modulationTargets.find(c=>c.key===s.param),l=(r==null?void 0:r.deforumKey)||s.param;if(!s.keyframes.length)continue;const u=[...s.keyframes].sort((c,h)=>c.t-h.t).map(c=>{const h=Math.round(Math.min(i,Math.max(0,c.t*t))),d=Number.isFinite(c.v)?c.v:0;return`${h}:(${d.toFixed(4)})`});n[l]=u.join(", ")}if(!Object.keys(n).length){this.sequencerStatus="No keyframed tracks — add tracks/keyframes or Apply a Story first";return}try{const r={...this.deforumSettings||{},...n},l=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:r})});if(!l.ok)throw new Error(`HTTP ${l.status}`);this.sequencerStatus=`Applied ${Object.keys(n).length} schedule(s) to Deforum settings`,this.loadDeforumSettings({syncServerModel:!1})}catch(s){this.sequencerStatus="Apply failed: "+s.message}},selectSequencerTrack(t){this.sequencerSelectedTrackId=t},sequencerTimeFromJobFrame(t){const e=this.sequencerJobFps,i=this.sequencerJobTotalFrames;return(Math.min(i,Math.max(1,Math.floor(Number(t)||1)))-1)/e},seekSequencerToJobFrame(t){const e=Number(this.sequencer.durationSec)||0,i=Math.min(e,Math.max(0,this.sequencerTimeFromJobFrame(t)));this.seekSequencer(i)},seekSequencer(t){this.sequencerPlayhead=Math.min(Math.max(0,Number(t)||0),Math.max(.01,Number(this.sequencer.durationSec)||.01)),this.jobPlaybackTimeSec=this.sequencerPlayhead,this.previewSequencerFrame()},updateSequencerKeyframe({trackId:t,keyframe:e,t:i,v:n}){!this.sequencer.tracks.find(r=>r.id===t)||!e||(e.t=Math.min(Math.max(0,Number(i)||0),Math.max(.01,Number(this.sequencer.durationSec)||.01)),e.v=Number(n))},getTrackValueAt(t,e){const i=this.sortedKeyframes(t);if(!i.length)return 0;if(e<=i[0].t)return i[0].v;if(e>=i[i.length-1].t)return i[i.length-1].v;for(let n=0;n=i[n].t&&e<=i[n+1].t){const s=i[n+1].t-i[n].t,r=s>0?(e-i[n].t)/s:0,l=i[n],o=i[n+1];if(l.hIn!==void 0||l.hOut!==void 0||o.hIn!==void 0||o.hOut!==void 0){l.hOut!=null&&l.hOut,o.hIn!=null&&o.hIn;const c=l.hOutV!=null?l.hOutV:l.v+(o.v-l.v)*.33,h=o.hInV!=null?o.hInV:l.v+(o.v-l.v)*.67;return this.cubicBezier(r,l.v,c,h,o.v)}const u=this.sequencerEaseT(r,l.easing);return l.v+(o.v-l.v)*u}return i[i.length-1].v},drawTimeline(){const t=this.$refs.timelineCanvas;if(!t||!this.sequencer.tracks.length)return;const e=t.getContext("2d"),i=window.devicePixelRatio||1,n=t.getBoundingClientRect();t.width=n.width*i,t.height=Math.max(120,this.sequencer.tracks.length*40+20)*i,e.scale(i,i);const s=n.width,r=n.height,l=Math.max(.01,Number(this.sequencer.durationSec)||8),o=(r-20)/Math.max(1,this.sequencer.tracks.length),u=LZ;e.clearRect(0,0,s,r),e.fillStyle=this.themeColor("--bg-0","rgb(8, 9, 13)"),e.fillRect(0,0,s,r),this.sequencer.tracks.forEach((d,m)=>{const g=20+m*o,b=this.sortedKeyframes(d);if(!b.length){e.strokeStyle=DZ,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(0,g+o/2),e.lineTo(s,g+o/2),e.stroke(),e.setLineDash([]),e.fillStyle=Nf,e.font="10px monospace",e.fillText(d.param+" (no keyframes)",6,g+o/2+3);return}let w=Math.min(...b.map(M=>M.v)),v=Math.max(...b.map(M=>M.v));const y=v-w||1;w-=y*.15,v+=y*.15;const S=u[m%u.length];e.strokeStyle=IZ,e.lineWidth=1,e.strokeRect(0,g,s,o),e.fillStyle=S+"20",e.fillRect(0,g,s,o),e.strokeStyle=S,e.lineWidth=2,e.beginPath();const P=Math.max(s,100);for(let M=0;M<=P;M++){const k=M/P*l,C=this.getTrackValueAt(d,k),L=k/l*s,x=g+o-(C-w)/(v-w)*o;M===0?e.moveTo(L,x):e.lineTo(L,x)}e.stroke(),b.forEach((M,k)=>{const C=M.t/l*s,L=M.v,x=g+o-(L-w)/(v-w)*o;if(k{const m=d.t/l*s,g=this.themeColor("--error","rgb(226, 75, 74)");e.strokeStyle=g+"80",e.lineWidth=1,e.setLineDash([2,3]),e.beginPath(),e.moveTo(m,20),e.lineTo(m,r),e.stroke(),e.setLineDash([]),e.fillStyle=g,e.font="8px monospace",e.fillText(d.name,m+3,14)});const h=this.sequencerPlayhead/l*s;e.strokeStyle=this.themeColor("--media-text","rgb(255, 255, 255)"),e.lineWidth=2,e.beginPath(),e.moveTo(h,20),e.lineTo(h,r),e.stroke(),e.fillStyle=this.themeColor("--media-text","rgb(255, 255, 255)"),e.beginPath(),e.moveTo(h-5,20),e.lineTo(h+5,20),e.lineTo(h,26),e.closePath(),e.fill();for(let d=0;d<=4;d++){const m=l/4*d,g=m/l*s;e.fillStyle=Nf,e.font="8px monospace",e.fillText(m.toFixed(1)+"s",g+2,r-2)}},seekTimeline(t){const e=this.$refs.timelineCanvas;if(!e)return;const i=e.getBoundingClientRect(),n=t.clientX-i.left,s=Math.max(.01,Number(this.sequencer.durationSec)||8);this.sequencerPlayhead=Math.max(0,Math.min(s,n/i.width*s)),this.drawTimeline()},hoverTimeline(t){const e=this.$refs.timelineCanvas;if(!e)return;const i=e.getBoundingClientRect(),n=t.clientX-i.left,s=Math.max(.01,Number(this.sequencer.durationSec)||8);this.timelineHoverTime=Math.max(0,Math.min(s,n/i.width*s)),this.timelineHoverPercent=n/i.width*100},motionPadPuckStyleFor(t){const e=t==="look"?1:this.motionMovePadRange,i=Number(t==="look"?this.motionPadValues.look_x??0:this.motionPadValues.translation_x||0),n=Number(t==="look"?this.motionPadValues.look_y??0:this.motionPadValues.translation_y||0),s=(i+e)/(e*2)*100,r=(1-(n+e)/(e*2))*100;return{left:`${Math.min(100,Math.max(0,s))}%`,top:`${Math.min(100,Math.max(0,r))}%`}},motionPadMouseDown(t,e){this.motionPadDragStart(e),this.updateMotionPad(t,e,{previewOnly:this.motionSmoothnessActive()}),t.preventDefault()},motionPadDragStart(t){this.xyPad.dragging=!0,this.xyPad.activePad=t,this.xyPad.dragStartValues=this.captureMotionPadSnapshotForPad(t)||this.captureMotionPadSnapshot()},motionPadMouseMove(t,e){!this.xyPad.dragging||this.xyPad.activePad!==e||(this.updateMotionPad(t,e),t.preventDefault())},motionPadMouseUp(t){const e=t||this.xyPad.activePad;if(this.xyPad.dragging&&e){const i=this.motionXYPadSlotById(e);i&&!this.motionPadSpringBack?this.applyMotionPadAxisValues(i.xAxis,i.yAxis,this.motionAxisTargetValue(i.xAxis),this.motionAxisTargetValue(i.yAxis),{previewOnly:!1}):this.motionSmoothnessActive()&&this.commitMotionPadDrag(e)}this.xyPad.dragging=!1,this.xyPad.activePad=null,this.xyPad.dragStartValues=null},applyMotionPadAxisValues(t,e,i,n,s={}){const r=!!s.previewOnly;this.previewMotionAxis(t,Number(i)||0),this.previewMotionAxis(e,Number(n)||0);const l=this.liveHudParamByKey("panx"),o=this.liveHudParamByKey("pany");if(t==="translation_x"&&l&&this.motionMovePadRange===1&&(l.val=this.motionPadValues.translation_x),e==="translation_y"&&o&&this.motionMovePadRange===1&&(o.val=this.motionPadValues.translation_y),!r){const u=this.motionAxisToLiveKey(t),c=this.motionAxisToLiveKey(e);u&&this.emitMotionLiveParam(u,this.motionAxisTargetValue(t)),c&&this.emitMotionLiveParam(c,this.motionAxisTargetValue(e))}!r&&!this.deforumPlaying&&this.schedulePreviewFrame()},applyMotionPadValues(t,e,i,n={}){const s=!!n.previewOnly;if(t==="look"){this.applyMotionPadAxisValues("angle","zoom",e,i,{previewOnly:s});return}this.applyMotionPadAxisValues("translation_x","translation_y",e,i,{previewOnly:s})},xyPadMouseDown(t){this.motionPadMouseDown(t,"move")},xyPadMouseMove(t){this.motionPadMouseMove(t,"move")},xyPadMouseUp(){this.motionPadMouseUp()},updateMotionPad(t,e,i={}){const s=t.currentTarget.getBoundingClientRect();let r,l;t.touches&&t.touches.length>0?(r=t.touches[0].clientX,l=t.touches[0].clientY):(r=t.clientX,l=t.clientY);const o=s.width||this.xyPad.padSize||1,u=s.height||this.xyPad.padSize||1,c=Math.max(0,Math.min(o,r-s.left)),h=Math.max(0,Math.min(u,l-s.top)),d=this.clampVal(c/o*2-1,-1,1),m=this.clampVal(1-h/u*2,-1,1),g=!!i.previewOnly;if(e==="look")this.applyMotionPadValues("look",d,m,{previewOnly:g});else{const b=this.motionMovePadRange;this.applyMotionPadValues("move",d*b,m*b,{previewOnly:g})}},async refreshLoras(){this.lorasLoading=!0;try{const{data:t}=await jt("/api/loras",{},"loras list");if(t.loras){this.loras.available=t.loras.map(i=>({id:i.id||i.name,name:i.name,path:i.path||"",thumbnail:i.thumbnail||null,metadata:i.metadata||null,family:this.detectLoraFamily(i),strength:i.strength||1,selected:!1,group:null})),this.loras.source=t.source||"unknown";const e=new Map(this.loras.available.map(i=>[i.id,i]));this.loras.common.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="COMMON",n.strength=i.strength)}),this.loras.groupA.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="A",n.strength=i.strength)}),this.loras.groupB.forEach(i=>{const n=e.get(i.id);n&&(n.selected=!0,n.group="B",n.strength=i.strength)})}}catch(t){console.error("Failed to load LoRAs",t)}finally{this.lorasLoading=!1}},toggleLoraSelection(t){t.selected?this.removeLoraSelection(t):(t.selected=!0,t.group="COMMON",this.assignLoraToGroup(t,"COMMON"))},assignLoraToGroup(t,e){if(e!=="A"&&e!=="B"&&e!=="COMMON")return;this.loras.common=this.loras.common.filter(n=>n.id!==t.id),this.loras.groupA=this.loras.groupA.filter(n=>n.id!==t.id),this.loras.groupB=this.loras.groupB.filter(n=>n.id!==t.id),t.group=e,t.selected=!0;const i={id:t.id,name:t.name,path:t.path,strength:t.strength,thumbnail:t.thumbnail};e==="COMMON"?this.loras.common.push(i):e==="A"?this.loras.groupA.push(i):this.loras.groupB.push(i)},removeLoraSelection(t){t.selected=!1,t.group=null,this.loras.common=this.loras.common.filter(e=>e.id!==t.id),this.loras.groupA=this.loras.groupA.filter(e=>e.id!==t.id),this.loras.groupB=this.loras.groupB.filter(e=>e.id!==t.id)},unassignLora(t){const e=this.loras.available.find(i=>i.id===t.id);e&&(e.selected=!1,e.group=null),this.loras.common=this.loras.common.filter(i=>i.id!==t.id),this.loras.groupA=this.loras.groupA.filter(i=>i.id!==t.id),this.loras.groupB=this.loras.groupB.filter(i=>i.id!==t.id)},updateLoraStrength(t){const e=this.loras.common.find(s=>s.id===t.id);e&&(e.strength=t.strength);const i=this.loras.groupA.find(s=>s.id===t.id);i&&(i.strength=t.strength);const n=this.loras.groupB.find(s=>s.id===t.id);n&&(n.strength=t.strength)},updateGroupedLoraStrength(t,e,i){const n=parseFloat(i);if(!Number.isFinite(n))return;const r=(t==="COMMON"?this.loras.common:t==="B"?this.loras.groupB:this.loras.groupA).find(o=>o.id===e.id);r&&(r.strength=n);const l=this.loras.available.find(o=>o.id===e.id);l&&(l.strength=n,l.selected=!0,l.group=t)},updateCrossfader(){const t=this.loraCrossfaderBlending,e=this.prompts.crossfaderValue;this.sendControl("crossfader",{value:e,loraCrossfaderOn:this.prompts.loraCrossfaderOn,common:this.loras.common.map(i=>({...i,effectiveStrength:i.strength})),groupA:this.loras.groupA.map(i=>({...i,effectiveStrength:t?i.strength*(1-e):i.strength})),groupB:this.loras.groupB.map(i=>({...i,effectiveStrength:t?i.strength*e:i.strength}))})},applyLoras(){const t=this.loraCrossfaderBlending,e=this.prompts.crossfaderValue,i={common:this.loras.common.map(n=>({name:n.name,path:n.path,strength:n.strength})),groupA:this.loras.groupA.map(n=>({name:n.name,path:n.path,strength:t?n.strength*(1-e):n.strength})),groupB:this.loras.groupB.map(n=>({name:n.name,path:n.path,strength:t?n.strength*e:n.strength})),crossfaderValue:e,loraCrossfaderOn:this.prompts.loraCrossfaderOn};this.sendControl("loras",i),console.log("Applied LoRAs with crossfader",i)},clearAllLoras(){this.loras.available.forEach(t=>{t.selected=!1,t.group=null}),this.loras.common=[],this.loras.groupA=[],this.loras.groupB=[],this.sendControl("loras",{common:[],groupA:[],groupB:[],crossfaderValue:this.prompts.crossfaderValue})},_genRnd(t){return t[Math.floor(Math.random()*t.length)]},generatorRequestBody(){const t=this.generator.stylePreset==="custom"?this.generator.customStyle.trim()||"Masterpiece, Realistic":this.generator.stylePreset,e=Number(this.deforumSettings&&this.deforumSettings.W)||Number((this.generator.resolution||"1024x576").split("x")[0])||1024,i=Number(this.deforumSettings&&this.deforumSettings.H)||Number((this.generator.resolution||"1024x576").split("x")[1])||576,n=Number(this.sequencer&&this.sequencer.fps)||Number(this.framesync&&this.framesync.fps)||Number(this.generator.fps)||24,s=Number(this.deforumSettings&&this.deforumSettings.max_frames)||Number(this.framesync&&this.framesync.frameCount)||Number(this.generator.totalFrames)||96,r=Math.max(2,Number(this.generator.numScenes)||4);return ep({theme:this.generator.theme.trim()||this._genRnd(this.genData.defaultThemes),style:t,width:e,height:i,fps:n,totalFrames:s,numScenes:r})},_buildScene(t,e,i,n){const s=y=>this._genRnd(y),r=this.genData,l=i===0?"opening":i>=n-1?"closing":i1;y++)w=s(g);const v=s(r.negatives);return`A ${o} scene from ${t} — ${c}, ${h}. ${d}, ${m}, inspired by ${b} and ${w} --neg ${v}`},_buildMotion(t,e,i){const n=this.genData,s=Math.random.bind(Math),r=n.cameraBehaviors,l=[];let o=null;for(let S=0;S1&&M<10);l.push(P),o=P}const u=[],c=[],h=[],d=[],m=[];let g=null,b=null,w=null,v=null;for(let S=0;S1&&(y["Transform Center X"]=d.join(", ")),m.length>1&&(y["Transform Center Y"]=m.join(", ")),y},storyMotionDeforumKeyMap(){return{Zoom:"zoom","Translation X":"translation_x","Translation Y":"translation_y","Transform Center X":"transform_center_x","Transform Center Y":"transform_center_y","Rotation 3D X":"rotation_3d_x","Rotation 3D Y":"rotation_3d_y","Rotation 3D Z":"rotation_3d_z"}},sequencerParamForDeforumKey(t){if(!t)return null;const e=this.modulationTargets.find(i=>i.deforumKey===t||i.key===t);return e?e.key:t},parseMotionScheduleToKeyframes(t,e){const i=String(t||"").trim();if(!i)return[];const n=Math.max(1,Number(e)||24),s=[];for(const r of i.split(",")){const l=r.trim();if(!l)continue;const o=l.match(/^(\d+)\s*:\s*\(([^)]+)\)\s*$/);if(!o)continue;const u=Number(o[1]),c=o[2].trim();let h=Number(c);if(!Number.isFinite(h)){const d=c.match(/^-?\d+(?:\.\d+)?/);h=d?Number(d[0]):NaN}!Number.isFinite(u)||!Number.isFinite(h)||s.push({t:u/n,v:h})}return s.sort((r,l)=>r.t-l.t)},importStoryMotionToSequencer(t){var s;if(!t||typeof t!="object")return 0;const e=Math.max(1,Number(this.sequencer.fps)||24),i=this.storyMotionDeforumKeyMap();let n=0;for(const[r,l]of Object.entries(t)){const o=i[r];if(!o)continue;const u=this.sequencerParamForDeforumKey(o),c=this.parseMotionScheduleToKeyframes(l,e);if(!c.length)continue;let h=this.sequencer.tracks.find(d=>d.param===u);h||(h={id:`tr-story-${u}-${Date.now()}`,param:u,keyframes:[]},this.sequencer.tracks.push(h)),h.keyframes=c,n+=1}return n&&(this.sequencerSelectedTrackId=((s=this.sequencer.tracks[0])==null?void 0:s.id)||null,this.sequencerStatus=`Imported ${n} motion track(s) from story`,this.saveSessionState()),n},async applyStoryMotionToDeforumSettings(t){if(!t||typeof t!="object"||typeof fetch!="function")return;const e=this.storyMotionDeforumKeyMap(),i={};for(const[n,s]of Object.entries(t)){const r=e[n];r&&s&&(i[r]=String(s))}if(Object.keys(i).length)try{const n={...this.deforumSettings||{},...i},s=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:n})});if(!s.ok)throw new Error(`HTTP ${s.status}`);this.loadDeforumSettings({syncServerModel:!1})}catch(n){console.warn("[story] apply motion to deforum failed",n)}},buildLocalStoryResult(){const t=this.generatorRequestBody(),e=Math.max(1,Math.floor(t.totalFrames/t.numScenes)),i={};for(let r=0;r{this.generator.status=""},4e3)},rejectStory(){this.generator.result=null,this.generator.status="Discarded.",setTimeout(()=>{this.generator.status=""},2e3)},async refreshGeneratorPresets(){try{const e=await(await fetch("/api/presets")).json();this.generatorPresets=(e.presets||[]).filter(i=>i.startsWith("gen-"))}catch(t){console.error("Failed to load generator presets",t)}},async loadGeneratorPreset(t){try{const i=await(await fetch(`/api/presets/${t}`)).json();i.preset&&i.preset.generator&&(Object.assign(this.generator,i.preset.generator),this.generator.result=null,this.currentGeneratorPreset=t,this.generatorPresetStatus=`Loaded: ${t}`,setTimeout(()=>{this.generatorPresetStatus=""},3e3))}catch(e){this.generatorPresetStatus=`Error: ${e.message}`}},async saveGeneratorPreset(){const e=`gen-${(this.newGeneratorPresetName||"default").replace(/[^a-zA-Z0-9_-]/g,"-")}`,i={generator:{theme:this.generator.theme,stylePreset:this.generator.stylePreset,customStyle:this.generator.customStyle,fps:this.generator.fps,resolution:this.generator.resolution,totalFrames:this.generator.totalFrames,numScenes:this.generator.numScenes}};try{(await(await fetch(`/api/presets/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).json()).ok&&(this.currentGeneratorPreset=e,this.newGeneratorPresetName="",this.generatorPresetStatus=`Saved: ${e}`,await this.refreshGeneratorPresets(),setTimeout(()=>{this.generatorPresetStatus=""},3e3))}catch(n){this.generatorPresetStatus=`Error: ${n.message}`}},async deleteGeneratorPreset(t){if(confirm(`Delete preset "${t}"?`))try{await fetch(`/api/presets/${t}`,{method:"DELETE"}),this.currentGeneratorPreset=null,this.generatorPresetStatus=`Deleted: ${t}`,await this.refreshGeneratorPresets(),setTimeout(()=>{this.generatorPresetStatus=""},3e3)}catch(e){this.generatorPresetStatus=`Error: ${e.message}`}},sessionStorageKey(){return`defora_session_${this.session||"default"}`},sessionStorageTouchedKey(){return`${this.sessionStorageKey()}__touchedAt`},sessionRestoreDeclinedKey(){return`${this.sessionStorageKey()}__restoreDeclinedAt`},hasSessionRestoreDeclined({now:t=Date.now(),maxAgeMs:e=24*60*60*1e3}={}){try{if(typeof window>"u")return!1;const i=window.localStorage;if(!i)return!1;const n=i.getItem(this.sessionRestoreDeclinedKey()),s=n!=null?Number(n):NaN;return Number.isFinite(s)&&s>0&&t-s<=e}catch{return!1}},markSessionRestoreDeclined(){try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem(this.sessionRestoreDeclinedKey(),String(Date.now()))}catch{}},clearSessionRestoreDeclined(){try{typeof window<"u"&&window.localStorage&&window.localStorage.removeItem(this.sessionRestoreDeclinedKey())}catch{}},hasRecentSessionResumeToken({now:t=Date.now(),maxAgeMs:e=24*60*60*1e3}={}){try{if(typeof window>"u")return!1;const i=window.localStorage;if(!i)return!1;const n=i.getItem(this.sessionStorageTouchedKey()),s=n!=null?Number(n):NaN;if(!(Number.isFinite(s)&&s>0&&t-s<=e))return!1;try{const l=typeof document<"u"&&document.cookie?String(document.cookie):"";if(!l)return!0;const o=String(this.session||"default");return l.includes("defora_session=")||l.includes(`defora_session_${o}=`)||l.includes("defora=")}catch{return!0}}catch{return!1}},loadSessionState(){try{const t=window.localStorage&&window.localStorage.getItem(this.sessionStorageKey()),e=this.pendingSessionStateRaw||t;if(!e)return;const i=JSON.parse(e);if(this.pendingSessionStateRaw="",this.sessionDeforumSettingsLoaded=!1,typeof i.crossfader=="number"&&(this.performance.crossfader=i.crossfader),typeof i.genericPrompt=="string"&&(this.performance.genericPrompt=i.genericPrompt),Array.isArray(i.slots)&&(this.performance.slots=i.slots),typeof i.runsBrowserTab=="string"&&(i.runsBrowserTab==="active"||i.runsBrowserTab==="past"||i.runsBrowserTab==="frames")?this.runsBrowserTab=i.runsBrowserTab:i.showFrames===!0&&(this.runsBrowserTab="frames"),typeof i.showFrames=="boolean"&&(this.showFrames=i.showFrames),typeof i.rightPanelOpen=="boolean"?(this.rightPanelOpen=i.rightPanelOpen,this.liveDrawerOpen=i.rightPanelOpen):typeof i.liveDrawerOpen=="boolean"&&(this.rightPanelOpen=i.liveDrawerOpen,this.liveDrawerOpen=i.liveDrawerOpen),(i.sidePanelDock==="auto"||i.sidePanelDock==="edge"||i.sidePanelDock==="video")&&(this.sidePanelDock=i.sidePanelDock),typeof i.liveEngineDrawerOpen=="boolean"&&(this.liveEngineDrawerOpen=i.liveEngineDrawerOpen),typeof i.layersSidebarOpen=="boolean"&&(this.layersSidebarOpen=i.layersSidebarOpen),typeof i.liveBottomDrawerOpen=="boolean"&&(this.liveBottomDrawerOpen=i.liveBottomDrawerOpen),typeof i.liveBottomDrawerTab=="string"&&(i.liveBottomDrawerTab==="MODULATION"||i.liveBottomDrawerTab==="CROSSFADER"||i.liveBottomDrawerTab==="SYSTEM")&&(this.liveBottomDrawerTab=i.liveBottomDrawerTab),i.currentSubTab&&i.currentSubTab.LIVE&&(this.currentSubTab.LIVE=this.normalizeLiveSubTab(i.currentSubTab.LIVE)),i.currentSubTab&&i.currentSubTab.MOTION&&(this.currentSubTab.MOTION=this.normalizeMotionSubTab(i.currentSubTab.MOTION)),Array.isArray(i.liveSources)&&(this.liveSources=i.liveSources),(i.liveSourcePanel==="library"||i.liveSourcePanel==="cloud")&&(this.liveSourcePanel=i.liveSourcePanel),typeof i.activeVideoLayerId=="string"&&(this.activeVideoLayerId=i.activeVideoLayerId),typeof i.videoLayerAddOpen=="boolean"&&(this.videoLayerAddOpen=i.videoLayerAddOpen),typeof i.inputLayerPlaybackUrl=="string"&&(this.inputLayerPlaybackUrl=i.inputLayerPlaybackUrl),typeof i.inputLayerLabel=="string"&&(this.inputLayerLabel=i.inputLayerLabel),(i.videoStageSize==="small"||i.videoStageSize==="medium"||i.videoStageSize==="full")&&(this.videoStageSize=i.videoStageSize),typeof i.liveAnimationBoxOpen=="boolean"&&(this.liveAnimationBoxOpen=i.liveAnimationBoxOpen,this.enginePanelDetailsOpen=i.liveAnimationBoxOpen),typeof i.enginePanelDetailsOpen=="boolean"&&(this.enginePanelDetailsOpen=i.enginePanelDetailsOpen,this.liveAnimationBoxOpen=i.enginePanelDetailsOpen),(i.enginePanelDetailsTab==="ENGINE"||i.enginePanelDetailsTab==="JOB")&&(this.enginePanelDetailsTab=i.enginePanelDetailsTab),i.videoLayerPreviewVisible&&typeof i.videoLayerPreviewVisible=="object"){const n=i.videoLayerPreviewVisible;(this.videoLayers||[]).forEach(s=>{s&&Object.prototype.hasOwnProperty.call(n,s.id)&&(s.previewVisible=n[s.id]!==!1)})}if(i.videoLayerOpacity&&typeof i.videoLayerOpacity=="object"){const n=i.videoLayerOpacity;(this.videoLayers||[]).forEach(s=>{if(s&&Object.prototype.hasOwnProperty.call(n,s.id)){const r=Number(n[s.id]);Number.isFinite(r)&&(s.opacity=Math.max(0,Math.min(1,r)))}})}if(i.cloudDriveDraft&&typeof i.cloudDriveDraft=="object"&&(this.cloudDriveDraft={url:String(i.cloudDriveDraft.url||""),provider:String(i.cloudDriveDraft.provider||"google_drive")}),i.systemFiles&&typeof i.systemFiles=="object"){const n=i.systemFiles;this.systemFiles={...this.systemFiles,rootId:typeof n.rootId=="string"?n.rootId:this.systemFiles.rootId,recursive:typeof n.recursive=="boolean"?n.recursive:this.systemFiles.recursive,viewMode:n.viewMode==="videos-only"?"videos-only":"browse",showFilenames:typeof n.showFilenames=="boolean"?n.showFilenames:this.systemFiles.showFilenames,sortKey:typeof n.sortKey=="string"?n.sortKey:this.systemFiles.sortKey,zoomLevel:Number.isFinite(Number(n.zoomLevel))?n.zoomLevel:this.systemFiles.zoomLevel,roots:[],currentPath:"",parent:"",folders:[],videos:[],folderCount:null,videoCount:null,loading:!1,status:"",selectedPaths:Array.isArray(n.selectedPaths)?n.selectedPaths:[],fullscreenIndex:-1,_rootsLoaded:!1}}if(typeof i.hlsWatchEnabled=="boolean"&&(this.hlsWatchEnabled=i.hlsWatchEnabled,this.hlsWatchEnabled&&this.$nextTick(()=>this.attachPlayer())),typeof i.libraryFullscreen=="boolean"&&(this.libraryFullscreen=i.libraryFullscreen),typeof i.libraryWorkspaceOpen=="boolean"?(this.libraryWorkspaceOpen=i.libraryWorkspaceOpen,(i.libraryWorkspacePane==="editor"||i.libraryWorkspacePane==="browser")&&(this.libraryWorkspacePane=i.libraryWorkspacePane)):typeof i.libraryEditorOpen=="boolean"&&i.libraryEditorOpen&&(this.libraryWorkspaceOpen=!0,this.libraryWorkspacePane="editor"),(i.librarySubTab==="RUNS"||i.librarySubTab==="BROWSER")&&(this.librarySubTab=i.librarySubTab==="RUNS"?"BROWSER":i.librarySubTab),typeof i.editorFreecutRoute=="string"&&(this.editorFreecutRoute=i.editorFreecutRoute),typeof i.editorPendingImportPath=="string"&&(this.editorPendingImportPath=i.editorPendingImportPath),typeof i.editorPendingImportRootId=="string"&&(this.editorPendingImportRootId=i.editorPendingImportRootId),typeof i.editorPendingImportUrl=="string"&&(this.editorPendingImportUrl=i.editorPendingImportUrl),typeof i.runsAutoRefresh=="boolean"&&(this.runsAutoRefresh=i.runsAutoRefresh),Number.isFinite(Number(i.runsPollIntervalSec))&&(this.runsPollIntervalSec=Math.max(2,Math.min(60,Number(i.runsPollIntervalSec)))),typeof i.paramPanelOpen=="boolean"&&(this.paramPanelOpen=i.paramPanelOpen),typeof i.deforumPanelOpen=="boolean"&&(this.deforumPanelOpen=i.deforumPanelOpen),typeof i.deforumActiveTab=="string"){const n=nh.map(s=>s.id);this.deforumActiveTab=n.includes(i.deforumActiveTab)?i.deforumActiveTab:(i.deforumActiveTab==="sampling","canvas")}if(typeof i.deforumControlTab=="string"&&["settings","motion","macros"].includes(i.deforumControlTab)&&(this.deforumControlTab=i.deforumControlTab),typeof i.generateDockExpanded=="boolean"&&(this.generateDockExpanded=i.generateDockExpanded),typeof i.motionSequencerSideOpen=="boolean"&&(this.motionSequencerSideOpen=i.motionSequencerSideOpen),i.deforumFieldEnabled&&typeof i.deforumFieldEnabled=="object"?this.deforumFieldEnabled=lr(i.deforumFieldEnabled):this.deforumFieldEnabled=lr(),typeof i.collabEnabled=="boolean"&&(this.collabEnabled=i.collabEnabled,this.wsStatus=i.collabEnabled?this.wsStatus:"offline"),i.defaultAnimation&&typeof i.defaultAnimation=="object"&&(this.defaultAnimation=this.normalizeDefaultAnimationSettings(i.defaultAnimation)),i.deforumSettings&&typeof i.deforumSettings=="object"&&(this.deforumSettings=Ma({...Sa},i.deforumSettings),this.deforumSettings=this.normalizedDeforumSettings(),this.syncResolutionAcrossControls(this.deforumSettings.W,this.deforumSettings.H,{syncGpuModal:!1}),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.syncDeforumSettingsJson(),this.sessionDeforumSettingsLoaded=!0),Array.isArray(i.deforumContinuationCheckpoints)&&(this.deforumContinuationCheckpoints=i.deforumContinuationCheckpoints.map(n=>eu(n)).filter(Boolean)),i.lastModel&&(this.forge.lastModel=i.lastModel,this.forge.selectedModel=i.lastModel),i.streaming&&typeof i.streaming=="object"&&(Array.isArray(i.streaming.destinations)&&i.streaming.destinations.length&&(this.streaming.destinations=i.streaming.destinations.map((n,s)=>this.normalizeStreamDestination(n,s))),(typeof i.streaming.activeDestinationId=="string"||i.streaming.activeDestinationId===null)&&(this.streaming.activeDestinationId=i.streaming.activeDestinationId),typeof i.streaming.status=="string"&&(this.streaming.status=i.streaming.status)),i.prompts&&Object.assign(this.prompts,i.prompts),(typeof i.activePromptStyleId=="string"||i.activePromptStyleId===null)&&(this.activePromptStyleId=i.activePromptStyleId),typeof i.promptStyleAutoExample=="boolean"&&(this.promptStyleAutoExample=i.promptStyleAutoExample),i.lcmEngine&&typeof i.lcmEngine=="object"&&(this.lcmEngine={enabled:!!i.lcmEngine.enabled,steps:Math.max(1,Math.round(Number(i.lcmEngine.steps)||ur.steps)),loraTag:String(i.lcmEngine.loraTag||wn).trim()||wn},this.lcmEngine.enabled&&this.applyLcmEngineToDeforum({saveSession:!1})),i.wanEngine&&typeof i.wanEngine=="object"&&(this.wanEngine=pn(i.wanEngine)),i.animateLcmEngine&&typeof i.animateLcmEngine=="object"&&(this.animateLcmEngine=Pu(i.animateLcmEngine)),i.svdEngine&&typeof i.svdEngine=="object"&&(this.svdEngine=Vi(i.svdEngine)),i.motionSmoothness&&typeof i.motionSmoothness=="object"){this.motionSmoothness.enabled=!!i.motionSmoothness.enabled;const n=Math.round(Number(i.motionSmoothness.frames));this.motionSmoothness.frames=Number.isFinite(n)?Math.max(1,Math.min(999,n)):1}typeof i.motionPadSpringBack=="boolean"&&(this.motionPadSpringBack=i.motionPadSpringBack),Number.isFinite(Number(i.seedFixedBackup))&&Number(i.seedFixedBackup)>=0&&(this.seedFixedBackup=Number(i.seedFixedBackup))}catch{}},saveSessionState(){try{if(!window.localStorage)return;const t={crossfader:this.performance.crossfader,genericPrompt:this.performance.genericPrompt,slots:this.performance.slots,showFrames:this.showFrames,runsBrowserTab:this.runsBrowserTab,rightPanelOpen:this.rightPanelOpen,sidePanelDock:this.sidePanelDock,liveEngineDrawerOpen:this.liveEngineDrawerOpen,layersSidebarOpen:this.layersSidebarOpen,liveBottomDrawerOpen:this.liveBottomDrawerOpen,liveBottomDrawerTab:this.liveBottomDrawerTab,currentSubTab:{...this.currentSubTab},liveSources:this.liveSources,liveSourcePanel:this.liveSourcePanel,activeVideoLayerId:this.activeVideoLayerId,videoLayerAddOpen:this.videoLayerAddOpen,inputLayerPlaybackUrl:this.inputLayerPlaybackUrl,inputLayerLabel:this.inputLayerLabel,videoStageSize:this.videoStageSize,liveAnimationBoxOpen:this.liveAnimationBoxOpen,enginePanelDetailsOpen:this.enginePanelDetailsOpen,enginePanelDetailsTab:this.enginePanelDetailsTab,videoLayerPreviewVisible:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,e.previewVisible!==!1])),videoLayerOpacity:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,this.readVideoLayerOpacity(e)])),cloudDriveDraft:{...this.cloudDriveDraft},systemFiles:{rootId:this.systemFiles.rootId,recursive:this.systemFiles.recursive,viewMode:this.systemFiles.viewMode,showFilenames:this.systemFiles.showFilenames,sortKey:this.systemFiles.sortKey,zoomLevel:this.systemFiles.zoomLevel},libraryFullscreen:this.libraryFullscreen,libraryWorkspaceOpen:this.libraryWorkspaceOpen,libraryWorkspacePane:this.libraryWorkspacePane,libraryEditorOpen:this.libraryEditorOpen,librarySubTab:this.librarySubTab,editorFreecutRoute:this.editorFreecutRoute,editorPendingImportPath:this.editorPendingImportPath,editorPendingImportRootId:this.editorPendingImportRootId,editorPendingImportUrl:this.editorPendingImportUrl,runsAutoRefresh:this.runsAutoRefresh,runsPollIntervalSec:this.runsPollIntervalSec,paramPanelOpen:this.paramPanelOpen,deforumPanelOpen:this.deforumPanelOpen,deforumActiveTab:this.deforumActiveTab,deforumControlTab:this.deforumControlTab,deforumFieldEnabled:lr(this.deforumFieldEnabled),generateDockExpanded:this.generateDockExpanded,motionSequencerSideOpen:this.motionSequencerSideOpen,collabEnabled:this.collabEnabled,hlsWatchEnabled:!!this.hlsWatchEnabled,streaming:{destinations:this.streaming.destinations,activeDestinationId:this.streaming.activeDestinationId,status:this.streaming.status},defaultAnimation:this.normalizeDefaultAnimationSettings(this.defaultAnimation),deforumSettings:this.normalizedDeforumSettings(),lastModel:this.forge.lastModel||this.forge.currentModel||this.forge.selectedModel,prompts:{pos:this.prompts.pos,neg:this.prompts.neg},activePromptStyleId:this.activePromptStyleId,promptStyleAutoExample:this.promptStyleAutoExample,lcmEngine:{enabled:!!(this.lcmEngine&&this.lcmEngine.enabled),steps:Math.max(1,Math.round(Number(this.lcmEngine&&this.lcmEngine.steps)||1)),loraTag:String(this.lcmEngine&&this.lcmEngine.loraTag||wn).trim()||wn},wanEngine:pn(this.wanEngine),animateLcmEngine:Pu(this.animateLcmEngine),svdEngine:Vi(this.svdEngine),motionSmoothness:{enabled:!!(this.motionSmoothness&&this.motionSmoothness.enabled),frames:Math.max(1,Math.round(Number(this.motionSmoothness&&this.motionSmoothness.frames)||1))},motionPadSpringBack:!!this.motionPadSpringBack,seedFixedBackup:Number.isFinite(Number(this.seedFixedBackup))&&this.seedFixedBackup>=0?this.seedFixedBackup:null,deforumContinuationCheckpoints:Array.isArray(this.deforumContinuationCheckpoints)?this.deforumContinuationCheckpoints:[]};window.localStorage.setItem(this.sessionStorageKey(),JSON.stringify(t)),window.localStorage.setItem(this.sessionStorageTouchedKey(),String(Date.now()))}catch{}},getCurrentSessionSnapshotRaw(){try{if(typeof window>"u"||!window.localStorage)return"";const t={crossfader:this.performance.crossfader,genericPrompt:this.performance.genericPrompt,slots:this.performance.slots,showFrames:this.showFrames,runsBrowserTab:this.runsBrowserTab,rightPanelOpen:this.rightPanelOpen,sidePanelDock:this.sidePanelDock,liveEngineDrawerOpen:this.liveEngineDrawerOpen,currentSubTab:{...this.currentSubTab},liveSources:this.liveSources,liveSourcePanel:this.liveSourcePanel,activeVideoLayerId:this.activeVideoLayerId,videoLayerAddOpen:this.videoLayerAddOpen,inputLayerPlaybackUrl:this.inputLayerPlaybackUrl,inputLayerLabel:this.inputLayerLabel,videoStageSize:this.videoStageSize,liveAnimationBoxOpen:this.liveAnimationBoxOpen,enginePanelDetailsOpen:this.enginePanelDetailsOpen,enginePanelDetailsTab:this.enginePanelDetailsTab,videoLayerPreviewVisible:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,e.previewVisible!==!1])),videoLayerOpacity:Object.fromEntries((this.videoLayers||[]).filter(e=>e&&e.builtin).map(e=>[e.id,this.readVideoLayerOpacity(e)])),cloudDriveDraft:{...this.cloudDriveDraft},systemFiles:{rootId:this.systemFiles.rootId,recursive:this.systemFiles.recursive,viewMode:this.systemFiles.viewMode,showFilenames:this.systemFiles.showFilenames,sortKey:this.systemFiles.sortKey,zoomLevel:this.systemFiles.zoomLevel},libraryFullscreen:this.libraryFullscreen,libraryWorkspaceOpen:this.libraryWorkspaceOpen,libraryWorkspacePane:this.libraryWorkspacePane,libraryEditorOpen:this.libraryEditorOpen,librarySubTab:this.librarySubTab,editorFreecutRoute:this.editorFreecutRoute,editorPendingImportPath:this.editorPendingImportPath,editorPendingImportRootId:this.editorPendingImportRootId,editorPendingImportUrl:this.editorPendingImportUrl,paramPanelOpen:this.paramPanelOpen,deforumPanelOpen:this.deforumPanelOpen,deforumActiveTab:this.deforumActiveTab,deforumControlTab:this.deforumControlTab,deforumFieldEnabled:lr(this.deforumFieldEnabled),generateDockExpanded:this.generateDockExpanded,motionSequencerSideOpen:this.motionSequencerSideOpen,collabEnabled:this.collabEnabled,hlsWatchEnabled:!!this.hlsWatchEnabled,streaming:{destinations:this.streaming.destinations,activeDestinationId:this.streaming.activeDestinationId,status:this.streaming.status},defaultAnimation:this.normalizeDefaultAnimationSettings(this.defaultAnimation),deforumSettings:this.normalizedDeforumSettings(),lastModel:this.forge.lastModel||this.forge.currentModel||this.forge.selectedModel,prompts:{pos:this.prompts.pos,neg:this.prompts.neg},activePromptStyleId:this.activePromptStyleId,promptStyleAutoExample:this.promptStyleAutoExample,lcmEngine:{enabled:!!(this.lcmEngine&&this.lcmEngine.enabled),steps:Math.max(1,Math.round(Number(this.lcmEngine&&this.lcmEngine.steps)||1)),loraTag:String(this.lcmEngine&&this.lcmEngine.loraTag||wn).trim()||wn},wanEngine:pn(this.wanEngine),animateLcmEngine:Pu(this.animateLcmEngine),svdEngine:Vi(this.svdEngine),motionSmoothness:{enabled:!!(this.motionSmoothness&&this.motionSmoothness.enabled),frames:Math.max(1,Math.round(Number(this.motionSmoothness&&this.motionSmoothness.frames)||1))},deforumContinuationCheckpoints:Array.isArray(this.deforumContinuationCheckpoints)?this.deforumContinuationCheckpoints:[]};return JSON.stringify(t)}catch{return""}},checkAndPromptSessionRestore(){try{if(typeof window>"u")return!1;const t=window.localStorage;if(!t)return!1;const e=t.getItem(this.sessionStorageKey());if(!e)return!1;if(!this.hasRecentSessionResumeToken()){try{t.removeItem(this.sessionStorageKey()),t.removeItem(this.sessionStorageTouchedKey()),t.removeItem(this.sessionRestoreDeclinedKey())}catch{}return!0}if(this.hasSessionRestoreDeclined())return!1;const i=this.getCurrentSessionSnapshotRaw();return i&&e!==i?(this.pendingSessionStateRaw=e,this.restoreSessionPromptOpen=!0,!0):!1}catch{return!1}},onRestoreSessionBackdropClick(t){t&&t.target===t.currentTarget&&this.dismissSessionRestore(!1)},dismissSessionRestore(t){try{this.restoreSessionPromptOpen=!1,t?(this.clearSessionRestoreDeclined(),this.loadSessionState()):(this.markSessionRestoreDeclined(),this.saveSessionState())}catch{this.restoreSessionPromptOpen=!1}},normalizedDeforumSettings(){const t=Ma({...Sa},this.deforumSettings||{});return String(t.init_image||"").trim()||(t.use_init=!1),t},deforumContinuationStartFrameValue(){return n_(this.frameStripThumbs,{fallback:0,initImage:this.deforumSettings&&this.deforumSettings.init_image})},persistDeforumContinuationFromLatest({queueSave:t=!0,saveSession:e=!0,checkpoint:i=!1}={}){const n=Ud(this.frameStripThumbs);return n?this.persistDeforumContinuationFromThumb(n,{queueSave:t,saveSession:e,checkpoint:i}):!1},persistDeforumContinuationFromThumb(t,{queueSave:e=!0,saveSession:i=!0,checkpoint:n=!1}={}){const s=py(t);return!s||!this.deforumSettings?!1:(this.deforumSettings={...this.deforumSettings,...s},this.syncDeforumSettingsJson(),n&&this.recordDeforumContinuationCheckpoint(t),i&&this.saveSessionState(),e&&this.queueDeforumSettingsSave(),!0)},recordDeforumContinuationCheckpoint(t=null){const e=a_(t||Ud(this.frameStripThumbs),this.frameStripThumbs.length);return e?(this.deforumContinuationCheckpoints=s_(this.deforumContinuationCheckpoints,e),!0):!1},undoDeforumContinuationSegment(){if(this.deforumPlaying)return this.performance.status="Pause animation before undoing a segment",!1;const{stack:t,restored:e}=r_(this.deforumContinuationCheckpoints);if(!e)return this.deforumSettingsStatus="Nothing to undo",!1;this.deforumContinuationCheckpoints=t;const i=o_(this.thumbs||[],e.frame);this.thumbs=i,this.saveCachedFrameThumbs(i),this.deforumSettings={...this.deforumSettings,init_image:e.init_image,use_init:e.use_init},this.syncDeforumSettingsJson();const n=i.findIndex(r=>Qo(r)===e.frame);n>=0&&this.selectFrame(n,{scroll:!0});const s=e.init_image;return s&&(this.heldPreviewFramePath=s,this.performance.lastPreviewPath=s,this.generator.lastPath=s),this.sendControl("liveParam",{start_frame:e.frame,should_resume:1}),this.deforumSettingsStatus=`Undone to frame ${e.frame} — change settings and press Play to redo`,this.performance.status=this.deforumSettingsStatus,this.queueDeforumSettingsSave(),this.saveSessionState(),this.syncDeforumBackdropToWebGL(),!0},currentResolution({fallbackWidth:t=1024,fallbackHeight:e=576}={}){const i=Number(this.deforumSettings&&this.deforumSettings.W)||Number(this.forge&&this.forge.options&&this.forge.options.width)||Number(this.img2img&&this.img2img.width)||Number((this.generator&&this.generator.resolution?this.generator.resolution:"").split("x")[0])||t,n=Number(this.deforumSettings&&this.deforumSettings.H)||Number(this.forge&&this.forge.options&&this.forge.options.height)||Number(this.img2img&&this.img2img.height)||Number((this.generator&&this.generator.resolution?this.generator.resolution:"").split("x")[1])||e;return{width:i,height:n}},syncResolutionAcrossControls(t,e,{syncDeforum:i=!0,syncForge:n=!0,syncImg2img:s=!0,syncGenerator:r=!0,syncGpuModal:l=!0}={}){const o=this.currentResolution(),u=Math.max(64,Math.round(Number(t)||o.width||1024)),c=Math.max(64,Math.round(Number(e)||o.height||576));return i&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.W=u,this.deforumSettings.H=c),n&&(this.forge.options.width=u,this.forge.options.height=c),s&&(this.img2img.width=u,this.img2img.height=c),r&&(this.generator.resolution=`${u}x${c}`),l&&this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&(this.gpuPool.forgeModal.options.width=u,this.gpuPool.forgeModal.options.height=c),{width:u,height:c}},currentStepsValue(t=6){const e=Number(this.deforumSettings&&this.deforumSettings.steps);if(Number.isFinite(e)&&e>0)return Math.max(1,Math.round(e));const i=Math.round(this.readFirstNumericValue(this.deforumSettings&&this.deforumSettings.steps_schedule||"",Number(this.forge&&this.forge.options&&this.forge.options.steps)||Number(this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.steps)||t));return Math.max(1,i||t)},syncStepsAcrossControls(t,{syncDeforum:e=!0,syncForge:i=!0,syncGpuModal:n=!0,syncSchedule:s=!0}={}){const r=Math.max(1,Math.round(Number(t)||this.currentStepsValue()));return e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.steps=r,s&&(this.deforumSettings.steps_schedule=`0: (${r})`)),i&&(this.forge.options.steps=r),n&&this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&(this.gpuPool.forgeModal.options.steps=r),r},syncFpsAcrossControls(t,{syncDeforum:e=!0,syncSequencer:i=!0,syncGenerator:n=!0,syncStreaming:s=!0,syncFramesync:r=!0}={}){const l=Number(this.deforumSettings&&this.deforumSettings.fps)||Number(this.sequencer&&this.sequencer.fps)||Number(this.generator&&this.generator.fps)||Number(this.framesync&&this.framesync.fps)||24,o=Math.max(1,Math.min(120,Math.round(Number(t)||l)));return e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.fps=o),i&&this.sequencer&&(this.sequencer.fps=o),n&&this.generator&&(this.generator.fps=o),r&&this.framesync&&(this.framesync.fps=o),s&&this.streaming&&Array.isArray(this.streaming.destinations)&&(this.streaming.destinations=this.streaming.destinations.map(u=>({...u||{},fps:o}))),o},setGlobalFps(t,{source:e="ui"}={}){if(!this._syncingGlobalFps){this._syncingGlobalFps=!0;try{const i=this.syncFpsAcrossControls(t);return this.onDeforumFieldInput("fps",i,"number"),e!=="deforum"&&this.saveSessionState(),i}finally{this._syncingGlobalFps=!1}}},normalizeModelName(t){const e=typeof t=="string"?t.trim():"";return!e||e.toLowerCase()==="unknown"?"":e},detectModelFamilyFromText(t){const e=String(t||"").toLowerCase();return e?/\bz[-_. ]?image\b|zimage/.test(e)?"zimage":/\bflux\b|flux\.1/.test(e)?"flux":/(?:^|[^a-z0-9])svd(?:[^a-z0-9]|$)|stable video diffusion|\bvideo\b/.test(e)?"svd":/(?:^|[^a-z0-9])sdxl(?:[^a-z0-9]|$)|stable diffusion xl|\bpony\b|illustrious|\bxl\b/.test(e)?"sdxl":/\bsd(?:\s|[-_.])?1(?:\s|[-_.])?5\b|(?:^|[^a-z0-9])sd15(?:[^a-z0-9]|$)|stable diffusion 1\.5|\bv1[-_. ]?5\b|\b1\.5\b/.test(e)?"sd15":"":""},detectModelFamilyFromValue(t,e=""){const i=[];t&&typeof t=="object"&&i.push(t.base_model,t.architecture,t.model_type,t.type,t.pipeline,t.variant,t.name),i.push(e);for(const n of i){const s=this.detectModelFamilyFromText(n);if(s)return s}return""},detectLoraFamily(t){return this.detectModelFamilyFromValue(t&&t.metadata,`${t&&t.name?t.name:""} ${t&&t.path?t.path:""}`)||"sd15"},findForgeModelEntry(t){const e=this.normalizeModelName(t);return e&&(this.forge.models||[]).find(i=>[i&&i.model_name,i&&i.title].map(s=>this.normalizeModelName(s)).filter(Boolean).includes(e))||null},readFirstNumericValue(t,e=0){const i=String(t??"").match(/-?\d+(?:\.\d+)?/);if(!i)return e;const n=Number(i[0]);return Number.isFinite(n)?n:e},optimizedDefaultsForModel(t){const e=typeof t=="string"?this.findForgeModelEntry(t):t,i=this.normalizeModelName(e&&(e.model_name||e.title||e.name)||(typeof t=="string"?t:t&&(t.model_name||t.title||t.name))||this.engineCurrentModelName),n=e&&e.metadata||t&&t.metadata||this.forge.modelInfo||null;if(!n&&!i)return null;const s=this.detectModelFamilyFromValue(n,i),r=[n&&n.variant,n&&n.type,n&&n.pipeline,n&&n.architecture,n&&n.base_model,n&&n.name,i].filter(Boolean).join(" ").toLowerCase(),l={sd15:"SD1.5",sdxl:"SDXL",flux:"FLUX",zimage:"Z-Image",svd:"SVD"}[s]||"Generic",o=/(turbo|lightning|lcm|hyper|distill|schnell)/.test(r),u=s==="flux"&&/\bdev\b/.test(r),c=Number(n&&n.base_resolution)||(s==="sd15"?512:1024),h=this.deforumSettings&&this.deforumSettings.sampler?this.deforumSettings.sampler:this.forge.options&&this.forge.options.sampler_name||"Euler a",d=this.deforumSettings&&this.deforumSettings.scheduler?this.deforumSettings.scheduler:this.forge.options&&this.forge.options.scheduler||"Normal";let m=l,g=Number(n&&n.recommended_steps),b=Number(n&&n.recommended_cfg_scale),w=Number(n&&n.recommended_strength),v=n&&n.recommended_sampler||h;const y=n&&n.recommended_scheduler||d;return Number.isFinite(g)||(o?g=4:s==="flux"?g=u?20:8:s==="svd"?g=25:s==="sdxl"?g=30:g=24),Number.isFinite(b)||(o?b=s==="flux"?1:1.5:s==="flux"?b=u?3.5:1:s==="svd"?b=2.5:s==="sdxl"?b=6.5:s==="sd15"?b=7:b=6),Number.isFinite(w)||(o?w=.4:s==="flux"?w=.5:s==="sdxl"?w=.55:w=.65),o?m=`${l} fast`:s==="flux"&&u?m="FLUX dev":s==="flux"&&(m="FLUX schnell"),{width:c>=1024?1024:512,height:c>=1024?1024:512,steps:g,sampler:v,scheduler:y,cfgScale:b,strength:w,profileLabel:m}},applyModelOptimizedDefaults(t){const e=this.optimizedDefaultsForModel(t);if(!e)return!1;this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.W=e.width,this.deforumSettings.H=e.height,this.deforumSettings.sampler=e.sampler,this.deforumSettings.scheduler=e.scheduler,this.deforumSettings.cfg_scale_schedule=`0:(${e.cfgScale})`,this.deforumSettings.distilled_cfg_scale_schedule=`0: (${e.cfgScale})`,this.deforumSettings.strength_schedule=`0: (${e.strength})`,this.deforumSettings.keyframe_strength_schedule=`0: (${e.strength})`,this.forge.options.width=e.width,this.forge.options.height=e.height,this.forge.options.sampler_name=e.sampler,this.forge.options.scheduler=e.scheduler,this.forge.options.cfg_scale=e.cfgScale,this.syncStepsAcrossControls(e.steps,{syncGpuModal:!0});const i=this.liveVibe.find(r=>r.key==="cfgscale")||this.liveVibe.find(r=>r.key==="cfg");i&&(i.val=e.cfgScale);const n=this.liveVibe.find(r=>r.key==="strength");return n&&(n.val=e.strength),this.detectModelFamilyFromValue(t&&t.metadata||this.forge.modelInfo,this.normalizeModelName(this.forge.selectedModel||this.forge.currentModel))==="svd"&&(this.svdEngine=Vi({...this.svdEngine,...Zm("XT 1.1")}),this.syncResolutionAcrossControls(this.svdEngine.width,this.svdEngine.height,{syncGpuModal:!0})),this.syncDeforumSettingsJson(),this.deforumSettingsStatus=`${this.normalizeModelName(this.forge.selectedModel||this.forge.currentModel)} optimized for ${e.profileLabel}`,!0},applyLoadedModelSelection(t,{syncDeforumSettings:e=!0,queueDeforumSave:i=!1,saveSession:n=!0}={}){const s=this.normalizeModelName(t);if(!s)return"";this.forge.currentModel=s,this.forge.selectedModel=s,this.forge.lastModel=s;const r=this.findForgeModelEntry(s);return r&&r.metadata&&(this.forge.modelInfo=r.metadata),e&&this.deforumSettings&&this.deforumSettings.sd_model_name!==s&&(this.deforumSettings.sd_model_name=s,this.syncDeforumSettingsJson(),i&&this.queueDeforumSettingsSave()),n&&this.saveSessionState(),s},syncSelectedModelFromDeforumSettings(){const t=this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name);return t&&(this.forge.selectedModel=t),t},restoreLastModel(){const t=this.syncSelectedModelFromDeforumSettings()||this.normalizeModelName(this.forge.lastModel)||this.normalizeModelName(this.forge.selectedModel);return!t||this.forge.switching?!1:this.normalizeModelName(this.forge.currentModel)===t?(this.applyLoadedModelSelection(t,{queueDeforumSave:!1}),!0):(this.forge.selectedModel=t,this.switchForgeModel(t,{persistDeforumSettings:!1}))},async onModelSelectChange(){await this.switchForgeModel(this.forge.selectedModel,{persistDeforumSettings:!0,applyOptimizedDefaults:!0}),this.saveSessionState()},openEngineModelPicker(){const t=this.engineCurrentModelFamily,e=["sd15","sdxl","flux","zimage","other"];this.engineModelPickerTab=e.includes(t)?t:"other",this.engineModelPickerOpen=!0,!this.forge.models.length&&!this.forge.loading&&this.refreshForgeModels()},closeEngineModelPicker(){this.engineModelPickerOpen=!1},onEngineModelPickerBackdropClick(t){(t==null?void 0:t.target)===(t==null?void 0:t.currentTarget)&&this.closeEngineModelPicker()},setEngineModelPickerTab(t){["sd15","sdxl","flux","zimage","other"].includes(t)&&(this.engineModelPickerTab=t)},async selectEngineModel(t){const e=this.normalizeModelName(t&&(t.model_name||t.title));e&&(await this.onDeforumModelCommit(e),this.closeEngineModelPicker())},async onDeforumModelCommit(t){const e=this.normalizeModelName(t??(this.deforumSettings&&this.deforumSettings.sd_model_name));if(!e)return;this.deforumSettings&&this.deforumSettings.sd_model_name!==e&&(this.deforumSettings.sd_model_name=e,this.syncDeforumSettingsJson()),this.forge.selectedModel=e,!await this.switchForgeModel(e,{persistDeforumSettings:!0,applyOptimizedDefaults:!0})&&this.forge.currentModel&&this.applyLoadedModelSelection(this.forge.currentModel,{queueDeforumSave:!0})},onEngineSamplerChange(t){const e=String(t||"").trim();e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.sampler=e,this.forge.options.sampler_name=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("sampler",e),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onEngineSchedulerChange(t){const e=String(t||"").trim();e&&(this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.scheduler=e,this.forge.options.scheduler=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("scheduler",e),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onEngineStepsChange(t){if(this.lcmEngineEnabled){this.onLcmEngineStepsChange(t);return}const e=this.syncStepsAcrossControls(t,{syncGpuModal:!0});this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("steps",e),this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},setLcmEngineEnabled(t){const e=!!t;this.lcmEngine||(this.lcmEngine={...ur}),this.lcmEngine.enabled!==e&&(this.lcmEngine.enabled=e,e?((!Number.isFinite(Number(this.lcmEngine.steps))||Number(this.lcmEngine.steps)<1)&&(this.lcmEngine.steps=ur.steps),String(this.lcmEngine.loraTag||"").trim()||(this.lcmEngine.loraTag=wn),this.applyLcmEngineToDeforum()):(this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()))},onLcmEngineStepsChange(t){const e=Math.max(1,Math.round(Number(t)||Number(this.lcmEngine.steps)||1));this.lcmEngine||(this.lcmEngine={...ur}),this.lcmEngine.steps=e,this.applyLcmEngineToDeforum()},onLcmEngineLoraChange(t){const e=String(t??"").trim()||wn;this.lcmEngine||(this.lcmEngine={...ur}),this.lcmEngine.loraTag=e,this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()},applyLcmEngineToDeforum({saveSession:t=!0}={}){if(!this.lcmEngine||!this.lcmEngine.enabled)return;const e=Math.max(1,Math.round(Number(this.lcmEngine.steps)||1));this.lcmEngine.steps=e,this.syncStepsAcrossControls(e,{syncGpuModal:!0}),this.syncDeforumSettingsJson(),t&&this.saveSessionState(),this.pushDeforumLivePatch("steps",e),this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},async ensureDefaultForgeModelPreloaded(){if(typeof fetch=="function")try{const t=this.normalizeModelName(this.deforumSettings&&this.deforumSettings.sd_model_name||w0);if(!t)return;await fetch("/api/gpu-pool/default-forge-model",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,preload:!0,singleNode:!0})}),await this.refreshGpuPool(!0)}catch(t){console.warn("[engine] default model preload failed",t.message||t)}},onEngineCfgScaleChange(t){const e=Number(t);if(!Number.isFinite(e)||e<0)return;this.deforumSettings=this.normalizedDeforumSettings(),this.deforumSettings.cfg_scale_schedule=`0:(${e})`,this.deforumSettings.distilled_cfg_scale_schedule=`0: (${e})`,this.forge.options.cfg_scale=e;const i=this.liveVibe.find(n=>n.key==="cfgscale")||this.liveVibe.find(n=>n.key==="cfg");i&&(i.val=e),this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch("cfg_scale_schedule",this.deforumSettings.cfg_scale_schedule),this.pushDeforumLivePatch("distilled_cfg_scale_schedule",this.deforumSettings.distilled_cfg_scale_schedule),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},reapplyEngineModelDefaults(){const t=this.engineCurrentModelName;if(!t)return!1;const e=this.applyModelOptimizedDefaults(t);return e&&(this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()),e},slotTypeLabel(t){const e=this.crossfadeSlotTypes.find(i=>i.id===t);return e?e.label:t},newSlotId(){return`slot_${Date.now()}_${Math.random().toString(36).slice(2,7)}`},addCrossfadeSlot(){const t=this.performance.newSlotType||"prompt",e={id:this.newSlotId(),type:t,valueA:t==="param"?0:t==="prompt"?"":null,valueB:t==="param"?0:t==="prompt"?"":null,paramKey:"cfg",loraStrengthA:1,loraStrengthB:1,cnSlotId:this.cn.active||"CN1"};this.performance.slots.push(e),this.applyCrossfadeMorph(),this.saveSessionState()},removeCrossfadeSlot(t){this.performance.slots=this.performance.slots.filter(e=>e.id!==t),this.applyCrossfadeMorph(),this.saveSessionState()},slotMorphedPreview(t){return ar(this.normalizeSlotForMorph(t),this.performance.crossfader)},promptStyleById(t){return t&&(this.promptStyles||[]).find(e=>e.id===t)||null},promptStyleLabel(t){const e=this.promptStyleById(t);return e?e.name:""},formatMorphedPreview(t){const e=this.slotMorphedPreview(t);if(e==null)return"—";if(t.type==="style"&&e&&typeof e=="object"){const n=[];return e.positive&&n.push(`+${String(e.positive).slice(0,36)}${String(e.positive).length>36?"…":""}`),e.negative&&n.push(`−${String(e.negative).slice(0,28)}${String(e.negative).length>28?"…":""}`),n.length?n.join(" "):"—"}if(typeof e=="object")return JSON.stringify(e);if(typeof e=="number")return Number(e).toFixed(3);const i=String(e);return i.length>48?i.slice(0,48)+"…":i},normalizeSlotForMorph(t){if(t.type==="lora"){const e=(i,n)=>i?{name:i,strength:Number(n)||1}:null;return{...t,valueA:e(t.valueA,t.loraStrengthA),valueB:e(t.valueB,t.loraStrengthB)}}if(t.type==="controlnet"){const e=i=>({slotId:t.cnSlotId,weight:Number(i),start:0,end:.9,enabled:!0});return{...t,valueA:t.valueA!=null&&t.valueA!==""?e(t.valueA):null,valueB:t.valueB!=null&&t.valueB!==""?e(t.valueB):null}}return t.type==="style"?{...t,valueA:this.promptStyleById(t.valueA),valueB:this.promptStyleById(t.valueB)}:t.type==="param"?{...t,valueA:t.valueA,valueB:t.valueB}:t},buildMorphedPrompt(){const t=[],e=(this.performance.genericPrompt||"").trim();e&&t.push(e);for(const n of this.performance.slots){if(n.type!=="prompt")continue;const s=ar(this.normalizeSlotForMorph(n),this.performance.crossfader);s&&t.push(String(s))}const i=t.join(", ").trim();return i||(this.prompts.pos||"").trim()},buildMorphedStyleAppend(){const t=[],e=[];for(const i of this.performance.slots){if(i.type!=="style")continue;const n=ar(this.normalizeSlotForMorph(i),this.performance.crossfader);!n||typeof n!="object"||(n.positive&&t.push(String(n.positive).trim()),n.negative&&e.push(String(n.negative).trim()))}return{positive:t.filter(Boolean).join(", "),negative:e.filter(Boolean).join(", ")}},applyCrossfadeMorph(){const t=this.performance.crossfader,e={},i=[],n=[];for(const u of this.performance.slots){const c=this.normalizeSlotForMorph(u),h=ar(c,t);if(h!=null&&!(u.type==="prompt"||u.type==="style")){if(u.type==="param"&&u.paramKey){const d=this.animationTargets.find(m=>m.key===u.paramKey);if(d)this.applyAnimationModulation(d.field,h);else{e[u.paramKey]=h;const m=this.liveVibe.find(g=>g.key===u.paramKey)||this.liveCam.find(g=>g.key===u.paramKey);m&&(m.val=h)}}else if(u.type==="lora"&&h&&h.name){const d={name:h.name,path:h.name,strength:h.strength??1};oo(t)<.5?i.push(d):n.push(d)}else if(u.type==="controlnet"&&h){const d=this.cn.slots.find(m=>m.id===h.slotId);d&&(d.weight=h.weight,d.start=h.start,d.end=h.end,d.enabled=h.enabled,this.updateControlNet(d))}}}const s=this.buildMorphedPrompt(),r=(this.prompts.neg||"").trim();this.prompts.pos=s;const l=this.effectivePositivePrompt(s),o=this.effectiveNegativePrompt(r);this.sendControl("prompt",{positive:l,negative:o}),Object.keys(e).length&&this.sendControl("liveParam",e),(this.loras.common.length||i.length||n.length)&&this.sendControl("loras",{common:this.loras.common.map(u=>({name:u.name,path:u.path,strength:u.strength})),groupA:i,groupB:n,crossfaderValue:t}),this.prompts.crossfaderValue=t},onCrossfaderSlider(t){const e=this.clampVal(Number(t)||0,0,1);this.performance.crossfader=e,this.prompts.crossfaderValue=e,this.prompts.morphOn&&(this.prompts.morphBlend=e,this.prompts.morphBlendLfoLink||(this.prompts.morphBlendLfoBase=e),this.applyPromptMorphing()),this.onCrossfaderInput()},onCrossfaderInput(){this.applyCrossfadeMorph(),this.saveSessionState(),this.deforumPlaying||this.schedulePreviewFrame()},onPerformanceInput(){this.applyCrossfadeMorph(),this.saveSessionState(),this.queuePromptHistorySave(this.performance.genericPrompt),this.deforumPlaying||this.schedulePreviewFrame()},async loadPromptStyles({quiet:t=!1}={}){this.promptStylesLoading=!0,t||(this.promptStylesStatus="Loading styles…");try{const e=await fetch("/api/prompt-styles"),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);if(this.promptStyles=Array.isArray(i.styles)?i.styles:[],t||(this.promptStylesStatus=`${this.promptStyles.length} styles loaded`),this.promptStyleEditorId){const n=this.promptStyles.find(s=>s.id===this.promptStyleEditorId);n&&(this.promptStyleDraft={...n})}}catch(e){t||(this.promptStylesStatus=`Load failed: ${e.message||e}`)}finally{this.promptStylesLoading=!1}},async importPromptStylesFromForge(){this.promptStylesImporting=!0,this.promptStylesStatus="Importing from Forge…";try{const t=this.forge&&this.forge.baseUrl||"",e=await fetch("/api/prompt-styles/import-forge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({forgeUrl:t||void 0})}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);this.promptStyles=Array.isArray(i.styles)?i.styles:[],this.promptStylesStatus=`Imported ${i.added||0} new, updated ${i.updated||0} (${i.total||this.promptStyles.length} total)`}catch(t){this.promptStylesStatus=`Import failed: ${t.message||t}`}finally{this.promptStylesImporting=!1}},selectActivePromptStyle(t){const e=t?String(t):null;this.activePromptStyleId=e,this.saveSessionState(),this.deforumPlaying||this.schedulePreviewFrame()},openPromptStyleEditor(t){const e=(this.promptStyles||[]).find(i=>i.id===t);e&&(this.promptStyleEditorId=t,this.promptStyleDraft={...e})},startNewPromptStyle(){const t=`custom_${Date.now()}`;this.promptStyleEditorId=t,this.promptStyleDraft={id:t,name:"New style",positive:"",negative:"",source:"custom",exampleImage:null}},async savePromptStyleDraft(){const t=this.promptStyleDraft;if(!t||!String(t.name||"").trim()){this.promptStylesStatus="Style name is required";return}const e=(this.promptStyles||[]).some(n=>n.id===t.id),i={id:t.id,name:t.name,positive:t.positive,negative:t.negative};try{const n=await fetch(e?`/api/prompt-styles/${encodeURIComponent(t.id)}`:"/api/prompt-styles",{method:e?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),s=await n.json();if(!n.ok)throw new Error(s.error||n.statusText);await this.loadPromptStyles({quiet:!0}),s.style&&(this.promptStyleEditorId=s.style.id,this.promptStyleDraft={...s.style}),this.promptStylesStatus=e?"Style saved":"Style created"}catch(n){this.promptStylesStatus=`Save failed: ${n.message||n}`}},async deletePromptStyle(t){if(t)try{const e=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}`,{method:"DELETE"}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);this.activePromptStyleId===t&&(this.activePromptStyleId=null),this.promptStyleEditorId===t&&(this.promptStyleEditorId=null,this.promptStyleDraft=null),await this.loadPromptStyles({quiet:!0}),this.promptStylesStatus="Style deleted"}catch(e){this.promptStylesStatus=`Delete failed: ${e.message||e}`}},async setPromptStyleExampleFromPreview(t){const e=this.performance.lastPreviewPath||this.generator.lastPath;if(!e){this.promptStylesStatus="No preview image yet";return}await this.setPromptStyleExampleFromPath(t,e)},async setPromptStyleExampleFromPath(t,e){try{const i=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}/example`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e})}),n=await i.json();if(!i.ok)throw new Error(n.error||i.statusText);await this.loadPromptStyles({quiet:!0}),n.style&&this.promptStyleDraft&&this.promptStyleDraft.id===t&&(this.promptStyleDraft={...n.style}),this.promptStylesStatus="Example image saved"}catch(i){this.promptStylesStatus=`Example save failed: ${i.message||i}`}},async onPromptStyleExampleFile(t,e){var s,r;const i=(r=(s=t==null?void 0:t.target)==null?void 0:s.files)==null?void 0:r[0];if(!i||!e)return;const n=new FileReader;n.onload=async()=>{try{const l=await fetch(`/api/prompt-styles/${encodeURIComponent(e)}/example`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n.result})}),o=await l.json();if(!l.ok)throw new Error(o.error||l.statusText);await this.loadPromptStyles({quiet:!0}),o.style&&this.promptStyleDraft&&this.promptStyleDraft.id===e&&(this.promptStyleDraft={...o.style}),this.promptStylesStatus="Example image uploaded"}catch(l){this.promptStylesStatus=`Upload failed: ${l.message||l}`}},n.readAsDataURL(i),t!=null&&t.target&&(t.target.value="")},async clearPromptStyleExample(t){try{const e=await fetch(`/api/prompt-styles/${encodeURIComponent(t)}/example`,{method:"DELETE"}),i=await e.json();if(!e.ok)throw new Error(i.error||e.statusText);await this.loadPromptStyles({quiet:!0}),this.promptStyleDraft&&this.promptStyleDraft.id===t&&(this.promptStyleDraft={...i.style}),this.promptStylesStatus="Example cleared"}catch(e){this.promptStylesStatus=`Clear failed: ${e.message||e}`}},effectivePositivePrompt(t){const e=Km({positive:t,negative:""},this.activePromptStyle),i=this.buildMorphedStyleAppend(),n=El(e.positive,i.positive);return this.lcmEngineEnabled?M0(n,this.lcmEngine.loraTag||wn):n},effectiveNegativePrompt(t){const e=Km({positive:"",negative:t},this.activePromptStyle),i=this.buildMorphedStyleAppend();return El(e.negative,i.negative)},effectiveDeforumSettingsForRender(){var s,r;const t=JSON.parse(JSON.stringify(this.activeDeforumSettings())),e=this.isWanLayerActive||this.isAnimateLcmLayerActive||this.isSvdLayerActive?this.buildMorphedPrompt()||String(this.prompts.pos||"").trim():wa(t,"prompts.0")||this.buildMorphedPrompt()||String(this.prompts.pos||"").trim(),i=t.negative_prompts||this.prompts.neg||"",n=this.effectivePositivePrompt(e);if($m(t,"prompts.0",n),t.negative_prompts=this.effectiveNegativePrompt(i),this.lcmEngineEnabled&&!this.isWanLayerActive&&!this.isAnimateLcmLayerActive&&!this.isSvdLayerActive){const l=Math.max(1,Math.round(Number(this.lcmEngine.steps)||1));t.steps=l,t.steps_schedule=`0: (${l})`}return this.isWanLayerActive?I0(t,this.wanEngine,{positivePrompt:n}):this.isAnimateLcmLayerActive?U0(t,this.animateLcmEngine,{positivePrompt:n}):(this.isSvdLayerActive||(t.animation_mode===ty&&(t.animation_mode=((s=this.deforumSettings)==null?void 0:s.animation_mode)||"2D"),t.animation_mode===ay&&(t.animation_mode=((r=this.deforumSettings)==null?void 0:r.animation_mode)||"2D")),t)},onAnimateLcmFieldChange(t,e,i="text"){if(!t)return;let n;if(i==="number"){const s=Number(e);if(!Number.isFinite(s))return;n=s}else n=String(e??"");this.animateLcmEngine={...this.animateLcmEngine,[t]:n},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},setAnimateLcmMotionType(t){this.animateLcmEngine={...this.animateLcmEngine,motion_type:t},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave()},toggleAnimateLcmMotionLora(t){const e=Array.isArray(this.animateLcmEngine.motion_loras)?this.animateLcmEngine.motion_loras:[],i=e.includes(t)?e.filter(n=>n!==t):[...e,t];this.animateLcmEngine={...this.animateLcmEngine,motion_loras:i},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},applyAnimateLcmMotionPreset(t){const i={Static:{motion_type:"static",alcm_motion_amount:.5,alcm_zoom:1,alcm_pan_x:0,alcm_pan_y:0,alcm_noise:.03},Orbit:{motion_type:"orbit",alcm_motion_amount:1.2,alcm_zoom:1.01,alcm_pan_x:.3,alcm_pan_y:0,alcm_noise:.05},Tunnel:{motion_type:"zoom",alcm_motion_amount:1,alcm_zoom:1.04,alcm_pan_x:0,alcm_pan_y:0,alcm_noise:.04},Handheld:{motion_type:"handheld",alcm_motion_amount:.8,alcm_zoom:1,alcm_pan_x:.1,alcm_pan_y:.1,alcm_noise:.08},Chaos:{motion_type:"custom",alcm_motion_amount:1.5,alcm_zoom:1.02,alcm_pan_x:.5,alcm_pan_y:.3,alcm_noise:.12}}[t];i&&(this.animateLcmEngine={...this.animateLcmEngine,...i,motion_preset:t},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},onSvdEngineFieldChange(t,e,i="text"){if(!t||!this.svdEngine)return;let n=e;if(i==="number"){const s=Number(e);if(!Number.isFinite(s))return;n=s}else n=String(e??"");this.svdEngine=Vi({...this.svdEngine,[t]:n}),(t==="width"||t==="height")&&this.syncResolutionAcrossControls(this.svdEngine.width,this.svdEngine.height,{syncGpuModal:!0}),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()},onSvdResolutionPresetChange(t){const e=Nd(t),i={svd_resolution:t};e&&(i.width=e.width,i.height=e.height,this.syncResolutionAcrossControls(e.width,e.height,{syncGpuModal:!0})),this.svdEngine=Vi({...this.svdEngine,...i}),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()},applySvdPreset(t){const e=Zm(t);e&&(this.svdEngine=Vi({...this.svdEngine,...e,svd_preset:t}),this.syncResolutionAcrossControls(this.svdEngine.width,this.svdEngine.height,{syncGpuModal:!0}),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview())},applySvdInitFromPromptsImage(){var e;const t=((e=this.img2img)==null?void 0:e.dataUrl)||null;if(!t){this.svdStatus="No image in Prompts → IMAGE — generate or upload first";return}this.svdEngine=Vi({...this.svdEngine,svd_init_image:t}),this.syncSvdInitResolutionFromDataUrl(t),this.svdStatus="Init image linked from Prompts",this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview()},clearSvdInitImage(){this.svdEngine=Vi({...this.svdEngine,svd_init_image:null}),this.svdStatus="",this.saveSessionState()},syncSvdInitResolutionFromDataUrl(t){if(!t||typeof Image>"u")return;const e=new Image;e.onload=()=>{const i=W0(e.naturalWidth,e.naturalHeight),n=Nd(i),s={svd_init_image:t,svd_resolution:i};n&&(s.width=n.width,s.height=n.height,this.syncResolutionAcrossControls(n.width,n.height,{syncGpuModal:!0})),this.svdEngine=Vi({...this.svdEngine,...s}),this.saveSessionState()},e.src=t},async ensureSvdInitImage(){var g,b,w,v;if((g=this.svdEngine)!=null&&g.svd_init_image)return this.svdEngine.svd_init_image;const t=Math.round(Number((b=this.svdEngine)==null?void 0:b.width)||1024),e=Math.round(Number((w=this.svdEngine)==null?void 0:w.height)||576),i=this.liveVibe.find(y=>y.key==="cfgscale")||this.liveVibe.find(y=>y.key==="cfg"),n=this.liveVibe.find(y=>y.key==="strength"),s=this.deforumSettings.steps||20,r=this.deforumSettings.seed!=null?this.deforumSettings.seed:this.hud.seed,l=this.deforumSettings.sampler||"Euler a",o=this.buildMorphedPrompt()||String(this.prompts.pos||"").trim(),u=this.effectivePositivePrompt(o),c=this.effectiveNegativePrompt(this.prompts.neg||""),h=await fetch("/api/txt2img",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:u,negative_prompt:c,width:t,height:e,steps:s,seed:r,sampler_name:l,cfg_scale:i?Number(i.val):7,denoising_strength:n?Number(n.val):.65})}),d=await h.json().catch(()=>({}));if(!h.ok||!((v=d.images)!=null&&v[0]))throw new Error(d.error||"Failed to generate SVD init image");const m=`data:image/png;base64,${d.images[0]}`;return this.svdEngine=Vi({...this.svdEngine,svd_init_image:m}),this.saveSessionState(),m},async generateSvdPreviewFrame(){if(this.deforumPlaying)return this.performance.status="Stop animation to preview SVD",!1;if(this.previewGenerating)return!1;this.pinHeldPreviewFrame(),this.applyCrossfadeMorph(),this.previewGenerating=!0,this.performance.status="Rendering SVD clip…",this.svdStatus="Rendering…";try{const t=await this.ensureSvdInitImage(),e=j0(this.svdEngine,{initImageBase64:t,preview:!0}),i=await fetch("/api/svd/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({svdEngine:this.svdEngine,payload:e})}),n=await i.json();if(!i.ok||n.error)return this.performance.status=n.error||"SVD preview failed",this.svdStatus=n.error||"Preview failed",!1;const s=n.path||n.first_frame_path;return s&&(this.performance.lastPreviewPath=s,this.generator.lastPath=s,this.heldPreviewFramePath=s),this.performance.status="SVD preview ready",this.svdStatus=n.xt11_available===!1?"Rendered — XT 1.1 checkpoint not detected on Forge; verify models/svd":"SVD preview ready",this.scheduleFrameRefresh(40),!0}catch(t){return this.performance.status=String(t.message||t),this.svdStatus="Preview failed",!1}finally{this.previewGenerating=!1}},onWanEngineFieldChange(t,e,i="text"){if(!t||!this.wanEngine)return;let n=e;if(i==="boolean")n=!!e;else if(i==="number"){const s=Number(e);if(!Number.isFinite(s))return;n=s}else n=String(e??"");if(this.wanEngine={...this.wanEngine,[t]:n},t==="wan_resolution"){const s=kl(n);s&&this.syncResolutionAcrossControls(s.width,s.height,{syncGpuModal:!0})}this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},readWanInitImage(t){var i,n;if(!t||!((n=(i=t.type)==null?void 0:i.startsWith)!=null&&n.call(i,"image/")))return;const e=new FileReader;e.onload=()=>{const s=String(e.result||"");s&&this.applyWanInitImageDataUrl(s)},e.onerror=()=>{},e.readAsDataURL(t)},handleWanInitImageFile(t){var i,n;const e=(n=(i=t==null?void 0:t.target)==null?void 0:i.files)==null?void 0:n[0];e&&this.readWanInitImage(e),t!=null&&t.target&&(t.target.value="")},handleWanInitImageDrop(t){var i,n;const e=(n=(i=t==null?void 0:t.dataTransfer)==null?void 0:i.files)==null?void 0:n[0];e&&this.readWanInitImage(e)},clearWanInitImage(){this.wanEngine=pn({...this.wanEngine,wan_init_image:null,wan_use_init_image:!1}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},useImg2imgAsWanInit(){var e;const t=(e=this.img2img)==null?void 0:e.dataUrl;t&&this.applyWanInitImageDataUrl(t)},applyWanInitImageDataUrl(t){var n;const e=String(((n=this.wanEngine)==null?void 0:n.wan_i2v_model)||""),i={wan_init_image:t,wan_use_init_image:!0};(!e||e==="Use T2V Model (No Continuity)")&&(i.wan_i2v_model="1.3B VACE"),this.wanEngine=pn({...this.wanEngine,...i}),this.syncWanInitResolutionFromDataUrl(t),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},syncWanInitResolutionFromDataUrl(t){if(!t||typeof Image>"u")return;const e=new Image;e.onload=()=>{const i=L0(e.naturalWidth,e.naturalHeight);if(i){this.wanEngine=pn({...this.wanEngine,wan_resolution:i});const n=kl(i);n&&this.syncResolutionAcrossControls(n.width,n.height,{syncGpuModal:!0})}this.syncDeforumSettingsJson(),this.saveSessionState()},e.src=t},applyWanSpeedPreset(t){const e=A0(t);e&&(this.wanEngine=pn({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},applyWanMotionPreset(t){const e=C0(t);e&&(this.wanEngine=pn({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},toggleWanMotionLora(t){const e=Array.isArray(this.wanEngine.motion_loras)?this.wanEngine.motion_loras:[],i=e.includes(t)?e.filter(n=>n!==t):[...e,t];this.wanEngine=pn({...this.wanEngine,motion_loras:i}),this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},async requestWanModelDownload(t="vace-1.3b"){if(this.wanDownloadBusy)return;this.wanDownloadBusy=!0,this.wanDownloadStatus="Queuing download on Forge…";const e=N0(t,this.wanEngine);this.wanEngine=pn({...this.wanEngine,...e}),this.syncDeforumSettingsJson(),this.saveSessionState();try{const i=this.buildMorphedPrompt()||String(this.prompts.pos||"").trim()||"defora wan model download probe",n=await fetch("/api/wan/download-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({packageId:t,wanEngine:this.wanEngine,prompt:i})}),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||s.detail||n.statusText||"Download request failed");const r=Bo.find(l=>l.id===t);this.wanDownloadStatus=s.ok?`Download triggered via Forge (${s.batchId||"preview job"}). ${(r==null?void 0:r.label)||t}`:s.reason||"Skipped",s.manual&&(r!=null&&r.hfCommand)&&(this.wanDownloadStatus+=` — or run: ${r.hfCommand}`)}catch(i){const n=Bo.find(s=>s.id===t);this.wanDownloadStatus=`${i.message||i}${n!=null&&n.hfCommand?` — manual: ${n.hfCommand}`:""}`}finally{this.wanDownloadBusy=!1,this.queueDeforumSettingsSave()}},async maybeCaptureActiveStyleExample(t){!this.promptStyleAutoExample||!this.activePromptStyleId||!t||await this.setPromptStyleExampleFromPath(this.activePromptStyleId,t)},promptHistoryKey(){return`defora_prompt_history_${this.session||"default"}`},initPromptHistory(){try{const t=window.SpeechRecognition||window.webkitSpeechRecognition;this.speechPromptSupported=!!t}catch{this.speechPromptSupported=!1}try{const t=window.localStorage&&window.localStorage.getItem(this.promptHistoryKey());if(!t)return;const e=JSON.parse(t);Array.isArray(e)&&(this.promptHistory=e.filter(i=>typeof i=="string"&&i.trim()).slice(0,50))}catch{}},savePromptHistory(){try{if(!window.localStorage)return;window.localStorage.setItem(this.promptHistoryKey(),JSON.stringify(this.promptHistory.slice(0,50)))}catch{}},queuePromptHistorySave(t){const e=String(t||"").trim();e&&(clearTimeout(this.promptHistoryDebounceTimer),this.promptHistoryDebounceTimer=setTimeout(()=>{this.addPromptToHistory(e)},650))},addPromptToHistory(t){const e=String(t||"").trim();if(!e)return;const i=[e,...this.promptHistory.filter(n=>n!==e)];this.promptHistory=i.slice(0,50),this.savePromptHistory()},togglePromptHistory(t){const e=typeof t=="boolean"?t:!this.promptHistoryOpen;this.promptHistoryOpen=e,e&&this.initPromptHistory()},restorePromptFromHistory(t){const e=String(t||"").trim();e&&(this.performance.genericPrompt=e,this.onPerformanceInput(),this.promptHistoryOpen=!1)},clearGenericPrompt(){this.performance.genericPrompt="",this.speechPromptError="",this.onPerformanceInput()},toggleSpeechPrompt(){this.speechPromptListening?this.stopSpeechPrompt():this.startSpeechPrompt()},startSpeechPrompt(){this.speechPromptError="";const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(!t){this.speechPromptSupported=!1,this.speechPromptError="Microphone input not supported in this browser.";return}try{if(this._speechPromptRecognizer)try{this._speechPromptRecognizer.abort()}catch{}const e=new t;this._speechPromptRecognizer=e,e.lang=navigator&&navigator.language?navigator.language:"en-US",e.interimResults=!0,e.continuous=!1;let i="";e.onstart=()=>{this.speechPromptListening=!0},e.onerror=n=>{const s=n&&n.error?String(n.error):"error";this.speechPromptError=s==="not-allowed"?"Microphone permission denied.":`Speech error: ${s}`,this.speechPromptListening=!1},e.onend=()=>{if(this.speechPromptListening=!1,i.trim()){const n=String(this.performance.genericPrompt||"").trim(),s=n?`${n}, ${i.trim()}`:i.trim();this.performance.genericPrompt=s,this.onPerformanceInput(),this.addPromptToHistory(s)}},e.onresult=n=>{try{const s=n&&n.results?n.results:[];let r="";for(let u=n.resultIndex||0;u=this.previewQueueMaxSize;)this.previewRequestQueue.shift();this.previewRequestQueue.push({kind:e})},async processPreviewQueue(){if(!(this.previewQueueProcessing||this.deforumPlaying)&&this.previewRequestQueue.length){this.previewQueueProcessing=!0;try{for(;this.previewRequestQueue.length>0&&!this.deforumPlaying;){const t=this.previewRequestQueue.shift();t&&await this.runPreviewJob(t.kind)}}finally{this.previewQueueProcessing=!1,this.previewRequestQueue.length&&!this.deforumPlaying&&this.processPreviewQueue()}}},async runPreviewJob(t){if(!this.deforumPlaying){if(this.isSvdLayerActive){await this.generateSvdPreviewFrame();return}if(t==="deforum"){await this.generateDeforumPreviewFrame();return}this.deforumPanelOpen?await this.generateDeforumPreviewFrame()||await this.generateImage():await this.generateImage()}},queuePreviewRequest(t,e){if(this.deforumPlaying)return;const i=t==="deforum"?"deforum":"auto";clearTimeout(this.previewDebounceTimer),clearTimeout(this.deforumPreviewTimer);const n=i==="deforum"?"deforumPreviewTimer":"previewDebounceTimer";this[n]=setTimeout(()=>{this[n]=null,this.enqueuePreviewRequest(i),this.processPreviewQueue()},e)},schedulePreviewFrame(){this.queuePreviewRequest("auto",180)},scheduleDeforumPreview(){this.queuePreviewRequest("deforum",300)},getDeforumField(t){return wa(this.deforumSettings,t)},formatDeforumFieldValue(t,e){if(!t)return String(e??"");const i=e??"";if(t.type==="slider"||t.type==="number"){const n=Number(i);if(!Number.isFinite(n))return"";const s=String(t.step??""),r=s.includes(".")?s.split(".")[1].length:0;return n.toFixed(r)}return String(i)},deforumFieldOptions(t){if(!t)return[];let e=[];t.key==="sampler"?e=[...this.engineSamplerOptions]:t.key==="scheduler"?e=[...this.engineSchedulerOptions]:e=Array.isArray(t.options)?[...t.options]:[];const i=String(this.getDeforumField(t.key)??"").trim();return i&&!e.includes(i)&&e.unshift(i),e},isDeforumDynamicSelect(t){return!!(t&&(t.key==="sampler"||t.key==="scheduler"))},onDeforumSelectInput(t,e){if(!(!t||!t.key)){if(t.key==="sampler"){this.onEngineSamplerChange(e);return}if(t.key==="scheduler"){this.onEngineSchedulerChange(e);return}this.onDeforumFieldInput(t.key,e,"text")}},async ensureForgeSamplerSchedulerLists(){const t=Array.isArray(this.forge.samplers)&&this.forge.samplers.length>0,e=Array.isArray(this.forge.schedulers)&&this.forge.schedulers.length>0;if(!(t&&e))try{await this.refreshForgeOptions()}catch{}},deforumToggleKeyForPath(t){return Of[t]||t},isDeforumFieldToggleable(t){if(/^cn_\d+_/.test(String(t||""))||e0.has(t))return!1;const e=this.deforumToggleKeyForPath(t);return Id.includes(e)},isDeforumFieldDisabledByAnimationMode(t){return!t||this.deforumMode2d3d!=="2D"?!1:Q1(t)},isDeforumFieldGroupDisabledByAnimationMode(t){return this.deforumMode2d3d==="2D"&&t===Bm},isDeforumFieldEnabled(t){const i=String(t||"").match(/^cn_(\d+)_(\w+)$/);if(i){const s=i[1];return i[2]==="enabled"?!0:!!wa(this.deforumSettings,`cn_${s}_enabled`)}if(this.isDeforumFieldDisabledByAnimationMode(t))return!1;if(!this.isDeforumFieldToggleable(t))return!0;const n=this.deforumToggleKeyForPath(t);return this.deforumFieldEnabled[n]!==!1},setDeforumMode2d3d(t){const e=zm(t);this.deforumMode2d3d!==e&&this.onDeforumFieldInput("animation_mode",e,"text"),e==="2D"&&this.deforumActiveTab===Bm&&(this.deforumActiveTab="motion",this.saveSessionState())},setDeforumFieldEnabled(t,e){const i=String(t||"");if(/^cn_\d+_/.test(i))return;const n=this.deforumToggleKeyForPath(t);this.isDeforumFieldToggleable(n)&&(this.deforumFieldEnabled={...lr(this.deforumFieldEnabled),[n]:e!==!1},this.syncDeforumSettingsJson(),this.saveSessionState(),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview())},activeDeforumSettings(){const t=this.normalizedDeforumSettings();return Id.forEach(e=>{this.isDeforumFieldEnabled(e)||xu(t,e)}),this.deforumMode2d3d==="2D"&&Jg.forEach(e=>xu(t,e)),Object.entries(Of).forEach(([e,i])=>{this.isDeforumFieldEnabled(i)||xu(t,e)}),t},onDeforumSectionToggle(t,e){this.deforumSectionOpen[t]=e.target.open},setSeedRandomEnabled(t){var i,n;if(t){const s=Number((i=this.deforumSettings)==null?void 0:i.seed);Number.isFinite(s)&&s>=0&&(this.seedFixedBackup=s),this.onDeforumFieldInput("seed",-1,"number");return}let e=Number(this.seedFixedBackup);(!Number.isFinite(e)||e<0)&&(e=Number.isFinite(Number((n=this.hud)==null?void 0:n.seed))&&this.hud.seed>=0?Number(this.hud.seed):Math.floor(Math.random()*2147483647)),this.onDeforumFieldInput("seed",e,"number")},onDeforumSeedInput(t){const e=parseInt(String(t),10);!Number.isFinite(e)||e<0||this.onDeforumFieldInput("seed",e,"number")},onDeforumFieldInput(t,e,i){if(this.isDeforumFieldDisabledByAnimationMode(t))return;let n=e;if(i==="number"){const s=parseFloat(e);n=Number.isFinite(s)?s:0}else i==="bool"?n=!!e:t==="init_image"&&e===""&&(n=null);if($m(this.deforumSettings,t,n),t==="prompts.0"){const s=String(n||""),r=s.split(/\s+--neg\s+/i);r.length>1?(this.prompts.pos=r[0].trim(),this.prompts.neg=r.slice(1).join(" --neg ").trim()):this.prompts.pos=s.trim()}if(t==="negative_prompts"&&(this.prompts.neg=String(n||"")),t==="seed"&&Number.isFinite(n)&&n>=0&&(this.seedFixedBackup=n,this.hud.seed=n),t==="steps"&&Number.isFinite(n)&&this.syncStepsAcrossControls(n,{syncGpuModal:!0}),t==="steps_schedule"){const s=String(n||""),r=(s.match(/\(([^()]+)\)/)||[])[1]||s,l=Math.max(1,Math.round(this.readFirstNumericValue(r,Number(this.forge.options&&this.forge.options.steps)||Number(this.gpuPool&&this.gpuPool.forgeModal&&this.gpuPool.forgeModal.options&&this.gpuPool.forgeModal.options.steps)||6)));this.syncStepsAcrossControls(l,{syncGpuModal:!0,syncSchedule:!1})}if(t==="sampler"&&(this.forge.options.sampler_name=String(n||"")),t==="scheduler"&&(this.forge.options.scheduler=String(n||"")),t==="W"&&Number.isFinite(n)&&this.syncResolutionAcrossControls(n,this.deforumSettings&&this.deforumSettings.H,{syncGpuModal:!0}),t==="H"&&Number.isFinite(n)&&this.syncResolutionAcrossControls(this.deforumSettings&&this.deforumSettings.W,n,{syncGpuModal:!0}),t==="fps"&&Number.isFinite(n)&&!this._syncingGlobalFps){this._syncingGlobalFps=!0;try{this.syncFpsAcrossControls(n,{syncDeforum:!0})}finally{this._syncingGlobalFps=!1}}t==="sd_model_name"&&(this.forge.selectedModel=this.normalizeModelName(n)),this.syncDeforumSettingsJson(),this.saveSessionState(),this.pushDeforumLivePatch(t,n),t==="steps"&&this.pushDeforumLivePatch("steps_schedule",this.deforumSettings.steps_schedule),t==="steps_schedule"&&this.pushDeforumLivePatch("steps",this.deforumSettings.steps),this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()},onEngineResolutionChange(t){const[e,i]=String(t).split("x").map(Number);e>0&&i>0&&(this.syncResolutionAcrossControls(e,i,{syncGpuModal:!0}),this.onDeforumFieldInput("W",e,"number"),this.onDeforumFieldInput("H",i,"number"))},onImg2imgResolutionInput(t,e){const i={fallbackWidth:Number(this.img2img&&this.img2img.width)||1024,fallbackHeight:Number(this.img2img&&this.img2img.height)||576},n=this.currentResolution(i),s=t==="width"?e:n.width,r=t==="height"?e:n.height,l=this.syncResolutionAcrossControls(s,r,{syncGpuModal:!0});return this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview(),l},onGpuForgeModalResolutionInput(t,e){const i=this.gpuPool&&this.gpuPool.forgeModal;if(!i||!i.options)return null;const n=t==="width"?e:i.options.width,s=t==="height"?e:i.options.height,r=this.syncResolutionAcrossControls(n,s,{syncGpuModal:!0});return this.syncDeforumSettingsJson(),this.saveSessionState(),this.deforumPlaying||this.scheduleDeforumPreview(),r},pushDeforumLivePatch(t,e){if(!this.isDeforumFieldEnabled(t))return;const i=o0(t,e);this.sendControl("liveParam",i)},syncDeforumSettingsJson(){try{this.deforumSettingsJson=JSON.stringify(this.activeDeforumSettings(),null,2),this.deforumSettingsJsonError=""}catch(t){this.deforumSettingsJsonError=String(t.message||t)}},runDeforumSettingsVerify({forSave:t=!1}={}){if(this.deforumAdvancedOpen)try{this.applyDeforumSettingsJson()}catch{return this.deforumVerifyResults={ok:!1,errors:[{field:"JSON",message:this.deforumSettingsJsonError||"Invalid JSON"}],warnings:[]},this.deforumSettingsStatus="Fix JSON before verifying",this.deforumVerifyResults}const e=t?this.activeDeforumSettings():this.normalizedDeforumSettings();this.deforumVerifyResults=d0(e,{onlyDefinedKeys:t});const{errors:i,warnings:n}=this.deforumVerifyResults;return!i.length&&!n.length?this.deforumSettingsStatus="Settings look good":this.deforumSettingsStatus=`${i.length} error(s), ${n.length} optimization hint(s)`,this.deforumVerifyResults},guardDeforumSettingsBeforeRun(t="continue"){const e=typeof window<"u";if(this.deforumAdvancedOpen&&this.deforumSettingsJsonError)return e?window.alert(`Fix JSON errors before you ${t}.`):this.deforumSettingsStatus=`Fix JSON errors before you ${t}`,!1;if(this.deforumAdvancedOpen)try{this.applyDeforumSettingsJson()}catch{return e?window.alert(`Invalid settings JSON — fix errors before you ${t}.`):this.deforumSettingsStatus=`Invalid JSON — cannot ${t}`,!1}const i=/save/i.test(String(t)),n=this.runDeforumSettingsVerify({forSave:i});if(n.errors.length){const s=n.errors.map(r=>`• ${r.field}: ${r.message}`).join(` `);return e?window.alert(`Cannot ${t} — fix these settings first: ${s} -Use Verify in the JSON panel for the full list.`):this.deforumSettingsStatus=`Cannot ${t}: ${n.errors.length} error(s)`,!1}if(n.warnings.length){const r=n.warnings.slice(0,10).map(d=>`• ${d.field}: ${d.message}`).join(` +Use Verify in the JSON panel for the full list.`):this.deforumSettingsStatus=`Cannot ${t}: ${n.errors.length} error(s)`,!1}if(n.warnings.length){const r=n.warnings.slice(0,10).map(u=>`• ${u.field}: ${u.message}`).join(` `),l=n.warnings.length>10?` …and ${n.warnings.length-10} more (open Verify for the full list)`:"";let o=!0;if(e&&(o=window.confirm(`Settings may not be optimal: ${r}${l} -${t} anyway?`)),!o)return!1}return!0},applyDeforumSettingsJson(){try{const t=JSON.parse(this.deforumSettingsJson);if(!t||typeof t!="object")throw new Error("JSON must be an object");this.deforumSettings=sa(this.normalizedDeforumSettings(),t),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.deforumSettingsJsonError="";const e=this.syncSelectedModelFromDeforumSettings();e?this.switchForgeModel(e,{persistDeforumSettings:!0}):this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()}catch(t){this.deforumSettingsJsonError=String(t.message||t)}},async loadDeforumSettings({syncServerModel:t=!0}={}){this.deforumSettingsLoading=!0;try{const i=await(await fetch("/api/deforum/settings")).json();!this.sessionDeforumSettingsLoaded&&i.settings&&typeof i.settings=="object"&&(this.deforumSettings=sa({...ia},i.settings),this.deforumSettings=this.normalizedDeforumSettings()),this.deforumSettings&&this.session&&(this.deforumSettings={...this.deforumSettings,batch_name:this.session}),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.syncSelectedModelFromDeforumSettings(),this.syncDeforumSettingsJson(),this.deforumSettingsStatus=this.sessionDeforumSettingsLoaded?"Loaded local session":"Loaded",t&&await this.restoreLastModel()}catch(e){this.deforumSettingsStatus="Load failed",console.error("loadDeforumSettings",e)}finally{this.deforumSettingsLoading=!1}},queueDeforumSettingsSave(){clearTimeout(this.deforumSaveTimer),this.deforumSaveTimer=setTimeout(()=>this.saveDeforumSettings(),800)},async saveDeforumSettings(){this.deforumSettingsSaving=!0;try{const t=this.activeDeforumSettings(),e=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:t})}),i=await e.json();if(!e.ok||i.error){this.deforumSettingsStatus=i.error||"Save failed";return}if(i.modelSync&&i.modelSync.success&&i.modelSync.model){const n=i.modelSync.model.model_name||i.modelSync.model.title||"";this.applyLoadedModelSelection(n,{queueDeforumSave:!1})}this.deforumSettingsStatus="Saved"}catch{this.deforumSettingsStatus="Save failed"}finally{this.deforumSettingsSaving=!1}},async generateDeforumPreviewFrame(){if(this.deforumPlaying)return this.performance.status="Stop animation to preview single frames",!1;if(!this.guardDeforumSettingsBeforeRun("render a preview frame")||this.previewGenerating)return!1;this.pinHeldPreviewFrame(),this.applyCrossfadeMorph(),this.previewGenerating=!0,this.performance.status="Rendering Deforum frame…",this.deforumSettingsStatus="Rendering…";try{const t=this.effectiveDeforumSettingsForRender(),e=await fetch("/api/deforum/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:t})}),i=await e.json();return!e.ok||i.error?(this.performance.status=i.error||"Deforum preview failed",this.deforumSettingsStatus="Preview failed",!1):(this.performance.lastPreviewPath=i.path,this.generator.lastPath=i.path,this.heldPreviewFramePath=i.path,this.performance.status="Deforum frame ready",this.deforumSettingsStatus="Frame ready",this.scheduleFrameRefresh(40),this.maybeCaptureActiveStyleExample(i.path),!0)}catch(t){return this.performance.status=String(t.message||t),this.deforumSettingsStatus="Preview failed",!1}finally{this.previewGenerating=!1}},async generatePreviewFrame(){if(this.previewGenerating)return this.previewQueuedKind=this.deforumPanelOpen?"deforum":"auto",!1;try{return this.deforumPanelOpen?await this.generateDeforumPreviewFrame()||await this.generateImage():await this.generateImage(),!0}finally{this.flushQueuedPreview()}},async generateImage(){if(this.deforumPlaying){this.performance.status="Stop animation to preview single frames";return}if(this.previewGenerating)return;this.pinHeldPreviewFrame(),this.applyCrossfadeMorph(),this.previewGenerating=!0,this.performance.status="Generating preview frame…";const t=this.liveVibe.find(h=>h.key==="cfgscale")||this.liveVibe.find(h=>h.key==="cfg");this.liveVibe.find(h=>h.key==="strength");const e=this.deforumSettings.W||1024,i=this.deforumSettings.H||576,n=this.deforumSettings.steps||12,s=this.deforumSettings.seed!=null?this.deforumSettings.seed:this.hud.seed,r=this.deforumSettings.sampler||"Euler a",l=this.deforumSettings.negative_prompts||this.prompts.neg||"",o=na(this.deforumSettings,"prompts.0")||this.buildMorphedPrompt(),d=this.effectivePositivePrompt(o),u=this.effectiveNegativePrompt(l);try{this.deforumSettings=this.normalizedDeforumSettings();const h=await fetch("/api/txt2img",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:d,negative_prompt:u,steps:n,cfg_scale:t?t.val:7,width:e,height:i,seed:s,sampler_name:r,settings:this.deforumSettings})}),c=await h.json();if(!h.ok||c.error){this.performance.status=c.error||"Preview failed";return}this.performance.lastPreviewPath=c.path,this.generator.lastPath=c.path,this.heldPreviewFramePath=c.path,this.performance.status="Preview frame ready",this.scheduleFrameRefresh(120),this.maybeCaptureActiveStyleExample(c.path)}catch(h){this.performance.status=String(h.message||h)}finally{this.previewGenerating=!1}},async refreshForgeStatus(){this.forge.loading=!0;try{const e=await(await fetch("/api/status")).json();e.sdForge?this.forge.available=e.sdForge.available:this.forge.available=!1}catch{this.forge.available=!1}finally{this.forge.loading=!1}},async saveForgeConnection(){try{await(await fetch("/api/forge/options",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})).json(),await this.refreshForgeStatus()}catch(t){console.error("Failed to save connection",t)}},async refreshForgeModels(){try{const{data:t}=await Gt("/api/sd-models",{},"sd-models list");this.forge.models=t.models||[],this.forge.modelsSource=t.source||"";const e=this.findForgeModelEntry(this.forge.currentModel||this.forge.selectedModel);e&&e.metadata&&(this.forge.modelInfo=e.metadata)}catch{this.forge.modelsSource=""}},async switchForgeModel(t=this.forge.selectedModel,{persistDeforumSettings:e=!1,applyOptimizedDefaults:i=!1}={}){const n=this.normalizeModelName(t);if(!n)return!1;if(this.forge.selectedModel=n,this.normalizeModelName(this.forge.currentModel)===n)return this.applyLoadedModelSelection(n,{queueDeforumSave:e}),i&&this.applyModelOptimizedDefaults(n)&&e&&this.queueDeforumSettingsSave(),this.deforumPlaying||this.schedulePreviewFrame(),!0;this.forge.switching=!0;try{const r=await(await fetch("/api/sd-models/switch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model_name:n})})).json();if(r.success){const l=this.normalizeModelName(r.model&&(r.model.model_name||r.model.title)||n);return this.applyLoadedModelSelection(l,{queueDeforumSave:e}),r.model&&r.model.metadata&&(this.forge.modelInfo=r.model.metadata),i&&this.applyModelOptimizedDefaults(r.model||l)&&e&&this.queueDeforumSettingsSave(),this.deforumPlaying||this.schedulePreviewFrame(),!0}throw new Error(r.error||r.message||"Failed to switch model")}catch(s){return console.error("Failed to switch model",s),this.deforumSettingsStatus=`Model sync failed: ${s.message||s}`,!1}finally{this.forge.switching=!1}},async refreshForgeOptions(){try{const[t,e,i,n,s]=await Promise.all([fetch("/api/forge/options"),fetch("/api/forge/samplers"),fetch("/api/forge/schedulers"),fetch("/api/forge/vae"),fetch("/api/sd-models/current")]),r=await t.json(),l=await e.json(),o=await i.json(),d=await n.json(),u=await s.json();if(this.forge.available=r.available,this.forge.samplers=l.samplers||[],this.forge.schedulers=o.schedulers||[],this.forge.vaeList=d.vae||[],u.model){const f=u.model.model_name||u.model.title||"";this.applyLoadedModelSelection(f,{queueDeforumSave:!1,saveSession:!1}),u.model.metadata&&(this.forge.modelInfo=u.model.metadata)}const h=r.options||{},c=["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"];for(const f of c)h[f]!==void 0&&(this.forge.options[f]=h[f])}catch(t){console.error("Failed to load forge options",t)}},async applyForgeOptions(){const t=["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"],e={};for(const i of t)e[i]=this.forge.options[i];try{const n=await(await fetch("/api/forge/options",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json();n.success||console.error("Failed to apply options",n)}catch(i){console.error("Failed to apply forge options",i)}},async refreshForgeAll(){await Promise.all([this.refreshForgeStatus(),this.refreshForgeModels(),this.refreshForgeOptions()])}}},qK={id:"app"},jK={class:"restore-session-modal__dialog framesync-panel"},XK={class:"framesync-footer",style:{"margin-top":"12px",gap:"10px","justify-content":"flex-end"}},KK={class:"app-chrome"},YK={class:"top-nav","aria-label":"Main navigation","data-testid":"top-nav",role:"tablist"},JK={class:"top-nav__inner"},ZK=["aria-selected","tabindex","title","data-testid","onClick"],QK={class:"tab__icon-wrap","aria-hidden":"true"},eY={class:"tab__copy"},tY={class:"tab__label"},iY={class:"top-nav__actions"},nY=["aria-expanded"],sY={class:"app-header"},rY={class:"top-nav","aria-label":"Main navigation","data-testid":"top-nav"},oY={class:"top-nav__inner"},aY=["onClick"],lY={class:"tab__icon-wrap","aria-hidden":"true"},dY={class:"tab__copy"},uY={class:"tab__label"},cY=["title","aria-expanded"],hY={class:"live-overlay-btn__arrow-wrap"},fY={class:"live-overlay-btn__top-label"},mY={class:"preview-stage-row","data-testid":"preview-stage-row"},pY={class:"preview-stage-main"},gY=["aria-expanded"],yY={class:"top-drawer-fab__icon-wrap","aria-hidden":"true"},vY={class:"live-top-drawer__tabs"},bY={key:0,class:"live-mod-grid"},_Y={class:"live-mod-slot__head"},SY={class:"framesync-subtitle",style:{margin:"0"}},wY={key:0,class:"live-mod-slot__map"},MY={class:"live-mod-slot__actions"},PY=["onClick"],xY=["onClick"],TY={key:0,class:"live-mod-slot__body"},AY=["min","max","step","value","onInput"],EY={class:"live-mod-slider__readout"},CY={key:1,class:"live-mod-slot__body"},kY=["onMousedown","onMousemove","onTouchstart","onTouchmove"],LY={class:"live-mod-pad__axes"},RY={class:"framesync-subtitle",style:{margin:"0"}},DY={class:"framesync-subtitle",style:{margin:"0"}},IY={key:2,class:"live-mod-slot__body"},FY={class:"live-mod-knob"},NY=["min","max","step","value","onInput"],OY={class:"live-mod-knob__readout"},UY={key:2,class:"top-drawer-system system-runs-tab","data-testid":"bottom-drawer-system"},BY={class:"preview-stage-video-stack"},VY=["src"],zY=["src"],$Y={key:2,class:"video-layer-empty","data-testid":"video-layer-input-empty"},GY={key:3,class:"video-layer-empty video-layer-empty--cloud"},HY={class:"video-layer-empty__title"},WY={key:4,class:"preview-loading-overlay","data-testid":"frame-processing-overlay","aria-live":"polite","aria-busy":"true"},qY={class:"preview-loading-overlay__card"},jY={class:"lazy-loading-indicator lazy-loading-indicator--overlay"},XY={class:"preview-loading-overlay__hint"},KY={class:"overlay"},YY={class:"timecode"},JY={style:{"font-size":"11px",color:"var(--text-secondary)"}},ZY={style:{"font-size":"11px",color:"var(--text-secondary)"}},QY={key:0,class:"video-feed-frames","data-testid":"deforum-stream-frame-count"},eJ={style:{display:"flex","align-items":"flex-start",gap:"8px","text-align":"right"}},tJ={style:{"font-size":"11px",color:"var(--text-secondary)"}},iJ={key:5,class:"live-hud-strip live-hud-strip--pinned"},nJ={key:6,class:"live-hud-dock","data-testid":"live-hud-dock"},sJ={key:0,class:"live-hud-dock__cell live-hud-dock__cell--modulating","data-testid":"live-modulating-hud"},rJ={class:"live-hud-mod-row__info"},oJ={class:"live-hud-mod-row__label"},aJ={class:"live-hud-mod-row__source"},lJ={class:"live-hud-mod-row__val"},dJ={class:"live-hud-mod-row__bar"},uJ={class:"live-hud-dock__cell live-hud-dock__cell--morph"},cJ={class:"live-hud-morph__labels"},hJ={class:"live-hud-morph__a"},fJ={class:"live-hud-morph__b"},mJ={class:"live-hud-morph__slider-wrap"},pJ=["value"],gJ={class:"live-hud-morph__actions"},yJ={key:1,class:"recent-runs-rail","data-testid":"recent-runs-rail"},vJ={class:"recent-runs-rail__header"},bJ={class:"recent-runs-rail__list"},_J=["onClick"],SJ=["src","alt"],wJ={key:1,class:"recent-runs-rail__thumb recent-runs-rail__thumb--empty"},MJ={class:"recent-runs-rail__meta"},PJ={class:"recent-runs-rail__id"},xJ={class:"recent-runs-rail__date"},TJ=["src"],AJ={key:2,class:"preview-bottom-dock","data-testid":"preview-bottom-dock"},EJ={class:"preview-bottom-dock__pane preview-bottom-dock__pane--sequencer"},CJ={class:"stage-sequencer-side","data-testid":"motion-sequencer-side-drawer"},kJ={class:"stage-sequencer-side__head"},LJ={class:"stage-sequencer-side__body"},RJ=["aria-expanded","title"],DJ={class:"stage-sequencer-main"},IJ={key:0,class:"edge-dock-host","data-testid":"edge-dock-host"},FJ=["aria-expanded","aria-label","title"],NJ={class:"layers-sidebar__active-badge"},OJ={class:"layers-sidebar__active-name"},UJ={class:"layers-sidebar__list"},BJ=["title","onClick"],VJ={class:"layers-sidebar__item-label"},zJ={class:"layers-sidebar__scenes"},$J={class:"layers-sidebar__scenes-header"},GJ=["onClick","onDblclick","title"],HJ={class:"layers-sidebar__scene-name"},WJ=["onClick"],qJ={key:0,class:"layers-sidebar__scenes-empty"},jJ=["aria-hidden"],XJ=["aria-expanded","aria-label","title"],KJ={class:"engine-drawer-panel"},YJ=["aria-expanded","aria-label","title"];function JJ(t,e,i,n,s,r){var P;const l=Ne("UiIcon"),o=Ne("StatusStrip"),d=Ne("LibraryWorkspaceOverlay"),u=Ne("LiveView"),h=Ne("LibraryView"),c=Ne("StreamView"),f=Ne("PromptsView"),g=Ne("MotionView"),y=Ne("ModulationView"),T=Ne("SettingsView"),_=Ne("CrossfaderPanel"),v=Ne("RunsBrowserPanel"),S=Ne("ThreeBackground"),w=Ne("LiveParamRow"),x=Ne("GlassPanel"),k=Ne("SequencerControlsPanel"),E=Ne("GenerateView"),D=Ne("AnimationEnginePanel");return m(),p("div",qK,[s.restoreSessionPromptOpen?(m(),p("div",{key:0,class:"restore-session-modal",onClick:e[2]||(e[2]=(...M)=>r.onRestoreSessionBackdropClick&&r.onRestoreSessionBackdropClick(...M))},[a("div",jK,[e[26]||(e[26]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Restore "),a("span",{class:"framesync-accent"},"last UI state"),ie("?")])],-1)),e[27]||(e[27]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}}," Found a saved session state that doesn’t match the current UI defaults. ",-1)),a("div",XK,[a("button",{type:"button",class:"framesync-button",onClick:e[0]||(e[0]=M=>r.dismissSessionRestore(!1))},"Discard"),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[1]||(e[1]=M=>r.dismissSessionRestore(!0))},"Restore")])])])):N("",!0),a("div",KK,[a("nav",YK,[a("div",JK,[(m(!0),p(H,null,oe(s.tabs,(M,F)=>(m(),p("button",{class:B(["tab",[`tab--${M.id.toLowerCase()}`,{active:s.currentTab===M.id}]]),key:M.id,role:"tab",type:"button","aria-selected":s.currentTab===M.id?"true":"false",tabindex:s.currentTab===M.id?0:-1,title:`${M.label} (${F+1}) · ← → switch tabs`,"data-testid":"top-nav-tab-"+M.id.toLowerCase(),onClick:I=>r.switchTab(M.id)},[a("span",QK,[ve(l,{class:"tab__icon",name:M.icon},null,8,["name"])]),a("span",eY,[a("span",tY,b(M.label),1)])],10,ZK))),128))]),a("div",iY,[a("button",{type:"button",class:B(["top-nav__icon-btn",{"top-nav__icon-btn--active":s.libraryWorkspaceOpen}]),"aria-expanded":s.libraryWorkspaceOpen?"true":"false",title:"Library — browse videos and open the editor","data-testid":"top-nav-library",onClick:e[3]||(e[3]=M=>r.toggleLibraryWorkspace())},[ve(l,{name:"folder"}),e[28]||(e[28]=a("span",{class:"top-nav__action-label"},"Library",-1))],10,nY)])]),a("header",sY,[ve(o,{playing:s.deforumPlaying,recording:s.isRecording,"preview-generating":s.previewGenerating,"frame-processing-active":r.showFrameProcessingInChrome,"frame-processing-label":r.frameProcessingLabel,"frame-processing-hint":r.frameProcessingHint,"preview-disabled":s.deforumPlaying,"hls-watch-enabled":s.hlsWatchEnabled,"hls-preview-valid":s.hlsPreviewStreamValid,"api-health":s.apiHealth,"gpu-active-count":r.gpuActiveCount,"gpu-total-count":r.gpuTotalCount,"midi-supported":s.midi.supported,"midi-selected":s.midi.selected,"ws-status":s.wsStatus,session:s.session,sessions:r.sessionCatalog,"morph-on":s.prompts.morphOn,onTogglePlay:r.toggleDeforumPlay,onStopPlay:r.stopDeforumPlay,onToggleRecord:r.toggleStreamRecord,onStartHlsWatch:r.enableHlsWatch,onStopHlsWatch:r.disableHlsWatch,onGeneratePreview:r.generatePreviewFrame,onOpenGpus:r.openGpuSettings,onToggleWs:r.toggleCollaboration,onOpenMidi:r.openMidiSettings,onSelectSession:r.selectSession,onNewSession:r.createNewSession,onPurgeSession:r.purgeSession,onRestoreSession:r.restoreSession,onResetLayout:r.resetUiLayoutDefaults},null,8,["playing","recording","preview-generating","frame-processing-active","frame-processing-label","frame-processing-hint","preview-disabled","hls-watch-enabled","hls-preview-valid","api-health","gpu-active-count","gpu-total-count","midi-supported","midi-selected","ws-status","session","sessions","morph-on","onTogglePlay","onStopPlay","onToggleRecord","onStartHlsWatch","onStopHlsWatch","onGeneratePreview","onOpenGpus","onToggleWs","onOpenMidi","onSelectSession","onNewSession","onPurgeSession","onRestoreSession","onResetLayout"])])]),ve(d,{app:r.appViewModel},null,8,["app"]),a("nav",rY,[a("div",oY,[(m(!0),p(H,null,oe(s.tabs,M=>(m(),p("button",{class:B(["tab",[`tab--${M.id.toLowerCase()}`,{active:s.currentTab===M.id}]]),key:M.id,onClick:F=>r.switchTab(M.id)},[a("span",lY,[ve(l,{class:"tab__icon",name:M.icon},null,8,["name"])]),a("span",dY,[a("span",uY,b(M.label),1)])],10,aY))),128))])]),r.libraryEditorOpen&&s.currentTab==="LIBRARY"?N("",!0):(m(),p("div",{key:1,class:B(["live-drawer-shell live-drawer-shell--dock-top",{"live-drawer-shell--open":s.rightPanelOpen}]),"data-testid":"right-panel-drawer"},[a("button",{type:"button",class:B(["live-overlay-btn live-overlay-btn--top",{"live-overlay-btn--open":s.rightPanelOpen}]),title:r.rightPanelToggleTitle,"aria-expanded":s.rightPanelOpen?"true":"false","data-testid":"right-panel-toggle",onClick:e[4]||(e[4]=(...M)=>r.toggleRightPanel&&r.toggleRightPanel(...M))},[a("span",hY,[ve(l,{class:"live-overlay-btn__state",name:r.rightPanelToggleIcon},null,8,["name"])]),a("span",fY,b(s.rightPanelOpen?"Hide panel":"Show panel"),1)],10,cY),J(a("div",{class:B(["live-right-column",{"stage-rack-overlay":s.currentTab==="MOTION"}])},[s.currentTab==="LIVE"?(m(),at(u,{key:0,app:r.appViewModel},null,8,["app"])):s.currentTab==="LIBRARY"?(m(),at(h,{key:1,app:r.appViewModel},null,8,["app"])):s.currentTab==="STREAM"?(m(),at(c,{key:2,app:r.appViewModel},null,8,["app"])):s.currentTab==="PROMPTS"?(m(),at(f,{key:3,app:r.appViewModel},null,8,["app"])):s.currentTab==="MOTION"?(m(),at(g,{key:4,app:r.appViewModel},null,8,["app"])):s.currentTab==="MODULATION"?(m(),at(y,{key:5,app:r.appViewModel},null,8,["app"])):s.currentTab==="SETTINGS"?(m(),at(T,{key:6,app:r.appViewModel},null,8,["app"])):N("",!0)],2),[[Wi,s.rightPanelOpen]])],2)),a("div",{class:B(["layout layout--sidebar",{"layout--live":s.currentTab==="LIVE","layout--stage":s.currentTab==="MOTION"||s.currentTab==="GENERATE","layout--studio":s.currentTab==="MODULATION"||s.currentTab==="AUDIO","layout--library-workspace":s.libraryWorkspaceOpen,"layout--stage-full":s.videoStageSize==="full","layout--edge-layers-open":s.layersSidebarOpen,"layout--edge-engine-open":r.showEngineDrawerShell&&s.liveEngineDrawerOpen,"layout--edge-context-open":!s.libraryWorkspaceOpen&&s.rightPanelOpen,"layout--edge-context-left":!s.libraryWorkspaceOpen&&s.rightPanelOpen,"layout--edge-overlay":r.edgeDockOverlayMode}])},[a("div",{class:B(["preview",{"preview--stage-full":s.videoStageSize==="full","preview--motion-dock":s.currentTab==="MOTION"}])},[a("div",mY,[a("div",pY,[r.libraryEditorOpen&&s.currentTab==="LIBRARY"?N("",!0):(m(),p("div",{key:0,class:B(["top-drawer-shell",{"top-drawer-shell--open":s.liveBottomDrawerOpen}]),"data-testid":"bottom-drawer"},[a("button",{type:"button",class:B(["top-drawer-fab top-drawer-fab--stage",{"top-drawer-fab--active":s.liveBottomDrawerOpen}]),"aria-expanded":s.liveBottomDrawerOpen?"true":"false","aria-label":"Toggle bottom drawer",title:"Toggle bottom drawer","data-testid":"bottom-drawer-toggle",onClick:e[5]||(e[5]=M=>r.toggleLiveBottomDrawer())},[a("span",yY,[ve(l,{class:"top-drawer-fab__icon",name:"panel-bottom"})])],10,gY),a("div",vY,[a("button",{type:"button",class:B(["sub-pill",{active:s.liveBottomDrawerTab==="MODULATION"}]),onClick:e[6]||(e[6]=M=>r.setLiveBottomDrawerTab("MODULATION"))}," MODULATION ",2),a("button",{type:"button",class:B(["sub-pill",{active:s.liveBottomDrawerTab==="CROSSFADER"}]),onClick:e[7]||(e[7]=M=>r.setLiveBottomDrawerTab("CROSSFADER"))}," CROSSFADER ",2),a("button",{type:"button",class:B(["sub-pill",{active:s.liveBottomDrawerTab==="SYSTEM"}]),onClick:e[8]||(e[8]=M=>r.setLiveBottomDrawerTab("SYSTEM"))}," SYSTEM ",2)]),a("div",{class:B(["top-drawer-panel",{"top-drawer-panel--open":s.liveBottomDrawerOpen,"top-drawer-panel--system":s.liveBottomDrawerOpen&&s.liveBottomDrawerTab==="SYSTEM","top-drawer-panel--crossfader":s.liveBottomDrawerOpen&&s.liveBottomDrawerTab==="CROSSFADER"}])},[s.liveBottomDrawerTab==="MODULATION"?(m(),p("div",bY,[(m(!0),p(H,null,oe(r.liveModulationSlots,(M,F)=>(m(),p("div",{key:"live-mod-slot-"+F,class:"live-mod-slot"},[a("div",_Y,[a("span",SY,b(M.label),1),M.mappingLabel?(m(),p("span",wY,[ve(l,{name:"arrow-left"}),a("span",null,b(M.mappingLabel),1)])):N("",!0),a("div",MY,[M.paramKey?(m(),p("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",title:"Remove mapping",onClick:I=>r.clearParamMapping(M.paramKey)},[ve(l,{name:"close"})],8,PY)):N("",!0),M.paramKey?(m(),p("button",{key:1,type:"button",class:"framesync-button framesync-button--compact",title:"Add mapping",onClick:I=>r.openModulationMapping(M.paramKey)},[ve(l,{name:"sliders"})],8,xY)):N("",!0)])]),M.kind==="slider"?(m(),p("div",TY,[a("div",{class:"live-mod-slider",style:Mt({"--shade":`${M.shade}`})},[a("input",{type:"range",class:"framesync-input live-mod-slider__input",min:M.min,max:M.max,step:M.step,value:M.value,onInput:I=>M.paramKey&&r.setLiveModValue(M.paramKey,I.target.value)},null,40,AY),a("div",EY,b(M.valueLabel),1)],4)])):M.kind==="xypad"?(m(),p("div",CY,[a("div",{class:"live-mod-pad",onMousedown:I=>r.livePadDown(I,M),onMousemove:I=>r.livePadMove(I,M),onMouseup:e[9]||(e[9]=(...I)=>r.livePadUp&&r.livePadUp(...I)),onMouseleave:e[10]||(e[10]=(...I)=>r.livePadUp&&r.livePadUp(...I)),onTouchstart:lt(I=>r.livePadDown(I,M),["prevent"]),onTouchmove:lt(I=>r.livePadMove(I,M),["prevent"]),onTouchend:e[11]||(e[11]=lt((...I)=>r.livePadUp&&r.livePadUp(...I),["prevent"]))},[e[29]||(e[29]=a("div",{class:"live-mod-pad__crosshair live-mod-pad__crosshair--x"},null,-1)),e[30]||(e[30]=a("div",{class:"live-mod-pad__crosshair live-mod-pad__crosshair--y"},null,-1)),a("div",{class:"live-mod-pad__puck",style:Mt(M.puckStyle)},null,4)],40,kY),a("div",LY,[a("span",RY,"X "+b(M.xLabel),1),a("span",DY,"Y "+b(M.yLabel),1)])])):(m(),p("div",IY,[a("div",FY,[a("input",{type:"range",class:"framesync-input live-mod-knob__input",min:M.min,max:M.max,step:M.step,value:M.value,onInput:I=>M.paramKey&&r.setLiveModValue(M.paramKey,I.target.value)},null,40,NY),a("div",OY,b(M.valueLabel),1)])]))]))),128))])):s.liveBottomDrawerTab==="CROSSFADER"?(m(),at(_,{key:1,app:r.appViewModel},null,8,["app"])):s.liveBottomDrawerTab==="SYSTEM"?(m(),p("div",UY,[ve(v,{app:r.appViewModel},null,8,["app"])])):N("",!0)],2)],2)),a("div",BY,[a("div",{class:B(["video-wrap video-wrap--anchored",{"video-wrap--frame-processing":r.showFrameProcessingOnStage,"video-wrap--hls-and-preview":r.showMainStageHls&&r.showStandbyPreviewVideo}])},[a("div",{ref:"videoStageRef",class:B(["video-wrap__stage",{"video-wrap__stage--preview":s.videoStageSize==="small","video-wrap__stage--canvas":s.videoStageSize==="medium","video-wrap__stage--full":s.videoStageSize==="full"}])},[ve(S,{ref:"threeBackgroundRef","data-testid":"preview-standby-animation",class:B(["video-wrap__default-animation",{"video-wrap__default-animation--visible":r.showDefaultAnimation}]),style:Mt(r.webglLayerStyle),lfos:s.lfos,"audio-metrics":r.backgroundAudioMetrics,"active-tab":s.currentTab,morph:s.performance.crossfader,settings:s.defaultAnimation},null,8,["class","style","lfos","audio-metrics","active-tab","morph","settings"]),s.standbyPreviewVideoUrl?(m(),p("video",{key:0,ref:"standbyPreviewEl",class:B(["video-feed video-feed--standby-preview",{"video-feed--visible":r.showStandbyPreviewVideo}]),"data-testid":"standby-preview-video",src:s.standbyPreviewVideoUrl,muted:"",loop:"",autoplay:"",playsinline:"",preload:"auto"},null,10,VY)):N("",!0),r.showPreviewStill?(m(),p("img",{key:1,src:r.displayedPreviewStillPath,alt:"Generated preview",class:B(["video-still-preview",{"video-still-preview--over-webgl":r.showForgeOverWebgl}]),style:Mt(r.forgeOverlayStyle),"data-testid":"preview-still-frame"},null,14,zY)):N("",!0),a("video",{class:B(["video-feed","video-feed--hls",{"video-feed--visible":r.showDeforumVideo,"video-feed--blended":r.isBlendLayerActive&&r.showDeforumVideo,"video-feed--forge-reveal":r.deforumLayerAutoFadeIn}]),style:Mt(r.showDeforumVideo&&r.showForgeOverWebgl?r.forgeOverlayStyle:null),id:"player",ref:"videoEl",muted:"",playsinline:""},null,6),a("video",{ref:"inputVideoEl",class:B(["video-feed","video-layer-input-video",{"video-feed--visible":r.showLayerInputVideo}]),style:Mt(r.inputLayerStyle),muted:"",playsinline:"",controls:""},null,6),r.isInputLayerActive&&!r.activeLayerPlaybackUrl?(m(),p("div",$Y,[e[31]||(e[31]=a("span",{class:"video-layer-empty__title"},"Input layer",-1)),e[32]||(e[32]=a("span",{class:"framesync-subtitle"},"Pick a video from the library or link a cloud source.",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[12]||(e[12]=M=>r.openLibraryWorkspace("browser",{asSource:!0}))},"+ Add source")])):N("",!0),r.activeVideoLayer&&r.activeVideoLayer.kind==="cloud"?(m(),p("div",GY,[a("span",HY,b(r.activeVideoLayer.label),1),e[33]||(e[33]=a("span",{class:"framesync-subtitle"},"Cloud links open externally until direct streaming is wired in.",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[13]||(e[13]=M=>r.openCloudLayer(r.activeVideoLayer))},"Open link")])):N("",!0),r.showFrameProcessingOnStage?(m(),p("div",WY,[a("div",qY,[a("span",jY,[e[34]||(e[34]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",null,b(r.frameProcessingLabel),1),e[35]||(e[35]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))]),a("span",XY,b(r.frameProcessingHint),1)])])):N("",!0),a("div",KY,[a("div",null,[a("div",YY,b(s.timecode),1),a("div",JY,"Seed "+b(r.seedRandomEnabled?"Random":s.hud.seed),1),a("div",ZY,b(r.currentProjectLabel)+" · "+b(r.currentBatchLabel),1),r.isForgeAnimationLayerActive&&r.deforumStreamFrameLabel?(m(),p("div",QY,b(r.deforumStreamFrameLabel),1)):N("",!0)]),a("div",eJ,[a("div",null,[a("div",null,b(r.masterFps)+" fps",1),a("div",tJ,"lat "+b(s.stats.lat)+"ms",1),a("div",{class:B(["video-feed-status",{"video-feed-status--ready":s.videoReady&&r.isForgeAnimationLayerActive,"video-feed-status--selected":r.isForgeAnimationLayerActive}])},b(r.videoLayerStatusLabel),3)])])]),s.currentTab==="LIVE"&&r.pinnedParamItems.length?(m(),p("div",iJ,[ve(x,{size:"sm",class:"live-hud-pinned"},{header:Ni(()=>[...e[36]||(e[36]=[ie("Pinned",-1)])]),default:Ni(()=>[(m(!0),p(H,null,oe(r.pinnedParamItems.slice(0,4),M=>(m(),at(w,{key:"hud-pin-"+M.key,label:M.label,"param-key":M.key,value:M.val,min:M.min,max:M.max,source:s.paramSources[M.key]||"Manual",modulated:!!s.paramSources[M.key]&&s.paramSources[M.key]!=="Manual"},null,8,["label","param-key","value","min","max","source","modulated"]))),128))]),_:1})])):N("",!0),s.currentTab==="LIVE"?(m(),p("div",nJ,[r.modulatingNowItems.length?(m(),p("div",sJ,[ve(x,{size:"sm",variant:"overlay",class:"live-hud-modulating"},{header:Ni(()=>[...e[37]||(e[37]=[ie("modulating now",-1)])]),default:Ni(()=>[(m(!0),p(H,null,oe(r.modulatingNowItems.slice(0,3),M=>(m(),p("div",{key:"hud-mod-"+M.key,class:"live-hud-mod-row"},[a("div",rJ,[a("span",oJ,b(M.label),1),a("span",aJ,"← "+b(M.source),1),a("span",lJ,b(Number(M.val).toFixed(2)),1)]),a("div",dJ,[a("div",{class:"live-hud-mod-row__fill",style:Mt({width:M.pct+"%"})},null,4)])]))),128))]),_:1})])):N("",!0),a("div",uJ,[ve(x,{size:"sm",variant:"overlay",class:"live-hud-morph","data-testid":"live-morph-hud"},{header:Ni(()=>[...e[38]||(e[38]=[ie("morph",-1)])]),default:Ni(()=>[a("div",cJ,[a("span",hJ,"A · "+b(Math.round((1-s.performance.crossfader)*100))+"%",1),a("span",fJ,"B · "+b(Math.round(s.performance.crossfader*100))+"%",1)]),a("div",mJ,[a("input",{type:"range",min:"0",max:"1",step:"0.01",value:s.performance.crossfader,class:"live-hud-morph__slider",onInput:e[14]||(e[14]=M=>r.onCrossfaderSlider(M.target.value))},null,40,pJ)]),a("div",gJ,[a("button",{class:"framesync-button framesync-button--compact",onClick:e[15]||(e[15]=M=>r.onCrossfaderSlider(0))},"snap A"),a("button",{class:"framesync-button framesync-button--compact",onClick:e[16]||(e[16]=M=>r.onCrossfaderSlider(1))},"snap B"),a("button",{class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[17]||(e[17]=M=>r.onCrossfaderSlider(Math.random()))},"rand")])]),_:1})])])):N("",!0)],2)],2)]),s.currentTab==="LIVE"&&r.recentRunsRail.length?(m(),p("div",yJ,[a("div",vJ,[e[39]||(e[39]=a("span",{class:"recent-runs-rail__title"},"Recent runs",-1)),a("button",{type:"button",class:"recent-runs-rail__link",onClick:e[18]||(e[18]=M=>r.switchTab("RUNS"))},"Open runs")]),a("div",bJ,[(m(!0),p(H,null,oe(r.recentRunsRail,M=>(m(),p("button",{key:"recent-run-"+M.run_id,type:"button",class:"recent-runs-rail__item",onClick:F=>r.openRecentRunFromRail(M)},[r.runListingThumbUrl(M)?(m(),p("img",{key:0,src:r.runListingThumbUrl(M),class:"recent-runs-rail__thumb",alt:M.run_id},null,8,SJ)):(m(),p("div",wJ,"—")),a("div",MJ,[a("span",PJ,b(M.run_id),1),a("span",xJ,b(r.formatDate(M.started_at)),1)])],8,_J))),128))])])):N("",!0),a("audio",{ref:"avSyncAudio","data-testid":"av-sync-audio",src:s.audio.objectUrl||void 0,preload:"auto",style:{display:"none"}},null,8,TJ),s.currentTab==="MOTION"||s.currentTab==="GENERATE"?(m(),p("div",AJ,[a("div",EJ,[a("div",{class:B(["stage-sequencer-shell",{"stage-sequencer-shell--side-open":s.motionSequencerSideOpen}]),"data-testid":"motion-sequencer-dock"},[J(a("aside",CJ,[a("div",kJ,[e[40]||(e[40]=a("span",{class:"stage-sequencer-side__title"},[ie("Sequencer "),a("span",{class:"framesync-accent"},"Editor")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",title:"Close sequencer editor",onClick:e[19]||(e[19]=M=>{s.motionSequencerSideOpen=!1,r.saveSessionState()})},[ve(l,{name:"arrow-left"})])]),a("div",LJ,[ve(k,{app:r.appViewModel,"side-drawer":""},null,8,["app"])])],512),[[Wi,s.motionSequencerSideOpen]]),a("button",{type:"button",class:B(["stage-sequencer-side-toggle",{"stage-sequencer-side-toggle--open":s.motionSequencerSideOpen}]),"aria-expanded":s.motionSequencerSideOpen?"true":"false",title:s.motionSequencerSideOpen?"Hide sequencer editor":"Show sequencer editor","data-testid":"motion-sequencer-side-toggle",onClick:e[20]||(e[20]=M=>{s.motionSequencerSideOpen=!s.motionSequencerSideOpen,r.saveSessionState()})},[ve(l,{name:s.motionSequencerSideOpen?"arrow-left":"arrow-right"},null,8,["name"])],10,RJ),a("div",DJ,[ve(k,{app:r.appViewModel,stage:"","show-timeline":""},null,8,["app"]),s.generator.result||s.generator.status||s.performance.status||s.sequencerStatus?(m(),at(E,{key:0,app:r.appViewModel,"story-only":""},null,8,["app"])):N("",!0)])],2)])])):N("",!0)])])],2),s.libraryWorkspaceOpen?N("",!0):(m(),p("div",IJ,[a("aside",{class:B(["layers-sidebar",{"layers-sidebar--open":s.layersSidebarOpen}]),"data-testid":"video-layer-tabs"},[a("button",{type:"button",class:B(["layers-sidebar__toggle edge-dock-tab edge-dock-tab--layers",{"edge-dock-tab--panel-open":s.layersSidebarOpen}]),"aria-expanded":s.layersSidebarOpen?"true":"false","aria-label":r.layersSidebarToggleLabel,title:r.layersSidebarToggleLabel,"data-testid":"layers-sidebar-toggle",onClick:e[21]||(e[21]=(...M)=>r.layersSidebarToggle&&r.layersSidebarToggle(...M))},[ve(l,{class:"edge-dock-tab__icon",name:r.layersSidebarChevronIcon},null,8,["name"]),e[41]||(e[41]=a("span",{class:"edge-dock-tab__label"},"Layers",-1))],10,FJ),e[44]||(e[44]=a("div",{class:"layers-sidebar__rail-head"},[a("span",{class:"layers-sidebar__rail-title"},"Active preview")],-1)),a("div",NJ,[a("span",{class:B(["layers-sidebar__active-dot video-layer-tab__dot","video-layer-tab__dot--"+r.layerStatus(r.activeVideoLayer)]),"aria-hidden":"true"},null,2),a("span",OJ,b(((P=r.activeVideoLayer)==null?void 0:P.label)||"None"),1)]),a("div",UJ,[(m(!0),p(H,null,oe(r.runningPreviewVideoLayers,M=>(m(),p("button",{key:"sidebar-layer-"+M.id,type:"button",class:B(["layers-sidebar__item",{"layers-sidebar__item--active":s.activeVideoLayerId===M.id,"layers-sidebar__item--builtin":M.builtin}]),title:M.label,onClick:F=>r.selectVideoLayer(M.id)},[a("span",{class:B(["video-layer-tab__dot","video-layer-tab__dot--"+r.layerStatus(M)]),"aria-hidden":"true"},null,2),a("span",VJ,b(M.label),1)],10,BJ))),128)),a("button",{type:"button",class:"layers-sidebar__add","data-testid":"video-layer-add-toggle",title:"Add video source (opens Library)",onClick:e[22]||(e[22]=M=>r.openLibraryWorkspace("browser",{asSource:!0}))},[...e[42]||(e[42]=[a("span",{class:"layers-sidebar__add-icon"},"+",-1),a("span",{class:"layers-sidebar__item-label"},"Add source",-1)])])]),a("div",zJ,[a("div",$J,[e[43]||(e[43]=a("span",{class:"layers-sidebar__scenes-label"},"Scenes",-1)),a("button",{type:"button",class:"layers-sidebar__scenes-save framesync-button framesync-button--compact",title:"Save current engine state as a scene",onClick:e[23]||(e[23]=M=>r.saveScene("scene-"+Date.now().toString(36),s.defaultSceneName==="default"))},"Save")]),(m(!0),p(H,null,oe(s.savedScenes,M=>(m(),p("button",{key:M.name,type:"button",class:B(["layers-sidebar__scene-item",{"layers-sidebar__scene-item--default":M.name===s.defaultSceneName}]),onClick:F=>r.loadScene(M.name),onDblclick:F=>{s.defaultSceneName=M.name,r.saveScene(M.name,!0)},title:M.name+(M.name===s.defaultSceneName?" (default · double-click to set default)":" · double-click to set as default")},[a("span",HJ,b(M.name),1),a("button",{type:"button",class:"layers-sidebar__scene-delete",title:"Delete scene",onClick:lt(F=>r.deleteScene(M.name),["stop"])},"×",8,WJ)],42,GJ))),128)),s.savedScenes.length?N("",!0):(m(),p("div",qJ," No scenes saved yet. "))])],2),r.showEngineDrawerShell?(m(),p("aside",{key:0,class:B(["engine-drawer-shell",{"engine-drawer-shell--open":s.liveEngineDrawerOpen}]),"aria-hidden":s.liveEngineDrawerOpen?"false":"true","data-testid":"engine-drawer"},[a("button",{type:"button",class:B(["edge-dock-tab edge-dock-tab--engine",{"edge-dock-tab--inside":s.liveEngineDrawerOpen,"edge-dock-tab--panel-open":s.liveEngineDrawerOpen}]),"aria-expanded":s.liveEngineDrawerOpen?"true":"false","aria-label":r.engineDrawerToggleLabel,title:r.engineDrawerToggleLabel,"data-testid":"engine-drawer-toggle",onClick:e[24]||(e[24]=(...M)=>r.toggleEngineDrawer&&r.toggleEngineDrawer(...M))},[ve(l,{class:"edge-dock-tab__icon",name:r.engineDrawerChevronIcon},null,8,["name"]),e[45]||(e[45]=a("span",{class:"edge-dock-tab__label"},"Engine",-1))],10,XJ),J(a("div",KJ,[ve(D,{app:r.appViewModel},null,8,["app"])],512),[[Wi,s.liveEngineDrawerOpen]])],10,jJ)):N("",!0),a("div",{class:B(["live-drawer-shell live-drawer-shell--side live-drawer-shell--left",{"live-drawer-shell--open":s.rightPanelOpen}]),"data-testid":"right-panel-drawer"},[a("button",{type:"button",class:B(["edge-dock-tab edge-dock-tab--context",{"edge-dock-tab--panel-open":s.rightPanelOpen}]),"aria-expanded":s.rightPanelOpen?"true":"false","aria-label":r.contextPanelToggleLabel,title:r.contextPanelToggleLabel,"data-testid":"right-panel-toggle",onClick:e[25]||(e[25]=(...M)=>r.toggleRightPanel&&r.toggleRightPanel(...M))},[ve(l,{class:"edge-dock-tab__icon",name:r.contextPanelChevronIcon},null,8,["name"]),e[46]||(e[46]=a("span",{class:"edge-dock-tab__label edge-dock-tab__label--context"},"Controls",-1))],10,YJ),J(a("div",{class:B(["live-right-column",{"live-right-column--overlay":r.edgeDockOverlayMode}])},[s.currentTab==="LIVE"?(m(),at(u,{key:0,app:r.appViewModel},null,8,["app"])):s.currentTab==="PROMPTS"?(m(),at(f,{key:1,app:r.appViewModel},null,8,["app"])):s.currentTab==="MOTION"?(m(),at(g,{key:2,app:r.appViewModel},null,8,["app"])):s.currentTab==="MODULATION"||s.currentTab==="AUDIO"?(m(),at(y,{key:3,app:r.appViewModel},null,8,["app"])):s.currentTab==="SETTINGS"?(m(),at(T,{key:4,app:r.appViewModel},null,8,["app"])):s.currentTab==="RUNS"?(m(),at(v,{key:5,app:r.appViewModel},null,8,["app"])):N("",!0)],2),[[Wi,s.rightPanelOpen]])],2)]))],2)])}const ZJ=nt(WK,[["render",JJ]]);v1();Kb(ZJ).mount("#app"); +${t} anyway?`)),!o)return!1}return!0},applyDeforumSettingsJson(){try{const t=JSON.parse(this.deforumSettingsJson);if(!t||typeof t!="object")throw new Error("JSON must be an object");this.deforumSettings=Ma(this.normalizedDeforumSettings(),t),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.deforumSettingsJsonError="";const e=this.syncSelectedModelFromDeforumSettings();e?this.switchForgeModel(e,{persistDeforumSettings:!0}):this.queueDeforumSettingsSave(),this.deforumPlaying||this.scheduleDeforumPreview()}catch(t){this.deforumSettingsJsonError=String(t.message||t)}},async loadDeforumSettings({syncServerModel:t=!0}={}){this.deforumSettingsLoading=!0;try{const i=await(await fetch("/api/deforum/settings")).json();!this.sessionDeforumSettingsLoaded&&i.settings&&typeof i.settings=="object"&&(this.deforumSettings=Ma({...Sa},i.settings),this.deforumSettings=this.normalizedDeforumSettings()),this.deforumSettings&&this.session&&(this.deforumSettings={...this.deforumSettings,batch_name:this.session}),this.syncStepsAcrossControls(this.deforumSettings.steps,{syncGpuModal:!1}),this.syncSelectedModelFromDeforumSettings(),this.syncDeforumSettingsJson(),this.deforumSettingsStatus=this.sessionDeforumSettingsLoaded?"Loaded local session":"Loaded",t&&await this.restoreLastModel()}catch(e){this.deforumSettingsStatus="Load failed",console.error("loadDeforumSettings",e)}finally{this.deforumSettingsLoading=!1}},queueDeforumSettingsSave(){clearTimeout(this.deforumSaveTimer),this.deforumSaveTimer=setTimeout(()=>this.saveDeforumSettings(),800)},async saveDeforumSettings(){this.deforumSettingsSaving=!0;try{const t=this.activeDeforumSettings(),e=await fetch("/api/deforum/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:t})}),i=await e.json();if(!e.ok||i.error){this.deforumSettingsStatus=i.error||"Save failed";return}if(i.modelSync&&i.modelSync.success&&i.modelSync.model){const n=i.modelSync.model.model_name||i.modelSync.model.title||"";this.applyLoadedModelSelection(n,{queueDeforumSave:!1})}this.deforumSettingsStatus="Saved"}catch{this.deforumSettingsStatus="Save failed"}finally{this.deforumSettingsSaving=!1}},async generateDeforumPreviewFrame(){if(this.deforumPlaying)return this.performance.status="Stop animation to preview single frames",!1;if(!this.guardDeforumSettingsBeforeRun("render a preview frame")||this.previewGenerating)return!1;this.pinHeldPreviewFrame(),this.applyCrossfadeMorph(),this.previewGenerating=!0,this.performance.status="Rendering Deforum frame…",this.deforumSettingsStatus="Rendering…";try{const t=this.effectiveDeforumSettingsForRender(),e=await fetch("/api/deforum/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:t})}),i=await e.json();return!e.ok||i.error?(this.performance.status=i.error||"Deforum preview failed",this.deforumSettingsStatus="Preview failed",!1):(this.performance.lastPreviewPath=i.path,this.generator.lastPath=i.path,this.heldPreviewFramePath=i.path,this.persistDeforumContinuationFromThumb({src:i.path,path:i.path,name:String(i.path||"").split("/").pop()||""},{queueSave:!0,saveSession:!0,checkpoint:!0}),this.performance.status="Deforum frame ready",this.deforumSettingsStatus="Frame ready",this.scheduleFrameRefresh(40),this.maybeCaptureActiveStyleExample(i.path),!0)}catch(t){return this.performance.status=String(t.message||t),this.deforumSettingsStatus="Preview failed",!1}finally{this.previewGenerating=!1}},async generatePreviewFrame(){return this.deforumPlaying?!1:(this.enqueuePreviewRequest(this.deforumPanelOpen?"deforum":"auto"),await this.processPreviewQueue(),!this.previewRequestQueue.length)},async generateImage(){if(this.deforumPlaying){this.performance.status="Stop animation to preview single frames";return}if(this.previewGenerating)return;this.pinHeldPreviewFrame(),this.applyCrossfadeMorph(),this.previewGenerating=!0,this.performance.status="Generating preview frame…";const t=this.liveVibe.find(h=>h.key==="cfgscale")||this.liveVibe.find(h=>h.key==="cfg");this.liveVibe.find(h=>h.key==="strength");const e=this.deforumSettings.W||1024,i=this.deforumSettings.H||576,n=this.deforumSettings.steps||12,s=this.deforumSettings.seed!=null?this.deforumSettings.seed:this.hud.seed,r=this.deforumSettings.sampler||"Euler a",l=this.deforumSettings.negative_prompts||this.prompts.neg||"",o=wa(this.deforumSettings,"prompts.0")||this.buildMorphedPrompt(),u=this.effectivePositivePrompt(o),c=this.effectiveNegativePrompt(l);try{this.deforumSettings=this.normalizedDeforumSettings();const h=await fetch("/api/txt2img",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:u,negative_prompt:c,steps:n,cfg_scale:t?t.val:7,width:e,height:i,seed:s,sampler_name:r,settings:this.deforumSettings})}),d=await h.json();if(!h.ok||d.error){this.performance.status=d.error||"Preview failed";return}this.performance.lastPreviewPath=d.path,this.generator.lastPath=d.path,this.heldPreviewFramePath=d.path,this.performance.status="Preview frame ready",this.scheduleFrameRefresh(120),this.maybeCaptureActiveStyleExample(d.path)}catch(h){this.performance.status=String(h.message||h)}finally{this.previewGenerating=!1}},async refreshForgeStatus(){this.forge.loading=!0;try{const e=await(await fetch("/api/status")).json();e.sdForge?this.forge.available=e.sdForge.available:this.forge.available=!1}catch{this.forge.available=!1}finally{this.forge.loading=!1}},async saveForgeConnection(){try{await(await fetch("/api/forge/options",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})).json(),await this.refreshForgeStatus()}catch(t){console.error("Failed to save connection",t)}},async refreshForgeModels(){try{const{data:t}=await jt("/api/sd-models",{},"sd-models list");this.forge.models=t.models||[],this.forge.modelsSource=t.source||"";const e=this.findForgeModelEntry(this.forge.currentModel||this.forge.selectedModel);e&&e.metadata&&(this.forge.modelInfo=e.metadata)}catch{this.forge.modelsSource=""}},async switchForgeModel(t=this.forge.selectedModel,{persistDeforumSettings:e=!1,applyOptimizedDefaults:i=!1}={}){const n=this.normalizeModelName(t);if(!n)return!1;if(this.forge.selectedModel=n,this.normalizeModelName(this.forge.currentModel)===n)return this.applyLoadedModelSelection(n,{queueDeforumSave:e}),i&&this.applyModelOptimizedDefaults(n)&&e&&this.queueDeforumSettingsSave(),this.deforumPlaying||this.schedulePreviewFrame(),!0;this.forge.switching=!0;try{const r=await(await fetch("/api/sd-models/switch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model_name:n})})).json();if(r.success){const l=this.normalizeModelName(r.model&&(r.model.model_name||r.model.title)||n);return this.applyLoadedModelSelection(l,{queueDeforumSave:e}),r.model&&r.model.metadata&&(this.forge.modelInfo=r.model.metadata),i&&this.applyModelOptimizedDefaults(r.model||l)&&e&&this.queueDeforumSettingsSave(),this.deforumPlaying||this.schedulePreviewFrame(),!0}throw new Error(r.error||r.message||"Failed to switch model")}catch(s){return console.error("Failed to switch model",s),this.deforumSettingsStatus=`Model sync failed: ${s.message||s}`,!1}finally{this.forge.switching=!1}},async refreshForgeOptions(){try{const[t,e,i,n,s]=await Promise.all([fetch("/api/forge/options"),fetch("/api/forge/samplers"),fetch("/api/forge/schedulers"),fetch("/api/forge/vae"),fetch("/api/sd-models/current")]),r=await t.json(),l=await e.json(),o=await i.json(),u=await n.json(),c=await s.json();if(this.forge.available=r.available,this.forge.samplers=l.samplers||[],this.forge.schedulers=o.schedulers||[],this.forge.vaeList=u.vae||[],c.model){const m=c.model.model_name||c.model.title||"";this.applyLoadedModelSelection(m,{queueDeforumSave:!1,saveSession:!1}),c.model.metadata&&(this.forge.modelInfo=c.model.metadata)}const h=r.options||{},d=["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"];for(const m of d)h[m]!==void 0&&(this.forge.options[m]=h[m])}catch(t){console.error("Failed to load forge options",t)}},async applyForgeOptions(){const t=["sampler_name","scheduler","steps","cfg_scale","width","height","batch_size","sd_vae","clip_skip","eta_ddim","eta_ancestral","sigma_churn","enable_emphasis","use_old_sampling","do_not_add_watermark"],e={};for(const i of t)e[i]=this.forge.options[i];try{const n=await(await fetch("/api/forge/options",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json();n.success||console.error("Failed to apply options",n)}catch(i){console.error("Failed to apply forge options",i)}},async refreshForgeAll(){await Promise.all([this.refreshForgeStatus(),this.refreshForgeModels(),this.refreshForgeOptions()])}}},OZ={id:"app"},UZ={class:"restore-session-modal__dialog framesync-panel"},VZ={class:"framesync-footer",style:{"margin-top":"12px",gap:"10px","justify-content":"flex-end"}},BZ={class:"app-chrome"},zZ={class:"top-nav","aria-label":"Main navigation","data-testid":"top-nav",role:"tablist"},$Z={class:"top-nav__inner"},GZ=["aria-selected","tabindex","title","data-testid","onClick"],HZ={class:"tab__icon-wrap","aria-hidden":"true"},WZ={class:"tab__copy"},qZ={class:"tab__label"},jZ={class:"top-nav__actions"},XZ=["aria-expanded"],KZ={class:"app-header"},YZ=["title","aria-expanded"],JZ={class:"live-overlay-btn__arrow-wrap"},ZZ={class:"live-overlay-btn__top-label"},QZ={class:"preview-stage-row","data-testid":"preview-stage-row"},eQ={class:"preview-stage-main"},tQ=["aria-expanded"],iQ={class:"top-drawer-fab__icon-wrap","aria-hidden":"true"},nQ={class:"live-top-drawer__tabs"},sQ={key:0,class:"live-mod-grid"},rQ={class:"live-mod-slot__head"},oQ={class:"framesync-subtitle",style:{margin:"0"}},aQ={key:0,class:"live-mod-slot__map"},lQ={class:"live-mod-slot__actions"},uQ=["onClick"],dQ=["onClick"],cQ={key:0,class:"live-mod-slot__body"},hQ=["min","max","step","value","onInput"],mQ={class:"live-mod-slider__readout"},pQ={key:1,class:"live-mod-slot__body"},fQ=["onMousedown","onMousemove","onTouchstart","onTouchmove"],gQ={class:"live-mod-pad__axes"},yQ={class:"framesync-subtitle",style:{margin:"0"}},vQ={class:"framesync-subtitle",style:{margin:"0"}},bQ={key:2,class:"live-mod-slot__body"},_Q={class:"live-mod-knob"},SQ=["min","max","step","value","onInput"],wQ={class:"live-mod-knob__readout"},MQ={key:2,class:"top-drawer-system system-runs-tab","data-testid":"bottom-drawer-system"},xQ={class:"preview-stage-video-stack"},PQ=["src"],TQ=["src"],AQ={key:2,class:"video-layer-empty","data-testid":"video-layer-input-empty"},CQ={key:3,class:"video-layer-empty video-layer-empty--cloud"},EQ={class:"video-layer-empty__title"},kQ={key:4,class:"preview-loading-overlay","data-testid":"frame-processing-overlay","aria-live":"polite","aria-busy":"true"},RQ={class:"preview-loading-overlay__card"},LQ={class:"lazy-loading-indicator lazy-loading-indicator--overlay"},DQ={class:"preview-loading-overlay__hint"},IQ={class:"overlay"},FQ={class:"timecode"},NQ={style:{"font-size":"11px",color:"var(--text-secondary)"}},OQ={style:{"font-size":"11px",color:"var(--text-secondary)"}},UQ={key:0,class:"video-feed-frames","data-testid":"deforum-stream-frame-count"},VQ={style:{display:"flex","align-items":"flex-start",gap:"8px","text-align":"right"}},BQ={style:{"font-size":"11px",color:"var(--text-secondary)"}},zQ={key:5,class:"live-hud-strip live-hud-strip--pinned"},$Q={key:6,class:"live-hud-dock","data-testid":"live-hud-dock"},GQ={key:0,class:"live-hud-dock__cell live-hud-dock__cell--modulating","data-testid":"live-modulating-hud"},HQ={class:"live-hud-mod-row__info"},WQ={class:"live-hud-mod-row__label"},qQ={class:"live-hud-mod-row__source"},jQ={class:"live-hud-mod-row__val"},XQ={class:"live-hud-mod-row__bar"},KQ={class:"live-hud-dock__cell live-hud-dock__cell--morph"},YQ={class:"live-hud-morph__labels"},JQ={class:"live-hud-morph__a"},ZQ={class:"live-hud-morph__b"},QQ={class:"live-hud-morph__slider-wrap"},eee=["value"],tee={class:"live-hud-morph__actions"},iee={key:1,class:"recent-runs-rail","data-testid":"recent-runs-rail"},nee={class:"recent-runs-rail__header"},see={class:"recent-runs-rail__list"},ree=["onClick"],oee=["src","alt"],aee={key:1,class:"recent-runs-rail__thumb recent-runs-rail__thumb--empty"},lee={class:"recent-runs-rail__meta"},uee={class:"recent-runs-rail__id"},dee={class:"recent-runs-rail__date"},cee=["src"],hee={key:2,class:"preview-bottom-dock","data-testid":"preview-bottom-dock"},mee={class:"preview-bottom-dock__pane preview-bottom-dock__pane--sequencer"},pee={class:"stage-sequencer-side","data-testid":"motion-sequencer-side-drawer"},fee={class:"stage-sequencer-side__head"},gee={class:"stage-sequencer-side__body"},yee=["aria-expanded","title"],vee={class:"stage-sequencer-main"},bee={key:0,class:"edge-dock-host","data-testid":"edge-dock-host"},_ee=["aria-expanded","aria-label","title"],See={class:"layers-sidebar__active-badge"},wee={class:"layers-sidebar__active-name"},Mee={class:"layers-sidebar__list"},xee=["title","onClick"],Pee={class:"layers-sidebar__item-label"},Tee={class:"layers-sidebar__scenes"},Aee={class:"layers-sidebar__scenes-header"},Cee=["onClick","onDblclick","title"],Eee={class:"layers-sidebar__scene-name"},kee=["onClick"],Ree={key:0,class:"layers-sidebar__scenes-empty"},Lee=["aria-hidden"],Dee=["aria-expanded","aria-label","title"],Iee={class:"engine-drawer-panel"},Fee=["aria-expanded","aria-label","title"];function Nee(t,e,i,n,s,r){var x;const l=Ie("UiIcon"),o=Ie("StatusStrip"),u=Ie("LibraryWorkspaceOverlay"),c=Ie("LiveView"),h=Ie("LibraryView"),d=Ie("StreamView"),m=Ie("PromptsView"),g=Ie("MotionView"),b=Ie("ModulationView"),w=Ie("SettingsView"),v=Ie("CrossfaderPanel"),y=Ie("RunsBrowserPanel"),S=Ie("ThreeBackground"),P=Ie("LiveParamRow"),M=Ie("GlassPanel"),k=Ie("SequencerControlsPanel"),C=Ie("GenerateView"),L=Ie("AnimationEnginePanel");return p(),f("div",OZ,[s.restoreSessionPromptOpen?(p(),f("div",{key:0,class:"restore-session-modal",onClick:e[2]||(e[2]=(...T)=>r.onRestoreSessionBackdropClick&&r.onRestoreSessionBackdropClick(...T))},[a("div",UZ,[e[26]||(e[26]=a("div",{class:"framesync-header"},[a("div",{class:"framesync-title"},[ie("Restore "),a("span",{class:"framesync-accent"},"last UI state"),ie("?")])],-1)),e[27]||(e[27]=a("div",{class:"framesync-subtitle",style:{"margin-top":"8px"}}," Found a saved session state that doesn’t match the current UI defaults. ",-1)),a("div",VZ,[a("button",{type:"button",class:"framesync-button",onClick:e[0]||(e[0]=T=>r.dismissSessionRestore(!1))},"Discard"),a("button",{type:"button",class:"framesync-button framesync-button--live",onClick:e[1]||(e[1]=T=>r.dismissSessionRestore(!0))},"Restore")])])])):N("",!0),a("div",BZ,[a("nav",zZ,[a("div",$Z,[(p(!0),f(G,null,re(s.tabs,(T,F)=>(p(),f("button",{class:U(["tab",[`tab--${T.id.toLowerCase()}`,{active:s.currentTab===T.id}]]),key:T.id,role:"tab",type:"button","aria-selected":s.currentTab===T.id?"true":"false",tabindex:s.currentTab===T.id?0:-1,title:`${T.label} (${F+1}) · ← → switch tabs`,"data-testid":"top-nav-tab-"+T.id.toLowerCase(),onClick:I=>r.switchTab(T.id)},[a("span",HZ,[ve(l,{class:"tab__icon",name:T.icon},null,8,["name"])]),a("span",WZ,[a("span",qZ,_(T.label),1)])],10,GZ))),128))]),a("div",jZ,[a("button",{type:"button",class:U(["top-nav__icon-btn",{"top-nav__icon-btn--active":s.libraryWorkspaceOpen}]),"aria-expanded":s.libraryWorkspaceOpen?"true":"false",title:"Library — browse videos and open the editor","data-testid":"top-nav-library",onClick:e[3]||(e[3]=T=>r.toggleLibraryWorkspace())},[ve(l,{name:"folder"}),e[28]||(e[28]=a("span",{class:"top-nav__action-label"},"Library",-1))],10,XZ)])]),a("header",KZ,[ve(o,{playing:s.deforumPlaying,recording:s.isRecording,"preview-generating":s.previewGenerating,"frame-processing-active":r.showFrameProcessingInChrome,"frame-processing-label":r.frameProcessingLabel,"frame-processing-hint":r.frameProcessingHint,"preview-disabled":s.deforumPlaying,"hls-watch-enabled":s.hlsWatchEnabled,"hls-preview-valid":s.hlsPreviewStreamValid,"api-health":s.apiHealth,"gpu-active-count":r.gpuActiveCount,"gpu-total-count":r.gpuTotalCount,"midi-supported":s.midi.supported,"midi-selected":s.midi.selected,"ws-status":s.wsStatus,session:s.session,sessions:r.sessionCatalog,"morph-on":s.prompts.morphOn,onTogglePlay:r.toggleDeforumPlay,onStopPlay:r.stopDeforumPlay,onToggleRecord:r.toggleStreamRecord,onStartHlsWatch:r.enableHlsWatch,onStopHlsWatch:r.disableHlsWatch,onGeneratePreview:r.generatePreviewFrame,onOpenGpus:r.openGpuSettings,onToggleWs:r.toggleCollaboration,onOpenMidi:r.openMidiSettings,onSelectSession:r.selectSession,onNewSession:r.createNewSession,onPurgeSession:r.purgeSession,onRestoreSession:r.restoreSession,onResetLayout:r.resetUiLayoutDefaults},null,8,["playing","recording","preview-generating","frame-processing-active","frame-processing-label","frame-processing-hint","preview-disabled","hls-watch-enabled","hls-preview-valid","api-health","gpu-active-count","gpu-total-count","midi-supported","midi-selected","ws-status","session","sessions","morph-on","onTogglePlay","onStopPlay","onToggleRecord","onStartHlsWatch","onStopHlsWatch","onGeneratePreview","onOpenGpus","onToggleWs","onOpenMidi","onSelectSession","onNewSession","onPurgeSession","onRestoreSession","onResetLayout"])])]),ve(u,{app:r.appViewModel},null,8,["app"]),r.libraryEditorOpen&&s.currentTab==="LIBRARY"?N("",!0):(p(),f("div",{key:1,class:U(["live-drawer-shell live-drawer-shell--dock-top",{"live-drawer-shell--open":s.rightPanelOpen}]),"data-testid":"right-panel-drawer"},[a("button",{type:"button",class:U(["live-overlay-btn live-overlay-btn--top",{"live-overlay-btn--open":s.rightPanelOpen}]),title:r.rightPanelToggleTitle,"aria-expanded":s.rightPanelOpen?"true":"false","data-testid":"right-panel-toggle",onClick:e[4]||(e[4]=(...T)=>r.toggleRightPanel&&r.toggleRightPanel(...T))},[a("span",JZ,[ve(l,{class:"live-overlay-btn__state",name:r.rightPanelToggleIcon},null,8,["name"])]),a("span",ZZ,_(s.rightPanelOpen?"Hide panel":"Show panel"),1)],10,YZ),K(a("div",{class:U(["live-right-column",{"stage-rack-overlay":s.currentTab==="MOTION"}])},[s.currentTab==="LIVE"?(p(),ht(c,{key:0,app:r.appViewModel},null,8,["app"])):s.currentTab==="LIBRARY"?(p(),ht(h,{key:1,app:r.appViewModel},null,8,["app"])):s.currentTab==="STREAM"?(p(),ht(d,{key:2,app:r.appViewModel},null,8,["app"])):s.currentTab==="PROMPTS"?(p(),ht(m,{key:3,app:r.appViewModel},null,8,["app"])):s.currentTab==="MOTION"?(p(),ht(g,{key:4,app:r.appViewModel},null,8,["app"])):s.currentTab==="MODULATION"?(p(),ht(b,{key:5,app:r.appViewModel},null,8,["app"])):s.currentTab==="SETTINGS"?(p(),ht(w,{key:6,app:r.appViewModel},null,8,["app"])):N("",!0)],2),[[Ii,s.rightPanelOpen]])],2)),a("div",{class:U(["layout layout--sidebar",{"layout--live":s.currentTab==="LIVE","layout--stage":s.currentTab==="MOTION"||s.currentTab==="GENERATE","layout--studio":s.currentTab==="MODULATION"||s.currentTab==="AUDIO","layout--library-workspace":s.libraryWorkspaceOpen,"layout--stage-full":s.videoStageSize==="full","layout--edge-layers-open":s.layersSidebarOpen,"layout--edge-engine-open":r.showEngineDrawerShell&&s.liveEngineDrawerOpen,"layout--edge-context-open":!s.libraryWorkspaceOpen&&s.rightPanelOpen,"layout--edge-context-left":!s.libraryWorkspaceOpen&&s.rightPanelOpen,"layout--edge-overlay":r.edgeDockOverlayMode}])},[a("div",{class:U(["preview",{"preview--stage-full":s.videoStageSize==="full","preview--motion-dock":s.currentTab==="MOTION"}])},[a("div",QZ,[a("div",eQ,[r.libraryEditorOpen&&s.currentTab==="LIBRARY"?N("",!0):(p(),f("div",{key:0,class:U(["top-drawer-shell",{"top-drawer-shell--open":s.liveBottomDrawerOpen}]),"data-testid":"bottom-drawer"},[a("button",{type:"button",class:U(["top-drawer-fab top-drawer-fab--stage",{"top-drawer-fab--active":s.liveBottomDrawerOpen}]),"aria-expanded":s.liveBottomDrawerOpen?"true":"false","aria-label":"Toggle bottom drawer",title:"Toggle bottom drawer","data-testid":"bottom-drawer-toggle",onClick:e[5]||(e[5]=T=>r.toggleLiveBottomDrawer())},[a("span",iQ,[ve(l,{class:"top-drawer-fab__icon",name:"panel-bottom"})])],10,tQ),a("div",nQ,[a("button",{type:"button",class:U(["sub-pill",{active:s.liveBottomDrawerTab==="MODULATION"}]),onClick:e[6]||(e[6]=T=>r.setLiveBottomDrawerTab("MODULATION"))}," MODULATION ",2),a("button",{type:"button",class:U(["sub-pill",{active:s.liveBottomDrawerTab==="CROSSFADER"}]),onClick:e[7]||(e[7]=T=>r.setLiveBottomDrawerTab("CROSSFADER"))}," CROSSFADER ",2),a("button",{type:"button",class:U(["sub-pill",{active:s.liveBottomDrawerTab==="SYSTEM"}]),onClick:e[8]||(e[8]=T=>r.setLiveBottomDrawerTab("SYSTEM"))}," SYSTEM ",2)]),a("div",{class:U(["top-drawer-panel",{"top-drawer-panel--open":s.liveBottomDrawerOpen,"top-drawer-panel--system":s.liveBottomDrawerOpen&&s.liveBottomDrawerTab==="SYSTEM","top-drawer-panel--crossfader":s.liveBottomDrawerOpen&&s.liveBottomDrawerTab==="CROSSFADER"}])},[s.liveBottomDrawerTab==="MODULATION"?(p(),f("div",sQ,[(p(!0),f(G,null,re(r.liveModulationSlots,(T,F)=>(p(),f("div",{key:"live-mod-slot-"+F,class:"live-mod-slot"},[a("div",rQ,[a("span",oQ,_(T.label),1),T.mappingLabel?(p(),f("span",aQ,[ve(l,{name:"arrow-left"}),a("span",null,_(T.mappingLabel),1)])):N("",!0),a("div",lQ,[T.paramKey?(p(),f("button",{key:0,type:"button",class:"framesync-button framesync-button--compact",title:"Remove mapping",onClick:I=>r.clearParamMapping(T.paramKey)},[ve(l,{name:"close"})],8,uQ)):N("",!0),T.paramKey?(p(),f("button",{key:1,type:"button",class:"framesync-button framesync-button--compact",title:"Add mapping",onClick:I=>r.openModulationMapping(T.paramKey)},[ve(l,{name:"sliders"})],8,dQ)):N("",!0)])]),T.kind==="slider"?(p(),f("div",cQ,[a("div",{class:"live-mod-slider",style:Pt({"--shade":`${T.shade}`})},[a("input",{type:"range",class:"framesync-input live-mod-slider__input",min:T.min,max:T.max,step:T.step,value:T.value,onInput:I=>T.paramKey&&r.setLiveModValue(T.paramKey,I.target.value)},null,40,hQ),a("div",mQ,_(T.valueLabel),1)],4)])):T.kind==="xypad"?(p(),f("div",pQ,[a("div",{class:"live-mod-pad",onMousedown:I=>r.livePadDown(I,T),onMousemove:I=>r.livePadMove(I,T),onMouseup:e[9]||(e[9]=(...I)=>r.livePadUp&&r.livePadUp(...I)),onMouseleave:e[10]||(e[10]=(...I)=>r.livePadUp&&r.livePadUp(...I)),onTouchstart:ft(I=>r.livePadDown(I,T),["prevent"]),onTouchmove:ft(I=>r.livePadMove(I,T),["prevent"]),onTouchend:e[11]||(e[11]=ft((...I)=>r.livePadUp&&r.livePadUp(...I),["prevent"]))},[e[29]||(e[29]=a("div",{class:"live-mod-pad__crosshair live-mod-pad__crosshair--x"},null,-1)),e[30]||(e[30]=a("div",{class:"live-mod-pad__crosshair live-mod-pad__crosshair--y"},null,-1)),a("div",{class:"live-mod-pad__puck",style:Pt(T.puckStyle)},null,4)],40,fQ),a("div",gQ,[a("span",yQ,"X "+_(T.xLabel),1),a("span",vQ,"Y "+_(T.yLabel),1)])])):(p(),f("div",bQ,[a("div",_Q,[a("input",{type:"range",class:"framesync-input live-mod-knob__input",min:T.min,max:T.max,step:T.step,value:T.value,onInput:I=>T.paramKey&&r.setLiveModValue(T.paramKey,I.target.value)},null,40,SQ),a("div",wQ,_(T.valueLabel),1)])]))]))),128))])):s.liveBottomDrawerTab==="CROSSFADER"?(p(),ht(v,{key:1,app:r.appViewModel},null,8,["app"])):s.liveBottomDrawerTab==="SYSTEM"?(p(),f("div",MQ,[ve(y,{app:r.appViewModel},null,8,["app"])])):N("",!0)],2)],2)),a("div",xQ,[a("div",{class:U(["video-wrap video-wrap--anchored",{"video-wrap--frame-processing":r.showFrameProcessingOnStage,"video-wrap--hls-and-preview":r.showMainStageHls&&r.showStandbyPreviewVideo}])},[a("div",{ref:"videoStageRef",class:U(["video-wrap__stage",{"video-wrap__stage--preview":s.videoStageSize==="small","video-wrap__stage--canvas":s.videoStageSize==="medium","video-wrap__stage--full":s.videoStageSize==="full"}])},[ve(S,{ref:"threeBackgroundRef","data-testid":"preview-standby-animation",class:U(["video-wrap__default-animation",{"video-wrap__default-animation--visible":r.showDefaultAnimation}]),style:Pt(r.webglLayerStyle),lfos:s.lfos,"audio-metrics":r.backgroundAudioMetrics,"active-tab":s.currentTab,morph:s.performance.crossfader,settings:s.defaultAnimation},null,8,["class","style","lfos","audio-metrics","active-tab","morph","settings"]),s.standbyPreviewVideoUrl?(p(),f("video",{key:0,ref:"standbyPreviewEl",class:U(["video-feed video-feed--standby-preview",{"video-feed--visible":r.showStandbyPreviewVideo}]),"data-testid":"standby-preview-video",src:s.standbyPreviewVideoUrl,muted:"",loop:"",autoplay:"",playsinline:"",preload:"auto"},null,10,PQ)):N("",!0),r.showPreviewStill?(p(),f("img",{key:1,src:r.displayedPreviewStillPath,alt:"Generated preview",class:U(["video-still-preview",{"video-still-preview--over-webgl":r.showForgeOverWebgl}]),style:Pt(r.forgeOverlayStyle),"data-testid":"preview-still-frame"},null,14,TQ)):N("",!0),a("video",{class:U(["video-feed","video-feed--hls",{"video-feed--visible":r.showDeforumVideo,"video-feed--blended":r.isBlendLayerActive&&r.showDeforumVideo,"video-feed--forge-reveal":r.deforumLayerAutoFadeIn}]),style:Pt(r.showDeforumVideo&&r.showForgeOverWebgl?r.forgeOverlayStyle:null),id:"player",ref:"videoEl",muted:"",playsinline:""},null,6),a("video",{ref:"inputVideoEl",class:U(["video-feed","video-layer-input-video",{"video-feed--visible":r.showLayerInputVideo}]),style:Pt(r.inputLayerStyle),muted:"",playsinline:"",controls:""},null,6),r.isInputLayerActive&&!r.activeLayerPlaybackUrl?(p(),f("div",AQ,[e[31]||(e[31]=a("span",{class:"video-layer-empty__title"},"Input layer",-1)),e[32]||(e[32]=a("span",{class:"framesync-subtitle"},"Pick a video from the library or link a cloud source.",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[12]||(e[12]=T=>r.openLibraryWorkspace("browser",{asSource:!0}))},"+ Add source")])):N("",!0),r.activeVideoLayer&&r.activeVideoLayer.kind==="cloud"?(p(),f("div",CQ,[a("span",EQ,_(r.activeVideoLayer.label),1),e[33]||(e[33]=a("span",{class:"framesync-subtitle"},"Cloud links open externally until direct streaming is wired in.",-1)),a("button",{type:"button",class:"framesync-button",onClick:e[13]||(e[13]=T=>r.openCloudLayer(r.activeVideoLayer))},"Open link")])):N("",!0),r.showFrameProcessingOnStage?(p(),f("div",kQ,[a("div",RQ,[a("span",LQ,[e[34]||(e[34]=a("span",{class:"lazy-loading-indicator__spinner","aria-hidden":"true"},null,-1)),a("span",null,_(r.frameProcessingLabel),1),e[35]||(e[35]=a("span",{class:"lazy-loading-indicator__dots","aria-hidden":"true"},[a("span"),a("span"),a("span")],-1))]),a("span",DQ,_(r.frameProcessingHint),1)])])):N("",!0),a("div",IQ,[a("div",null,[a("div",FQ,_(s.timecode),1),a("div",NQ,"Seed "+_(r.seedRandomEnabled?"Random":s.hud.seed),1),a("div",OQ,_(r.currentProjectLabel)+" · "+_(r.currentBatchLabel),1),r.isForgeAnimationLayerActive&&r.deforumStreamFrameLabel?(p(),f("div",UQ,_(r.deforumStreamFrameLabel),1)):N("",!0)]),a("div",VQ,[a("div",null,[a("div",null,_(r.masterFps)+" fps",1),a("div",BQ,"lat "+_(s.stats.lat)+"ms",1),a("div",{class:U(["video-feed-status",{"video-feed-status--ready":s.videoReady&&r.isForgeAnimationLayerActive,"video-feed-status--selected":r.isForgeAnimationLayerActive}])},_(r.videoLayerStatusLabel),3)])])]),s.currentTab==="LIVE"&&r.pinnedParamItems.length?(p(),f("div",zQ,[ve(M,{size:"sm",class:"live-hud-pinned"},{header:Ht(()=>[...e[36]||(e[36]=[ie("Pinned",-1)])]),default:Ht(()=>[(p(!0),f(G,null,re(r.pinnedParamItems.slice(0,4),T=>(p(),ht(P,{key:"hud-pin-"+T.key,label:T.label,"param-key":T.key,value:T.val,min:T.min,max:T.max,source:s.paramSources[T.key]||"Manual",modulated:!!s.paramSources[T.key]&&s.paramSources[T.key]!=="Manual"},null,8,["label","param-key","value","min","max","source","modulated"]))),128))]),_:1})])):N("",!0),s.currentTab==="LIVE"?(p(),f("div",$Q,[r.modulatingNowItems.length?(p(),f("div",GQ,[ve(M,{size:"sm",variant:"overlay",class:"live-hud-modulating"},{header:Ht(()=>[...e[37]||(e[37]=[ie("modulating now",-1)])]),default:Ht(()=>[(p(!0),f(G,null,re(r.modulatingNowItems.slice(0,3),T=>(p(),f("div",{key:"hud-mod-"+T.key,class:"live-hud-mod-row"},[a("div",HQ,[a("span",WQ,_(T.label),1),a("span",qQ,"← "+_(T.source),1),a("span",jQ,_(Number(T.val).toFixed(2)),1)]),a("div",XQ,[a("div",{class:"live-hud-mod-row__fill",style:Pt({width:T.pct+"%"})},null,4)])]))),128))]),_:1})])):N("",!0),a("div",KQ,[ve(M,{size:"sm",variant:"overlay",class:"live-hud-morph","data-testid":"live-morph-hud"},{header:Ht(()=>[...e[38]||(e[38]=[ie("morph",-1)])]),default:Ht(()=>[a("div",YQ,[a("span",JQ,"A · "+_(Math.round((1-s.performance.crossfader)*100))+"%",1),a("span",ZQ,"B · "+_(Math.round(s.performance.crossfader*100))+"%",1)]),a("div",QQ,[a("input",{type:"range",min:"0",max:"1",step:"0.01",value:s.performance.crossfader,class:"live-hud-morph__slider",onInput:e[14]||(e[14]=T=>r.onCrossfaderSlider(T.target.value))},null,40,eee)]),a("div",tee,[a("button",{class:"framesync-button framesync-button--compact",onClick:e[15]||(e[15]=T=>r.onCrossfaderSlider(0))},"snap A"),a("button",{class:"framesync-button framesync-button--compact",onClick:e[16]||(e[16]=T=>r.onCrossfaderSlider(1))},"snap B"),a("button",{class:"framesync-button framesync-button--compact framesync-button--live",onClick:e[17]||(e[17]=T=>r.onCrossfaderSlider(Math.random()))},"rand")])]),_:1})])])):N("",!0)],2)],2)]),s.currentTab==="LIVE"&&r.recentRunsRail.length?(p(),f("div",iee,[a("div",nee,[e[39]||(e[39]=a("span",{class:"recent-runs-rail__title"},"Recent runs",-1)),a("button",{type:"button",class:"recent-runs-rail__link",onClick:e[18]||(e[18]=T=>r.switchTab("RUNS"))},"Open runs")]),a("div",see,[(p(!0),f(G,null,re(r.recentRunsRail,T=>(p(),f("button",{key:"recent-run-"+T.run_id,type:"button",class:"recent-runs-rail__item",onClick:F=>r.openRecentRunFromRail(T)},[r.runListingThumbUrl(T)?(p(),f("img",{key:0,src:r.runListingThumbUrl(T),class:"recent-runs-rail__thumb",alt:T.run_id},null,8,oee)):(p(),f("div",aee,"—")),a("div",lee,[a("span",uee,_(T.run_id),1),a("span",dee,_(r.formatDate(T.started_at)),1)])],8,ree))),128))])])):N("",!0),a("audio",{ref:"avSyncAudio","data-testid":"av-sync-audio",src:s.audio.objectUrl||void 0,preload:"auto",style:{display:"none"}},null,8,cee),s.currentTab==="MOTION"||s.currentTab==="GENERATE"?(p(),f("div",hee,[a("div",mee,[a("div",{class:U(["stage-sequencer-shell",{"stage-sequencer-shell--side-open":s.motionSequencerSideOpen}]),"data-testid":"motion-sequencer-dock"},[K(a("aside",pee,[a("div",fee,[e[40]||(e[40]=a("span",{class:"stage-sequencer-side__title"},[ie("Sequencer "),a("span",{class:"framesync-accent"},"Editor")],-1)),a("button",{type:"button",class:"framesync-button framesync-button--compact",title:"Close sequencer editor",onClick:e[19]||(e[19]=T=>{s.motionSequencerSideOpen=!1,r.saveSessionState()})},[ve(l,{name:"arrow-left"})])]),a("div",gee,[ve(k,{app:r.appViewModel,"side-drawer":""},null,8,["app"])])],512),[[Ii,s.motionSequencerSideOpen]]),a("button",{type:"button",class:U(["stage-sequencer-side-toggle",{"stage-sequencer-side-toggle--open":s.motionSequencerSideOpen}]),"aria-expanded":s.motionSequencerSideOpen?"true":"false",title:s.motionSequencerSideOpen?"Hide sequencer editor":"Show sequencer editor","data-testid":"motion-sequencer-side-toggle",onClick:e[20]||(e[20]=T=>{s.motionSequencerSideOpen=!s.motionSequencerSideOpen,r.saveSessionState()})},[ve(l,{name:s.motionSequencerSideOpen?"arrow-left":"arrow-right"},null,8,["name"])],10,yee),a("div",vee,[ve(k,{app:r.appViewModel,stage:"","show-timeline":""},null,8,["app"]),s.generator.result||s.generator.status||s.performance.status||s.sequencerStatus?(p(),ht(C,{key:0,app:r.appViewModel,"story-only":""},null,8,["app"])):N("",!0)])],2)])])):N("",!0)])])],2),s.libraryWorkspaceOpen?N("",!0):(p(),f("div",bee,[a("aside",{class:U(["layers-sidebar",{"layers-sidebar--open":s.layersSidebarOpen}]),"data-testid":"video-layer-tabs"},[a("button",{type:"button",class:U(["layers-sidebar__toggle edge-dock-tab edge-dock-tab--layers",{"edge-dock-tab--panel-open":s.layersSidebarOpen}]),"aria-expanded":s.layersSidebarOpen?"true":"false","aria-label":r.layersSidebarToggleLabel,title:r.layersSidebarToggleLabel,"data-testid":"layers-sidebar-toggle",onClick:e[21]||(e[21]=(...T)=>r.layersSidebarToggle&&r.layersSidebarToggle(...T))},[ve(l,{class:"edge-dock-tab__icon",name:r.layersSidebarChevronIcon},null,8,["name"]),e[41]||(e[41]=a("span",{class:"edge-dock-tab__label"},"Layers",-1))],10,_ee),e[44]||(e[44]=a("div",{class:"layers-sidebar__rail-head"},[a("span",{class:"layers-sidebar__rail-title"},"Active preview")],-1)),a("div",See,[a("span",{class:U(["layers-sidebar__active-dot video-layer-tab__dot","video-layer-tab__dot--"+r.layerStatus(r.activeVideoLayer)]),"aria-hidden":"true"},null,2),a("span",wee,_(((x=r.activeVideoLayer)==null?void 0:x.label)||"None"),1)]),a("div",Mee,[(p(!0),f(G,null,re(r.runningPreviewVideoLayers,T=>(p(),f("button",{key:"sidebar-layer-"+T.id,type:"button",class:U(["layers-sidebar__item",{"layers-sidebar__item--active":s.activeVideoLayerId===T.id,"layers-sidebar__item--builtin":T.builtin}]),title:T.label,onClick:F=>r.selectVideoLayer(T.id)},[a("span",{class:U(["video-layer-tab__dot","video-layer-tab__dot--"+r.layerStatus(T)]),"aria-hidden":"true"},null,2),a("span",Pee,_(T.label),1)],10,xee))),128)),a("button",{type:"button",class:"layers-sidebar__add","data-testid":"video-layer-add-toggle",title:"Add video source (opens Library)",onClick:e[22]||(e[22]=T=>r.openLibraryWorkspace("browser",{asSource:!0}))},[...e[42]||(e[42]=[a("span",{class:"layers-sidebar__add-icon"},"+",-1),a("span",{class:"layers-sidebar__item-label"},"Add source",-1)])])]),a("div",Tee,[a("div",Aee,[e[43]||(e[43]=a("span",{class:"layers-sidebar__scenes-label"},"Scenes",-1)),a("button",{type:"button",class:"layers-sidebar__scenes-save framesync-button framesync-button--compact",title:"Save current engine state as a scene",onClick:e[23]||(e[23]=T=>r.saveScene("scene-"+Date.now().toString(36),s.defaultSceneName==="default"))},"Save")]),(p(!0),f(G,null,re(s.savedScenes,T=>(p(),f("button",{key:T.name,type:"button",class:U(["layers-sidebar__scene-item",{"layers-sidebar__scene-item--default":T.name===s.defaultSceneName}]),onClick:F=>r.loadScene(T.name),onDblclick:F=>{s.defaultSceneName=T.name,r.saveScene(T.name,!0)},title:T.name+(T.name===s.defaultSceneName?" (default · double-click to set default)":" · double-click to set as default")},[a("span",Eee,_(T.name),1),a("button",{type:"button",class:"layers-sidebar__scene-delete",title:"Delete scene",onClick:ft(F=>r.deleteScene(T.name),["stop"])},"×",8,kee)],42,Cee))),128)),s.savedScenes.length?N("",!0):(p(),f("div",Ree," No scenes saved yet. "))])],2),r.showEngineDrawerShell?(p(),f("aside",{key:0,class:U(["engine-drawer-shell",{"engine-drawer-shell--open":s.liveEngineDrawerOpen}]),"aria-hidden":s.liveEngineDrawerOpen?"false":"true","data-testid":"engine-drawer"},[a("button",{type:"button",class:U(["edge-dock-tab edge-dock-tab--engine",{"edge-dock-tab--inside":s.liveEngineDrawerOpen,"edge-dock-tab--panel-open":s.liveEngineDrawerOpen}]),"aria-expanded":s.liveEngineDrawerOpen?"true":"false","aria-label":r.engineDrawerToggleLabel,title:r.engineDrawerToggleLabel,"data-testid":"engine-drawer-toggle",onClick:e[24]||(e[24]=(...T)=>r.toggleEngineDrawer&&r.toggleEngineDrawer(...T))},[ve(l,{class:"edge-dock-tab__icon",name:r.engineDrawerChevronIcon},null,8,["name"]),e[45]||(e[45]=a("span",{class:"edge-dock-tab__label"},"Engine",-1))],10,Dee),K(a("div",Iee,[ve(L,{app:r.appViewModel},null,8,["app"])],512),[[Ii,s.liveEngineDrawerOpen]])],10,Lee)):N("",!0),a("div",{class:U(["live-drawer-shell live-drawer-shell--side live-drawer-shell--left",{"live-drawer-shell--open":s.rightPanelOpen}]),"data-testid":"right-panel-drawer"},[a("button",{type:"button",class:U(["edge-dock-tab edge-dock-tab--context",{"edge-dock-tab--panel-open":s.rightPanelOpen}]),"aria-expanded":s.rightPanelOpen?"true":"false","aria-label":r.contextPanelToggleLabel,title:r.contextPanelToggleLabel,"data-testid":"right-panel-toggle",onClick:e[25]||(e[25]=(...T)=>r.toggleRightPanel&&r.toggleRightPanel(...T))},[ve(l,{class:"edge-dock-tab__icon",name:r.contextPanelChevronIcon},null,8,["name"]),e[46]||(e[46]=a("span",{class:"edge-dock-tab__label edge-dock-tab__label--context"},"Controls",-1))],10,Fee),K(a("div",{class:U(["live-right-column",{"live-right-column--overlay":r.edgeDockOverlayMode}])},[s.currentTab==="LIVE"?(p(),ht(c,{key:0,app:r.appViewModel},null,8,["app"])):s.currentTab==="PROMPTS"?(p(),ht(m,{key:1,app:r.appViewModel},null,8,["app"])):s.currentTab==="MOTION"?(p(),ht(g,{key:2,app:r.appViewModel},null,8,["app"])):s.currentTab==="MODULATION"||s.currentTab==="AUDIO"?(p(),ht(b,{key:3,app:r.appViewModel},null,8,["app"])):s.currentTab==="SETTINGS"?(p(),ht(w,{key:4,app:r.appViewModel},null,8,["app"])):s.currentTab==="RUNS"?(p(),ht(y,{key:5,app:r.appViewModel},null,8,["app"])):N("",!0)],2),[[Ii,s.rightPanelOpen]])],2)]))],2)])}const Oee=it(NZ,[["render",Nee]]);p0();W1(Oee).mount("#app"); diff --git a/docker/web/public/freecut/defora-bridge.js b/docker/web/public/freecut/defora-bridge.js new file mode 100644 index 00000000..29569e0c --- /dev/null +++ b/docker/web/public/freecut/defora-bridge.js @@ -0,0 +1,224 @@ +/** + * Defora ↔ FreeCut handoff: auto-import library videos via URL or postMessage. + * Loaded on every FreeCut SPA page (see server.js inject + index.html). + */ +(function deforaFreecutBridge() { + const IMPORT_PARAM = 'deforaImport'; + const MESSAGE_TYPE = 'defora:import-url'; + const MAX_ATTEMPTS = 80; + const RETRY_MS = 400; + + let pendingUrl = ''; + let attemptTimer = null; + let attempts = 0; + + function readPendingFromQuery() { + try { + const q = new URLSearchParams(window.location.search); + const raw = q.get(IMPORT_PARAM); + if (raw) return decodeURIComponent(raw); + } catch (_e) { /* ignore */ } + return ''; + } + + function normalizeUrl(url) { + const u = String(url || '').trim(); + if (!u) return ''; + if (/^https?:\/\//i.test(u)) return u; + if (u.startsWith('/')) return `${window.location.origin}${u}`; + return u; + } + + function textOf(el) { + return (el && (el.textContent || el.innerText || '')).trim(); + } + + function clickEl(el) { + if (!el) return false; + try { + el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window })); + return true; + } catch (_e) { + return false; + } + } + + function findButtonByLabel(re) { + const nodes = document.querySelectorAll('button, [role="button"], a'); + for (const el of nodes) { + const label = textOf(el); + if (re.test(label)) return el; + } + return null; + } + + function findImportUrlTrigger() { + const byAria = document.querySelector( + 'button[aria-label*="URL" i], button[title*="URL" i], [role="button"][aria-label*="URL" i]', + ); + if (byAria) return byAria; + const mediaPanel = [...document.querySelectorAll('aside, section, div')].find((el) => { + const t = textOf(el); + return t.includes('Media') && (t.includes('Import') || t.includes('Drop files')); + }); + if (mediaPanel) { + const buttons = mediaPanel.querySelectorAll('button, [role="button"]'); + for (const btn of buttons) { + const label = textOf(btn); + if (/^import$/i.test(label)) continue; + if (/url|link/i.test(label) || btn.querySelector('svg')) { + if (btn !== findButtonByLabel(/^import$/i)) return btn; + } + } + const iconButtons = mediaPanel.querySelectorAll('button'); + if (iconButtons.length >= 2) return iconButtons[iconButtons.length - 1]; + } + return document.querySelector('button[data-testid*="url" i], button[data-testid*="import-url" i]'); + } + + function findUrlDialog() { + const dialogs = document.querySelectorAll('[role="dialog"], dialog'); + for (const dlg of dialogs) { + const t = textOf(dlg); + if (/import\s+from\s+url/i.test(t)) return dlg; + } + return null; + } + + function submitUrlDialog(url) { + const dlg = findUrlDialog(); + if (!dlg) return false; + const input = dlg.querySelector( + 'input[type="url"], input[type="text"], input:not([type="hidden"]):not([type="checkbox"])', + ); + if (!input) return false; + input.focus(); + input.value = url; + input.dispatchEvent(new Event('input', { bubbles: true })); + input.dispatchEvent(new Event('change', { bubbles: true })); + const confirm = [...dlg.querySelectorAll('button, [role="button"]')].find((btn) => { + const label = textOf(btn); + return /^import$/i.test(label) && !/cancel/i.test(label); + }); + if (!confirm) return false; + clickEl(confirm); + return true; + } + + function openImportUrlDialog() { + if (findUrlDialog()) return true; + const trigger = findImportUrlTrigger(); + if (trigger) clickEl(trigger); + return !!findUrlDialog(); + } + + function submitNewProjectWizard() { + const body = textOf(document.body); + if (!/project name/i.test(body) && !/enter project name/i.test(body)) return false; + const nameInput = document.querySelector( + 'input[placeholder*="project name" i], input[placeholder*="Enter project" i], input[type="text"]', + ); + if (nameInput && !nameInput.value) { + nameInput.value = 'Defora import'; + nameInput.dispatchEvent(new Event('input', { bubbles: true })); + } + const createBtn = findButtonByLabel(/create\s+project/i) || findButtonByLabel(/^create$/i); + if (createBtn) clickEl(createBtn); + return !!createBtn; + } + + function ensureEditorSurface() { + const path = window.location.pathname || ''; + const body = textOf(document.body); + if (/\/editor\//i.test(path)) return true; + if (body.includes('Media') && (body.includes('Import') || body.includes('Drop files'))) return true; + if (/project name/i.test(body) || /enter project name/i.test(body)) { + return submitNewProjectWizard(); + } + if (!/\/projects\/?$/i.test(path) && !path.endsWith('/projects')) { + return !!document.querySelector('.timeline-hero, [class*="timeline"]'); + } + const newBtn = + findButtonByLabel(/\+\s*new\s+project/i) + || findButtonByLabel(/new\s+project/i); + const cards = document.querySelectorAll( + 'a[href*="/editor/"], [data-testid*="project" i], button[class*="project" i], [class*="project-card" i]', + ); + if (cards.length > 0) { + clickEl(cards[0]); + return true; + } + if (newBtn) { + clickEl(newBtn); + return submitNewProjectWizard() || true; + } + return false; + } + + function mediaImported() { + const body = textOf(document.body); + if (/no media yet/i.test(body)) return false; + const thumbs = document.querySelectorAll( + '[class*="media" i] img, [class*="MediaCard" i], [data-testid*="media" i], video', + ); + if (thumbs.length > 0) return true; + return /timeline|V1|A1|Drop files here or click Import/i.test(body) && !/welcome to freecut/i.test(body); + } + + function tryImportOnce(url) { + if (mediaImported()) { + window.dispatchEvent(new CustomEvent('defora:import-complete', { detail: { url } })); + return true; + } + ensureEditorSurface(); + if (openImportUrlDialog() && submitUrlDialog(url)) { + return false; + } + const importBtn = findButtonByLabel(/^import$/i); + if (importBtn && !findUrlDialog()) clickEl(importBtn); + return false; + } + + function queueImport(url) { + const normalized = normalizeUrl(url); + if (!normalized) return; + pendingUrl = normalized; + attempts = 0; + if (attemptTimer) clearInterval(attemptTimer); + attemptTimer = setInterval(() => { + attempts += 1; + if (!pendingUrl || attempts > MAX_ATTEMPTS) { + clearInterval(attemptTimer); + attemptTimer = null; + return; + } + if (tryImportOnce(pendingUrl) || mediaImported()) { + pendingUrl = ''; + clearInterval(attemptTimer); + attemptTimer = null; + } + }, RETRY_MS); + tryImportOnce(normalized); + } + + window.addEventListener('message', (event) => { + if (!event || !event.data || event.data.type !== MESSAGE_TYPE) return; + const originOk = + event.origin === window.location.origin + || event.origin === 'null' + || !event.origin; + if (!originOk) return; + queueImport(event.data.url); + }); + + const initial = readPendingFromQuery(); + if (initial) { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => queueImport(initial), { once: true }); + } else { + queueImport(initial); + } + } + + window.__deforaFreecutBridge = { queueImport, normalizeUrl }; +})(); diff --git a/docker/web/public/freecut/index.html b/docker/web/public/freecut/index.html index cb92c276..3b6ad6d7 100644 --- a/docker/web/public/freecut/index.html +++ b/docker/web/public/freecut/index.html @@ -27,5 +27,6 @@
+ diff --git a/docker/web/public/textures/transition/transition1.png b/docker/web/public/textures/transition/transition1.png new file mode 100644 index 00000000..f8ecf6d3 Binary files /dev/null and b/docker/web/public/textures/transition/transition1.png differ diff --git a/docker/web/public/textures/transition/transition2.png b/docker/web/public/textures/transition/transition2.png new file mode 100644 index 00000000..48872102 Binary files /dev/null and b/docker/web/public/textures/transition/transition2.png differ diff --git a/docker/web/public/textures/transition/transition3.png b/docker/web/public/textures/transition/transition3.png new file mode 100644 index 00000000..92d8a65c Binary files /dev/null and b/docker/web/public/textures/transition/transition3.png differ diff --git a/docker/web/public/textures/transition/transition4.png b/docker/web/public/textures/transition/transition4.png new file mode 100644 index 00000000..6cf56e38 Binary files /dev/null and b/docker/web/public/textures/transition/transition4.png differ diff --git a/docker/web/public/textures/transition/transition5.png b/docker/web/public/textures/transition/transition5.png new file mode 100644 index 00000000..89bef7cb Binary files /dev/null and b/docker/web/public/textures/transition/transition5.png differ diff --git a/docker/web/public/textures/transition/transition6.png b/docker/web/public/textures/transition/transition6.png new file mode 100644 index 00000000..df58f4c6 Binary files /dev/null and b/docker/web/public/textures/transition/transition6.png differ diff --git a/docker/web/scripts/capture-web-ui.mjs b/docker/web/scripts/capture-web-ui.mjs index ed615285..89754bc2 100644 --- a/docker/web/scripts/capture-web-ui.mjs +++ b/docker/web/scripts/capture-web-ui.mjs @@ -1,5 +1,5 @@ /** - * Capture README screenshots (screenshots/*.png) with seeded E2E server. + * Capture README screenshots (docs/design/screenshots/readme/*.png) with seeded E2E server. * Usage: cd docker/web && node scripts/capture-web-ui.mjs * Fast: E2E_FAST=1 node scripts/capture-web-ui.mjs */ @@ -30,7 +30,7 @@ const webRoot = path.join(__dirname, '..'); const repoRoot = path.resolve(webRoot, '..', '..'); const outDir = process.env.OUT_DIR ? path.resolve(process.env.OUT_DIR) - : path.join(repoRoot, 'screenshots'); + : path.join(repoRoot, 'docs/design/screenshots/readme'); fs.mkdirSync(outDir, { recursive: true }); const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'defora-readme-shots-')); diff --git a/docker/web/scripts/capture-webgl-demos.mjs b/docker/web/scripts/capture-webgl-demos.mjs new file mode 100644 index 00000000..8cb5a8c2 --- /dev/null +++ b/docker/web/scripts/capture-webgl-demos.mjs @@ -0,0 +1,325 @@ +#!/usr/bin/env node +/** + * Capture ~5s WebGL standby clips for each animation mode (Playwright). + * + * Usage: + * node scripts/capture-webgl-demos.mjs --duration 5 --out ../../forge_cli_output/engine_demos/webgl + * DEFORA_BASE_URL=http://127.0.0.1:3000 node scripts/capture-webgl-demos.mjs --modes transition,protoplanet + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { execSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { chromium } from 'playwright'; +import { + clickTab, + dismissSessionModalIfOpen, + ensureRightPanelClosed, + ensureRightPanelOpen, + waitForNavTabs, +} from '../test/playwright-nav.mjs'; +import { startE2eServer } from '../test/playwright-server.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const DEFAULT_MODES = [ + 'transition', + 'protoplanet', + 'periodic_table', + 'instancing', + 'ocean', + 'marching', +]; + +function parseArgs(argv) { + const opts = { + duration: 5, + out: path.join(__dirname, '../../../forge_cli_output/engine_demos/webgl'), + modes: DEFAULT_MODES, + baseUrl: process.env.BASE_URL || '', + startServer: false, + headed: false, + fps: 12, + viewport: { width: 1440, height: 900 }, + }; + for (let i = 2; i < argv.length; i += 1) { + const arg = argv[i]; + if (arg === '--duration' && argv[i + 1]) { + opts.duration = Math.max(1, Number(argv[++i]) || 5); + } else if (arg === '--out' && argv[i + 1]) { + opts.out = path.resolve(argv[++i]); + } else if (arg === '--modes' && argv[i + 1]) { + opts.modes = argv[++i].split(',').map((m) => m.trim()).filter(Boolean); + } else if (arg === '--base-url' && argv[i + 1]) { + opts.baseUrl = argv[++i]; + } else if (arg === '--start-server') { + opts.startServer = true; + } else if (arg === '--headed') { + opts.headed = true; + } else if (arg === '--help' || arg === '-h') { + console.log(`Usage: node capture-webgl-demos.mjs [--duration 5] [--out DIR] [--modes a,b] [--base-url URL] [--start-server]`); + process.exit(0); + } + } + return opts; +} + +async function isDeforaApp(url) { + try { + const res = await fetch(url, { signal: AbortSignal.timeout(8000) }); + if (!res.ok) return false; + const html = await res.text(); + return html.includes('data-testid="preview-standby-animation"'); + } catch { + return false; + } +} + +async function resolveBaseUrl(opts) { + const candidates = [ + opts.baseUrl, + process.env.DEFORA_BASE_URL, + process.env.BASE_URL, + 'http://127.0.0.1:3000', + 'http://127.0.0.1:3999', + ].filter(Boolean); + for (const url of candidates) { + if (await isDeforaApp(url)) return url; + } + if (candidates.length > 0) { + console.warn(`No Defora app at ${candidates.join(', ')} — starting E2E server…`); + } + const server = await startE2eServer({ port: 0 }); + return `http://127.0.0.1:${server.port}`; +} + +async function closeEngineDrawerIfOpen(page) { + const engineToggle = page.locator('[data-testid="engine-drawer-toggle"]').first(); + if ((await engineToggle.count()) > 0) { + const expanded = await engineToggle.getAttribute('aria-expanded'); + if (expanded === 'true') await engineToggle.click({ force: true }); + } +} + +async function collapseChrome(page) { + await ensureRightPanelClosed(page); + await closeEngineDrawerIfOpen(page); + const bottomDrawer = page.locator('[data-testid="bottom-drawer-toggle"]').first(); + if ((await bottomDrawer.count()) > 0) { + const expanded = await bottomDrawer.getAttribute('aria-expanded'); + if (expanded === 'true') await bottomDrawer.click({ force: true }); + } +} + +async function openWebglLayer(page) { + await clickTab(page, 'LIVE'); + await page.waitForTimeout(300); + await closeEngineDrawerIfOpen(page); + const sidebarToggle = page.locator('[data-testid="layers-sidebar-toggle"]').first(); + if ((await sidebarToggle.count()) > 0) { + const expanded = await sidebarToggle.getAttribute('aria-expanded'); + if (expanded !== 'true') await sidebarToggle.click({ force: true }); + } + const webglItem = page.locator('.layers-sidebar__item').filter({ hasText: /^WebGL$/ }).first(); + if ((await webglItem.count()) === 0) { + throw new Error('WebGL layer not found in layers sidebar'); + } + await webglItem.click({ force: true }); + await page.waitForSelector( + '[data-testid="preview-standby-animation"].video-wrap__default-animation--visible', + { timeout: 30000 }, + ); +} + +async function openWebglModeSelect(page) { + await ensureRightPanelOpen(page); + const engineToggle = page.locator('[data-testid="engine-drawer-toggle"]').first(); + if ((await engineToggle.count()) > 0) { + const engineOpen = await engineToggle.getAttribute('aria-expanded'); + if (engineOpen !== 'true') await engineToggle.click(); + } + const webglRow = page.locator('[data-testid="animation-engine-webgl"]').first(); + if ((await webglRow.count()) > 0) await webglRow.click(); + const controls = page.locator('[data-testid="animation-engine-controls-webgl"]').first(); + if ((await controls.count()) > 0) { + const isOpen = await controls.evaluate((el) => el.open); + if (!isOpen) { + await controls.locator('summary.animation-engine-layer-row__controls-summary').click(); + } + } + const webglSection = page.locator('[data-testid="live-webgl-controls"]').first(); + await webglSection.waitFor({ state: 'visible', timeout: 20000 }); + return webglSection.locator('select.framesync-select').first(); +} + +async function enableDemoMotion(page, mode) { + if (mode === 'transition') { + for (const testId of ['tx-scene-animate', 'tx-transition-animate']) { + const btn = page.locator(`[data-testid="${testId}"]`).first(); + if ((await btn.count()) === 0) continue; + const active = await btn.evaluate((el) => el.classList.contains('active')); + if (!active) await btn.click(); + } + } + if (mode === 'periodic_table') { + const btn = page.locator('[data-testid="pt-auto-cycle"]').first(); + if ((await btn.count()) > 0) { + const active = await btn.evaluate((el) => el.classList.contains('active')); + if (!active) await btn.click(); + } + } +} + +async function waitForPreviewMotion(page, mode) { + const warmupMs = mode === 'protoplanet' ? 2500 : mode === 'periodic_table' ? 2000 : 1000; + await page.waitForTimeout(warmupMs); + const preview = page.locator('[data-testid="preview-standby-animation"]'); + await preview.waitFor({ state: 'visible', timeout: 30000 }); + const changed = await page.evaluate(async () => { + const root = document.querySelector('[data-testid="preview-standby-animation"]'); + if (!root) return false; + const snap = () => root.innerHTML.length + root.offsetWidth + root.offsetHeight; + const a = snap(); + await new Promise((r) => setTimeout(r, 400)); + const b = snap(); + return a !== b || !!root.querySelector('canvas'); + }); + if (!changed) { + console.warn(` [warn] preview may be static for mode ${mode}`); + } +} + +function encodeFramesToWebm(framesDir, outPath, frameCount, fps) { + execSync( + [ + 'ffmpeg', + '-y', + '-framerate', + String(fps), + '-i', + `"${path.join(framesDir, 'frame_%04d.png')}"`, + '-frames:v', + String(frameCount), + '-c:v', + 'libvpx-vp9', + '-pix_fmt', + 'yuv420p', + '-crf', + '30', + '-b:v', + '0', + `"${outPath}"`, + ].join(' '), + { stdio: 'pipe' }, + ); +} + +async function capturePreviewFrames(page, mode, durationSec, fps, outDir) { + const frameCount = Math.max(1, Math.round(durationSec * fps)); + const framesDir = path.join(outDir, `.frames-${mode}`); + fs.rmSync(framesDir, { recursive: true, force: true }); + fs.mkdirSync(framesDir, { recursive: true }); + const intervalMs = 1000 / fps; + const hasCanvas = (await page.locator('[data-testid="preview-standby-animation"] canvas').count()) > 0; + + for (let i = 0; i < frameCount; i += 1) { + const framePath = path.join(framesDir, `frame_${String(i + 1).padStart(4, '0')}.png`); + if (hasCanvas) { + const b64 = await page.evaluate(() => { + const canvas = document.querySelector('[data-testid="preview-standby-animation"] canvas'); + if (!canvas) return null; + return canvas.toDataURL('image/png').split(',')[1]; + }); + if (!b64) throw new Error('canvas toDataURL failed'); + fs.writeFileSync(framePath, Buffer.from(b64, 'base64')); + } else { + const target = page.locator('[data-testid="preview-standby-animation"]'); + await target.screenshot({ path: framePath, animations: 'allow', timeout: 5000 }); + } + if (i + 1 < frameCount) await page.waitForTimeout(intervalMs); + } + const outPath = path.join(outDir, `${mode}.webm`); + encodeFramesToWebm(framesDir, outPath, frameCount, fps); + fs.rmSync(framesDir, { recursive: true, force: true }); + return outPath; +} + +async function captureMode(browser, baseUrl, mode, durationSec, outDir, viewport, fps) { + const context = await browser.newContext({ viewport }); + await context.addInitScript(() => { + try { + for (const key of Object.keys(localStorage)) { + if (key.startsWith('defora_session')) localStorage.removeItem(key); + } + } catch { + /* ignore */ + } + }); + const page = await context.newPage(); + try { + await page.goto(baseUrl, { waitUntil: 'domcontentloaded', timeout: 90000 }); + await dismissSessionModalIfOpen(page); + await waitForNavTabs(page); + await openWebglLayer(page); + const modeSelect = await openWebglModeSelect(page); + await modeSelect.selectOption(mode); + await enableDemoMotion(page, mode); + await waitForPreviewMotion(page, mode); + await collapseChrome(page); + await clickTab(page, 'LIVE'); + console.log(` capturing ${durationSec}s @ ${fps}fps…`); + return await capturePreviewFrames(page, mode, durationSec, fps, outDir); + } finally { + await page.close(); + await context.close(); + } +} + +async function main() { + const opts = parseArgs(process.argv); + fs.mkdirSync(opts.out, { recursive: true }); + const baseUrl = await resolveBaseUrl(opts); + console.log(`BASE_URL: ${baseUrl}`); + console.log(`Modes: ${opts.modes.join(', ')}`); + console.log(`Output: ${opts.out}`); + + const browser = await chromium.launch({ + headless: !opts.headed, + args: ['--use-angle=swiftshader', '--enable-webgl', '--ignore-gpu-blocklist'], + }); + const manifest = { baseUrl, durationSec: opts.duration, fps: opts.fps, modes: {} }; + try { + for (const mode of opts.modes) { + console.log(`\n=== WebGL · ${mode} ===`); + try { + const outPath = await captureMode( + browser, + baseUrl, + mode, + opts.duration, + opts.out, + opts.viewport, + opts.fps, + ); + manifest.modes[mode] = { status: 'ok', path: outPath }; + console.log(` saved ${outPath}`); + } catch (err) { + manifest.modes[mode] = { status: 'error', reason: String(err.message || err) }; + console.error(` [error] ${mode}:`, err.message || err); + } + } + } finally { + await browser.close(); + } + + const manifestPath = path.join(opts.out, 'manifest.json'); + fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); + console.log(`\nManifest: ${manifestPath}`); + const failed = Object.values(manifest.modes).filter((m) => m.status !== 'ok').length; + process.exitCode = failed > 0 ? 1 : 0; +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/docker/web/scripts/import-forge-prompt-styles.mjs b/docker/web/scripts/import-forge-prompt-styles.mjs index 083f6e60..be05298f 100644 --- a/docker/web/scripts/import-forge-prompt-styles.mjs +++ b/docker/web/scripts/import-forge-prompt-styles.mjs @@ -16,27 +16,12 @@ const webRoot = join(__dirname, ".."); const { importFromForge, readStyles, writeStyles } = require("../modules/prompt-styles-store.js"); const forgeUrl = process.env.FORGE_URL || process.env.FORGE_BASE_URL || "http://192.168.2.104:7860"; -const writeLive = process.argv.includes("--write"); async function main() { - const result = await importFromForge(forgeUrl, webRoot, { merge: true }); + const result = await importFromForge(forgeUrl, webRoot, { merge: true, persistSeed: true }); console.log(`Imported from ${forgeUrl}:`, result); - if (writeLive) { - const styles = await readStyles(webRoot); - console.log(`Live store now has ${styles.length} styles`); - } else { - const styles = await readStyles(webRoot); - const seedPath = join(webRoot, "data", "prompt-styles-seed.json"); - await writeStyles(webRoot, styles); - const fs = await import("fs/promises"); - const seed = JSON.parse(await fs.readFile(seedPath, "utf8").catch(() => '{"styles":[]}')); - seed.styles = styles; - seed.importedFrom = `${forgeUrl}/sdapi/v1/prompt-styles`; - seed.count = styles.length; - seed.updatedAt = new Date().toISOString(); - await fs.writeFile(seedPath, JSON.stringify(seed, null, 2), "utf8"); - console.log(`Updated seed: ${seedPath} (${styles.length} styles)`); - } + const styles = await readStyles(webRoot); + console.log(`Live store now has ${styles.length} styles (seed updated)`); } main().catch((err) => { diff --git a/docker/web/scripts/sync-app-definition.mjs b/docker/web/scripts/sync-app-definition.mjs index 7cbf30f4..a3a8cdba 100644 --- a/docker/web/scripts/sync-app-definition.mjs +++ b/docker/web/scripts/sync-app-definition.mjs @@ -13,7 +13,7 @@ const appVuePath = join(root, 'src', 'App.vue'); const outPath = join(root, 'src', 'app-definition.js'); // Single-line imports must be processed before multi-line blocks (api-utils regex is greedy). -const UTIL_MODULES = ['animation-plugins/motion-loras.mjs', 'utils/morph-utils.mjs', 'utils/deforum-settings-schema.mjs', 'utils/deforum-settings-verify.mjs', 'utils/api-utils.js', 'shared/run-detail-json.mjs', 'shared/prompt-styles.mjs', 'shared/engine-config.mjs', 'shared/wan-engine-config.mjs', 'animation-plugins/animatelcm-engine-config.mjs', 'animation-plugins/common-visual.mjs']; +const UTIL_MODULES = ['animation-plugins/motion-loras.mjs', 'utils/morph-utils.mjs', 'utils/deforum-settings-schema.mjs', 'utils/deforum-settings-verify.mjs', 'utils/api-utils.js', 'shared/run-detail-json.mjs', 'shared/prompt-styles.mjs', 'shared/engine-config.mjs', 'shared/freecut-bridge.mjs', 'shared/deforum-continuation.mjs', 'shared/story-llm-request.mjs', 'shared/protoplanet-gpgpu.mjs', 'shared/periodic-table-settings.mjs', 'shared/engine-settings-snapshot.mjs', 'shared/deforum-controlnet-config.mjs', 'shared/wan-engine-config.mjs', 'shared/svd-engine-config.mjs', 'animation-plugins/animatelcm-engine-config.mjs', 'animation-plugins/common-visual.mjs']; function extractVueTemplate(src, label) { const templateOpen = src.indexOf('
-Web UI Settings +Web UI Settings

ENGINE sub-tab: Active checkpoint card, inline CFG / steps / sampler / scheduler controls, LCM Engine toggle, resolution, seed mode, and model-specific profile buttons. CONTROLLERS / MIDI and GPU POOL sub-tabs also live here.

-Web UI ControlNet +Web UI ControlNet

ControlNet sub-tab (under PROMPTS): Per-slot model picker filtered to the active checkpoint family, weight slider with visual strength indicator, and enable/disable toggle per slot.