:root{--bg-base:#0f1a24;--bg-gradient:radial-gradient(ellipse 80% 60% at 12% 18%, #38bdf847 0%, transparent 55%), radial-gradient(ellipse 70% 50% at 88% 12%, #a78bfa38 0%, transparent 50%), radial-gradient(ellipse 60% 55% at 72% 88%, #2dd4bf2e 0%, transparent 55%), radial-gradient(ellipse 50% 40% at 20% 85%, #fbbf2414 0%, transparent 50%), linear-gradient(165deg, #0c1520 0%, #132033 45%, #0e1c28 100%);--glass-fill:#ffffff14;--glass-fill-strong:#ffffff1f;--glass-fill-soft:#ffffff0d;--glass-fill-hover:#ffffff24;--glass-border:#ffffff38;--glass-border-strong:#ffffff52;--glass-border-inner:#ffffff1f;--glass-highlight:linear-gradient(135deg, #ffffff47 0%, #ffffff0f 40%, transparent 70%);--glass-blur:20px;--glass-blur-lg:28px;--glass-blur-sm:12px;--glass-saturate:1.4;--glass-shadow:0 8px 32px #00000047, 0 2px 8px #0000001f;--glass-shadow-lg:0 16px 48px #00000059, 0 4px 12px #00000026;--glass-inset:inset 0 1px 0 #ffffff59, inset 0 -1px 0 #ffffff0f;--text-primary:#f1f5f9;--text-secondary:#e2e8f0b8;--text-muted:#94a3b8d9;--text-inverse:#0f172a;--text-accent:#5eead4;--accent-teal:#2dd4bf;--accent-teal-bright:#5eead4;--accent-teal-dim:#2dd4bf40;--accent-teal-glow:#2dd4bf66;--accent-cyan:#22d3ee;--accent-violet:#a78bfa;--beam-core:#fde047;--beam-mid:#eab308;--beam-edge:#eab30840;--beam-glow:#fde04773;--beam-fill:#facc1559;--beam-stroke:#fde047b3;--success:#34d399;--success-dim:#34d39933;--danger:#f87171;--danger-dim:#f8717133;--warning:#fbbf24;--radius-xs:6px;--radius-sm:10px;--radius-md:14px;--radius-lg:20px;--radius-xl:28px;--radius-pill:999px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--gap-cards:16px;--pad-card:20px;--pad-card-sm:14px;--font-sans:"Inter", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;--font-mono:"JetBrains Mono", "SF Mono", "Cascadia Code", ui-monospace, monospace;--fs-xs:11px;--fs-sm:12px;--fs-base:14px;--fs-md:15px;--fs-lg:17px;--fs-xl:20px;--fs-2xl:24px;--fs-3xl:30px;--lh-tight:1.25;--lh-normal:1.5;--fw-regular:400;--fw-medium:500;--fw-semibold:600;--fw-bold:700;--input-bg:#ffffff0f;--input-border:#ffffff2e;--input-border-focus:#2dd4bfa6;--input-height:36px;--slider-track:#ffffff1f;--slider-fill:var(--accent-teal);--slider-thumb:#f8fafc;--slider-thumb-ring:#2dd4bf80;--slider-height:6px;--slider-thumb-size:18px;--btn-primary-bg:linear-gradient(135deg, #2dd4bf 0%, #14b8a6 100%);--btn-primary-text:#042f2e;--btn-primary-shadow:0 4px 16px #2dd4bf59;--btn-secondary-bg:#ffffff14;--btn-secondary-border:#ffffff38;--btn-secondary-text:var(--text-primary);--btn-height:40px;--btn-height-sm:32px;--shell-max:1280px;--topbar-height:56px;--sidebar-width:280px;--transition-fast:.15s ease;--transition-base:.22s ease}[data-theme=light-glass]{--bg-base:#e8eef5;--bg-gradient:radial-gradient(ellipse 80% 60% at 10% 20%, #38bdf859 0%, transparent 55%), radial-gradient(ellipse 70% 50% at 90% 10%, #a78bfa47 0%, transparent 50%), radial-gradient(ellipse 60% 55% at 70% 90%, #2dd4bf38 0%, transparent 55%), linear-gradient(165deg, #dce8f4 0%, #e8eef8 50%, #d4e4f0 100%);--glass-fill:#ffffff8c;--glass-fill-strong:#ffffffb8;--glass-fill-soft:#fff6;--glass-border:#ffffffb3;--glass-border-strong:#ffffffe6;--glass-shadow:0 8px 32px #0f28461f, 0 2px 8px #0f28460f;--text-primary:#0f172a;--text-secondary:#334155cc;--text-muted:#64748be6;--text-accent:#0d9488;--input-bg:#ffffff80;--input-border:#94a3b866;--slider-track:#94a3b859;--btn-secondary-bg:#ffffff80;--btn-secondary-border:#94a3b866;--btn-secondary-text:#0f172a}.glass{background:var(--glass-fill);-webkit-backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));border:1px solid var(--glass-border);border-radius:var(--radius-lg);box-shadow:var(--glass-shadow), var(--glass-inset)}.glass-strong{background:var(--glass-fill-strong);-webkit-backdrop-filter:blur(var(--glass-blur-lg)) saturate(var(--glass-saturate));border:1px solid var(--glass-border-strong);border-radius:var(--radius-lg);box-shadow:var(--glass-shadow-lg), var(--glass-inset)}.glass-soft{background:var(--glass-fill-soft);-webkit-backdrop-filter:blur(var(--glass-blur-sm)) saturate(var(--glass-saturate));border:1px solid var(--glass-border-inner);border-radius:var(--radius-md);box-shadow:var(--glass-inset)}@media (width<=768px),(prefers-reduced-transparency:reduce){.glass,.glass-strong,.glass-soft{-webkit-backdrop-filter:none}.glass{background:#142332eb}.glass-strong{background:#192a3cf2}.glass-soft{background:#12202ee0}[data-theme=light-glass] .glass{background:#ffffffeb}[data-theme=light-glass] .glass-strong{background:#fffffff5}[data-theme=light-glass] .glass-soft{background:#f8fafce6}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body{min-height:100%}body{font-family:var(--font-sans);font-size:var(--fs-base);color:var(--text-primary);background:var(--bg-base);background-image:var(--bg-gradient);line-height:var(--lh-normal);-webkit-font-smoothing:antialiased;background-attachment:fixed}#app{min-height:100vh}.shell{max-width:var(--shell-max);padding:var(--space-4) var(--space-5) var(--space-8);margin:0 auto}.topbar{height:var(--topbar-height);padding:0 var(--space-5);margin-bottom:var(--gap-cards);justify-content:space-between;align-items:center;display:flex;position:relative;overflow:hidden}.topbar:before{content:"";background:var(--glass-highlight);pointer-events:none;opacity:.7;position:absolute;inset:0}.brand{z-index:1;flex-direction:column;gap:2px;display:flex;position:relative}.brand h1{font-size:var(--fs-xl);font-weight:var(--fw-semibold);letter-spacing:.02em;line-height:var(--lh-tight)}.brand .sub{font-size:var(--fs-xs);color:var(--text-muted);font-weight:var(--fw-regular)}.brand .sub a{color:var(--text-accent);text-decoration:none}.brand .sub a:hover{text-decoration:underline}.topbar-badge{z-index:1;font-size:var(--fs-xs);color:var(--accent-teal-bright);background:var(--accent-teal-dim);border-radius:var(--radius-pill);border:1px solid #2dd4bf59;padding:4px 12px;position:relative}.main{grid-template-columns:var(--sidebar-width) 1fr;gap:var(--gap-cards);align-items:start;display:grid}@media (width<=900px){.main{grid-template-columns:1fr}}.card{padding:var(--pad-card);position:relative;overflow:hidden}.card:before{content:"";background:var(--glass-highlight);pointer-events:none;opacity:.55;position:absolute;inset:0}.card>*{z-index:1;position:relative}.card-title{font-size:var(--fs-sm);font-weight:var(--fw-semibold);color:var(--text-secondary);margin-bottom:var(--space-4);letter-spacing:.04em}.params{gap:var(--space-5);flex-direction:column;display:flex}.param{gap:var(--space-2);flex-direction:column;display:flex}.param-head{justify-content:space-between;align-items:baseline;gap:var(--space-2);display:flex}.param-label{font-size:var(--fs-sm);color:var(--text-secondary)}.param-hint{display:none}.param-value-wrap{align-items:center;gap:6px;display:flex}.param-input{width:72px;height:var(--input-height);background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--fs-base);font-weight:var(--fw-medium);text-align:right;transition:border-color var(--transition-fast), box-shadow var(--transition-fast);-moz-appearance:textfield;outline:none;padding:0 8px}.param-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.param-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.param-input:focus{border-color:var(--input-border-focus);box-shadow:0 0 0 3px var(--accent-teal-dim)}.param-unit{font-size:var(--fs-xs);color:var(--text-muted);min-width:1.5em}input[type=range]{appearance:none;width:100%;height:var(--slider-height);border-radius:var(--radius-pill);background:var(--slider-track);cursor:pointer;outline:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:var(--slider-thumb-size);height:var(--slider-thumb-size);background:var(--slider-thumb);border:2px solid var(--accent-teal);box-shadow:0 0 0 3px var(--slider-thumb-ring), 0 2px 6px #00000040;cursor:pointer;transition:transform var(--transition-fast);border-radius:50%}input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.08)}input[type=range]::-moz-range-thumb{width:var(--slider-thumb-size);height:var(--slider-thumb-size);background:var(--slider-thumb);border:2px solid var(--accent-teal);box-shadow:0 0 0 3px var(--slider-thumb-ring);cursor:pointer;border-radius:50%}input[type=range]::-moz-range-track{height:var(--slider-height);border-radius:var(--radius-pill);background:var(--slider-track)}.actions{gap:var(--space-3);margin-top:var(--space-2);padding-top:var(--space-4);border-top:1px solid var(--glass-border-inner);display:flex}.btn{height:var(--btn-height);border-radius:var(--radius-md);font-family:var(--font-sans);font-size:var(--fs-base);font-weight:var(--fw-semibold);cursor:pointer;transition:transform var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast), filter var(--transition-fast);border:none;flex:1}.btn:active{transform:scale(.98)}.btn-secondary{background:var(--btn-secondary-bg);border:1px solid var(--btn-secondary-border);color:var(--btn-secondary-text)}.btn-secondary:hover{background:var(--glass-fill-hover)}.btn-primary{background:var(--btn-primary-bg);color:var(--btn-primary-text);box-shadow:var(--btn-primary-shadow)}.btn-primary:hover{filter:brightness(1.06)}.views{gap:var(--gap-cards);flex-direction:column;min-width:0;display:flex}.view-row{gap:var(--gap-cards);grid-template-columns:1.2fr .8fr;display:grid}@media (width<=720px){.view-row{grid-template-columns:1fr}}.view-canvas{border-radius:var(--radius-md);border:1px solid var(--glass-border-inner);background:#00000038;justify-content:center;align-items:stretch;min-height:220px;display:flex;position:relative;overflow:hidden}.view-canvas.wall-combo{grid-template-columns:1.4fr .7fr;gap:0;min-height:260px;display:grid}@media (width<=720px){.view-canvas.wall-combo{grid-template-columns:1fr;min-height:400px}}.view-canvas canvas{width:100%;height:100%;min-height:180px;display:block}.wall-spot-pane{border-left:1px solid var(--glass-border-inner);min-height:180px}@media (width<=720px){.wall-spot-pane{border-left:none;border-top:1px solid var(--glass-border-inner)}}.floor-canvas{min-height:200px}.floor-canvas canvas{min-height:180px}.vert-canvas{min-height:260px}.vert-canvas canvas{min-height:240px}.results{gap:var(--space-4);padding:var(--pad-card-sm) var(--pad-card);grid-template-columns:auto 1fr 1fr;align-items:start;display:grid;position:relative;overflow:hidden}.results:before{content:"";background:var(--glass-highlight);pointer-events:none;opacity:.45;position:absolute;inset:0}.results>*{z-index:1;position:relative}@media (width<=720px){.results{grid-template-columns:1fr}}.results-label{font-size:var(--fs-sm);font-weight:var(--fw-semibold);color:var(--accent-teal-bright);white-space:nowrap;padding-top:4px}.result-group{gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}.result-item{flex-direction:column;gap:2px;min-width:88px;display:flex}.result-item .k{font-size:var(--fs-xs);color:var(--text-muted)}.result-item .v{font-family:var(--font-mono);font-size:var(--fs-md);font-weight:var(--fw-semibold);color:var(--text-primary)}.result-item .v span{font-size:var(--fs-xs);font-weight:var(--fw-regular);color:var(--text-muted);margin-left:2px}.result-item.detail .v{font-size:var(--fs-base);font-weight:var(--fw-medium)}.footer-note{margin-top:var(--space-5);text-align:center;font-size:var(--fs-xs);color:var(--text-muted)}.footer-note a{color:var(--text-accent);text-decoration:none}.footer-note a:hover{text-decoration:underline}.glass{-webkit-backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate))}.glass-strong{-webkit-backdrop-filter:blur(var(--glass-blur-lg)) saturate(var(--glass-saturate));backdrop-filter:blur(var(--glass-blur-lg)) saturate(var(--glass-saturate))}.glass-soft{-webkit-backdrop-filter:blur(var(--glass-blur-sm)) saturate(var(--glass-saturate));backdrop-filter:blur(var(--glass-blur-sm)) saturate(var(--glass-saturate))}
