/* RustyTorch++ Virtual Catheter Demo Styles */ * { box-sizing: border-box; } html, body, #root { margin: 0; padding: 0; width: 100%; height: 100%; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } .app { display: flex; flex-direction: column; height: 100vh; background: #0f0f23; color: #e4e4e4; } .app-header { display: flex; align-items: baseline; gap: 16px; padding: 12px 24px; background: linear-gradient(135deg, #16213e 0%, #0f4c75 100%); border-bottom: 2px solid #3282b8; } .app-header h1 { margin: 0; font-size: 24px; font-weight: 600; color: #bbe1fa; } .app-header .subtitle { font-size: 14px; color: #8ba4b8; } .app-main { display: flex; flex: 1; overflow: hidden; } .sidebar-left { flex-shrink: 0; padding: 16px; background: #0a1628; border-right: 1px solid #16213e; overflow-y: auto; } .canvas-container { flex: 1; position: relative; overflow: hidden; } .canvas-container canvas { width: 100%; height: 100%; } .overlay { position: absolute; pointer-events: auto; z-index: 10; } .overlay.top-right { top: 16px; right: 16px; } .overlay.bottom-right { bottom: 16px; right: 16px; } .overlay.top-left { top: 16px; left: 16px; } .overlay.bottom-left { bottom: 16px; left: 16px; } .overlay.top-center { top: 16px; left: 50%; transform: translateX(-50%); } .error-banner { position: absolute; top: 16px; left: 50%; transform: translateX(-50%); z-index: 100; display: flex; align-items: center; gap: 12px; padding: 12px 20px; background: rgba(244, 67, 54, 0.9); color: white; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .error-banner button { padding: 4px 12px; border: none; border-radius: 4px; background: rgba(255, 255, 255, 0.2); color: white; cursor: pointer; font-size: 12px; } .error-banner button:hover { background: rgba(255, 255, 255, 0.3); } .app-footer { display: flex; justify-content: center; gap: 12px; padding: 8px 24px; background: #0a1628; border-top: 1px solid #16213e; font-size: 12px; color: #6a7a8a; } /* Placeholder for empty canvas */ .canvas-placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: #6a7a8a; font-size: 16px; } .canvas-placeholder svg { width: 80px; height: 80px; margin-bottom: 16px; opacity: 0.5; } /* Auto-requery toggle */ .auto-requery-toggle { margin-top: 12px; padding: 8px; background: #16213e; border-radius: 4px; font-size: 12px; } .auto-requery-toggle label { display: flex; align-items: center; gap: 8px; cursor: pointer; } .auto-requery-toggle input { cursor: pointer; } /* Point inspection panel */ .point-inspection { background: rgba(22, 33, 62, 0.95); padding: 12px; border-radius: 8px; min-width: 180px; font-size: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .point-inspection h4 { margin: 0 0 8px 0; font-size: 13px; color: #3282b8; border-bottom: 1px solid #3282b8; padding-bottom: 4px; } .point-coords { margin-bottom: 8px; color: #888; font-family: monospace; font-size: 10px; } .point-values { display: flex; flex-direction: column; gap: 4px; font-family: monospace; font-size: 11px; margin-bottom: 8px; } .point-inspection button { width: 100%; padding: 4px 8px; border: none; border-radius: 4px; background: #444; color: white; cursor: pointer; font-size: 10px; } .point-inspection button:hover { background: #555; } /* Flow indicator for pulsatile animation */ .flow-indicator { display: flex; align-items: center; gap: 12px; background: rgba(22, 33, 62, 0.95); padding: 8px 16px; border-radius: 8px; font-size: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .flow-time { font-family: monospace; color: #bbe1fa; min-width: 80px; } .flow-velocity-bar { width: 20px; height: 40px; background: #1a1a2e; border-radius: 4px; overflow: hidden; position: relative; } .flow-velocity-fill { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(to top, #22c55e, #f59e0b, #ef4444); transition: height 0.05s ease-out; border-radius: 4px; } .flow-percent { font-family: monospace; color: #888; min-width: 40px; text-align: right; } /* Right sidebar */ .sidebar-right { flex-shrink: 0; width: 0; transition: width 0.3s ease; } .sidebar-right.expanded { width: 280px; padding: 16px; background: #0a1628; border-left: 1px solid #16213e; } /* Geometry editor overlay positioning */ .geometry-editor-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; } .geometry-editor-overlay canvas { pointer-events: auto; } /* Responsive */ @media (max-width: 768px) { .app-main { flex-direction: column; } .sidebar-left { width: 100%; max-height: 40vh; border-right: none; border-bottom: 1px solid #16213e; } .app-header { flex-direction: column; gap: 4px; padding: 8px 16px; } .app-header h1 { font-size: 18px; } .geometry-tools { width: 100%; } }