friend-assistant 0.1.39 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/BUILD.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "friend-assistant",
3
- "version": "0.1.39",
4
- "builtAt": "2026-10-13T01:19:00.862Z"
3
+ "version": "0.1.41",
4
+ "builtAt": "2026-10-13T04:06:44.122Z"
5
5
  }
package/dist/friend.mjs CHANGED
@@ -3337,7 +3337,7 @@ function sanitizeLook(raw) {
3337
3337
  var DEFAULT_OLLAMA = { url: "http://127.0.0.1:11434", model: "qwen2.5:7b", contextTokens: 8192, vision: false };
3338
3338
  var DEFAULT_VOICE = {
3339
3339
  enabled: true,
3340
- sttModel: "base",
3340
+ sttModel: "small",
3341
3341
  ttsVoice: "en_US-lessac-medium",
3342
3342
  language: null,
3343
3343
  speakTyped: true,
@@ -6237,15 +6237,16 @@ function youtubeId(raw) {
6237
6237
  }
6238
6238
  var clean = (v, max) => typeof v === "string" ? v.replace(/[\u0000-\u001f\u007f]/g, " ").replace(/\s+/g, " ").trim().slice(0, max) : "";
6239
6239
  async function titleOfYoutube(id2, d = {}) {
6240
- const fallback = { title: "YouTube video", uploader: "" };
6240
+ const fallback = { title: "YouTube video", uploader: "", embeddable: true };
6241
6241
  const ctl = new AbortController();
6242
6242
  const timer = setTimeout(() => ctl.abort(), d.timeoutMs ?? 5e3);
6243
6243
  try {
6244
6244
  const url = `https://www.youtube.com/oembed?url=${encodeURIComponent(`https://www.youtube.com/watch?v=${id2}`)}&format=json`;
6245
6245
  const res = await (d.fetch ?? fetch)(url, { signal: ctl.signal });
6246
+ if (res.status === 401 || res.status === 403) return { ...fallback, embeddable: false };
6246
6247
  if (!res.ok) return fallback;
6247
6248
  const j = await res.json();
6248
- return { title: clean(j.title, 200) || fallback.title, uploader: clean(j.author_name, 100) };
6249
+ return { title: clean(j.title, 200) || fallback.title, uploader: clean(j.author_name, 100), embeddable: true };
6249
6250
  } catch {
6250
6251
  return fallback;
6251
6252
  } finally {
@@ -6386,7 +6387,9 @@ var VideoHub = class {
6386
6387
  const v = await vetVideoUrl(args.url, { allowedSites: cfg.allowedSites, ...this.d.resolve ? { resolve: this.d.resolve } : {} });
6387
6388
  if (!v.ok) return { ok: false, text: v.error };
6388
6389
  id2 = linkId;
6389
- ({ title: title2, uploader } = await titleOfYoutube(id2, { fetch: this.d.fetch }));
6390
+ const t = await titleOfYoutube(id2, { fetch: this.d.fetch });
6391
+ if (!t.embeddable) return null;
6392
+ ({ title: title2, uploader } = t);
6390
6393
  } else {
6391
6394
  const sites = cfg.allowedSites;
6392
6395
  if (sites.length && !sites.some((s) => s === "youtube.com" || s.endsWith(".youtube.com"))) return { ok: false, text: `A search uses YouTube, which is not on your allowed list (${sites.join(", ")}).` };
@@ -6408,7 +6411,10 @@ var VideoHub = class {
6408
6411
  const output = args.output ?? cfg.output;
6409
6412
  if (output === "screen" && (args.mode ?? cfg.youtube) === "embed") {
6410
6413
  const ytId = args.url ? youtubeId(args.url) : null;
6411
- if (ytId || !args.url && args.query && args.query.trim()) return this.playEmbedded(args, ytId, cfg);
6414
+ if (ytId || !args.url && args.query && args.query.trim()) {
6415
+ const emb = await this.playEmbedded(args, ytId, cfg);
6416
+ if (emb) return emb;
6417
+ }
6412
6418
  }
6413
6419
  let status2 = await this.ensureStatus();
6414
6420
  const got = await this.ensureTools(this.missing(status2, this.wanted(output, status2)), cfg);
@@ -11029,7 +11035,8 @@ function createGateway(deps) {
11029
11035
  const session = token ? auth.resolveSession(token) : null;
11030
11036
  if (!session) return reply.code(401).send({ error: "Unauthorized" });
11031
11037
  try {
11032
- return await deps.onVoiceUtterance(session, body, String(req.headers["content-type"] ?? "audio/webm"), req.ip);
11038
+ const wake = req.query.wake === "1";
11039
+ return await deps.onVoiceUtterance(session, body, String(req.headers["content-type"] ?? "audio/webm"), req.ip, wake);
11033
11040
  } catch (e) {
11034
11041
  if (e instanceof HttpError) return reply.code(e.status).send({ error: e.message });
11035
11042
  audit.log("owner", "voice.utterance_failed", { message: e.message });
@@ -13755,6 +13762,39 @@ var Enrollment = class {
13755
13762
  }
13756
13763
  };
13757
13764
 
13765
+ // ../server/src/voice/wake.ts
13766
+ var GREETINGS = /* @__PURE__ */ new Set(["hey", "hay", "hi", "hello", "hellow", "hallo", "hullo", "ok", "okay", "yo", "he", "\u0939\u0947", "\u0939\u093E\u092F", "\u0939\u0945\u0932\u094B", "\u0939\u0947\u0932\u094B", "\u0939\u0948\u0932\u094B", "\u0939\u0932\u094B", "\u0913\u0915\u0947"]);
13767
+ var WORD = /[\p{L}\p{M}\p{N}'’]+/gu;
13768
+ var GAP = /^[\s,.:;!?…\-–—]+/u;
13769
+ function distance(a, b) {
13770
+ const row = Array.from({ length: b.length + 1 }, (_, i) => i);
13771
+ for (let i = 1; i <= a.length; i++) {
13772
+ let prev = row[0];
13773
+ row[0] = i;
13774
+ for (let j = 1; j <= b.length; j++) {
13775
+ const keep = row[j];
13776
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
13777
+ prev = keep;
13778
+ }
13779
+ }
13780
+ return row[b.length];
13781
+ }
13782
+ var sameWord = (heard, name) => heard === name || name.length >= 4 && distance(heard, name) <= 1;
13783
+ function matchWake(text3, name) {
13784
+ const no = { matched: false, rest: "" };
13785
+ const wanted = [...name.normalize("NFC").toLowerCase().matchAll(WORD)].map((m) => m[0]);
13786
+ if (wanted.length === 0) return no;
13787
+ const words = [...text3.normalize("NFC").matchAll(WORD)].map((m) => ({ low: m[0].toLowerCase(), end: m.index + m[0].length }));
13788
+ let at = 0;
13789
+ if (words[0] && GREETINGS.has(words[0].low)) at = 1;
13790
+ for (let i = 0; i < wanted.length; i++) {
13791
+ const heard = words[at + i];
13792
+ if (!heard || !sameWord(heard.low, wanted[i])) return no;
13793
+ }
13794
+ const last = words[at + wanted.length - 1];
13795
+ return { matched: true, rest: text3.normalize("NFC").slice(last.end).replace(GAP, "").trim() };
13796
+ }
13797
+
13758
13798
  // ../server/src/voice/service.ts
13759
13799
  var VoiceError = class extends Error {
13760
13800
  };
@@ -14811,7 +14851,7 @@ async function createApp(opts) {
14811
14851
  audit,
14812
14852
  webDir: opts.webDir,
14813
14853
  voiceAvailable,
14814
- onVoiceUtterance: async (session, audio, mime, ip) => {
14854
+ onVoiceUtterance: async (session, audio, mime, ip, wake = false) => {
14815
14855
  if (!voice2) throw new HttpError(503, "Voice is not available");
14816
14856
  if (agent.isBusy()) throw new HttpError(409, "Friend is busy with the last request. Try again in a moment.");
14817
14857
  const epoch = lockEpoch;
@@ -14829,7 +14869,13 @@ async function createApp(opts) {
14829
14869
  throw e;
14830
14870
  }
14831
14871
  if (epoch !== lockEpoch || !auth.sessionActive(session.id)) throw new HttpError(401, "Session ended");
14832
- if (!/[\p{L}\p{N}]/u.test(heard)) return { text: "" };
14872
+ if (!/[\p{L}\p{N}]/u.test(heard)) return wake ? { text: "", wake: false } : { text: "" };
14873
+ if (wake) {
14874
+ const m = matchWake(heard, auth.assistantName());
14875
+ if (!m.matched) return { text: "", wake: false };
14876
+ heard = m.rest;
14877
+ if (!/[\p{L}\p{N}]/u.test(heard)) return { text: "", wake: true };
14878
+ }
14833
14879
  const crash = (e) => audit.log("system", "voice.turn_crash", { message: e.message });
14834
14880
  const who = enrolled ? judge(embedding) : { trust: "unverified" };
14835
14881
  const trust = who.trust;
@@ -14851,7 +14897,7 @@ async function createApp(opts) {
14851
14897
  broadcast({ type: "voice.heard", text: heard, trust: trust === "owner" ? "owner" : "unverified" });
14852
14898
  void runVoiceTurn(heard, ip, epoch, "owner", void 0, spoken).catch(crash);
14853
14899
  }
14854
- return { text: heard };
14900
+ return wake ? { text: heard, wake: true } : { text: heard };
14855
14901
  },
14856
14902
  voiceEnroll: enrollment && voice2 ? {
14857
14903
  state: () => enrollment.state(),
@@ -15629,7 +15675,7 @@ var KEY_HELP = {
15629
15675
  allowedHosts: "extra host names that may reach Friend (for example my-pc), separated by commas",
15630
15676
  trustProxy: "true when Friend sits behind your own reverse proxy",
15631
15677
  "voice.enabled": "true or false: use speech at all",
15632
- "voice.sttModel": "listening model: tiny, base, small, \u2026 (bigger is more accurate and slower)",
15678
+ "voice.sttModel": "listening model: tiny, base, small, large-v3-turbo \u2026 (bigger is more accurate and slower; Marathi and far-from-mic speech do best with small or large-v3-turbo)",
15633
15679
  "voice.ttsVoice": "speaking voice (easier: friend voice setup, or Settings)",
15634
15680
  "voice.language": "force a spoken language such as en, hi or mr, or empty to detect it (empty is best when you mix languages)",
15635
15681
  "voice.hindiVoice": "the voice that reads Hindi (Devanagari) text: hi_IN-priyamvada-medium, hi_IN-pratham-medium or hi_IN-rohan-medium; empty uses the main voice",
@@ -17798,7 +17844,7 @@ async function daemonCommand(args, io2, deps = realDeps) {
17798
17844
  import crossSpawn5 from "cross-spawn";
17799
17845
  var PACKAGE = "friend-assistant";
17800
17846
  var real = {
17801
- current: () => true ? "0.1.39" : "development",
17847
+ current: () => true ? "0.1.41" : "development",
17802
17848
  latest: () => new Promise((resolve13) => {
17803
17849
  const child = crossSpawn5("npm", ["view", PACKAGE, "version", "--prefer-online"], { stdio: ["ignore", "pipe", "ignore"] });
17804
17850
  let out = "";
@@ -18086,7 +18132,7 @@ async function run(argv, io2) {
18086
18132
  case "version":
18087
18133
  case "--version":
18088
18134
  case "-v":
18089
- io2.out(true ? "0.1.39" : "development");
18135
+ io2.out(true ? "0.1.41" : "development");
18090
18136
  return 0;
18091
18137
  case "lan":
18092
18138
  return await lanCommand(rest, io2);
@@ -18,7 +18,7 @@ def main() -> int:
18
18
  ap.add_argument("--port", type=int, default=0, help="0 picks a free port")
19
19
  ap.add_argument("--fake", action="store_true", help="use stub engines (tests)")
20
20
  ap.add_argument("--data-dir", default=None, help="folder holding downloaded models")
21
- ap.add_argument("--stt-model", default="base")
21
+ ap.add_argument("--stt-model", default="small")
22
22
  ap.add_argument("--tts-voice", default="en_US-lessac-medium")
23
23
  args = ap.parse_args()
24
24
  token = args.token or os.environ.get("FRIEND_VOICE_TOKEN")
@@ -46,7 +46,7 @@ def ensure_speaker_model(directory: Path, url: str = SPEAKER_URL, sha256: str =
46
46
  return target
47
47
 
48
48
 
49
- def load_engines(data_dir: Optional[str], stt_model: str = "base", tts_voice: str = "en_US-lessac-medium") -> Engines:
49
+ def load_engines(data_dir: Optional[str], stt_model: str = "small", tts_voice: str = "en_US-lessac-medium") -> Engines:
50
50
  root = Path(data_dir) if data_dir else Path.home() / ".friend" / "voice" / "models"
51
51
  root.mkdir(parents=True, exist_ok=True)
52
52
  speaker = None
@@ -10,6 +10,17 @@ from typing import Optional
10
10
  MAX_SECONDS = 90.0
11
11
  SAMPLE_RATE = 16000
12
12
 
13
+ #: Speech quieter than this (RMS) is brought up toward it; a speaker far from the microphone arrives faint.
14
+ TARGET_RMS = 0.06
15
+ #: Below this the room is silent, so there is nothing to bring up (it would only make hiss louder).
16
+ SILENCE_RMS = 0.001
17
+ MAX_GAIN = 20.0
18
+ #: A segment is dropped when the model thinks it is probably not speech AND is not sure of its words (Whisper's own rule),
19
+ #: or when it is very unsure of its words whatever the speech chance: noise turns into invented words in other scripts.
20
+ NO_SPEECH_PROB = 0.6
21
+ MIN_LOGPROB = -1.0
22
+ HOPELESS_LOGPROB = -2.0
23
+
13
24
  #: A sentence in the style wanted, given to the recognizer as a hint: Hindi and Marathi are written in Devanagari,
14
25
  #: and the English words that people mix in stay in Latin letters.
15
26
  HINT_PROMPTS = {
@@ -18,6 +29,29 @@ HINT_PROMPTS = {
18
29
  }
19
30
 
20
31
 
32
+ def level(samples):
33
+ """Bring faint speech up to a usable volume without clipping; leave loud enough speech and silence alone."""
34
+ import numpy as np
35
+
36
+ if samples.size == 0:
37
+ return samples
38
+ loudness = float(np.sqrt(np.mean(np.square(samples))))
39
+ if loudness >= TARGET_RMS or loudness < SILENCE_RMS:
40
+ return samples
41
+ peak = float(np.max(np.abs(samples)))
42
+ gain = min(TARGET_RMS / loudness, MAX_GAIN, 0.99 / peak if peak > 0 else MAX_GAIN)
43
+ return (samples * gain).astype(np.float32)
44
+
45
+
46
+ def believed(segment) -> bool:
47
+ """Whether to keep what the model heard in this segment."""
48
+ no_speech = getattr(segment, "no_speech_prob", 0.0)
49
+ logprob = getattr(segment, "avg_logprob", 0.0)
50
+ if no_speech > NO_SPEECH_PROB and logprob < MIN_LOGPROB:
51
+ return False
52
+ return logprob >= HOPELESS_LOGPROB
53
+
54
+
21
55
  def decode_audio(data: bytes, max_seconds: float = MAX_SECONDS):
22
56
  """Decode any container PyAV understands (webm/opus, mp4/aac, wav, ...) to mono float32 at 16 kHz.
23
57
 
@@ -49,7 +83,7 @@ def decode_audio(data: bytes, max_seconds: float = MAX_SECONDS):
49
83
  take(resampler.resample(None)) # flush
50
84
  if not pieces:
51
85
  return np.zeros(0, dtype=np.float32)
52
- return np.concatenate(pieces).astype(np.float32) / 32768.0
86
+ return level(np.concatenate(pieces).astype(np.float32) / 32768.0)
53
87
 
54
88
 
55
89
  class WhisperSTT:
@@ -64,12 +98,15 @@ class WhisperSTT:
64
98
  segments, info = self._model.transcribe(
65
99
  samples,
66
100
  language=language,
67
- beam_size=1,
101
+ beam_size=5, # a wider search is slower but much better on faint or accented speech
68
102
  vad_filter=True, # drop silence so quiet clips return an empty transcript
69
103
  condition_on_previous_text=False,
104
+ no_speech_threshold=NO_SPEECH_PROB,
105
+ log_prob_threshold=MIN_LOGPROB,
106
+ compression_ratio_threshold=2.4, # repeated gibberish compresses well: the model tries again instead of keeping it
70
107
  **extra,
71
108
  )
72
- return " ".join(s.text.strip() for s in segments).strip(), info
109
+ return " ".join(s.text.strip() for s in segments if believed(s)).strip(), info
73
110
 
74
111
  def transcribe(self, audio: bytes, language: Optional[str]) -> dict:
75
112
  samples = decode_audio(audio) # bounded decode: hostile or huge input is refused here
@@ -1 +1 @@
1
- :root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}
1
+ :root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.obj-media.obj-media-fill{height:100%;min-height:min(360px,60vh)}.obj-media-fill .obj-youtube{border:1px solid var(--edge);background:#000;flex:auto;width:100%;height:100%;min-height:0;display:block}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}