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 +2 -2
- package/dist/friend.mjs +58 -12
- package/dist/voice/friend_voice/__main__.py +1 -1
- package/dist/voice/friend_voice/models.py +1 -1
- package/dist/voice/friend_voice/stt.py +40 -3
- package/dist/web/assets/{index-qwk36PfU.css → index-CRWuir4x.css} +1 -1
- package/dist/web/assets/index-pAv0XdRo.js +4456 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-Cg-1ZV_2.js +0 -4456
package/dist/BUILD.json
CHANGED
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: "
|
|
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
|
-
|
|
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())
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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="
|
|
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 = "
|
|
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=
|
|
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}}
|