: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; transition: grid-template-columns 0.22s ease; } .workspace.case-collapsed { grid-template-columns: 0 minmax(0, 1fr); } .workspace.case-collapsed .case-panel { opacity: 0; pointer-events: none; transform: translateX(-18px); } .icon-btn { width: 38px; height: 34px; display: grid; grid-template-columns: 8px 1fr; grid-template-rows: repeat(2, 1fr); gap: 4px; flex: 0 0 auto; border: 1px solid rgba(148, 163, 184, 0.38); border-radius: 10px; background: linear-gradient(180deg, rgba(25, 38, 56, 0.95), rgba(9, 15, 23, 0.95)); padding: 7px; } .icon-btn span { border: 2px solid #afbfd2; border-radius: 3px; } .icon-btn span:first-child { grid-row: 1 / 3; } .icon-btn span:nth-child(2), .icon-btn span:nth-child(3) { grid-column: 2; } .icon-btn.active { border-color: rgba(25, 214, 195, 0.66); background: rgba(20, 184, 166, 0.18); } .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; overflow: hidden; transition: opacity 0.2s ease, transform 0.2s ease; } .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; } .tool-pane .notes { width: 100%; margin: 10px 0 0; } .filter-row, .part-filter, .chip-rail, .tag-line { display: flex; gap: 8px; padding: 0 14px 10px; overflow-x: auto; } .tool-pane .chip-rail { padding: 0 0 10px; } .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; } .registration-board { min-height: 0; display: grid; grid-template-columns: 360px minmax(520px, 1.08fr) minmax(420px, 0.92fr); gap: 12px; } .tool-dock { min-width: 0; min-height: 0; display: grid; grid-template-rows: 44px minmax(0, 1fr); overflow: hidden; } .tool-tabs { display: grid; grid-template-columns: repeat(3, 1fr); border-bottom: 1px solid var(--line); background: rgba(6, 10, 15, 0.55); } .tool-tabs button { border: 0; border-right: 1px solid rgba(148, 163, 184, 0.2); background: rgba(18, 24, 36, 0.72); color: #c5d3e5; font-weight: 900; } .tool-tabs button.active { background: linear-gradient(180deg, rgba(75, 86, 111, 0.88), rgba(30, 39, 58, 0.9)); color: #ffffff; box-shadow: inset 0 -2px 0 rgba(25, 214, 195, 0.75); } .tool-pane { min-height: 0; display: none; overflow-y: auto; padding: 10px; } .tool-pane.active { display: flex; flex-direction: column; } .patient-card { flex: 0 0 auto; margin-bottom: 10px; border: 1px solid rgba(148, 163, 184, 0.16); border-radius: 10px; background: linear-gradient(180deg, rgba(28, 35, 49, 0.92), rgba(15, 21, 31, 0.92)); padding: 12px; } .patient-card strong { display: block; overflow: hidden; color: #fff; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; } .patient-card dl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px 14px; margin: 12px 0 0; } .patient-card div { min-width: 0; } .patient-card dt { color: var(--muted); font-size: 11px; } .patient-card dd { margin: 3px 0 0; overflow: hidden; color: #edf5ff; font-size: 12px; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; } .tool-section-title { min-height: 34px; display: flex; align-items: center; justify-content: space-between; gap: 8px; flex: 0 0 auto; margin: 8px -10px 8px; border-top: 1px solid rgba(148, 163, 184, 0.15); border-bottom: 1px solid rgba(148, 163, 184, 0.15); background: rgba(24, 31, 45, 0.9); color: #f1f7ff; font-size: 13px; font-weight: 900; padding: 0 10px; } .tool-section-title button { border: 0; background: transparent; color: #c4d7ee; font-size: 12px; font-weight: 900; } .tool-section-title em { color: var(--muted); font-size: 12px; font-style: normal; } .matched-series { flex: 0 0 auto; } .matched-series .series-card { border-color: rgba(25, 214, 195, 0.75); background: rgba(20, 184, 166, 0.12); } .compact-list { min-height: 0; padding: 0; } .tool-pane .compact-list { flex: 1; } .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; } .dicom-panel { grid-template-rows: auto minmax(0, 1fr) auto; } .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: hidden; } .fusion-panel .viewer-head { align-content: center; flex-wrap: wrap; } .viewer-head h2 { margin: 0; font-size: 16px; } .viewer-head p { margin: 3px 0 0; color: var(--muted); font-size: 11px; } .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, #autoState.ok { color: #b8f7da; } #saveState.warn, #autoState.warn { color: #ffe1a6; } #saveState.error, #autoState.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); } .dicom-stage { position: relative; min-height: 0; overflow: hidden; background: #000; } .dicom-stage img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; image-rendering: auto; } .crosshair { position: absolute; z-index: 3; pointer-events: none; opacity: 0.82; } .crosshair.horizontal { top: 50%; left: 0; right: 0; height: 1px; background: rgba(52, 211, 153, 0.72); } .crosshair.vertical { top: 0; bottom: 0; left: 50%; width: 1px; background: rgba(248, 113, 113, 0.72); } .dicom-overlay { position: absolute; z-index: 4; max-width: 48%; color: rgba(255, 255, 255, 0.86); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; line-height: 1.35; text-shadow: 0 1px 2px #000; white-space: pre-line; } .dicom-overlay.top-left { top: 12px; left: 12px; } .dicom-overlay.top-right { top: 12px; right: 12px; text-align: right; } .dicom-overlay.bottom-left { bottom: 12px; left: 12px; } .annotation-tags { min-height: 48px; display: flex; gap: 8px; align-items: center; overflow-x: auto; border-top: 1px solid var(--line); padding: 8px 12px; } .annotation-tags span { flex: 0 0 auto; border: 1px solid rgba(25, 214, 195, 0.55); border-radius: 999px; background: rgba(20, 184, 166, 0.12); color: #ccfbf1; font-size: 12px; font-weight: 900; padding: 5px 10px; } .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 0 12px; } .pose-control { display: grid; grid-template-columns: 56px 26px minmax(0, 1fr) 26px 64px; gap: 6px; 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; } .pose-control button, .pose-actions button, .auto-box button { min-height: 28px; border: 1px solid var(--line); border-radius: 8px; background: rgba(8, 13, 20, 0.82); color: #c6d4e5; font-size: 11px; font-weight: 900; } .pose-control button:hover, .pose-actions button:hover, .auto-box button:hover { border-color: rgba(25, 214, 195, 0.65); color: #ccfbf1; } .quick-row { grid-column: 2 / span 3; display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; } .pose-actions { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 10px; } .flip-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 0 0 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); } .auto-box { border: 1px solid rgba(148, 163, 184, 0.18); border-radius: 10px; background: rgba(8, 13, 20, 0.62); padding: 10px; } .auto-options { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin-bottom: 10px; } .auto-options label { min-height: 28px; display: flex; align-items: center; justify-content: center; gap: 5px; border: 1px solid rgba(148, 163, 184, 0.18); border-radius: 8px; background: rgba(15, 22, 32, 0.82); color: #c7d6e8; font-size: 11px; font-weight: 900; } .auto-result { min-height: 36px; margin-top: 8px; border-radius: 8px; background: rgba(7, 10, 15, 0.78); color: var(--muted); font-size: 11px; line-height: 1.5; padding: 8px; } .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; } .registration-board { grid-template-columns: 320px minmax(460px, 1fr) minmax(360px, 0.8fr); } } @media (max-width: 1250px) { .registration-board { overflow-x: auto; grid-template-columns: 320px 560px 420px; } }