diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 0c5d8c2..5e6abda 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -3,6 +3,7 @@ import { useDeferredValue, useEffect, useEffectEvent, + useReducer, useState } from "react"; @@ -23,19 +24,8 @@ async function request(path, options = {}) { return data; } -function appendLine(setTerminalLines, line) { - setTerminalLines((current) => { - const next = [...current, `[${new Date().toLocaleTimeString("zh-CN", { hour12: false })}] ${asText(line, "event")}`]; - return next.slice(-120); - }); -} - -function isRecord(value) { - return value !== null && typeof value === "object" && !Array.isArray(value); -} - function asRecord(value) { - return isRecord(value) ? value : {}; + return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {}; } function asArray(value) { @@ -48,79 +38,84 @@ function asNumber(value, fallback = 0) { } function asText(value, fallback = "") { - if (value === null || value === undefined) { - return fallback; - } - if (typeof value === "string") { - return value; - } - if (typeof value === "number" || typeof value === "boolean") { - return String(value); - } - if (isRecord(value)) { + if (value === null || value === undefined) return fallback; + if (typeof value === "string") return value; + if (typeof value === "number" || typeof value === "boolean") return String(value); + if (asRecord(value)) { for (const key of ["summary", "message", "reason", "workflow", "mode", "status", "name", "id"]) { const nested = value[key]; - if (typeof nested === "string" || typeof nested === "number" || typeof nested === "boolean") { - return String(nested); - } - } - try { - return JSON.stringify(value); - } catch { - return fallback; + if (typeof nested === "string" || typeof nested === "number" || typeof nested === "boolean") return String(nested); } + try { return JSON.stringify(value); } catch { return fallback; } } return fallback; } -function formatPercent(value) { - return `${asNumber(value).toFixed(1)}%`; -} - -function formatNumber(value, digits = 0) { - return asNumber(value).toFixed(digits); -} - +function formatPercent(value) { return `${asNumber(value).toFixed(1)}%`; } +function formatNumber(value, digits = 0) { return asNumber(value).toFixed(digits); } function severityClass(score) { - const normalized = asNumber(score); - if (normalized >= 85) return "danger"; - if (normalized >= 60) return "warning"; + const n = asNumber(score); + if (n >= 85) return "danger"; + if (n >= 60) return "warning"; return ""; } +function terminalReducer(state, action) { + switch (action.type) { + case "append": + return [...state, `[${new Date().toLocaleTimeString("zh-CN", { hour12: false })}] ${action.line}`].slice(-120); + case "clear": + return []; + default: + return state; + } +} + export default function App() { const [overview, setOverview] = useState(null); + const [health, setHealth] = useState(null); const [selectedSessionId, setSelectedSessionId] = useState(""); - const [terminalLines, setTerminalLines] = useState(["[aluer] nebula console booted"]); + const [terminalLines, dispatchTerminal] = useReducer(terminalReducer, ["[aluer] nebula console booted"]); const [streamState, setStreamState] = useState("connecting"); const [lastHandshake, setLastHandshake] = useState(null); const [auditFilter, setAuditFilter] = useState(""); const [commandInput, setCommandInput] = useState(""); + const [autoRefresh, setAutoRefresh] = useState(true); + const [refreshInterval, setRefreshInterval] = useState(6); + const [showHealth, setShowHealth] = useState(false); const [sshForm, setSshForm] = useState({ - alias: "", - host: "", - port: "22", - username: "", - password: "", - privateKeyPath: "" + alias: "", host: "", port: "22", username: "", password: "", privateKeyPath: "" }); const deferredAuditFilter = useDeferredValue(auditFilter); + const addLine = (line) => dispatchTerminal({ type: "append", line }); + const refreshOverview = useEffectEvent(async (reason = "manual") => { try { const data = asRecord(await request("/api/console/overview")); startTransition(() => setOverview(data)); - if (reason !== "stream") { - appendLine(setTerminalLines, `overview refreshed (${reason})`); - } + if (reason !== "stream") addLine(`overview refreshed (${reason})`); } catch (error) { - appendLine(setTerminalLines, `refresh failed: ${error.message}`); + addLine(`refresh failed: ${error.message}`); } }); + const refreshHealth = useEffectEvent(async () => { + try { + const data = asRecord(await request("/api/health")); + startTransition(() => setHealth(data)); + } catch { + // health endpoint may not be deployed yet + } + }); + + useEffect(() => { refreshOverview("boot"); refreshHealth(); }, [refreshOverview, refreshHealth]); + useEffect(() => { - refreshOverview("boot"); - }, [refreshOverview]); + if (!autoRefresh) return; + const id = setInterval(() => { refreshOverview("poll"); refreshHealth(); }, refreshInterval * 1000); + return () => clearInterval(id); + }, [autoRefresh, refreshInterval, refreshOverview, refreshHealth]); useEffect(() => { if (typeof window === "undefined" || typeof window.EventSource !== "function") { @@ -133,30 +128,22 @@ export default function App() { const data = asRecord(JSON.parse(event.data)); startTransition(() => setOverview(data)); setStreamState("live"); - } catch { - setStreamState("degraded"); - } + } catch { setStreamState("degraded"); } }); - eventSource.onerror = () => { - setStreamState("degraded"); - }; - return () => { - eventSource.close(); - }; + eventSource.onerror = () => setStreamState("degraded"); + return () => eventSource.close(); }, []); useEffect(() => { const sessions = asArray(overview?.ssh?.sessions); - if (!sessions.length) { - setSelectedSessionId(""); - return; - } - if (!selectedSessionId || !sessions.some((session) => asText(session?.sessionId) === selectedSessionId)) { + if (!sessions.length) { setSelectedSessionId(""); return; } + if (!selectedSessionId || !sessions.some((s) => asText(s?.sessionId) === selectedSessionId)) { setSelectedSessionId(asText(sessions[0]?.sessionId)); } }, [overview, selectedSessionId]); const safeOverview = asRecord(overview); + const safeHealth = asRecord(health); const server = asRecord(safeOverview.server); const metrics = asRecord(server.metrics); const defense = asRecord(safeOverview.defense); @@ -169,70 +156,57 @@ export default function App() { const audit = asRecord(safeOverview.audit); const sessions = asArray(ssh.sessions); const engineHandshake = asRecord(ssh.engineHandshake); - const selectedSession = sessions.find((session) => asText(session?.sessionId) === selectedSessionId); + const selectedSession = sessions.find((s) => asText(s?.sessionId) === selectedSessionId); + const healthComponents = asRecord(safeHealth.components); + const healthSystem = asRecord(safeHealth.system); + const mergedAuditItems = [ - ...asArray(audit.events).map((event) => ({ - id: `${asText(event?.category, "event")}-${asText(event?.action, "action")}-${asText(event?.timestamp, Date.now())}`, - title: `${asText(event?.category, "EVENT")} / ${asText(event?.action, "ACTION")}`, - details: `${asText(event?.player, "system")} | ${asText(event?.details, "")}`, - score: asText(event?.category).includes("ALERT") ? 90 : 45 + ...asArray(audit.events).map((e) => ({ + id: `${asText(e?.category, "event")}-${asText(e?.action, "action")}-${asText(e?.timestamp, Date.now())}`, + title: `${asText(e?.category, "EVENT")} / ${asText(e?.action, "ACTION")}`, + details: `${asText(e?.player, "system")} | ${asText(e?.details, "")}`, + score: asText(e?.category).includes("ALERT") ? 90 : 45 })), - ...asArray(audit.networkIncidents).map((incident, index) => ({ - id: `${asText(incident?.type, "incident")}-${asText(incident?.ip, "unknown")}-${index}`, - title: `${asText(incident?.type, "incident")} / ${asText(incident?.ip, "unknown")}`, - details: asText(incident?.details || incident?.summary, "network anomaly"), - score: asNumber(incident?.riskScore, 70) + ...asArray(audit.networkIncidents).map((inc, i) => ({ + id: `${asText(inc?.type, "incident")}-${asText(inc?.ip, "unknown")}-${i}`, + title: `${asText(inc?.type, "incident")} / ${asText(inc?.ip, "unknown")}`, + details: asText(inc?.details || inc?.summary, "network anomaly"), + score: asNumber(inc?.riskScore, 70) })), - ...asArray(audit.shieldTransitions).map((transition, index) => ({ - id: `${asText(transition?.mode, "shield")}-${asText(transition?.timestamp, Date.now())}-${index}`, - title: `SHIELD / ${asText(transition?.mode, "TRANSITION")}`, - details: `${asText(transition?.reason, "policy update")} | risk ${asText(transition?.riskScore, 80)}`, - score: asNumber(transition?.riskScore, 80) + ...asArray(audit.shieldTransitions).map((t, i) => ({ + id: `${asText(t?.mode, "shield")}-${asText(t?.timestamp, Date.now())}-${i}`, + title: `SHIELD / ${asText(t?.mode, "TRANSITION")}`, + details: `${asText(t?.reason, "policy update")} | risk ${asText(t?.riskScore, 80)}`, + score: asNumber(t?.riskScore, 80) })) ]; const auditQuery = deferredAuditFilter.trim().toLowerCase(); const auditItems = !auditQuery - ? mergedAuditItems.slice(0, 18) - : mergedAuditItems.filter((item) => - `${item.title} ${item.details}`.toLowerCase().includes(auditQuery) - ).slice(0, 18); + ? mergedAuditItems.slice(0, 24) + : mergedAuditItems.filter((item) => `${item.title} ${item.details}`.toLowerCase().includes(auditQuery)).slice(0, 24); async function handleShield(mode) { try { const result = await request("/api/console/shield/engage", { method: "POST", - body: JSON.stringify({ - mode, - reason: `react-console-${mode.toLowerCase()}` - }) + body: JSON.stringify({ mode, reason: `react-console-${mode.toLowerCase()}` }) }); - appendLine(setTerminalLines, `shield engaged: ${asText(result.mode, "unknown")}`); - if (asText(result.deterrenceMessage)) { - appendLine(setTerminalLines, result.deterrenceMessage); - } + addLine(`shield engaged: ${asText(result.mode, "unknown")}`); + if (asText(result.deterrenceMessage)) addLine(result.deterrenceMessage); refreshOverview("shield"); - } catch (error) { - appendLine(setTerminalLines, `shield error: ${error.message}`); - } + } catch (error) { addLine(`shield error: ${error.message}`); } } async function handleQuickAction(action) { try { const result = await request("/api/console/quick-action", { method: "POST", - body: JSON.stringify({ - action, - reason: `react-console-${action}` - }) + body: JSON.stringify({ action, reason: `react-console-${action}` }) }); - appendLine(setTerminalLines, `quick action ok: ${action}`); - if (asText(result.mode)) { - appendLine(setTerminalLines, `mode ${asText(result.mode)}`); - } + addLine(`quick action ok: ${action}`); + if (asText(result.mode)) addLine(`mode ${asText(result.mode)}`); refreshOverview(action); - } catch (error) { - appendLine(setTerminalLines, `quick action failed: ${error.message}`); - } + } catch (error) { addLine(`quick action failed: ${error.message}`); } } async function connectSsh(event) { @@ -249,88 +223,64 @@ export default function App() { }); const handshake = asRecord(handshakeResponse.handshake); setLastHandshake(handshake); - appendLine( - setTerminalLines, - `handshake ${handshake.approved ? "approved" : "denied"} | mode=${asText(handshake.shieldMode, "unknown")} heat=${asNumber(handshake.kernelHeat)} risk=${asNumber(handshake.riskScore)}` - ); - appendLine(setTerminalLines, asText(handshake.message, "handshake completed")); - if (!handshake.approved) { - return; - } - - const payload = { - ...sshForm, - port: Number(sshForm.port || 22), - handshakeToken: handshake.token - }; + addLine(`handshake ${handshake.approved ? "approved" : "denied"} | mode=${asText(handshake.shieldMode, "unknown")} heat=${asNumber(handshake.kernelHeat)} risk=${asNumber(handshake.riskScore)}`); + addLine(asText(handshake.message, "handshake completed")); + if (!handshake.approved) return; + const payload = { ...sshForm, port: Number(sshForm.port || 22), handshakeToken: handshake.token }; const result = await request("/api/console/ssh/connect", { method: "POST", body: JSON.stringify(payload) }); const session = asRecord(result.session); - appendLine(setTerminalLines, `ssh connected: ${asText(session.alias, "remote-session")}`); + addLine(`ssh connected: ${asText(session.alias, "remote-session")}`); setSelectedSessionId(asText(session.sessionId)); - setSshForm((current) => ({ ...current, password: "" })); + setSshForm((c) => ({ ...c, password: "" })); refreshOverview("ssh-connect"); - } catch (error) { - appendLine(setTerminalLines, `ssh connect failed: ${error.message}`); - } + } catch (error) { addLine(`ssh connect failed: ${error.message}`); } } async function executeSsh(event) { event.preventDefault(); if (!selectedSessionId || !commandInput.trim()) { - appendLine(setTerminalLines, "select a session and enter a command first"); + addLine("select a session and enter a command first"); return; } const command = commandInput.trim(); setCommandInput(""); - appendLine(setTerminalLines, `${selectedSession?.alias || "session"} $ ${command}`); + addLine(`${selectedSession?.alias || "session"} $ ${command}`); try { const result = await request("/api/console/ssh/execute", { method: "POST", - body: JSON.stringify({ - sessionId: selectedSessionId, - command - }) + body: JSON.stringify({ sessionId: selectedSessionId, command }) }); const sshResult = asRecord(result.result); - if (sshResult.flagged) { - appendLine(setTerminalLines, `guard: ${asText(sshResult.guardType, "unknown")} severity=${asNumber(sshResult.guardSeverity)}`); - } - if (asText(sshResult.stdout)) { - appendLine(setTerminalLines, sshResult.stdout); - } - if (asText(sshResult.stderr)) { - appendLine(setTerminalLines, `stderr: ${asText(sshResult.stderr)}`); - } - appendLine(setTerminalLines, `exit=${asNumber(sshResult.exitStatus)} in ${asNumber(sshResult.durationMs)}ms`); - } catch (error) { - appendLine(setTerminalLines, `ssh execute failed: ${error.message}`); - } + if (sshResult.flagged) addLine(`guard: ${asText(sshResult.guardType, "unknown")} severity=${asNumber(sshResult.guardSeverity)}`); + if (asText(sshResult.stdout)) addLine(sshResult.stdout); + if (asText(sshResult.stderr)) addLine(`stderr: ${asText(sshResult.stderr)}`); + addLine(`exit=${asNumber(sshResult.exitStatus)} in ${asNumber(sshResult.durationMs)}ms`); + } catch (error) { addLine(`ssh execute failed: ${error.message}`); } } async function disconnectSsh(sessionId) { try { await request(`/api/console/ssh/${sessionId}`, { method: "DELETE" }); - appendLine(setTerminalLines, `ssh disconnected: ${asText(sessionId).slice(0, 8)}`); + addLine(`ssh disconnected: ${asText(sessionId).slice(0, 8)}`); refreshOverview("ssh-disconnect"); - } catch (error) { - appendLine(setTerminalLines, `disconnect failed: ${error.message}`); - } + } catch (error) { addLine(`disconnect failed: ${error.message}`); } } return (
+
@@ -366,29 +353,38 @@ export default function App() {
-
-
{["FORTIFY", "MIRAGE", "SHELTER", "RECOVERY"].map((mode) => ( - + ))}
+ {/* Performance Sparklines */} +
+
+
+

PERFORMANCE TREND

+

实时性能走势

+
+ {server.processRunning ? "online" : "offline"} +
+
+ + + + +
+
+
@@ -398,14 +394,14 @@ export default function App() { nodes {sessions.length + 1}
- {modules.map((module) => ( -
- {asText(module?.id, "module")} -

{asText(module?.name, "Unnamed Module")}

-

{asText(module?.summary, "No summary available.")}

+ {modules.map((mod) => ( +
+ {asText(mod?.id, "module")} +

{asText(mod?.name, "Unnamed Module")}

+

{asText(mod?.summary, "No summary available.")}

- {asText(module?.status, "UNKNOWN")} - signal {asNumber(module?.signal)} + {asText(mod?.status, "UNKNOWN")} + signal {asNumber(mod?.signal)}
))} @@ -431,25 +427,14 @@ export default function App() {
{sessions.map((session) => ( -
setSelectedSessionId(asText(session?.sessionId))} - > + onClick={() => setSelectedSessionId(asText(session?.sessionId))}> {asText(session?.alias, "remote-session")}

{asText(session?.username, "user")}@{asText(session?.host, "host")}:{asText(session?.port, 22)}

{asText(session?.fingerprint, "no fingerprint")} - +
))} @@ -464,35 +449,25 @@ export default function App() {
{selectedSession?.alias || "no session"}
-
Sovereign Handshake - - {lastHandshake - ? `${lastHandshake.approved ? "approved" : "denied"} | ${asText(lastHandshake.shieldMode, "unknown")} | heat ${asNumber(lastHandshake.kernelHeat)} | risk ${asNumber(lastHandshake.riskScore)}` - : `required=${engineHandshake.required ? "yes" : "no"} | ttl ${asNumber(engineHandshake.ttlSeconds)}s`} - + {lastHandshake ? `${lastHandshake.approved ? "approved" : "denied"} | ${asText(lastHandshake.shieldMode, "unknown")} | heat ${asNumber(lastHandshake.kernelHeat)} | risk ${asNumber(lastHandshake.riskScore)}` + : `required=${engineHandshake.required ? "yes" : "no"} | ttl ${asNumber(engineHandshake.ttlSeconds)}s`}
-
- setSshForm((current) => ({ ...current, alias: event.target.value }))} /> - setSshForm((current) => ({ ...current, host: event.target.value }))} /> - setSshForm((current) => ({ ...current, port: event.target.value }))} /> - setSshForm((current) => ({ ...current, username: event.target.value }))} /> - setSshForm((current) => ({ ...current, password: event.target.value }))} /> - setSshForm((current) => ({ ...current, privateKeyPath: event.target.value }))} /> + setSshForm((c) => ({ ...c, alias: e.target.value }))} /> + setSshForm((c) => ({ ...c, host: e.target.value }))} /> + setSshForm((c) => ({ ...c, port: e.target.value }))} /> + setSshForm((c) => ({ ...c, username: e.target.value }))} /> + setSshForm((c) => ({ ...c, password: e.target.value }))} /> + setSshForm((c) => ({ ...c, privateKeyPath: e.target.value }))} />
-
- setCommandInput(event.target.value)} - /> - + setCommandInput(e.target.value)} /> +
-
{terminalLines.join("\n")}
@@ -505,8 +480,8 @@ export default function App() { critical {asNumber(network.criticalRiskIPs)}
- {(asArray(shield.topOffenders).length ? asArray(shield.topOffenders) : asArray(network.topRiskIPs)).slice(0, 8).map((offender, index) => ( -
+ {(asArray(shield.topOffenders).length ? asArray(shield.topOffenders) : asArray(network.topRiskIPs)).slice(0, 10).map((offender, i) => ( +
{asText(offender?.ip, "unknown")}

{asText(offender?.riskLevel, "risk")} | score {asNumber(offender?.riskScore)}

{asText(offender?.summary || offender?.reason, "suspicious pressure source")}

@@ -521,12 +496,8 @@ export default function App() {

AUDIT STREAM

审计与网络事件

- setAuditFilter(event.target.value)} - /> + setAuditFilter(e.target.value)} />
{auditItems.map((item) => ( @@ -555,22 +526,30 @@ function ProgressMeter({ label, value }) { const normalized = Math.max(0, Math.min(100, Number(value) || 0)); return (
-
- {label} - {normalized} -
-
- -
+
{label}{normalized}
+
); } function InfoPill({ label, value }) { return ( -
- {asText(label)} - {asText(value, "-")} +
{asText(label)}{asText(value, "-")}
+ ); +} + +function SparkBar({ label, value, max, accent }) { + const pct = Math.min(100, Math.max(0, (Number(value) || 0) / (max || 1) * 100)); + const level = pct > 80 ? "danger" : pct > 60 ? "warning" : ""; + return ( +
+
+ {label} + {asText(value, "0")} +
+
+ +
); } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 1324091..ec47bed 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -11,15 +11,9 @@ --rose: #ff7f96; } -* { - box-sizing: border-box; -} +* { box-sizing: border-box; } -html, -body, -#root { - min-height: 100%; -} +html, body, #root { min-height: 100%; } body { margin: 0; @@ -32,65 +26,13 @@ body { overflow-x: hidden; } -.boot-shell, -.fatal-shell { - min-height: 100vh; - display: grid; - place-items: center; - padding: 24px; -} +body::selection { background: rgba(96, 203, 255, 0.3); } -.boot-card, -.fatal-card { - width: min(560px, 100%); - border-radius: 28px; - padding: 28px; - border: 1px solid rgba(196, 225, 255, 0.12); - background: rgba(9, 21, 37, 0.74); - backdrop-filter: blur(18px) saturate(145%); - -webkit-backdrop-filter: blur(18px) saturate(145%); - box-shadow: var(--shadow); -} +::-webkit-scrollbar { width: 11px; height: 11px; } +::-webkit-scrollbar-thumb { background: rgba(130, 163, 196, 0.36); border-radius: 999px; border: 2px solid rgba(4, 9, 20, 0.4); } +::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.03); } -.boot-card h1, -.fatal-card h1 { - margin: 10px 0; - letter-spacing: -0.03em; -} - -.fatal-card pre { - margin: 18px 0 0; - padding: 14px; - border-radius: 16px; - background: rgba(255, 255, 255, 0.05); - color: var(--sun); - white-space: pre-wrap; - word-break: break-word; -} - -body::selection { - background: rgba(96, 203, 255, 0.3); -} - -::-webkit-scrollbar { - width: 11px; - height: 11px; -} - -::-webkit-scrollbar-thumb { - background: rgba(130, 163, 196, 0.36); - border-radius: 999px; - border: 2px solid rgba(4, 9, 20, 0.4); -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.03); -} - -button, -input { - font: inherit; -} +button, input, select { font: inherit; } .nebula-app { position: relative; @@ -101,34 +43,18 @@ input { padding: 20px; } -.ambient, -.mesh { - position: fixed; - pointer-events: none; -} - +.ambient, .mesh { position: fixed; pointer-events: none; } .ambient { - width: 360px; - height: 360px; - border-radius: 50%; - filter: blur(26px); - opacity: 0.42; + width: 360px; height: 360px; border-radius: 50%; + filter: blur(26px); opacity: 0.42; animation: drift 18s ease-in-out infinite; } - -.ambient-a { - top: 28px; - left: 4%; - background: radial-gradient(circle, rgba(82, 143, 255, 0.56), transparent 70%); +.ambient-a { top: 28px; left: 4%; background: radial-gradient(circle, rgba(82, 143, 255, 0.56), transparent 70%); } +.ambient-b { right: 10%; bottom: 2%; background: radial-gradient(circle, rgba(88, 229, 202, 0.32), transparent 70%); animation-delay: -6s; } +.ambient-c { + top: 40%; left: 50%; background: radial-gradient(circle, rgba(255, 200, 107, 0.18), transparent 60%); + animation-delay: -12s; width: 280px; height: 280px; } - -.ambient-b { - right: 10%; - bottom: 2%; - background: radial-gradient(circle, rgba(88, 229, 202, 0.32), transparent 70%); - animation-delay: -6s; -} - .mesh { inset: 0; background-image: @@ -139,491 +65,234 @@ input { } .glass-panel { - position: relative; - z-index: 1; - border-radius: 30px; - background: var(--glass); - border: 1px solid var(--border); + position: relative; z-index: 1; + border-radius: 30px; background: var(--glass); border: 1px solid var(--border); backdrop-filter: blur(18px) saturate(145%); -webkit-backdrop-filter: blur(18px) saturate(145%); - box-shadow: var(--shadow); - overflow: hidden; + box-shadow: var(--shadow); overflow: hidden; transition: transform 240ms ease, border-color 240ms ease, box-shadow 240ms ease; } - .glass-panel::before { - content: ""; - position: absolute; - inset: 0; + content: ""; position: absolute; inset: 0; background: linear-gradient(135deg, rgba(255, 255, 255, 0.09), transparent 32%, transparent 65%, rgba(99, 231, 194, 0.05)); pointer-events: none; } - -.glass-panel:hover { - transform: translateY(-2px); - border-color: rgba(99, 231, 194, 0.18); - box-shadow: 0 34px 82px rgba(1, 7, 16, 0.46); -} +.glass-panel:hover { transform: translateY(-2px); border-color: rgba(99, 231, 194, 0.18); box-shadow: 0 34px 82px rgba(1, 7, 16, 0.46); } .command-rail { - padding: 24px; - display: grid; - align-content: start; - gap: 18px; - position: sticky; - top: 20px; - height: calc(100vh - 40px); + padding: 24px; display: grid; align-content: start; gap: 18px; + position: sticky; top: 20px; height: calc(100vh - 40px); + overflow-y: auto; } +.command-rail h1, .main-grid h2, .main-grid h3, .module-card h4 { margin: 8px 0; letter-spacing: -0.03em; } +.eyebrow, .module-id { color: var(--muted); text-transform: uppercase; letter-spacing: 0.18em; font-size: 0.76rem; } +.muted { color: var(--muted); line-height: 1.5; } -.command-rail h1, -.main-grid h2, -.main-grid h3, -.module-card h4 { - margin: 8px 0; - letter-spacing: -0.03em; -} - -.eyebrow, -.module-id { - color: var(--muted); - text-transform: uppercase; - letter-spacing: 0.18em; - font-size: 0.76rem; -} - -.muted { - color: var(--muted); - line-height: 1.5; -} - -.stream-badge, -.chip, -.metric-card, -.module-card, -.node-card, -.feed-card, -.terminal-surface { - border: 1px solid rgba(255, 255, 255, 0.08); +.refresh-controls { + display: flex; align-items: center; gap: 14px; padding: 12px 16px; + border-radius: 20px; border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.05); } - -.stream-badge { - display: flex; - align-items: center; - gap: 12px; - padding: 14px 16px; - border-radius: 20px; +.toggle-label { + display: flex; align-items: center; gap: 10px; cursor: pointer; font-size: 0.88rem; color: #d6effd; +} +.toggle-label input[type="checkbox"] { width: auto; accent-color: var(--mint); } +.interval-select { + padding: 6px 10px; border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(255, 255, 255, 0.08); color: var(--text); cursor: pointer; font-size: 0.84rem; } +.health-panel { + padding: 16px; border-radius: 20px; + border: 1px solid rgba(99, 231, 194, 0.16); + background: rgba(99, 231, 194, 0.04); +} +.health-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 8px; } +.health-chip { + display: flex; align-items: center; gap: 8px; padding: 8px 12px; + border-radius: 14px; font-size: 0.8rem; border: 1px solid rgba(255, 255, 255, 0.06); + background: rgba(255, 255, 255, 0.04); +} +.health-chip.up { border-color: rgba(99, 231, 194, 0.24); } +.health-chip.down { border-color: rgba(255, 127, 150, 0.24); } +.health-dot { width: 8px; height: 8px; border-radius: 50%; } +.health-chip.up .health-dot { background: var(--mint); box-shadow: 0 0 10px rgba(99, 231, 194, 0.5); } +.health-chip.down .health-dot { background: var(--rose); box-shadow: 0 0 10px rgba(255, 127, 150, 0.5); } + +.stream-badge, .chip, .metric-card, .module-card, .node-card, .feed-card, .terminal-surface { + border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.05); +} +.stream-badge { display: flex; align-items: center; gap: 12px; padding: 14px 16px; border-radius: 20px; } .stream-dot { - width: 10px; - height: 10px; - border-radius: 50%; - background: #9faec2; + width: 10px; height: 10px; border-radius: 50%; background: #9faec2; box-shadow: 0 0 18px rgba(159, 174, 194, 0.5); } +.stream-dot.live { background: var(--mint); box-shadow: 0 0 22px rgba(99, 231, 194, 0.78); } +.stream-dot.degraded, .stream-dot.connecting { background: var(--sun); box-shadow: 0 0 22px rgba(255, 200, 107, 0.68); } -.stream-dot.live { - background: var(--mint); - box-shadow: 0 0 22px rgba(99, 231, 194, 0.78); -} - -.stream-dot.degraded, -.stream-dot.connecting { - background: var(--sun); - box-shadow: 0 0 22px rgba(255, 200, 107, 0.68); -} - -.rail-actions, -.shield-actions { - display: grid; - gap: 10px; -} - -.rail-metric-stack { - display: grid; - gap: 12px; -} - -.metric-card { - padding: 16px; - border-radius: 22px; -} - -.metric-card span { - display: block; - color: var(--muted); - font-size: 0.8rem; -} - -.metric-card strong { - display: block; - margin-top: 10px; - font-size: 2rem; -} +.rail-actions, .shield-actions { display: grid; gap: 10px; } +.rail-metric-stack { display: grid; gap: 12px; } +.metric-card { padding: 16px; border-radius: 22px; } +.metric-card span { display: block; color: var(--muted); font-size: 0.8rem; } +.metric-card strong { display: block; margin-top: 10px; font-size: 2rem; } .metric-card.mint strong { color: var(--mint); } .metric-card.sky strong { color: var(--sky); } .metric-card.sun strong { color: var(--sun); } .metric-card.rose strong { color: var(--rose); } .main-grid { - position: relative; - z-index: 1; - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); + position: relative; z-index: 1; + display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; } -.hero-panel, -.module-panel, -.node-panel, -.ssh-panel, -.threat-panel, -.audit-panel { - padding: 22px; -} - -.hero-panel { - display: grid; - grid-template-columns: 1.15fr 0.85fr; - gap: 24px; - min-height: 320px; -} +.hero-panel, .spark-panel, .module-panel, .node-panel, .ssh-panel, .threat-panel, .audit-panel { padding: 22px; } +.hero-panel { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 24px; min-height: 320px; } .hero-panel::after { - content: ""; - position: absolute; - right: -60px; - top: -50px; - width: 240px; - height: 240px; + content: ""; position: absolute; right: -60px; top: -50px; + width: 240px; height: 240px; background: radial-gradient(circle, rgba(99, 231, 194, 0.18), transparent 68%); pointer-events: none; } +.hero-copy { display: grid; align-content: start; gap: 14px; } +.hero-copy p:last-child { color: #d8edff; margin: 0; line-height: 1.6; } +.hero-side { display: grid; align-content: space-between; gap: 18px; } +.hero-pills { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } +.hero-meters, .feed-stack, .module-grid { display: grid; gap: 14px; } -.hero-copy p:last-child { - color: #d8edff; - margin: 0; - line-height: 1.6; -} +.spark-panel { grid-column: 1 / -1; } +.spark-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; } -.hero-copy { - display: grid; - align-content: start; - gap: 14px; +.spark-bar { + display: grid; gap: 8px; padding: 14px 16px; border-radius: 20px; + border: 1px solid rgba(255, 255, 255, 0.06); background: rgba(255, 255, 255, 0.04); } +.spark-bar.danger { border-color: rgba(255, 127, 150, 0.22); } +.spark-bar.warning { border-color: rgba(255, 200, 107, 0.22); } +.spark-head { display: flex; justify-content: space-between; align-items: center; } +.spark-head span { color: var(--muted); font-size: 0.82rem; } +.spark-head strong { font-size: 1.4rem; } +.spark-track { + height: 6px; border-radius: 999px; background: rgba(255, 255, 255, 0.06); overflow: hidden; +} +.spark-track span { display: block; height: 100%; border-radius: inherit; transition: width 400ms ease; } -.hero-side { - display: grid; - align-content: space-between; - gap: 18px; -} - -.hero-pills { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.info-pill { - padding: 14px 16px; - border-radius: 18px; - border: 1px solid rgba(255, 255, 255, 0.08); - background: rgba(255, 255, 255, 0.05); -} - -.info-pill span { - display: block; - color: var(--muted); - font-size: 0.78rem; -} - -.info-pill strong { - display: block; - margin-top: 8px; - font-size: 1rem; - color: #f2f9ff; -} - -.hero-meters, -.feed-stack, -.module-grid { - display: grid; - gap: 14px; -} - -.module-panel, -.ssh-panel { - grid-column: 1 / -1; -} +.module-panel, .ssh-panel { grid-column: 1 / -1; } .section-head { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 16px; - margin-bottom: 16px; + display: flex; justify-content: space-between; align-items: flex-start; + gap: 16px; margin-bottom: 16px; } - .chip { - display: inline-flex; - align-items: center; - padding: 9px 12px; - border-radius: 999px; - color: #d6effd; - font-size: 0.84rem; + display: inline-flex; align-items: center; padding: 9px 12px; + border-radius: 999px; color: #d6effd; font-size: 0.84rem; } - -.progress-meter { - display: grid; - gap: 8px; -} - -.meter-head { - display: flex; - justify-content: space-between; - align-items: center; -} - -.meter-head span { - color: var(--muted); +.info-pill { + padding: 14px 16px; border-radius: 18px; + border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.05); } +.info-pill span { display: block; color: var(--muted); font-size: 0.78rem; } +.info-pill strong { display: block; margin-top: 8px; font-size: 1rem; color: #f2f9ff; } +.progress-meter { display: grid; gap: 8px; } +.meter-head { display: flex; justify-content: space-between; align-items: center; } +.meter-head span { color: var(--muted); } .meter-track { - height: 10px; - border-radius: 999px; - background: rgba(255, 255, 255, 0.08); - overflow: hidden; + height: 10px; border-radius: 999px; background: rgba(255, 255, 255, 0.08); overflow: hidden; } - .meter-track span { - display: block; - height: 100%; - border-radius: inherit; + display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, #53bcff, #63e7c2 55%, #ffc86b 100%); transition: width 360ms ease; } -.primary, -.ghost, -.text-button { - border: 0; - cursor: pointer; +.primary, .ghost, .text-button { + border: 0; cursor: pointer; transition: transform 180ms ease, background 180ms ease, opacity 180ms ease; } - -.primary, -.ghost { - border-radius: 16px; - padding: 12px 16px; -} - +.primary, .ghost { border-radius: 16px; padding: 12px 16px; } .primary { - background: linear-gradient(135deg, #36d8b0, #1da8f1); - color: #031019; + background: linear-gradient(135deg, #36d8b0, #1da8f1); color: #031019; box-shadow: 0 14px 28px rgba(45, 168, 241, 0.18); } - -.primary.danger { - background: linear-gradient(135deg, #ff9d7e, #ff617f); -} - +.primary.danger { background: linear-gradient(135deg, #ff9d7e, #ff617f); } .ghost { - background: rgba(255, 255, 255, 0.07); - color: var(--text); + background: rgba(255, 255, 255, 0.07); color: var(--text); border: 1px solid rgba(255, 255, 255, 0.08); } +.ghost.danger { border-color: rgba(255, 127, 150, 0.3); color: #ffdce3; } +.text-button { background: transparent; color: var(--sky); padding: 0; } +button:hover { transform: translateY(-1px); } -.ghost.danger { - border-color: rgba(255, 127, 150, 0.3); - color: #ffdce3; -} - -.text-button { - background: transparent; - color: var(--sky); - padding: 0; -} - -button:hover { - transform: translateY(-1px); -} - -.module-grid { - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); -} - -.module-card, -.node-card, -.feed-card { - border-radius: 22px; - padding: 16px; +.module-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); } +.module-card, .node-card, .feed-card { + border-radius: 22px; padding: 16px; transition: transform 180ms ease, border-color 180ms ease, background 180ms ease; } - -.module-card:hover, -.node-card:hover, -.feed-card:hover { - transform: translateY(-1px); +.module-card:hover, .node-card:hover, .feed-card:hover { transform: translateY(-1px); } +.module-card p, .node-card p, .feed-card p { margin: 6px 0 0; color: var(--muted); line-height: 1.5; } +.module-card.warning, .node-card.selected, .feed-card.warning { border-color: rgba(255, 200, 107, 0.28); } +.module-card.danger, .feed-card.danger { border-color: rgba(255, 127, 150, 0.38); } +.module-foot, .node-stats { + display: flex; justify-content: space-between; gap: 12px; + margin-top: 14px; color: #d7ecfb; font-size: 0.86rem; } -.module-card p, -.node-card p, -.feed-card p { - margin: 6px 0 0; - color: var(--muted); - line-height: 1.5; -} +.node-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; } +.node-card { cursor: pointer; } +.node-card.local { background: linear-gradient(135deg, rgba(99, 231, 194, 0.12), rgba(31, 112, 255, 0.08)); } +.node-card.selected { box-shadow: inset 0 0 0 1px rgba(255, 200, 107, 0.18); } -.module-card.warning, -.node-card.selected, -.feed-card.warning { - border-color: rgba(255, 200, 107, 0.28); -} - -.module-card.danger, -.feed-card.danger { - border-color: rgba(255, 127, 150, 0.38); -} - -.module-foot, -.node-stats { - display: flex; - justify-content: space-between; - gap: 12px; - margin-top: 14px; - color: #d7ecfb; - font-size: 0.86rem; -} - -.node-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: 14px; -} - -.node-card { - cursor: pointer; -} - -.node-card.local { - background: linear-gradient(135deg, rgba(99, 231, 194, 0.12), rgba(31, 112, 255, 0.08)); -} - -.node-card.selected { - box-shadow: inset 0 0 0 1px rgba(255, 200, 107, 0.18); -} - -.connect-form, -.command-form { - display: grid; - gap: 10px; -} +.connect-form, .command-form { display: grid; gap: 10px; } .handshake-banner { - display: grid; - gap: 6px; - margin-bottom: 14px; - padding: 14px 16px; - border-radius: 18px; - border: 1px solid rgba(255, 255, 255, 0.08); + display: grid; gap: 6px; margin-bottom: 14px; padding: 14px 16px; + border-radius: 18px; border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.05); } +.handshake-banner strong { font-size: 0.92rem; } +.handshake-banner span { color: var(--muted); font-size: 0.86rem; } +.handshake-banner.approved { border-color: rgba(99, 231, 194, 0.32); } +.handshake-banner.denied { border-color: rgba(255, 127, 150, 0.36); } -.handshake-banner strong { - font-size: 0.92rem; -} +.connect-form { grid-template-columns: repeat(7, minmax(0, 1fr)); } +.command-form { grid-template-columns: 1fr auto; margin-top: 12px; } -.handshake-banner span { - color: var(--muted); - font-size: 0.86rem; -} - -.handshake-banner.approved { - border-color: rgba(99, 231, 194, 0.32); -} - -.handshake-banner.denied { - border-color: rgba(255, 127, 150, 0.36); -} - -.connect-form { - grid-template-columns: repeat(7, minmax(0, 1fr)); -} - -.command-form { - grid-template-columns: 1fr auto; - margin-top: 12px; -} - -input { - width: 100%; - min-width: 0; - padding: 12px 14px; - color: var(--text); - border-radius: 15px; - border: 1px solid rgba(255, 255, 255, 0.08); - background: rgba(255, 255, 255, 0.06); - outline: none; -} - -input:focus { - border-color: rgba(96, 203, 255, 0.42); - box-shadow: 0 0 0 4px rgba(96, 203, 255, 0.08); +input, select, textarea { + width: 100%; min-width: 0; padding: 12px 14px; color: var(--text); + border-radius: 15px; border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(255, 255, 255, 0.06); outline: none; } +input:focus, select:focus { border-color: rgba(96, 203, 255, 0.42); box-shadow: 0 0 0 4px rgba(96, 203, 255, 0.08); } .terminal-surface { - margin-top: 12px; - min-height: 320px; - max-height: 420px; - overflow: auto; - padding: 18px; - border-radius: 24px; + margin-top: 12px; min-height: 320px; max-height: 420px; overflow: auto; + padding: 18px; border-radius: 24px; font-family: "SF Mono", "Cascadia Code", "JetBrains Mono", monospace; - font-size: 0.9rem; - line-height: 1.6; - white-space: pre-wrap; + font-size: 0.9rem; line-height: 1.6; white-space: pre-wrap; background: linear-gradient(180deg, rgba(3, 11, 20, 0.92), rgba(6, 18, 30, 0.88)), radial-gradient(circle at top right, rgba(96, 203, 255, 0.08), transparent 30%); } -.filter-input { - max-width: 260px; -} +.filter-input { max-width: 260px; } @keyframes drift { - 0%, - 100% { transform: translate3d(0, 0, 0); } + 0%, 100% { transform: translate3d(0, 0, 0); } 50% { transform: translate3d(0, -18px, 0) scale(1.04); } } +/* Responsive breakpoints */ @media (max-width: 1220px) { - .nebula-app { - grid-template-columns: 1fr; - } - - .command-rail { - order: 2; - position: static; - height: auto; - } + .nebula-app { grid-template-columns: 1fr; } + .command-rail { order: 2; position: static; height: auto; } } @media (max-width: 900px) { - .main-grid, - .connect-form, - .node-grid { - grid-template-columns: 1fr; - } - - .hero-panel, - .hero-pills { - grid-template-columns: 1fr; - } - - .section-head { - flex-direction: column; - } + .main-grid, .connect-form, .node-grid, .spark-grid { grid-template-columns: 1fr; } + .hero-panel, .hero-pills { grid-template-columns: 1fr; } + .section-head { flex-direction: column; } + .health-grid { grid-template-columns: 1fr; } } diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index 6fc7b40..0885658 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -5,8 +5,8 @@ Aluer Nebula Console - - + +
diff --git a/src/main/resources/static/nebula-assets/index-Dy6U3sfe.js b/src/main/resources/static/nebula-assets/index-Dy6U3sfe.js new file mode 100644 index 0000000..89d41d0 --- /dev/null +++ b/src/main/resources/static/nebula-assets/index-Dy6U3sfe.js @@ -0,0 +1,50 @@ +(function(){const H=document.createElement("link").relList;if(H&&H.supports&&H.supports("modulepreload"))return;for(const G of document.querySelectorAll('link[rel="modulepreload"]'))r(G);new MutationObserver(G=>{for(const $ of G)if($.type==="childList")for(const zl of $.addedNodes)zl.tagName==="LINK"&&zl.rel==="modulepreload"&&r(zl)}).observe(document,{childList:!0,subtree:!0});function Q(G){const $={};return G.integrity&&($.integrity=G.integrity),G.referrerPolicy&&($.referrerPolicy=G.referrerPolicy),G.crossOrigin==="use-credentials"?$.credentials="include":G.crossOrigin==="anonymous"?$.credentials="omit":$.credentials="same-origin",$}function r(G){if(G.ep)return;G.ep=!0;const $=Q(G);fetch(G.href,$)}})();function Go(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var bf={exports:{}},Ru={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var No;function iv(){if(No)return Ru;No=1;var A=Symbol.for("react.transitional.element"),H=Symbol.for("react.fragment");function Q(r,G,$){var zl=null;if($!==void 0&&(zl=""+$),G.key!==void 0&&(zl=""+G.key),"key"in G){$={};for(var Xl in G)Xl!=="key"&&($[Xl]=G[Xl])}else $=G;return G=$.ref,{$$typeof:A,type:r,key:zl,ref:G!==void 0?G:null,props:$}}return Ru.Fragment=H,Ru.jsx=Q,Ru.jsxs=Q,Ru}var Do;function fv(){return Do||(Do=1,bf.exports=iv()),bf.exports}var m=fv(),Ef={exports:{}},L={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var jo;function sv(){if(jo)return L;jo=1;var A=Symbol.for("react.transitional.element"),H=Symbol.for("react.portal"),Q=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),G=Symbol.for("react.profiler"),$=Symbol.for("react.consumer"),zl=Symbol.for("react.context"),Xl=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),O=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),Y=Symbol.for("react.activity"),ml=Symbol.iterator;function tt(h){return h===null||typeof h!="object"?null:(h=ml&&h[ml]||h["@@iterator"],typeof h=="function"?h:null)}var ql={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Bl=Object.assign,ut={};function at(h,p,M){this.props=h,this.context=p,this.refs=ut,this.updater=M||ql}at.prototype.isReactComponent={},at.prototype.setState=function(h,p){if(typeof h!="object"&&typeof h!="function"&&h!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,h,p,"setState")},at.prototype.forceUpdate=function(h){this.updater.enqueueForceUpdate(this,h,"forceUpdate")};function zt(){}zt.prototype=at.prototype;function Yl(h,p,M){this.props=h,this.context=p,this.refs=ut,this.updater=M||ql}var $l=Yl.prototype=new zt;$l.constructor=Yl,Bl($l,at.prototype),$l.isPureReactComponent=!0;var Tt=Array.isArray;function yl(){}var V={H:null,A:null,T:null,S:null},Wl=Object.prototype.hasOwnProperty;function ll(h,p,M){var D=M.ref;return{$$typeof:A,type:h,key:p,ref:D!==void 0?D:null,props:M}}function kl(h,p){return ll(h.type,p,h.props)}function Fl(h){return typeof h=="object"&&h!==null&&h.$$typeof===A}function Tl(h){var p={"=":"=0",":":"=2"};return"$"+h.replace(/[=:]/g,function(M){return p[M]})}var qt=/\/+/g;function Il(h,p){return typeof h=="object"&&h!==null&&h.key!=null?Tl(""+h.key):p.toString(36)}function _l(h){switch(h.status){case"fulfilled":return h.value;case"rejected":throw h.reason;default:switch(typeof h.status=="string"?h.then(yl,yl):(h.status="pending",h.then(function(p){h.status==="pending"&&(h.status="fulfilled",h.value=p)},function(p){h.status==="pending"&&(h.status="rejected",h.reason=p)})),h.status){case"fulfilled":return h.value;case"rejected":throw h.reason}}throw h}function b(h,p,M,D,X){var Z=typeof h;(Z==="undefined"||Z==="boolean")&&(h=null);var tl=!1;if(h===null)tl=!0;else switch(Z){case"bigint":case"string":case"number":tl=!0;break;case"object":switch(h.$$typeof){case A:case H:tl=!0;break;case w:return tl=h._init,b(tl(h._payload),p,M,D,X)}}if(tl)return X=X(h),tl=D===""?"."+Il(h,0):D,Tt(X)?(M="",tl!=null&&(M=tl.replace(qt,"$&/")+"/"),b(X,p,M,"",function(ia){return ia})):X!=null&&(Fl(X)&&(X=kl(X,M+(X.key==null||h&&h.key===X.key?"":(""+X.key).replace(qt,"$&/")+"/")+tl)),p.push(X)),1;tl=0;var Sl=D===""?".":D+":";if(Tt(h))for(var bl=0;bl>>1,cl=b[ul];if(0>>1;ulG(M,q))DG(X,M)?(b[ul]=X,b[D]=q,ul=D):(b[ul]=M,b[p]=q,ul=p);else if(DG(X,q))b[ul]=X,b[D]=q,ul=D;else break l}}return _}function G(b,_){var q=b.sortIndex-_.sortIndex;return q!==0?q:b.id-_.id}if(A.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var $=performance;A.unstable_now=function(){return $.now()}}else{var zl=Date,Xl=zl.now();A.unstable_now=function(){return zl.now()-Xl}}var R=[],O=[],w=1,Y=null,ml=3,tt=!1,ql=!1,Bl=!1,ut=!1,at=typeof setTimeout=="function"?setTimeout:null,zt=typeof clearTimeout=="function"?clearTimeout:null,Yl=typeof setImmediate<"u"?setImmediate:null;function $l(b){for(var _=Q(O);_!==null;){if(_.callback===null)r(O);else if(_.startTime<=b)r(O),_.sortIndex=_.expirationTime,H(R,_);else break;_=Q(O)}}function Tt(b){if(Bl=!1,$l(b),!ql)if(Q(R)!==null)ql=!0,yl||(yl=!0,Tl());else{var _=Q(O);_!==null&&_l(Tt,_.startTime-b)}}var yl=!1,V=-1,Wl=5,ll=-1;function kl(){return ut?!0:!(A.unstable_now()-llb&&kl());){var ul=Y.callback;if(typeof ul=="function"){Y.callback=null,ml=Y.priorityLevel;var cl=ul(Y.expirationTime<=b);if(b=A.unstable_now(),typeof cl=="function"){Y.callback=cl,$l(b),_=!0;break t}Y===Q(R)&&r(R),$l(b)}else r(R);Y=Q(R)}if(Y!==null)_=!0;else{var h=Q(O);h!==null&&_l(Tt,h.startTime-b),_=!1}}break l}finally{Y=null,ml=q,tt=!1}_=void 0}}finally{_?Tl():yl=!1}}}var Tl;if(typeof Yl=="function")Tl=function(){Yl(Fl)};else if(typeof MessageChannel<"u"){var qt=new MessageChannel,Il=qt.port2;qt.port1.onmessage=Fl,Tl=function(){Il.postMessage(null)}}else Tl=function(){at(Fl,0)};function _l(b,_){V=at(function(){b(A.unstable_now())},_)}A.unstable_IdlePriority=5,A.unstable_ImmediatePriority=1,A.unstable_LowPriority=4,A.unstable_NormalPriority=3,A.unstable_Profiling=null,A.unstable_UserBlockingPriority=2,A.unstable_cancelCallback=function(b){b.callback=null},A.unstable_forceFrameRate=function(b){0>b||125ul?(b.sortIndex=q,H(O,b),Q(R)===null&&b===Q(O)&&(Bl?(zt(V),V=-1):Bl=!0,_l(Tt,q-ul))):(b.sortIndex=cl,H(R,b),ql||tt||(ql=!0,yl||(yl=!0,Tl()))),b},A.unstable_shouldYield=kl,A.unstable_wrapCallback=function(b){var _=ml;return function(){var q=ml;ml=_;try{return b.apply(this,arguments)}finally{ml=q}}}})(pf)),pf}var Ho;function hv(){return Ho||(Ho=1,Tf.exports=dv()),Tf.exports}var Af={exports:{}},lt={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ro;function ov(){if(Ro)return lt;Ro=1;var A=Mf();function H(R){var O="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(A)}catch(H){console.error(H)}}return A(),Af.exports=ov(),Af.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var qo;function vv(){if(qo)return Cu;qo=1;var A=hv(),H=Mf(),Q=mv();function r(l){var t="https://react.dev/errors/"+l;if(1cl||(l.current=ul[cl],ul[cl]=null,cl--)}function M(l,t){cl++,ul[cl]=l.current,l.current=t}var D=h(null),X=h(null),Z=h(null),tl=h(null);function Sl(l,t){switch(M(Z,t),M(X,l),M(D,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?kh(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=kh(t),l=Fh(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}p(D),M(D,l)}function bl(){p(D),p(X),p(Z)}function ia(l){l.memoizedState!==null&&M(tl,l);var t=D.current,a=Fh(t,l.type);t!==a&&(M(X,l),M(D,a))}function Ia(l){X.current===l&&(p(D),p(X)),tl.current===l&&(p(tl),ju._currentValue=q)}var Ye,Pa;function Xt(l){if(Ye===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Ye=t&&t[1]||"",Pa=-1)":-1u||f[e]!==y[u]){var E=` +`+f[e].replace(" at new "," at ");return l.displayName&&E.includes("")&&(E=E.replace("",l.displayName)),E}while(1<=e&&0<=u);break}}}finally{Ge=!1,Error.prepareStackTrace=a}return(a=l?l.displayName||l.name:"")?Xt(a):""}function qu(l,t){switch(l.tag){case 26:case 27:case 5:return Xt(l.type);case 16:return Xt("Lazy");case 13:return l.child!==t&&t!==null?Xt("Suspense Fallback"):Xt("Suspense");case 19:return Xt("SuspenseList");case 0:case 15:return Qe(l.type,!1);case 11:return Qe(l.type.render,!1);case 1:return Qe(l.type,!0);case 31:return Xt("Activity");default:return""}}function Xe(l){try{var t="",a=null;do t+=qu(l,a),a=l,l=l.return;while(l);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var s=Object.prototype.hasOwnProperty,U=A.unstable_scheduleCallback,Ml=A.unstable_cancelCallback,Zl=A.unstable_shouldYield,uc=A.unstable_requestPaint,Pl=A.unstable_now,nc=A.unstable_getCurrentPriorityLevel,Nf=A.unstable_ImmediatePriority,Df=A.unstable_UserBlockingPriority,Bu=A.unstable_NormalPriority,Zo=A.unstable_LowPriority,jf=A.unstable_IdlePriority,Lo=A.log,Vo=A.unstable_setDisableYieldValue,Ze=null,ot=null;function fa(l){if(typeof Lo=="function"&&Vo(l),ot&&typeof ot.setStrictMode=="function")try{ot.setStrictMode(Ze,l)}catch{}}var mt=Math.clz32?Math.clz32:wo,Ko=Math.log,Jo=Math.LN2;function wo(l){return l>>>=0,l===0?32:31-(Ko(l)/Jo|0)|0}var Yu=256,Gu=262144,Qu=4194304;function Ra(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&261888;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function Xu(l,t,a){var e=l.pendingLanes;if(e===0)return 0;var u=0,n=l.suspendedLanes,c=l.pingedLanes;l=l.warmLanes;var i=e&134217727;return i!==0?(e=i&~n,e!==0?u=Ra(e):(c&=i,c!==0?u=Ra(c):a||(a=i&~l,a!==0&&(u=Ra(a))))):(i=e&~n,i!==0?u=Ra(i):c!==0?u=Ra(c):a||(a=e&~l,a!==0&&(u=Ra(a)))),u===0?0:t!==0&&t!==u&&(t&n)===0&&(n=u&-u,a=t&-t,n>=a||n===32&&(a&4194048)!==0)?t:u}function Le(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function $o(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Uf(){var l=Qu;return Qu<<=1,(Qu&62914560)===0&&(Qu=4194304),l}function cc(l){for(var t=[],a=0;31>a;a++)t.push(l);return t}function Ve(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function Wo(l,t,a,e,u,n){var c=l.pendingLanes;l.pendingLanes=a,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=a,l.entangledLanes&=a,l.errorRecoveryDisabledLanes&=a,l.shellSuspendCounter=0;var i=l.entanglements,f=l.expirationTimes,y=l.hiddenUpdates;for(a=c&~a;0"u")return null;try{return l.activeElement||l.body}catch{return l.body}}var t0=/[\n"\\]/g;function At(l){return l.replace(t0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function oc(l,t,a,e,u,n,c,i){l.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?l.type=c:l.removeAttribute("type"),t!=null?c==="number"?(t===0&&l.value===""||l.value!=t)&&(l.value=""+pt(t)):l.value!==""+pt(t)&&(l.value=""+pt(t)):c!=="submit"&&c!=="reset"||l.removeAttribute("value"),t!=null?mc(l,c,pt(t)):a!=null?mc(l,c,pt(a)):e!=null&&l.removeAttribute("value"),u==null&&n!=null&&(l.defaultChecked=!!n),u!=null&&(l.checked=u&&typeof u!="function"&&typeof u!="symbol"),i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?l.name=""+pt(i):l.removeAttribute("name")}function Vf(l,t,a,e,u,n,c,i){if(n!=null&&typeof n!="function"&&typeof n!="symbol"&&typeof n!="boolean"&&(l.type=n),t!=null||a!=null){if(!(n!=="submit"&&n!=="reset"||t!=null)){hc(l);return}a=a!=null?""+pt(a):"",t=t!=null?""+pt(t):a,i||t===l.value||(l.value=t),l.defaultValue=t}e=e??u,e=typeof e!="function"&&typeof e!="symbol"&&!!e,l.checked=i?l.checked:!!e,l.defaultChecked=!!e,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(l.name=c),hc(l)}function mc(l,t,a){t==="number"&&Vu(l.ownerDocument)===l||l.defaultValue===""+a||(l.defaultValue=""+a)}function ne(l,t,a,e){if(l=l.options,t){t={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Sc=!1;if(Vt)try{var $e={};Object.defineProperty($e,"passive",{get:function(){Sc=!0}}),window.addEventListener("test",$e,$e),window.removeEventListener("test",$e,$e)}catch{Sc=!1}var da=null,bc=null,Ju=null;function Ff(){if(Ju)return Ju;var l,t=bc,a=t.length,e,u="value"in da?da.value:da.textContent,n=u.length;for(l=0;l=Fe),es=" ",us=!1;function ns(l,t){switch(l){case"keyup":return D0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function cs(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var se=!1;function U0(l,t){switch(l){case"compositionend":return cs(t);case"keypress":return t.which!==32?null:(us=!0,es);case"textInput":return l=t.data,l===es&&us?null:l;default:return null}}function x0(l,t){if(se)return l==="compositionend"||!Ac&&ns(l,t)?(l=Ff(),Ju=bc=da=null,se=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-l};l=e}l:{for(;a;){if(a.nextSibling){a=a.nextSibling;break l}a=a.parentNode}a=void 0}a=vs(a)}}function rs(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?rs(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function gs(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=Vu(l.document);t instanceof l.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)l=t.contentWindow;else break;t=Vu(l.document)}return t}function Mc(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var Q0=Vt&&"documentMode"in document&&11>=document.documentMode,de=null,Nc=null,tu=null,Dc=!1;function Ss(l,t,a){var e=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Dc||de==null||de!==Vu(e)||(e=de,"selectionStart"in e&&Mc(e)?e={start:e.selectionStart,end:e.selectionEnd}:(e=(e.ownerDocument&&e.ownerDocument.defaultView||window).getSelection(),e={anchorNode:e.anchorNode,anchorOffset:e.anchorOffset,focusNode:e.focusNode,focusOffset:e.focusOffset}),tu&&lu(tu,e)||(tu=e,e=Qn(Nc,"onSelect"),0>=c,u-=c,Bt=1<<32-mt(t)+u|a<J?(I=x,x=null):I=x.sibling;var el=g(o,x,v[J],z);if(el===null){x===null&&(x=I);break}l&&x&&el.alternate===null&&t(o,x),d=n(el,d,J),al===null?C=el:al.sibling=el,al=el,x=I}if(J===v.length)return a(o,x),P&&Jt(o,J),C;if(x===null){for(;JJ?(I=x,x=null):I=x.sibling;var xa=g(o,x,el.value,z);if(xa===null){x===null&&(x=I);break}l&&x&&xa.alternate===null&&t(o,x),d=n(xa,d,J),al===null?C=xa:al.sibling=xa,al=xa,x=I}if(el.done)return a(o,x),P&&Jt(o,J),C;if(x===null){for(;!el.done;J++,el=v.next())el=T(o,el.value,z),el!==null&&(d=n(el,d,J),al===null?C=el:al.sibling=el,al=el);return P&&Jt(o,J),C}for(x=e(x);!el.done;J++,el=v.next())el=S(x,o,J,el.value,z),el!==null&&(l&&el.alternate!==null&&x.delete(el.key===null?J:el.key),d=n(el,d,J),al===null?C=el:al.sibling=el,al=el);return l&&x.forEach(function(cv){return t(o,cv)}),P&&Jt(o,J),C}function ol(o,d,v,z){if(typeof v=="object"&&v!==null&&v.type===Bl&&v.key===null&&(v=v.props.children),typeof v=="object"&&v!==null){switch(v.$$typeof){case tt:l:{for(var C=v.key;d!==null;){if(d.key===C){if(C=v.type,C===Bl){if(d.tag===7){a(o,d.sibling),z=u(d,v.props.children),z.return=o,o=z;break l}}else if(d.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===Wl&&Ka(C)===d.type){a(o,d.sibling),z=u(d,v.props),iu(z,v),z.return=o,o=z;break l}a(o,d);break}else t(o,d);d=d.sibling}v.type===Bl?(z=Qa(v.props.children,o.mode,z,v.key),z.return=o,o=z):(z=an(v.type,v.key,v.props,null,o.mode,z),iu(z,v),z.return=o,o=z)}return c(o);case ql:l:{for(C=v.key;d!==null;){if(d.key===C)if(d.tag===4&&d.stateNode.containerInfo===v.containerInfo&&d.stateNode.implementation===v.implementation){a(o,d.sibling),z=u(d,v.children||[]),z.return=o,o=z;break l}else{a(o,d);break}else t(o,d);d=d.sibling}z=qc(v,o.mode,z),z.return=o,o=z}return c(o);case Wl:return v=Ka(v),ol(o,d,v,z)}if(_l(v))return j(o,d,v,z);if(Tl(v)){if(C=Tl(v),typeof C!="function")throw Error(r(150));return v=C.call(v),B(o,d,v,z)}if(typeof v.then=="function")return ol(o,d,dn(v),z);if(v.$$typeof===Yl)return ol(o,d,nn(o,v),z);hn(o,v)}return typeof v=="string"&&v!==""||typeof v=="number"||typeof v=="bigint"?(v=""+v,d!==null&&d.tag===6?(a(o,d.sibling),z=u(d,v),z.return=o,o=z):(a(o,d),z=Cc(v,o.mode,z),z.return=o,o=z),c(o)):a(o,d)}return function(o,d,v,z){try{cu=0;var C=ol(o,d,v,z);return ze=null,C}catch(x){if(x===Ee||x===fn)throw x;var al=yt(29,x,null,o.mode);return al.lanes=z,al.return=o,al}finally{}}}var wa=Xs(!0),Zs=Xs(!1),ya=!1;function $c(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function ra(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function ga(l,t,a){var e=l.updateQueue;if(e===null)return null;if(e=e.shared,(nl&2)!==0){var u=e.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),e.pending=t,t=tn(l),Os(l,null,a),t}return ln(l,e,t,a),tn(l)}function fu(l,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var e=t.lanes;e&=l.pendingLanes,a|=e,t.lanes=a,Hf(l,a)}}function kc(l,t){var a=l.updateQueue,e=l.alternate;if(e!==null&&(e=e.updateQueue,a===e)){var u=null,n=null;if(a=a.firstBaseUpdate,a!==null){do{var c={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};n===null?u=n=c:n=n.next=c,a=a.next}while(a!==null);n===null?u=n=t:n=n.next=t}else u=n=t;a={baseState:e.baseState,firstBaseUpdate:u,lastBaseUpdate:n,shared:e.shared,callbacks:e.callbacks},l.updateQueue=a;return}l=a.lastBaseUpdate,l===null?a.firstBaseUpdate=t:l.next=t,a.lastBaseUpdate=t}var Fc=!1;function su(){if(Fc){var l=be;if(l!==null)throw l}}function du(l,t,a,e){Fc=!1;var u=l.updateQueue;ya=!1;var n=u.firstBaseUpdate,c=u.lastBaseUpdate,i=u.shared.pending;if(i!==null){u.shared.pending=null;var f=i,y=f.next;f.next=null,c===null?n=y:c.next=y,c=f;var E=l.alternate;E!==null&&(E=E.updateQueue,i=E.lastBaseUpdate,i!==c&&(i===null?E.firstBaseUpdate=y:i.next=y,E.lastBaseUpdate=f))}if(n!==null){var T=u.baseState;c=0,E=y=f=null,i=n;do{var g=i.lane&-536870913,S=g!==i.lane;if(S?(F&g)===g:(e&g)===g){g!==0&&g===Se&&(Fc=!0),E!==null&&(E=E.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});l:{var j=l,B=i;g=t;var ol=a;switch(B.tag){case 1:if(j=B.payload,typeof j=="function"){T=j.call(ol,T,g);break l}T=j;break l;case 3:j.flags=j.flags&-65537|128;case 0:if(j=B.payload,g=typeof j=="function"?j.call(ol,T,g):j,g==null)break l;T=Y({},T,g);break l;case 2:ya=!0}}g=i.callback,g!==null&&(l.flags|=64,S&&(l.flags|=8192),S=u.callbacks,S===null?u.callbacks=[g]:S.push(g))}else S={lane:g,tag:i.tag,payload:i.payload,callback:i.callback,next:null},E===null?(y=E=S,f=T):E=E.next=S,c|=g;if(i=i.next,i===null){if(i=u.shared.pending,i===null)break;S=i,i=S.next,S.next=null,u.lastBaseUpdate=S,u.shared.pending=null}}while(!0);E===null&&(f=T),u.baseState=f,u.firstBaseUpdate=y,u.lastBaseUpdate=E,n===null&&(u.shared.lanes=0),Ta|=c,l.lanes=c,l.memoizedState=T}}function Ls(l,t){if(typeof l!="function")throw Error(r(191,l));l.call(t)}function Vs(l,t){var a=l.callbacks;if(a!==null)for(l.callbacks=null,l=0;ln?n:8;var c=b.T,i={};b.T=i,ri(l,!1,t,a);try{var f=u(),y=b.S;if(y!==null&&y(i,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var E=W0(f,e);mu(l,t,E,Et(l))}else mu(l,t,e,Et(l))}catch(T){mu(l,t,{then:function(){},status:"rejected",reason:T},Et())}finally{_.p=n,c!==null&&i.types!==null&&(c.types=i.types),b.T=c}}function tm(){}function vi(l,t,a,e){if(l.tag!==5)throw Error(r(476));var u=Td(l).queue;zd(l,u,t,q,a===null?tm:function(){return pd(l),a(e)})}function Td(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:q,baseState:q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:kt,lastRenderedState:q},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:kt,lastRenderedState:a},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function pd(l){var t=Td(l);t.next===null&&(t=l.alternate.memoizedState),mu(l,t.next.queue,{},Et())}function yi(){return Kl(ju)}function Ad(){return Dl().memoizedState}function Od(){return Dl().memoizedState}function am(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var a=Et();l=ra(a);var e=ga(t,l,a);e!==null&&(ht(e,t,a),fu(e,t,a)),t={cache:Vc()},l.payload=t;return}t=t.return}}function em(l,t,a){var e=Et();a={lane:e,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},zn(l)?Md(t,a):(a=Hc(l,t,a,e),a!==null&&(ht(a,l,e),Nd(a,t,e)))}function _d(l,t,a){var e=Et();mu(l,t,a,e)}function mu(l,t,a,e){var u={lane:e,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(zn(l))Md(t,u);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var c=t.lastRenderedState,i=n(c,a);if(u.hasEagerState=!0,u.eagerState=i,vt(i,c))return ln(l,t,u,0),vl===null&&Pu(),!1}catch{}finally{}if(a=Hc(l,t,u,e),a!==null)return ht(a,l,e),Nd(a,t,e),!0}return!1}function ri(l,t,a,e){if(e={lane:2,revertLane:$i(),gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},zn(l)){if(t)throw Error(r(479))}else t=Hc(l,a,e,2),t!==null&&ht(t,l,2)}function zn(l){var t=l.alternate;return l===K||t!==null&&t===K}function Md(l,t){pe=vn=!0;var a=l.pending;a===null?t.next=t:(t.next=a.next,a.next=t),l.pending=t}function Nd(l,t,a){if((a&4194048)!==0){var e=t.lanes;e&=l.pendingLanes,a|=e,t.lanes=a,Hf(l,a)}}var vu={readContext:Kl,use:gn,useCallback:Al,useContext:Al,useEffect:Al,useImperativeHandle:Al,useLayoutEffect:Al,useInsertionEffect:Al,useMemo:Al,useReducer:Al,useRef:Al,useState:Al,useDebugValue:Al,useDeferredValue:Al,useTransition:Al,useSyncExternalStore:Al,useId:Al,useHostTransitionStatus:Al,useFormState:Al,useActionState:Al,useOptimistic:Al,useMemoCache:Al,useCacheRefresh:Al};vu.useEffectEvent=Al;var Dd={readContext:Kl,use:gn,useCallback:function(l,t){return et().memoizedState=[l,t===void 0?null:t],l},useContext:Kl,useEffect:od,useImperativeHandle:function(l,t,a){a=a!=null?a.concat([l]):null,bn(4194308,4,rd.bind(null,t,l),a)},useLayoutEffect:function(l,t){return bn(4194308,4,l,t)},useInsertionEffect:function(l,t){bn(4,2,l,t)},useMemo:function(l,t){var a=et();t=t===void 0?null:t;var e=l();if($a){fa(!0);try{l()}finally{fa(!1)}}return a.memoizedState=[e,t],e},useReducer:function(l,t,a){var e=et();if(a!==void 0){var u=a(t);if($a){fa(!0);try{a(t)}finally{fa(!1)}}}else u=t;return e.memoizedState=e.baseState=u,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:u},e.queue=l,l=l.dispatch=em.bind(null,K,l),[e.memoizedState,l]},useRef:function(l){var t=et();return l={current:l},t.memoizedState=l},useState:function(l){l=si(l);var t=l.queue,a=_d.bind(null,K,t);return t.dispatch=a,[l.memoizedState,a]},useDebugValue:oi,useDeferredValue:function(l,t){var a=et();return mi(a,l,t)},useTransition:function(){var l=si(!1);return l=zd.bind(null,K,l.queue,!0,!1),et().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,a){var e=K,u=et();if(P){if(a===void 0)throw Error(r(407));a=a()}else{if(a=t(),vl===null)throw Error(r(349));(F&127)!==0||ks(e,t,a)}u.memoizedState=a;var n={value:a,getSnapshot:t};return u.queue=n,od(Is.bind(null,e,n,l),[l]),e.flags|=2048,Oe(9,{destroy:void 0},Fs.bind(null,e,n,a,t),null),a},useId:function(){var l=et(),t=vl.identifierPrefix;if(P){var a=Yt,e=Bt;a=(e&~(1<<32-mt(e)-1)).toString(32)+a,t="_"+t+"R_"+a,a=yn++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof e.is=="string"?c.createElement("select",{is:e.is}):c.createElement("select"),e.multiple?n.multiple=!0:e.size&&(n.size=e.size);break;default:n=typeof e.is=="string"?c.createElement(u,{is:e.is}):c.createElement(u)}}n[Ll]=t,n[nt]=e;l:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)n.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break l;for(;c.sibling===null;){if(c.return===null||c.return===t)break l;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=n;l:switch(wl(n,u,e),u){case"button":case"input":case"select":case"textarea":e=!!e.autoFocus;break l;case"img":e=!0;break l;default:e=!1}e&&It(t)}}return gl(t),ji(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,a),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==e&&It(t);else{if(typeof e!="string"&&t.stateNode===null)throw Error(r(166));if(l=Z.current,re(t)){if(l=t.stateNode,a=t.memoizedProps,e=null,u=Vl,u!==null)switch(u.tag){case 27:case 5:e=u.memoizedProps}l[Ll]=t,l=!!(l.nodeValue===a||e!==null&&e.suppressHydrationWarning===!0||$h(l.nodeValue,a)),l||ma(t,!0)}else l=Xn(l).createTextNode(e),l[Ll]=t,t.stateNode=l}return gl(t),null;case 31:if(a=t.memoizedState,l===null||l.memoizedState!==null){if(e=re(t),a!==null){if(l===null){if(!e)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(557));l[Ll]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;gl(t),l=!1}else a=Qc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=a),l=!0;if(!l)return t.flags&256?(gt(t),t):(gt(t),null);if((t.flags&128)!==0)throw Error(r(558))}return gl(t),null;case 13:if(e=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(u=re(t),e!==null&&e.dehydrated!==null){if(l===null){if(!u)throw Error(r(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(r(317));u[Ll]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;gl(t),u=!1}else u=Qc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=u),u=!0;if(!u)return t.flags&256?(gt(t),t):(gt(t),null)}return gt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=e!==null,l=l!==null&&l.memoizedState!==null,a&&(e=t.child,u=null,e.alternate!==null&&e.alternate.memoizedState!==null&&e.alternate.memoizedState.cachePool!==null&&(u=e.alternate.memoizedState.cachePool.pool),n=null,e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),n!==u&&(e.flags|=2048)),a!==l&&a&&(t.child.flags|=8192),_n(t,t.updateQueue),gl(t),null);case 4:return bl(),l===null&&Ii(t.stateNode.containerInfo),gl(t),null;case 10:return $t(t.type),gl(t),null;case 19:if(p(Nl),e=t.memoizedState,e===null)return gl(t),null;if(u=(t.flags&128)!==0,n=e.rendering,n===null)if(u)ru(e,!1);else{if(Ol!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=mn(l),n!==null){for(t.flags|=128,ru(e,!1),l=n.updateQueue,t.updateQueue=l,_n(t,l),t.subtreeFlags=0,l=a,a=t.child;a!==null;)_s(a,l),a=a.sibling;return M(Nl,Nl.current&1|2),P&&Jt(t,e.treeForkCount),t.child}l=l.sibling}e.tail!==null&&Pl()>Un&&(t.flags|=128,u=!0,ru(e,!1),t.lanes=4194304)}else{if(!u)if(l=mn(n),l!==null){if(t.flags|=128,u=!0,l=l.updateQueue,t.updateQueue=l,_n(t,l),ru(e,!0),e.tail===null&&e.tailMode==="hidden"&&!n.alternate&&!P)return gl(t),null}else 2*Pl()-e.renderingStartTime>Un&&a!==536870912&&(t.flags|=128,u=!0,ru(e,!1),t.lanes=4194304);e.isBackwards?(n.sibling=t.child,t.child=n):(l=e.last,l!==null?l.sibling=n:t.child=n,e.last=n)}return e.tail!==null?(l=e.tail,e.rendering=l,e.tail=l.sibling,e.renderingStartTime=Pl(),l.sibling=null,a=Nl.current,M(Nl,u?a&1|2:a&1),P&&Jt(t,e.treeForkCount),l):(gl(t),null);case 22:case 23:return gt(t),Pc(),e=t.memoizedState!==null,l!==null?l.memoizedState!==null!==e&&(t.flags|=8192):e&&(t.flags|=8192),e?(a&536870912)!==0&&(t.flags&128)===0&&(gl(t),t.subtreeFlags&6&&(t.flags|=8192)):gl(t),a=t.updateQueue,a!==null&&_n(t,a.retryQueue),a=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(a=l.memoizedState.cachePool.pool),e=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),e!==a&&(t.flags|=2048),l!==null&&p(Va),null;case 24:return a=null,l!==null&&(a=l.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),$t(Ul),gl(t),null;case 25:return null;case 30:return null}throw Error(r(156,t.tag))}function fm(l,t){switch(Yc(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return $t(Ul),bl(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return Ia(t),null;case 31:if(t.memoizedState!==null){if(gt(t),t.alternate===null)throw Error(r(340));Xa()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(gt(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Xa()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return p(Nl),null;case 4:return bl(),null;case 10:return $t(t.type),null;case 22:case 23:return gt(t),Pc(),l!==null&&p(Va),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return $t(Ul),null;case 25:return null;default:return null}}function Pd(l,t){switch(Yc(t),t.tag){case 3:$t(Ul),bl();break;case 26:case 27:case 5:Ia(t);break;case 4:bl();break;case 31:t.memoizedState!==null&>(t);break;case 13:gt(t);break;case 19:p(Nl);break;case 10:$t(t.type);break;case 22:case 23:gt(t),Pc(),l!==null&&p(Va);break;case 24:$t(Ul)}}function gu(l,t){try{var a=t.updateQueue,e=a!==null?a.lastEffect:null;if(e!==null){var u=e.next;a=u;do{if((a.tag&l)===l){e=void 0;var n=a.create,c=a.inst;e=n(),c.destroy=e}a=a.next}while(a!==u)}}catch(i){fl(t,t.return,i)}}function Ea(l,t,a){try{var e=t.updateQueue,u=e!==null?e.lastEffect:null;if(u!==null){var n=u.next;e=n;do{if((e.tag&l)===l){var c=e.inst,i=c.destroy;if(i!==void 0){c.destroy=void 0,u=t;var f=a,y=i;try{y()}catch(E){fl(u,f,E)}}}e=e.next}while(e!==n)}}catch(E){fl(t,t.return,E)}}function lh(l){var t=l.updateQueue;if(t!==null){var a=l.stateNode;try{Vs(t,a)}catch(e){fl(l,l.return,e)}}}function th(l,t,a){a.props=Wa(l.type,l.memoizedProps),a.state=l.memoizedState;try{a.componentWillUnmount()}catch(e){fl(l,t,e)}}function Su(l,t){try{var a=l.ref;if(a!==null){switch(l.tag){case 26:case 27:case 5:var e=l.stateNode;break;case 30:e=l.stateNode;break;default:e=l.stateNode}typeof a=="function"?l.refCleanup=a(e):a.current=e}}catch(u){fl(l,t,u)}}function Gt(l,t){var a=l.ref,e=l.refCleanup;if(a!==null)if(typeof e=="function")try{e()}catch(u){fl(l,t,u)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(u){fl(l,t,u)}else a.current=null}function ah(l){var t=l.type,a=l.memoizedProps,e=l.stateNode;try{l:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&e.focus();break l;case"img":a.src?e.src=a.src:a.srcSet&&(e.srcset=a.srcSet)}}catch(u){fl(l,l.return,u)}}function Ui(l,t,a){try{var e=l.stateNode;jm(e,l.type,a,t),e[nt]=t}catch(u){fl(l,l.return,u)}}function eh(l){return l.tag===5||l.tag===3||l.tag===26||l.tag===27&&Ma(l.type)||l.tag===4}function xi(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||eh(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.tag===27&&Ma(l.type)||l.flags&2||l.child===null||l.tag===4)continue l;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function Hi(l,t,a){var e=l.tag;if(e===5||e===6)l=l.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(l,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(l),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Lt));else if(e!==4&&(e===27&&Ma(l.type)&&(a=l.stateNode,t=null),l=l.child,l!==null))for(Hi(l,t,a),l=l.sibling;l!==null;)Hi(l,t,a),l=l.sibling}function Mn(l,t,a){var e=l.tag;if(e===5||e===6)l=l.stateNode,t?a.insertBefore(l,t):a.appendChild(l);else if(e!==4&&(e===27&&Ma(l.type)&&(a=l.stateNode),l=l.child,l!==null))for(Mn(l,t,a),l=l.sibling;l!==null;)Mn(l,t,a),l=l.sibling}function uh(l){var t=l.stateNode,a=l.memoizedProps;try{for(var e=l.type,u=t.attributes;u.length;)t.removeAttributeNode(u[0]);wl(t,e,a),t[Ll]=l,t[nt]=a}catch(n){fl(l,l.return,n)}}var Pt=!1,Rl=!1,Ri=!1,nh=typeof WeakSet=="function"?WeakSet:Set,Ql=null;function sm(l,t){if(l=l.containerInfo,tf=$n,l=gs(l),Mc(l)){if("selectionStart"in l)var a={start:l.selectionStart,end:l.selectionEnd};else l:{a=(a=l.ownerDocument)&&a.defaultView||window;var e=a.getSelection&&a.getSelection();if(e&&e.rangeCount!==0){a=e.anchorNode;var u=e.anchorOffset,n=e.focusNode;e=e.focusOffset;try{a.nodeType,n.nodeType}catch{a=null;break l}var c=0,i=-1,f=-1,y=0,E=0,T=l,g=null;t:for(;;){for(var S;T!==a||u!==0&&T.nodeType!==3||(i=c+u),T!==n||e!==0&&T.nodeType!==3||(f=c+e),T.nodeType===3&&(c+=T.nodeValue.length),(S=T.firstChild)!==null;)g=T,T=S;for(;;){if(T===l)break t;if(g===a&&++y===u&&(i=c),g===n&&++E===e&&(f=c),(S=T.nextSibling)!==null)break;T=g,g=T.parentNode}T=S}a=i===-1||f===-1?null:{start:i,end:f}}else a=null}a=a||{start:0,end:0}}else a=null;for(af={focusedElem:l,selectionRange:a},$n=!1,Ql=t;Ql!==null;)if(t=Ql,l=t.child,(t.subtreeFlags&1028)!==0&&l!==null)l.return=t,Ql=l;else for(;Ql!==null;){switch(t=Ql,n=t.alternate,l=t.flags,t.tag){case 0:if((l&4)!==0&&(l=t.updateQueue,l=l!==null?l.events:null,l!==null))for(a=0;a title"))),wl(n,e,a),n[Ll]=l,Gl(n),e=n;break l;case"link":var c=oo("link","href",u).get(e+(a.href||""));if(c){for(var i=0;iol&&(c=ol,ol=B,B=c);var o=ys(i,B),d=ys(i,ol);if(o&&d&&(S.rangeCount!==1||S.anchorNode!==o.node||S.anchorOffset!==o.offset||S.focusNode!==d.node||S.focusOffset!==d.offset)){var v=T.createRange();v.setStart(o.node,o.offset),S.removeAllRanges(),B>ol?(S.addRange(v),S.extend(d.node,d.offset)):(v.setEnd(d.node,d.offset),S.addRange(v))}}}}for(T=[],S=i;S=S.parentNode;)S.nodeType===1&&T.push({element:S,left:S.scrollLeft,top:S.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;ia?32:a,b.T=null,a=Xi,Xi=null;var n=Aa,c=ua;if(Cl=0,je=Aa=null,ua=0,(nl&6)!==0)throw Error(r(331));var i=nl;if(nl|=4,rh(n.current),mh(n,n.current,c,a),nl=i,Au(0,!1),ot&&typeof ot.onPostCommitFiberRoot=="function")try{ot.onPostCommitFiberRoot(Ze,n)}catch{}return!0}finally{_.p=u,b.T=e,Rh(l,t)}}function qh(l,t,a){t=_t(a,t),t=Ei(l.stateNode,t,2),l=ga(l,t,2),l!==null&&(Ve(l,2),Qt(l))}function fl(l,t,a){if(l.tag===3)qh(l,l,a);else for(;t!==null;){if(t.tag===3){qh(t,l,a);break}else if(t.tag===1){var e=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof e.componentDidCatch=="function"&&(pa===null||!pa.has(e))){l=_t(a,l),a=Bd(2),e=ga(t,a,2),e!==null&&(Yd(a,e,t,l),Ve(e,2),Qt(e));break}}t=t.return}}function Ki(l,t,a){var e=l.pingCache;if(e===null){e=l.pingCache=new om;var u=new Set;e.set(t,u)}else u=e.get(t),u===void 0&&(u=new Set,e.set(t,u));u.has(a)||(Bi=!0,u.add(a),l=gm.bind(null,l,t,a),t.then(l,l))}function gm(l,t,a){var e=l.pingCache;e!==null&&e.delete(t),l.pingedLanes|=l.suspendedLanes&a,l.warmLanes&=~a,vl===l&&(F&a)===a&&(Ol===4||Ol===3&&(F&62914560)===F&&300>Pl()-jn?(nl&2)===0&&Ue(l,0):Yi|=a,De===F&&(De=0)),Qt(l)}function Bh(l,t){t===0&&(t=Uf()),l=Ga(l,t),l!==null&&(Ve(l,t),Qt(l))}function Sm(l){var t=l.memoizedState,a=0;t!==null&&(a=t.retryLane),Bh(l,a)}function bm(l,t){var a=0;switch(l.tag){case 31:case 13:var e=l.stateNode,u=l.memoizedState;u!==null&&(a=u.retryLane);break;case 19:e=l.stateNode;break;case 22:e=l.stateNode._retryCache;break;default:throw Error(r(314))}e!==null&&e.delete(t),Bh(l,a)}function Em(l,t){return U(l,t)}var Bn=null,He=null,Ji=!1,Yn=!1,wi=!1,_a=0;function Qt(l){l!==He&&l.next===null&&(He===null?Bn=He=l:He=He.next=l),Yn=!0,Ji||(Ji=!0,Tm())}function Au(l,t){if(!wi&&Yn){wi=!0;do for(var a=!1,e=Bn;e!==null;){if(l!==0){var u=e.pendingLanes;if(u===0)var n=0;else{var c=e.suspendedLanes,i=e.pingedLanes;n=(1<<31-mt(42|l)+1)-1,n&=u&~(c&~i),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(a=!0,Xh(e,n))}else n=F,n=Xu(e,e===vl?n:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),(n&3)===0||Le(e,n)||(a=!0,Xh(e,n));e=e.next}while(a);wi=!1}}function zm(){Yh()}function Yh(){Yn=Ji=!1;var l=0;_a!==0&&xm()&&(l=_a);for(var t=Pl(),a=null,e=Bn;e!==null;){var u=e.next,n=Gh(e,t);n===0?(e.next=null,a===null?Bn=u:a.next=u,u===null&&(He=a)):(a=e,(l!==0||(n&3)!==0)&&(Yn=!0)),e=u}Cl!==0&&Cl!==5||Au(l),_a!==0&&(_a=0)}function Gh(l,t){for(var a=l.suspendedLanes,e=l.pingedLanes,u=l.expirationTimes,n=l.pendingLanes&-62914561;0i)break;var E=f.transferSize,T=f.initiatorType;E&&Wh(T)&&(f=f.responseEnd,c+=E*(f"u"?null:document;function io(l,t,a){var e=Re;if(e&&typeof t=="string"&&t){var u=At(t);u='link[rel="'+l+'"][href="'+u+'"]',typeof a=="string"&&(u+='[crossorigin="'+a+'"]'),co.has(u)||(co.add(u),l={rel:l,crossOrigin:a,href:t},e.querySelector(u)===null&&(t=e.createElement("link"),wl(t,"link",l),Gl(t),e.head.appendChild(t)))}}function Xm(l){na.D(l),io("dns-prefetch",l,null)}function Zm(l,t){na.C(l,t),io("preconnect",l,t)}function Lm(l,t,a){na.L(l,t,a);var e=Re;if(e&&l&&t){var u='link[rel="preload"][as="'+At(t)+'"]';t==="image"&&a&&a.imageSrcSet?(u+='[imagesrcset="'+At(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(u+='[imagesizes="'+At(a.imageSizes)+'"]')):u+='[href="'+At(l)+'"]';var n=u;switch(t){case"style":n=Ce(l);break;case"script":n=qe(l)}xt.has(n)||(l=Y({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:l,as:t},a),xt.set(n,l),e.querySelector(u)!==null||t==="style"&&e.querySelector(Nu(n))||t==="script"&&e.querySelector(Du(n))||(t=e.createElement("link"),wl(t,"link",l),Gl(t),e.head.appendChild(t)))}}function Vm(l,t){na.m(l,t);var a=Re;if(a&&l){var e=t&&typeof t.as=="string"?t.as:"script",u='link[rel="modulepreload"][as="'+At(e)+'"][href="'+At(l)+'"]',n=u;switch(e){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=qe(l)}if(!xt.has(n)&&(l=Y({rel:"modulepreload",href:l},t),xt.set(n,l),a.querySelector(u)===null)){switch(e){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Du(n)))return}e=a.createElement("link"),wl(e,"link",l),Gl(e),a.head.appendChild(e)}}}function Km(l,t,a){na.S(l,t,a);var e=Re;if(e&&l){var u=ee(e).hoistableStyles,n=Ce(l);t=t||"default";var c=u.get(n);if(!c){var i={loading:0,preload:null};if(c=e.querySelector(Nu(n)))i.loading=5;else{l=Y({rel:"stylesheet",href:l,"data-precedence":t},a),(a=xt.get(n))&&df(l,a);var f=c=e.createElement("link");Gl(f),wl(f,"link",l),f._p=new Promise(function(y,E){f.onload=y,f.onerror=E}),f.addEventListener("load",function(){i.loading|=1}),f.addEventListener("error",function(){i.loading|=2}),i.loading|=4,Ln(c,t,e)}c={type:"stylesheet",instance:c,count:1,state:i},u.set(n,c)}}}function Jm(l,t){na.X(l,t);var a=Re;if(a&&l){var e=ee(a).hoistableScripts,u=qe(l),n=e.get(u);n||(n=a.querySelector(Du(u)),n||(l=Y({src:l,async:!0},t),(t=xt.get(u))&&hf(l,t),n=a.createElement("script"),Gl(n),wl(n,"link",l),a.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},e.set(u,n))}}function wm(l,t){na.M(l,t);var a=Re;if(a&&l){var e=ee(a).hoistableScripts,u=qe(l),n=e.get(u);n||(n=a.querySelector(Du(u)),n||(l=Y({src:l,async:!0,type:"module"},t),(t=xt.get(u))&&hf(l,t),n=a.createElement("script"),Gl(n),wl(n,"link",l),a.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},e.set(u,n))}}function fo(l,t,a,e){var u=(u=Z.current)?Zn(u):null;if(!u)throw Error(r(446));switch(l){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Ce(a.href),a=ee(u).hoistableStyles,e=a.get(t),e||(e={type:"style",instance:null,count:0,state:null},a.set(t,e)),e):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){l=Ce(a.href);var n=ee(u).hoistableStyles,c=n.get(l);if(c||(u=u.ownerDocument||u,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,c),(n=u.querySelector(Nu(l)))&&!n._p&&(c.instance=n,c.state.loading=5),xt.has(l)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},xt.set(l,a),n||$m(u,l,a,c.state))),t&&e===null)throw Error(r(528,""));return c}if(t&&e!==null)throw Error(r(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=qe(a),a=ee(u).hoistableScripts,e=a.get(t),e||(e={type:"script",instance:null,count:0,state:null},a.set(t,e)),e):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,l))}}function Ce(l){return'href="'+At(l)+'"'}function Nu(l){return'link[rel="stylesheet"]['+l+"]"}function so(l){return Y({},l,{"data-precedence":l.precedence,precedence:null})}function $m(l,t,a,e){l.querySelector('link[rel="preload"][as="style"]['+t+"]")?e.loading=1:(t=l.createElement("link"),e.preload=t,t.addEventListener("load",function(){return e.loading|=1}),t.addEventListener("error",function(){return e.loading|=2}),wl(t,"link",a),Gl(t),l.head.appendChild(t))}function qe(l){return'[src="'+At(l)+'"]'}function Du(l){return"script[async]"+l}function ho(l,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var e=l.querySelector('style[data-href~="'+At(a.href)+'"]');if(e)return t.instance=e,Gl(e),e;var u=Y({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return e=(l.ownerDocument||l).createElement("style"),Gl(e),wl(e,"style",u),Ln(e,a.precedence,l),t.instance=e;case"stylesheet":u=Ce(a.href);var n=l.querySelector(Nu(u));if(n)return t.state.loading|=4,t.instance=n,Gl(n),n;e=so(a),(u=xt.get(u))&&df(e,u),n=(l.ownerDocument||l).createElement("link"),Gl(n);var c=n;return c._p=new Promise(function(i,f){c.onload=i,c.onerror=f}),wl(n,"link",e),t.state.loading|=4,Ln(n,a.precedence,l),t.instance=n;case"script":return n=qe(a.src),(u=l.querySelector(Du(n)))?(t.instance=u,Gl(u),u):(e=a,(u=xt.get(n))&&(e=Y({},a),hf(e,u)),l=l.ownerDocument||l,u=l.createElement("script"),Gl(u),wl(u,"link",e),l.head.appendChild(u),t.instance=u);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(e=t.instance,t.state.loading|=4,Ln(e,a.precedence,l));return t.instance}function Ln(l,t,a){for(var e=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=e.length?e[e.length-1]:null,n=u,c=0;c title"):null)}function Wm(l,t,a){if(a===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return l=t.disabled,typeof t.precedence=="string"&&l==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function vo(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function km(l,t,a,e){if(a.type==="stylesheet"&&(typeof e.media!="string"||matchMedia(e.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var u=Ce(e.href),n=t.querySelector(Nu(u));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=Kn.bind(l),t.then(l,l)),a.state.loading|=4,a.instance=n,Gl(n);return}n=t.ownerDocument||t,e=so(e),(u=xt.get(u))&&df(e,u),n=n.createElement("link"),Gl(n);var c=n;c._p=new Promise(function(i,f){c.onload=i,c.onerror=f}),wl(n,"link",e),a.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(l.count++,a=Kn.bind(l),t.addEventListener("load",a),t.addEventListener("error",a))}}var of=0;function Fm(l,t){return l.stylesheets&&l.count===0&&wn(l,l.stylesheets),0of?50:800)+t);return l.unsuspend=a,function(){l.unsuspend=null,clearTimeout(e),clearTimeout(u)}}:null}function Kn(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)wn(this,this.stylesheets);else if(this.unsuspend){var l=this.unsuspend;this.unsuspend=null,l()}}}var Jn=null;function wn(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,Jn=new Map,t.forEach(Im,l),Jn=null,Kn.call(l))}function Im(l,t){if(!(t.state.loading&4)){var a=Jn.get(l);if(a)var e=a.get(null);else{a=new Map,Jn.set(l,a);for(var u=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(A)}catch(H){console.error(H)}}return A(),zf.exports=vv(),zf.exports}var rv=yv();const gv=Go(rv),Xo="";async function Ha(A,H={}){const Q=await fetch(`${Xo}${A}`,{headers:{"Content-Type":"application/json",...H.headers||{}},...H}),r=await Q.json().catch(()=>({}));if(!Q.ok)throw new Error(r.message||r.reason||"Request failed");return r}function jl(A){return A!==null&&typeof A=="object"&&!Array.isArray(A)?A:{}}function ca(A){return Array.isArray(A)?A:[]}function sl(A,H=0){const Q=Number(A);return Number.isFinite(Q)?Q:H}function N(A,H=""){if(A==null)return H;if(typeof A=="string")return A;if(typeof A=="number"||typeof A=="boolean")return String(A);if(jl(A)){for(const Q of["summary","message","reason","workflow","mode","status","name","id"]){const r=A[Q];if(typeof r=="string"||typeof r=="number"||typeof r=="boolean")return String(r)}try{return JSON.stringify(A)}catch{return H}}return H}function Yo(A){return`${sl(A).toFixed(1)}%`}function Sv(A,H=0){return sl(A).toFixed(H)}function Of(A){const H=sl(A);return H>=85?"danger":H>=60?"warning":""}function bv(A,H){switch(H.type){case"append":return[...A,`[${new Date().toLocaleTimeString("zh-CN",{hour12:!1})}] ${H.line}`].slice(-120);case"clear":return[];default:return A}}function Ev(){var qu,Xe;const[A,H]=pl.useState(null),[Q,r]=pl.useState(null),[G,$]=pl.useState(""),[zl,Xl]=pl.useReducer(bv,["[aluer] nebula console booted"]),[R,O]=pl.useState("connecting"),[w,Y]=pl.useState(null),[ml,tt]=pl.useState(""),[ql,Bl]=pl.useState(""),[ut,at]=pl.useState(!0),[zt,Yl]=pl.useState(6),[$l,Tt]=pl.useState(!1),[yl,V]=pl.useState({alias:"",host:"",port:"22",username:"",password:"",privateKeyPath:""}),Wl=pl.useDeferredValue(ml),ll=s=>Xl({type:"append",line:s}),kl=pl.useEffectEvent(async(s="manual")=>{try{const U=jl(await Ha("/api/console/overview"));pl.startTransition(()=>H(U)),s!=="stream"&&ll(`overview refreshed (${s})`)}catch(U){ll(`refresh failed: ${U.message}`)}}),Fl=pl.useEffectEvent(async()=>{try{const s=jl(await Ha("/api/health"));pl.startTransition(()=>r(s))}catch{}});pl.useEffect(()=>{kl("boot"),Fl()},[kl,Fl]),pl.useEffect(()=>{if(!ut)return;const s=setInterval(()=>{kl("poll"),Fl()},zt*1e3);return()=>clearInterval(s)},[ut,zt,kl,Fl]),pl.useEffect(()=>{if(typeof window>"u"||typeof window.EventSource!="function"){O("degraded");return}const s=new EventSource(`${Xo}/api/console/stream/overview`);return s.addEventListener("overview",U=>{try{const Ml=jl(JSON.parse(U.data));pl.startTransition(()=>H(Ml)),O("live")}catch{O("degraded")}}),s.onerror=()=>O("degraded"),()=>s.close()},[]),pl.useEffect(()=>{var U,Ml;const s=ca((U=A==null?void 0:A.ssh)==null?void 0:U.sessions);if(!s.length){$("");return}(!G||!s.some(Zl=>N(Zl==null?void 0:Zl.sessionId)===G))&&$(N((Ml=s[0])==null?void 0:Ml.sessionId))},[A,G]);const Tl=jl(A),qt=jl(Q),Il=jl(Tl.server),_l=jl(Il.metrics),b=jl(Tl.defense),_=jl(b.shield),q=jl(b.sovereign),ul=jl(b.network),cl=jl(Tl.ssh),h=jl(Tl.kernel),p=ca(Tl.modules),M=jl(Tl.audit),D=ca(cl.sessions),X=jl(cl.engineHandshake),Z=D.find(s=>N(s==null?void 0:s.sessionId)===G),tl=jl(qt.components),Sl=jl(qt.system),bl=[...ca(M.events).map(s=>({id:`${N(s==null?void 0:s.category,"event")}-${N(s==null?void 0:s.action,"action")}-${N(s==null?void 0:s.timestamp,Date.now())}`,title:`${N(s==null?void 0:s.category,"EVENT")} / ${N(s==null?void 0:s.action,"ACTION")}`,details:`${N(s==null?void 0:s.player,"system")} | ${N(s==null?void 0:s.details,"")}`,score:N(s==null?void 0:s.category).includes("ALERT")?90:45})),...ca(M.networkIncidents).map((s,U)=>({id:`${N(s==null?void 0:s.type,"incident")}-${N(s==null?void 0:s.ip,"unknown")}-${U}`,title:`${N(s==null?void 0:s.type,"incident")} / ${N(s==null?void 0:s.ip,"unknown")}`,details:N((s==null?void 0:s.details)||(s==null?void 0:s.summary),"network anomaly"),score:sl(s==null?void 0:s.riskScore,70)})),...ca(M.shieldTransitions).map((s,U)=>({id:`${N(s==null?void 0:s.mode,"shield")}-${N(s==null?void 0:s.timestamp,Date.now())}-${U}`,title:`SHIELD / ${N(s==null?void 0:s.mode,"TRANSITION")}`,details:`${N(s==null?void 0:s.reason,"policy update")} | risk ${N(s==null?void 0:s.riskScore,80)}`,score:sl(s==null?void 0:s.riskScore,80)}))],ia=Wl.trim().toLowerCase(),Ia=ia?bl.filter(s=>`${s.title} ${s.details}`.toLowerCase().includes(ia)).slice(0,24):bl.slice(0,24);async function Ye(s){try{const U=await Ha("/api/console/shield/engage",{method:"POST",body:JSON.stringify({mode:s,reason:`react-console-${s.toLowerCase()}`})});ll(`shield engaged: ${N(U.mode,"unknown")}`),N(U.deterrenceMessage)&&ll(U.deterrenceMessage),kl("shield")}catch(U){ll(`shield error: ${U.message}`)}}async function Pa(s){try{const U=await Ha("/api/console/quick-action",{method:"POST",body:JSON.stringify({action:s,reason:`react-console-${s}`})});ll(`quick action ok: ${s}`),N(U.mode)&&ll(`mode ${N(U.mode)}`),kl(s)}catch(U){ll(`quick action failed: ${U.message}`)}}async function Xt(s){s.preventDefault();try{const U=await Ha("/api/console/ssh/handshake",{method:"POST",body:JSON.stringify({host:yl.host,port:Number(yl.port||22),username:yl.username,purpose:"react-console-connect"})}),Ml=jl(U.handshake);if(Y(Ml),ll(`handshake ${Ml.approved?"approved":"denied"} | mode=${N(Ml.shieldMode,"unknown")} heat=${sl(Ml.kernelHeat)} risk=${sl(Ml.riskScore)}`),ll(N(Ml.message,"handshake completed")),!Ml.approved)return;const Zl={...yl,port:Number(yl.port||22),handshakeToken:Ml.token},uc=await Ha("/api/console/ssh/connect",{method:"POST",body:JSON.stringify(Zl)}),Pl=jl(uc.session);ll(`ssh connected: ${N(Pl.alias,"remote-session")}`),$(N(Pl.sessionId)),V(nc=>({...nc,password:""})),kl("ssh-connect")}catch(U){ll(`ssh connect failed: ${U.message}`)}}async function Ge(s){if(s.preventDefault(),!G||!ql.trim()){ll("select a session and enter a command first");return}const U=ql.trim();Bl(""),ll(`${(Z==null?void 0:Z.alias)||"session"} $ ${U}`);try{const Ml=await Ha("/api/console/ssh/execute",{method:"POST",body:JSON.stringify({sessionId:G,command:U})}),Zl=jl(Ml.result);Zl.flagged&&ll(`guard: ${N(Zl.guardType,"unknown")} severity=${sl(Zl.guardSeverity)}`),N(Zl.stdout)&&ll(Zl.stdout),N(Zl.stderr)&&ll(`stderr: ${N(Zl.stderr)}`),ll(`exit=${sl(Zl.exitStatus)} in ${sl(Zl.durationMs)}ms`)}catch(Ml){ll(`ssh execute failed: ${Ml.message}`)}}async function Qe(s){try{await Ha(`/api/console/ssh/${s}`,{method:"DELETE"}),ll(`ssh disconnected: ${N(s).slice(0,8)}`),kl("ssh-disconnect")}catch(U){ll(`disconnect failed: ${U.message}`)}}return m.jsxs("div",{className:"nebula-app",children:[m.jsx("div",{className:"ambient ambient-a"}),m.jsx("div",{className:"ambient ambient-b"}),m.jsx("div",{className:"ambient ambient-c"}),m.jsx("div",{className:"mesh"}),m.jsxs("aside",{className:"command-rail glass-panel",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"ALUER FABRIC"}),m.jsx("h1",{children:N(Tl.title,"Aluer Nebula Console")}),m.jsx("p",{className:"muted",children:N(Tl.subtitle,"PaperMC defense, recovery, and remote operations fabric")})]}),m.jsxs("div",{className:"stream-badge",children:[m.jsx("span",{className:`stream-dot ${R}`}),m.jsx("strong",{children:R==="live"?"Live Stream":"Polling Fallback"})]}),m.jsxs("div",{className:"refresh-controls",children:[m.jsxs("label",{className:"toggle-label",children:[m.jsx("input",{type:"checkbox",checked:ut,onChange:s=>at(s.target.checked)}),m.jsx("span",{children:"Auto-refresh"})]}),m.jsxs("select",{className:"interval-select",value:zt,onChange:s=>Yl(Number(s.target.value)),disabled:!ut,children:[m.jsx("option",{value:3,children:"3s"}),m.jsx("option",{value:6,children:"6s"}),m.jsx("option",{value:10,children:"10s"}),m.jsx("option",{value:30,children:"30s"})]})]}),m.jsxs("div",{className:"rail-actions",children:[m.jsx("button",{className:"primary",type:"button",onClick:()=>kl("manual"),children:"刷新总览"}),m.jsx("button",{className:"ghost",type:"button",onClick:()=>{Tt(!$l),Fl()},children:$l?"隐藏健康检查":"系统健康检查"}),m.jsx("button",{className:"ghost",type:"button",onClick:()=>Pa("backup-now"),children:"立即备份"}),m.jsx("button",{className:"ghost",type:"button",onClick:()=>Pa("shield-mirage"),children:"进入 Mirage"}),m.jsx("button",{className:"ghost danger",type:"button",onClick:()=>Pa("shield-shelter"),children:"进入 Shelter"})]}),m.jsxs("div",{className:"rail-metric-stack",children:[m.jsx(tc,{label:"TPS",value:Sv(_l.tps,1),accent:"mint"}),m.jsx(tc,{label:"CPU",value:Yo(_l.cpuUsage),accent:"sky"}),m.jsx(tc,{label:"Memory",value:Yo(_l.memoryUsage),accent:"sun"}),m.jsx(tc,{label:"Threat",value:_.riskScore||0,accent:"rose"})]}),$l&&m.jsxs("div",{className:"health-panel",children:[m.jsx("p",{className:"eyebrow",children:"SYSTEM HEALTH"}),m.jsx("div",{className:"health-grid",children:Object.entries(tl).map(([s,U])=>m.jsxs("div",{className:`health-chip ${N(U==null?void 0:U.status).includes("UP")||N(U==null?void 0:U.status).includes("ENABLED")?"up":"down"}`,children:[m.jsx("span",{className:"health-dot"}),m.jsx("span",{children:N(U==null?void 0:U.status)})]},s))}),(Sl==null?void 0:Sl.uptimeSeconds)&&m.jsxs("p",{className:"muted",style:{fontSize:"0.78rem",marginTop:10},children:["Uptime: ",Math.floor(sl(Sl.uptimeSeconds)/3600),"h ",Math.floor(sl(Sl.uptimeSeconds)%3600/60),"m"," · ","Heap: ",sl(Sl.heapUsedMB),"/",sl(Sl.heapMaxMB)," MB"," · ","Load: ",N(Sl.processCpuLoad,"0"),"%"]})]})]}),m.jsxs("main",{className:"main-grid",children:[m.jsxs("section",{className:"hero-panel glass-panel",children:[m.jsxs("div",{className:"hero-copy",children:[m.jsx("p",{className:"eyebrow",children:"MIRAGE SHIELD"}),m.jsx("h2",{children:N(_.currentMode,"OBSERVE")}),m.jsx("p",{children:N(_.deterrenceMessage,"Deterrence message pending.")}),m.jsxs("div",{className:"hero-pills",children:[m.jsx(ac,{label:"Workflow",value:N(_.recommendedMode,"OBSERVE")}),m.jsx(ac,{label:"Directive",value:N((qu=q.kernelDirective)==null?void 0:qu.workflow,"MONITOR_ONLY")}),m.jsx(ac,{label:"Handshake",value:X.required?"Required":"Optional"}),m.jsx(ac,{label:"Queue",value:N((Xe=h.taskBus)==null?void 0:Xe.queuedTasks,0)})]})]}),m.jsxs("div",{className:"hero-side",children:[m.jsxs("div",{className:"hero-meters",children:[m.jsx(_f,{label:"Risk Score",value:sl(_.riskScore)}),m.jsx(_f,{label:"Kernel Heat",value:sl(_.kernelHeat||q.kernelHeat)}),m.jsx(_f,{label:"Resonance",value:sl(_.kernelResonance)})]}),m.jsx("div",{className:"shield-actions",children:["FORTIFY","MIRAGE","SHELTER","RECOVERY"].map(s=>m.jsx("button",{type:"button",className:s==="SHELTER"?"primary danger":"primary",onClick:()=>Ye(s),children:s},s))})]})]}),m.jsxs("section",{className:"glass-panel spark-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"PERFORMANCE TREND"}),m.jsx("h3",{children:"实时性能走势"})]}),m.jsx("span",{className:"chip",children:Il.processRunning?"online":"offline"})]}),m.jsxs("div",{className:"spark-grid",children:[m.jsx(ec,{label:"TPS",value:sl(_l.tps),max:20,accent:"var(--mint)"}),m.jsx(ec,{label:"CPU",value:sl(_l.cpuUsage),max:100,accent:"var(--sky)"}),m.jsx(ec,{label:"Memory",value:sl(_l.memoryUsage),max:100,accent:"var(--sun)"}),m.jsx(ec,{label:"Players",value:sl(_l.onlinePlayers),max:50,accent:"var(--rose)"})]})]}),m.jsxs("section",{className:"glass-panel module-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"MODULE CONSTELLATION"}),m.jsx("h3",{children:"互联能力矩阵"})]}),m.jsxs("span",{className:"chip",children:["nodes ",D.length+1]})]}),m.jsx("div",{className:"module-grid",children:p.map(s=>m.jsxs("article",{className:`module-card ${Of(s==null?void 0:s.signal)}`,children:[m.jsx("span",{className:"module-id",children:N(s==null?void 0:s.id,"module")}),m.jsx("h4",{children:N(s==null?void 0:s.name,"Unnamed Module")}),m.jsx("p",{children:N(s==null?void 0:s.summary,"No summary available.")}),m.jsxs("div",{className:"module-foot",children:[m.jsx("strong",{children:N(s==null?void 0:s.status,"UNKNOWN")}),m.jsxs("span",{children:["signal ",sl(s==null?void 0:s.signal)]})]})]},N(s==null?void 0:s.id,Math.random())))})]}),m.jsxs("section",{className:"glass-panel node-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"NODE FABRIC"}),m.jsx("h3",{children:"本地核心与远程节点"})]}),m.jsx("span",{className:"chip",children:Il.processRunning?"local-online":"local-degraded"})]}),m.jsxs("div",{className:"node-grid",children:[m.jsxs("article",{className:"node-card local",children:[m.jsxs("strong",{children:["local / ",N(Il.serviceName,"minecraft")]}),m.jsx("p",{children:N(Il.workingDir,"/opt/minecraft")}),m.jsxs("div",{className:"node-stats",children:[m.jsxs("span",{children:["RCON ",Il.rconConnected?"online":"offline"]}),m.jsxs("span",{children:["Players ",sl(_l.onlinePlayers)]}),m.jsxs("span",{children:["Conn ",sl(_l.connections)]})]})]}),D.map(s=>m.jsxs("article",{className:`node-card remote ${N(s==null?void 0:s.sessionId)===G?"selected":""}`,onClick:()=>$(N(s==null?void 0:s.sessionId)),children:[m.jsx("strong",{children:N(s==null?void 0:s.alias,"remote-session")}),m.jsxs("p",{children:[N(s==null?void 0:s.username,"user"),"@",N(s==null?void 0:s.host,"host"),":",N(s==null?void 0:s.port,22)]}),m.jsxs("div",{className:"node-stats",children:[m.jsx("span",{children:N(s==null?void 0:s.fingerprint,"no fingerprint")}),m.jsx("button",{type:"button",className:"text-button",onClick:U=>{U.stopPropagation(),Qe(N(s==null?void 0:s.sessionId))},children:"断开"})]})]},N(s==null?void 0:s.sessionId,`${N(s==null?void 0:s.alias,"session")}-${N(s==null?void 0:s.host,"unknown")}`)))]})]}),m.jsxs("section",{className:"glass-panel ssh-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"REMOTE SSH WORKBENCH"}),m.jsx("h3",{children:"远程控制台"})]}),m.jsx("span",{className:"chip",children:(Z==null?void 0:Z.alias)||"no session"})]}),m.jsxs("div",{className:`handshake-banner ${w!=null&&w.approved?"approved":w?"denied":""}`,children:[m.jsx("strong",{children:"Sovereign Handshake"}),m.jsx("span",{children:w?`${w.approved?"approved":"denied"} | ${N(w.shieldMode,"unknown")} | heat ${sl(w.kernelHeat)} | risk ${sl(w.riskScore)}`:`required=${X.required?"yes":"no"} | ttl ${sl(X.ttlSeconds)}s`})]}),m.jsxs("form",{className:"connect-form",onSubmit:Xt,children:[m.jsx("input",{placeholder:"别名",value:yl.alias,onChange:s=>V(U=>({...U,alias:s.target.value}))}),m.jsx("input",{placeholder:"主机",required:!0,value:yl.host,onChange:s=>V(U=>({...U,host:s.target.value}))}),m.jsx("input",{placeholder:"端口",value:yl.port,onChange:s=>V(U=>({...U,port:s.target.value}))}),m.jsx("input",{placeholder:"用户",required:!0,value:yl.username,onChange:s=>V(U=>({...U,username:s.target.value}))}),m.jsx("input",{placeholder:"密码",type:"password",value:yl.password,onChange:s=>V(U=>({...U,password:s.target.value}))}),m.jsx("input",{placeholder:"私钥路径",value:yl.privateKeyPath,onChange:s=>V(U=>({...U,privateKeyPath:s.target.value}))}),m.jsx("button",{className:"primary",type:"submit",children:"连接节点"})]}),m.jsxs("form",{className:"command-form",onSubmit:Ge,children:[m.jsx("input",{placeholder:"输入远程命令,例如 journalctl -u minecraft -n 50",value:ql,onChange:s=>Bl(s.target.value)}),m.jsx("button",{className:"ghost",type:"submit",children:"执行"})]}),m.jsx("pre",{className:"terminal-surface",children:zl.join(` +`)})]}),m.jsxs("section",{className:"glass-panel threat-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"THREAT TRACE"}),m.jsx("h3",{children:"高风险来源与威慑"})]}),m.jsxs("span",{className:"chip",children:["critical ",sl(ul.criticalRiskIPs)]})]}),m.jsx("div",{className:"feed-stack",children:(ca(_.topOffenders).length?ca(_.topOffenders):ca(ul.topRiskIPs)).slice(0,10).map((s,U)=>m.jsxs("article",{className:`feed-card ${Of(s==null?void 0:s.riskScore)}`,children:[m.jsx("strong",{children:N(s==null?void 0:s.ip,"unknown")}),m.jsxs("p",{children:[N(s==null?void 0:s.riskLevel,"risk")," | score ",sl(s==null?void 0:s.riskScore)]}),m.jsx("p",{children:N((s==null?void 0:s.summary)||(s==null?void 0:s.reason),"suspicious pressure source")})]},`${N(s==null?void 0:s.ip,"unknown")}-${U}`))})]}),m.jsxs("section",{className:"glass-panel audit-panel",children:[m.jsxs("div",{className:"section-head",children:[m.jsxs("div",{children:[m.jsx("p",{className:"eyebrow",children:"AUDIT STREAM"}),m.jsx("h3",{children:"审计与网络事件"})]}),m.jsx("input",{className:"filter-input",placeholder:"筛选 audit / ip / workflow",value:ml,onChange:s=>tt(s.target.value)})]}),m.jsx("div",{className:"feed-stack",children:Ia.map(s=>m.jsxs("article",{className:`feed-card ${Of(s.score)}`,children:[m.jsx("strong",{children:s.title}),m.jsx("p",{children:s.details})]},s.id))})]})]})]})}function tc({label:A,value:H,accent:Q}){return m.jsxs("article",{className:`metric-card ${Q}`,children:[m.jsx("span",{children:N(A)}),m.jsx("strong",{children:N(H,"0")})]})}function _f({label:A,value:H}){const Q=Math.max(0,Math.min(100,Number(H)||0));return m.jsxs("div",{className:"progress-meter",children:[m.jsxs("div",{className:"meter-head",children:[m.jsx("span",{children:A}),m.jsx("strong",{children:Q})]}),m.jsx("div",{className:"meter-track",children:m.jsx("span",{style:{width:`${Q}%`}})})]})}function ac({label:A,value:H}){return m.jsxs("div",{className:"info-pill",children:[m.jsx("span",{children:N(A)}),m.jsx("strong",{children:N(H,"-")})]})}function ec({label:A,value:H,max:Q,accent:r}){const G=Math.min(100,Math.max(0,(Number(H)||0)/(Q||1)*100)),$=G>80?"danger":G>60?"warning":"";return m.jsxs("div",{className:`spark-bar ${$}`,children:[m.jsxs("div",{className:"spark-head",children:[m.jsx("span",{children:A}),m.jsx("strong",{children:N(H,"0")})]}),m.jsx("div",{className:"spark-track",children:m.jsx("span",{style:{width:`${G}%`,background:r}})})]})}class zv extends Qo.Component{constructor(H){super(H),this.state={error:null}}static getDerivedStateFromError(H){return{error:H}}componentDidCatch(H,Q){console.error("Aluer Nebula Console crashed",H,Q)}render(){var H;return this.state.error?m.jsx("div",{className:"fatal-shell",children:m.jsxs("div",{className:"fatal-card",children:[m.jsx("p",{className:"eyebrow",children:"ALUER UI RECOVERY"}),m.jsx("h1",{children:"界面加载失败"}),m.jsx("p",{children:"前端捕获到了运行时错误,但主程序仍可能正常运行。请刷新页面,或替换为最新构建包。"}),m.jsx("pre",{children:String(((H=this.state.error)==null?void 0:H.message)||this.state.error)})]})}):this.props.children}}gv.createRoot(document.getElementById("root")).render(m.jsx(Qo.StrictMode,{children:m.jsx(zv,{children:m.jsx(Ev,{})})})); diff --git a/src/main/resources/static/nebula-assets/index-U0uziwCJ.css b/src/main/resources/static/nebula-assets/index-U0uziwCJ.css new file mode 100644 index 0000000..3f721f3 --- /dev/null +++ b/src/main/resources/static/nebula-assets/index-U0uziwCJ.css @@ -0,0 +1 @@ +:root{--bg: #06111e;--text: #ecf7ff;--muted: #8fa7c2;--border: rgba(196, 225, 255, .12);--glass: rgba(9, 21, 37, .68);--shadow: 0 28px 72px rgba(1, 7, 16, .42);--mint: #63e7c2;--sky: #60cbff;--sun: #ffc86b;--rose: #ff7f96}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;font-family:Avenir Next,SF Pro Display,Segoe UI Variable,PingFang SC,Microsoft YaHei,sans-serif;color:var(--text);background:radial-gradient(circle at top left,rgba(68,139,255,.28),transparent 34%),radial-gradient(circle at 80% 20%,rgba(56,217,183,.18),transparent 26%),linear-gradient(160deg,#050d18,#081420 48%,#040914);overflow-x:hidden}body::selection{background:#60cbff4d}::-webkit-scrollbar{width:11px;height:11px}::-webkit-scrollbar-thumb{background:#82a3c45c;border-radius:999px;border:2px solid rgba(4,9,20,.4)}::-webkit-scrollbar-track{background:#ffffff08}button,input,select{font:inherit}.nebula-app{position:relative;min-height:100vh;display:grid;grid-template-columns:320px 1fr;gap:20px;padding:20px}.ambient,.mesh{position:fixed;pointer-events:none}.ambient{width:360px;height:360px;border-radius:50%;filter:blur(26px);opacity:.42;animation:drift 18s ease-in-out infinite}.ambient-a{top:28px;left:4%;background:radial-gradient(circle,rgba(82,143,255,.56),transparent 70%)}.ambient-b{right:10%;bottom:2%;background:radial-gradient(circle,rgba(88,229,202,.32),transparent 70%);animation-delay:-6s}.ambient-c{top:40%;left:50%;background:radial-gradient(circle,rgba(255,200,107,.18),transparent 60%);animation-delay:-12s;width:280px;height:280px}.mesh{top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px);background-size:32px 32px;-webkit-mask-image:radial-gradient(circle at center,rgba(255,255,255,.75),transparent 82%);mask-image:radial-gradient(circle at center,rgba(255,255,255,.75),transparent 82%)}.glass-panel{position:relative;z-index:1;border-radius:30px;background:var(--glass);border:1px solid var(--border);backdrop-filter:blur(18px) saturate(145%);-webkit-backdrop-filter:blur(18px) saturate(145%);box-shadow:var(--shadow);overflow:hidden;transition:transform .24s ease,border-color .24s ease,box-shadow .24s ease}.glass-panel:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(135deg,rgba(255,255,255,.09),transparent 32%,transparent 65%,rgba(99,231,194,.05));pointer-events:none}.glass-panel:hover{transform:translateY(-2px);border-color:#63e7c22e;box-shadow:0 34px 82px #01071075}.command-rail{padding:24px;display:grid;align-content:start;gap:18px;position:sticky;top:20px;height:calc(100vh - 40px);overflow-y:auto}.command-rail h1,.main-grid h2,.main-grid h3,.module-card h4{margin:8px 0;letter-spacing:-.03em}.eyebrow,.module-id{color:var(--muted);text-transform:uppercase;letter-spacing:.18em;font-size:.76rem}.muted{color:var(--muted);line-height:1.5}.refresh-controls{display:flex;align-items:center;gap:14px;padding:12px 16px;border-radius:20px;border:1px solid rgba(255,255,255,.08);background:#ffffff0d}.toggle-label{display:flex;align-items:center;gap:10px;cursor:pointer;font-size:.88rem;color:#d6effd}.toggle-label input[type=checkbox]{width:auto;accent-color:var(--mint)}.interval-select{padding:6px 10px;border-radius:12px;border:1px solid rgba(255,255,255,.12);background:#ffffff14;color:var(--text);cursor:pointer;font-size:.84rem}.health-panel{padding:16px;border-radius:20px;border:1px solid rgba(99,231,194,.16);background:#63e7c20a}.health-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}.health-chip{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:14px;font-size:.8rem;border:1px solid rgba(255,255,255,.06);background:#ffffff0a}.health-chip.up{border-color:#63e7c23d}.health-chip.down{border-color:#ff7f963d}.health-dot{width:8px;height:8px;border-radius:50%}.health-chip.up .health-dot{background:var(--mint);box-shadow:0 0 10px #63e7c280}.health-chip.down .health-dot{background:var(--rose);box-shadow:0 0 10px #ff7f9680}.stream-badge,.chip,.metric-card,.module-card,.node-card,.feed-card,.terminal-surface{border:1px solid rgba(255,255,255,.08);background:#ffffff0d}.stream-badge{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:20px}.stream-dot{width:10px;height:10px;border-radius:50%;background:#9faec2;box-shadow:0 0 18px #9faec280}.stream-dot.live{background:var(--mint);box-shadow:0 0 22px #63e7c2c7}.stream-dot.degraded,.stream-dot.connecting{background:var(--sun);box-shadow:0 0 22px #ffc86bad}.rail-actions,.shield-actions{display:grid;gap:10px}.rail-metric-stack{display:grid;gap:12px}.metric-card{padding:16px;border-radius:22px}.metric-card span{display:block;color:var(--muted);font-size:.8rem}.metric-card strong{display:block;margin-top:10px;font-size:2rem}.metric-card.mint strong{color:var(--mint)}.metric-card.sky strong{color:var(--sky)}.metric-card.sun strong{color:var(--sun)}.metric-card.rose strong{color:var(--rose)}.main-grid{position:relative;z-index:1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.hero-panel,.spark-panel,.module-panel,.node-panel,.ssh-panel,.threat-panel,.audit-panel{padding:22px}.hero-panel{display:grid;grid-template-columns:1.15fr .85fr;gap:24px;min-height:320px}.hero-panel:after{content:"";position:absolute;right:-60px;top:-50px;width:240px;height:240px;background:radial-gradient(circle,rgba(99,231,194,.18),transparent 68%);pointer-events:none}.hero-copy{display:grid;align-content:start;gap:14px}.hero-copy p:last-child{color:#d8edff;margin:0;line-height:1.6}.hero-side{display:grid;align-content:space-between;gap:18px}.hero-pills{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.hero-meters,.feed-stack,.module-grid{display:grid;gap:14px}.spark-panel{grid-column:1 / -1}.spark-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.spark-bar{display:grid;gap:8px;padding:14px 16px;border-radius:20px;border:1px solid rgba(255,255,255,.06);background:#ffffff0a}.spark-bar.danger{border-color:#ff7f9638}.spark-bar.warning{border-color:#ffc86b38}.spark-head{display:flex;justify-content:space-between;align-items:center}.spark-head span{color:var(--muted);font-size:.82rem}.spark-head strong{font-size:1.4rem}.spark-track{height:6px;border-radius:999px;background:#ffffff0f;overflow:hidden}.spark-track span{display:block;height:100%;border-radius:inherit;transition:width .4s ease}.module-panel,.ssh-panel{grid-column:1 / -1}.section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:16px}.chip{display:inline-flex;align-items:center;padding:9px 12px;border-radius:999px;color:#d6effd;font-size:.84rem}.info-pill{padding:14px 16px;border-radius:18px;border:1px solid rgba(255,255,255,.08);background:#ffffff0d}.info-pill span{display:block;color:var(--muted);font-size:.78rem}.info-pill strong{display:block;margin-top:8px;font-size:1rem;color:#f2f9ff}.progress-meter{display:grid;gap:8px}.meter-head{display:flex;justify-content:space-between;align-items:center}.meter-head span{color:var(--muted)}.meter-track{height:10px;border-radius:999px;background:#ffffff14;overflow:hidden}.meter-track span{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#53bcff,#63e7c2 55%,#ffc86b);transition:width .36s ease}.primary,.ghost,.text-button{border:0;cursor:pointer;transition:transform .18s ease,background .18s ease,opacity .18s ease}.primary,.ghost{border-radius:16px;padding:12px 16px}.primary{background:linear-gradient(135deg,#36d8b0,#1da8f1);color:#031019;box-shadow:0 14px 28px #2da8f12e}.primary.danger{background:linear-gradient(135deg,#ff9d7e,#ff617f)}.ghost{background:#ffffff12;color:var(--text);border:1px solid rgba(255,255,255,.08)}.ghost.danger{border-color:#ff7f964d;color:#ffdce3}.text-button{background:transparent;color:var(--sky);padding:0}button:hover{transform:translateY(-1px)}.module-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.module-card,.node-card,.feed-card{border-radius:22px;padding:16px;transition:transform .18s ease,border-color .18s ease,background .18s ease}.module-card:hover,.node-card:hover,.feed-card:hover{transform:translateY(-1px)}.module-card p,.node-card p,.feed-card p{margin:6px 0 0;color:var(--muted);line-height:1.5}.module-card.warning,.node-card.selected,.feed-card.warning{border-color:#ffc86b47}.module-card.danger,.feed-card.danger{border-color:#ff7f9661}.module-foot,.node-stats{display:flex;justify-content:space-between;gap:12px;margin-top:14px;color:#d7ecfb;font-size:.86rem}.node-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}.node-card{cursor:pointer}.node-card.local{background:linear-gradient(135deg,#63e7c21f,#1f70ff14)}.node-card.selected{box-shadow:inset 0 0 0 1px #ffc86b2e}.connect-form,.command-form{display:grid;gap:10px}.handshake-banner{display:grid;gap:6px;margin-bottom:14px;padding:14px 16px;border-radius:18px;border:1px solid rgba(255,255,255,.08);background:#ffffff0d}.handshake-banner strong{font-size:.92rem}.handshake-banner span{color:var(--muted);font-size:.86rem}.handshake-banner.approved{border-color:#63e7c252}.handshake-banner.denied{border-color:#ff7f965c}.connect-form{grid-template-columns:repeat(7,minmax(0,1fr))}.command-form{grid-template-columns:1fr auto;margin-top:12px}input,select,textarea{width:100%;min-width:0;padding:12px 14px;color:var(--text);border-radius:15px;border:1px solid rgba(255,255,255,.08);background:#ffffff0f;outline:none}input:focus,select:focus{border-color:#60cbff6b;box-shadow:0 0 0 4px #60cbff14}.terminal-surface{margin-top:12px;min-height:320px;max-height:420px;overflow:auto;padding:18px;border-radius:24px;font-family:SF Mono,Cascadia Code,JetBrains Mono,monospace;font-size:.9rem;line-height:1.6;white-space:pre-wrap;background:linear-gradient(180deg,#030b14eb,#06121ee0),radial-gradient(circle at top right,rgba(96,203,255,.08),transparent 30%)}.filter-input{max-width:260px}@keyframes drift{0%,to{transform:translateZ(0)}50%{transform:translate3d(0,-18px,0) scale(1.04)}}@media(max-width:1220px){.nebula-app{grid-template-columns:1fr}.command-rail{order:2;position:static;height:auto}}@media(max-width:900px){.main-grid,.connect-form,.node-grid,.spark-grid,.hero-panel,.hero-pills{grid-template-columns:1fr}.section-head{flex-direction:column}.health-grid{grid-template-columns:1fr}}