:root { color-scheme: dark; --bg: #070a0f; --panel: #0f1620; --panel-soft: #131d29; --panel-strong: #0a1018; --line: #253548; --line-soft: rgba(148, 163, 184, 0.2); --text: #e8f1fb; --muted: #93a8bf; --blue: #3378f6; --cyan: #19d6c3; --green: #24c58d; --amber: #f2b84d; --red: #fb7185; --shadow: 0 20px 52px rgba(0, 0, 0, 0.34); } * { box-sizing: border-box; } body { margin: 0; overflow: hidden; background: linear-gradient(90deg, rgba(51, 120, 246, 0.05) 1px, transparent 1px), linear-gradient(180deg, rgba(25, 214, 195, 0.045) 1px, transparent 1px), #070a0f; background-size: 72px 72px; color: var(--text); font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; letter-spacing: 0; } button, input, textarea { font: inherit; } button { cursor: pointer; } .hidden { display: none !important; } .topbar { height: 66px; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 0 18px; border-bottom: 1px solid var(--line); background: rgba(7, 10, 15, 0.95); } .brand, .top-actions, .viewer-tools { display: flex; align-items: center; gap: 10px; min-width: 0; } .brand-mark { width: 31px; height: 31px; flex: 0 0 auto; border-radius: 9px; background: linear-gradient(135deg, var(--cyan), var(--blue)); box-shadow: 0 0 22px rgba(25, 214, 195, 0.22); } .brand h1, .login-panel h1 { margin: 0; font-size: 18px; line-height: 1.15; } .brand p, .login-panel p { margin: 4px 0 0; color: var(--muted); font-size: 12px; } .top-actions { justify-content: flex-end; } .viewer-tools { flex: 0 0 auto; } .top-actions .ghost-btn, .viewer-tools .ghost-btn, .viewer-tools .primary-btn, .viewer-tools .state-btn { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.03), 0 8px 20px rgba(0, 0, 0, 0.18); } .workspace { height: calc(100vh - 66px); display: grid; grid-template-columns: 338px minmax(0, 1fr); gap: 12px; padding: 12px; } .panel { min-height: 0; border: 1px solid var(--line); border-radius: 14px; background: linear-gradient(180deg, rgba(15, 22, 32, 0.96), rgba(10, 16, 24, 0.96)); box-shadow: var(--shadow); } .panel-head { min-height: 52px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px; } .panel-head.compact { min-height: 42px; padding: 10px 12px; } .panel-head h2, .case-strip h2 { margin: 0; font-size: 17px; line-height: 1.2; } .panel-head p, .case-strip p { margin: 4px 0 0; color: var(--muted); font-size: 12px; } .case-panel { min-height: 0; display: flex; flex-direction: column; } .search-input, .login-panel input, .notes { width: calc(100% - 28px); margin: 0 14px 10px; border: 1px solid var(--line); border-radius: 10px; background: rgba(6, 10, 15, 0.86); color: var(--text); outline: none; } .search-input, .login-panel input { height: 40px; padding: 0 12px; } .notes { min-height: 58px; resize: none; padding: 10px; } .filter-row, .part-filter, .chip-rail, .tag-line { display: flex; gap: 8px; padding: 0 14px 10px; overflow-x: auto; } .filter, .chip, .tag, .status-pill, .ghost-btn, .primary-btn, .state-btn { min-height: 30px; display: inline-flex; align-items: center; justify-content: center; white-space: nowrap; border-radius: 10px; font-weight: 800; } .filter, .chip, .tag { border: 1px solid var(--line); background: rgba(8, 13, 20, 0.82); color: #b7c7dc; font-size: 12px; padding: 0 10px; } .filter.active, .chip.active { border-color: rgba(25, 214, 195, 0.78); color: #ccfbf1; background: rgba(20, 184, 166, 0.16); } .tag { min-height: 24px; border-radius: 999px; font-style: normal; } .tag.green { border-color: rgba(36, 197, 141, 0.58); color: #b8f7da; background: rgba(36, 197, 141, 0.11); } .tag.amber { border-color: rgba(242, 184, 77, 0.62); color: #ffe1a6; background: rgba(242, 184, 77, 0.13); } .tag.red { border-color: rgba(251, 113, 133, 0.62); color: #fecdd3; background: rgba(251, 113, 133, 0.12); } .case-list, .series-list, .stl-list { min-height: 0; overflow-y: auto; padding: 4px 12px 12px; } .case-list { flex: 1; } .case-card, .series-card, .stl-row { width: 100%; display: block; margin: 0 0 10px; border: 1px solid transparent; border-radius: 14px; background: rgba(9, 15, 23, 0.88); color: var(--text); text-align: left; } .case-card, .series-card { padding: 13px; } .case-card.active, .series-card.active, .stl-row.active { border-color: rgba(51, 120, 246, 0.92); background: linear-gradient(180deg, rgba(20, 45, 88, 0.96), rgba(10, 18, 31, 0.96)); } .case-card strong, .series-card strong { display: block; max-width: 100%; overflow: hidden; color: #f1f7ff; font-size: 15px; text-overflow: ellipsis; white-space: nowrap; } .case-card span, .series-card span, .case-card small, .series-card small, .stl-row small { display: block; margin-top: 6px; overflow: hidden; color: var(--muted); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .mini-tags { display: flex; flex-wrap: nowrap; gap: 6px; max-width: 100%; margin-top: 9px; overflow-x: auto; scrollbar-width: none; } .mini-tags::-webkit-scrollbar { display: none; } .mini-tags i { min-height: 22px; display: inline-flex; align-items: center; flex: 0 0 auto; border: 1px solid rgba(25, 214, 195, 0.5); border-radius: 999px; background: rgba(20, 184, 166, 0.12); color: #ccfbf1; font-size: 11px; font-style: normal; font-weight: 800; padding: 0 8px; } .case-card .tag { flex: 0 0 auto; } .card-line { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .main-panel { min-width: 0; min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 12px; } .case-strip { min-height: 74px; display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 14px 16px; } .case-strip .tag-line { padding: 0; } .work-grid { min-height: 0; display: grid; grid-template-columns: 300px minmax(420px, 1fr) 330px; gap: 12px; } .series-panel, .right-panel { min-height: 0; } .series-panel, .stl-panel, .pose-panel { display: flex; flex-direction: column; } .right-panel { display: grid; grid-template-rows: minmax(220px, 0.88fr) minmax(320px, 1.12fr); gap: 12px; } .viewer-panel { min-width: 0; min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr) auto; overflow: hidden; } .viewer-head { min-height: 58px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 12px; border-bottom: 1px solid var(--line); overflow-x: auto; } .segmented { display: flex; flex: 0 0 auto; gap: 7px; overflow-x: auto; } .segmented button { min-width: 72px; min-height: 34px; border: 1px solid var(--line); border-radius: 10px; background: rgba(18, 28, 42, 0.88); color: #c6d4e5; font-weight: 900; } .segmented button.active { border-color: rgba(51, 120, 246, 0.9); background: var(--blue); color: white; } .ghost-btn, .primary-btn, .state-btn { flex: 0 0 auto; min-height: 34px; border: 1px solid rgba(148, 163, 184, 0.34); padding: 0 12px; background: linear-gradient(180deg, rgba(25, 38, 56, 0.95), rgba(9, 15, 23, 0.95)); color: var(--text); } .ghost-btn:disabled, .primary-btn:disabled, .state-btn:disabled { cursor: wait; opacity: 0.62; } .ghost-btn.accent { border-color: rgba(25, 214, 195, 0.56); color: #bffbf2; } .primary-btn { border-color: rgba(51, 120, 246, 0.85); background: var(--blue); color: white; } .state-btn { border-color: rgba(36, 197, 141, 0.62); color: #b8f7da; background: rgba(36, 197, 141, 0.14); } .state-btn.unregistered { border-color: rgba(242, 184, 77, 0.66); color: #ffe1a6; background: rgba(242, 184, 77, 0.12); } .status-pill { height: 31px; border: 1px solid var(--line); color: var(--muted); padding: 0 12px; font-size: 12px; } .status-pill.online { border-color: rgba(36, 197, 141, 0.54); color: #b8f7da; background: rgba(36, 197, 141, 0.1); } .status-pill.offline { border-color: rgba(251, 113, 133, 0.6); color: #fecdd3; background: rgba(251, 113, 133, 0.1); } .user-badge { max-width: 140px; overflow: hidden; color: var(--muted); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } #saveState.ok { color: #b8f7da; } #saveState.warn { color: #ffe1a6; } #saveState.error { color: #fecdd3; } .fusion-stage { position: relative; min-height: 0; background: #000; } #fusionViewport { position: absolute; inset: 0; } #fusionViewport canvas { display: block; width: 100% !important; height: 100% !important; } .fusion-hud { position: absolute; z-index: 4; max-width: 46%; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 12px; background: rgba(0, 0, 0, 0.58); color: rgba(255, 255, 255, 0.72); font-size: 11px; font-weight: 800; padding: 8px 10px; text-overflow: ellipsis; white-space: nowrap; } .fusion-hud.left { top: 14px; left: 14px; } .fusion-hud.right { top: 14px; right: 14px; } .fusion-loading { position: absolute; left: 40px; right: 40px; bottom: 24px; z-index: 5; border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 13px; background: rgba(0, 0, 0, 0.68); padding: 12px; } .fusion-loading span { display: block; margin-bottom: 8px; color: rgba(255, 255, 255, 0.72); font-size: 12px; font-weight: 900; } .fusion-loading div { height: 4px; overflow: hidden; border-radius: 999px; background: rgba(255, 255, 255, 0.12); } .fusion-loading i, .top-loading span { display: block; height: 100%; width: 34%; border-radius: 999px; background: linear-gradient(90deg, transparent, var(--cyan), var(--blue), transparent); animation: sweep 1.1s ease-in-out infinite; } .top-loading { position: fixed; top: 66px; left: 0; right: 0; z-index: 30; height: 3px; background: rgba(37, 53, 72, 0.82); overflow: hidden; } @keyframes sweep { from { transform: translateX(-110%); } to { transform: translateX(320%); } } .slice-row { height: 48px; display: grid; grid-template-columns: 98px minmax(0, 1fr); gap: 12px; align-items: center; padding: 0 14px; border-top: 1px solid var(--line); } .slice-row span { color: var(--muted); font-size: 12px; font-weight: 800; } input[type="range"] { accent-color: var(--cyan); } .stl-row { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; align-items: start; padding: 10px; } .stl-row input { margin-top: 3px; accent-color: var(--cyan); } .stl-row strong { display: block; overflow: hidden; color: #e8f1fb; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; } .pose-grid { display: grid; gap: 10px; padding: 0 12px 12px; } .pose-control { display: grid; grid-template-columns: 72px minmax(0, 1fr) 72px; gap: 8px; align-items: center; } .pose-control label { color: var(--muted); font-size: 12px; font-weight: 900; } .pose-control input[type="number"] { width: 100%; height: 30px; border: 1px solid var(--line); border-radius: 8px; background: rgba(6, 10, 15, 0.86); color: var(--text); text-align: right; padding: 0 7px; } .flip-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 0 12px 12px; } .flip-row button { min-height: 32px; border: 1px solid var(--line); border-radius: 9px; background: rgba(8, 13, 20, 0.82); color: #c6d4e5; font-weight: 900; } .flip-row button.active { border-color: rgba(25, 214, 195, 0.78); color: #ccfbf1; background: rgba(20, 184, 166, 0.16); } .empty-state { padding: 22px; color: var(--muted); font-size: 13px; text-align: center; } .login-overlay { position: fixed; inset: 0; z-index: 100; display: flex; align-items: center; justify-content: center; background: rgba(5, 8, 12, 0.92); backdrop-filter: blur(12px); } .login-panel { width: min(420px, calc(100vw - 36px)); border: 1px solid var(--line); border-radius: 18px; background: linear-gradient(180deg, rgba(19, 29, 41, 0.98), rgba(10, 16, 24, 0.98)); box-shadow: var(--shadow); padding: 26px; } .login-panel .brand-mark { margin-bottom: 14px; } .login-panel input { width: 100%; margin: 12px 0 0; } .login-panel button { width: 100%; min-height: 40px; margin-top: 14px; border: 0; border-radius: 10px; background: var(--blue); color: white; font-weight: 900; } #loginError { display: block; min-height: 18px; margin-top: 10px; color: var(--red); font-size: 12px; font-weight: 800; } @media (max-width: 1500px) { .workspace { grid-template-columns: 310px minmax(0, 1fr); } .work-grid { grid-template-columns: 270px minmax(360px, 1fr) 300px; } }