diff --git a/presets/default_captures/index.json b/presets/default_captures/index.json new file mode 100644 index 0000000..dc3dbb7 --- /dev/null +++ b/presets/default_captures/index.json @@ -0,0 +1,78 @@ +{ + "generated_at": 1781275481.5536296, + "generator": "seed_default_captures.py", + "version": "1.0.0", + "sample_rate": 48000, + "captures": [ + { + "name": "clean", + "filename": "clean.nam", + "path": "/root/projects/pi-multifx-pedal/presets/default_captures/clean.nam", + "gain_db": 0.0, + "description": "Clean amp \u2014 no clipping, full headroom", + "tags": [ + "clean", + "fender", + "twin" + ], + "file_size_bytes": 26888, + "sha256": "fc0f57260ae8aee530733e942bb8b9cec90e9fa009bde8991c8f8d906182face" + }, + { + "name": "crunch", + "filename": "crunch.nam", + "path": "/root/projects/pi-multifx-pedal/presets/default_captures/crunch.nam", + "gain_db": 6.0, + "description": "Edge of breakup \u2014 light grit, dynamic", + "tags": [ + "crunch", + "vox", + "ac30" + ], + "file_size_bytes": 26886, + "sha256": "8b19fd0416208d020763565bb9a6427e9043886a750ffd16b18aa37b05d98cc5" + }, + { + "name": "lead", + "filename": "lead.nam", + "path": "/root/projects/pi-multifx-pedal/presets/default_captures/lead.nam", + "gain_db": 12.0, + "description": "Sustained lead \u2014 mid-gain, singing", + "tags": [ + "lead", + "marshall", + "plexi" + ], + "file_size_bytes": 26886, + "sha256": "51bd9f386ab295d264b5aeaf3c7864d2596eb222c864edb418dd6852be610d64" + }, + { + "name": "rhythm", + "filename": "rhythm.nam", + "path": "/root/projects/pi-multifx-pedal/presets/default_captures/rhythm.nam", + "gain_db": 8.0, + "description": "Rhythm crunch \u2014 palm-mute friendly", + "tags": [ + "rhythm", + "british", + "jcm800" + ], + "file_size_bytes": 26888, + "sha256": "d570ee1c89f50c3ea2ef162b347b96908c9ccdac71beec599ba5fe3428610d4c" + }, + { + "name": "hi-gain", + "filename": "hi-gain.nam", + "path": "/root/projects/pi-multifx-pedal/presets/default_captures/hi-gain.nam", + "gain_db": 18.0, + "description": "High gain \u2014 saturated, compressed", + "tags": [ + "hi-gain", + "modern", + "5150" + ], + "file_size_bytes": 26888, + "sha256": "3e46669c2d1c0a9cba61d6b5c21d07f7d901647c999ae0706d81a9535ecee496" + } + ] +} \ No newline at end of file diff --git a/src/dsp/nam_engine b/src/dsp/nam_engine new file mode 100755 index 0000000..4891340 Binary files /dev/null and b/src/dsp/nam_engine differ diff --git a/src/dsp/nam_engine.py b/src/dsp/nam_engine.py new file mode 100644 index 0000000..86da8b4 --- /dev/null +++ b/src/dsp/nam_engine.py @@ -0,0 +1,223 @@ +"""Python interface to the C++ NAM engine subprocess. + +Spawns nam_engine as a subprocess and communicates via stdin/stdout +pipes for real-time audio processing. Falls back to PyTorch if the +C++ engine is unavailable. +""" + +from __future__ import annotations + +import json +import logging +import os +import subprocess +import time +from pathlib import Path +from typing import Optional + +import numpy as np + +logger = logging.getLogger(__name__) + +ENGINE_PATH = Path(__file__).parent / 'nam_engine' +DEFAULT_BLOCK_SIZE = 256 + + +class NAMEngineProcess: + """Manages the C++ nam_engine subprocess for a single model.""" + + def __init__(self, model_path: str | Path, block_size: int = DEFAULT_BLOCK_SIZE): + self._model_path = Path(model_path) + self._block_size = block_size + self._proc: Optional[subprocess.Popen] = None + self._static: bool = False + self._sample_rate: float = 48000.0 + self._timing_samples: list[float] = [] + self._loaded: bool = False + + def start(self) -> bool: + """Launch the engine subprocess.""" + if not self._model_path.exists(): + logger.error('Model not found: %s', self._model_path) + return False + + if not ENGINE_PATH.exists(): + logger.error('NAM engine binary not found: %s', ENGINE_PATH) + return False + + try: + self._proc = subprocess.Popen( + [str(ENGINE_PATH), str(self._model_path), str(self._block_size)], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + except Exception as e: + logger.error('Failed to start NAM engine: %s', e) + return False + + # Wait for the ready signal on stderr + ready_line = self._read_stderr_line(timeout=5.0) + if ready_line is None: + logger.error('NAM engine failed to start (timeout waiting for ready)') + self.stop() + return False + + if 'FAILED' in ready_line: + logger.error('NAM engine failed: %s', ready_line) + self.stop() + return False + + # Parse ready line: "NAM engine: loaded (static=, sr=)" + # "NAM engine: block_size=, ready" + if 'static=1' in ready_line: + self._static = True + logger.info('NAM engine ready: %s', ready_line.strip()) + + # Read the block_size line too + ready_line2 = self._read_stderr_line(timeout=2.0) + if ready_line2: + logger.info('NAM engine ready2: %s', ready_line2.strip()) + + self._loaded = True + return True + + def process(self, audio_block: np.ndarray) -> np.ndarray: + """Process a block of audio through the NAM engine. + + Args: + audio_block: float32 numpy array of shape (N,) or (1, N) + + Returns: + float32 numpy array of same shape. + """ + if self._proc is None or self._proc.stdin is None or self._proc.stdout is None: + return audio_block # passthrough + + # Ensure 1D + was_2d = audio_block.ndim == 2 + if was_2d: + audio_block = audio_block[0] + + # Ensure float32 + if audio_block.dtype != np.float32: + audio_block = audio_block.astype(np.float32) + + start = time.perf_counter() + + # Write block to engine + self._proc.stdin.write(audio_block.tobytes()) + self._proc.stdin.flush() + + # Read processed block + raw = self._proc.stdout.read(audio_block.nbytes) + if len(raw) != audio_block.nbytes: + logger.warning('NAM engine short read: got %d bytes, expected %d', + len(raw), audio_block.nbytes) + return audio_block # passthrough on error + + out = np.frombuffer(raw, dtype=np.float32).copy() + + # Reshape back if input was 2D + if was_2d: + out = out[np.newaxis, :] + + # Track timing + elapsed_ms = (time.perf_counter() - start) * 1000 + self._timing_samples.append(elapsed_ms) + if len(self._timing_samples) > 200: + self._timing_samples = self._timing_samples[-100:] + + return out + + def stop(self): + """Terminate the engine subprocess.""" + if self._proc is not None: + try: + self._proc.terminate() + self._proc.wait(timeout=3) + except Exception: + self._proc.kill() + self._proc.wait(timeout=1) + self._proc = None + self._loaded = False + + def _read_stderr_line(self, timeout: float = 5.0) -> Optional[str]: + """Read a line from stderr with timeout.""" + if self._proc is None or self._proc.stderr is None: + return None + # Poll until data available or timeout + import select + import sys + + # Use polling loop + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + # Check if process is still alive + if self._proc.poll() is not None: + # Read remaining stderr + remaining = self._proc.stderr.read().decode('utf-8', errors='replace') + logger.error('Engine exited with code %d: %s', self._proc.returncode, remaining) + return 'FAILED: process exited' + + # Try non-blocking read + line = self._proc.stderr.readline() + if line: + return line.decode('utf-8', errors='replace') + + time.sleep(0.05) # 50ms poll interval + + return None # timeout + + @property + def is_loaded(self) -> bool: + return self._loaded + + @property + def is_static(self) -> bool: + return self._static + + @property + def avg_inference_ms(self) -> float: + if not self._timing_samples: + return 0.0 + return float(np.mean(self._timing_samples[-50:])) + + def __del__(self): + self.stop() + + +# ── Simple test ──────────────────────────────────────────────────────── + +if __name__ == '__main__': + import sys + logging.basicConfig(level=logging.INFO) + + model = sys.argv[1] if len(sys.argv) > 1 else 'models/nam/clean.nam' + block_size = int(sys.argv[2]) if len(sys.argv) > 2 else 256 + + engine = NAMEngineProcess(model, block_size) + if not engine.start(): + print('FAILED to start engine') + sys.exit(1) + + print(f'Engine loaded: static={engine.is_static}') + + # Benchmark + block = np.random.randn(block_size).astype(np.float32) * 0.1 + + # Warmup + for _ in range(10): + engine.process(block) + + # Timed + times = [] + for _ in range(500): + t0 = time.perf_counter() + engine.process(block) + times.append((time.perf_counter() - t0) * 1000) + + print(f'Avg: {np.mean(times):.3f} ms Max: {np.max(times):.3f} ms Min: {np.min(times):.3f} ms') + print(f'Engine reported avg: {engine.avg_inference_ms:.3f} ms') + + engine.stop() diff --git a/src/dsp/nam_engine_host.py b/src/dsp/nam_engine_host.py new file mode 100644 index 0000000..745fb83 --- /dev/null +++ b/src/dsp/nam_engine_host.py @@ -0,0 +1,113 @@ +"""Drop-in replacement for NAMHost using the C++ nam_engine subprocess. +Same interface as NAMHost but uses NeuralAudio C++ engine ~34x faster. +""" + +from __future__ import annotations +import logging +from pathlib import Path +from typing import Optional +from dataclasses import dataclass +import numpy as np +from .nam_engine import NAMEngineProcess + +logger = logging.getLogger(__name__) +MODELS_DIR = Path(__file__).parent.parent / "models" / "nam" + + +@dataclass +class NAMFastModel: + name: str + path: str + size_mb: float + architecture: str = "LSTM" + params_k: float = 0.0 + receptive_field: int = 0 + sample_rate: int = 48000 + compatible: bool = True + + @property + def family(self) -> str: + if self.size_mb < 0.1: return "nano" + elif self.size_mb < 1.0: return "feather" + elif self.size_mb < 4.0: return "lite" + else: return "standard" + + @property + def estimated_latency_ms(self) -> str: + return "0.05-0.2 ms (C++ NeuralAudio)" + + +class FastNAMHost: + def __init__(self, models_dir=MODELS_DIR, block_size=256): + self._models_dir = Path(models_dir) + self._block_size = block_size + self._engine = None + self._loaded_path = None + self._loaded_model = None + self._models_dir.mkdir(parents=True, exist_ok=True) + + @property + def is_loaded(self): + return self._engine is not None and self._engine.is_loaded + + @property + def current_model(self): + return self._loaded_model + + @property + def avg_inference_ms(self): + if self._engine is None: return 0.0 + return self._engine.avg_inference_ms + + def load_model(self, model_path): + path = Path(model_path) + if not path.exists() or path.suffix.lower() not in (".nam",): + logger.error("Model not found or invalid: %s", model_path) + return False + self.unload() + size_mb = path.stat().st_size / (1024 * 1024) + engine = NAMEngineProcess(str(path), self._block_size) + if not engine.start(): + logger.error("Failed to start NAM engine for: %s", model_path) + return False + self._engine = engine + self._loaded_path = str(path) + self._loaded_model = NAMFastModel( + name=path.stem, path=str(path), size_mb=size_mb + ) + logger.info( + "Loaded NAM model via C++ engine: %s (%.1f KB, static=%s)", + path.stem, size_mb * 1024, engine.is_static, + ) + return True + + def unload(self): + if self._engine is not None: + self._engine.stop() + self._engine = None + self._loaded_path = None + self._loaded_model = None + + def warm_up(self, block_size=256): + if self._engine is None or not self._engine.is_loaded: + return + dummy = np.zeros(block_size, dtype=np.float32) + for _ in range(5): + self._engine.process(dummy) + + def process(self, audio_block): + if self._engine is None or not self._engine.is_loaded: + return audio_block + return self._engine.process(audio_block) + + _crossfade_buf = None + + def apply_crossfade(self, buf): + return buf + + def list_available_models(self): + models = [] + for f in sorted(self._models_dir.glob("*.nam")): + size_mb = f.stat().st_size / (1024 * 1024) + models.append(NAMFastModel(name=f.stem, path=str(f), size_mb=size_mb)) + return models diff --git a/src/dsp/pipeline.py b/src/dsp/pipeline.py index fbfca27..8118be2 100644 --- a/src/dsp/pipeline.py +++ b/src/dsp/pipeline.py @@ -21,7 +21,7 @@ from typing import Optional import numpy as np from scipy.signal import lfilter -from .nam_host import NAMHost, NAMModel, ModelSwitchMode +from .nam_engine_host import FastNAMHost from .ir_loader import IRLoader, IRFile from ..presets.types import FXBlock, FXType, Preset @@ -290,10 +290,10 @@ class AudioPipeline: def __init__( self, - nam_host: Optional[NAMHost] = None, + nam_host: Optional[FastNAMHost] = None, ir_loader: Optional[IRLoader] = None, ): - self.nam = nam_host or NAMHost() + self.nam = nam_host or FastNAMHost() self.ir = ir_loader or IRLoader() # Signal chain — list of (FXType, enabled, bypass, params) diff --git a/src/system/audio.py b/src/system/audio.py index 93618e0..a0897d1 100644 --- a/src/system/audio.py +++ b/src/system/audio.py @@ -12,6 +12,7 @@ Manages ALSA / JACK / I2S setup on RPi 4B: from __future__ import annotations import logging +import os import re import subprocess import time @@ -276,22 +277,28 @@ class AudioSystem: return True profile = self.config.latency_profile + jack_env = os.environ.copy() + jack_env["JACK_NO_AUDIO_RESERVATION"] = "1" + # Scarlett 2i2 needs 2 channels even in mono mode + n_in = max(2, self.config.capture_channels) + n_out = max(2, self.config.playback_channels) cmd = [ "jackd", - f"-P{profile['rt_priority']}", - f"-p{profile['period']}", - f"-n{profile['nperiods']}", - f"-r{profile['rate']}", - "-dalsa", - f"-d{self.config.output_device}", - f"-i{self.config.capture_channels}", - f"-o{self.config.playback_channels}", + "-P", str(profile['rt_priority']), + "-d", "alsa", + "-d", self.config.output_device, + "-r", str(profile['rate']), + "-p", str(profile['period']), + "-n", str(profile['nperiods']), + "-i", str(n_in), + "-o", str(n_out), ] logger.info("Starting JACK: %s", " ".join(cmd)) try: proc = subprocess.Popen( cmd, + env=jack_env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) @@ -759,14 +766,24 @@ WantedBy=multi-user.target def _jack_is_running() -> bool: - """Check if JACK is running via jack_wait.""" + """Check if JACK is running via process list or PID file.""" try: result = subprocess.run( - ["jack_wait", "-c"], - capture_output=True, text=True, timeout=5, + ["pgrep", "-x", "jackd"], + capture_output=True, timeout=3, ) return result.returncode == 0 - except (FileNotFoundError, subprocess.TimeoutExpired): + except FileNotFoundError: + # pgrep not available — fall back to pidof + try: + result = subprocess.run( + ["pidof", "jackd"], + capture_output=True, timeout=3, + ) + return result.returncode == 0 + except (FileNotFoundError, subprocess.TimeoutExpired): + return False + except subprocess.TimeoutExpired: return False @@ -869,6 +886,9 @@ class JackAudioClient: self._active = True logger.info("JACK client activated (blocksize=%d)", block_size) + # Explicitly connect ports to system (JACK auto-connect is unreliable) + self._connect_ports() + def stop(self) -> None: """Deactivate and close the JACK client.""" if not self._active or self._client is None: @@ -889,6 +909,44 @@ class JackAudioClient: self._out_buf = None logger.info("JACK client stopped") + # ── Port connection helpers ────────────────────────────────── + + def _connect_ports(self) -> None: + """Explicitly connect our ports to the system physical ports. + + JACK's auto-connect is unreliable across systemd service restarts. + This ensures audio always flows even when the JACK server was + started before our client. + """ + if self._client is None: + return + + # Connect each capture port to the corresponding system capture + for i, port in enumerate(self._inports): + suffix = f"capture_{i + 1}" if self._input_channels > 1 else "capture_1" + sys_port_name = f"system:{suffix}" + try: + sys_ports = self._client.get_ports(sys_port_name) + if sys_ports: + self._client.connect(sys_ports[0], port) + logger.debug("Connected %s -> %s", sys_port_name, port.name) + except Exception as exc: + logger.warning("Failed to connect %s -> %s: %s", + sys_port_name, port.name, exc) + + # Connect each playback port to the corresponding system playback + for i, port in enumerate(self._outports): + suffix = f"playback_{i + 1}" if self._output_channels > 1 else "playback_1" + sys_port_name = f"system:{suffix}" + try: + sys_ports = self._client.get_ports(sys_port_name) + if sys_ports: + self._client.connect(port, sys_ports[0]) + logger.debug("Connected %s -> %s", port.name, sys_port_name) + except Exception as exc: + logger.warning("Failed to connect %s -> %s: %s", + port.name, sys_port_name, exc) + # ── Runtime reconfiguration ──────────────────────────────────── def set_channel_count(self, input_channels: int, output_channels: int) -> None: diff --git a/src/web/server.py b/src/web/server.py index cb97400..b1de27c 100644 --- a/src/web/server.py +++ b/src/web/server.py @@ -789,6 +789,104 @@ class WebServer: pl._master_volume = vol return {"ok": True, "volume": vol, "channel": channel} + # ── POST alias for volume (UI uses POST, server had PUT) ── + @app.post("/api/volume") + async def set_volume_post(data: dict, channel: str = "guitar"): + """Set master volume — POST alias for PUT endpoint.""" + _pm, pl, _nam, _ir = self._channel_deps(channel) + if not pl: + raise HTTPException(status_code=503) + vol = max(0.0, min(1.0, float(data.get("volume", 0.8)))) + pl._master_volume = vol + return {"ok": True, "volume": vol, "channel": channel} + + # ── Toggle bypass alias (UI calls /api/bypass/toggle) ───── + @app.post("/api/bypass/toggle") + async def toggle_bypass_alias(data: Optional[dict] = None, channel: str = "guitar"): + """Toggle or set bypass state — alias for /api/bypass.""" + _pm, pl, _nam, _ir = self._channel_deps(channel) + if not pl: + raise HTTPException(status_code=503) + if data and "bypass" in data: + pl._bypassed = bool(data["bypass"]) + else: + pl._bypassed = not pl._bypassed + await self._manager.broadcast({ + "type": "bypass_changed", + "channel": channel, + "bypass": pl._bypassed, + }) + return {"ok": True, "bypass": pl._bypassed} + + # ── Block toggle (UI: PATCH /api/blocks {id, enabled}) ── + @app.patch("/api/blocks") + async def toggle_block(data: dict, channel: str = "guitar"): + """Enable/disable a block by its fx_type id.""" + from ..presets.types import Channel + pm, pl, nam, ir = self._channel_deps(channel) + if not pm: + raise HTTPException(status_code=503) + block_id = data.get("id") + enabled = data.get("enabled") + if not block_id or enabled is None: + raise HTTPException(status_code=400, detail="Missing 'id' or 'enabled'") + try: + bank = pm.current_bank + program = pm.current_program + preset = pm.load(bank, program, channel=Channel(channel)) + for b in preset.chain: + if b.fx_type.value == block_id: + b.enabled = bool(enabled) + pm.save(preset, channel=Channel(channel)) + # Reload pipeline if needed + if pl: + pl.load_preset(preset) + return {"ok": True, "id": block_id, "enabled": b.enabled} + raise HTTPException(status_code=404, detail=f"Block '{block_id}' not found") + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + # ── Block param update (UI: PATCH /api/block {id, ...params}) ── + @app.patch("/api/block") + async def update_block_params(data: dict, channel: str = "guitar"): + """Update parameters for a block by its fx_type id.""" + from ..presets.types import Channel, FXBlock + pm, pl, nam, ir = self._channel_deps(channel) + if not pm: + raise HTTPException(status_code=503) + block_id = data.get("id") + if not block_id: + raise HTTPException(status_code=400, detail="Missing 'id'") + try: + bank = pm.current_bank + program = pm.current_program + preset = pm.load(bank, program, channel=Channel(channel)) + for b in preset.chain: + if b.fx_type.value == block_id: + # Update params from request body (skip 'id' key) + for key, val in data.items(): + if key == "id": + continue + if key in ("nam_model_path", "ir_file_path", "bypass", "enabled", "subtype"): + if key == "bypass": + b.bypass = bool(val) + elif key == "enabled": + b.enabled = bool(val) + elif key == "subtype": + b.subtype = str(val) + else: + setattr(b, key, str(val)) + else: + # Try setting as param even if not in defaults + b.params[key] = float(val) + pm.save(preset, channel=Channel(channel)) + if pl: + pl.load_preset(preset) + return {"ok": True, "id": block_id, "params": dict(b.params)} + raise HTTPException(status_code=404, detail=f"Block '{block_id}' not found") + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + # ── 4CM routing endpoints ──────────────────────────────── @app.get("/api/routing") diff --git a/src/web/ui-dist/assets/index-B-zxH4pN.css b/src/web/ui-dist/assets/index-B-zxH4pN.css new file mode 100644 index 0000000..5bacba3 --- /dev/null +++ b/src/web/ui-dist/assets/index-B-zxH4pN.css @@ -0,0 +1 @@ +*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;overflow:hidden}body{color:#f0ede6;-webkit-font-smoothing:antialiased;background:#0a0a0c;font-family:Inter,sans-serif}.mono{font-family:JetBrains Mono,monospace}.badge{letter-spacing:.06em;text-transform:uppercase;border-radius:4px;justify-content:center;align-items:center;padding:2px 7px;font-size:10px;font-weight:700;display:inline-flex}.badge-amber{color:#e8a030;background:#e8a03033}.badge-green{color:#3ab87a;background:#3ab87a33}.badge-blue{color:#3a7ba8;background:#3a7ba833}.badge-red{color:#c84040;background:#c8404033}.btn{cursor:pointer;color:#f0ede6;touch-action:manipulation;background:#1c1c22;border:1px solid #2a2a32;border-radius:6px;justify-content:center;align-items:center;gap:6px;padding:8px 16px;font-size:12px;font-weight:600;transition:all .12s;display:inline-flex}.btn:active{transform:scale(.96)}.btn-sm{padding:5px 10px;font-size:10px}.btn-ghost{background:0 0;border-color:#0000}.btn-danger{color:#c84040;background:#c8404026;border-color:#c84040}.btn-icon{cursor:pointer;touch-action:manipulation;background:#1c1c22;border:1px solid #2a2a32;border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;transition:all .12s;display:inline-flex}.btn-icon:active{transform:scale(.92)}.slide-panel{z-index:100;background:#000000b3;justify-content:center;align-items:flex-end;display:flex;position:fixed;inset:0}.slide-panel-inner{background:#0a0a0c;border-radius:16px 16px 0 0;flex-direction:column;width:100%;max-width:440px;max-height:85vh;display:flex;overflow:hidden}.slide-panel-handle{background:#2a2a32;border-radius:2px;flex-shrink:0;width:36px;height:4px;margin:8px auto}.screen-header{border-bottom:1px solid #2a2a32;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 14px 8px;display:flex}.screen-title{letter-spacing:.06em;text-transform:uppercase;color:#8888a0;font-size:13px;font-weight:600}.screen-body{flex-direction:column;flex:1;gap:12px;padding:12px;display:flex;overflow-y:auto}.snap-grid{gap:6px;padding:4px 0;display:flex;overflow-x:auto}.snap-slot{cursor:pointer;text-align:center;touch-action:manipulation;background:#1c1c22;border:1.5px solid #2a2a32;border-radius:8px;flex-shrink:0;min-width:60px;padding:8px 4px;transition:all .12s;position:relative}.snap-slot:active{transform:scale(.95)}.snap-num{color:#8888a0;font-size:16px;font-weight:700}.snap-name{color:#f0ede6;word-break:break-all;margin-top:2px;font-size:9px;line-height:1.3}.snap-empty{color:#444458;margin-top:2px;font-size:9px;font-style:italic}.snap-save-indicator{background:#3ab87a;border-radius:50%;width:6px;height:6px;position:absolute;top:4px;right:4px;box-shadow:0 0 4px #3ab87a}.snap-name-input{color:#f0ede6;text-align:center;background:#0a0a0c;border:1px solid #2a2a32;border-radius:3px;outline:none;width:100%;margin-top:2px;padding:2px 4px;font-size:9px}.preset-row{cursor:pointer;border:1px solid #0000;border-radius:8px;align-items:center;gap:12px;padding:10px 12px;transition:background .12s;display:flex}.preset-row:active,.preset-row.active{background:#e8a03014;border-color:#e8a03040}.transport-btn{cursor:pointer;background:#1c1c22;border:2px solid #2a2a32;border-radius:50%;justify-content:center;align-items:center;width:44px;height:44px;font-size:16px;transition:all .12s;display:flex}.transport-btn:active{transform:scale(.92)}.transport-btn.rec{background:#c8404026;border-color:#c84040}.transport-btn.play{background:#3ab87a26;border-color:#3ab87a}.switch{cursor:pointer;background:#2a2a32;border-radius:11px;flex-shrink:0;width:40px;height:22px;transition:background .2s;position:relative}.switch.on{background:#3ab87a}.switch:after{content:"";background:#fff;border-radius:50%;width:18px;height:18px;transition:transform .15s;position:absolute;top:2px;left:2px}.switch.on:after{transform:translate(18px)}.search-bar{background:#1c1c22;border:1px solid #2a2a32;border-radius:7px;align-items:center;gap:8px;padding:8px 12px;display:flex}.search-bar input{color:#f0ede6;background:0 0;border:none;outline:none;flex:1;font-size:13px}.search-bar input::placeholder{color:#444458}.file-drop{text-align:center;cursor:pointer;color:#444458;border:2px dashed #2a2a32;border-radius:8px;padding:20px;font-size:13px;transition:all .15s}.file-drop:hover,.file-drop.dragover{color:#e8a030;border-color:#e8a030}.loader{border:2px solid #2a2a32;border-top-color:#e8a030;border-radius:50%;width:20px;height:20px;animation:.6s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.setting-row{border-bottom:1px solid #2a2a32;justify-content:space-between;align-items:center;padding:10px 0;display:flex}.setting-label{color:#f0ede6;font-size:13px}.setting-desc{color:#444458;margin-top:2px;font-size:11px}.section-label{letter-spacing:.1em;text-transform:uppercase;color:#444458;margin-bottom:10px;font-size:10px;font-weight:600}.nam-chip{color:#3a7ba8;background:#3a7ba826;border:1px solid #3a7ba859;border-radius:5px;align-items:center;gap:6px;padding:5px 10px;font-family:JetBrains Mono,monospace;font-size:11px;display:inline-flex}.bypass-led{border-radius:50%;flex-shrink:0;width:8px;height:8px}.led-on{background:#3ab87a;box-shadow:0 0 8px #3ab87a}.led-off{background:#444458} diff --git a/src/web/ui-dist/assets/index-B7j_x4LZ.js b/src/web/ui-dist/assets/index-B7j_x4LZ.js new file mode 100644 index 0000000..2e86ead --- /dev/null +++ b/src/web/ui-dist/assets/index-B7j_x4LZ.js @@ -0,0 +1,100 @@ +var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},ee=Object.prototype.hasOwnProperty;function T(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function te(e,t){return T(e.type,t,e.props)}function ne(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function re(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ie=/\/+/g;function ae(e,t){return typeof e==`object`&&e&&e.key!=null?re(``+e.key):t.toString(36)}function oe(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function se(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,se(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+ae(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ie,`$&/`)+`/`),se(o,r,i,``,function(e){return e})):o!=null&&(ne(o)&&(o=te(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ie,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,ne());else{var t=n(l);t!==null&&ae(x,t.startTime-e)}}var S=!1,C=-1,w=5,ee=-1;function T(){return g?!0:!(e.unstable_now()-eet&&T());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&ae(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ne():S=!1}}}var ne;if(typeof y==`function`)ne=function(){y(te)};else if(typeof MessageChannel<`u`){var re=new MessageChannel,ie=re.port2;re.port1.onmessage=te,ne=function(){ie.postMessage(null)}}else ne=function(){_(te,0)};function ae(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,ae(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,ne()))),r},e.unstable_shouldYield=T,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1de||(e.current=ue[de],ue[de]=null,de--)}function A(e,t){de++,ue[de]=e.current,e.current=t}var pe=fe(null),me=fe(null),he=fe(null),j=fe(null);function ge(e,t){switch(A(he,t),A(me,e),A(pe,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}k(pe),A(pe,e)}function _e(){k(pe),k(me),k(he)}function ve(e){e.memoizedState!==null&&A(j,e);var t=pe.current,n=Hd(t,e.type);t!==n&&(A(me,e),A(pe,n))}function ye(e){me.current===e&&(k(pe),k(me)),j.current===e&&(k(j),Qf._currentValue=O)}var be,xe;function Se(e){if(be===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);be=t&&t[1]||``,xe=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ce=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Se(n):``}function Te(e,t){switch(e.tag){case 26:case 27:case 5:return Se(e.type);case 16:return Se(`Lazy`);case 13:return e.child!==t&&t!==null?Se(`Suspense Fallback`):Se(`Suspense`);case 19:return Se(`SuspenseList`);case 0:case 15:return we(e.type,!1);case 11:return we(e.type.render,!1);case 1:return we(e.type,!0);case 31:return Se(`Activity`);default:return``}}function M(e){try{var t=``,n=null;do t+=Te(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var Ee=Object.prototype.hasOwnProperty,De=t.unstable_scheduleCallback,Oe=t.unstable_cancelCallback,ke=t.unstable_shouldYield,Ae=t.unstable_requestPaint,je=t.unstable_now,Me=t.unstable_getCurrentPriorityLevel,Ne=t.unstable_ImmediatePriority,Pe=t.unstable_UserBlockingPriority,Fe=t.unstable_NormalPriority,Ie=t.unstable_LowPriority,Le=t.unstable_IdlePriority,Re=t.log,ze=t.unstable_setDisableYieldValue,Be=null,N=null;function Ve(e){if(typeof Re==`function`&&ze(e),N&&typeof N.setStrictMode==`function`)try{N.setStrictMode(Be,e)}catch{}}var He=Math.clz32?Math.clz32:Ge,Ue=Math.log,We=Math.LN2;function Ge(e){return e>>>=0,e===0?32:31-(Ue(e)/We|0)|0}var Ke=256,P=262144,qe=4194304;function Je(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ye(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Je(n))):i=Je(o):i=Je(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Je(n))):i=Je(o)):i=Je(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Xe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function F(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ze(){var e=qe;return qe<<=1,!(qe&62914560)&&(qe=4194304),e}function Qe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $e(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function et(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),ln=!1;if(cn)try{var un={};Object.defineProperty(un,"passive",{get:function(){ln=!0}}),window.addEventListener(`test`,un,un),window.removeEventListener(`test`,un,un)}catch{ln=!1}var dn=null,fn=null,pn=null;function mn(){if(pn)return pn;var e,t=fn,n=t.length,r,i=`value`in dn?dn.value:dn.textContent,a=i.length;for(e=0;e=Kn),Yn=` `,Xn=!1;function Zn(e,t){switch(e){case`keyup`:return Wn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Qn(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var $n=!1;function er(e,t){switch(e){case`compositionend`:return Qn(t);case`keypress`:return t.which===32?(Xn=!0,Yn):null;case`textInput`:return e=t.data,e===Yn&&Xn?null:e;default:return null}}function tr(e,t){if($n)return e===`compositionend`||!Gn&&Zn(e,t)?(e=mn(),pn=fn=dn=null,$n=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Cr(n)}}function Tr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Tr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Er(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Ft(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ft(e.document)}return t}function Dr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Or=cn&&`documentMode`in document&&11>=document.documentMode,kr=null,Ar=null,jr=null,Mr=!1;function Nr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Mr||kr==null||kr!==Ft(r)||(r=kr,`selectionStart`in r&&Dr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),jr&&Sr(jr,r)||(jr=r,r=Ed(Ar,`onSelect`),0>=o,i-=o,Ti=1<<32-He(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),V&&Di(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),V&&Di(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return V&&Di(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),V&&Di(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ne&&Ea(l)===r.type){n(e,r.sibling),c=i(r,a.props),Na(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=fi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=di(a.type,a.key,a.props,null,e.mode,c),Na(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=hi(a,e.mode,c),c.return=e,e=c}return o(e);case ne:return a=Ea(a),b(e,r,a,c)}if(le(a))return h(e,r,a,c);if(oe(a)){if(l=oe(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,Ma(a),c);if(a.$$typeof===C)return b(e,r,ea(e,a),c);Pa(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=pi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{ja=0;var i=b(e,t,n,r);return Aa=null,i}catch(t){if(t===ba||t===Sa)throw t;var a=si(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ia=Fa(!0),La=Fa(!1),Ra=!1;function za(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ba(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Va(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ha(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,K&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ii(e),ri(e,null,n),t}return ei(e,r,t,n),ii(e)}function Ua(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}function Wa(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ga=!1;function Ka(){if(Ga){var e=da;if(e!==null)throw e}}function qa(e,t,n,r){Ga=!1;var i=e.updateQueue;Ra=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(Y&f)===f:(r&f)===f){f!==0&&f===ua&&(Ga=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ra=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Ja(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function Ya(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=E.T,s={};E.T=s,Ps(e,!1,t,n);try{var c=i(),l=E.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ns(e,t,ma(c,r),pu(e)):Ns(e,t,r,pu(e))}catch(n){Ns(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{D.p=a,o!==null&&s.types!==null&&(o.types=s.types),E.T=o}}function Cs(){}function ws(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=Ts(e).queue;Ss(e,i,t,O,n===null?Cs:function(){return Es(e),n(r)})}function Ts(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:O,baseState:O,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Fo,lastRenderedState:O},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Fo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Es(e){var t=Ts(e);t.next===null&&(t=e.alternate.memoizedState),Ns(e,t.next.queue,{},pu())}function Ds(){return $i(Qf)}function Os(){return Ao().memoizedState}function ks(){return Ao().memoizedState}function As(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Va(n);var r=Ha(t,e,n);r!==null&&(hu(r,t,n),Ua(r,t,n)),t={cache:oa()},e.payload=t;return}t=t.return}}function js(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Fs(e)?Is(t,n):(n=ti(e,t,n,r),n!==null&&(hu(n,e,r),Ls(n,t,r)))}function Ms(e,t,n){Ns(e,t,n,pu())}function Ns(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Fs(e))Is(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,xr(s,o))return ei(e,t,i,0),q===null&&$r(),!1}catch{}if(n=ti(e,t,i,r),n!==null)return hu(n,e,r),Ls(n,t,r),!0}return!1}function Ps(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Fs(e)){if(t)throw Error(s(479))}else t=ti(e,n,r,2),t!==null&&hu(t,e,2)}function Fs(e){var t=e.alternate;return e===H||t!==null&&t===H}function Is(e,t){mo=po=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ls(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}var Rs={readContext:$i,use:No,useCallback:bo,useContext:bo,useEffect:bo,useImperativeHandle:bo,useLayoutEffect:bo,useInsertionEffect:bo,useMemo:bo,useReducer:bo,useRef:bo,useState:bo,useDebugValue:bo,useDeferredValue:bo,useTransition:bo,useSyncExternalStore:bo,useId:bo,useHostTransitionStatus:bo,useFormState:bo,useActionState:bo,useOptimistic:bo,useMemoCache:bo,useCacheRefresh:bo};Rs.useEffectEvent=bo;var zs={readContext:$i,use:No,useCallback:function(e,t){return ko().memoizedState=[e,t===void 0?null:t],e},useContext:$i,useEffect:ls,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ss(4194308,4,hs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ss(4194308,4,e,t)},useInsertionEffect:function(e,t){ss(4,2,e,t)},useMemo:function(e,t){var n=ko();t=t===void 0?null:t;var r=e();if(ho){Ve(!0);try{e()}finally{Ve(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ko();if(n!==void 0){var i=n(t);if(ho){Ve(!0);try{n(t)}finally{Ve(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=js.bind(null,H,e),[r.memoizedState,e]},useRef:function(e){var t=ko();return e={current:e},t.memoizedState=e},useState:function(e){e=Go(e);var t=e.queue,n=Ms.bind(null,H,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:_s,useDeferredValue:function(e,t){return bs(ko(),e,t)},useTransition:function(){var e=Go(!1);return e=Ss.bind(null,H,e.queue,!0,!1),ko().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=H,i=ko();if(V){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),q===null)throw Error(s(349));Y&127||Bo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,ls(Ho.bind(null,r,a,e),[e]),r.flags|=2048,as(9,{destroy:void 0},Vo.bind(null,r,a,n,t),null),n},useId:function(){var e=ko(),t=q.identifierPrefix;if(V){var n=Ei,r=Ti;n=(r&~(1<<32-He(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=go++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[L]=t,a[R]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Nc(t)}}return W(t),Pc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Nc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=he.current,zi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Mi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[L]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Ii(t,!0)}else e=Bd(e).createTextNode(r),e[L]=t,t.stateNode=e}return W(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=zi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[L]=t}else Bi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;W(t),e=!1}else n=Vi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(so(t),t):(so(t),null);if(t.flags&128)throw Error(s(558))}return W(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=zi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[L]=t}else Bi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;W(t),i=!1}else i=Vi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(so(t),t):(so(t),null)}return so(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Ic(t,t.updateQueue),W(t),null);case 4:return _e(),e===null&&Sd(t.stateNode.containerInfo),W(t),null;case 10:return qi(t.type),W(t),null;case 19:if(k(co),r=t.memoizedState,r===null)return W(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)Lc(r,!1);else{if(Wl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=lo(e),a!==null){for(t.flags|=128,Lc(r,!1),e=a.updateQueue,t.updateQueue=e,Ic(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ui(n,e),n=n.sibling;return A(co,co.current&1|2),V&&Di(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&je()>tu&&(t.flags|=128,i=!0,Lc(r,!1),t.lanes=4194304)}else{if(!i)if(e=lo(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Ic(t,e),Lc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!V)return W(t),null}else 2*je()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,Lc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(W(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=je(),e.sibling=null,n=co.current,A(co,i?n&1|2:n&1),V&&Di(t,r.treeForkCount),e);case 22:case 23:return so(t),eo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(W(t),t.subtreeFlags&6&&(t.flags|=8192)):W(t),n=t.updateQueue,n!==null&&Ic(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&k(ga),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),qi(aa),W(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function zc(e,t){switch(Ai(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return qi(aa),_e(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ye(t),null;case 31:if(t.memoizedState!==null){if(so(t),t.alternate===null)throw Error(s(340));Bi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(so(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Bi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return k(co),null;case 4:return _e(),null;case 10:return qi(t.type),null;case 22:case 23:return so(t),eo(),e!==null&&k(ga),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return qi(aa),null;case 25:return null;default:return null}}function Bc(e,t){switch(Ai(t),t.tag){case 3:qi(aa),_e();break;case 26:case 27:case 5:ye(t);break;case 4:_e();break;case 31:t.memoizedState!==null&&so(t);break;case 13:so(t);break;case 19:k(co);break;case 10:qi(t.type);break;case 22:case 23:so(t),eo(),e!==null&&k(ga);break;case 24:qi(aa)}}function Vc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Hc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Uc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Ya(t,n)}catch(t){Z(e,e.return,t)}}}function Wc(e,t,n){n.props=Ks(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Gc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Kc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function qc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Jc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[R]=t}catch(t){Z(e,e.return,t)}}function Yc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Xc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Yc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Zc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Qt));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Zc(e,t,n),e=e.sibling;e!==null;)Zc(e,t,n),e=e.sibling}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[L]=e,t[R]=n}catch(t){Z(e,e.return,t)}}var el=!1,tl=!1,nl=!1,rl=typeof WeakSet==`function`?WeakSet:Set,il=null;function al(e,t){if(e=e.containerInfo,Rd=sp,e=Er(e),Dr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,il=t;il!==null;)if(t=il,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,il=e;else for(;il!==null;){switch(t=il,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[L]=e,vt(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=wr(s,h),v=wr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,E.T=null,n=lu,lu=null;var a=au,o=su;if(iu=0,ou=au=null,su=0,K&6)throw Error(s(331));var c=K;if(K|=4,Pl(a.current),El(a,a.current,o,n),K=c,id(0,!1),N&&typeof N.onPostCommitFiberRoot==`function`)try{N.onPostCommitFiberRoot(Be,a)}catch{}return!0}finally{D.p=i,E.T=r,Vu(e,t)}}function Wu(e,t,n){t=_i(n,t),t=Qs(e.stateNode,t,2),e=Ha(e,t,2),e!==null&&($e(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=_i(n,e),n=$s(2),r=Ha(t,n,2),r!==null&&(ec(n,r,t,e),$e(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Rl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Hl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,q===e&&(Y&n)===n&&(Wl===4||Wl===3&&(Y&62914560)===Y&&300>je()-$l?!(K&2)&&Su(e,0):ql|=n,Yl===Y&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Ze()),e=ni(e,t),e!==null&&($e(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return De(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-He(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=Y,a=Ye(r,r===q?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Xe(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=je(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Lt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),vt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Lt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Lt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Lt(n.imageSizes)+`"]`)):i+=`[href="`+Lt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),vt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Lt(r)+`"][href="`+Lt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),vt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=_t(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);vt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=_t(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),vt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=_t(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),vt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=he.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=_t(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=_t(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=_t(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+Lt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),vt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Lt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Lt(n.href)+`"]`);if(r)return t.instance=r,vt(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),vt(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,vt(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),vt(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,vt(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),vt(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,vt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),vt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),f=e(((e,t)=>{t.exports=d()}))(),p={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},m=`#40C8A0`,h=[{key:`level`,label:`Level`,min:0,max:100,def:80},{key:`maxTime`,label:`Max Time`,type:`select`,options:[{value:4,label:`4 sec`},{value:8,label:`8 sec`},{value:16,label:`16 sec`},{value:32,label:`32 sec`}],def:8},{key:`fade`,label:`Fade`,min:0,max:100,def:30},{key:`sync`,label:`Sync`,type:`select`,options:[{value:`off`,label:`Off`},{value:`1bar`,label:`1 Bar`},{value:`2bar`,label:`2 Bars`},{value:`4bar`,label:`4 Bars`}],def:`off`}];function g(){let[e,t]=(0,l.useState)({}),n=(0,l.useRef)({}),r=(0,l.useRef)(e);r.current=e;let i=(0,l.useCallback)(e=>r.current[e]||{status:`stopped`,elapsed:0,maxDuration:8,layers:0},[]),a=(0,l.useCallback)(e=>{n.current[e]&&(clearInterval(n.current[e]),delete n.current[e])},[]),o=(0,l.useCallback)((e,r)=>{a(e),n.current[e]=setInterval(()=>{t(t=>{let n=t[e];if(!n||n.status===`stopped`)return t;let i=+(n.elapsed+.1).toFixed(1);return i>=r?n.status===`recording`?{...t,[e]:{...n,status:`playing`,elapsed:0,layers:n.layers+1}}:{...t,[e]:{...n,elapsed:0}}:{...t,[e]:{...n,elapsed:i}}})},100)},[a]),s=(0,l.useCallback)((e,n)=>{let r=i(e);r.status!==`recording`&&(a(e),t(t=>({...t,[e]:{...r,status:`recording`,elapsed:0,maxDuration:n}})),o(e,n))},[i,a,o]),c=(0,l.useCallback)((e,n)=>{let r=i(e);if(r.layers===0){s(e,n);return}a(e),t(t=>({...t,[e]:{...r,status:`playing`}})),o(e,n)},[i,a,o,s]),u=(0,l.useCallback)((e,n)=>{let r=i(e);if(r.layers===0){s(e,n);return}a(e),t(t=>({...t,[e]:{...r,status:`overdubbing`}})),o(e,n)},[i,a,o,s]),d=(0,l.useCallback)(e=>{a(e);let n=i(e);t(t=>({...t,[e]:{...n,status:`stopped`,elapsed:0}}))},[a,i]),f=(0,l.useCallback)(e=>{a(e),t(t=>{let n={...t};return delete n[e],n})},[a]),p=(0,l.useCallback)(e=>{let n=i(e);if(n.layers<=0)return;let r=n.layers-1;r===0?(a(e),t(t=>({...t,[e]:{...n,layers:0,status:`stopped`,elapsed:0}}))):t(t=>({...t,[e]:{...n,layers:r}}))},[i,a]);return(0,l.useEffect)(()=>()=>{Object.values(n.current).forEach(clearInterval)},[]),{stores:e,getStore:i,record:s,play:c,overdub:u,stop:d,clearLoop:f,undoLast:p}}var _=e=>{let t=Math.floor(e/60),n=Math.floor(e%60);return`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}`};function v({block:e,selected:t,onSelect:n,onToggle:r,looperStore:i,onModelBrowser:a}){let o=i||{status:`stopped`,elapsed:0,maxDuration:8,layers:0},s=!e.bypassed,{status:c,elapsed:u,maxDuration:d,layers:h}=o,g=c===`recording`?p.red:c===`playing`?p.green:c===`overdubbing`?p.amber:p.textDim,v=c===`recording`?`REC`:c===`playing`?`PLAY`:c===`overdubbing`?`OVDB`:`STOP`,y=c===`recording`||c===`overdubbing`,b=(0,l.useRef)(null),x=(0,l.useCallback)(()=>{b.current=setTimeout(()=>{b.current=null,a?.(e.id)},500)},[e.id,a]),S=(0,l.useCallback)(()=>{b.current&&=(clearTimeout(b.current),null)},[]);return(0,f.jsxs)(`div`,{draggable:!0,onClick:()=>n(e.id),onTouchStart:x,onTouchEnd:S,onTouchMove:S,onMouseDown:S,onMouseUp:S,style:{minWidth:150,width:150,height:100,borderRadius:8,background:`linear-gradient(135deg, #142020, ${p.panel})`,border:`2px solid ${t?p.amber:m}60`,opacity:s?1:.35,cursor:`pointer`,display:`flex`,flexDirection:`column`,position:`relative`,overflow:`hidden`,transition:`all .15s ease`,flexShrink:0,boxShadow:t?`0 0 16px ${p.amber}44, inset 0 0 0 1px ${p.amber}22`:`none`,transform:t?`scale(1.05)`:`scale(1)`},children:[(0,f.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,height:3,background:`linear-gradient(90deg, ${m}, #80D0A0)`,boxShadow:s?`0 0 6px ${m}`:`none`}}),(0,f.jsx)(`div`,{style:{position:`absolute`,top:5,left:5,fontSize:9,color:p.textDim,letterSpacing:1.5,lineHeight:1,cursor:`grab`,opacity:.5},children:`⋮⋮`}),(0,f.jsx)(`div`,{onClick:t=>{t.stopPropagation(),r(e.id)},style:{position:`absolute`,top:6,right:6,width:10,height:10,borderRadius:`50%`,background:s?p.green:p.textDim,boxShadow:s?`0 0 8px ${p.green}`:`none`,transition:`all .15s`,cursor:`pointer`,zIndex:2,border:`1px solid ${s?`${p.green}88`:p.border}`},title:s?`Active`:`Bypassed`}),(0,f.jsxs)(`div`,{style:{flex:1,padding:`18px 8px 4px`,display:`flex`,flexDirection:`column`,justifyContent:`center`},children:[(0,f.jsxs)(`div`,{style:{fontSize:10,fontWeight:700,color:m,letterSpacing:`.06em`,textTransform:`uppercase`,display:`flex`,alignItems:`center`,gap:5},children:[(0,f.jsx)(`span`,{style:{fontSize:12},children:`◉`}),(0,f.jsx)(`span`,{children:`LOOPER`})]}),(0,f.jsxs)(`div`,{className:`mono`,style:{fontSize:17,fontWeight:800,color:g,marginTop:3,letterSpacing:`.06em`,textShadow:y?`0 0 8px ${g}66`:`none`},children:[_(u),(0,f.jsxs)(`span`,{style:{fontSize:11,color:p.textDim,fontWeight:500},children:[`/`,_(d)]})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,marginTop:1},children:[(0,f.jsx)(`span`,{style:{fontSize:8,fontWeight:800,letterSpacing:`.1em`,color:g,textTransform:`uppercase`,background:`${g}18`,padding:`1px 5px`,borderRadius:3},children:v}),h>0&&(0,f.jsxs)(`span`,{style:{fontSize:8,color:p.textSec},children:[h,`L`]})]})]})]})}function y({store:e,onRecord:t,onPlay:n,onOverdub:r,onStop:i,onClear:a,onUndo:o}){let{status:s,layers:c}=e,l=e=>({width:44,height:44,borderRadius:`50%`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:16,cursor:`pointer`,border:`2px solid`,transition:`all .12s`,touchAction:`manipulation`,flexShrink:0,...e});return(0,f.jsxs)(`div`,{style:{display:`flex`,gap:6,justifyContent:`center`,alignItems:`center`,padding:`6px 0`},children:[(0,f.jsx)(`div`,{onClick:t,style:l({borderColor:s===`recording`?p.red:p.border,background:s===`recording`?`rgba(200,64,64,.2)`:p.surface,color:p.red,animation:s===`recording`?`looperPulse 0.8s ease-in-out infinite`:`none`}),title:`Record`,children:`●`}),(0,f.jsx)(`div`,{onClick:n,style:l({borderColor:s===`playing`?p.green:p.border,background:s===`playing`?`rgba(58,184,122,.2)`:p.surface,color:p.green}),title:`Play`,children:`▶`}),(0,f.jsx)(`div`,{onClick:r,style:l({borderColor:s===`overdubbing`?p.amber:p.border,background:s===`overdubbing`?`rgba(232,160,48,.2)`:p.surface,color:p.amber,opacity:c>0?1:.3}),title:`Overdub`,children:`⏺`}),(0,f.jsx)(`div`,{onClick:i,style:{...l({}),width:36,height:36,fontSize:13,borderColor:p.border,background:p.surface,color:p.textPrimary},title:`Stop`,children:`■`}),(0,f.jsx)(`div`,{onClick:a,style:{...l({}),width:32,height:32,fontSize:11,borderColor:p.border,background:p.surface,color:p.red,opacity:s!==`stopped`||c>0?1:.3},title:`Clear`,children:`✕`}),(0,f.jsx)(`div`,{onClick:o,style:{...l({}),width:32,height:32,fontSize:13,borderColor:p.border,background:p.surface,color:p.amber,opacity:c>0?1:.3},title:`Undo last layer`,children:`↩`})]})}function b({block:e,params:t,looperStore:n,onParamChange:r,onParamChangeEnd:i,looperActions:a}){let o=m;return(0,f.jsxs)(`div`,{className:`param-panel`,children:[(0,f.jsx)(`div`,{className:`param-panel-header`,children:(0,f.jsxs)(`span`,{className:`param-panel-title`,children:[(0,f.jsx)(`span`,{style:{color:o},children:`●`}),` Looper`]})}),a&&(0,f.jsx)(`div`,{style:{background:`${p.panel}`,borderRadius:8,marginBottom:6,border:`1px solid ${p.border}`},children:(0,f.jsx)(y,{store:n,...a})}),n&&(n.status!==`stopped`||n.layers>0)&&(0,f.jsxs)(`div`,{style:{display:`flex`,gap:10,padding:`4px 0 8px`,justifyContent:`center`,fontSize:10,color:p.textSec,borderBottom:`1px solid ${p.border}`,marginBottom:6},children:[(0,f.jsxs)(`span`,{children:[`Status: `,(0,f.jsx)(`strong`,{style:{color:n.status===`recording`?p.red:n.status===`playing`?p.green:n.status===`overdubbing`?p.amber:p.textDim},children:n.status.toUpperCase()})]}),(0,f.jsxs)(`span`,{children:[`Layers: `,(0,f.jsx)(`strong`,{children:n.layers})]}),(0,f.jsxs)(`span`,{children:[`Time: `,(0,f.jsx)(`strong`,{children:`${_(n.elapsed)} / ${_(n.maxDuration)}`})]})]}),h.filter(e=>!e.conditional||e.conditional(t)).map(e=>e.type===`select`?(0,f.jsxs)(`div`,{className:`param-row`,children:[(0,f.jsx)(`div`,{className:`param-header`,children:(0,f.jsx)(`span`,{className:`param-label`,style:{color:o},children:e.label})}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,flexWrap:`wrap`,background:`#0A0A10`,borderRadius:6,padding:4},children:(e.options||[]).map(n=>(0,f.jsx)(`button`,{onClick:()=>{r?.(e.key,n.value),i?.(e.key,n.value)},style:{flex:1,padding:`5px 8px`,borderRadius:4,border:`none`,fontSize:10,fontWeight:600,cursor:`pointer`,background:(t[e.key]==null?e.def:t[e.key])===n.value?o:`transparent`,color:(t[e.key]==null?e.def:t[e.key])===n.value?`#000`:p.textSec,transition:`all .1s`,letterSpacing:`.03em`,whiteSpace:`nowrap`},children:n.label},n.value))})]},e.key):(0,f.jsxs)(`div`,{className:`param-row`,children:[(0,f.jsxs)(`div`,{className:`param-header`,children:[(0,f.jsx)(`span`,{className:`param-label`,style:{color:o},children:e.label}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:4,alignItems:`center`},children:[(0,f.jsx)(`button`,{className:`param-btn`,onMouseDown:n=>{n.preventDefault();let a=Math.max(e.min,((t[e.key]==null?e.def:t[e.key])||0)-5);r?.(e.key,a),i?.(e.key,a)},onTouchStart:n=>{n.preventDefault();let a=Math.max(e.min,((t[e.key]==null?e.def:t[e.key])||0)-5);r?.(e.key,a),i?.(e.key,a)},children:`−`}),(0,f.jsx)(`span`,{className:`param-val`,style:{color:o},children:t[e.key]==null?e.def:t[e.key]}),(0,f.jsx)(`button`,{className:`param-btn`,onMouseDown:n=>{n.preventDefault();let a=Math.min(e.max,((t[e.key]==null?e.def:t[e.key])||0)+5);r?.(e.key,a),i?.(e.key,a)},onTouchStart:n=>{n.preventDefault();let a=Math.min(e.max,((t[e.key]==null?e.def:t[e.key])||0)+5);r?.(e.key,a),i?.(e.key,a)},children:`+`})]})]}),(0,f.jsx)(`div`,{className:`param-track-wrap`,onMouseDown:t=>{t.preventDefault();let n=t.currentTarget.getBoundingClientRect(),a=Math.max(0,Math.min(1,(t.clientX-n.left)/n.width)),o=Math.round(e.min+a*(e.max-e.min));r?.(e.key,o),i?.(e.key,o)},onTouchStart:t=>{let n=t.currentTarget.getBoundingClientRect(),a=Math.max(0,Math.min(1,(t.touches[0].clientX-n.left)/n.width)),o=Math.round(e.min+a*(e.max-e.min));r?.(e.key,o),i?.(e.key,o)},children:(0,f.jsxs)(`div`,{className:`param-track`,children:[(0,f.jsx)(`div`,{className:`param-fill`,style:{width:`${((t[e.key]==null?e.def:t[e.key])-e.min)/(e.max-e.min)*100}%`,background:o}}),(0,f.jsx)(`div`,{className:`param-thumb`,style:{left:`${((t[e.key]==null?e.def:t[e.key])-e.min)/(e.max-e.min)*100}%`,background:o}})]})})]},e.key))]})}var x=` +@keyframes looperPulse { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.5; transform: scale(0.95); } +} +`,S={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},C={y:{label:`Y`,desc:`Split evenly`,icon:`⬡`},ab:{label:`A/B`,desc:`Route all to A or B`,icon:`⇄`},cascade:{label:`Cascade`,desc:`A feeds into B`,icon:`⇢`},a_to_b:{label:`A→B`,desc:`Serial path extension`,icon:`↷`}},w={od:S.amber,overdrive:S.amber,drive:S.amber,dist:S.red,distortion:S.red,fuzz:`#D060E0`,mod:S.blue,chorus:S.blue,flange:S.blue,phaser:S.blue,tremolo:S.blue,vibrato:S.blue,rotary:S.blue,delay:`#60A0E0`,echo:`#60A0E0`,reverb:`#60C0D0`,pitch:`#A060E0`,comp:S.green,compressor:S.green,gate:S.green,filter:`#D0A060`,wah:`#D0A060`,eq:`#80A0B0`,ir:S.green,cab:S.green,nam:`#E0A040`,volume:S.textSec,boost:S.amber,split:`#B080C0`,merge:`#80B0C0`},ee={reverb:{hall:`Hall`,spring:`Spring`,plate:`Plate`,room:`Room`},delay:{digital:`Digital`,analog:`Analog`,tape:`Tape`},echo:{digital:`Digital`,analog:`Analog`,tape:`Tape`},overdrive:{ts808:`TS-808`,klon:`Klon`,bd2:`BD-2`},distortion:{rat:`RAT`,ds1:`DS-1`,muff:`Muff`},fuzz:{fuzzface:`Fuzz Face`,muff:`Muff`,tonebender:`Tone Bender`},chorus:{ce1:`CE-1`,ce2:`CE-2`,dc2:`DC-2`},flanger:{electric:`Electric Mistress`,ada:`ADA Flanger`},phaser:{phase90:`Phase 90`,phase100:`Phase 100`,smallstone:`Small Stone`}};function T(e,t){return ee[(e||``).toLowerCase()]?.[t]||t||``}var te={od:`fx_distortion`,overdrive:`fx_distortion`,drive:`fx_distortion`,dist:`fx_distortion`,distortion:`fx_distortion`,gain:`fx_distortion`,fuzz:`fx_distortion`,delay:`fx_delay`,echo:`fx_delay`,reverb:`fx_reverb`,chorus:`fx_chorus`,flange:`fx_flanger`,flanger:`fx_flanger`,phaser:`fx_phaser`,tremolo:`fx_modulator`,vibrato:`fx_modulator`,rotary:`fx_modulator`,modulator:`fx_modulator`,pitch:`fx_pitch`,harmonizer:`fx_pitch`,shifter:`fx_pitch`,comp:`fx_compressor`,compressor:`fx_compressor`,limiter:`fx_limiter`,gate:`fx_gate`,noise_gate:`fx_gate`,filter:`fx_filter`,wah:`fx_filter`,eq:`fx_eq`,graphic_eq:`fx_eq`,parametric_eq:`fx_parametric_eq`,multiband_eq:`fx_multiband_eq`,ir:`fx_spatial`,cab:`fx_spatial`,cabinet:`fx_spatial`,nam:`fx_simulator`,capture:`fx_simulator`,amp:`fx_amplifier`,amplifier:`fx_amplifier`,volume:`fx_constant`,level:`fx_constant`,boost:`fx_constant`,split:`fx_split_a`,merge:`fx_mixer`,tuner:`fx_analyzer`,mixer:`fx_mixer`,utility:`fx_utility`,plugin:`fx_plugin`,instrument:`fx_instrument`,reamp:`fx_converter`,looper:`fx_oscillator`},ne=`/ui/img/`;function re({type:e,size:t=14,style:n={}}){let r=(e||``).toLowerCase().trim(),i=`fx_plugin`,a=!1;for(let[e,t]of Object.entries(te))if(r===e||r.startsWith(e)||r.includes(e)){i=t,a=!0;break}if(!a&&r){let e=r.replace(/[^a-z0-9]+/g,`_`).replace(/^_|_$/g,``);te[e]&&(i=te[e])}return(0,f.jsx)(`img`,{src:`${ne}${i}.svg`,alt:e||`fx`,style:{width:t,height:t,flexShrink:0,filter:`invert(0.95) brightness(2)`,objectFit:`contain`,...n},onError:e=>{e.target.style.display=`none`}})}function ie(e){let t=(e||``).toLowerCase().trim();for(let[e,n]of Object.entries(w))if(t===e||t.startsWith(e)||t.includes(e))return n;return S.amber}function ae({color:e=S.border,narrow:t=!1}){let n=t?14:18;return(0,f.jsxs)(`svg`,{width:n,height:`24`,viewBox:`0 0 ${n} 24`,fill:`none`,style:{flexShrink:0},children:[(0,f.jsx)(`line`,{x1:`0`,y1:`12`,x2:n-6,y2:`12`,stroke:e,strokeWidth:`2`,strokeLinecap:`round`}),(0,f.jsx)(`polyline`,{points:`${n-10},7 ${n-4},12 ${n-10},17`,fill:`none`,stroke:e,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function oe({label:e,isLeft:t}){return(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexShrink:0,flexDirection:t?`row`:`row-reverse`},children:[!t&&(0,f.jsx)(ae,{}),(0,f.jsx)(`div`,{style:{padding:`7px 12px`,borderRadius:6,fontSize:10,fontWeight:700,letterSpacing:`.12em`,background:S.blueDim,color:S.blue,border:`1px solid ${S.blue}60`,textTransform:`uppercase`,whiteSpace:`nowrap`},children:e}),t&&(0,f.jsx)(ae,{})]})}function se({block:e,selected:t,onSelect:n,onToggle:r,onModelBrowser:i}){let a=e.params||{},o=a.splitType||`y`,s=C[o]||C.y,c=!e.bypassed,u=ie(`split`),d=(0,l.useRef)(null),p=(0,l.useCallback)(()=>{d.current=setTimeout(()=>{d.current=null,i?.(e.id)},500)},[e.id,i]),m=(0,l.useCallback)(()=>{d.current&&=(clearTimeout(d.current),null)},[]);return(0,f.jsxs)(`div`,{draggable:!0,onClick:()=>n(e.id),onTouchStart:p,onTouchEnd:m,onTouchMove:m,onMouseDown:m,onMouseUp:m,style:{minWidth:130,width:130,height:76,borderRadius:8,background:`linear-gradient(135deg, ${S.panel}, #1A1520)`,border:`2px solid ${t?S.amber:u}60`,opacity:c?1:.35,cursor:`pointer`,display:`flex`,flexDirection:`column`,position:`relative`,overflow:`hidden`,transition:`all .15s ease`,flexShrink:0,boxShadow:t?`0 0 16px ${S.amber}44, inset 0 0 0 1px ${S.amber}22`:`none`,transform:t?`scale(1.05)`:`scale(1)`},children:[(0,f.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,height:3,background:`linear-gradient(90deg, #B080C0, #80B0C0)`}}),(0,f.jsx)(`div`,{onClick:t=>{t.stopPropagation(),r(e.id)},style:{position:`absolute`,top:6,right:6,width:10,height:10,borderRadius:`50%`,background:c?S.green:S.textDim,boxShadow:c?`0 0 8px ${S.green}`:`none`,transition:`all .15s`,cursor:`pointer`,zIndex:2,border:`1px solid ${c?`${S.green}88`:S.border}`}}),(0,f.jsxs)(`div`,{style:{flex:1,padding:`14px 10px 6px`,display:`flex`,flexDirection:`column`,justifyContent:`center`},children:[(0,f.jsxs)(`div`,{style:{fontSize:12,fontWeight:700,color:u,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,lineHeight:1.3,display:`flex`,alignItems:`center`,gap:6},children:[(0,f.jsx)(re,{type:`split`,size:16}),(0,f.jsxs)(`span`,{children:[`SPLIT `,s.label]})]}),(0,f.jsx)(`div`,{style:{fontSize:9,color:S.textSec,marginTop:2},children:s.desc})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,borderTop:`1px solid ${S.border}44`},children:[(0,f.jsxs)(`div`,{style:{flex:1,fontSize:8,fontWeight:700,textAlign:`center`,padding:`1px 0`,color:`#B080C0`,letterSpacing:`.1em`,borderRight:`1px solid ${S.border}44`},children:[`A `,o===`ab`&&(a.activePath===`B`?`—`:`✓`)]}),(0,f.jsxs)(`div`,{style:{flex:1,fontSize:8,fontWeight:700,textAlign:`center`,padding:`1px 0`,color:`#80B0C0`,letterSpacing:`.1em`},children:[`B `,o===`ab`&&a.activePath===`B`?`✓`:`—`]})]})]})}function ce({block:e,selected:t,onSelect:n,onToggle:r,onModelBrowser:i}){let a=e.params||{},o=!e.bypassed,s=(0,l.useRef)(null),c=(0,l.useCallback)(()=>{s.current=setTimeout(()=>{s.current=null,i?.(e.id)},500)},[e.id,i]),u=(0,l.useCallback)(()=>{s.current&&=(clearTimeout(s.current),null)},[]);return(0,f.jsxs)(`div`,{draggable:!0,onClick:()=>n(e.id),onTouchStart:c,onTouchEnd:u,onTouchMove:u,onMouseDown:u,onMouseUp:u,style:{minWidth:130,width:130,height:76,borderRadius:8,background:`linear-gradient(135deg, #15201A, ${S.panel})`,border:`2px solid ${t?S.amber:`#80B0C0`}60`,opacity:o?1:.35,cursor:`pointer`,display:`flex`,flexDirection:`column`,position:`relative`,overflow:`hidden`,transition:`all .15s ease`,flexShrink:0,boxShadow:t?`0 0 16px ${S.amber}44, inset 0 0 0 1px ${S.amber}22`:`none`,transform:t?`scale(1.05)`:`scale(1)`},children:[(0,f.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,height:3,background:`linear-gradient(90deg, #80B0C0, #60A080)`}}),(0,f.jsx)(`div`,{onClick:t=>{t.stopPropagation(),r(e.id)},style:{position:`absolute`,top:6,right:6,width:10,height:10,borderRadius:`50%`,background:o?S.green:S.textDim,boxShadow:o?`0 0 8px ${S.green}`:`none`,transition:`all .15s`,cursor:`pointer`,zIndex:2,border:`1px solid ${o?`${S.green}88`:S.border}`}}),(0,f.jsxs)(`div`,{style:{flex:1,padding:`14px 10px 6px`,display:`flex`,flexDirection:`column`,justifyContent:`center`},children:[(0,f.jsxs)(`div`,{style:{fontSize:12,fontWeight:700,color:`#80B0C0`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,lineHeight:1.3,display:`flex`,alignItems:`center`,gap:6},children:[(0,f.jsx)(re,{type:`merge`,size:16}),(0,f.jsx)(`span`,{children:`MERGE`})]}),(0,f.jsxs)(`div`,{style:{fontSize:9,color:S.textSec,marginTop:2},children:[`Blend `,a.blend??100,`%`]})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,borderTop:`1px solid ${S.border}44`},children:[(0,f.jsxs)(`div`,{style:{flex:1,fontSize:8,fontWeight:700,textAlign:`center`,padding:`1px 0`,color:`#B080C0`,letterSpacing:`.1em`,borderRight:`1px solid ${S.border}44`},children:[`Lv `,a.levelA??100]}),(0,f.jsxs)(`div`,{style:{flex:1,fontSize:8,fontWeight:700,textAlign:`center`,padding:`1px 0`,color:`#80B0C0`,letterSpacing:`.1em`},children:[`Lv `,a.levelB??100]})]})]})}function le({block:e,selected:t,onSelect:n,onToggle:r,pathLabel:i,onModelBrowser:a}){let o=ie(e.type),s=!e.bypassed,c=(0,l.useRef)(null),u=(0,l.useCallback)(()=>{c.current=setTimeout(()=>{c.current=null,a?.(e.id)},500)},[e.id,a]),d=(0,l.useCallback)(()=>{c.current&&=(clearTimeout(c.current),null)},[]);return(0,f.jsxs)(`div`,{draggable:!0,onClick:()=>n(e.id),onTouchStart:u,onTouchEnd:d,onTouchMove:d,onMouseDown:d,onMouseUp:d,style:{minWidth:120,width:120,height:76,borderRadius:8,background:i===`B`?`#1A1820`:S.panel,border:`2px solid ${t?S.amber:S.border}`,opacity:s?1:.35,cursor:`pointer`,display:`flex`,flexDirection:`column`,position:`relative`,overflow:`hidden`,transition:`all .15s ease`,flexShrink:0,boxShadow:t?`0 0 16px ${S.amber}44, inset 0 0 0 1px ${S.amber}22`:i===`B`?`inset 0 0 0 1px rgba(128,176,192,0.15)`:`none`,transform:t?`scale(1.05)`:`scale(1)`},children:[(0,f.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,height:3,background:o,boxShadow:s?`0 0 6px ${o}`:`none`}}),(0,f.jsx)(`div`,{style:{position:`absolute`,top:5,left:5,fontSize:9,color:S.textDim,letterSpacing:1.5,lineHeight:1,cursor:`grab`,opacity:.5},children:`⋮⋮`}),(0,f.jsx)(`div`,{onClick:t=>{t.stopPropagation(),r(e.id)},style:{position:`absolute`,top:6,right:6,width:10,height:10,borderRadius:`50%`,background:s?S.green:S.textDim,boxShadow:s?`0 0 8px ${S.green}`:`none`,transition:`all .15s`,cursor:`pointer`,zIndex:2,border:`1px solid ${s?`${S.green}88`:S.border}`},title:s?`Active — tap to bypass`:`Bypassed — tap to enable`}),(0,f.jsxs)(`div`,{style:{flex:1,padding:`14px 10px 6px`,display:`flex`,flexDirection:`column`,justifyContent:`center`},children:[i&&(0,f.jsx)(`div`,{style:{position:`absolute`,top:5,right:20,fontSize:7,fontWeight:700,color:i===`A`?`#B080C0`:`#80B0C0`,letterSpacing:`.08em`,background:`${S.bg}88`,padding:`0 4px`,borderRadius:2,lineHeight:1.4},children:i===`A`?`A`:`B`}),(0,f.jsx)(`div`,{style:{fontSize:12,fontWeight:600,color:S.textPrimary,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,lineHeight:1.3,paddingRight:16},children:e.name||e.type||`FX`}),(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:5,marginTop:3},children:[(0,f.jsx)(re,{type:e.type,size:14}),(0,f.jsx)(`span`,{style:{fontSize:9,fontWeight:700,color:o,letterSpacing:`.08em`,textTransform:`uppercase`,background:`${o}18`,padding:`1px 5px`,borderRadius:3},children:(e.type||`fx`).replace(/_/g,` `).toUpperCase()}),e.params?.subtype&&(0,f.jsxs)(`span`,{style:{fontSize:8,color:S.textSec,whiteSpace:`nowrap`},children:[`· `,T(e.type,e.params.subtype)]})]})]})]})}function E(e){let t=e.findIndex(e=>e.type===`split`),n=e.findIndex(e=>e.type===`merge`);if(t===-1||n===-1)return{type:`serial`,blocks:e};let r=e.slice(0,t),i=e[t],a=e.slice(t+1,n),o=e[n],s=e.slice(n+1),c=a.filter(e=>!e.path||e.path===`A`),l=a.filter(e=>e.path===`B`);return{type:`parallel`,beforeSplit:r,splitBlock:i,pathABlocks:c,pathBBlocks:l,mergeBlock:o,afterMerge:s,parallelBlockCount:Math.max(c.length,l.length)}}function D({blocks:e,selectedBlockId:t,onSelectBlock:n,onToggleBlock:r,onReorder:i,onAddBlock:a,onRemoveBlock:o,onModelBrowser:s,looperStores:c={}}){let u=(0,l.useRef)(null),d=(0,l.useRef)(null),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(0),_=(0,l.useMemo)(()=>E(e),[e]),y=(0,l.useCallback)((e,t)=>{m(t),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,String(t))},[]),b=(0,l.useCallback)(e=>{e.preventDefault(),e.dataTransfer.dropEffect=`move`},[]),x=(0,l.useCallback)((e,t)=>{e.preventDefault(),p!==null&&p!==t&&i&&i(p,t),m(null)},[p,i]),C=(0,l.useCallback)(()=>{m(null)},[]),w=(0,l.useCallback)(()=>{if(!u.current||!t)return;let n=(_.type===`serial`?e:[..._.beforeSplit,_.splitBlock,..._.pathABlocks,_.mergeBlock,..._.afterMerge].filter(Boolean)).findIndex(e=>e.id===t);if(n<0)return;let r=u.current.children[n+(_.type,1)];r&&r.scrollIntoView({behavior:`smooth`,block:`nearest`,inline:`center`})},[t,_,e]),ee=(0,l.useRef)(t);t!==ee.current&&(ee.current=t,setTimeout(w,50));let T=(0,l.useCallback)(e=>{g(e.target.scrollLeft),d.current&&(d.current.scrollLeft=e.target.scrollLeft)},[]);return e.find(e=>e.id===t),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`},children:[_.type===`parallel`?(()=>{let{beforeSplit:e,splitBlock:i,pathABlocks:a,pathBBlocks:o,mergeBlock:l,afterMerge:p,parallelBlockCount:m}=_,h=[],g=Math.max(a.length,o.length);for(let e=0;e(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(e.type||``).toLowerCase()===`looper`?(0,f.jsx)(v,{block:e,selected:e.id===t,onSelect:n,onToggle:r,looperStore:c[e.id],onModelBrowser:s}):(0,f.jsx)(le,{block:e,selected:e.id===t,index:i,onSelect:n,onToggle:r,onModelBrowser:s}),(0,f.jsx)(ae,{})]},e.id)),(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(0,f.jsx)(se,{block:i,selected:i.id===t,onSelect:n,onToggle:r,onModelBrowser:s}),(0,f.jsx)(ae,{})]}),a.map((e,i)=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(e.type||``).toLowerCase()===`looper`?(0,f.jsx)(v,{block:e,selected:e.id===t,onSelect:n,onToggle:r,looperStore:c[e.id],onModelBrowser:s}):(0,f.jsx)(le,{block:e,selected:e.id===t,index:i,onSelect:n,onToggle:r,pathLabel:`A`,onModelBrowser:s}),(0,f.jsx)(ae,{})]},e.id)),a.length>0&&(0,f.jsx)(ae,{}),(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(0,f.jsx)(ce,{block:l,selected:l.id===t,onSelect:n,onToggle:r,onModelBrowser:s}),(0,f.jsx)(ae,{})]}),p.map((e,i)=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(e.type||``).toLowerCase()===`looper`?(0,f.jsx)(v,{block:e,selected:e.id===t,onSelect:n,onToggle:r,looperStore:c[e.id],onModelBrowser:s}):(0,f.jsx)(le,{block:e,selected:e.id===t,index:i,onSelect:n,onToggle:r,onModelBrowser:s}),(0,f.jsx)(ae,{})]},e.id)),(0,f.jsx)(oe,{label:`OUT`,isLeft:!1})]}),(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`stretch`,padding:`0 12px`,position:`relative`},children:(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0,minHeight:24},children:(0,f.jsx)(`div`,{style:{width:`calc(100%)`,position:`relative`}})})}),(0,f.jsxs)(`div`,{ref:d,style:{display:`flex`,alignItems:`center`,gap:4,padding:`2px 12px 8px`,overflowX:`auto`,overflowY:`hidden`,minHeight:76,scrollBehavior:`smooth`,WebkitOverflowScrolling:`touch`,borderTop:`1px solid ${S.border}33`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0,paddingRight:4,opacity:.3,pointerEvents:`none`},children:e.length>0&&(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4},children:e.map((e,t)=>(0,f.jsx)(`div`,{style:{minWidth:124,height:20,fontSize:8,color:S.textDim,display:`flex`,alignItems:`center`,gap:4},children:(0,f.jsx)(`span`,{children:`──`})},e.id))})}),(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0,opacity:.6},children:(0,f.jsxs)(`svg`,{width:`22`,height:`24`,viewBox:`0 0 22 24`,fill:`none`,style:{flexShrink:0},children:[(0,f.jsx)(`line`,{x1:`8`,y1:`0`,x2:`8`,y2:`18`,stroke:S.blue,strokeWidth:`1.5`,strokeDasharray:`3,2`}),(0,f.jsx)(`line`,{x1:`2`,y1:`18`,x2:`18`,y2:`18`,stroke:S.blue,strokeWidth:`1.5`}),(0,f.jsx)(`polyline`,{points:`14,14 18,18 14,22`,fill:`none`,stroke:S.blue,strokeWidth:`1.5`})]})}),o.length===0&&(0,f.jsxs)(`div`,{style:{flexShrink:0,padding:`16px 16px`,color:S.textDim,fontSize:10,border:`1px dashed ${S.border}44`,borderRadius:6,display:`flex`,alignItems:`center`,gap:8},children:[(0,f.jsx)(`span`,{style:{color:`#80B0C0`,fontSize:8,fontWeight:700,letterSpacing:`.1em`},children:`PATH B`}),(0,f.jsx)(`span`,{children:`Add blocks to Path B`})]}),o.map((i,a)=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(0,f.jsx)(le,{block:i,selected:i.id===t,index:a+e.length+1,onSelect:n,onToggle:r,pathLabel:`B`}),(0,f.jsx)(ae,{narrow:!0})]},i.id)),o.length>0&&(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0,opacity:.6},children:(0,f.jsxs)(`svg`,{width:`22`,height:`24`,viewBox:`0 0 22 24`,fill:`none`,style:{flexShrink:0},children:[(0,f.jsx)(`line`,{x1:`14`,y1:`24`,x2:`14`,y2:`6`,stroke:S.blue,strokeWidth:`1.5`,strokeDasharray:`3,2`}),(0,f.jsx)(`line`,{x1:`4`,y1:`6`,x2:`20`,y2:`6`,stroke:S.blue,strokeWidth:`1.5`}),(0,f.jsx)(`polyline`,{points:`8,10 4,6 8,2`,fill:`none`,stroke:S.blue,strokeWidth:`1.5`})]})}),(0,f.jsx)(`div`,{style:{flex:1,minWidth:20}}),o.length>0&&(0,f.jsx)(`div`,{style:{flexShrink:0,fontSize:7,fontWeight:700,color:`#80B0C0`,letterSpacing:`.12em`,textTransform:`uppercase`,padding:`0 8px`,opacity:.5},children:`Path B`})]}),(0,f.jsxs)(`div`,{style:{position:`absolute`,left:0,top:0,bottom:0,width:20,display:`flex`,flexDirection:`column`,pointerEvents:`none`,opacity:.4},children:[(0,f.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:8,fontWeight:700,color:`#B080C0`,writingMode:`vertical-rl`,letterSpacing:`.2em`},children:`A`}),(0,f.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:8,fontWeight:700,color:`#80B0C0`,writingMode:`vertical-rl`,letterSpacing:`.2em`},children:`B`})]})]})})():(0,f.jsxs)(`div`,{ref:u,onScroll:T,style:{display:`flex`,alignItems:`center`,gap:4,padding:`10px 12px`,overflowX:`auto`,overflowY:`hidden`,minHeight:96,background:S.bg,borderBottom:`1px solid ${S.border}`,scrollBehavior:`smooth`,WebkitOverflowScrolling:`touch`},children:[(0,f.jsx)(oe,{label:`IN`,isLeft:!0}),e.map((e,i)=>(0,f.jsxs)(`div`,{draggable:!0,onDragStart:e=>y(e,i),onDragOver:b,onDrop:e=>x(e,i),onDragEnd:C,style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(e.type||``).toLowerCase()===`looper`?(0,f.jsx)(v,{block:e,selected:e.id===t,onSelect:n,onToggle:r,looperStore:c[e.id],onModelBrowser:s}):(0,f.jsx)(le,{block:e,selected:e.id===t,index:i,onSelect:n,onToggle:r,onModelBrowser:s}),(0,f.jsx)(ae,{})]},e.id)),e.length===0&&(0,f.jsx)(`div`,{style:{flexShrink:0,padding:`22px 20px`,color:S.textDim,fontSize:12,textAlign:`center`,border:`1px dashed ${S.border}`,borderRadius:8,minWidth:140},children:`No blocks in chain`}),(0,f.jsx)(oe,{label:`OUT`,isLeft:!1})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:8,padding:`8px 12px`,borderBottom:`1px solid ${S.border}`,background:S.panel},children:[(0,f.jsx)(`button`,{onClick:a,style:{flex:1,padding:`10px`,borderRadius:7,background:S.surface,border:`1px dashed ${S.border}`,color:S.textSec,fontSize:12,fontWeight:600,cursor:`pointer`,letterSpacing:`.04em`,transition:`all .12s`},children:`+ Add Block`}),t&&(0,f.jsx)(`button`,{onClick:()=>o(t),style:{padding:`10px 14px`,borderRadius:7,background:`rgba(200,64,64,.15)`,border:`1px solid rgba(200,64,64,.3)`,color:S.red,fontSize:12,fontWeight:600,cursor:`pointer`,transition:`all .12s`},children:`✕ Remove`})]})]})}var O={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`};O.amber,O.amber,O.red,O.blue,O.blue,O.blue,O.blue,O.green,O.green,O.green,O.green;function ue(e){return{gate:`GATE`,overdrive:`OD`,distortion:`DST`,fuzz:`FUZZ`,chorus:`CHO`,flanger:`FLN`,phaser:`PHA`,tremolo:`TRE`,delay:`DLY`,echo:`ECH`,reverb:`REV`,compressor:`CMP`,eq:`EQ`,cabinet:`CAB`,ir:`IR`,nam:`NAM`}[(e||``).toLowerCase()]||(e||`FX`).toUpperCase().slice(0,4)}function de({id:e,label:t,mainLabel:n,type:r,sub:i,active:a,enabled:o,onClick:s,onDoubleClick:c,isBank:u,bankDir:d}){let p=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=p.current;if(!t||!c)return;let n=0,r=()=>{let t=Date.now();t-n<300?(c(e),n=0):n=t};return t.addEventListener(`click`,r),()=>t.removeEventListener(`click`,r)},[e,c]);let m=r===`bypass`,h=r===`bank`,g=a||m&&!o;return(0,f.jsxs)(`div`,{ref:p,onClick:()=>s?.(e),style:{flex:1,minWidth:0,display:`flex`,flexDirection:`column`,alignItems:`center`,gap:2,padding:`6px 3px 8px`,borderRadius:8,border:`1px solid ${g?O.amber:h?O.blueDim:O.border}`,background:g&&!m?`linear-gradient(180deg, ${O.amber}15 0%, ${O.panel} 100%)`:m&&!o?`linear-gradient(180deg, ${O.red}15 0%, ${O.panel} 100%)`:O.surface,cursor:`pointer`,minHeight:58,position:`relative`,transition:`all .1s`,WebkitTapHighlightColor:`transparent`,boxShadow:g&&!m?`0 0 8px ${O.amber}33, inset 0 0 0 1px ${O.amber}22`:m&&!o?`0 0 8px ${O.red}33`:`none`},children:[(0,f.jsx)(`div`,{style:{width:`100%`,background:`#0A0A10`,border:`1px solid ${g?O.amber+`66`:O.border}`,borderRadius:3,padding:`2px 2px`,textAlign:`center`,minHeight:18,display:`flex`,alignItems:`center`,justifyContent:`center`,boxShadow:g?`inset 0 0 4px ${O.amber}22`:`none`},children:(0,f.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:7,fontWeight:700,letterSpacing:`.02em`,color:g?O.amber:m&&!o?O.red:O.textPrimary,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,maxWidth:`100%`,lineHeight:1.1},children:t})}),(0,f.jsx)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:h?10:9,fontWeight:700,color:o===!1?O.textDim:O.textPrimary,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,maxWidth:`100%`,lineHeight:1.2,marginTop:1},children:n||t||r||e||`FX`}),i&&(0,f.jsx)(`div`,{style:{fontSize:7,color:O.textDim,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,maxWidth:`100%`,lineHeight:1},children:i}),!h&&(0,f.jsx)(`div`,{style:{position:`absolute`,top:3,right:3,width:4,height:4,borderRadius:`50%`,background:o===!1?O.textDim:O.green,boxShadow:o===!1?`none`:`0 0 5px ${O.green}`,transition:`all .15s`}}),h&&(0,f.jsx)(`div`,{style:{position:`absolute`,top:3,right:3,fontSize:6,padding:`1px 3px`,borderRadius:2,background:`${O.blueDim}88`,color:O.blue,fontWeight:700,lineHeight:1},children:d===`up`?`▲`:`▼`})]})}function fe({mode:e=`stomp`,blocks:t=[],selectedBlockId:n,currentBank:r=`A`,presets:i=[],currentPreset:a,snapshots:o=[],currentSnapshot:s,onSelectBlock:c,onToggleBlock:l,onBankUp:u,onBankDown:d,onGlobalBypass:p,globalBypass:m,onTunerToggle:h,tunerEnabled:g,onPresetClick:_,onSnapshotClick:v,looperActive:y,looperTransport:b}){let x=[];if(e===`stomp`||e===`stomp-b`)if(y&&b)x=[{id:`looper_record`,type:`looper`,label:`REC`,mainLabel:`Record`,enabled:!0,looperAction:`record`},{id:`looper_play`,type:`looper`,label:`PLAY`,mainLabel:`Play`,enabled:!0,looperAction:`play`},{id:`looper_stop`,type:`looper`,label:`STOP`,mainLabel:`Stop`,enabled:!0,looperAction:`stop`}],t.filter(e=>e.id!==n).slice(0,3).forEach(e=>{x.push({id:e.id,type:`block`,label:ue(e.type),mainLabel:e.name||e.type||`FX`,sub:e.bypassed?`BYPASSED`:``,enabled:!e.bypassed})}),x=x.slice(0,5),x.push({id:`bypass`,type:`bypass`,label:m?`MUTED`:`BYPASS`,mainLabel:`GLOBAL`,sub:m?``:`tap to mute`,enabled:!m});else{let e=t.length>5?6:Math.max(4,t.length),n=t.slice(0,e).map(e=>({id:e.id,type:`block`,label:ue(e.type),mainLabel:e.name||e.type||`FX`,sub:e.bypassed?`BYPASSED`:``,enabled:!e.bypassed}));for(;n.length<5;)n.push({id:`empty_`+n.length,type:`empty`,label:`—`,mainLabel:`Empty`,enabled:!1});x=[...n.slice(0,5),{id:`bypass`,type:`bypass`,label:m?`MUTED`:`BYPASS`,mainLabel:`GLOBAL`,sub:m?``:`tap to mute`,enabled:!m}]}else if(e===`preset`)x=[{id:`bank_up`,type:`bank`,label:`BANK ▲`,mainLabel:`${r} · ${a}`,bankDir:`up`,enabled:!0},...i.slice(0,4).map((e,t)=>({id:`preset_`+t,type:`preset`,label:`0${e.num||t+1}`,mainLabel:e.name||`P${t+1}`,sub:e.num===a?`ACTIVE`:``,enabled:!0})),{id:`bank_down`,type:`bank`,label:`BANK ▼`,mainLabel:`${r} · ${a}`,bankDir:`down`,enabled:!0}];else if(e===`snapshot`)for(x=[...o.slice(0,6).map((e,t)=>({id:`snap_`+(e.num||t),type:`snapshot`,label:`SNAP ${e.num||t+1}`,mainLabel:e.name||`Snapshot ${e.num||t+1}`,sub:(e.num||t+1)===s?`ACTIVE`:``,enabled:!0}))];x.length<6;)x.push({id:`snap_empty_`+x.length,type:`empty`,label:`—`,mainLabel:`Empty`,enabled:!1});return(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,padding:`6px 8px 10px`,background:O.bg,borderTop:`1px solid ${O.border}`,flexShrink:0},children:x.map(t=>(0,f.jsx)(de,{id:t.id,label:t.label,mainLabel:t.mainLabel,type:t.type,sub:t.sub,active:t.id===n||t.type===`preset`&&t.sub===`ACTIVE`||t.type===`snapshot`&&t.sub===`ACTIVE`,enabled:t.enabled,isBank:t.type===`bank`,bankDir:t.bankDir,onClick:t=>{t===`bank_up`?u?.():t===`bank_down`?d?.():t===`bypass`?p?.():t?.startsWith(`preset_`)?_?.(t.replace(`preset_`,``)):t?.startsWith(`snap_`)?v?.(t.replace(`snap_`,``)):t?.startsWith(`looper_`)&&b?b[t.replace(`looper_`,``)]?.():(e===`stomp`||e===`stomp-b`)&&c?.(t)},onDoubleClick:t=>{t!==`bank_up`&&t!==`bank_down`&&t!==`bypass`&&!t?.startsWith(`looper_`)&&(e===`stomp`||e===`stomp-b`)&&l?.(t)}},t.id))})}var k={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},A=[{num:6,name:`E`,freq:82.41,color:`#C84040`},{num:5,name:`A`,freq:110,color:`#D07030`},{num:4,name:`D`,freq:146.83,color:`#E8A030`},{num:3,name:`G`,freq:196,color:`#60A0E0`},{num:2,name:`B`,freq:246.94,color:`#3A7BA8`},{num:1,name:`e`,freq:329.63,color:`#50C080`}],pe=[{note:`E2`,freq:82.41},{note:`F2`,freq:87.31},{note:`G2`,freq:98},{note:`A2`,freq:110},{note:`B2`,freq:123.47},{note:`C3`,freq:130.81},{note:`D3`,freq:146.83},{note:`E3`,freq:164.81},{note:`F3`,freq:174.61},{note:`G3`,freq:196},{note:`A3`,freq:220},{note:`B3`,freq:246.94},{note:`C4`,freq:261.63},{note:`D4`,freq:293.66},{note:`E4`,freq:329.63}];function me(){let e=Date.now()/1e3,t=pe[Math.floor(e*.3%pe.length)],n=Math.sin(e*2.5)*15,r=.6+Math.sin(e*.7)*.25,i=-1;for(let e=0;e({note:`--`,cents:0,string:-1,confidence:0,frequency:0}));(0,l.useEffect)(()=>{t&&e&&i({note:e.tuner_note||`--`,cents:e.tuner_cents??0,string:e.tuner_string??-1,confidence:e.tuner_confidence??0,frequency:e.tuner_frequency??0})},[t,e]),(0,l.useEffect)(()=>{if(t&&e?.tuner_enabled)return;let n=setInterval(()=>{i(me())},200);return()=>clearInterval(n)},[t,e]),(0,l.useEffect)(()=>{if(!t||!e?.tuner_enabled)return;let n=!1,r=async()=>{try{let e=(()=>{try{let e=localStorage.getItem(`pedal_channel`);return e===`guitar`||e===`bass`?e:`guitar`}catch{return`guitar`}})(),t=await fetch(`/api/tuner/pitch?channel=${e}`);if(!n&&t.ok){let e=await t.json();i({note:e.note||`--`,cents:e.cents??0,string:e.string??-1,confidence:e.confidence??0,frequency:e.frequency??0})}}catch{}};r();let a=setInterval(r,80);return()=>{n=!0,clearInterval(a)}},[t,e?.tuner_enabled]);let a=r.cents,o=r.confidence,s=(Math.max(-50,Math.min(50,a))+50)/100,c=Math.abs(a)<=3,u=Math.abs(a)<=10,d=r.string,p=[];for(let e=-50;e<=50;e+=5)p.push(e);let m=c?k.green:u?k.amber:k.textPrimary;return(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`,background:k.bg,overflow:`hidden`},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`6px 12px`,background:k.panel,borderBottom:`1px solid ${k.border}`,flexShrink:0},children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.12em`,textTransform:`uppercase`,color:c?k.green:k.amber},children:c?`● In Tune`:`◌ Tuner`}),(0,f.jsx)(`button`,{onClick:n,style:{padding:`6px 14px`,borderRadius:6,background:k.surface,border:`1px solid ${k.border}`,color:k.textPrimary,fontSize:11,fontWeight:600,cursor:`pointer`},children:`✕ Exit Tuner`})]}),(0,f.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,gap:6,padding:`8px 16px`},children:[(0,f.jsx)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:72,fontWeight:700,color:m,textShadow:c?`0 0 30px ${k.green}44`:u?`0 0 20px ${k.amber}33`:`none`,lineHeight:1,letterSpacing:`.02em`,transition:`color .08s, text-shadow .08s`,minHeight:76,display:`flex`,alignItems:`center`,justifyContent:`center`},children:r.note}),(0,f.jsxs)(`div`,{style:{width:`100%`,maxWidth:320,height:60,position:`relative`,marginTop:4},children:[(0,f.jsx)(`div`,{style:{position:`absolute`,bottom:16,left:0,right:0,height:16,display:`flex`,alignItems:`flex-end`,justifyContent:`space-between`,padding:`0 10px`},children:p.map((e,t)=>{let n=e===0,r=e%10==0;return(0,f.jsx)(`div`,{style:{width:n?3:r?2:1,height:n?16:r?10:5,background:n?k.amber:k.border,borderRadius:1,flexShrink:0}},t)})}),(0,f.jsxs)(`div`,{style:{position:`absolute`,bottom:2,left:0,right:0,display:`flex`,justifyContent:`space-between`,padding:`0 6px`,fontSize:7,color:k.textDim,fontFamily:`'JetBrains Mono', monospace`},children:[(0,f.jsx)(`span`,{children:`-50¢`}),(0,f.jsx)(`span`,{children:`-25¢`}),(0,f.jsx)(`span`,{children:`0¢`}),(0,f.jsx)(`span`,{children:`+25¢`}),(0,f.jsx)(`span`,{children:`+50¢`})]}),(0,f.jsxs)(`div`,{style:{position:`absolute`,bottom:16,left:`calc(10px + ${s} * (100% - 20px))`,transform:`translateX(-50%)`,transition:`left .04s ease-out`},children:[(0,f.jsx)(`div`,{style:{width:2,height:44,background:c?k.green:u?k.amber:k.textPrimary,borderRadius:1,margin:`0 auto`,boxShadow:c?`0 0 8px ${k.green}`:`0 0 4px ${u?k.amber:`transparent`}`}}),(0,f.jsx)(`div`,{style:{width:8,height:8,borderRadius:`50%`,background:c?k.green:u?k.amber:k.textPrimary,margin:`-1px auto 0`,boxShadow:c?`0 0 12px ${k.green}`:`0 0 6px ${u?k.amber:`transparent`}`}})]})]}),(0,f.jsxs)(`div`,{style:{fontSize:13,fontFamily:`'JetBrains Mono', monospace`,color:m,letterSpacing:`.04em`,minHeight:18},children:[a>0?`+${a}¢`:`${a}¢`,c&&(0,f.jsx)(`span`,{style:{color:k.green},children:` ✓`})]})]}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:6,padding:`8px 16px 12px`,justifyContent:`center`,borderTop:`1px solid ${k.border}`,flexShrink:0},children:A.map(e=>{let t=e.num===d;return(0,f.jsxs)(`div`,{style:{width:40,height:40,borderRadius:8,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,background:t?`${e.color}22`:k.surface,border:`2px solid ${t?e.color:k.border}`,transition:`all .1s`,boxShadow:t?`0 0 12px ${e.color}44`:`none`},children:[(0,f.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:16,fontWeight:700,color:t?e.color:k.textDim,lineHeight:1},children:e.name}),(0,f.jsx)(`span`,{style:{fontSize:8,color:t?e.color:k.textDim,opacity:.7,lineHeight:1},children:e.num})]},e.num)})}),(0,f.jsxs)(`div`,{style:{padding:`0 16px 8px`,display:`flex`,alignItems:`center`,gap:8,flexShrink:0},children:[(0,f.jsx)(`span`,{style:{fontSize:8,color:k.textDim,fontFamily:`'JetBrains Mono', monospace`},children:`SIG`}),(0,f.jsx)(`div`,{style:{flex:1,height:3,borderRadius:2,background:k.border,overflow:`hidden`},children:(0,f.jsx)(`div`,{style:{height:`100%`,width:`${Math.max(0,Math.min(100,o*100))}%`,background:o>.7?k.green:o>.3?k.amber:k.red,borderRadius:2,transition:`width .08s`}})}),(0,f.jsxs)(`span`,{style:{fontSize:8,color:k.textDim,fontFamily:`'JetBrains Mono', monospace`,minWidth:20,textAlign:`right`},children:[Math.round(o*100),`%`]})]})]})}var j={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},ge={overdrive:[{key:`drive`,label:`Drive`,min:0,max:100,def:30},{key:`tone`,label:`Tone`,min:0,max:100,def:50},{key:`level`,label:`Level`,min:0,max:100,def:70}],distortion:[{key:`drive`,label:`Drive`,min:0,max:100,def:50},{key:`tone`,label:`Tone`,min:0,max:100,def:40},{key:`level`,label:`Level`,min:0,max:100,def:60}],fuzz:[{key:`fuzz`,label:`Fuzz`,min:0,max:100,def:60},{key:`tone`,label:`Tone`,min:0,max:100,def:30},{key:`level`,label:`Level`,min:0,max:100,def:60}],delay:[{key:`time`,label:`Time`,min:0,max:100,def:40},{key:`feedback`,label:`Feedback`,min:0,max:100,def:30},{key:`mix`,label:`Mix`,min:0,max:100,def:35}],echo:[{key:`time`,label:`Time`,min:0,max:100,def:40},{key:`feedback`,label:`Feedback`,min:0,max:100,def:30},{key:`mix`,label:`Mix`,min:0,max:100,def:35}],reverb:[{key:`decay`,label:`Decay`,min:0,max:100,def:50},{key:`mix`,label:`Mix`,min:0,max:100,def:30},{key:`tone`,label:`Tone`,min:0,max:100,def:50}],chorus:[{key:`rate`,label:`Rate`,min:0,max:100,def:40},{key:`depth`,label:`Depth`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],flanger:[{key:`rate`,label:`Rate`,min:0,max:100,def:30},{key:`depth`,label:`Depth`,min:0,max:100,def:50},{key:`feedback`,label:`Feedback`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],phaser:[{key:`rate`,label:`Rate`,min:0,max:100,def:30},{key:`depth`,label:`Depth`,min:0,max:100,def:50},{key:`feedback`,label:`Feedback`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],compressor:[{key:`threshold`,label:`Thresh`,min:0,max:100,def:50},{key:`ratio`,label:`Ratio`,min:1,max:20,def:4},{key:`gain`,label:`Gain`,min:0,max:100,def:50}],gate:[{key:`threshold`,label:`Thresh`,min:0,max:100,def:30},{key:`release`,label:`Release`,min:0,max:100,def:50}],eq:[{key:`low`,label:`Low`,min:-12,max:12,def:0},{key:`mid`,label:`Mid`,min:-12,max:12,def:0},{key:`high`,label:`High`,min:-12,max:12,def:0},{key:`level`,label:`Level`,min:0,max:100,def:70}],cabinet:[{key:`level`,label:`Level`,min:0,max:100,def:75}],ir:[{key:`level`,label:`Level`,min:0,max:100,def:75}],looper:h.filter(e=>e.type!==`select`)},_e={overdrive:j.amber,distortion:j.red,fuzz:`#C07030`,delay:j.blue,echo:j.blue,reverb:`#60B0D0`,chorus:j.green,flanger:`#50C080`,phaser:`#80C050`,tremolo:j.green,compressor:`#D09040`,gate:j.textSec,eq:`#7080D0`,cabinet:`#D07090`,ir:`#D07090`,nam:`#E0A040`,boost:j.amber,wah:`#D0A060`,volume:j.textSec,tuner:`#80D0A0`,looper:m},ve={overdrive:`OD-808`,distortion:`RAT`,fuzz:`Big Muff`,delay:`Digital Delay`,echo:`Tape Echo`,reverb:`Hall Reverb`,chorus:`Chorus`,flanger:`Flanger`,phaser:`Phase 90`,tremolo:`Tremolo`,compressor:`Compressor`,gate:`Noise Gate`,eq:`EQ`,cabinet:`Cabinet`,ir:`IR Loader`,nam:`NAM Model`,boost:`Clean Boost`,wah:`Wah`,volume:`Volume`,tuner:`Tuner`,loop:`FX Loop`,looper:`Looper`};function ye(e){return ge[(e||``).toLowerCase()]||[{key:`level`,label:`Level`,min:0,max:100,def:50}]}function be(e){return _e[(e||``).toLowerCase()]||j.amber}function xe(e){let t=(e.type||``).toLowerCase();return e.nam_model_path?e.nam_model_path.split(`/`).pop()?.replace(/\.(nam|wav|aiff?)$/i,``)||`NAM Model`:e.ir_file_path?e.ir_file_path.split(`/`).pop()?.replace(/\.(wav|aiff?|ir)$/i,``)||`IR Loader`:ve[t]||t.charAt(0).toUpperCase()+t.slice(1)}function Se({label:e,value:t=50,onChange:n,size:r=72,color:i=j.amber,min:a=0,max:o=100,compact:s=!1}){let c=(0,l.useRef)(null),u=(t-a)/(o-a),d=-140+u*280,p=r*.38,m=r*.5-p,h=e=>{e.preventDefault(),c.current={y:e.touches?e.touches[0].clientY:e.clientY,val:t};let r=e=>{let t=e.touches?e.touches[0].clientY:e.clientY,r=(c.current.y-t)/120,i=Math.max(a,Math.min(o,c.current.val+r*(o-a)));n?.(Math.round(i))},i=()=>{window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i),window.removeEventListener(`touchmove`,r),window.removeEventListener(`touchend`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i),window.addEventListener(`touchmove`,r,{passive:!1}),window.addEventListener(`touchend`,i)},g=r+16,_=g/2,v=g/2,y=r/2+4,b=_+y*Math.cos(Math.PI/180*-230),x=v+y*Math.sin(Math.PI/180*-230),S=_+y*Math.cos((d-90)*(Math.PI/180)),C=v+y*Math.sin((d-90)*(Math.PI/180)),w=+(u*280>180);return(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:s?2:6,cursor:`pointer`},children:[(0,f.jsxs)(`div`,{style:{width:r,height:r,position:`relative`,touchAction:`none`},onMouseDown:h,onTouchStart:h,children:[(0,f.jsxs)(`svg`,{style:{position:`absolute`,inset:-8,width:g,height:g,overflow:`visible`},children:[(0,f.jsx)(`circle`,{cx:_,cy:v,r:y,fill:`none`,stroke:j.border,strokeWidth:`3`,strokeLinecap:`round`,opacity:`.5`}),u>0&&(0,f.jsx)(`path`,{d:`M ${b} ${x} A ${y} ${y} 0 ${w} 1 ${S} ${C}`,fill:`none`,stroke:i,strokeWidth:`3`,strokeLinecap:`round`,style:{filter:`drop-shadow(0 0 4px ${i})`}})]}),(0,f.jsx)(`div`,{style:{borderRadius:`50%`,width:`100%`,height:`100%`,position:`relative`,background:`radial-gradient(circle at 35% 30%, #3A3A48, #1A1A22)`,boxShadow:`0 3px 12px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.07)`},children:(0,f.jsx)(`div`,{style:{position:`absolute`,width:4,borderRadius:2,background:i,left:`50%`,transformOrigin:`bottom center`,height:p,top:m,transform:`translateX(-50%) rotate(${d}deg)`,transformOrigin:`50% ${p}px`,boxShadow:`0 0 6px ${i}`}})})]}),(0,f.jsx)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:s?11:14,fontWeight:700,color:i},children:t}),(0,f.jsx)(`div`,{style:{fontSize:s?7:9,color:j.textSec,letterSpacing:`.06em`,textTransform:`uppercase`,textAlign:`center`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,maxWidth:r+16},children:e})]})}function Ce({label:e,value:t=50,onChange:n,onChangeEnd:r,min:i=0,max:a=100,color:o=j.amber}){let s=(0,l.useRef)(null),c=(0,l.useRef)(!1),u=(0,l.useRef)(t),d=(0,l.useRef)(n),p=(0,l.useRef)(r),m=(t-i)/(a-i)*100,[h,g]=(0,l.useState)(null);(0,l.useMemo)(()=>{d.current=n},[n]),(0,l.useMemo)(()=>{p.current=r},[r]);let _=(0,l.useCallback)(e=>{let n=s.current;if(!n)return t;let r=n.getBoundingClientRect(),o=(e.touches?e.touches[0].clientX:e.clientX)-r.left;return Math.round(i+Math.max(0,Math.min(1,o/r.width))*(a-i))},[i,a,t]);(0,l.useMemo)(()=>{let e=e=>{if(!c.current)return;e.preventDefault();let t=_(e);u.current=t,g(t),d.current?.(t)},t=()=>{c.current&&(p.current?.(u.current),c.current=!1,g(null))};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),window.addEventListener(`touchmove`,e,{passive:!1}),window.addEventListener(`touchend`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t),window.removeEventListener(`touchmove`,e),window.removeEventListener(`touchend`,t)}},[_]);let v=e=>{e.preventDefault();let t=_(e);u.current=t,c.current=!0,g(t),d.current?.(t)},y=e=>n=>{n.preventDefault(),n.stopPropagation();let r=Math.max(i,Math.min(a,t+e));d.current?.(r),p.current?.(r)};return(0,f.jsxs)(`div`,{style:{marginBottom:4},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:2},children:[(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:500,textTransform:`uppercase`,letterSpacing:`.06em`,color:o},children:e}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:8,alignItems:`center`},children:[(0,f.jsx)(`button`,{style:{width:34,height:34,borderRadius:`50%`,border:`1px solid ${j.border}`,background:j.panel,color:j.textPrimary,fontSize:16,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`,lineHeight:1},onMouseDown:y(-5),onTouchStart:y(-5),children:`−`}),(0,f.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:16,fontWeight:700,color:o,minWidth:40,textAlign:`center`},children:h??t}),(0,f.jsx)(`button`,{style:{width:34,height:34,borderRadius:`50%`,border:`1px solid ${j.border}`,background:j.panel,color:j.textPrimary,fontSize:16,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`,lineHeight:1},onMouseDown:y(5),onTouchStart:y(5),children:`+`})]})]}),(0,f.jsxs)(`div`,{ref:s,onMouseDown:v,onTouchStart:v,style:{position:`relative`,height:44,display:`flex`,alignItems:`center`,cursor:`pointer`,touchAction:`none`},children:[(0,f.jsx)(`div`,{style:{width:`100%`,height:10,background:j.border,borderRadius:5,position:`relative`,overflow:`hidden`},children:(0,f.jsx)(`div`,{style:{height:`100%`,borderRadius:5,position:`absolute`,top:0,left:0,width:`${m}%`,background:o,boxShadow:`0 0 8px ${o}44`,transition:`width .03s`}})}),(0,f.jsx)(`div`,{style:{width:30,height:30,borderRadius:`50%`,position:`absolute`,top:`50%`,left:`${m}%`,transform:`translate(-50%,-50%)`,background:o,boxShadow:`0 2px 10px rgba(0,0,0,.6), 0 0 0 3px ${j.bg}`,pointerEvents:`none`,transition:`left .03s`}})]})]})}function we({defs:e,params:t,viewMode:n,color:r,onParamChange:i,onParamChangeEnd:a,compact:o}){return(0,f.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:n===`knob`?8:0,width:`100%`,minWidth:0,flexShrink:0},children:n===`slider`?e.map(e=>(0,f.jsx)(Ce,{label:e.label,value:t[e.key]==null?e.def:t[e.key],min:e.min,max:e.max,color:r,onChange:t=>i(e.key,t),onChangeEnd:t=>a(e.key,t)},e.key)):(0,f.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(${o?4:Math.min(4,e.length)}, 1fr)`,gap:12,padding:`8px 0`,justifyItems:`center`,width:`100%`,maxWidth:480,margin:`0 auto`},children:e.map(e=>(0,f.jsx)(Se,{label:e.label,size:o?60:72,value:t[e.key]==null?e.def:t[e.key],min:e.min,max:e.max,color:r,onChange:t=>{i(e.key,t),a(e.key,t)},compact:o},e.key))})})}function Te({block:e,params:t,viewMode:n,onClose:r,onParamChange:i,onParamChangeEnd:a,onToggleView:o,onToggleBypass:s,onOpenModelBrowser:c}){let u=ye(e.type),d=be(e.type),p=xe(e),m=(0,l.useMemo)(()=>{let e=[];for(let t=0;t{let e=()=>b(window.innerWidth<500);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let x=(0,l.useCallback)(e=>{v.current=e.touches[0].clientX},[]),S=(0,l.useCallback)(e=>{if(v.current==null)return;let t=e.changedTouches[0].clientX-v.current;v.current=null,!(Math.abs(t)<50)&&(t<0&&hMath.min(e+1,m.length-1)):t>0&&h>0&&g(e=>Math.max(e-1,0)))},[h,m.length]);return(0,l.useMemo)(()=>{let e=e=>{e.key===`ArrowLeft`&&h>0&&g(e=>e-1),e.key===`ArrowRight`&&he+1),e.key===`Escape`&&r?.()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h,m.length,r]),(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:1e3,display:`flex`,flexDirection:`column`,background:j.bg,fontFamily:`'Inter', sans-serif`,color:j.textPrimary},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${j.border}`,background:j.panel,flexShrink:0},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,minWidth:0},children:[(0,f.jsx)(`button`,{onClick:r,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:j.surface,border:`1px solid ${j.border}`,color:j.textPrimary,fontSize:16,cursor:`pointer`,flexShrink:0},children:`✕`}),(0,f.jsxs)(`div`,{style:{minWidth:0},children:[(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:p}),(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,marginTop:2},children:(0,f.jsx)(`span`,{style:{display:`inline-flex`,padding:`1px 6px`,borderRadius:3,fontSize:9,fontWeight:700,letterSpacing:`.06em`,textTransform:`uppercase`,background:`${d}22`,color:d},children:(e.type||`fx`).replace(/_/g,` `).toUpperCase()})})]})]}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:6,alignItems:`center`,flexShrink:0},children:(0,f.jsx)(`button`,{onClick:o,style:{padding:`6px 10px`,borderRadius:6,fontSize:10,fontWeight:600,background:j.surface,border:`1px solid ${j.border}`,color:j.textPrimary,cursor:`pointer`,letterSpacing:`.04em`},children:n===`slider`?`◉ Knobs`:`▦ Sliders`})})]}),(0,f.jsx)(`div`,{style:{padding:`6px 14px`,borderBottom:`1px solid ${j.border}`,background:j.surface,flexShrink:0},children:(0,f.jsxs)(`button`,{onClick:s,style:{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,gap:8,padding:`10px 14px`,borderRadius:8,border:`2px solid ${e.bypassed?j.red+`66`:j.green+`66`}`,background:e.bypassed?`linear-gradient(180deg, ${j.red+`18`}, ${j.panel})`:`linear-gradient(180deg, ${j.green+`18`}, ${j.panel})`,cursor:`pointer`,transition:`all .12s`},children:[(0,f.jsx)(`div`,{style:{width:12,height:12,borderRadius:`50%`,background:e.bypassed?j.textDim:j.green,boxShadow:e.bypassed?`none`:`0 0 8px ${j.green}`}}),(0,f.jsx)(`span`,{style:{fontSize:12,fontWeight:700,letterSpacing:`.08em`,textTransform:`uppercase`,color:e.bypassed?j.red:j.green},children:e.bypassed?`Bypassed — Tap to Enable`:`Active — Tap to Bypass`})]})}),(0,f.jsx)(`div`,{ref:_,onTouchStart:x,onTouchEnd:S,style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`12px 16px`,display:`flex`,flexDirection:`column`,gap:6},children:m.length===0?(0,f.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`,color:j.textDim,fontSize:12},children:`No parameters for this block type`}):(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(we,{defs:m[h],params:t,viewMode:n,color:d,onParamChange:i,onParamChangeEnd:a,compact:y}),(0,f.jsx)(`div`,{style:{flex:1,minHeight:8}})]})}),(0,f.jsxs)(`div`,{style:{padding:`8px 14px 12px`,borderTop:`1px solid ${j.border}`,background:j.panel,flexShrink:0,display:`flex`,flexDirection:`column`,gap:6},children:[m.length>1&&(0,f.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,gap:5},children:m.map((e,t)=>(0,f.jsx)(`button`,{onClick:()=>g(t),style:{width:8,height:8,borderRadius:`50%`,border:`none`,padding:0,cursor:`pointer`,background:t===h?d:j.border,opacity:t===h?1:.4,transition:`all .12s`}},t))}),m.length>1&&(0,f.jsxs)(`div`,{style:{textAlign:`center`,fontSize:9,color:j.textDim,fontFamily:`'JetBrains Mono', monospace`,letterSpacing:`.04em`},children:[`Page `,h+1,` / `,m.length,(0,f.jsx)(`span`,{style:{marginLeft:8,opacity:.6},children:`← swipe to navigate →`})]}),c&&(0,f.jsxs)(`button`,{onClick:c,style:{width:`100%`,padding:`8px 14px`,borderRadius:7,background:j.surface,border:`1px solid ${j.border}`,color:j.textPrimary,fontSize:11,fontWeight:600,cursor:`pointer`,letterSpacing:`.04em`,display:`flex`,alignItems:`center`,justifyContent:`center`,gap:6},children:[(0,f.jsx)(`span`,{children:`🎛`}),` Swap Model / Block Type`]})]})]})}var M={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},Ee=`/ui/img/`,De={Distortions:{icon:`fx_distortion`,color:M.red},Dynamics:{icon:`fx_compressor`,color:M.green},Modulations:{icon:`fx_modulator`,color:M.blue},Delays:{icon:`fx_delay`,color:`#60A0E0`},Reverbs:{icon:`fx_reverb`,color:`#60C0D0`},Filters:{icon:`fx_filter`,color:`#D0A060`},Amps:{icon:`fx_amplifier`,color:`#E0A040`},Preamps:{icon:`fx_simulator`,color:`#D08040`},Cabs:{icon:`fx_spatial`,color:`#D07090`},IRs:{icon:`fx_spatial`,color:`#70B090`},"Pitch/Synth":{icon:`fx_pitch`,color:`#A060E0`},"Volume/Pan":{icon:`fx_constant`,color:M.textSec},Looper:{icon:`fx_oscillator`,color:`#80D0A0`},"Send/Return":{icon:`fx_lr`,color:`#9090C0`},Special:{icon:`fx_utility`,color:`#B080C0`}},Oe=[`Distortions`,`Dynamics`,`Modulations`,`Delays`,`Reverbs`,`Filters`,`Amps`,`Preamps`,`Cabs`,`IRs`,`Pitch/Synth`,`Volume/Pan`,`Looper`,`Send/Return`,`Special`],ke=[`Preamps`,`Pitch/Synth`],Ae={od:M.amber,overdrive:M.amber,drive:M.amber,dist:M.red,distortion:M.red,fuzz:`#D060E0`,mod:M.blue,chorus:M.blue,flange:M.blue,phaser:M.blue,tremolo:M.blue,vibrato:M.blue,rotary:M.blue,delay:`#60A0E0`,echo:`#60A0E0`,reverb:`#60C0D0`,pitch:`#A060E0`,comp:M.green,compressor:M.green,gate:M.green,filter:`#D0A060`,wah:`#D0A060`,eq:`#80A0B0`,ir:M.green,cab:M.green,nam:`#E0A040`,volume:M.textSec,boost:M.amber,split:`#B080C0`,merge:`#80B0C0`},je={od:`fx_distortion`,overdrive:`fx_distortion`,drive:`fx_distortion`,dist:`fx_distortion`,distortion:`fx_distortion`,gain:`fx_distortion`,fuzz:`fx_distortion`,delay:`fx_delay`,echo:`fx_delay`,reverb:`fx_reverb`,chorus:`fx_chorus`,flange:`fx_flanger`,flanger:`fx_flanger`,phaser:`fx_phaser`,tremolo:`fx_modulator`,vibrato:`fx_modulator`,rotary:`fx_modulator`,modulator:`fx_modulator`,pitch:`fx_pitch`,harmonizer:`fx_pitch`,shifter:`fx_pitch`,comp:`fx_compressor`,compressor:`fx_compressor`,limiter:`fx_limiter`,gate:`fx_gate`,noise_gate:`fx_gate`,filter:`fx_filter`,wah:`fx_filter`,eq:`fx_eq`,graphic_eq:`fx_eq`,parametric_eq:`fx_parametric_eq`,multiband_eq:`fx_multiband_eq`,ir:`fx_spatial`,cab:`fx_spatial`,cabinet:`fx_spatial`,nam:`fx_simulator`,capture:`fx_simulator`,amp:`fx_amplifier`,amplifier:`fx_amplifier`,volume:`fx_constant`,level:`fx_constant`,boost:`fx_constant`,split:`fx_split_a`,merge:`fx_mixer`,tuner:`fx_analyzer`,mixer:`fx_mixer`,utility:`fx_utility`,plugin:`fx_plugin`,instrument:`fx_instrument`,looper:`fx_oscillator`,converter:`fx_converter`,reamp:`fx_converter`,lr:`fx_lr`},Me=[{type:`overdrive`,name:`OD-808`,category:`Distortions`,desc:`Classic overdrive`},{type:`distortion`,name:`RAT`,category:`Distortions`,desc:`Aggressive distortion`},{type:`fuzz`,name:`Big Muff`,category:`Distortions`,desc:`Thick fuzz sustain`},{type:`boost`,name:`Clean Boost`,category:`Distortions`,desc:`Clean level boost`},{type:`compressor`,name:`Compressor`,category:`Dynamics`,desc:`Dynamic range control`},{type:`gate`,name:`Noise Gate`,category:`Dynamics`,desc:`Noise suppression`},{type:`chorus`,name:`Chorus`,category:`Modulations`,desc:`Rich chorus effect`},{type:`flanger`,name:`Flanger`,category:`Modulations`,desc:`Jet plane sweep`},{type:`phaser`,name:`Phase 90`,category:`Modulations`,desc:`Iconic phase shift`},{type:`tremolo`,name:`Tremolo`,category:`Modulations`,desc:`Volume modulation`},{type:`delay`,name:`Digital Delay`,category:`Delays`,desc:`Clean digital repeats`},{type:`echo`,name:`Tape Echo`,category:`Delays`,desc:`Warm tape repeats`},{type:`reverb`,name:`Hall Reverb`,category:`Reverbs`,desc:`Lush hall reverb`},{type:`eq`,name:`Equalizer`,category:`Filters`,desc:`3-band tone control`},{type:`wah`,name:`Wah`,category:`Filters`,desc:`Crybaby wah`},{type:`volume`,name:`Volume Pedal`,category:`Volume/Pan`,desc:`Volume control`},{type:`looper`,name:`Looper`,category:`Looper`,desc:`Simple loop recorder`},{type:`split`,name:`Split`,category:`Special`,desc:`Parallel routing`},{type:`merge`,name:`Merge`,category:`Special`,desc:`Sum parallel paths`},{type:`tuner`,name:`Tuner`,category:`Special`,desc:`Instrument tuner`},{type:`loop`,name:`FX Loop`,category:`Send/Return`,desc:`External FX send/return`},{type:`cabinet`,name:`Cabinet`,category:`Cabs`,desc:`Speaker cabinet sim`},{type:`ir`,name:`IR Loader`,category:`IRs`,desc:`Impulse response loader`},{type:`nam`,name:`NAM Model`,category:`Amps`,desc:`Neural amp model`}];function Ne(e){let t=(e||``).toLowerCase().trim();for(let[e,n]of Object.entries(je))if(t===e||t.startsWith(e)||t.includes(e))return n;return`fx_plugin`}function Pe(e){let t=(e||``).toLowerCase().trim();for(let[e,n]of Object.entries(Ae))if(t===e||t.startsWith(e)||t.includes(e))return n;return M.amber}function Fe({category:e,size:t=14}){let n=De[e];return n?(0,f.jsx)(`img`,{src:`${Ee}${n.icon}.svg`,alt:e,style:{width:t,height:t,flexShrink:0,filter:`invert(0.95) brightness(2)`,objectFit:`contain`},onError:e=>{e.target.style.display=`none`}}):null}function Ie({currentBlockType:e,currentBlockName:t,currentModelPath:n,onSelectModel:r,onClose:i}){let[a,o]=(0,l.useState)(`All`),[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)([]),[p,m]=(0,l.useState)(()=>{try{let e=localStorage.getItem(`helix_model_favorites`);return e?JSON.parse(e):[]}catch{return[]}}),h=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await fetch(`/api/models`).then(e=>e.json());e||d(t.models||[])}catch{}})(),()=>{e=!0}},[]);let g=(0,l.useCallback)(e=>{m(t=>{let n=t.includes(e)?t.filter(t=>t!==e):[...t,e];return localStorage.setItem(`helix_model_favorites`,JSON.stringify(n)),n})},[]),_=n||(e?`builtin:${e}`:null),v=(0,l.useMemo)(()=>{let e=[];for(let t of Me)e.push({id:`builtin:${t.type}`,type:t.type,name:t.name,category:t.category,desc:t.desc,isBuiltin:!0,iconType:t.type});for(let t of u){let n=t.name||t.filename||`Unnamed Model`;e.push({id:`nam:${n}`,type:`nam`,name:n,category:`Amps`,desc:t.architecture?`${t.architecture} · ${t.size_mb}MB`:`Installed NAM model`,isBuiltin:!1,loaded:t.loaded,modelPath:t.path||t.filename,iconType:`nam`})}return e},[u]),y=(0,l.useMemo)(()=>a===`All`?[...Oe].filter(e=>ke.includes(e)?v.some(t=>t.category===e&&!t.isBuiltin):v.some(t=>t.category===e)):a===`★Favorites`?[]:[a],[a,v]),b=(0,l.useMemo)(()=>{let e=v;if(a===`★Favorites`?e=e.filter(e=>p.includes(e.id)):a!==`All`&&(e=e.filter(e=>e.category===a)),s.trim()){let t=s.toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.type.toLowerCase().includes(t)||(e.desc||``).toLowerCase().includes(t)||(e.category||``).toLowerCase().includes(t))}return e},[v,a,s,p]),x=(0,l.useMemo)(()=>{if(a!==`All`&&a!==`★Favorites`)return null;let e={};for(let t of b)e[t.category]||(e[t.category]=[]),e[t.category].push(t);return e},[b,a]),S=(0,l.useCallback)(e=>{r?.({type:e.type,name:e.name,modelPath:e.isBuiltin?null:e.modelPath||e.id,isBuiltin:e.isBuiltin}),i?.()},[r,i]),C=[`All`,`★Favorites`,...Oe.filter(e=>ke.includes(e)?v.some(t=>t.category===e&&!t.isBuiltin):v.some(t=>t.category===e))];return(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:1e3,display:`flex`,flexDirection:`column`,background:M.bg,color:M.textPrimary,fontFamily:`'Inter', sans-serif`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${M.border}`,background:M.panel,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,f.jsx)(`button`,{onClick:i,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:M.surface,border:`1px solid ${M.border}`,color:M.textPrimary,fontSize:16,cursor:`pointer`},children:`✕`}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600},children:`Model Browser`}),t&&(0,f.jsxs)(`div`,{style:{fontSize:10,color:M.textSec,marginTop:1},children:[`Current: `,t]})]})]})}),(0,f.jsx)(`div`,{style:{padding:`8px 14px`,borderBottom:`1px solid ${M.border}`,background:M.surface,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,background:M.panel,borderRadius:7,border:`1px solid ${M.border}`,padding:`7px 10px`},children:[(0,f.jsx)(`span`,{style:{color:M.textDim,fontSize:13},children:`🔍`}),(0,f.jsx)(`input`,{ref:h,placeholder:`Search models...`,value:s,onChange:e=>c(e.target.value),style:{flex:1,background:`none`,border:`none`,color:M.textPrimary,fontSize:13,outline:`none`}}),s&&(0,f.jsx)(`button`,{onClick:()=>c(``),style:{background:`none`,border:`none`,color:M.textDim,fontSize:14,cursor:`pointer`,padding:2},children:`✕`})]})}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:0,overflowX:`auto`,overflowY:`hidden`,borderBottom:`1px solid ${M.border}`,background:M.panel,flexShrink:0,WebkitOverflowScrolling:`touch`},children:C.map(e=>{let t=De[e],n=a===e;return(0,f.jsxs)(`button`,{onClick:()=>o(e),style:{padding:`8px 12px`,fontSize:10,fontWeight:600,letterSpacing:`.04em`,whiteSpace:`nowrap`,background:`none`,border:`none`,borderBottom:`2px solid ${n?M.amber:`transparent`}`,color:n?M.textPrimary:M.textSec,cursor:`pointer`,display:`flex`,alignItems:`center`,gap:5,flexShrink:0,transition:`all .12s`},children:[t&&(0,f.jsx)(Fe,{category:e,size:12}),e===`★Favorites`&&(0,f.jsx)(`span`,{children:`★`}),e===`★Favorites`?` Favorites`:e]},e)})}),(0,f.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`10px 14px`,WebkitOverflowScrolling:`touch`},children:[a===`★Favorites`&&b.length===0&&(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,padding:`40px 20px`,gap:8,color:M.textDim},children:[(0,f.jsx)(`span`,{style:{fontSize:28},children:`☆`}),(0,f.jsx)(`div`,{style:{fontSize:13,fontWeight:500},children:`No favorites yet`}),(0,f.jsx)(`div`,{style:{fontSize:11,textAlign:`center`},children:`Star a model to add it to your favorites`})]}),s&&b.length===0&&(0,f.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,padding:`40px 20px`,gap:8,color:M.textDim},children:(0,f.jsxs)(`div`,{style:{fontSize:13},children:[`No models matching "`,s,`"`]})}),x?y.map(e=>{let t=x[e]||[];if(t.length===0)return null;let n=De[e];return(0,f.jsxs)(`div`,{style:{marginBottom:20},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,marginBottom:8},children:[n&&(0,f.jsx)(Fe,{category:e,size:16}),(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:700,letterSpacing:`.08em`,textTransform:`uppercase`,color:M.textSec},children:e}),(0,f.jsx)(`div`,{style:{flex:1,height:1,background:M.border,opacity:.4}})]}),(0,f.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fill, minmax(130px, 1fr))`,gap:6},children:t.map(e=>(0,f.jsx)(Le,{model:e,isCurrent:e.id===_,isFavorite:p.includes(e.id),onSelect:()=>S(e),onToggleFav:()=>g(e.id)},e.id))})]},e)}):(0,f.jsx)(f.Fragment,{children:b.length>0&&(0,f.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fill, minmax(130px, 1fr))`,gap:6},children:b.map(e=>(0,f.jsx)(Le,{model:e,isCurrent:e.id===_,isFavorite:p.includes(e.id),onSelect:()=>S(e),onToggleFav:()=>g(e.id)},e.id))})})]})]})}function Le({model:e,isCurrent:t,isFavorite:n,onSelect:r,onToggleFav:i}){let a=Pe(e.type),[o,s]=(0,l.useState)(!1);return(0,f.jsxs)(`div`,{onClick:r,style:{display:`flex`,flexDirection:`column`,gap:0,padding:`10px 8px 8px`,borderRadius:8,background:t?`linear-gradient(135deg, ${a}18, ${M.panel})`:M.surface,border:`1.5px solid ${t?a+`66`:M.border}`,cursor:`pointer`,position:`relative`,transition:`all .12s`,boxShadow:t?`0 0 12px ${a}33`:`none`,minHeight:72},children:[(0,f.jsx)(`div`,{onClick:e=>{e.stopPropagation(),i()},style:{position:`absolute`,top:4,right:4,fontSize:13,cursor:`pointer`,zIndex:2,color:n?M.amber:M.textDim,textShadow:n?`0 0 4px ${M.amber}`:`none`,transition:`all .15s`,lineHeight:1},children:n?`★`:`☆`}),(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,height:34,marginBottom:6},children:o?(0,f.jsx)(`span`,{style:{fontSize:18,color:a,opacity:.7,fontFamily:`'JetBrains Mono', monospace`,fontWeight:700},children:e.name.charAt(0)}):(0,f.jsx)(`img`,{src:`${Ee}${Ne(e.iconType||e.type)}.svg`,alt:e.type,style:{width:28,height:28,filter:`invert(0.95) brightness(2) drop-shadow(0 0 4px ${a}44)`,objectFit:`contain`},onError:()=>s(!0)})}),(0,f.jsx)(`div`,{style:{fontSize:11,fontWeight:600,color:t?a:M.textPrimary,textAlign:`center`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,lineHeight:1.3},children:e.name}),(0,f.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,marginTop:3},children:(0,f.jsx)(`span`,{style:{display:`inline-flex`,padding:`1px 5px`,borderRadius:3,fontSize:8,fontWeight:700,letterSpacing:`.05em`,textTransform:`uppercase`,background:`${a}18`,color:a},children:e.type.replace(/_/g,` `)})}),e.desc&&(0,f.jsx)(`div`,{style:{fontSize:8,color:M.textDim,textAlign:`center`,marginTop:3,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:e.desc}),t&&(0,f.jsx)(`div`,{style:{position:`absolute`,top:4,left:4,width:6,height:6,borderRadius:`50%`,background:M.green,boxShadow:`0 0 6px ${M.green}`}})]})}var Re={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},ze=[{id:`save`,label:`Save Preset`,icon:`💾`,desc:`Save current preset to bank`},{id:`bypass`,label:`Bypass/Control`,icon:`🔌`,desc:`Footswitch & pedal assignment`},{id:`routing`,label:`Routing`,icon:`🔀`,desc:`Mono / 4-cable-method routing`},{id:`settings`,label:`Global Settings`,icon:`⚙`,desc:`Master volume, input, MIDI, display`},{id:`eq`,label:`Global EQ`,icon:`📊`,desc:`Low, Mid, High shelving EQ`},{id:`tuner`,label:`Tuner`,icon:`🎵`,desc:`Instrument tuner`},{id:`wifi`,label:`Wi-Fi / Bluetooth`,icon:`📶`,desc:`Wireless & network settings`}];function Be({onClose:e,onItemSelect:t}){let n=(0,l.useRef)(null);return(0,l.useEffect)(()=>{let e=n.current;e&&requestAnimationFrame(()=>{e.style.transform=`translateX(0)`})},[]),(0,f.jsx)(`div`,{onClick:t=>{t.target===t.currentTarget&&e?.()},style:{position:`fixed`,inset:0,zIndex:999,display:`flex`,background:`rgba(0,0,0,0.55)`,transition:`background .2s ease`},children:(0,f.jsxs)(`div`,{ref:n,style:{width:260,maxWidth:`75vw`,height:`100%`,background:Re.panel,borderRight:`1px solid ${Re.border}`,display:`flex`,flexDirection:`column`,boxShadow:`4px 0 24px rgba(0,0,0,0.5)`,transform:`translateX(-100%)`,transition:`transform .22s cubic-bezier(.22,.61,.36,1)`},children:[(0,f.jsxs)(`div`,{style:{padding:`14px 16px`,borderBottom:`1px solid ${Re.border}`,display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexShrink:0},children:[(0,f.jsx)(`div`,{style:{fontSize:14,fontWeight:600,color:Re.textPrimary},children:`☰ Menu`}),(0,f.jsx)(`button`,{onClick:e,style:{width:28,height:28,borderRadius:6,display:`flex`,alignItems:`center`,justifyContent:`center`,background:Re.surface,border:`1px solid ${Re.border}`,color:Re.textSec,fontSize:13,cursor:`pointer`},children:`✕`})]}),(0,f.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:`8px 0`},children:ze.map(e=>(0,f.jsxs)(`button`,{onClick:()=>t?.(e.id),style:{width:`100%`,display:`flex`,alignItems:`center`,gap:12,padding:`12px 16px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,color:Re.textPrimary,transition:`background .1s`,borderBottom:`1px solid ${Re.border}33`},onMouseEnter:e=>{e.currentTarget.style.background=Re.surface},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,f.jsx)(`div`,{style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:Re.surface,border:`1px solid ${Re.border}`,fontSize:16,flexShrink:0},children:e.icon}),(0,f.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,f.jsx)(`div`,{style:{fontSize:13,fontWeight:600,color:Re.textPrimary},children:e.label}),(0,f.jsx)(`div`,{style:{fontSize:10,color:Re.textDim,marginTop:1,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:e.desc})]}),(0,f.jsx)(`span`,{style:{color:Re.textDim,fontSize:11},children:`›`})]},e.id))}),(0,f.jsx)(`div`,{style:{padding:`12px 16px`,borderTop:`1px solid ${Re.border}`,flexShrink:0},children:(0,f.jsx)(`div`,{style:{fontSize:9,color:Re.textDim,textAlign:`center`,letterSpacing:`.06em`},children:`Helix Stadium v0.1`})})]})})}var N={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},Ve={Audio:[{key:`master_volume`,label:`Master Volume`,type:`slider`,min:0,max:100,def:72,unit:`%`,icon:`🔊`},{key:`input_pad`,label:`Input Pad`,type:`select`,def:`off`,options:[{value:`off`,label:`Off (0 dB)`},{value:`-6`,label:`-6 dB`},{value:`-12`,label:`-12 dB`},{value:`-18`,label:`-18 dB`}],icon:`📥`},{key:`input_impedance`,label:`Input Impedance`,type:`select`,def:`1m`,options:[{value:`1m`,label:`1 MΩ`},{value:`500k`,label:`500 kΩ`},{value:`250k`,label:`250 kΩ`},{value:`150k`,label:`150 kΩ`},{value:`68k`,label:`68 kΩ`}],icon:`⚡`}],MIDI:[{key:`midi_channel`,label:`MIDI Channel`,type:`select`,def:`omni`,options:[{value:`omni`,label:`Omni`},...Array.from({length:16},(e,t)=>({value:String(t+1),label:`Channel ${t+1}`}))],icon:`🎹`},{key:`midi_clock`,label:`MIDI Clock`,type:`toggle`,def:!1,icon:`⏱`},{key:`midi_thru`,label:`MIDI Thru`,type:`toggle`,def:!0,icon:`↔`}],Display:[{key:`brightness`,label:`Display Brightness`,type:`slider`,min:1,max:10,def:8,unit:``,icon:`☀️`},{key:`auto_dim`,label:`Auto Dim`,type:`toggle`,def:!0,icon:`🌙`},{key:`screen_saver`,label:`Screen Saver`,type:`select`,def:`5m`,options:[{value:`off`,label:`Off`},{value:`1m`,label:`1 min`},{value:`5m`,label:`5 min`},{value:`15m`,label:`15 min`},{value:`30m`,label:`30 min`}],icon:`💤`}],Tempo:[{key:`tap_tempo`,label:`Tap Tempo`,type:`bpm`,def:120,icon:`🔄`},{key:`tempo_division`,label:`Tempo Division`,type:`select`,def:`quarter`,options:[{value:`half`,label:`½ Note`},{value:`quarter`,label:`¼ Note`},{value:`eighth`,label:`⅛ Note`},{value:`triplet`,label:`⅛ Triplet`},{value:`sixteenth`,label:`¹⁄₁₆ Note`},{value:`dotted_eighth`,label:`Dotted ⅛`}],icon:`🎶`},{key:`tap_tempo_mute`,label:`Mute on Tap`,type:`toggle`,def:!1,icon:`🔇`}]};function He({label:e,value:t,min:n,max:r,unit:i,onChange:a}){let o=(0,l.useRef)(null),s=(0,l.useRef)(!1),c=(t-n)/(r-n)*100,u=(0,l.useCallback)(e=>{let i=o.current;if(!i)return t;let a=i.getBoundingClientRect(),s=(e.touches?e.touches[0].clientX:e.clientX)-a.left;return Math.round(n+Math.max(0,Math.min(1,s/a.width))*(r-n))},[n,r,t]);(0,l.useEffect)(()=>{let e=e=>{s.current&&(e.preventDefault(),a?.(u(e)))},t=()=>{s.current=!1};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),window.addEventListener(`touchmove`,e,{passive:!1}),window.addEventListener(`touchend`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t),window.removeEventListener(`touchmove`,e),window.removeEventListener(`touchend`,t)}},[u,a]);let d=e=>{e.preventDefault(),s.current=!0,a?.(u(e))},p=e=>i=>{i.preventDefault(),i.stopPropagation(),a?.(Math.max(n,Math.min(r,t+e)))};return(0,f.jsxs)(`div`,{children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:4},children:[(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:500,color:N.textSec},children:e}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:6,alignItems:`center`},children:[(0,f.jsx)(`button`,{style:{width:26,height:26,borderRadius:`50%`,border:`1px solid ${N.border}`,background:N.panel,color:N.textPrimary,fontSize:14,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`,lineHeight:1},onMouseDown:p(-1),onTouchStart:p(-1),children:`−`}),(0,f.jsxs)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:14,fontWeight:700,color:N.amber,minWidth:36,textAlign:`center`},children:[t,i]}),(0,f.jsx)(`button`,{style:{width:26,height:26,borderRadius:`50%`,border:`1px solid ${N.border}`,background:N.panel,color:N.textPrimary,fontSize:14,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`,lineHeight:1},onMouseDown:p(1),onTouchStart:p(1),children:`+`})]})]}),(0,f.jsxs)(`div`,{ref:o,onMouseDown:d,onTouchStart:d,style:{position:`relative`,height:32,display:`flex`,alignItems:`center`,cursor:`pointer`,touchAction:`none`},children:[(0,f.jsx)(`div`,{style:{width:`100%`,height:6,background:N.border,borderRadius:3,position:`relative`,overflow:`hidden`},children:(0,f.jsx)(`div`,{style:{height:`100%`,borderRadius:3,position:`absolute`,top:0,left:0,width:`${c}%`,background:N.amber,boxShadow:`0 0 6px ${N.amber}44`,transition:`width .03s`}})}),(0,f.jsx)(`div`,{style:{width:24,height:24,borderRadius:`50%`,position:`absolute`,top:`50%`,left:`${c}%`,transform:`translate(-50%,-50%)`,background:N.amber,border:`3px solid ${N.bg}`,boxShadow:`0 1px 6px rgba(0,0,0,.5)`,pointerEvents:`none`,transition:`left .03s`}})]})]})}function Ue({label:e,value:t,options:n,onChange:r,icon:i}){return(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:6},children:(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:500,color:N.textSec},children:e})}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,flexWrap:`wrap`,background:N.panel,borderRadius:6,padding:4},children:n.map(e=>(0,f.jsx)(`button`,{onClick:()=>r?.(e.value),style:{flex:1,padding:`6px 8px`,borderRadius:4,border:`none`,fontSize:10,fontWeight:600,cursor:`pointer`,background:t===e.value?N.amber:`transparent`,color:t===e.value?`#000`:N.textSec,transition:`all .1s`,letterSpacing:`.03em`,whiteSpace:`nowrap`,minWidth:0},children:e.label},e.value))})]})}function We({label:e,value:t,onChange:n}){return(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`4px 0`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:500,color:N.textSec},children:e}),(0,f.jsx)(`button`,{onClick:()=>n?.(!t),style:{width:44,height:24,borderRadius:12,background:t?N.amber:N.border,border:`none`,cursor:`pointer`,position:`relative`,transition:`background .15s`},children:(0,f.jsx)(`div`,{style:{width:18,height:18,borderRadius:`50%`,background:`#fff`,position:`absolute`,top:3,left:t?23:3,transition:`left .15s`,boxShadow:`0 1px 3px rgba(0,0,0,.3)`}})})]})}function Ge({label:e,value:t,onChange:n}){let r=(0,l.useRef)([]),i=(0,l.useCallback)(()=>{let e=Date.now();if(r.current.push(e),r.current.length>4&&r.current.shift(),r.current.length<2)return;let t=[];for(let e=1;ee+t,0)/t.length,a=Math.max(20,Math.min(300,Math.round(6e4/i)));n?.(a)},[n]);return(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:6},children:(0,f.jsx)(`span`,{style:{fontSize:11,fontWeight:500,color:N.textSec},children:e})}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:8,alignItems:`center`},children:[(0,f.jsx)(`button`,{onClick:i,style:{padding:`8px 20px`,borderRadius:8,border:`1px solid ${N.amber}66`,background:`${N.amber}15`,color:N.amber,fontSize:12,fontWeight:700,cursor:`pointer`,letterSpacing:`.05em`},children:`TAP`}),(0,f.jsxs)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,gap:4,background:N.surface,borderRadius:6,border:`1px solid ${N.border}`,padding:`6px 10px`},children:[(0,f.jsx)(`button`,{onClick:()=>n?.(Math.max(20,t-1)),style:{background:`none`,border:`none`,color:N.textDim,fontSize:14,cursor:`pointer`,padding:`0 4px`},children:`−`}),(0,f.jsxs)(`span`,{style:{flex:1,textAlign:`center`,fontFamily:`'JetBrains Mono', monospace`,fontSize:16,fontWeight:700,color:N.amber},children:[t,` BPM`]}),(0,f.jsx)(`button`,{onClick:()=>n?.(Math.min(300,t+1)),style:{background:`none`,border:`none`,color:N.textDim,fontSize:14,cursor:`pointer`,padding:`0 4px`},children:`+`})]})]})]})}function Ke({onClose:e,onMasterVolume:t}){let[n,r]=(0,l.useState)(()=>{let e={};for(let t of Object.values(Ve))for(let n of t)e[n.key]=n.def;return e}),i=Object.entries(Ve),a=(0,l.useCallback)((e,n)=>{r(t=>({...t,[e]:n})),e===`master_volume`&&t?.(n)},[t]);return(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:998,display:`flex`,flexDirection:`column`,background:N.bg,color:N.textPrimary,fontFamily:`'Inter', sans-serif`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${N.border}`,background:N.panel,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,f.jsx)(`button`,{onClick:e,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:N.surface,border:`1px solid ${N.border}`,color:N.textPrimary,fontSize:16,cursor:`pointer`},children:`✕`}),(0,f.jsx)(`div`,{children:(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600},children:`Global Settings`})})]})}),(0,f.jsx)(`div`,{style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`6px 14px 20px`},children:i.map(([e,t])=>(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:N.textDim,padding:`14px 0 8px`},children:e}),(0,f.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:12,background:N.surface,borderRadius:8,border:`1px solid ${N.border}`,padding:`12px 14px`},children:t.map(e=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`flex-start`,gap:10},children:[(0,f.jsx)(`div`,{style:{width:28,height:28,borderRadius:6,flexShrink:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:N.panel,fontSize:13},children:e.icon}),(0,f.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[e.type===`slider`&&(0,f.jsx)(He,{label:e.label,value:n[e.key]??e.def,min:e.min,max:e.max,unit:e.unit,onChange:t=>a(e.key,t)}),e.type===`select`&&(0,f.jsx)(Ue,{label:e.label,value:n[e.key]??e.def,options:e.options,onChange:t=>a(e.key,t)}),e.type===`toggle`&&(0,f.jsx)(We,{label:e.label,value:n[e.key]??e.def,onChange:t=>a(e.key,t)}),e.type===`bpm`&&(0,f.jsx)(Ge,{label:e.label,value:n[e.key]??e.def,onChange:t=>a(e.key,t)})]})]},e.key))})]},e))})]})}var P={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},qe=[{key:`low`,label:`Low`,freq:`80 Hz`,color:`#60A0E0`,shadow:`#60A0E044`},{key:`mid`,label:`Mid`,freq:`800 Hz`,color:P.amber,shadow:`${P.amber}44`},{key:`high`,label:`High`,freq:`6.4 kHz`,color:`#60D080`,shadow:`#60D08044`}];function Je({label:e,freq:t,value:n,min:r,max:i,color:a,onChange:o}){let s=(0,l.useRef)(null),c=(n-r)/(i-r),u=-140+c*280,d=80*.38,p=e=>{e.preventDefault(),s.current={y:e.touches?e.touches[0].clientY:e.clientY,val:n};let t=e=>{let t=e.touches?e.touches[0].clientY:e.clientY,n=(s.current.y-t)/120,a=Math.max(r,Math.min(i,s.current.val+n*(i-r)));o?.(Math.round(a*10)/10)},a=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,a),window.removeEventListener(`touchmove`,t),window.removeEventListener(`touchend`,a)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,a),window.addEventListener(`touchmove`,t,{passive:!1}),window.addEventListener(`touchend`,a)},m=48+44*Math.cos(Math.PI/180*-230),h=48+44*Math.sin(Math.PI/180*-230),g=48+44*Math.cos((u-90)*(Math.PI/180)),_=48+44*Math.sin((u-90)*(Math.PI/180)),v=+(c*280>180);return(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:4,cursor:`pointer`,minWidth:0},children:[(0,f.jsxs)(`div`,{style:{width:80,height:80,position:`relative`,touchAction:`none`},onMouseDown:p,onTouchStart:p,children:[(0,f.jsxs)(`svg`,{style:{position:`absolute`,inset:-8,width:96,height:96,overflow:`visible`},children:[(0,f.jsx)(`circle`,{cx:48,cy:48,r:44,fill:`none`,stroke:P.border,strokeWidth:`3`,strokeLinecap:`round`,opacity:`.5`}),c>0&&(0,f.jsx)(`path`,{d:`M ${m} ${h} A 44 44 0 ${v} 1 ${g} ${_}`,fill:`none`,stroke:a,strokeWidth:`3`,strokeLinecap:`round`,style:{filter:`drop-shadow(0 0 4px ${a})`}})]}),(0,f.jsx)(`div`,{style:{borderRadius:`50%`,width:`100%`,height:`100%`,position:`relative`,background:`radial-gradient(circle at 35% 30%, #3A3A48, #1A1A22)`,boxShadow:`0 3px 12px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.07)`},children:(0,f.jsx)(`div`,{style:{position:`absolute`,width:4,borderRadius:2,background:a,left:`50%`,transformOrigin:`bottom center`,height:d,top:9.600000000000001,transform:`translateX(-50%) rotate(${u}deg)`,transformOrigin:`50% ${d}px`,boxShadow:`0 0 6px ${a}`}})})]}),(0,f.jsxs)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:14,fontWeight:700,color:a},children:[n>0?`+${n}`:n,` dB`]}),(0,f.jsx)(`div`,{style:{fontSize:8,color:P.textDim,letterSpacing:`.08em`,textTransform:`uppercase`},children:e}),(0,f.jsx)(`div`,{style:{fontSize:8,color:P.textDim,fontFamily:`'JetBrains Mono', monospace`},children:t})]})}function Ye({bands:e,values:t}){let n=(0,l.useRef)(null);return(0,l.useEffect)(()=>{let r=n.current;if(!r)return;let i=r.getContext(`2d`),a=r.width,o=r.height,s={top:10,bottom:10,left:20,right:10},c=a-s.left-s.right,l=o-s.top-s.bottom;i.clearRect(0,0,a,o),i.strokeStyle=P.border,i.lineWidth=.5;for(let e=-12;e<=12;e+=4){let t=s.top+l*(1-(e+12)/24);i.beginPath(),i.moveTo(s.left,t),i.lineTo(a-s.right,t),i.stroke(),i.fillStyle=P.textDim,i.font=`7px 'JetBrains Mono', monospace`,i.textAlign=`right`,i.fillText(`${e>0?`+`:``}${e}`,s.left-2,t+2)}let u={low:s.left+c*.1,mid:s.left+c*.5,high:s.left+c*.9},d={};e.forEach((e,t)=>{d[e.key]=t});let f=e.map(e=>t[e.key]??0),p=[],m=[];for(let t=0;t<=100;t++){let n=t/100,r=s.left+c*n;e.map((e,t)=>({x:u[e.key],y:-(f[t]||0)}));let i=0;if(n<.1)i=f[0]*(n/.1);else if(n>.9)i=f[2]*((1-n)/.1);else{let e=(n-.1)/.8,t=f[0],r=f[1],a=f[2];i=(1-e)*(1-e)*t+2*(1-e)*e*r+e*e*a}let a=s.top+l*(.5-i/24);p.push(r),m.push(a)}i.beginPath(),i.moveTo(p[0],s.top+l);for(let e=0;e{let t=u[e.key],n=f[d[e.key]]||0,r=s.top+l*(.5-n/24);i.beginPath(),i.arc(t,r,5,0,Math.PI*2),i.fillStyle=e.color,i.fill(),i.strokeStyle=P.bg,i.lineWidth=2,i.stroke()}),i.fillStyle=P.textDim,i.font=`7px 'JetBrains Mono', monospace`,i.textAlign=`center`,i.fillText(`80Hz`,u.low,o-2),i.fillText(`800Hz`,u.mid,o-2),i.fillText(`6.4kHz`,u.high,o-2)},[e,t]),(0,f.jsx)(`canvas`,{ref:n,width:320,height:160,style:{width:`100%`,height:140,borderRadius:8,background:P.panel,border:`1px solid ${P.border}`}})}function Xe({onClose:e}){let[t,n]=(0,l.useState)({low:0,mid:0,high:0}),r=(0,l.useCallback)((e,t)=>{n(n=>({...n,[e]:t}))},[]);return(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:998,display:`flex`,flexDirection:`column`,background:P.bg,color:P.textPrimary,fontFamily:`'Inter', sans-serif`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${P.border}`,background:P.panel,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,f.jsx)(`button`,{onClick:e,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:P.surface,border:`1px solid ${P.border}`,color:P.textPrimary,fontSize:16,cursor:`pointer`},children:`✕`}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600},children:`Global EQ`}),(0,f.jsx)(`div`,{style:{fontSize:10,color:P.textSec,marginTop:1},children:`3-band shelving equalizer`})]})]})}),(0,f.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`8px 14px`,display:`flex`,flexDirection:`column`,gap:12},children:[(0,f.jsx)(Ye,{bands:qe,values:t}),(0,f.jsx)(`div`,{style:{display:`flex`,justifyContent:`space-around`,gap:8,background:P.surface,borderRadius:8,border:`1px solid ${P.border}`,padding:`16px 8px`},children:qe.map(e=>(0,f.jsx)(Je,{label:e.label,freq:e.freq,value:t[e.key],min:-12,max:12,color:e.color,onChange:t=>r(e.key,t)},e.key))}),(0,f.jsx)(`button`,{onClick:()=>n({low:0,mid:0,high:0}),style:{width:`100%`,padding:`10px 14px`,borderRadius:8,background:P.surface,border:`1px solid ${P.border}`,color:P.textSec,fontSize:11,fontWeight:600,cursor:`pointer`,letterSpacing:`.06em`},children:`Reset EQ to Flat`})]})]})}var F={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},Ze=``;async function Qe(e,t,n){let r={method:e,headers:{"Content-Type":`application/json`}};n&&(r.body=JSON.stringify(n));let i=await fetch(`${Ze}${t}`,r);if(!i.ok)throw Error(`API ${e} ${t}: ${i.status}`);return i.json()}var $e={"hw:0,0":{name:`Scarlett 2i2 USB`,channels:{in:[`Input 1 — Instrument (Front)`,`Input 2 — Line (Rear)`],out:[`Output 1 — Main L (Rear)`,`Output 2 — Main R (Rear)`]}},"hw:USB":{name:`Scarlett 2i2 USB`,channels:{in:[`Input 1 — Instrument (Front)`,`Input 2 — Line (Rear)`],out:[`Output 1 — Main L (Rear)`,`Output 2 — Main R (Rear)`]}}};function et({onClose:e}){let[t,n]=(0,l.useState)(`mono`),[r,i]=(0,l.useState)(0),[a,o]=(0,l.useState)(6),[s,c]=(0,l.useState)(!1),[u,d]=(0,l.useState)(!1),[p,m]=(0,l.useState)([]),[h,g]=(0,l.useState)(`hw:0,0`),[_,v]=(0,l.useState)(`hw:0,0`),[y,b]=(0,l.useState)({blockSize:0,sampleRate:0});(0,l.useEffect)(()=>{Qe(`GET`,`/api/routing`).then(e=>{n(e.routing_mode||`mono`),i(e.routing_breakpoint||0),e.input_device&&g(e.input_device),e.output_device&&v(e.output_device)}).catch(()=>{}),Qe(`GET`,`/api/state`).then(e=>{e.current_preset?.chain&&o(e.current_preset.chain.length)}).catch(()=>{}),Qe(`GET`,`/api/audio/devices`).then(e=>{e.devices&&m(e.devices),e.current&&(e.current.input&&g(e.current.input),e.current.output&&v(e.current.output)),e.jack&&b({blockSize:e.jack.blocksize||0,sampleRate:e.jack.samplerate||0})}).catch(()=>{})},[]);let x=(0,l.useCallback)(async()=>{c(!0);try{await Qe(`POST`,`/api/routing`,{routing_mode:t,routing_breakpoint:r,input_device:h,output_device:_}),d(!0),setTimeout(()=>d(!1),2e3)}catch(e){console.error(`Failed to save routing:`,e)}c(!1)},[t,r,h,_]),S=$e[h]||$e[`hw:0,0`];return(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:998,display:`flex`,flexDirection:`column`,background:F.bg,color:F.textPrimary,fontFamily:`'Inter', sans-serif`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${F.border}`,background:F.panel,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,f.jsx)(`button`,{onClick:e,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:F.surface,border:`1px solid ${F.border}`,color:F.textPrimary,fontSize:16,cursor:`pointer`},children:`✕`}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600},children:`Routing & I/O`}),(0,f.jsx)(`div`,{style:{fontSize:9,color:F.textDim,marginTop:1},children:`Audio interface & signal routing`})]})]})}),(0,f.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`6px 14px 20px`},children:[(0,f.jsxs)(`div`,{style:{background:F.surface,borderRadius:8,border:`1px solid ${F.border}`,padding:`12px 14px`,marginTop:14},children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:F.textDim,marginBottom:10},children:`Signal Flow`}),(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexWrap:`wrap`,fontSize:10},children:[(0,f.jsx)(`span`,{style:{background:F.blueDim,padding:`4px 8px`,borderRadius:4,color:F.blue,fontWeight:600},children:S.channels.in[0]}),(0,f.jsx)(`span`,{style:{color:F.textDim},children:`→`}),(0,f.jsx)(`span`,{style:{background:`${F.amber}22`,padding:`4px 8px`,borderRadius:4,color:F.amber,fontWeight:600},children:`FX Chain`}),(0,f.jsx)(`span`,{style:{color:F.textDim},children:`→`}),(0,f.jsx)(`span`,{style:{background:F.green,padding:`4px 8px`,borderRadius:4,color:`#000`,fontWeight:600},children:S.channels.out[0]})]}),(0,f.jsxs)(`div`,{style:{fontSize:9,color:F.textDim,marginTop:8},children:[`JACK: `,y.blockSize,` samples @ `,y.sampleRate,` Hz · `,(y.blockSize/Math.max(1,y.sampleRate)*1e3).toFixed(1),` ms latency`]})]}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:F.textDim,padding:`14px 0 8px`},children:`Audio Interface`}),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:10,background:F.surface,borderRadius:8,border:`1px solid ${F.border}`,padding:`12px 14px`},children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,color:F.textSec,marginBottom:4},children:`Input Device (Capture)`}),(0,f.jsx)(`select`,{value:h,onChange:e=>g(e.target.value),style:{width:`100%`,padding:`8px 10px`,borderRadius:6,background:F.panel,border:`1px solid ${F.border}`,color:F.textPrimary,fontSize:12,cursor:`pointer`,outline:`none`},children:p.length===0?(0,f.jsx)(`option`,{value:`hw:0,0`,children:`Focusrite Scarlett 2i2 (hw:0,0)`}):p.map(e=>(0,f.jsxs)(`option`,{value:e.alsa_id||e.name,children:[e.description||e.name,` (`,e.alsa_id||e.name,`)`]},e.alsa_id||e.name))}),(0,f.jsx)(`div`,{style:{marginTop:6,display:`flex`,flexDirection:`column`,gap:3},children:S.channels.in.map((e,t)=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,fontSize:9,color:F.textSec,padding:`3px 6px`,background:F.panel,borderRadius:4},children:[(0,f.jsx)(`span`,{style:{width:16,height:16,borderRadius:`50%`,background:F.blue,color:`#000`,fontSize:7,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`},children:t+1}),e]},t))})]}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,color:F.textSec,marginBottom:4},children:`Output Device (Playback)`}),(0,f.jsx)(`select`,{value:_,onChange:e=>v(e.target.value),style:{width:`100%`,padding:`8px 10px`,borderRadius:6,background:F.panel,border:`1px solid ${F.border}`,color:F.textPrimary,fontSize:12,cursor:`pointer`,outline:`none`},children:p.length===0?(0,f.jsx)(`option`,{value:`hw:0,0`,children:`Focusrite Scarlett 2i2 (hw:0,0)`}):p.map(e=>(0,f.jsxs)(`option`,{value:e.alsa_id||e.name,children:[e.description||e.name,` (`,e.alsa_id||e.name,`)`]},e.alsa_id||e.name))}),(0,f.jsx)(`div`,{style:{marginTop:6,display:`flex`,flexDirection:`column`,gap:3},children:S.channels.out.map((e,t)=>(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,fontSize:9,color:F.textSec,padding:`3px 6px`,background:F.panel,borderRadius:4},children:[(0,f.jsx)(`span`,{style:{width:16,height:16,borderRadius:`50%`,background:F.green,color:`#000`,fontSize:7,fontWeight:700,display:`flex`,alignItems:`center`,justifyContent:`center`},children:t+1}),e]},t))})]}),(0,f.jsx)(`div`,{style:{fontSize:9,color:F.textDim,marginTop:2},children:`Changes take effect after service restart (config saved to ~/.pedal/audio_device.json)`})]})]}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:F.textDim,padding:`14px 0 8px`},children:`Routing Mode`}),(0,f.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:12,background:F.surface,borderRadius:8,border:`1px solid ${F.border}`,padding:`12px 14px`},children:(0,f.jsx)(`div`,{style:{display:`flex`,gap:6},children:[{value:`mono`,label:`Mono`,icon:`🎸`,desc:`Input 1 → FX Chain → Output 1`},{value:`4cm`,label:`4CM`,icon:`🔗`,desc:`4-cable method — Input 1 (guitar) → pre-FX → Output 1 (amp input) · Input 2 (FX return) → post-FX → Output 2 (amp return)`}].map(e=>(0,f.jsxs)(`button`,{onClick:()=>n(e.value),style:{flex:1,padding:`12px`,borderRadius:8,border:t===e.value?`1px solid ${F.amber}`:`1px solid ${F.border}`,background:t===e.value?`${F.amber}15`:F.panel,cursor:`pointer`,textAlign:`left`,transition:`all .15s`},children:[(0,f.jsx)(`div`,{style:{fontSize:20,marginBottom:4},children:e.icon}),(0,f.jsx)(`div`,{style:{fontSize:13,fontWeight:600,color:t===e.value?F.amber:F.textPrimary},children:e.label}),(0,f.jsx)(`div`,{style:{fontSize:9,color:F.textDim,marginTop:2},children:e.desc})]},e.value))})})]}),t===`4cm`&&(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:F.textDim,padding:`14px 0 8px`},children:`Send / Return Position`}),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:12,background:F.surface,borderRadius:8,border:`1px solid ${F.border}`,padding:`12px 14px`},children:[(0,f.jsx)(`div`,{style:{fontSize:11,color:F.textSec,marginBottom:4},children:`All blocks before the breakpoint go to the amp's input (Output 1). Blocks after go to the amp's effects loop return (Input 2 → Output 2).`}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,flexWrap:`wrap`,background:F.panel,borderRadius:6,padding:4},children:[...Array(Math.max(1,a))].map((e,t)=>(0,f.jsx)(`button`,{onClick:()=>i(t),style:{flex:1,padding:`8px 4px`,borderRadius:4,border:`none`,fontSize:9,fontWeight:600,cursor:`pointer`,minWidth:30,textAlign:`center`,background:r===t?F.amber:`transparent`,color:r===t?`#000`:F.textSec,transition:`all .1s`},children:t+1},t))}),(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,fontSize:9,color:F.textDim,marginTop:2},children:[(0,f.jsx)(`span`,{children:`Pre → Output 1 (Send to amp)`}),(0,f.jsx)(`span`,{children:`Input 2 → Post ← (Amp FX return)`})]})]})]}),(0,f.jsx)(`div`,{style:{marginTop:20},children:(0,f.jsx)(`button`,{onClick:x,disabled:s,style:{width:`100%`,padding:`12px`,borderRadius:8,border:`none`,background:u?F.green:F.amber,color:`#000`,fontSize:13,fontWeight:700,cursor:`pointer`,opacity:s?.6:1,transition:`all .15s`},children:s?`Saving...`:u?`✓ Saved`:`Save Routing`})})]})]})}var I={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},tt=``;async function nt(e,t,n){let r={method:e,headers:{"Content-Type":`application/json`}};n&&(r.body=JSON.stringify(n));let i=await fetch(`${tt}${t}`,r);if(!i.ok)throw Error(`API ${e} ${t}: ${i.status}`);return i.json()}function rt({onClose:e}){let[t,n]=(0,l.useState)({wifi:{},bluetooth:{}}),[r,i]=(0,l.useState)(!1),[a,o]=(0,l.useState)([]);(0,l.useEffect)(()=>{nt(`GET`,`/api/state`).then(e=>n({wifi:e.wifi||{},bluetooth:e.bluetooth||{}})).catch(()=>{})},[]);let s=async()=>{i(!0);try{o((await nt(`GET`,`/api/state`)).wifi?.networks||[])}catch{}setTimeout(()=>i(!1),1500)},c=t.wifi||{},u=t.bluetooth||{};return(0,f.jsxs)(`div`,{style:{position:`fixed`,inset:0,zIndex:998,display:`flex`,flexDirection:`column`,background:I.bg,color:I.textPrimary,fontFamily:`'Inter', sans-serif`},children:[(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid ${I.border}`,background:I.panel,flexShrink:0},children:(0,f.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,f.jsx)(`button`,{onClick:e,style:{width:34,height:34,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,background:I.surface,border:`1px solid ${I.border}`,color:I.textPrimary,fontSize:16,cursor:`pointer`},children:`✕`}),(0,f.jsx)(`div`,{children:(0,f.jsx)(`div`,{style:{fontSize:15,fontWeight:600},children:`Network & Bluetooth`})})]})}),(0,f.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,overflowX:`hidden`,padding:`6px 14px 20px`},children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:I.textDim,padding:`14px 0 8px`},children:`Wi-Fi`}),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:12,background:I.surface,borderRadius:8,border:`1px solid ${I.border}`,padding:`12px 14px`},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`Status`}),(0,f.jsx)(`span`,{style:{fontSize:12,fontWeight:600,color:c.ssid?I.green:I.textDim},children:c.ssid?`Connected to ${c.ssid}`:`Not connected`})]}),c.ssid&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`Signal`}),(0,f.jsx)(`span`,{style:{fontSize:12,fontFamily:`'JetBrains Mono', monospace`,color:I.amber},children:c.signal==null?`—`:`${c.signal}%`})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`IP Address`}),(0,f.jsx)(`span`,{style:{fontSize:11,fontFamily:`'JetBrains Mono', monospace`,color:I.textPrimary},children:c.ip||`—`})]})]}),(0,f.jsx)(`button`,{onClick:s,disabled:r,style:{width:`100%`,padding:`8px`,borderRadius:6,border:`1px solid ${I.border}`,background:I.panel,color:I.textPrimary,fontSize:11,fontWeight:600,cursor:`pointer`,opacity:r?.6:1},children:r?`Scanning...`:`Scan for Networks`}),a.length>0&&(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,color:I.textDim,marginBottom:6},children:`Available Networks`}),a.slice(0,5).map((e,t)=>(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`6px 0`,borderTop:`1px solid ${I.border}33`},children:[(0,f.jsx)(`span`,{style:{fontSize:11},children:e.ssid||`Unknown`}),(0,f.jsxs)(`span`,{style:{fontSize:10,color:I.textDim},children:[e.signal==null?``:`${e.signal}%`,e.secured?` 🔒`:``]})]},t))]})]})]}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:I.textDim,padding:`14px 0 8px`},children:`Bluetooth`}),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:12,background:I.surface,borderRadius:8,border:`1px solid ${I.border}`,padding:`12px 14px`},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`Status`}),(0,f.jsx)(`span`,{style:{fontSize:12,fontWeight:600,color:u.active?I.green:I.textDim},children:u.active?`Active`:`Not available`})]}),u.devices?.length>0&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,color:I.textDim,marginBottom:2},children:`Paired Devices`}),u.devices.map((e,t)=>(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`4px 0`},children:[(0,f.jsx)(`span`,{style:{fontSize:11},children:e.name||e.address||`Unknown`}),(0,f.jsx)(`span`,{style:{fontSize:10,color:e.connected?I.green:I.textDim},children:e.connected?`Connected`:`Paired`})]},t))]})]})]}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`div`,{style:{fontSize:10,fontWeight:700,letterSpacing:`.1em`,textTransform:`uppercase`,color:I.textDim,padding:`14px 0 8px`},children:`Device Info`}),(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:8,background:I.surface,borderRadius:8,border:`1px solid ${I.border}`,padding:`12px 14px`},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`Hostname`}),(0,f.jsx)(`span`,{style:{fontSize:11,fontFamily:`'JetBrains Mono', monospace`},children:c.hostname||`pedal`})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`},children:[(0,f.jsx)(`span`,{style:{fontSize:11,color:I.textSec},children:`Web UI`}),(0,f.jsx)(`span`,{style:{fontSize:11,fontFamily:`'JetBrains Mono', monospace`,color:I.blue},children:c.ip?`http://${c.ip}:8080`:`—`})]})]})]})]})]})}var it=``,at=`guitar`;try{let e=localStorage.getItem(`pedal_channel`);(e===`guitar`||e===`bass`)&&(at=e)}catch{}function ot(e){at=e}function st(e){return at?e+(e.includes(`?`)?`&`:`?`)+`channel=`+encodeURIComponent(at):e}async function L(e,t,n){let r={method:e,headers:{"Content-Type":`application/json`}};n&&(r.body=JSON.stringify(n));let i=await fetch(`${it}${st(t)}`,r);if(!i.ok)throw Error(`API ${e} ${t}: ${i.status}`);return i.json()}var R={getState:()=>L(`GET`,`/api/state`),getVu:()=>L(`GET`,`/api/vu`),updateBlock:(e,t)=>L(`PATCH`,`/api/block-params`,{id:e,...t}),toggleBlock:(e,t)=>L(`PATCH`,`/api/blocks`,{id:e,enabled:t}),bypassToggle:()=>L(`POST`,`/api/bypass/toggle`),masterVolume:e=>L(`POST`,`/api/volume`,{volume:e/100}),listModels:()=>L(`GET`,`/api/models`),loadModel:e=>L(`POST`,`/api/models/load`,{path:e}),listPresets:()=>L(`GET`,`/api/presets`),getPreset:(e,t)=>L(`GET`,`/api/presets/${e}/${t}`),activatePreset:(e,t)=>L(`POST`,`/api/presets/${e}/${t}/activate`),savePreset:(e,t,n,r)=>L(`PUT`,`/api/presets`,{bank:e,program:t,name:n,tags:r}),searchModels:e=>L(`GET`,`/api/tonehub/search?q=${encodeURIComponent(e)}`),searchIrs:e=>L(`GET`,`/api/tonehub/search/irs?q=${encodeURIComponent(e)}`),installModel:(e,t)=>L(`POST`,`/api/models/tonedownload/install`,{download_url:e,name:t}),installIr:(e,t)=>L(`POST`,`/api/irs/tonedownload/install`,{download_url:e,name:t}),tunerToggle:e=>L(`POST`,`/api/tuner`,{enabled:e})},z={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,amberDim:`#7A5218`,blue:`#3A7BA8`,blueDim:`#1E4060`,green:`#3AB87A`,red:`#C84040`,textPrimary:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`},ct={reverb:[{value:`hall`,label:`Hall`,desc:`Lush hall reverb`},{value:`spring`,label:`Spring`,desc:`Spring reverb`},{value:`plate`,label:`Plate`,desc:`Plate reverb`},{value:`room`,label:`Room`,desc:`Room reverb`}],delay:[{value:`digital`,label:`Digital`,desc:`Clean digital delay`},{value:`analog`,label:`Analog`,desc:`Warm analog delay`},{value:`tape`,label:`Tape`,desc:`Tape echo`}],overdrive:[{value:`ts808`,label:`TS-808`,desc:`Ibanez Tube Screamer`},{value:`klon`,label:`Klon`,desc:`Klon Centaur`},{value:`bd2`,label:`BD-2`,desc:`Boss Blues Driver`}],distortion:[{value:`rat`,label:`RAT`,desc:`Proco Rat`},{value:`ds1`,label:`DS-1`,desc:`Boss DS-1`},{value:`muff`,label:`Muff`,desc:`Big Muff`}],fuzz:[{value:`fuzzface`,label:`Fuzz Face`,desc:`Dallas Arbiter Fuzz Face`},{value:`muff`,label:`Muff`,desc:`EHX Big Muff`},{value:`tonebender`,label:`Tone Bender`,desc:`Vox Tone Bender`}],chorus:[{value:`ce1`,label:`CE-1`,desc:`Boss CE-1 Chorus Ensemble`},{value:`ce2`,label:`CE-2`,desc:`Boss CE-2 Chorus`},{value:`dc2`,label:`DC-2`,desc:`Boss DC-2 Dimension C`}],flanger:[{value:`electric`,label:`Electric Mistress`,desc:`EHX Electric Mistress`},{value:`ada`,label:`ADA Flanger`,desc:`ADA STD-1 Flanger`}],phaser:[{value:`phase90`,label:`Phase 90`,desc:`MXR Phase 90`},{value:`phase100`,label:`Phase 100`,desc:`MXR Phase 100`},{value:`smallstone`,label:`Small Stone`,desc:`EHX Small Stone`}],tremolo:[{value:`optical`,label:`Optical`,desc:`Tremolo optical`},{value:`harmonic`,label:`Harmonic`,desc:`Harmonic tremolo`}],echo:[{value:`digital`,label:`Digital`,desc:`Clean digital echo`},{value:`analog`,label:`Analog`,desc:`Warm analog echo`},{value:`tape`,label:`Tape`,desc:`Tape echo`}]},lt={overdrive:[{key:`subtype`,label:`Model`,type:`select`,options:ct.overdrive.map(e=>({value:e.value,label:e.label})),def:`ts808`},{key:`drive`,label:`Drive`,min:0,max:100,def:30},{key:`tone`,label:`Tone`,min:0,max:100,def:50},{key:`level`,label:`Level`,min:0,max:100,def:70}],distortion:[{key:`subtype`,label:`Model`,type:`select`,options:ct.distortion.map(e=>({value:e.value,label:e.label})),def:`rat`},{key:`drive`,label:`Drive`,min:0,max:100,def:50},{key:`tone`,label:`Tone`,min:0,max:100,def:40},{key:`level`,label:`Level`,min:0,max:100,def:60}],fuzz:[{key:`subtype`,label:`Model`,type:`select`,options:ct.fuzz.map(e=>({value:e.value,label:e.label})),def:`fuzzface`},{key:`fuzz`,label:`Fuzz`,min:0,max:100,def:60},{key:`tone`,label:`Tone`,min:0,max:100,def:30},{key:`level`,label:`Level`,min:0,max:100,def:60}],delay:[{key:`subtype`,label:`Model`,type:`select`,options:ct.delay.map(e=>({value:e.value,label:e.label})),def:`digital`},{key:`time`,label:`Time`,min:0,max:100,def:40},{key:`feedback`,label:`Feedback`,min:0,max:100,def:30},{key:`mix`,label:`Mix`,min:0,max:100,def:35}],echo:[{key:`subtype`,label:`Model`,type:`select`,options:ct.echo.map(e=>({value:e.value,label:e.label})),def:`tape`},{key:`time`,label:`Time`,min:0,max:100,def:40},{key:`feedback`,label:`Feedback`,min:0,max:100,def:30},{key:`mix`,label:`Mix`,min:0,max:100,def:35}],reverb:[{key:`subtype`,label:`Algorithm`,type:`select`,options:ct.reverb.map(e=>({value:e.value,label:e.label})),def:`hall`},{key:`decay`,label:`Decay`,min:0,max:100,def:50},{key:`mix`,label:`Mix`,min:0,max:100,def:30},{key:`tone`,label:`Tone`,min:0,max:100,def:50}],chorus:[{key:`subtype`,label:`Model`,type:`select`,options:ct.chorus.map(e=>({value:e.value,label:e.label})),def:`ce2`},{key:`rate`,label:`Rate`,min:0,max:100,def:40},{key:`depth`,label:`Depth`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],flanger:[{key:`subtype`,label:`Model`,type:`select`,options:ct.flanger.map(e=>({value:e.value,label:e.label})),def:`electric`},{key:`rate`,label:`Rate`,min:0,max:100,def:30},{key:`depth`,label:`Depth`,min:0,max:100,def:50},{key:`feedback`,label:`Feedback`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],phaser:[{key:`subtype`,label:`Model`,type:`select`,options:ct.phaser.map(e=>({value:e.value,label:e.label})),def:`phase90`},{key:`rate`,label:`Rate`,min:0,max:100,def:30},{key:`depth`,label:`Depth`,min:0,max:100,def:50},{key:`feedback`,label:`Feedback`,min:0,max:100,def:40},{key:`mix`,label:`Mix`,min:0,max:100,def:30}],compressor:[{key:`threshold`,label:`Thresh`,min:0,max:100,def:50},{key:`ratio`,label:`Ratio`,min:1,max:20,def:4},{key:`gain`,label:`Gain`,min:0,max:100,def:50}],gate:[{key:`threshold`,label:`Thresh`,min:0,max:100,def:30},{key:`release`,label:`Release`,min:0,max:100,def:50}],eq:[{key:`low`,label:`Low`,min:-12,max:12,def:0},{key:`mid`,label:`Mid`,min:-12,max:12,def:0},{key:`high`,label:`High`,min:-12,max:12,def:0},{key:`level`,label:`Level`,min:0,max:100,def:70}],cabinet:[{key:`level`,label:`Level`,min:0,max:100,def:75}],ir:[{key:`level`,label:`Level`,min:0,max:100,def:75}],split:[{key:`splitType`,label:`Split Type`,type:`select`,options:[{value:`y`,label:`Y — Split evenly`,pan:!0},{value:`ab`,label:`A/B — Route to A or B`,pan:!1},{value:`cascade`,label:`Cascade — A feeds B`,pan:!0},{value:`a_to_b`,label:`A→B — Serial extension`,pan:!1}],def:`y`},{key:`panA`,label:`Pan A`,min:0,max:100,def:50,conditional:e=>e.splitType!==`ab`},{key:`panB`,label:`Pan B`,min:0,max:100,def:50,conditional:e=>e.splitType!==`ab`},{key:`activePath`,label:`Active Path`,type:`select`,options:[{value:`A`,label:`A`},{value:`B`,label:`B`}],def:`A`,conditional:e=>e.splitType===`ab`}],merge:[{key:`blend`,label:`Blend`,min:0,max:100,def:100},{key:`levelA`,label:`Level A`,min:0,max:100,def:100},{key:`panA`,label:`Pan A`,min:-100,max:100,def:0},{key:`levelB`,label:`Level B`,min:0,max:100,def:100},{key:`panB`,label:`Pan B`,min:-100,max:100,def:0}],looper:h},ut={overdrive:z.amber,distortion:z.red,fuzz:`#C07030`,delay:z.blue,echo:z.blue,reverb:`#60B0D0`,chorus:z.green,flanger:`#50C080`,phaser:`#80C050`,tremolo:z.green,compressor:`#D09040`,gate:z.textSec,eq:`#7080D0`,cabinet:`#D07090`,ir:`#D07090`,nam:`#E0A040`,boost:z.amber,wah:`#D0A060`,volume:z.textSec,tuner:`#80D0A0`,split:`#B080C0`,merge:`#80B0C0`,looper:m},dt={overdrive:`OD-808`,distortion:`RAT`,fuzz:`Big Muff`,delay:`Digital Delay`,echo:`Tape Echo`,reverb:`Hall Reverb`,chorus:`Chorus`,flanger:`Flanger`,phaser:`Phase 90`,tremolo:`Tremolo`,compressor:`Compressor`,gate:`Noise Gate`,eq:`EQ`,cabinet:`Cabinet`,ir:`IR Loader`,nam:`NAM Model`,boost:`Clean Boost`,wah:`Wah`,volume:`Volume`,tuner:`Tuner`,loop:`FX Loop`,looper:`Looper`,split:`Split`,merge:`Merge`};function ft(e){return lt[(e||``).toLowerCase()]||[{key:`level`,label:`Level`,min:0,max:100,def:50}]}function pt(e){return ut[(e||``).toLowerCase()]||z.amber}function mt(e){return e?e.replace(/\.(nam|wav|aiff?|ir)$/i,``).replace(/_/g,` `).split(` `).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(` `).replace(/\b(\d+)\b/g,e=>e).replace(/A(\d+)/g,`A$1`):`Model`}function ht(e){let t=(e.type||``).toLowerCase();if(e.nam_model_path)return mt(e.nam_model_path.split(`/`).pop()||``)||`NAM Model`;if(e.ir_file_path)return mt(e.ir_file_path.split(`/`).pop()||``)||`IR Loader`;let n=dt[t]||t.charAt(0).toUpperCase()+t.slice(1);if(e.params?.subtype){let r=ct[t];if(r){let t=r.find(t=>t.value===e.params.subtype);if(t)return`${n} (${t.label})`}return`${n} (${e.params.subtype})`}return n}var gt=` + @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Inter:wght@300;400;500;600&display=swap'); + * { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; user-select: none; } + html, body { height: 100%; overflow: hidden; background: ${z.bg}; } + body { color: ${z.textPrimary}; font-family: 'Inter', sans-serif; } + :root { --amber: ${z.amber}; --blue: ${z.blue}; --green: ${z.green}; } + .mono { font-family: 'JetBrains Mono', monospace; } + ::-webkit-scrollbar { width: 4px; height: 4px; } + ::-webkit-scrollbar-track { background: ${z.panel}; } + ::-webkit-scrollbar-thumb { background: ${z.border}; border-radius: 2px; } + + /* ── Knob ── */ + .knob-wrap { display: flex; flex-direction: column; align-items: center; gap: 4px; cursor: pointer; } + .knob { border-radius: 50%; position: relative; touch-action: none; } + .knob-inner { border-radius: 50%; width: 100%; height: 100%; position: relative; + background: radial-gradient(circle at 35% 30%, #3A3A48, #1A1A22); + box-shadow: 0 2px 8px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.07); } + .knob-dot { position: absolute; width: 3px; border-radius: 2px; background: var(--amber); + left: 50%; transform-origin: bottom center; box-shadow: 0 0 6px var(--amber); } + .knob-label { font-size: 9px; color: ${z.textSec}; letter-spacing: .06em; text-transform: uppercase; text-align: center; } + .knob-value { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: ${z.amber}; } + + /* ── Buttons ── */ + .btn { padding: 8px 14px; border-radius: 6px; font-size: 12px; font-weight: 600; + letter-spacing: .04em; border: none; cursor: pointer; transition: all .12s; } + .btn-primary { background: ${z.amber}; color: #000; } + .btn-primary:active { filter: brightness(.85); transform: scale(.97); } + .btn-ghost { background: ${z.surface}; color: ${z.textPrimary}; border: 1px solid ${z.border}; } + .btn-ghost:active { background: ${z.border}; } + .btn-icon { width: 32px; height: 32px; border-radius: 7px; display: flex; align-items: center; + justify-content: center; background: ${z.surface}; border: 1px solid ${z.border}; cursor: pointer; + font-size: 15px; transition: all .12s; flex-shrink: 0; } + .btn-icon:active { transform: scale(.93); } + .btn-icon.active { background: rgba(232,160,48,.15); border-color: ${z.amber}; color: ${z.amber}; } + + /* ── Badge ── */ + .badge { display: inline-flex; align-items: center; justify-content: center; + padding: 2px 7px; border-radius: 4px; font-size: 10px; font-weight: 700; + letter-spacing: .06em; text-transform: uppercase; } + .badge-amber { background: rgba(232,160,48,.2); color: ${z.amber}; } + .badge-green { background: rgba(58,184,122,.2); color: ${z.green}; } + .badge-blue { background: rgba(58,123,168,.2); color: ${z.blue}; } + + /* ── Param slider ── */ + .param-panel { background: ${z.surface}; padding: 8px 12px 6px; border-top: 1px solid ${z.border}; flex-shrink: 0; } + .param-panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; } + .param-panel-title { font-size: 10px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; color: ${z.textSec}; } + .param-row { display: flex; flex-direction: column; gap: 1px; padding: 1px 0; } + .param-header { display: flex; justify-content: space-between; align-items: center; } + .param-label { font-size: 9px; font-weight: 500; text-transform: uppercase; letter-spacing: .06em; color: ${z.textSec}; } + .param-val { font-family: 'JetBrains Mono',monospace; font-size: 11px; font-weight: 600; } + .param-track-wrap { position: relative; height: 30px; display: flex; align-items: center; cursor: pointer; touch-action: none; } + .param-track { width: 100%; height: 6px; background: ${z.border}; border-radius: 3px; position: relative; overflow: hidden; } + .param-fill { height: 100%; border-radius: 3px; position: absolute; top: 0; left: 0; transition: width .04s; } + .param-thumb { width: 22px; height: 22px; border-radius: 50%; position: absolute; top: 50%; + transform: translate(-50%,-50%); box-shadow: 0 1px 6px rgba(0,0,0,.6); pointer-events: none; + border: 3px solid ${z.bg}; } + .param-btn { width: 28px; height: 28px; border-radius: 50%; border: 1px solid ${z.border}; + background: ${z.panel}; color: ${z.textPrimary}; font-size: 14px; font-weight: 700; + display: flex; align-items: center; justify-content: center; cursor: pointer; line-height: 1; } + .param-btn:active { background: ${z.border}; transform: scale(.92); } + .param-knobs { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; padding: 4px 0; } + + /* ── Screen header (overlays) ── */ + .screen-header { padding: 10px 14px 8px; display: flex; align-items: center; + justify-content: space-between; border-bottom: 1px solid ${z.border}; } + .screen-title { font-size: 12px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: ${z.textSec}; } + .screen-body { flex: 1; overflow-y: auto; padding: 10px 12px; display: flex; flex-direction: column; gap: 10px; } + + /* ── Preset sidebar chip ── */ + .preset-chip-s { width: 100%; padding: 7px 6px; border-radius: 5px; background: ${z.surface}; border: 1px solid ${z.border}; + display: flex; flex-direction: column; align-items: center; cursor: pointer; transition: all .12s; } + .preset-chip-s.active { border-color: ${z.amber}; background: rgba(232,160,48,.08); } + .preset-chip-s:active { transform: scale(.96); } + .preset-chip-s .pcs-num { font-family: 'JetBrains Mono',monospace; font-size: 14px; font-weight: 700; color: ${z.amber}; line-height: 1.1; } + .preset-chip-s .pcs-name { font-size: 9px; color: ${z.textSec}; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; text-align: center; line-height: 1.2; } + .preset-chip-s .pcs-indicator { width: 4px; height: 4px; border-radius: 50%; margin-top: 3px; } + + /* ── Preset row (captures) ── */ + .preset-row { display: flex; align-items: center; gap: 10px; padding: 9px 12px; + border-radius: 6px; cursor: pointer; transition: background .12s; border: 1px solid transparent; } + .preset-row:active, .preset-row.active { background: rgba(232,160,48,.08); border-color: rgba(232,160,48,.25); } + .section-label { font-size: 10px; letter-spacing: .1em; text-transform: uppercase; + color: ${z.textDim}; font-weight: 600; margin-bottom: 8px; } + .card { background: ${z.panel}; border: 1px solid ${z.border}; border-radius: 8px; padding: 14px; } + .card-sm { background: ${z.surface}; border: 1px solid ${z.border}; border-radius: 6px; padding: 10px; } +`+x;function _t({label:e,value:t=50,onChange:n,size:r=48,color:i=z.amber,min:a=0,max:o=100}){let s=(0,l.useRef)(null),c=(t-a)/(o-a),u=-140+c*280,d=r*.38,p=r*.5-d,m=e=>{e.preventDefault(),s.current={y:e.touches?e.touches[0].clientY:e.clientY,val:t};let r=e=>{let t=e.touches?e.touches[0].clientY:e.clientY,r=(s.current.y-t)/120,i=Math.max(a,Math.min(o,s.current.val+r*(o-a)));n?.(Math.round(i))},i=()=>{window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i),window.removeEventListener(`touchmove`,r),window.removeEventListener(`touchend`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i),window.addEventListener(`touchmove`,r,{passive:!1}),window.addEventListener(`touchend`,i)},h=r+12,g=h/2,_=h/2,v=r/2+3,y=g+v*Math.cos(Math.PI/180*-230),b=_+v*Math.sin(Math.PI/180*-230),x=g+v*Math.cos((u-90)*(Math.PI/180)),S=_+v*Math.sin((u-90)*(Math.PI/180)),C=+(c*280>180);return(0,f.jsxs)(`div`,{className:`knob-wrap`,style:{width:r+12},children:[(0,f.jsxs)(`div`,{className:`knob`,style:{width:r,height:r},onMouseDown:m,onTouchStart:m,children:[(0,f.jsxs)(`svg`,{style:{position:`absolute`,inset:-6,width:h,height:h,overflow:`visible`},children:[(0,f.jsx)(`circle`,{cx:g,cy:_,r:v,fill:`none`,stroke:z.border,strokeWidth:`2`,strokeLinecap:`round`,opacity:`.5`}),c>0&&(0,f.jsx)(`path`,{d:`M ${y} ${b} A ${v} ${v} 0 ${C} 1 ${x} ${S}`,fill:`none`,stroke:i,strokeWidth:`2`,strokeLinecap:`round`,style:{filter:`drop-shadow(0 0 3px ${i})`}})]}),(0,f.jsx)(`div`,{className:`knob-inner`,style:{"--amber":i},children:(0,f.jsx)(`div`,{className:`knob-dot`,style:{height:d,top:p,transform:`translateX(-50%) rotate(${u}deg)`,transformOrigin:`50% ${d}px`}})})]}),(0,f.jsx)(`div`,{className:`knob-value mono`,style:{color:i},children:t}),(0,f.jsx)(`div`,{className:`knob-label`,children:e})]})}function vt({label:e,value:t=50,onChange:n,onChangeEnd:r,min:i=0,max:a=100,color:o=z.amber}){let s=(0,l.useRef)(null),c=(0,l.useRef)(!1),u=(0,l.useRef)(t),d=(0,l.useRef)(n),p=(0,l.useRef)(r),m=(t-i)/(a-i)*100;(0,l.useEffect)(()=>{d.current=n},[n]),(0,l.useEffect)(()=>{p.current=r},[r]);let h=(0,l.useCallback)(e=>{let n=s.current;if(!n)return t;let r=n.getBoundingClientRect(),o=(e.touches?e.touches[0].clientX:e.clientX)-r.left;return Math.round(i+Math.max(0,Math.min(1,o/r.width))*(a-i))},[i,a,t]);(0,l.useEffect)(()=>{let e=e=>{if(!c.current)return;e.preventDefault();let t=h(e);u.current=t,d.current?.(t)},t=()=>{c.current&&=(p.current?.(u.current),!1)};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),window.addEventListener(`touchmove`,e,{passive:!1}),window.addEventListener(`touchend`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t),window.removeEventListener(`touchmove`,e),window.removeEventListener(`touchend`,t)}},[h]);let g=e=>{e.preventDefault();let t=h(e);u.current=t,c.current=!0,d.current?.(t)},_=e=>n=>{n.preventDefault(),n.stopPropagation();let r=Math.max(i,Math.min(a,t+e));d.current?.(r),p.current?.(r)};return(0,f.jsxs)(`div`,{className:`param-row`,children:[(0,f.jsxs)(`div`,{className:`param-header`,children:[(0,f.jsx)(`span`,{className:`param-label`,style:{color:o},children:e}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:4,alignItems:`center`},children:[(0,f.jsx)(`button`,{className:`param-btn`,onMouseDown:_(-5),onTouchStart:_(-5),children:`−`}),(0,f.jsx)(`span`,{className:`param-val`,style:{color:o},children:t}),(0,f.jsx)(`button`,{className:`param-btn`,onMouseDown:_(5),onTouchStart:_(5),children:`+`})]})]}),(0,f.jsx)(`div`,{className:`param-track-wrap`,ref:s,onMouseDown:g,onTouchStart:g,children:(0,f.jsxs)(`div`,{className:`param-track`,children:[(0,f.jsx)(`div`,{className:`param-fill`,style:{width:`${m}%`,background:o}}),(0,f.jsx)(`div`,{className:`param-thumb`,style:{left:`${m}%`,background:o}})]})})]})}function yt({def:e,value:t,color:n,onChange:r}){return(0,f.jsxs)(`div`,{className:`param-row`,children:[(0,f.jsx)(`div`,{className:`param-header`,children:(0,f.jsx)(`span`,{className:`param-label`,style:{color:n},children:e.label})}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,flexWrap:`wrap`,background:`#0A0A10`,borderRadius:6,padding:4},children:(e.options||[]).map(e=>(0,f.jsx)(`button`,{onClick:()=>r?.(e.value),style:{flex:1,padding:`5px 8px`,borderRadius:4,border:`none`,fontSize:10,fontWeight:600,cursor:`pointer`,background:t===e.value?n:`transparent`,color:t===e.value?`#000`:`#8888A0`,transition:`all .1s`,letterSpacing:`.03em`,whiteSpace:`nowrap`},children:e.label},e.value))})]})}function bt({block:e,params:t,onParamChange:n,onParamChangeEnd:r,viewMode:i,onToggleView:a,onFocus:o,onModelBrowser:s}){let c=ft(e.type),l=pt(e.type),u=c.filter(e=>!e.conditional||e.conditional(t));return(0,f.jsxs)(`div`,{className:`param-panel`,children:[(0,f.jsxs)(`div`,{className:`param-panel-header`,children:[(0,f.jsxs)(`span`,{className:`param-panel-title`,style:{cursor:s?`pointer`:`default`},onClick:()=>s?.(e.id),children:[(0,f.jsx)(`span`,{style:{color:l},children:`●`}),` `,e.name||e.type||``,s&&(0,f.jsx)(`span`,{style:{marginLeft:4,fontSize:8,color:z.textDim},children:`▼`})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:4,alignItems:`center`},children:[o&&(0,f.jsx)(`button`,{className:`btn`,style:{padding:`4px 8px`,fontSize:9,fontWeight:600,background:`${z.amber}22`,border:`1px solid ${z.amber}44`,color:z.amber,borderRadius:5,letterSpacing:`.04em`,cursor:`pointer`},onClick:o,children:`🔍 Focus`}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:26,height:26,fontSize:11,flexShrink:0},onClick:a,children:i===`slider`?`◉`:`▦`})]})]}),i===`slider`?u.map(e=>e.type===`select`?(0,f.jsx)(yt,{def:e,value:t[e.key]==null?e.def:t[e.key],color:l,onChange:t=>{n?.(e.key,t),r?.(e.key,t)}},e.key):(0,f.jsx)(vt,{label:e.label,value:t[e.key]==null?e.def:t[e.key],min:e.min,max:e.max,color:l,onChange:t=>n?.(e.key,t),onChangeEnd:t=>r?.(e.key,t)},e.key)):u.filter(e=>e.type!==`select`).length>0&&(0,f.jsx)(`div`,{className:`param-knobs`,children:u.filter(e=>e.type!==`select`).map(e=>(0,f.jsx)(_t,{label:e.label,value:t[e.key]==null?e.def:t[e.key],min:e.min,max:e.max,size:48,color:l,onChange:t=>{n?.(e.key,t),r?.(e.key,t)}},e.key))})]})}function xt({level:e=0,height:t=24,vertical:n=!1,width:r}){let i=Math.round(e/100*12),a=e=>e>=10?z.red:e>=8?`#E8C030`:z.green;return n?(0,f.jsx)(`div`,{style:{display:`flex`,flexDirection:`column-reverse`,gap:1,height:t,alignItems:`center`},children:Array.from({length:12}).map((e,n)=>(0,f.jsx)(`div`,{style:{width:4,height:(t-12)/12,borderRadius:1,background:n(0,f.jsx)(`div`,{style:{flex:1,height:`100%`,borderRadius:1,background:t{R.listModels().then(e=>c(e.models||[])).catch(()=>{})},[]);let p=async()=>{if(r.trim()){d(!0);try{o((t===`models`?await R.searchModels(r):await R.searchIrs(r)).results||[])}catch{o([])}d(!1)}},m=async e=>{try{t===`models`?await R.installModel(e.download_url,e.name):await R.installIr(e.download_url,e.name),R.listModels().then(e=>c(e.models||[])).catch(()=>{})}catch(e){alert(`Install failed: `+e.message)}};return(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`,background:z.bg},children:[(0,f.jsxs)(`div`,{className:`screen-header`,children:[(0,f.jsx)(`div`,{className:`screen-title`,children:`Downloads`}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:28,height:28,fontSize:13},onClick:e,children:`✕`})]}),(0,f.jsx)(`div`,{style:{padding:`6px 12px`,borderBottom:`1px solid ${z.border}`},children:(0,f.jsxs)(`div`,{className:`toggle`,children:[(0,f.jsx)(`button`,{className:`toggle-btn ${t===`models`?`active`:``}`,onClick:()=>n(`models`),children:`NAM Models`}),(0,f.jsx)(`button`,{className:`toggle-btn ${t===`irs`?`active`:``}`,onClick:()=>n(`irs`),children:`IR Cabs`})]})}),(0,f.jsxs)(`div`,{style:{padding:`6px 12px`,display:`flex`,gap:6,borderBottom:`1px solid ${z.border}`},children:[(0,f.jsxs)(`div`,{style:{flex:1,display:`flex`,background:z.surface,borderRadius:6,border:`1px solid ${z.border}`,padding:`6px 10px`,gap:6,alignItems:`center`},children:[(0,f.jsx)(`span`,{style:{color:z.textDim,fontSize:11},children:`🔍`}),(0,f.jsx)(`input`,{placeholder:`Search ${t===`models`?`NAM models`:`IR cabs`}...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>e.key===`Enter`&&p(),style:{flex:1,background:`none`,border:`none`,color:z.textPrimary,fontSize:12,outline:`none`}})]}),(0,f.jsx)(`button`,{className:`btn btn-primary`,style:{padding:`6px 11px`,fontSize:11},onClick:p,children:u?`...`:`Search`})]}),(0,f.jsxs)(`div`,{className:`screen-body`,children:[a===null&&s.length>0&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`div`,{className:`section-label`,children:`Installed Models`}),s.map((e,t)=>(0,f.jsxs)(`div`,{className:`preset-row`,style:{cursor:`default`},children:[(0,f.jsx)(`div`,{style:{width:26,height:26,borderRadius:5,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:11,background:e.loaded?`${z.green}22`:z.surface,color:e.loaded?z.green:z.textDim},children:`🎛`}),(0,f.jsxs)(`div`,{style:{flex:1},children:[(0,f.jsx)(`div`,{style:{fontSize:12,fontWeight:500},children:e.name}),(0,f.jsxs)(`div`,{className:`mono`,style:{fontSize:10,color:z.textDim},children:[e.architecture,`·`,e.size_mb,`MB`,e.loaded?`· CURRENT`:``]})]})]},t))]}),a!==null&&a.length===0&&(0,f.jsx)(`div`,{className:`card-sm`,style:{textAlign:`center`,color:z.textDim,padding:20},children:`No results found`}),a!==null&&a.map((e,t)=>(0,f.jsxs)(`div`,{className:`preset-row`,style:{cursor:`default`},children:[(0,f.jsxs)(`div`,{style:{flex:1},children:[(0,f.jsx)(`div`,{style:{fontSize:12,fontWeight:500},children:e.name}),(0,f.jsxs)(`div`,{className:`mono`,style:{fontSize:10,color:z.textDim},children:[e.author,`·`,e.size_display]})]}),(0,f.jsx)(`button`,{className:`btn btn-ghost`,style:{padding:`4px 9px`,fontSize:11},onClick:()=>m(e),children:`Get`})]},t))]})]})}var Ct=[{id:`gate`,type:`gate`,name:`Noise Gate`,bypassed:!1,params:{threshold:40,release:25}},{id:`comp`,type:`compressor`,name:`Compressor`,bypassed:!1,params:{threshold:50,ratio:4,gain:50}},{id:`amp`,type:`nam`,name:`Twin Reverb`,bypassed:!1,params:{level:75}},{id:`cab`,type:`ir`,name:`2x12 American`,bypassed:!1,params:{level:75}},{id:`eq`,type:`eq`,name:`EQ`,bypassed:!1,params:{low:0,mid:0,high:0,level:70}},{id:`reverb`,type:`reverb`,name:`Hall Reverb`,bypassed:!1,params:{subtype:`hall`,decay:50,mix:30,tone:50}}],wt=[{num:1,bank:0,name:`Clean`}];function Tt(){let[e,t]=(0,l.useState)(`main`),[n,r]=(0,l.useState)({connected:!1,master_volume:.85,routing_mode:`mono`,cpu_percent:0}),[i,a]=(0,l.useState)(Ct),[o,s]=(0,l.useState)(!0),[c,u]=(0,l.useState)(`gate`),[d,p]=(0,l.useState)({}),[m,h]=(0,l.useState)(`slider`),[_,v]=(0,l.useState)(0),[y,x]=(0,l.useState)(0),[S,C]=(0,l.useState)(1),[w,ee]=(0,l.useState)(0),[T,te]=(0,l.useState)(wt),[ne,re]=(0,l.useState)(!1),[ie,ae]=(0,l.useState)(!1),[oe,se]=(0,l.useState)(null),[ce,le]=(0,l.useState)(null),[E,O]=(0,l.useState)(`stomp`),[ue,de]=(0,l.useState)(()=>{try{let e=localStorage.getItem(`pedal_channel`);return e===`guitar`||e===`bass`?e:`guitar`}catch{return`guitar`}}),k=g(),A=(0,l.useCallback)(async()=>{try{let e=await R.listPresets();if(e?.banks){let t=[];e.banks.forEach(e=>{(e.presets||[]).forEach((n,r)=>{n&&t.push({num:r+1,bank:e.number,name:n.name,chain:n.chain})})}),t.length>0?te(t):te([])}else te([])}catch{te(wt)}},[]),pe=(0,l.useCallback)(e=>{e!==ue&&(de(e),ee(0),C(1),u(null))},[ue]),[me,j]=(0,l.useState)([]),[ge,_e]=(0,l.useState)([]),ve=(0,l.useRef)({blocks:Ct,blockParams:{},selectedBlockId:null}),ye=(0,l.useRef)(null);(0,l.useEffect)(()=>{ve.current={blocks:i,blockParams:d,selectedBlockId:c}},[i,d,c]);let be=(0,l.useCallback)(()=>{let e=ve.current,t={blocks:e.blocks.map(e=>({...e,params:{...e.params}})),blockParams:Object.fromEntries(Object.entries(e.blockParams).map(([e,t])=>[e,{...t}])),selectedBlockId:e.selectedBlockId};j(e=>[...e.slice(-49),t]),_e([])},[]),xe=(0,l.useCallback)(()=>{ye.current||=(be(),setTimeout(()=>{ye.current=null},400))},[be]),Se=(0,l.useCallback)(()=>{j(e=>{if(e.length===0)return e;let t=ve.current,n={blocks:t.blocks.map(e=>({...e,params:{...e.params}})),blockParams:Object.fromEntries(Object.entries(t.blockParams).map(([e,t])=>[e,{...t}])),selectedBlockId:t.selectedBlockId};_e(e=>[...e,n]);let r=e[e.length-1];return a(r.blocks),p(r.blockParams),u(r.selectedBlockId),e.slice(0,-1)})},[]),Ce=(0,l.useCallback)(()=>{_e(e=>{if(e.length===0)return e;let t=ve.current,n={blocks:t.blocks.map(e=>({...e,params:{...e.params}})),blockParams:Object.fromEntries(Object.entries(t.blockParams).map(([e,t])=>[e,{...t}])),selectedBlockId:t.selectedBlockId};j(e=>[...e,n]);let r=e[e.length-1];return a(r.blocks),p(r.blockParams),u(r.selectedBlockId),e.slice(0,-1)})},[]),[we,M]=(0,l.useState)(!1),[Ee,De]=(0,l.useState)(null),Oe=(0,l.useCallback)(e=>{switch(M(!1),e){case`settings`:De(`settings`);break;case`eq`:De(`eq`);break;case`routing`:De(`routing`);break;case`wifi`:De(`wifi`);break;case`tuner`:r(e=>({...e,tuner_enabled:!0})),R.tunerToggle(!0).catch(()=>{});break;default:break}},[]),ke=(0,l.useRef)(!1),Ae=(0,l.useRef)(!1),je=(0,l.useCallback)(async()=>{try{let e=await R.getState();if(r(e),e.input_level!=null&&v(e.input_level),e.output_level!=null&&x(e.output_level),e.current_preset?.name&&!ke.current&&C(e.current_preset.program==null?S:e.current_preset.program+1),e.connected&&o){if(s(!1),e.current_preset?.bank!=null&&e.current_preset?.program!=null)try{let t=await R.getPreset(e.current_preset.bank,e.current_preset.program);if(t?.chain&&t.chain.length>0){a(t.chain.map((e,t)=>{let n={type:e.fx_type||`fx`,enabled:e.enabled!==!1,params:e.params||{},nam_model_path:e.nam_model_path,ir_file_path:e.ir_file_path};return{id:e.id||`block_${e.fx_type||`fx`}_${t}`,type:n.type,name:ht(n),bypassed:!e.enabled,enabled:n.enabled,params:n.params,nam_model_path:n.nam_model_path,ir_file_path:n.ir_file_path}}));return}}catch{}a(Ct)}}catch{}},[S,o]);(0,l.useEffect)(()=>{je();let e=setInterval(je,3e3);return()=>clearInterval(e)},[je]),(0,l.useEffect)(()=>{let e=setInterval(()=>{v(e=>n.input_level!=null&&n.input_level>0?n.input_level:Math.max(0,Math.min(100,e+(Math.random()-.45)*8))),x(e=>n.output_level!=null&&n.output_level>0?n.output_level:Math.max(0,Math.min(100,e+(Math.random()-.45)*8)))},150);return()=>clearInterval(e)},[n.input_level,n.output_level]),(0,l.useEffect)(()=>{try{localStorage.setItem(`pedal_channel`,ue)}catch{}ot(ue)},[ue]),(0,l.useEffect)(()=>{A()},[A,ue]);let Me=(0,l.useCallback)(async(e,t)=>{ke.current=!0,ae(!0);try{await R.activatePreset(e,t),await new Promise(e=>setTimeout(e,300));let n=await R.getState();r(n),n.current_preset?.name&&C(n.current_preset.program==null?t+1:n.current_preset.program+1);try{let n=await R.getPreset(e,t);n?.chain&&n.chain.length>0&&(a(n.chain.map((e,t)=>{let n={type:e.fx_type||`fx`,enabled:e.enabled!==!1,params:e.params||{},nam_model_path:e.nam_model_path,ir_file_path:e.ir_file_path};return{id:e.id||`block_${e.fx_type||`fx`}_${t}`,type:n.type,name:ht(n),bypassed:!e.enabled,enabled:n.enabled,params:n.params,nam_model_path:n.nam_model_path,ir_file_path:n.ir_file_path}})),Ae.current=!0)}catch(e){console.warn(`Could not fetch chain:`,e)}u(null)}catch(e){console.warn(`Preset activate failed:`,e)}ae(!1),setTimeout(()=>{ke.current=!1},5e3),setTimeout(()=>{Ae.current=!1},5e3)},[]),Ne=(0,l.useCallback)(async e=>{let t=T.find(t=>t.num===e);t&&(C(e),await Me(t.bank==null?1:t.bank,e-1))},[T,Me]),Pe=(0,l.useMemo)(()=>i.find(e=>e.id===c),[i,c]);(0,l.useEffect)(()=>{if(Pe&&d[c]==null){let e=ft(Pe.type),t={};e.forEach(e=>{t[e.key]=Pe.params?.[e.key]==null?e.def:Pe.params[e.key]}),p(e=>({...e,[c]:t}))}},[c,Pe,d]);let Fe=(0,l.useCallback)(e=>{u(t=>t===e?null:e)},[]),Le=(0,l.useCallback)((e,t,n)=>{xe(),p(r=>({...r,[e]:{...r[e]||{},[t]:n}}))},[xe]),Re=(0,l.useCallback)(e=>{be(),Ae.current=!0,a(t=>t.map(t=>t.id===e?{...t,bypassed:!t.bypassed}:t)),R.toggleBlock(e,!1).catch(()=>{}),setTimeout(()=>{Ae.current=!1},3e3)},[be]),ze=(0,l.useCallback)((e,t,n)=>{R.updateBlock(e,{[t]:n}).catch(()=>{})},[]),N=(0,l.useCallback)((e,t)=>{be(),a(n=>{let r=[...n],[i]=r.splice(e,1);return r.splice(t,0,i),r})},[be]),Ve=(0,l.useCallback)(()=>{be(),Ae.current=!0;let e=`block_`+Date.now(),t=`overdrive`,n=ft(t),r={};n.forEach(e=>{r[e.key]=e.def}),a(n=>[...n,{id:e,type:t,name:ht({type:t,params:r}),bypassed:!1,params:r}]),setTimeout(()=>{Ae.current=!1},3e3)},[be]),He=(0,l.useCallback)(e=>{be(),Ae.current=!0,a(t=>t.filter(t=>t.id!==e)),c===e&&u(null),setTimeout(()=>{Ae.current=!1},3e3)},[be,c]),Ue=(0,l.useMemo)(()=>T.filter(e=>e.bank===w),[T,w]),We=w+1,Ge=(0,l.useCallback)(()=>{let e=T.reduce((e,t)=>Math.max(e,t.bank),0),t=Math.min(w+1,e);ee(t);let n=T.filter(e=>e.bank===t);n.length>0&&Me(n[0].bank,n[0].num-1)},[w,T,Me]),P=(0,l.useCallback)(()=>{let e=Math.max(w-1,0);ee(e);let t=T.filter(t=>t.bank===e);t.length>0&&Me(t[0].bank,t[0].num-1)},[w,T,Me]),qe=(0,l.useCallback)(()=>{re(e=>!e),R.bypassToggle().catch(()=>{})},[]),Je=(0,l.useCallback)(()=>{let e=!n.tuner_enabled;r(t=>({...t,tuner_enabled:e})),R.tunerToggle(e).catch(()=>{}),e&&t(`main`)},[n.tuner_enabled]),Ye=(0,l.useCallback)(()=>{Ae.current=!0;let e=oe;e&&(a(t=>t.map(t=>t.id===e?{...t,bypassed:!t.bypassed}:t)),R.toggleBlock(e,!1).catch(()=>{}),setTimeout(()=>{Ae.current=!1},3e3))},[oe]),F=(0,l.useCallback)(e=>{le(e),oe&&se(null)},[oe]),Ze=(0,l.useCallback)(({type:e,name:t,modelPath:n,isBuiltin:r})=>{let i=ce;i&&(be(),Ae.current=!0,a(a=>a.map(a=>{if(a.id!==i)return a;let o=ft(e),s={};return o.forEach(e=>{s[e.key]=e.def}),{...a,type:e,name:t||ht({type:e}),params:s,nam_model_path:!r&&n&&e===`nam`?n:void 0,ir_file_path:!r&&n&&e===`ir`?n:void 0}})),le(null),p(e=>{let t={...e};return delete t[i],t}),setTimeout(()=>{Ae.current=!1},3e3))},[ce,be]),Qe=(0,l.useCallback)((e,t)=>{if(!i.find(e=>e.id===t))return;let n=d[t]?.maxTime??8;switch(e){case`record`:k.record(t,n);break;case`play`:k.play(t,n);break;case`overdub`:k.overdub(t,n);break;case`stop`:k.stop(t);break;case`clear`:k.clearLoop(t);break;case`undo`:k.undoLast(t);break}},[i,d,k]),$e=(0,l.useCallback)(e=>({onRecord:()=>Qe(`record`,e),onPlay:()=>Qe(`play`,e),onOverdub:()=>Qe(`overdub`,e),onStop:()=>Qe(`stop`,e),onClear:()=>Qe(`clear`,e),onUndo:()=>Qe(`undo`,e)}),[Qe]);return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`style`,{children:gt}),(0,f.jsxs)(`div`,{style:{width:`100%`,height:`100vh`,display:`flex`,flexDirection:`column`,background:z.bg,overflow:`hidden`,fontFamily:`'Inter',sans-serif`,margin:`0 auto`,maxWidth:980},children:[e===`main`&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`4px 12px`,background:z.panel,borderBottom:`1px solid ${z.border}`,flexShrink:0,minHeight:32},children:[(0,f.jsxs)(`div`,{style:{display:`flex`,gap:8,alignItems:`center`},children:[(0,f.jsx)(`div`,{style:{width:6,height:6,borderRadius:`50%`,background:n.connected?z.green:z.red,boxShadow:`0 0 6px ${n.connected?z.green:z.red}`}}),(0,f.jsx)(`span`,{className:`mono`,style:{fontSize:9,color:z.textSec},children:n.connected?`CONNECTED`:`OFFLINE`}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:20,height:20,fontSize:11,opacity:me.length>0?1:.3},onClick:Se,disabled:me.length===0,title:`Undo (Ctrl+Z)`,children:`↶`}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:20,height:20,fontSize:11,opacity:ge.length>0?1:.3},onClick:Ce,disabled:ge.length===0,title:`Redo (Ctrl+Shift+Z)`,children:`↷`}),(0,f.jsx)(`div`,{style:{width:1,height:12,background:z.border}}),(0,f.jsx)(`span`,{className:`mono`,style:{fontSize:10,color:z.textPrimary,fontWeight:600},children:n.current_preset?.name||T.find(e=>e.num===S)?.name||`—`}),ie&&(0,f.jsx)(`span`,{className:`mono`,style:{fontSize:8,color:z.amber},children:`⟳`}),(0,f.jsx)(`div`,{style:{width:1,height:12,background:z.border}}),n.channel_mode===`stereo`?(0,f.jsx)(`span`,{className:`badge badge-amber`,style:{fontSize:9,padding:`2px 7px`,letterSpacing:`.08em`},children:`STEREO`}):(0,f.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:3,background:z.surface,borderRadius:5,border:`1px solid ${z.border}`,padding:2,height:22},children:[`guitar`,`bass`].map(e=>(0,f.jsxs)(`button`,{onClick:()=>pe(e),style:{padding:`1px 7px`,borderRadius:4,border:`none`,height:18,fontSize:8,fontWeight:700,letterSpacing:`.08em`,textTransform:`uppercase`,background:ue===e?z.amber:`transparent`,color:ue===e?`#000`:z.textSec,cursor:`pointer`,display:`flex`,alignItems:`center`,gap:3,lineHeight:1,transition:`all .1s`,whiteSpace:`nowrap`},children:[(0,f.jsx)(`span`,{style:{fontSize:10,opacity:ue===e?1:.5},children:`🎸`}),e===`guitar`?`GUITAR`:`BASS`]},e))})]}),(0,f.jsxs)(`div`,{style:{display:`flex`,gap:8,alignItems:`center`},children:[(0,f.jsx)(`div`,{style:{fontSize:9,color:z.textDim,fontWeight:600,letterSpacing:`.03em`},children:`IN`}),(0,f.jsx)(xt,{level:_,height:20,width:60}),(0,f.jsx)(`div`,{style:{fontSize:9,color:z.textDim,fontWeight:600,letterSpacing:`.03em`},children:`OUT`}),(0,f.jsx)(xt,{level:y,height:20,width:60}),(0,f.jsxs)(`span`,{className:`mono`,style:{fontSize:9,color:z.textDim},children:[`CPU `,n.cpu_percent==null?`—`:`${n.cpu_percent}%`]}),(0,f.jsx)(`div`,{style:{width:1,height:12,background:z.border}}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:24,height:24,position:`relative`},onClick:()=>t(`captures`),title:`Downloads`,children:(0,f.jsx)(`img`,{src:`/ui/img/ic_bank.svg`,alt:`captures`,style:{width:14,height:14,filter:`invert(1) brightness(2)`}})}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:24,height:24,position:`relative`},onClick:()=>t(`presets`),title:`Presets`,children:(0,f.jsx)(`img`,{src:`/ui/img/ic_presets.svg`,alt:`presets`,style:{width:14,height:14,filter:`invert(1) brightness(2)`}})}),(0,f.jsx)(`div`,{style:{display:`flex`,gap:2,alignItems:`center`,background:z.surface,borderRadius:4,border:`1px solid ${z.border}`,padding:2,height:24},children:[`stomp`,`preset`].map(e=>(0,f.jsx)(`button`,{onClick:()=>O(e),style:{padding:`1px 5px`,borderRadius:3,border:`none`,height:20,fontSize:8,fontWeight:700,letterSpacing:`.04em`,textTransform:`uppercase`,background:E===e?z.amber:`transparent`,color:E===e?`#000`:z.textDim,cursor:`pointer`,lineHeight:1.5,minWidth:34,display:`flex`,alignItems:`center`,justifyContent:`center`},children:e===`stomp`?`SM`:`PR`},e))}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:24,height:24,position:`relative`,background:n.tuner_enabled?`rgba(128,208,160,.15)`:z.surface,borderColor:n.tuner_enabled?z.green:z.border},onClick:Je,title:n.tuner_enabled?`Exit Tuner`:`Tuner`,children:(0,f.jsx)(`img`,{src:`/ui/img/fx_analyzer.svg`,alt:`tuner`,style:{width:14,height:14,filter:n.tuner_enabled?`invert(0.9) brightness(2) sepia(0.4) hue-rotate(80deg)`:`invert(1) brightness(2)`}})}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:24,height:24,position:`relative`,background:`rgba(232,160,48,.12)`,borderColor:z.amber},onClick:()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},title:`Fullscreen`,children:(0,f.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`#E8A030`,children:(0,f.jsx)(`path`,{d:`M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z`})})}),(0,f.jsx)(`div`,{style:{width:1,height:16,background:z.border}}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:24,height:24,position:`relative`},onClick:()=>M(!0),title:`Main Menu`,children:(0,f.jsx)(`span`,{style:{fontSize:14,color:z.textSec,lineHeight:1},children:`☰`})})]})]}),(0,f.jsxs)(`div`,{style:{flex:1,display:`flex`,overflow:`hidden`},children:[(0,f.jsxs)(`div`,{style:{width:90,flexShrink:0,background:z.surface,borderRight:`1px solid ${z.border}`,display:`flex`,flexDirection:`column`,overflow:`hidden`},children:[(0,f.jsxs)(`div`,{style:{padding:`6px 8px`,textAlign:`center`,borderBottom:`1px solid ${z.border}`,background:z.panel},children:[(0,f.jsxs)(`div`,{className:`mono`,style:{fontSize:14,fontWeight:700,color:z.amber},children:[`Bank `,We]}),(0,f.jsx)(`div`,{style:{fontSize:9,color:z.textDim,letterSpacing:`.06em`,textTransform:`uppercase`},children:`Programs`})]}),(0,f.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:`4px 6px`,display:`flex`,flexDirection:`column`,gap:3},children:Ue.map(e=>(0,f.jsxs)(`div`,{className:`preset-chip-s ${e.num===S?`active`:``}`,onClick:()=>Ne(e.num),children:[(0,f.jsxs)(`div`,{className:`pcs-num`,children:[`0`,e.num]}),(0,f.jsx)(`div`,{className:`pcs-name`,children:e.name}),(0,f.jsx)(`div`,{className:`pcs-indicator`,style:{background:e.num===S?z.amber:z.border}})]},e.num))})]}),(0,f.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,overflow:`hidden`,minWidth:0},children:[(0,f.jsx)(`div`,{style:{display:`flex`,gap:4,padding:`3px 8px`,background:z.surface,borderBottom:`1px solid ${z.border}`,flexShrink:0},children:[{label:`Preset`,value:T.find(e=>e.num===S)?.name||`—`},{label:`Routing`,value:(n.routing_mode||`MONO`).toUpperCase()},{label:`Volume`,value:n.master_volume==null?`—`:`${Math.round(n.master_volume*100)}%`},{label:`Bank`,value:We}].map(e=>(0,f.jsxs)(`div`,{style:{flex:1,textAlign:`center`,padding:`2px 6px`,borderRadius:3,background:z.panel,border:`1px solid ${z.border}`},children:[(0,f.jsx)(`div`,{style:{fontSize:7,color:z.textDim,letterSpacing:`.06em`,textTransform:`uppercase`},children:e.label}),(0,f.jsx)(`div`,{className:`mono`,style:{fontSize:10,fontWeight:600,color:z.amber,marginTop:1},children:e.value})]},e.label))}),(0,f.jsx)(`div`,{style:{flex:Pe?`0 0 auto`:1,overflow:`hidden`},children:(0,f.jsx)(D,{blocks:i,selectedBlockId:c,onSelectBlock:Fe,onToggleBlock:Re,onReorder:N,onAddBlock:Ve,onRemoveBlock:He,onModelBrowser:F,looperStores:k.stores})}),Pe&&d[c]?(Pe.type||``).toLowerCase()===`looper`?(0,f.jsx)(b,{block:Pe,params:d[c]||{},looperStore:k.getStore(c),onParamChange:(e,t)=>Le(c,e,t),onParamChangeEnd:(e,t)=>ze(c,e,t),looperActions:$e(c)}):(0,f.jsx)(bt,{block:Pe,params:d[c]||{},viewMode:m,onToggleView:()=>h(e=>e===`slider`?`knob`:`slider`),onParamChange:(e,t)=>Le(c,e,t),onParamChangeEnd:(e,t)=>ze(c,e,t),onFocus:()=>se(c),onModelBrowser:F}):(0,f.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`,background:z.bg,color:z.textDim,fontSize:11},children:`Tap a block to edit parameters`})]})]}),(()=>{let e=i.find(e=>e.id===c),t=e&&(e.type||``).toLowerCase()===`looper`;return(0,f.jsx)(fe,{mode:E,blocks:i,selectedBlockId:c,currentBank:We,currentPreset:S,presets:Ue,onSelectBlock:Fe,onToggleBlock:Re,onBankUp:Ge,onBankDown:P,onGlobalBypass:qe,globalBypass:ne,onTunerToggle:Je,tunerEnabled:n.tuner_enabled,onPresetClick:e=>{let t=Ue[parseInt(e)];t&&Me(t.bank,t.num-1)},looperActive:t,looperTransport:t?$e(c):void 0})})()]}),oe&&i.find(e=>e.id===oe)&&d[oe]&&(0,f.jsx)(Te,{block:i.find(e=>e.id===oe),params:d[oe]||{},viewMode:m,onClose:()=>se(null),onParamChange:(e,t)=>Le(oe,e,t),onParamChangeEnd:(e,t)=>ze(oe,e,t),onToggleView:()=>h(e=>e===`slider`?`knob`:`slider`),onToggleBypass:Ye,onOpenModelBrowser:()=>F(oe)}),e===`captures`&&(0,f.jsx)(St,{onClose:()=>t(`main`)}),e===`presets`&&(0,f.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`,background:z.bg},children:[(0,f.jsxs)(`div`,{className:`screen-header`,children:[(0,f.jsx)(`div`,{className:`screen-title`,children:`Presets`}),(0,f.jsx)(`button`,{className:`btn-icon`,style:{width:28,height:28,fontSize:13},onClick:()=>t(`main`),children:`✕`})]}),(0,f.jsx)(`div`,{className:`screen-body`,children:T.map((e,n)=>(0,f.jsxs)(`div`,{className:`preset-row ${e.num===S?`active`:``}`,onClick:()=>{Ne(e.num),t(`main`)},children:[(0,f.jsx)(`div`,{className:`mono`,style:{width:26,height:26,borderRadius:5,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:11,fontWeight:700,background:e.num===S?`${z.amber}22`:z.surface,color:e.num===S?z.amber:z.textDim,border:`1px solid ${e.num===S?z.amber+`60`:z.border}`},children:e.num}),(0,f.jsxs)(`div`,{style:{flex:1},children:[(0,f.jsx)(`div`,{style:{fontSize:12,fontWeight:600},children:e.name}),(0,f.jsxs)(`div`,{className:`mono`,style:{fontSize:9,color:z.textDim},children:[`Bank `,e.bank==null?1:e.bank,`·Program `,e.num-1]})]}),e.num===S&&(0,f.jsx)(`span`,{style:{color:z.amber,fontSize:16},children:`●`})]},n))})]}),n.tuner_enabled&&(0,f.jsx)(he,{tunerData:n,connected:n.connected,onExit:()=>{r(e=>({...e,tuner_enabled:!1})),R.tunerToggle(!1).catch(()=>{})}}),ce&&(()=>{let e=i.find(e=>e.id===ce);return e?(0,f.jsx)(Ie,{currentBlockType:e.type,currentBlockName:e.name,currentModelPath:e.nam_model_path||e.ir_file_path,onSelectModel:Ze,onClose:()=>le(null)}):null})(),we&&(0,f.jsx)(Be,{onClose:()=>M(!1),onItemSelect:Oe}),Ee===`settings`&&(0,f.jsx)(Ke,{onClose:()=>De(null),onMasterVolume:e=>R.masterVolume(e).catch(()=>{})}),Ee===`eq`&&(0,f.jsx)(Xe,{onClose:()=>De(null)}),Ee===`routing`&&(0,f.jsx)(et,{onClose:()=>De(null)}),Ee===`wifi`&&(0,f.jsx)(rt,{onClose:()=>De(null)})]})]})}(0,u.createRoot)(document.getElementById(`root`)).render((0,f.jsx)(l.StrictMode,{children:(0,f.jsx)(Tt,{})})); \ No newline at end of file diff --git a/src/web/ui-dist/assets/index-D3aC6klh.css b/src/web/ui-dist/assets/index-D3aC6klh.css deleted file mode 100644 index fdcd305..0000000 --- a/src/web/ui-dist/assets/index-D3aC6klh.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Inter:wght@300;400;500;600&display=swap";@layer components;@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;margin:0;padding:0}body{background:var(--background);color:var(--foreground);-webkit-user-select:none;user-select:none;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;overflow:hidden}input,textarea,select{font-family:inherit}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.left-2{left:calc(var(--spacing) * 2)}.z-50{z-index:50}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.hidden{display:none}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:.625rem}.rounded-md{border-radius:calc(.625rem - 2px)}.rounded-sm{border-radius:calc(.625rem - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-transparent{border-color:#0000}.bg-background{background-color:var(--background)}.p-1{padding:var(--spacing)}.p-6{padding:calc(var(--spacing) * 6)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-0{padding-top:0}.pr-2{padding-right:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--foreground)}.uppercase{text-transform:uppercase}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}@media (hover:hover){.hover\:underline:hover{text-decoration-line:underline}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--background)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}@media (width>=48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}:root{--background:#0a0a0c;--foreground:#f0ede6}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}:root{--pedal-bg:#0a0a0c;--pedal-panel:#141418;--pedal-surface:#1c1c22;--pedal-border:#2a2a32;--pedal-border-light:#3a3a48;--pedal-amber:#e8a030;--pedal-amber-dim:#7a5218;--pedal-blue:#3a7ba8;--pedal-blue-dim:#1e4060;--pedal-green:#3ab87a;--pedal-green-dim:#1e6040;--pedal-red:#c84040;--pedal-red-dim:#602020;--pedal-purple:#9b59b6;--pedal-cyan:#1abc9c;--pedal-text:#f0ede6;--pedal-text-sec:#8888a0;--pedal-text-dim:#444458;--pedal-radius:.625rem;--pedal-fs-height:80px}.pedal-statusbar{background:var(--pedal-panel);border-bottom:1px solid var(--pedal-border);flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;min-height:32px;padding:6px 12px 4px;display:flex}.pedal-statusbar-left,.pedal-statusbar-right{align-items:center;gap:6px;display:flex}.pedal-statusbar-mid{flex:1;justify-content:center;align-items:center;gap:4px;display:flex}.pedal-brand{color:var(--pedal-text-sec);letter-spacing:.08em;text-transform:uppercase;font-family:JetBrains Mono,SF Mono,monospace;font-size:9px}.mode-selector{background:var(--pedal-surface);border:1px solid var(--pedal-border);border-radius:6px;gap:2px;display:flex;overflow:hidden}.mode-selector-collapsed{cursor:pointer;background:var(--pedal-surface);border:1px solid var(--pedal-border);border-radius:5px;align-items:center;gap:4px;padding:4px 8px;transition:background .15s;display:flex}.mode-selector-collapsed:hover{background:var(--pedal-border)}.mode-btn{letter-spacing:.04em;text-transform:uppercase;color:var(--pedal-text-dim);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex:1;align-items:center;gap:3px;padding:5px 7px;font-size:10px;font-weight:600;transition:all .12s;display:flex}.mode-btn:hover{color:var(--pedal-text-sec)}.mode-btn-active{background:var(--pedal-amber-dim);color:var(--pedal-amber)!important}.mode-btn-icon{font-size:11px}.mode-icon{color:var(--pedal-amber);font-size:12px}.mode-label{color:var(--pedal-text-sec);letter-spacing:.04em;text-transform:uppercase;font-size:10px;font-weight:600}.pedal-badge{letter-spacing:.06em;text-transform:uppercase;border-radius:3px;justify-content:center;align-items:center;padding:1px 5px;font-size:8px;font-weight:700;display:inline-flex}.pedal-badge-amber{color:var(--pedal-amber);background:#e8a03033}.pedal-badge-green{color:var(--pedal-green);background:#3ab87a33}.pedal-badge-red{color:var(--pedal-red);background:#c8404033}.pedal-badge-blue{color:var(--pedal-blue);background:#3a7ba833}.pedal-led-dot{border-radius:50%;flex-shrink:0;width:6px;height:6px}.footswitch-bar{background:var(--pedal-panel);border-top:1px solid var(--pedal-border);flex-shrink:0;justify-content:center;gap:3px;padding:4px 6px 6px;display:flex}.footswitch-slot{flex-direction:column;flex:1;align-items:center;gap:3px;min-width:0;max-width:56px;display:flex}.scribble-strip{border:1px solid var(--pedal-border);cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;background:#0d0d10;border-radius:3px;flex-direction:column;align-items:center;gap:1px;width:100%;padding:3px 2px;transition:border-color .15s;display:flex}.scribble-strip[data-active=true]{border-color:var(--scribble-color,var(--pedal-amber))}.scribble-strip[data-bypassed=true]{opacity:.5}.scribble-led{border-radius:50%;flex-shrink:0;width:4px;height:4px;margin-bottom:1px;transition:opacity .15s}.scribble-label-wrap{flex-direction:column;justify-content:center;align-items:center;width:100%;min-height:22px;display:flex}.scribble-label{color:var(--pedal-text);text-align:center;white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-family:JetBrains Mono,SF Mono,monospace;font-size:8px;font-weight:600;line-height:1.1;overflow:hidden}.scribble-sublabel{color:var(--scribble-color,var(--pedal-text-sec));text-align:center;white-space:nowrap;text-overflow:ellipsis;text-transform:uppercase;letter-spacing:.03em;max-width:100%;font-family:JetBrains Mono,SF Mono,monospace;font-size:6.5px;line-height:1;overflow:hidden}.scribble-icon{font-size:9px;line-height:1}.footswitch-btn{cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;width:42px;height:42px;transition:transform 80ms;position:relative}.footswitch-btn:active{transform:scale(.93)}.footswitch-ring{border:2.5px solid var(--pedal-border);background:radial-gradient(circle at 40% 35%,#2a2a38,#141418);border-radius:50%;transition:border-color .12s,box-shadow .12s;position:absolute;inset:0;box-shadow:0 2px 6px #00000080,inset 0 1px #ffffff0f}.footswitch-btn-active .footswitch-ring{border-color:var(--fs-color,var(--pedal-green));box-shadow:0 2px 6px #00000080, inset 0 1px 0 #ffffff0f, 0 0 8px var(--fs-color,var(--pedal-green))}.footswitch-btn-bypassed .footswitch-ring{opacity:.5;border-color:var(--pedal-text-dim);box-shadow:0 2px 6px #00000080}.footswitch-cap{background:radial-gradient(circle at 38% 32%,#3a3a48,#1a1a22);border-radius:50%;position:absolute;inset:8px;box-shadow:inset 0 1px #ffffff14,inset 0 -1px #0000004d}.footswitch-cap:after{content:"";background:radial-gradient(circle at 50% 35%,#5a5a6a,#2a2a38);border-radius:50%;width:8px;height:8px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.pedal-tabbar{background:var(--pedal-panel);border-top:1px solid var(--pedal-border);flex-shrink:0;display:flex}.pedal-tab{letter-spacing:.04em;text-align:center;text-transform:uppercase;color:var(--pedal-text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;border-top:2px solid #0000;flex:1;padding:8px 4px 6px;font-size:9px;font-weight:500;transition:all .12s}.pedal-tab-active{color:var(--pedal-amber);border-top-color:var(--pedal-amber)}.pedal-tab-icon{margin-bottom:1px;font-size:13px;display:block}.pedal-screen{flex-direction:column;flex:1;display:flex;overflow:hidden}@media (width<=420px){.footswitch-bar{gap:2px;padding:3px 3px 5px}.footswitch-slot{max-width:48px}.footswitch-btn{width:36px;height:36px}.footswitch-cap{inset:6px}.footswitch-cap:after{width:6px;height:6px}.scribble-label{font-size:7px}.mode-btn{padding:3px 5px;font-size:9px}.mode-btn-label{display:none}}.pedal-shell{background:var(--pedal-bg);width:100%;max-width:440px;height:100dvh;color:var(--pedal-text);flex-direction:column;margin:0 auto;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;display:flex;overflow:hidden}@media (width>=441px){.pedal-shell{border-left:1px solid var(--pedal-border);border-right:1px solid var(--pedal-border)}} diff --git a/src/web/ui-dist/assets/index-jhtO2NOz.js b/src/web/ui-dist/assets/index-jhtO2NOz.js deleted file mode 100644 index c5260e5..0000000 --- a/src/web/ui-dist/assets/index-jhtO2NOz.js +++ /dev/null @@ -1,35 +0,0 @@ -var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function w(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ie(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ae=/\/+/g;function oe(e,t){return typeof e==`object`&&e&&e.key!=null?ie(``+e.key):t.toString(36)}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+oe(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ae,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(w(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ae,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{n.exports=t()})),r=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,w());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?w():ee=!1}}}var w;if(typeof y==`function`)w=function(){y(re)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=re,w=function(){ae.postMessage(null)}}else w=function(){_(re,0)};function oe(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,w()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),i=e(((e,t)=>{t.exports=r()})),a=e((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=i(),r=n(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1pe||(e.current=fe[pe],fe[pe]=null,pe--)}function O(e,t){pe++,fe[pe]=e.current,e.current=t}var he=me(null),ge=me(null),_e=me(null),ve=me(null);function ye(e,t){switch(O(_e,t),O(ge,e),O(he,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}D(he),O(he,e)}function be(){D(he),D(ge),D(_e)}function xe(e){e.memoizedState!==null&&O(ve,e);var t=he.current,n=Hd(t,e.type);t!==n&&(O(ge,e),O(he,n))}function Se(e){ge.current===e&&(D(he),D(ge)),ve.current===e&&(D(ve),Qf._currentValue=de)}var Ce,we;function Te(e){if(Ce===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Ce=t&&t[1]||``,we=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function nt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function rt(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function it(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function at(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function ot(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function st(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),yn=!1;if(vn)try{var bn={};Object.defineProperty(bn,"passive",{get:function(){yn=!0}}),window.addEventListener(`test`,bn,bn),window.removeEventListener(`test`,bn,bn)}catch{yn=!1}var xn=null,Sn=null,Cn=null;function wn(){if(Cn)return Cn;var e,t=Sn,n=t.length,r,i=`value`in xn?xn.value:xn.textContent,a=i.length;for(e=0;e=nr),ar=` `,or=!1;function sr(e,t){switch(e){case`keyup`:return er.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function cr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var lr=!1;function ur(e,t){switch(e){case`compositionend`:return cr(t);case`keypress`:return t.which===32?(or=!0,ar):null;case`textInput`:return e=t.data,e===ar&&or?null:e;default:return null}}function dr(e,t){if(lr)return e===`compositionend`||!tr&&sr(e,t)?(e=wn(),Cn=Sn=xn=null,lr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Nr(n)}}function Fr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Fr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ir(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gt(e.document)}return t}function Lr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Rr=vn&&`documentMode`in document&&11>=document.documentMode,zr=null,Br=null,Vr=null,Hr=!1;function Ur(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Hr||zr==null||zr!==Gt(r)||(r=zr,`selectionStart`in r&&Lr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Vr&&Mr(Vr,r)||(Vr=r,r=Ed(Br,`onSelect`),0>=o,i-=o,Fi=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),j&&Li(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),j&&Li(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return j&&Li(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),j&&Li(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Fa(l)===r.type){n(e,r.sibling),c=i(r,a.props),Ha(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=Si(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=xi(a.type,a.key,a.props,null,e.mode,c),Ha(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=Ti(a,e.mode,c),c.return=e,e=c}return o(e);case w:return a=Fa(a),b(e,r,a,c)}if(ue(a))return h(e,r,a,c);if(se(a)){if(l=se(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,Va(a),c);if(a.$$typeof===S)return b(e,r,ua(e,a),c);Ua(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=Ci(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{Ba=0;var i=b(e,t,n,r);return za=null,i}catch(t){if(t===ka||t===ja)throw t;var a=_i(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ga=Wa(!0),Ka=Wa(!1),qa=!1;function Ja(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ya(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Xa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Za(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=mi(e),pi(e,null,n),t}return ui(e,r,t,n),mi(e)}function Qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,lt(e,n)}}function $a(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var eo=!1;function to(){if(eo){var e=ba;if(e!==null)throw e}}function no(e,t,n,r){eo=!1;var i=e.updateQueue;qa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===ya&&(eo=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:qa=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Kl|=o,e.lanes=o,e.memoizedState=d}}function ro(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function io(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,zs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Rs(e,t,Ca(c,r),pu(e)):Rs(e,t,r,pu(e))}catch(n){Rs(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function Os(){}function ks(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=As(e).queue;Ds(e,i,t,de,n===null?Os:function(){return js(e),n(r)})}function As(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Bo,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Bo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function js(e){var t=As(e);t.next===null&&(t=e.alternate.memoizedState),Rs(e,t.next.queue,{},pu())}function Ms(){return la(Qf)}function Ns(){return R().memoizedState}function Ps(){return R().memoizedState}function Fs(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Xa(n);var r=Za(t,e,n);r!==null&&(hu(r,t,n),Qa(r,t,n)),t={cache:ha()},e.payload=t;return}t=t.return}}function Is(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Bs(e)?Vs(t,n):(n=di(e,t,n,r),n!==null&&(hu(n,e,r),Hs(n,t,r)))}function Ls(e,t,n){Rs(e,t,n,pu())}function Rs(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Bs(e))Vs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,jr(s,o))return ui(e,t,i,0),G===null&&li(),!1}catch{}if(n=di(e,t,i,r),n!==null)return hu(n,e,r),Hs(n,t,r),!0}return!1}function zs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Bs(e)){if(t)throw Error(s(479))}else t=di(e,n,r,2),t!==null&&hu(t,e,2)}function Bs(e){var t=e.alternate;return e===P||t!==null&&t===P}function Vs(e,t){xo=bo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Hs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,lt(e,n)}}var Us={readContext:la,use:Ro,useCallback:L,useContext:L,useEffect:L,useImperativeHandle:L,useLayoutEffect:L,useInsertionEffect:L,useMemo:L,useReducer:L,useRef:L,useState:L,useDebugValue:L,useDeferredValue:L,useTransition:L,useSyncExternalStore:L,useId:L,useHostTransitionStatus:L,useFormState:L,useActionState:L,useOptimistic:L,useMemoCache:L,useCacheRefresh:L};Us.useEffectEvent=L;var Ws={readContext:la,use:Ro,useCallback:function(e,t){return Fo().memoizedState=[e,t===void 0?null:t],e},useContext:la,useEffect:ms,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),fs(4194308,4,bs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return fs(4194308,4,e,t)},useInsertionEffect:function(e,t){fs(4,2,e,t)},useMemo:function(e,t){var n=Fo();t=t===void 0?null:t;var r=e();if(So){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Fo();if(n!==void 0){var i=n(t);if(So){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Is.bind(null,P,e),[r.memoizedState,e]},useRef:function(e){var t=Fo();return e={current:e},t.memoizedState=e},useState:function(e){e=Xo(e);var t=e.queue,n=Ls.bind(null,P,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Ss,useDeferredValue:function(e,t){return Ts(Fo(),e,t)},useTransition:function(){var e=Xo(!1);return e=Ds.bind(null,P,e.queue,!0,!1),Fo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=P,i=Fo();if(j){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),G===null)throw Error(s(349));q&127||Go(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,ms(qo.bind(null,r,a,e),[e]),r.flags|=2048,us(9,{destroy:void 0},Ko.bind(null,r,a,n,t),null),n},useId:function(){var e=Fo(),t=G.identifierPrefix;if(j){var n=Ii,r=Fi;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=Co++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[gt]=t,a[_t]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Lc(t)}}return B(t),Rc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Lc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=_e.current,Yi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Hi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[gt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Ki(t,!0)}else e=Bd(e).createTextNode(r),e[gt]=t,t.stateNode=e}return B(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Yi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[gt]=t}else Xi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;B(t),e=!1}else n=Zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(_o(t),t):(_o(t),null);if(t.flags&128)throw Error(s(558))}return B(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=Yi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[gt]=t}else Xi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;B(t),i=!1}else i=Zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(_o(t),t):(_o(t),null)}return _o(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Bc(t,t.updateQueue),B(t),null);case 4:return be(),e===null&&Sd(t.stateNode.containerInfo),B(t),null;case 10:return ra(t.type),B(t),null;case 19:if(D(N),r=t.memoizedState,r===null)return B(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)Vc(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=vo(e),a!==null){for(t.flags|=128,Vc(r,!1),e=a.updateQueue,t.updateQueue=e,Bc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)bi(n,e),n=n.sibling;return O(N,N.current&1|2),j&&Li(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>nu&&(t.flags|=128,i=!0,Vc(r,!1),t.lanes=4194304)}else{if(!i)if(e=vo(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Bc(t,e),Vc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!j)return B(t),null}else 2*Fe()-r.renderingStartTime>nu&&n!==536870912&&(t.flags|=128,i=!0,Vc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(B(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=N.current,O(N,i?n&1|2:n&1),j&&Li(t,r.treeForkCount),e);case 22:case 23:return _o(t),lo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(B(t),t.subtreeFlags&6&&(t.flags|=8192)):B(t),n=t.updateQueue,n!==null&&Bc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&D(Ta),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ra(M),B(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Uc(e,t){switch(Bi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ra(M),be(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Se(t),null;case 31:if(t.memoizedState!==null){if(_o(t),t.alternate===null)throw Error(s(340));Xi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(_o(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Xi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return D(N),null;case 4:return be(),null;case 10:return ra(t.type),null;case 22:case 23:return _o(t),lo(),e!==null&&D(Ta),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ra(M),null;case 25:return null;default:return null}}function Wc(e,t){switch(Bi(t),t.tag){case 3:ra(M),be();break;case 26:case 27:case 5:Se(t);break;case 4:be();break;case 31:t.memoizedState!==null&&_o(t);break;case 13:_o(t);break;case 19:D(N);break;case 10:ra(t.type);break;case 22:case 23:_o(t),lo(),e!==null&&D(Ta);break;case 24:ra(M)}}function Gc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Kc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function qc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{io(t,n)}catch(t){Z(e,e.return,t)}}}function Jc(e,t,n){n.props=Zs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Yc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Xc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Zc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Qc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[_t]=t}catch(t){Z(e,e.return,t)}}function $c(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function el(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||$c(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function tl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ln));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(tl(e,t,n),e=e.sibling;e!==null;)tl(e,t,n),e=e.sibling}function nl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(nl(e,t,n),e=e.sibling;e!==null;)nl(e,t,n),e=e.sibling}function rl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[gt]=e,t[_t]=n}catch(t){Z(e,e.return,t)}}var il=!1,V=!1,al=!1,ol=typeof WeakSet==`function`?WeakSet:Set,H=null;function sl(e,t){if(e=e.containerInfo,Rd=sp,e=Ir(e),Lr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,H=t;H!==null;)if(t=H,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,H=e;else for(;H!==null;){switch(t=H,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[gt]=e,k(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Pr(s,h),v=Pr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var a=au,o=su;if(X=0,ou=au=null,su=0,W&6)throw Error(s(331));var c=W;if(W|=4,Il(a.current),Ol(a,a.current,o,n),W=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,a)}catch{}return!0}finally{E.p=i,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=Di(n,t),t=rc(e.stateNode,t,2),e=Za(e,t,2),e!==null&&(ot(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(iu===null||!iu.has(r))){e=Di(n,e),n=ic(2),r=Za(t,n,2),r!==null&&(ac(n,r,t,e),ot(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Bl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Wl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Fe()-eu?!(W&2)&&Su(e,0):Jl|=n,Xl===q&&(Xl=0)),rd(e)}function qu(e,t){t===0&&(t=it()),e=fi(e,t),e!==null&&(ot(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=q,a=tt(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||nt(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}X!==0&&X!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=qt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+qt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+qt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+qt(n.imageSizes)+`"]`)):i+=`[href="`+qt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),k(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+qt(r)+`"][href="`+qt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),k(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Ot(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);k(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Ot(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),k(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=_e.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Ot(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Ot(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Ot(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+qt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),k(t),e.head.appendChild(t))}function Pf(e){return`[src="`+qt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+qt(n.href)+`"]`);if(r)return t.instance=r,k(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),k(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,k(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),k(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,k(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),k(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,k(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),k(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=n(),u=c(),d=window.location.origin,f=d.replace(/^http/,`ws`)+`/ws`;async function p(e){let t=await fetch(`${d}${e}`);if(!t.ok)throw Error(`${e} => ${t.status}`);return t.json()}async function m(e,t){let n=await fetch(`${d}${e}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:t==null?void 0:JSON.stringify(t)});if(!n.ok)throw Error(`${e} => ${n.status}`);return n.json()}async function h(e,t){let n=await fetch(`${d}${e}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`${e} => ${n.status}`);return n.json()}async function g(e,t){let n=new FormData;n.append(`file`,t);let r=await fetch(`${d}${e}`,{method:`POST`,body:n});if(!r.ok)throw Error(`${e} => ${r.status}`);return r.json()}function _(){let[e,t]=(0,l.useState)(null),[n,r]=(0,l.useState)(!1),i=(0,l.useRef)(null),a=(0,l.useRef)(null);return(0,l.useEffect)(()=>{p(`/api/state`).then(e=>{t(e),r(!0)}).catch(()=>{r(!1)});let e;function n(){try{let a=new WebSocket(f);a.onmessage=e=>{try{let n=JSON.parse(e.data);(n.type===`connected`||n.type===`state`)&&(t(n.state),r(!0)),n.type===`preset_changed`&&n.state&&t(n.state),n.type===`bypass_changed`&&t(e=>e&&{...e,bypass:n.bypass}),n.type===`tuner_changed`&&t(e=>e&&{...e,tuner_enabled:n.tuner_enabled}),n.type===`routing_changed`&&t(e=>e&&{...e,routing_mode:n.routing_mode,routing_breakpoint:n.routing_breakpoint}),(n.type===`model_loaded`||n.type===`ir_loaded`)&&p(`/api/state`).then(e=>t(e))}catch{}},a.onclose=()=>{r(!1),e=setTimeout(n,3e3)},a.onerror=()=>a.close(),i.current=a}catch{e=setTimeout(n,3e3)}}return n(),a.current=setInterval(()=>{p(`/api/state`).then(e=>{t(e),r(!0)}).catch(()=>{})},5e3),()=>{a.current&&clearInterval(a.current),clearTimeout(e),i.current&&i.current.close()}},[]),{state:e,connected:n,refresh:(0,l.useCallback)(()=>{p(`/api/state`).then(e=>{t(e),r(!0)}).catch(()=>{})},[])}}async function v(){return p(`/api/presets`)}async function y(e,t){await m(`/api/presets/${e}/${t}/activate`)}var b=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),x=e(((e,t)=>{t.exports=b()}))(),ee=(0,l.createContext)(null);function S(e,t){let n=[];for(let t=0;t<8;t++){let r=e[t];r?n.push({key:`stomp-${r.id}`,label:r.title.length>6?r.title.slice(0,6):r.title,sublabel:r.bypassed?`BYP`:`ON`,color:r.bypassed?`off`:`green`,active:!r.bypassed,bypassed:r.bypassed}):n.push({key:`stomp-empty-${t}`,label:`—`,sublabel:``,color:`off`,active:!1,bypassed:!1})}return n}function C(e,t,n){let r=[];r.push({key:`bank-down`,label:`BANK`,sublabel:t>0?`${n[t-1]||`−`}`:`—`,color:`blue`,active:t>0}),r.push({key:`bank-up`,label:`BANK`,sublabel:t6?r.name.slice(0,6):r.name||`Snap ${n+1}`,sublabel:r.active?`ACTIVE`:``,color:r.active?`amber`:`off`,active:r.active}):t.push({key:`snapshot-empty-${n}`,label:`Snap ${n+1}`,sublabel:``,color:`off`,active:!1})}return t}function ne(e,t,n,r){return[...S(e.slice(0,4),t).slice(0,4),{key:`bank-down`,label:`BANK`,sublabel:r>0?`▼`:`—`,color:`blue`,active:r>0},{key:`bank-up`,label:`BANK`,sublabel:r{try{let e=localStorage.getItem(`pedal-footswitch-bank`);return e===null?0:parseInt(e,10)}catch{return 0}}),[p,h]=(0,l.useState)(0),[g,_]=(0,l.useState)(!1);(0,l.useEffect)(()=>{try{localStorage.setItem(`pedal-footswitch-bank`,String(d))}catch{}},[d]);let v;switch(c){case`stomp`:v=S(i,t);break;case`preset`:v=C(t,d,a);break;case`snapshot`:v=te(o);break;case`combo`:v=ne(i,t,a,d);break;default:v=S(i,t)}let b=(0,l.useCallback)(e=>{switch(c){case`stomp`:{let t=i[e];t&&s&&s(t.id,!t.bypassed);break}case`preset`:if(e===0)f(e=>Math.max(0,e-1));else if(e===1)f(e=>Math.min(a.length-1,e+1));else{let t=e-2;n&&(y(d,t).then(()=>r()),h(t))}break;case`snapshot`:n&&m(`/api/snapshots/${e}/recall`).catch(()=>{});break;case`combo`:if(e<4){let t=i[e];t&&s&&s(t.id,!t.bypassed)}else e===4?f(e=>Math.max(0,e-1)):e===5?f(e=>Math.min(a.length-1,e+1)):e===6?u(`preset`):e===7&&n&&m(`/api/bypass`,{bypass:!t?.bypass}).catch(()=>{});break}},[c,i,s,n,d,a,t,r]),re=(0,l.useCallback)(e=>{switch(c){case`stomp`:e===7&&n&&m(`/api/tuner`,{enabled:!t?.tuner_enabled}).catch(()=>{});break;case`preset`:e===0?f(0):e===1&&f(a.length-1);break;case`snapshot`:n&&m(`/api/snapshots/${e}/save`).catch(()=>{});break;case`combo`:e===7&&n&&m(`/api/tuner`,{enabled:!t?.tuner_enabled}).catch(()=>{});break}},[c,t,n,a]),w=(0,l.useCallback)(e=>{f(e)},[]),ie=(0,l.useCallback)(e=>{h(e),n&&y(d,e).then(()=>r())},[n,d,r]),ae={mode:c,setMode:u,scribbleData:v,handleFootswitch:b,handleSecondary:re,currentBankIndex:d,currentPresetIndex:p,setBank:w,setPreset:ie,dirty:g};return(0,x.jsx)(ee.Provider,{value:ae,children:e})}function w(){let e=(0,l.useContext)(ee);if(!e)throw Error(`useFootswitchMode must be used within a FootswitchModeProvider`);return e}var ie={stomp:`Stomp`,preset:`Preset`,snapshot:`Snapshot`,combo:`Combo`,transport:`Transport`},ae={amber:`#E8A030`,green:`#3AB87A`,red:`#C84040`,blue:`#3A7BA8`,purple:`#9B59B6`,cyan:`#1ABC9C`,white:`#F0EDE6`,off:`#444458`};function oe({threshold:e=300,onSingleTap:t,onDoubleTap:n}){let r=(0,l.useRef)(0),i=(0,l.useRef)(null);return{handleTap:(0,l.useCallback)(()=>{let a=Date.now();a-r.current{t?.(),i.current=null},e))},[e,t,n])}}function se({data:e,onPress:t,onSecondary:n}){let{handleTap:r}=oe({onSingleTap:t,onDoubleTap:n}),i=ae[e.color??`off`],a=e.active??!1;return(0,x.jsxs)(`div`,{className:`scribble-strip`,"data-active":a,"data-bypassed":e.bypassed??!1,onClick:r,style:{"--scribble-color":i},children:[(0,x.jsx)(`div`,{className:`scribble-led`,style:{background:i,boxShadow:a?`0 0 6px ${i}`:`none`,opacity:a?1:.25}}),(0,x.jsxs)(`div`,{className:`scribble-label-wrap`,children:[(0,x.jsx)(`span`,{className:`scribble-label`,children:e.label||`—`}),e.sublabel&&(0,x.jsx)(`span`,{className:`scribble-sublabel`,children:e.sublabel})]}),e.icon&&(0,x.jsx)(`span`,{className:`scribble-icon`,children:e.icon})]})}function ce(){let{scribbleData:e,handleFootswitch:t,handleSecondary:n}=w();return(0,x.jsx)(`div`,{className:`footswitch-bar`,children:e.map((e,r)=>(0,x.jsxs)(`div`,{className:`footswitch-slot`,children:[(0,x.jsx)(se,{data:e,onPress:()=>t(r),onSecondary:()=>n(r)}),(0,x.jsxs)(`div`,{className:`footswitch-btn ${e.active?`footswitch-btn-active`:``} ${e.bypassed?`footswitch-btn-bypassed`:``}`,onClick:()=>t(r),onContextMenu:e=>{e.preventDefault(),n(r)},style:{"--fs-color":e.color},children:[(0,x.jsx)(`div`,{className:`footswitch-ring`}),(0,x.jsx)(`div`,{className:`footswitch-cap`})]})]},e.key))})}var le=[`stomp`,`preset`,`snapshot`,`combo`],ue={stomp:`◉`,preset:`☆`,snapshot:`◆`,combo:`◈`,transport:`▶`};function T({collapsed:e=!1}){let{mode:t,setMode:n}=w();if(e){let e=(le.indexOf(t)+1)%le.length;return(0,x.jsxs)(`div`,{className:`mode-selector mode-selector-collapsed`,onClick:()=>n(le[e]),title:`Mode: ${ie[t]} — tap to switch`,children:[(0,x.jsx)(`span`,{className:`mode-icon`,children:ue[t]}),(0,x.jsx)(`span`,{className:`mode-label`,children:ie[t]})]})}return(0,x.jsx)(`div`,{className:`mode-selector`,children:le.map(e=>(0,x.jsxs)(`button`,{className:`mode-btn ${t===e?`mode-btn-active`:``}`,onClick:()=>n(e),title:ie[e],children:[(0,x.jsx)(`span`,{className:`mode-btn-icon`,children:ue[e]}),(0,x.jsx)(`span`,{className:`mode-btn-label`,children:ie[e]})]},e))})}var E={bg:`#0A0A0C`,panel:`#141418`,surface:`#1C1C22`,border:`#2A2A32`,amber:`#E8A030`,blue:`#3A7BA8`,blueDim:`#1E4060`,amberDim:`#7A5218`,green:`#3AB87A`,red:`#C84040`,text:`#F0EDE6`,textSec:`#8888A0`,textDim:`#444458`};function de({level:e=0,height:t=60}){let n=Math.round(e/100*12),r=e=>e>=10?E.red:e>=8?`#E8C030`:E.green;return(0,x.jsx)(`div`,{style:{display:`flex`,flexDirection:`column-reverse`,gap:2,height:t,alignItems:`center`},children:Array.from({length:12}).map((e,i)=>(0,x.jsx)(`div`,{style:{width:6,height:(t-24)/12,borderRadius:1,background:i{e?.master_volume!=null&&r(Math.round(e.master_volume*100))},[e?.master_volume]),(0,l.useEffect)(()=>{e?.bypass!==void 0&&a(null),e?.tuner_enabled!==void 0&&s(null)},[e?.bypass,e?.tuner_enabled]);let d=async e=>{r(e);try{await h(`/api/volume`,{volume:e/100})}catch{}},f=async()=>{let e=!c;a(e);try{await m(`/api/bypass`,{bypass:e})}catch{a(null)}},p=async()=>{let e=!u;s(e);try{await m(`/api/tuner`,{enabled:e})}catch{s(null)}},g=e?.input_level??0,_=e?.output_level??0;return(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsxs)(`div`,{className:`screen-header`,children:[(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:`Active Rig`}),(0,x.jsxs)(`div`,{style:{display:`flex`,gap:6,marginTop:4,flexWrap:`wrap`,alignItems:`center`},children:[e?.current_preset?(0,x.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.amber,border:`1px solid ${E.amber}55`,background:`${E.amber}15`,padding:`3px 8px`,borderRadius:5},children:e.current_preset.name}):(0,x.jsx)(`span`,{style:{fontSize:11,color:E.textDim},children:`No preset loaded`}),t?(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-green`,children:`Connected`}):(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-red`,children:`Offline`})]})]}),(0,x.jsxs)(`div`,{style:{display:`flex`,gap:6,alignItems:`center`},children:[(0,x.jsx)(de,{level:g,height:44}),(0,x.jsx)(de,{level:_,height:44})]})]}),(0,x.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:12},children:[(0,x.jsxs)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12,display:`flex`,gap:10,justifyContent:`space-around`},children:[(0,x.jsxs)(`div`,{style:{textAlign:`center`},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Bypass`}),(0,x.jsx)(`div`,{className:`switch ${c?`on`:``}`,onClick:f,style:{margin:`0 auto`}})]}),(0,x.jsxs)(`div`,{style:{textAlign:`center`},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Tuner`}),(0,x.jsx)(`div`,{className:`switch ${u?`on`:``}`,onClick:p,style:{margin:`0 auto`}})]}),(0,x.jsxs)(`div`,{style:{textAlign:`center`},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Routing`}),(0,x.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:12,color:E.amber},children:e?.routing_mode||`mono`})]})]}),u&&(0,x.jsxs)(`div`,{style:{background:`${E.amber}15`,border:`1px solid ${E.amber}`,borderRadius:8,textAlign:`center`,padding:`20px 16px`},children:[(0,x.jsx)(`div`,{style:{fontSize:32,marginBottom:8},children:`🎵`}),(0,x.jsx)(`div`,{className:`section-label`,style:{color:E.amber,marginBottom:4,fontSize:14},children:`TUNER ACTIVE`}),(0,x.jsx)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:24,color:E.amber,letterSpacing:4},children:`—————●—————`}),(0,x.jsx)(`div`,{style:{fontSize:11,color:E.textDim,marginTop:8},children:`Tap switch again to exit tuner mode`})]}),(0,x.jsxs)(`div`,{style:{background:E.panel,border:`1px solid ${E.border}`,borderRadius:10,padding:16,display:`flex`,gap:20,alignItems:`center`},children:[(0,x.jsxs)(`div`,{style:{flex:1},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Master Volume`}),(0,x.jsx)(`input`,{type:`range`,min:0,max:100,value:n,onChange:e=>d(+e.target.value),style:{width:`100%`,accentColor:E.amber}}),(0,x.jsxs)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.amber,marginTop:4},children:[n,`%`]})]}),(0,x.jsxs)(`div`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.textSec,textAlign:`right`},children:[e?.nam_loaded?`NAM: Active`:`NAM: —`,(0,x.jsx)(`br`,{}),e?.ir_loaded?`IR: Active`:`IR: —`]})]}),(0,x.jsxs)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Signal Chain`}),(0,x.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,overflowX:`auto`,padding:`4px 0`},children:[`IN`,e?.bypass?`BYP`:e?.nam_loaded?`NAM`:`AMP`,e?.ir_loaded?`IR`:`CAB`,`OUT`].map((e,t,n)=>(0,x.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,flexShrink:0},children:[(0,x.jsx)(`div`,{style:{padding:`3px 8px`,borderRadius:4,fontSize:10,fontWeight:700,background:t===0||t===n.length-1?E.blueDim:E.amberDim,color:t===0||t===n.length-1?E.blue:E.amber,border:`1px solid ${t===0||t===n.length-1?E.blue:E.amber}60`},children:e}),ta(e=>!e),children:[(0,x.jsx)(`div`,{style:{width:8,height:8,borderRadius:`50%`,background:r?E.textDim:E.green,boxShadow:r?`none`:`0 0 8px ${E.green}`}}),(0,x.jsx)(`span`,{style:{flex:1,fontSize:13,fontWeight:600},children:e}),(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-blue`,style:{fontSize:10,padding:`2px 7px`},children:t}),(0,x.jsx)(`span`,{style:{color:E.textDim,fontSize:18,marginLeft:6},children:i?`▾`:`▸`})]})})}function D({state:e,connected:t}){let[n,r]=(0,l.useState)([]),[i,a]=(0,l.useState)(!0);return(0,l.useEffect)(()=>{if(!t||!e?.current_preset){r([]),a(!1);return}v().then(t=>{let n=t.banks||[],i=e.current_preset,o=i?n[i.bank]?.presets?.[i.program]:null;o?.chain&&r(o.chain.map((e,t)=>({id:t+1,title:fe[e.fx_type]||e.fx_type,type:e.fx_type,bypassed:e.bypassed??!1}))),a(!1)}).catch(()=>{r([]),a(!1)})},[t,e]),i?(0,x.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,x.jsx)(`div`,{className:`loader`})}):(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsx)(`div`,{className:`screen-header`,children:(0,x.jsxs)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:[`FX Chain `,n.length>0?`(${n.length})`:``]})}),(0,x.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:12},children:n.length===0?(0,x.jsx)(`div`,{style:{textAlign:`center`,padding:30,color:E.textDim,fontSize:14},children:`No FX blocks in the chain.`}):n.map(e=>(0,x.jsx)(me,{...e,active:!e.bypassed},e.id))})]})}function O({connected:e,refresh:t}){let[n,r]=(0,l.useState)([]),[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(!0),[c,u]=(0,l.useState)(null),d=(0,l.useCallback)(async()=>{if(!e){s(!1);return}try{let e=await p(`/api/models`);r(e.models||[]),a(e.current??null)}catch{}s(!1)},[e]);(0,l.useEffect)(()=>{d()},[d]);let f=async e=>{if(e)try{await m(`/api/models/load`,{path:e}),await d(),t()}catch{alert(`Failed to load model`)}};return o?(0,x.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,x.jsx)(`div`,{className:`loader`})}):(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsxs)(`div`,{className:`screen-header`,children:[(0,x.jsxs)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:[`NAM Models (`,n.length,`)`]}),(0,x.jsx)(`button`,{className:`btn btn-primary btn-sm`,onClick:()=>c?.click(),children:`+ Upload`}),(0,x.jsx)(`input`,{ref:e=>u(e),type:`file`,accept:`.nam`,style:{display:`none`},onChange:async e=>{let t=e.target.files?.[0];if(t)try{await g(`/api/models/upload`,t),await d()}catch{alert(`Upload failed`)}}})]}),(0,x.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:8},children:[i&&(0,x.jsxs)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Loaded Model`}),(0,x.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,x.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.blue,border:`1px solid ${E.blue}55`,background:`${E.blue}15`,padding:`3px 8px`,borderRadius:5},children:i}),(0,x.jsx)(`button`,{className:`btn btn-danger btn-sm`,onClick:async()=>{try{await m(`/api/models/unload`),a(null),await d(),t()}catch{alert(`Failed to unload`)}},children:`Unload`})]})]}),n.length===0?(0,x.jsx)(`div`,{style:{textAlign:`center`,padding:30,color:E.textDim,fontSize:14},children:`No NAM models found.`}):n.map(e=>(0,x.jsxs)(`div`,{className:`preset-row`,style:{border:e.loaded?`1px solid ${E.amber}40`:`1px solid transparent`,background:e.loaded?`${E.amber}08`:`transparent`},onClick:()=>!e.loaded&&f(e.path),children:[(0,x.jsxs)(`div`,{style:{flex:1},children:[(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:500},children:e.name}),(0,x.jsxs)(`div`,{style:{fontSize:10,color:E.textDim},children:[e.architecture,` · `,e.size_mb,` MB`]})]}),e.loaded?(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-green`,children:`Loaded`}):(0,x.jsx)(`button`,{className:`btn btn-ghost btn-sm`,children:`Load`})]},e.name))]})]})}function he({connected:e,refresh:t}){let[n,r]=(0,l.useState)([]),[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(!0),[c,u]=(0,l.useState)(null),d=(0,l.useCallback)(async()=>{if(!e){s(!1);return}try{let e=await p(`/api/irs`);r(e.irs||[]),a(e.current??null)}catch{}s(!1)},[e]);(0,l.useEffect)(()=>{d()},[d]);let f=async e=>{if(e)try{await m(`/api/irs/load`,{path:e}),await d(),t()}catch{alert(`Failed to load IR`)}};return o?(0,x.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,x.jsx)(`div`,{className:`loader`})}):(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsxs)(`div`,{className:`screen-header`,children:[(0,x.jsxs)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:[`IR Files (`,n.length,`)`]}),(0,x.jsx)(`button`,{className:`btn btn-primary btn-sm`,onClick:()=>c?.click(),children:`+ Upload`}),(0,x.jsx)(`input`,{ref:e=>u(e),type:`file`,accept:`.wav`,style:{display:`none`},onChange:async e=>{let t=e.target.files?.[0];if(t)try{await g(`/api/irs/upload`,t),await d()}catch{alert(`Upload failed`)}}})]}),(0,x.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:8},children:[i&&(0,x.jsxs)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`Loaded IR`}),(0,x.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,x.jsx)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.green,border:`1px solid ${E.green}55`,background:`${E.green}15`,padding:`3px 8px`,borderRadius:5},children:i}),(0,x.jsx)(`button`,{className:`btn btn-danger btn-sm`,onClick:async()=>{try{await m(`/api/irs/unload`),a(null),await d(),t()}catch{alert(`Failed to unload`)}},children:`Unload`})]})]}),n.length===0?(0,x.jsx)(`div`,{style:{textAlign:`center`,padding:30,color:E.textDim,fontSize:14},children:`No IR files found.`}):n.map(e=>(0,x.jsxs)(`div`,{className:`preset-row`,style:{border:e.loaded?`1px solid ${E.amber}40`:`1px solid transparent`,background:e.loaded?`${E.amber}08`:`transparent`},onClick:()=>!e.loaded&&f(e.path),children:[(0,x.jsxs)(`div`,{style:{flex:1},children:[(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:500},children:e.name}),(0,x.jsxs)(`div`,{style:{fontSize:10,color:E.textDim},children:[e.sample_rate,` Hz · `,e.length_ms,` ms`]})]}),e.loaded?(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-green`,children:`Loaded`}):(0,x.jsx)(`button`,{className:`btn btn-ghost btn-sm`,children:`Load`})]},e.name))]})]})}function ge({state:e,connected:t,refresh:n}){let[r,i]=(0,l.useState)([]),[a,o]=(0,l.useState)(0),[s,c]=(0,l.useState)(!0),u=(0,l.useCallback)(async()=>{if(!t){i([{name:`Default`,number:0,presets:[{name:`Edge of Breakup`,bank:0,program:0},{name:`Modern High Gain`,bank:0,program:1},null,null]}]),c(!1);return}try{i((await v()).banks||[])}catch{}c(!1)},[t]);(0,l.useEffect)(()=>{u()},[u]);let d=async(e,t)=>{try{await m(`/api/presets/${e}/${t}/activate`),await u(),n()}catch{alert(`Failed to load preset`)}};if(s)return(0,x.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,x.jsx)(`div`,{className:`loader`})});let f=e?.current_preset,p=r[a]?.presets||[];return(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsx)(`div`,{className:`screen-header`,children:(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:`Presets`})}),(0,x.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:8},children:[r.length>1&&(0,x.jsx)(`div`,{style:{display:`flex`,background:E.surface,borderRadius:6,border:`1px solid ${E.border}`,overflow:`hidden`},children:r.map((e,t)=>(0,x.jsx)(`button`,{style:{flex:1,padding:`7px 12px`,fontSize:12,fontWeight:500,letterSpacing:`0.04em`,background:a===t?E.amber:`none`,border:`none`,color:a===t?`#000`:E.textSec,cursor:`pointer`,transition:`all 0.15s`},onClick:()=>o(t),children:e.name},e.number))}),f&&(0,x.jsx)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12,display:`flex`,alignItems:`center`,gap:8},children:(0,x.jsxs)(`div`,{style:{flex:1},children:[(0,x.jsx)(`div`,{style:{fontSize:11,color:E.textDim},children:`Current`}),(0,x.jsxs)(`div`,{style:{fontSize:14,fontWeight:600,color:E.amber},children:[f.name,(0,x.jsxs)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:10,color:E.textDim,marginLeft:8},children:[`Bank `,f.bank,` · Prog `,f.program]})]})]})}),p.length===0?(0,x.jsx)(`div`,{style:{textAlign:`center`,padding:30,color:E.textDim,fontSize:14},children:`No presets in this bank.`}):p.map((e,t)=>{if(!e)return null;let n=f?.bank===e.bank&&f?.program===e.program;return(0,x.jsxs)(`div`,{className:`preset-row`,style:{border:n?`1px solid ${E.amber}40`:`1px solid transparent`,background:n?`${E.amber}08`:`transparent`},onClick:()=>d(e.bank,e.program),children:[(0,x.jsx)(`div`,{style:{width:28,height:28,borderRadius:6,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:12,fontWeight:700,background:n?`${E.amber}22`:E.surface,color:n?E.amber:E.textDim,border:`1px solid ${n?`${E.amber}60`:E.border}`,fontFamily:`'JetBrains Mono', monospace`},children:e.program+1}),(0,x.jsxs)(`div`,{style:{flex:1},children:[(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:600},children:e.name}),(0,x.jsxs)(`div`,{style:{fontSize:10,color:E.textDim},children:[`Bank `,e.bank,` · Program `,e.program]})]}),n&&(0,x.jsx)(`span`,{style:{color:E.amber,fontSize:16},children:`●`})]},t)})]})]})}function _e({state:e}){return(0,x.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,x.jsx)(`div`,{className:`screen-header`,children:(0,x.jsx)(`div`,{style:{fontSize:13,fontWeight:600,letterSpacing:`0.06em`,textTransform:`uppercase`,color:E.textSec},children:`Settings`})}),(0,x.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:12,display:`flex`,flexDirection:`column`,gap:8},children:(0,x.jsxs)(`div`,{style:{background:E.surface,border:`1px solid ${E.border}`,borderRadius:8,padding:12},children:[(0,x.jsx)(`div`,{className:`section-label`,children:`System`}),e?.cpu_percent!=null&&(0,x.jsxs)(`div`,{className:`setting-row`,children:[(0,x.jsx)(`span`,{style:{fontSize:13},children:`CPU`}),(0,x.jsxs)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.amber},children:[e.cpu_percent,`%`]})]}),e?.sample_rate&&(0,x.jsxs)(`div`,{className:`setting-row`,children:[(0,x.jsx)(`span`,{style:{fontSize:13},children:`Sample Rate`}),(0,x.jsxs)(`span`,{style:{fontFamily:`'JetBrains Mono', monospace`,fontSize:11,color:E.amber},children:[e.sample_rate/1e3,`kHz`]})]}),(0,x.jsxs)(`div`,{className:`setting-row`,style:{border:`none`},children:[(0,x.jsx)(`span`,{style:{fontSize:13},children:`Connection`}),(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-green`,children:`Live`})]})]})})]})}var ve=[{id:`rig`,label:`Rig`,icon:`🎛`},{id:`fx`,label:`FX`,icon:`⛓`},{id:`models`,label:`Models`,icon:`📁`},{id:`irs`,label:`IRs`,icon:`🎚`},{id:`presets`,label:`Presets`,icon:`⭐`},{id:`settings`,label:`Settings`,icon:`⚙`}];function ye(){let[e,t]=(0,l.useState)(`rig`),{state:n,connected:r,refresh:i}=_(),[a,o]=(0,l.useState)([]),[s,c]=(0,l.useState)([`Default`]);(0,l.useEffect)(()=>{r&&n?.current_preset&&v().then(e=>{let t=(e.banks||[]).map(e=>e.name);t.length>0&&c(t);let r=n.current_preset;if(!r)return;let i=(e.banks?.[r.bank])?.presets?.[r.program];i?.chain&&o(i.chain.map((e,t)=>({id:t+1,fx_type:e.fx_type,title:fe[e.fx_type]||e.fx_type,bypassed:e.bypassed??!1})))}).catch(()=>{})},[r,n?.current_preset]);let u=(0,l.useCallback)(async(e,t)=>{if(o(n=>n.map(n=>n.id===e?{...n,bypassed:t}:n)),r)try{await m(`/api/blocks/toggle`,{block_id:e,bypass:t})}catch{}},[r]),[d]=(0,l.useState)(Array.from({length:8},(e,t)=>({name:`Snap ${t+1}`,active:!1})));return(0,x.jsx)(re,{state:n,connected:r,refresh:i,blocks:a,bankNames:s,snapshots:d,onToggleBlock:u,children:(0,x.jsxs)(`div`,{className:`pedal-shell`,children:[(0,x.jsxs)(`div`,{className:`pedal-statusbar`,children:[(0,x.jsxs)(`div`,{className:`pedal-statusbar-left`,children:[(0,x.jsx)(`div`,{className:`pedal-led-dot`,style:{background:r?E.green:E.red,boxShadow:r?`0 0 6px ${E.green}`:`none`}}),(0,x.jsx)(`span`,{className:`pedal-brand`,children:`PI MULTI-FX`}),n?.tuner_enabled&&(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-amber`,children:`TUNER`})]}),(0,x.jsx)(`div`,{className:`pedal-statusbar-mid`,children:(0,x.jsx)(T,{collapsed:!0})}),(0,x.jsxs)(`div`,{className:`pedal-statusbar-right`,children:[n?.cpu_percent!=null&&(0,x.jsxs)(`span`,{className:`pedal-brand`,style:{color:E.textDim},children:[`CPU `,n.cpu_percent,`%`]}),n?.sample_rate&&(0,x.jsxs)(`span`,{className:`pedal-brand`,style:{color:E.textDim},children:[n.sample_rate/1e3,`kHz`]}),n?.bypass&&(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-red`,children:`BYP`}),n?.nam_loaded&&(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-blue`,children:`NAM`}),n?.ir_loaded&&(0,x.jsx)(`span`,{className:`pedal-badge pedal-badge-green`,children:`IR`})]})]}),(0,x.jsxs)(`div`,{className:`pedal-screen`,children:[e===`rig`&&(0,x.jsx)(pe,{state:n,connected:r}),e===`fx`&&(0,x.jsx)(D,{state:n,connected:r}),e===`models`&&(0,x.jsx)(O,{connected:r,refresh:i}),e===`irs`&&(0,x.jsx)(he,{connected:r,refresh:i}),e===`presets`&&(0,x.jsx)(ge,{state:n,connected:r,refresh:i}),e===`settings`&&(0,x.jsx)(_e,{state:n})]}),(0,x.jsx)(ce,{}),(0,x.jsx)(`div`,{className:`pedal-tabbar`,children:ve.map(n=>(0,x.jsxs)(`div`,{className:`pedal-tab ${e===n.id?`pedal-tab-active`:``}`,onClick:()=>t(n.id),children:[(0,x.jsx)(`span`,{className:`pedal-tab-icon`,children:n.icon}),n.label]},n.id))})]})})}function be(){return(0,l.useEffect)(()=>{document.title=`Pi Multi-FX Pedal`},[]),(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(`style`,{children:` - .switch { width: 40px; height: 22px; border-radius: 11px; background: ${E.border}; cursor: pointer; position: relative; transition: background 0.2s; flex-shrink: 0; display: inline-block; } - .switch.on { background: ${E.green}; } - .switch::after { content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: white; transition: transform 0.15s; } - .switch.on::after { transform: translateX(18px); } - - .btn { padding: 10px 18px; border-radius: 7px; font-size: 13px; font-weight: 600; letter-spacing: 0.04em; border: none; cursor: pointer; transition: all 0.12s; } - .btn-primary { background: ${E.amber}; color: #000; } - .btn-primary:active { filter: brightness(0.85); transform: scale(0.97); } - .btn-ghost { background: ${E.surface}; color: ${E.text}; border: 1px solid ${E.border}; } - .btn-ghost:active { background: ${E.border}; } - .btn-danger { background: rgba(200,64,64,0.2); color: ${E.red}; border: 1px solid rgba(200,64,64,0.3); } - .btn-sm { padding: 6px 12px; font-size: 12px; } - - .loader { width: 20px; height: 20px; border: 2px solid ${E.border}; border-top-color: ${E.amber}; border-radius: 50%; animation: spin 0.6s linear infinite; } - @keyframes spin { to { transform: rotate(360deg); } } - - .screen-header { padding: 10px 14px 6px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid ${E.border}; flex-shrink: 0; } - .section-label { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: ${E.textDim}; font-weight: 600; margin-bottom: 8px; } - .preset-row { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: 8px; cursor: pointer; transition: background 0.12s; } - .preset-row:active { background: rgba(232,160,48,0.08); } - .setting-row { display: flex; align-items: center; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid ${E.border}; } - - ::-webkit-scrollbar { width: 4px; height: 4px; } - ::-webkit-scrollbar-track { background: ${E.panel}; } - ::-webkit-scrollbar-thumb { background: ${E.border}; border-radius: 2px; } - `}),(0,x.jsx)(ye,{})]})}(0,u.createRoot)(document.getElementById(`root`)).render((0,x.jsx)(l.StrictMode,{children:(0,x.jsx)(be,{})})); \ No newline at end of file diff --git a/src/web/ui-dist/favicon.svg b/src/web/ui-dist/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/src/web/ui-dist/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/web/ui-dist/img/footswitch_strip.png b/src/web/ui-dist/img/footswitch_strip.png new file mode 100644 index 0000000..9ae4ed5 Binary files /dev/null and b/src/web/ui-dist/img/footswitch_strip.png differ diff --git a/src/web/ui-dist/img/fx_amplifier.svg b/src/web/ui-dist/img/fx_amplifier.svg new file mode 100644 index 0000000..14fea41 --- /dev/null +++ b/src/web/ui-dist/img/fx_amplifier.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_analyzer.svg b/src/web/ui-dist/img/fx_analyzer.svg new file mode 100644 index 0000000..54be993 --- /dev/null +++ b/src/web/ui-dist/img/fx_analyzer.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_chorus.svg b/src/web/ui-dist/img/fx_chorus.svg new file mode 100644 index 0000000..301a39f --- /dev/null +++ b/src/web/ui-dist/img/fx_chorus.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_compressor.svg b/src/web/ui-dist/img/fx_compressor.svg new file mode 100644 index 0000000..f6d7029 --- /dev/null +++ b/src/web/ui-dist/img/fx_compressor.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_constant.svg b/src/web/ui-dist/img/fx_constant.svg new file mode 100644 index 0000000..321a890 --- /dev/null +++ b/src/web/ui-dist/img/fx_constant.svg @@ -0,0 +1,28 @@ + + + + + + + fx + + k + + + + + diff --git a/src/web/ui-dist/img/fx_converter.svg b/src/web/ui-dist/img/fx_converter.svg new file mode 100644 index 0000000..ade942c --- /dev/null +++ b/src/web/ui-dist/img/fx_converter.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_delay.svg b/src/web/ui-dist/img/fx_delay.svg new file mode 100644 index 0000000..b5e29ca --- /dev/null +++ b/src/web/ui-dist/img/fx_delay.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_dial.svg b/src/web/ui-dist/img/fx_dial.svg new file mode 100644 index 0000000..4152f63 --- /dev/null +++ b/src/web/ui-dist/img/fx_dial.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_distortion.svg b/src/web/ui-dist/img/fx_distortion.svg new file mode 100644 index 0000000..1ad8b16 --- /dev/null +++ b/src/web/ui-dist/img/fx_distortion.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_empty.svg b/src/web/ui-dist/img/fx_empty.svg new file mode 100644 index 0000000..e6f1eb5 --- /dev/null +++ b/src/web/ui-dist/img/fx_empty.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/web/ui-dist/img/fx_eq.svg b/src/web/ui-dist/img/fx_eq.svg new file mode 100644 index 0000000..61d6873 --- /dev/null +++ b/src/web/ui-dist/img/fx_eq.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_error.svg b/src/web/ui-dist/img/fx_error.svg new file mode 100644 index 0000000..37f8f1f --- /dev/null +++ b/src/web/ui-dist/img/fx_error.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/src/web/ui-dist/img/fx_filter.svg b/src/web/ui-dist/img/fx_filter.svg new file mode 100644 index 0000000..e294879 --- /dev/null +++ b/src/web/ui-dist/img/fx_filter.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_filter_hp.svg b/src/web/ui-dist/img/fx_filter_hp.svg new file mode 100755 index 0000000..d695af5 --- /dev/null +++ b/src/web/ui-dist/img/fx_filter_hp.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_flanger.svg b/src/web/ui-dist/img/fx_flanger.svg new file mode 100644 index 0000000..4c55387 --- /dev/null +++ b/src/web/ui-dist/img/fx_flanger.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_flanger2.svg b/src/web/ui-dist/img/fx_flanger2.svg new file mode 100644 index 0000000..ffed761 --- /dev/null +++ b/src/web/ui-dist/img/fx_flanger2.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_function.svg b/src/web/ui-dist/img/fx_function.svg new file mode 100644 index 0000000..fb59658 --- /dev/null +++ b/src/web/ui-dist/img/fx_function.svg @@ -0,0 +1,41 @@ + + + + + + + + fx + + + + + diff --git a/src/web/ui-dist/img/fx_gate.svg b/src/web/ui-dist/img/fx_gate.svg new file mode 100644 index 0000000..8f2462a --- /dev/null +++ b/src/web/ui-dist/img/fx_gate.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_generator.svg b/src/web/ui-dist/img/fx_generator.svg new file mode 100644 index 0000000..b77ef00 --- /dev/null +++ b/src/web/ui-dist/img/fx_generator.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_instrument.svg b/src/web/ui-dist/img/fx_instrument.svg new file mode 100644 index 0000000..7627d61 --- /dev/null +++ b/src/web/ui-dist/img/fx_instrument.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_limiter.svg b/src/web/ui-dist/img/fx_limiter.svg new file mode 100644 index 0000000..2c465c7 --- /dev/null +++ b/src/web/ui-dist/img/fx_limiter.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_lr.svg b/src/web/ui-dist/img/fx_lr.svg new file mode 100644 index 0000000..6f178d2 --- /dev/null +++ b/src/web/ui-dist/img/fx_lr.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_mixer.svg b/src/web/ui-dist/img/fx_mixer.svg new file mode 100644 index 0000000..891fd3b --- /dev/null +++ b/src/web/ui-dist/img/fx_mixer.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_modulator.svg b/src/web/ui-dist/img/fx_modulator.svg new file mode 100644 index 0000000..f1bba64 --- /dev/null +++ b/src/web/ui-dist/img/fx_modulator.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_multiband_eq.svg b/src/web/ui-dist/img/fx_multiband_eq.svg new file mode 100755 index 0000000..c1a0305 --- /dev/null +++ b/src/web/ui-dist/img/fx_multiband_eq.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/web/ui-dist/img/fx_oscillator.svg b/src/web/ui-dist/img/fx_oscillator.svg new file mode 100644 index 0000000..b034041 --- /dev/null +++ b/src/web/ui-dist/img/fx_oscillator.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_parametric_eq.svg b/src/web/ui-dist/img/fx_parametric_eq.svg new file mode 100644 index 0000000..edf2ca7 --- /dev/null +++ b/src/web/ui-dist/img/fx_parametric_eq.svg @@ -0,0 +1,44 @@ + + + + + + + diff --git a/src/web/ui-dist/img/fx_phaser.svg b/src/web/ui-dist/img/fx_phaser.svg new file mode 100644 index 0000000..414b1e2 --- /dev/null +++ b/src/web/ui-dist/img/fx_phaser.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_pitch.svg b/src/web/ui-dist/img/fx_pitch.svg new file mode 100644 index 0000000..88b9517 --- /dev/null +++ b/src/web/ui-dist/img/fx_pitch.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_plugin.svg b/src/web/ui-dist/img/fx_plugin.svg new file mode 100644 index 0000000..4f868b4 --- /dev/null +++ b/src/web/ui-dist/img/fx_plugin.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/src/web/ui-dist/img/fx_reverb.svg b/src/web/ui-dist/img/fx_reverb.svg new file mode 100644 index 0000000..55f836f --- /dev/null +++ b/src/web/ui-dist/img/fx_reverb.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_simulator.svg b/src/web/ui-dist/img/fx_simulator.svg new file mode 100644 index 0000000..5cfd98c --- /dev/null +++ b/src/web/ui-dist/img/fx_simulator.svg @@ -0,0 +1,27 @@ + + + + + + + 0 + + 1 + 0 + 1 + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_spatial.svg b/src/web/ui-dist/img/fx_spatial.svg new file mode 100644 index 0000000..ae27920 --- /dev/null +++ b/src/web/ui-dist/img/fx_spatial.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_spectral.svg b/src/web/ui-dist/img/fx_spectral.svg new file mode 100644 index 0000000..dadd1a1 --- /dev/null +++ b/src/web/ui-dist/img/fx_spectral.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_split_a.svg b/src/web/ui-dist/img/fx_split_a.svg new file mode 100644 index 0000000..8dc208c --- /dev/null +++ b/src/web/ui-dist/img/fx_split_a.svg @@ -0,0 +1,18 @@ + + + + + + + A + + + + + + + + diff --git a/src/web/ui-dist/img/fx_split_b.svg b/src/web/ui-dist/img/fx_split_b.svg new file mode 100644 index 0000000..ddebee8 --- /dev/null +++ b/src/web/ui-dist/img/fx_split_b.svg @@ -0,0 +1,23 @@ + + + + + + + B + + + + + + + + + diff --git a/src/web/ui-dist/img/fx_terminal.svg b/src/web/ui-dist/img/fx_terminal.svg new file mode 100644 index 0000000..b2f746a --- /dev/null +++ b/src/web/ui-dist/img/fx_terminal.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/web/ui-dist/img/fx_utility.svg b/src/web/ui-dist/img/fx_utility.svg new file mode 100644 index 0000000..f7b40b8 --- /dev/null +++ b/src/web/ui-dist/img/fx_utility.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_bank.svg b/src/web/ui-dist/img/ic_bank.svg new file mode 100644 index 0000000..64a6601 --- /dev/null +++ b/src/web/ui-dist/img/ic_bank.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_drawer.svg b/src/web/ui-dist/img/ic_drawer.svg new file mode 100644 index 0000000..d2b51d3 --- /dev/null +++ b/src/web/ui-dist/img/ic_drawer.svg @@ -0,0 +1,11577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + πpedal + + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_drawer_2.svg b/src/web/ui-dist/img/ic_drawer_2.svg new file mode 100755 index 0000000..cd8e222 --- /dev/null +++ b/src/web/ui-dist/img/ic_drawer_2.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_logo.svg b/src/web/ui-dist/img/ic_logo.svg new file mode 100644 index 0000000..1f7e03c --- /dev/null +++ b/src/web/ui-dist/img/ic_logo.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_navigate_before.svg b/src/web/ui-dist/img/ic_navigate_before.svg new file mode 100644 index 0000000..f4a753b --- /dev/null +++ b/src/web/ui-dist/img/ic_navigate_before.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web/ui-dist/img/ic_navigate_next.svg b/src/web/ui-dist/img/ic_navigate_next.svg new file mode 100644 index 0000000..6f4bc0a --- /dev/null +++ b/src/web/ui-dist/img/ic_navigate_next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web/ui-dist/img/ic_presets.svg b/src/web/ui-dist/img/ic_presets.svg new file mode 100644 index 0000000..5f3d7d5 --- /dev/null +++ b/src/web/ui-dist/img/ic_presets.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/src/web/ui-dist/img/ic_presets_white.svg b/src/web/ui-dist/img/ic_presets_white.svg new file mode 100644 index 0000000..931ebb2 --- /dev/null +++ b/src/web/ui-dist/img/ic_presets_white.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/src/web/ui-dist/index.html b/src/web/ui-dist/index.html index e52b0f8..c509da5 100644 --- a/src/web/ui-dist/index.html +++ b/src/web/ui-dist/index.html @@ -2,11 +2,12 @@ + + + NAM Pedal - - ui - - + +
diff --git a/test_pipeline_nam.py b/test_pipeline_nam.py new file mode 100644 index 0000000..fe5cb83 --- /dev/null +++ b/test_pipeline_nam.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Test the C++ NAM engine integrated into the pipeline.""" +import sys, types, time +import numpy as np + +# Mock tkinter to allow nam package import +tk = types.ModuleType('tkinter') +tk.Tk = type('MockTk', (), {'__init__': lambda s: None}) +sys.modules['tkinter'] = tk + +sys.path.insert(0, 'src') +from dsp.pipeline import AudioPipeline +from presets.types import Preset, FXBlock, FXType + +# Create pipeline +p = AudioPipeline() +print(f"NAM type: {type(p.nam).__name__}") + +# Load a NAM model +ok = p.nam.load_model('models/nam/clean.nam') +print(f"Model loaded: {ok}, is_loaded={p.nam.is_loaded}") +if p.nam._engine: + print(f" Static: {p.nam._engine.is_static}, SampleRate: {p.nam._engine._sample_rate}") + +# Test NAM engine directly +block = np.sin(2 * np.pi * 440 * np.arange(256) / 48000).astype(np.float32) * 0.3 +processed = p.nam.process(block) +print(f"NAM direct: in_rms={np.sqrt(np.mean(block**2)):.4f} out_rms={np.sqrt(np.mean(processed**2)):.4f}") + +# Test through pipeline +preset = Preset(name='test', bank=0, program=0, chain=[ + FXBlock(fx_type=FXType.NOISE_GATE, enabled=True, params={'threshold': 0.01}), + FXBlock(fx_type=FXType.NAM_AMP, enabled=True, params={'level': 0.8, 'gain': 0.5}, + nam_model_path='models/nam/clean.nam'), +]) +p.load_preset(preset) +print(f"Preset loaded: {len(p._chain)} blocks") + +out = p.process(block) +print(f"Pipeline out: in_rms={np.sqrt(np.mean(block**2)):.4f} out_rms={np.sqrt(np.mean(out**2)):.4f}") + +# Benchmark +times = [] +for _ in range(500): + t0 = time.perf_counter() + p.process(block) + times.append((time.perf_counter() - t0) * 1000) +print(f"Pipeline avg: {np.mean(times):.3f} ms, max: {np.max(times):.3f} ms, min: {np.min(times):.3f} ms") +print(f"VU meter: input={p._input_level:.4f} output={p._output_level:.4f}") + +p.nam.unload() +print("SUCCESS")