:root { color-scheme: dark; --bg: #070b10; --panel: #101720; --panel-2: #0b1118; --panel-3: #070b10; --line: #243344; --line-strong: #3a5773; --text: #eaf2fb; --muted: #93a8c0; --blue: #3378f6; --cyan: #17d6c1; --green: #21c58a; --amber: #efb84d; --red: #fb7185; --shadow: 0 18px 44px rgba(0, 0, 0, 0.32); } * { box-sizing: border-box; } body { margin: 0; overflow: hidden; background: linear-gradient(90deg, rgba(51, 120, 246, 0.07) 1px, transparent 1px), linear-gradient(180deg, rgba(23, 214, 193, 0.055) 1px, transparent 1px), radial-gradient(circle at 16% 0%, rgba(23, 214, 193, 0.12), transparent 27%), var(--bg); background-size: 80px 80px, 80px 80px, auto; color: var(--text); font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; letter-spacing: 0; } button, input, select, textarea { font: inherit; } button { cursor: pointer; } .hidden { display: none !important; } .topbar { height: 66px; display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 0 20px; border-bottom: 1px solid var(--line); background: rgba(7, 11, 16, 0.93); } .brand, .top-actions { display: flex; align-items: center; gap: 12px; min-width: 0; } .brand-mark { width: 30px; height: 30px; flex: 0 0 auto; border-radius: 8px; background: linear-gradient(135deg, var(--cyan), var(--blue)); box-shadow: 0 0 24px rgba(23, 214, 193, 0.24); } .brand h1 { margin: 0; font-size: 18px; line-height: 1.2; } .brand p { margin: 3px 0 0; color: var(--muted); font-size: 12px; } .top-actions { justify-content: flex-end; gap: 9px; } .top-loading { position: fixed; top: 66px; left: 0; right: 0; z-index: 20; height: 3px; overflow: hidden; background: rgba(36, 51, 68, 0.75); } .top-loading span { position: absolute; inset-block: 0; width: 34%; border-radius: 999px; background: linear-gradient(90deg, transparent, var(--cyan), var(--blue), transparent); animation: loading-sweep 1.15s ease-in-out infinite; } @keyframes loading-sweep { from { transform: translateX(-110%); } to { transform: translateX(320%); } } .dark-btn, .primary-btn, .warn-btn, .icon-btn { min-height: 34px; border: 1px solid rgba(147, 168, 192, 0.36); border-radius: 8px; background: linear-gradient(180deg, rgba(24, 36, 52, 0.96), rgba(10, 17, 25, 0.96)); color: var(--text); font-weight: 700; } .dark-btn { padding: 0 13px; } .dark-btn.accent { border-color: rgba(23, 214, 193, 0.62); color: #bffbf2; background: linear-gradient(180deg, rgba(15, 57, 66, 0.96), rgba(8, 27, 37, 0.96)); } .primary-btn { padding: 0 14px; border-color: rgba(51, 120, 246, 0.8); background: var(--blue); color: white; } .warn-btn { padding: 0 14px; border-color: rgba(239, 184, 77, 0.6); background: rgba(239, 184, 77, 0.14); color: #ffe1a6; } .icon-btn { height: 32px; padding: 0 12px; font-size: 12px; } .dark-btn:hover, .icon-btn:hover { border-color: rgba(51, 120, 246, 0.84); background: #172334; } .user-badge { max-width: 150px; overflow: hidden; color: var(--muted); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .status-pill { min-width: 90px; height: 30px; display: inline-flex; align-items: center; justify-content: center; padding: 0 12px; border: 1px solid var(--line); border-radius: 999px; color: var(--muted); font-size: 12px; font-weight: 800; white-space: nowrap; } .status-pill.online { border-color: rgba(33, 197, 138, 0.48); color: #a8f4d6; background: rgba(33, 197, 138, 0.08); } .status-pill.offline { border-color: rgba(251, 113, 133, 0.5); color: #fecdd3; background: rgba(251, 113, 133, 0.08); } .workspace { height: calc(100vh - 66px); display: grid; grid-template-columns: 410px minmax(0, 1fr); gap: 12px; padding: 12px; } .left-rail { min-height: 0; display: grid; grid-template-rows: 210px minmax(160px, 0.82fr) minmax(250px, 1.12fr) minmax(300px, 0.9fr); gap: 10px; overflow: hidden; } .viewer-shell { min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 10px; } .panel, .viewport-card { min-width: 0; border: 1px solid var(--line); border-radius: 8px; background: rgba(16, 23, 32, 0.92); box-shadow: var(--shadow); } .search-panel, .stacked-panel, .registration-panel, .hero-strip { padding: 12px; } .stacked-panel { min-height: 0; display: flex; flex-direction: column; overflow: hidden; } .panel-head, .viewport-head, .hero-strip { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .panel-head h2, .viewport-head h3, .hero-strip h2 { margin: 0; font-size: 15px; } .panel-head span, .viewport-head span, .hero-strip p { color: var(--muted); font-size: 12px; } .hero-strip p { margin: 4px 0 0; } .search-input, .notes, .tool-row select { width: 100%; border: 1px solid var(--line); border-radius: 8px; outline: 0; background: #080d14; color: var(--text); } .search-input { height: 38px; margin-top: 10px; padding: 0 12px; } .notes { min-height: 42px; resize: vertical; padding: 8px 10px; } .search-input:focus, .notes:focus, .tool-row select:focus { border-color: rgba(51, 120, 246, 0.72); } .case-list, .series-list, .stl-list { min-height: 0; overflow: auto; scrollbar-width: thin; } .case-list { height: 138px; margin-top: 10px; } .series-list, .stl-list { flex: 1 1 auto; height: auto; margin-top: 10px; } .case-card, .series-card, .stl-row { width: 100%; display: grid; gap: 6px; margin-bottom: 8px; padding: 10px; border: 1px solid transparent; border-radius: 8px; background: #0b1118; color: var(--text); text-align: left; } .case-card.active, .series-card.active, .stl-row.active { border-color: rgba(23, 214, 193, 0.8); background: rgba(18, 37, 46, 0.92); } .case-card strong, .series-card strong, .stl-row strong { overflow: hidden; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; } .case-card span, .case-card small, .series-card span, .series-card small, .stl-row span, .stl-row small { overflow: hidden; color: var(--muted); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .card-line { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .tag-line, .hero-tags, .chip-rail { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: thin; } .stacked-panel .chip-rail { flex: 0 0 auto; min-height: 30px; margin-top: 8px; } .tag, .chip { flex: 0 0 auto; max-width: 132px; padding: 2px 7px; overflow: hidden; border: 1px solid rgba(23, 214, 193, 0.42); border-radius: 999px; color: #bffbf2; background: rgba(23, 214, 193, 0.08); font-size: 11px; font-style: normal; text-overflow: ellipsis; white-space: nowrap; } .tag.warn { border-color: rgba(239, 184, 77, 0.55); color: #ffe1a6; background: rgba(239, 184, 77, 0.09); } .tag.locked { border-color: rgba(51, 120, 246, 0.56); color: #cfe0ff; background: rgba(51, 120, 246, 0.11); } .chip { cursor: pointer; } .chip.active { border-color: var(--cyan); background: rgba(23, 214, 193, 0.18); } .segmented { display: flex; gap: 6px; padding: 4px; border: 1px solid var(--line); border-radius: 8px; background: #080d14; } .segmented.small { margin-top: 10px; } .segmented button { flex: 1; height: 28px; border: 0; border-radius: 6px; background: transparent; color: var(--muted); font-weight: 800; } .segmented button.active { background: var(--blue); color: white; } .stl-row { grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; } .stl-row input { margin: 0; } .registration-panel { display: grid; gap: 10px; min-height: 0; overflow: auto; } .pose-grid { display: grid; gap: 7px; } .pose-control { display: grid; grid-template-columns: 70px minmax(0, 1fr) 72px; align-items: center; gap: 8px; } .pose-control label { color: var(--muted); font-size: 12px; } .pose-control input[type="range"] { width: 100%; accent-color: var(--cyan); } .pose-control input[type="number"] { width: 72px; height: 28px; border: 1px solid var(--line); border-radius: 7px; background: #080d14; color: var(--text); text-align: right; } .flip-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; } .flip-row button { height: 28px; border: 1px solid var(--line); border-radius: 7px; background: #080d14; color: var(--muted); font-weight: 800; } .flip-row button.active { border-color: rgba(23, 214, 193, 0.72); color: #bffbf2; background: rgba(23, 214, 193, 0.13); } .action-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .viewer-grid { min-height: 0; display: grid; grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; } .viewport-card { min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr) auto; overflow: hidden; } .fusion-card, .segmentation-card { grid-template-rows: auto minmax(0, 1fr); } .viewport-head { min-height: 52px; padding: 10px 12px; border-bottom: 1px solid var(--line); background: rgba(11, 17, 24, 0.86); } .tool-row { display: flex; gap: 8px; } .tool-row select { width: 94px; height: 32px; padding: 0 8px; } .image-stage, .segmentation-stage, .three-stage { position: relative; min-height: 0; overflow: hidden; background: #000; } .image-stage, .segmentation-stage { display: grid; place-items: center; } .image-stage img, .segmentation-stage img { max-width: 100%; max-height: 100%; object-fit: contain; image-rendering: auto; } .segmentation-stage canvas { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; } .empty-state { position: absolute; inset: 0; display: grid; place-items: center; padding: 20px; color: rgba(234, 242, 251, 0.44); font-size: 13px; font-weight: 800; text-align: center; } .slice-row { display: grid; grid-template-columns: minmax(0, 1fr) 72px; gap: 10px; align-items: center; height: 42px; padding: 0 12px; border-top: 1px solid var(--line); background: rgba(11, 17, 24, 0.86); } .slice-row input { width: 100%; accent-color: var(--cyan); } .slice-row span { color: var(--muted); font-size: 12px; text-align: right; } .login-overlay { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; background: rgba(7, 11, 16, 0.78); backdrop-filter: blur(8px); } .login-panel { width: min(390px, calc(100vw - 32px)); display: grid; gap: 12px; padding: 24px; border: 1px solid var(--line-strong); border-radius: 8px; background: rgba(16, 23, 32, 0.96); box-shadow: var(--shadow); } .login-panel h2 { margin: 0; font-size: 18px; } .login-panel p { margin: 0; color: var(--muted); font-size: 13px; } .login-panel .search-input { margin-top: 0; } .error-line { min-height: 18px; color: #fecdd3; font-size: 12px; } @media (max-width: 1320px) { .workspace { grid-template-columns: 360px minmax(0, 1fr); } .viewer-grid { grid-template-columns: minmax(0, 1fr); grid-template-rows: repeat(4, minmax(360px, 1fr)); overflow: auto; } } @media (max-width: 900px) { body { overflow: auto; } .topbar, .workspace { height: auto; } .topbar, .workspace, .left-rail, .viewer-shell { display: grid; grid-template-columns: 1fr; } .top-actions { flex-wrap: wrap; justify-content: start; } .left-rail { grid-template-rows: auto; } }