/* VoxDoc - Multi-Theme Voice Documentation UI */ /* Supports: Clinical Glass, Neon Cyber, Midnight Void, Clinical Light, Aurora Dusk */ /* ===================================================== CSS RESET & VARIABLES ===================================================== */ * { margin: 0; padding: 0; box-sizing: border-box; } :root { /* Dark Theme Colors (Clinical Glass — default) */ --bg-primary: #0f111a; --bg-secondary: #1a1d2e; --bg-card: #161926; --bg-sidebar: rgba(15, 17, 26, 0.95); /* Accent Colors */ --violet-500: #8b5cf6; --violet-600: #7c3aed; --violet-glow: rgba(139, 92, 246, 0.3); --indigo-500: #6366f1; --indigo-600: #4f46e5; --cyan-500: #06b6d4; --cyan-glow: rgba(6, 182, 212, 0.3); --rose-500: #f43f5e; --rose-glow: rgba(244, 63, 94, 0.3); --emerald-500: #10b981; --amber-500: #f59e0b; /* Text Colors */ --text-primary: #ffffff; --text-secondary: #94a3b8; --text-muted: #64748b; /* Border Colors */ --border-color: rgba(148, 163, 184, 0.1); --border-hover: rgba(139, 92, 246, 0.3); /* Transcript / Content Area Colors */ --transcript-bg: #ffffff; --transcript-header-bg: #f8fafc; --transcript-header-border: #e2e8f0; --transcript-content-bg: #fafbfc; --transcript-text: #1e293b; --transcript-muted: #94a3b8; --transcript-shadow: rgba(0, 0, 0, 0.2); /* Result Section Colors */ --result-bg: white; --result-border: #e2e8f0; --result-heading: #64748b; --result-text: #1e293b; --result-detail-text: #475569; --result-detail-border: #f1f5f9; --result-code-bg: #f8fafc; --result-soap-text: #334155; /* Action Button Colors */ --action-btn-bg: transparent; --action-btn-hover-bg: #f1f5f9; --action-btn-color: #94a3b8; --action-btn-hover-color: var(--indigo-600); /* Review Notice */ --notice-bg: linear-gradient(135deg, #fffbeb, #fef3c7); --notice-border: #fcd34d; --notice-strong: #92400e; --notice-text: #a16207; /* Footer */ --footer-bg: white; --footer-border: #e2e8f0; /* Live Transcript */ --live-text-bg: #f8fafc; /* Audio Section */ --audio-bg: linear-gradient(135deg, #f0fdf4, #dcfce7); --audio-border: rgba(16, 185, 129, 0.2); --audio-text: #166534; /* Text Input Indicator */ --text-ind-bg: linear-gradient(135deg, #eff6ff, #dbeafe); --text-ind-border: rgba(59, 130, 246, 0.2); --text-ind-text: #1e40af; /* Main Header */ --header-bg: rgba(15, 17, 26, 0.8); /* Spinner */ --spinner-border: #e2e8f0; --spinner-active: var(--indigo-600); --loading-text: #64748b; /* Logo */ --logo-gradient-start: #fff; --logo-gradient-end: #94a3b8; /* Empty State */ --empty-state-color: #94a3b8; /* Radius */ --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 24px; --radius-2xl: 32px; --radius-full: 9999px; /* Transitions */ --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); --bounce: cubic-bezier(0.34, 1.56, 0.64, 1); } /* High Contrast Theme (WCAG 2.1 AAA) */ [data-theme="high-contrast"] { /* Pure Black & White Foundation */ --bg-primary: #000000; --bg-secondary: #000000; --bg-card: #000000; --bg-sidebar: #000000; /* High Visibility Accents (Yellow/Cyan) */ --violet-500: #ffff00; /* Yellow */ --violet-600: #ffff00; --violet-glow: transparent; --indigo-500: #00ffff; /* Cyan */ --indigo-600: #00ffff; --cyan-500: #00ffff; --cyan-glow: transparent; --rose-500: #ff00ff; /* Magenta */ --rose-glow: transparent; --emerald-500: #00ff00; /* Bright Green */ --amber-500: #ffff00; /* Max Contrast Text */ --text-primary: #ffffff; --text-secondary: #ffffff; --text-muted: #e0e0e0; /* Crisp Borders */ --border-color: #ffffff; --border-hover: #ffff00; /* Transcript / Content Area Colors */ --transcript-bg: #000000; --transcript-header-bg: #000000; --transcript-header-border: #ffffff; --transcript-content-bg: #000000; --transcript-text: #ffffff; --transcript-muted: #e0e0e0; --transcript-shadow: none; /* Result Section Colors */ --result-bg: #000000; --result-border: #ffffff; --result-heading: #ffffff; --result-text: #ffffff; --result-detail-text: #ffffff; --result-detail-border: #ffffff; --result-code-bg: #000000; --result-soap-text: #ffffff; /* Action Button Colors */ --action-btn-bg: transparent; --action-btn-hover-bg: #ffff00; --action-btn-color: #ffffff; --action-btn-hover-color: #000000; /* Review Notice */ --notice-bg: #000000; --notice-border: #ffff00; --notice-strong: #ffff00; --notice-text: #ffffff; /* Main Header */ --header-bg: #000000; /* Disable Shadows for clarity */ box-shadow: none !important; } /* Utilities */ .hidden { display: none !important; } /* ===================================================== BASE STYLES ===================================================== */ html, body { height: 100%; margin: 0; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; background: var(--bg-primary); color: var(--text-secondary); line-height: 1.6; -webkit-font-smoothing: antialiased; } /* Global Focus Indicator for Accessibility */ :focus-visible { outline: 3px solid var(--violet-500) !important; outline-offset: 2px !important; transition: outline-color 0.2s ease; } [data-theme="high-contrast"] :focus-visible { outline: 4px solid var(--violet-500) !important; outline-offset: 4px !important; } /* Smooth theme transitions */ body, body .sidebar, body .main-header, body .voice-card, body .text-input-card, body .transcript-card, body .transcript-header, body .transcript-content, body .transcript-footer, body .settings-view, body .settings-card, body .result-section, body .soap-section-card, body .soap-card-header, body .soap-card-actions, body .action-card { transition: background-color 0.4s ease, color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease; } .app-container { display: flex; height: 100vh; overflow: hidden; } /* ===================================================== SIDEBAR ===================================================== */ .sidebar-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.6); z-index: 40; opacity: 0; pointer-events: none; transition: opacity 0.3s; } .sidebar-overlay.active { opacity: 1; pointer-events: auto; } .sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: 280px; background: var(--bg-sidebar); backdrop-filter: blur(20px); border-right: 1px solid var(--border-color); z-index: 50; display: flex; flex-direction: column; transform: translateX(-100%); transition: transform 0.3s ease; } .sidebar.open { transform: translateX(0); } @media (min-width: 1024px) { .sidebar { position: static; transform: translateX(0); } .sidebar-overlay { display: none; } } .sidebar-header { padding: 24px; display: flex; align-items: center; justify-content: space-between; } .logo { display: flex; align-items: center; gap: 12px; } .logo-icon { width: 40px; height: 40px; border-radius: var(--radius-lg); background: linear-gradient(135deg, var(--violet-600), var(--indigo-600)); display: flex; align-items: center; justify-content: center; box-shadow: 0 8px 24px var(--violet-glow); } .logo-icon svg { width: 22px; height: 22px; color: white; } .logo-text { font-size: 1.25rem; font-weight: 700; background: linear-gradient(135deg, var(--logo-gradient-start), var(--logo-gradient-end)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .close-sidebar-btn { display: flex; padding: 8px; background: transparent; border: none; color: var(--text-muted); cursor: pointer; border-radius: var(--radius-sm); transition: var(--transition); } .close-sidebar-btn:hover { color: var(--text-primary); background: rgba(255, 255, 255, 0.05); } @media (min-width: 1024px) { .close-sidebar-btn { display: none; } } /* Sidebar Navigation */ .sidebar-nav { flex: 1; padding: 0 16px; overflow-y: auto; } .nav-label { font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-muted); padding: 0 16px; margin-bottom: 12px; } .nav-item { width: 100%; display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: transparent; border: 1px solid transparent; border-radius: var(--radius-lg); color: var(--text-muted); font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: var(--transition); margin-bottom: 4px; text-align: left; } .nav-item svg { width: 20px; height: 20px; flex-shrink: 0; } .nav-item:hover { background: rgba(255, 255, 255, 0.03); color: var(--text-primary); } .nav-item.active { background: rgba(139, 92, 246, 0.1); border-color: rgba(139, 92, 246, 0.2); color: var(--violet-500); } .nav-item.active svg { stroke-width: 2.5; } .nav-indicator { display: none; width: 6px; height: 6px; border-radius: 50%; background: var(--violet-500); margin-left: auto; box-shadow: 0 0 8px var(--violet-glow); } .nav-item.active .nav-indicator { display: block; } /* Recent Documents */ .recent-docs { margin-top: 8px; } .recent-doc-item { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: var(--radius-md); cursor: pointer; transition: var(--transition); } .recent-doc-item:hover { background: rgba(255, 255, 255, 0.03); } .doc-icon { width: 32px; height: 32px; border-radius: var(--radius-sm); background: var(--bg-secondary); display: flex; align-items: center; justify-content: center; color: var(--text-muted); transition: var(--transition); } .recent-doc-item:hover .doc-icon { color: var(--indigo-500); } .doc-icon svg { width: 14px; height: 14px; } .doc-info { flex: 1; overflow: hidden; } .doc-title { font-size: 0.85rem; font-weight: 500; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .doc-date { font-size: 0.75rem; color: var(--text-muted); } /* Sidebar Footer */ .sidebar-footer { padding: 16px; border-top: 1px solid var(--border-color); } .user-card { display: flex; align-items: center; gap: 12px; padding: 12px; background: rgba(255, 255, 255, 0.02); border: 1px solid var(--border-color); border-radius: var(--radius-lg); } .user-avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, var(--rose-500), #ec4899); display: flex; align-items: center; justify-content: center; color: white; font-weight: 700; font-size: 0.9rem; } .user-info { flex: 1; } .user-name { font-size: 0.9rem; font-weight: 600; color: var(--text-primary); } .user-plan { font-size: 0.75rem; color: var(--text-muted); } /* ===================================================== MAIN CONTENT ===================================================== */ .main-content { flex: 1; min-width: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; } /* View containers just hold content, parent scrolls */ .view-container { } /* Header — sticky so it stays visible while scrolling */ .main-header { position: sticky; top: 0; z-index: 30; height: 72px; padding: 0 24px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border-color); background: var(--header-bg); backdrop-filter: blur(12px); } .header-left { display: flex; align-items: center; gap: 16px; } .menu-btn { display: flex; padding: 10px; background: transparent; border: none; color: var(--text-muted); cursor: pointer; border-radius: var(--radius-sm); transition: var(--transition); } .menu-btn:hover { background: rgba(255, 255, 255, 0.05); color: var(--text-primary); } .menu-btn svg { width: 24px; height: 24px; } @media (min-width: 1024px) { .menu-btn { display: none; } } .header-title h1 { font-size: 1.25rem; font-weight: 600; color: var(--text-primary); } .header-title p { font-size: 0.75rem; color: var(--text-muted); } .header-right { display: flex; align-items: center; gap: 16px; } .compliance-badge { display: flex; align-items: center; gap: 8px; padding: 8px 16px; background: rgba(245, 158, 11, 0.1); border: 1px solid rgba(245, 158, 11, 0.2); border-radius: var(--radius-full); color: var(--amber-500); font-size: 0.8rem; font-weight: 600; } .compliance-badge svg { width: 16px; height: 16px; } /* ===================================================== CONTENT GRID ===================================================== */ .content-grid { display: grid; grid-template-columns: 1fr; gap: 24px; padding: 24px; } @media (min-width: 1024px) { .content-grid { grid-template-columns: 1.2fr 1fr; padding: 32px; } } .voice-column { display: flex; flex-direction: column; gap: 20px; } .transcript-column { min-height: 500px; } @media (min-width: 1024px) { .transcript-column { min-height: auto; } } /* ===================================================== VOICE CARD ===================================================== */ .voice-card { position: relative; background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius-2xl); overflow: hidden; min-height: 380px; } .voice-card-glow { position: absolute; border-radius: 50%; filter: blur(80px); pointer-events: none; } .voice-card-glow.glow-1 { top: -50px; right: -50px; width: 300px; height: 300px; background: var(--violet-glow); } .voice-card-glow.glow-2 { bottom: -50px; left: -50px; width: 200px; height: 200px; background: var(--indigo-glow); } .voice-card-content { position: relative; padding: 40px; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 380px; } .voice-card-header { text-align: center; margin-bottom: 32px; } .voice-card-header h2 { font-size: 1.75rem; font-weight: 700; color: var(--text-primary); margin-bottom: 8px; } .voice-card-header p { color: var(--text-muted); font-size: 0.95rem; } /* Waveform Visualizer */ .waveform-container { display: flex; align-items: center; justify-content: center; gap: 4px; height: 80px; width: 100%; max-width: 300px; margin-bottom: 32px; } .waveform-bar { width: 6px; height: 6px; background: linear-gradient(to top, var(--violet-500), var(--indigo-500)); border-radius: var(--radius-full); transition: height 0.15s ease; opacity: 0.3; } .waveform-container.recording .waveform-bar { opacity: 1; animation: waveform 0.8s ease-in-out infinite; } .waveform-container.recording .waveform-bar:nth-child(1) { animation-delay: 0.0s; } .waveform-container.recording .waveform-bar:nth-child(2) { animation-delay: 0.05s; } .waveform-container.recording .waveform-bar:nth-child(3) { animation-delay: 0.1s; } .waveform-container.recording .waveform-bar:nth-child(4) { animation-delay: 0.15s; } .waveform-container.recording .waveform-bar:nth-child(5) { animation-delay: 0.2s; } .waveform-container.recording .waveform-bar:nth-child(6) { animation-delay: 0.25s; } .waveform-container.recording .waveform-bar:nth-child(7) { animation-delay: 0.3s; } .waveform-container.recording .waveform-bar:nth-child(8) { animation-delay: 0.35s; } .waveform-container.recording .waveform-bar:nth-child(9) { animation-delay: 0.4s; } .waveform-container.recording .waveform-bar:nth-child(10) { animation-delay: 0.45s; } .waveform-container.recording .waveform-bar:nth-child(11) { animation-delay: 0.5s; } .waveform-container.recording .waveform-bar:nth-child(12) { animation-delay: 0.55s; } .waveform-container.recording .waveform-bar:nth-child(13) { animation-delay: 0.6s; } .waveform-container.recording .waveform-bar:nth-child(14) { animation-delay: 0.65s; } .waveform-container.recording .waveform-bar:nth-child(15) { animation-delay: 0.7s; } .waveform-container.recording .waveform-bar:nth-child(16) { animation-delay: 0.75s; } .waveform-container.recording .waveform-bar:nth-child(17) { animation-delay: 0.8s; } .waveform-container.recording .waveform-bar:nth-child(18) { animation-delay: 0.85s; } .waveform-container.recording .waveform-bar:nth-child(19) { animation-delay: 0.9s; } .waveform-container.recording .waveform-bar:nth-child(20) { animation-delay: 0.95s; } @keyframes waveform { 0%, 100% { height: 8px; } 50% { height: 48px; } } /* Record Button */ .record-btn-wrapper { position: relative; display: flex; align-items: center; justify-content: center; } .record-ripple { position: absolute; width: 96px; height: 96px; border-radius: 50%; background: var(--violet-glow); opacity: 0; pointer-events: none; } .record-ripple.active { animation: ripple 1.5s ease-out infinite; } @keyframes ripple { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.8); opacity: 0; } } .record-btn { position: relative; z-index: 1; width: 88px; height: 88px; border-radius: 50%; border: none; background: linear-gradient(135deg, var(--violet-600), var(--indigo-600)); color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 8px 32px var(--violet-glow); transition: all 0.3s var(--bounce); } .record-btn:hover { transform: scale(1.05); box-shadow: 0 12px 40px var(--violet-glow); } .record-btn:active { transform: scale(0.98); } .record-btn.recording { background: linear-gradient(135deg, var(--rose-500), #e11d48); box-shadow: 0 8px 32px var(--rose-glow); animation: pulse-glow 2s ease-in-out infinite; } @keyframes pulse-glow { 0%, 100% { box-shadow: 0 8px 32px var(--rose-glow); } 50% { box-shadow: 0 8px 48px rgba(244, 63, 94, 0.5); } } .record-btn svg { width: 32px; height: 32px; } .mic-icon, .stop-icon { transition: opacity 0.2s, transform 0.2s; } .hidden { display: none !important; } /* Duration Display */ .duration-display { margin-top: 24px; padding: 8px 20px; background: rgba(255, 255, 255, 0.05); border: 1px solid var(--border-color); border-radius: var(--radius-full); } .duration-display span { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 1rem; font-weight: 500; color: var(--violet-500); } /* ===================================================== TEXT INPUT CARD ===================================================== */ .text-input-card { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius-xl); padding: 24px; } .divider-line { display: flex; align-items: center; margin-bottom: 16px; } .divider-line::before, .divider-line::after { content: ''; flex: 1; height: 1px; background: var(--border-color); } .divider-line span { padding: 0 16px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.1em; color: var(--text-muted); } .text-input { width: 100%; padding: 16px; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary); font-family: inherit; font-size: 0.95rem; resize: vertical; transition: var(--transition); } .text-input:focus { outline: none; border-color: var(--violet-500); box-shadow: 0 0 0 3px var(--violet-glow); } .text-input::placeholder { color: var(--text-muted); } /* ===================================================== IMAGE UPLOAD CARD ===================================================== */ .image-upload-card { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius-xl); padding: 24px; } .image-drop-zone { width: 100%; min-height: 140px; border: 2px dashed var(--border-color); border-radius: var(--radius-md); display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; background: rgba(255, 255, 255, 0.02); cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; } .image-drop-zone:hover, .image-drop-zone.drag-over { border-color: var(--violet-500); background: rgba(139, 92, 246, 0.05); } .drop-zone-content { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 12px; } .drop-zone-content svg { width: 32px; height: 32px; color: var(--text-muted); } .image-drop-zone:hover .drop-zone-content svg { color: var(--violet-500); } .drop-zone-content p { font-size: 0.9rem; font-weight: 500; color: var(--text-primary); } .drop-zone-content p span { font-size: 0.8rem; font-weight: 400; color: var(--text-muted); } .file-input-hidden { position: absolute; width: 100%; height: 100%; top: 0; left: 0; opacity: 0; cursor: pointer; } /* Image Preview */ .image-preview { width: 100%; display: flex; align-items: center; gap: 16px; padding: 12px; background: var(--bg-secondary); border-radius: var(--radius-md); border: 1px solid var(--border-color); position: relative; z-index: 2; /* Above file input */ } .preview-wrapper { position: relative; width: 64px; height: 64px; border-radius: var(--radius-sm); overflow: hidden; flex-shrink: 0; border: 1px solid rgba(255, 255, 255, 0.1); } #imagePreview { width: 100%; height: 100%; object-fit: cover; } .remove-image-btn { position: absolute; top: -6px; right: -6px; width: 24px; height: 24px; border-radius: 50%; background: var(--rose-500); color: white; border: 2px solid var(--bg-secondary); display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; transition: var(--transition); transform: scale(0.8); } .preview-wrapper:hover .remove-image-btn { opacity: 1; transform: scale(1); } .remove-image-btn svg { width: 14px; height: 14px; } .image-details { flex: 1; overflow: hidden; } .image-details .filename { font-size: 0.9rem; font-weight: 500; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 4px; } .image-details .filesize { font-size: 0.75rem; color: var(--text-muted); } /* Analyzing State */ .image-analyzing { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 16px; } .spinner.small { width: 24px; height: 24px; border-width: 3px; } .image-analyzing p { font-size: 0.85rem; color: var(--violet-500); font-weight: 500; animation: pulse 1.5s infinite; } /* Visual Findings Results Card */ .soap-label-vi { background: rgba(16, 185, 129, 0.1); color: var(--emerald-500); border: 1px solid rgba(16, 185, 129, 0.2); } .image-findings-thumbnail-container { margin: 0 20px 20px; padding: 12px; background: var(--result-code-bg); border: 1px solid var(--result-border); border-radius: var(--radius-md); display: none; } .image-findings-thumbnail-container.active { display: flex; align-items: flex-start; gap: 16px; } .findings-thumbnail { width: 80px; height: 80px; border-radius: var(--radius-sm); object-fit: cover; border: 2px solid white; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); flex-shrink: 0; } .findings-meta { flex: 1; font-size: 0.85rem; } .findings-meta strong { color: var(--result-text); display: block; margin-bottom: 4px; } .findings-meta span { color: var(--result-detail-text); } /* ===================================================== ACTION CARDS ===================================================== */ .action-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .action-card { background: rgba(255, 255, 255, 0.02); border: 1px solid var(--border-color); border-radius: var(--radius-xl); padding: 20px; cursor: pointer; transition: var(--transition); } .action-card:hover { border-color: var(--border-hover); background: rgba(255, 255, 255, 0.03); } .action-icon { width: 44px; height: 44px; border-radius: var(--radius-lg); display: flex; align-items: center; justify-content: center; margin-bottom: 12px; transition: transform 0.3s var(--bounce); } .action-card:hover .action-icon { transform: scale(1.1); } .action-icon.violet { background: rgba(139, 92, 246, 0.1); color: var(--violet-500); } .action-icon.cyan { background: rgba(6, 182, 212, 0.1); color: var(--cyan-500); } .action-icon svg { width: 22px; height: 22px; } .action-text h3 { font-size: 0.9rem; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; } .action-text p { font-size: 0.75rem; color: var(--text-muted); } /* ===================================================== SUBMIT BUTTON ===================================================== */ .submit-btn { width: 100%; padding: 18px 32px; background: linear-gradient(135deg, var(--violet-600), var(--indigo-600)); border: none; border-radius: var(--radius-xl); color: white; font-size: 1rem; font-weight: 600; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 12px; box-shadow: 0 8px 24px var(--violet-glow); transition: all 0.3s var(--bounce); } .submit-btn:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 12px 32px var(--violet-glow); } .submit-btn:disabled { opacity: 0.5; cursor: not-allowed; filter: grayscale(50%); } .submit-btn svg { width: 20px; height: 20px; } /* ===================================================== TRANSCRIPT CARD ===================================================== */ .transcript-card { height: 100%; display: flex; flex-direction: column; background: var(--transcript-bg); border-radius: var(--radius-2xl); overflow: hidden; box-shadow: 0 24px 48px var(--transcript-shadow); } .transcript-header { padding: 20px 24px; background: var(--transcript-header-bg); border-bottom: 1px solid var(--transcript-header-border); display: flex; align-items: center; justify-content: space-between; } .transcript-status { display: flex; align-items: center; gap: 10px; } .live-indicator { width: 8px; height: 8px; border-radius: 50%; background: var(--emerald-500); animation: pulse-indicator 2s ease-in-out infinite; } @keyframes pulse-indicator { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .transcript-status h3 { font-size: 1rem; font-weight: 600; color: var(--transcript-text); } .transcript-actions { display: flex; gap: 8px; } .action-btn { padding: 8px; background: var(--action-btn-bg); border: none; border-radius: var(--radius-sm); color: var(--action-btn-color); cursor: pointer; transition: var(--transition); } .action-btn:hover { background: var(--action-btn-hover-bg); color: var(--action-btn-hover-color); } .action-btn svg { width: 18px; height: 18px; } /* Transcript Content */ .transcript-content { flex: 1; padding: 24px; overflow-y: auto; background: var(--transcript-content-bg); } /* Empty State */ .empty-state { height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--empty-state-color); text-align: center; } .empty-state svg { width: 64px; height: 64px; margin-bottom: 16px; opacity: 0.3; } .empty-state p { font-size: 0.95rem; } /* Loading State */ /* Follow-up Questions */ .followup-state { padding: 24px; } .followup-header { text-align: center; margin-bottom: 20px; } .followup-header svg { color: var(--violet-500); margin-bottom: 8px; } .followup-header h4 { color: var(--text-primary); font-size: 1.1rem; margin-bottom: 4px; } .followup-subtitle { color: var(--text-muted); font-size: 0.85rem; } .followup-questions { display: flex; flex-direction: column; gap: 16px; margin-bottom: 20px; } .followup-question-item { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-xl, 12px); padding: 16px; } .followup-question-item label { display: block; color: var(--text-primary); font-size: 0.9rem; font-weight: 500; margin-bottom: 8px; } .followup-question-item textarea { width: 100%; min-height: 60px; padding: 10px 12px; background: var(--bg-card); color: var(--text-primary); border: 1px solid var(--border-color); border-radius: 8px; font-family: inherit; font-size: 0.85rem; resize: vertical; } .followup-question-item textarea:focus { outline: none; border-color: var(--violet-500); } .followup-actions { display: flex; flex-direction: column; gap: 10px; } .followup-skip-btn { padding: 12px; background: transparent; border: 1px solid var(--border-color); border-radius: var(--radius-xl, 12px); color: var(--text-muted); font-size: 0.85rem; cursor: pointer; transition: all 0.2s; } .followup-skip-btn:hover { border-color: var(--text-secondary); color: var(--text-secondary); } .loading-state { height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--loading-text); } /* Queue Banner */ .queue-banner { margin-top: 16px; padding: 12px 20px; background: var(--bg-secondary, #1a1d2e); border: 1px solid var(--accent-primary, #6c63ff); border-radius: 10px; display: flex; align-items: center; gap: 12px; animation: queuePulse 2s ease-in-out infinite; } .queue-banner.hidden { display: none; } .queue-icon { color: var(--accent-primary, #6c63ff); flex-shrink: 0; } .queue-info { display: flex; flex-direction: column; gap: 2px; font-size: 0.85rem; } .queue-info #queuePosition { font-weight: 600; color: var(--text-primary, #e2e8f0); } .queue-info #queueWait { color: var(--text-secondary, #94a3b8); font-size: 0.8rem; } @keyframes queuePulse { 0%, 100% { border-color: var(--accent-primary, #6c63ff); } 50% { border-color: var(--accent-secondary, #a78bfa); } } /* Rate Limit Toast */ .rate-limit-toast { position: fixed; top: 20px; right: 20px; padding: 14px 20px; background: #dc2626; color: white; border-radius: 10px; font-size: 0.9rem; font-weight: 500; z-index: 9999; animation: slideInRight 0.3s ease-out; max-width: 400px; } @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* ===================================================== MONITORING DASHBOARD ===================================================== */ .monitoring-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .monitoring-header .section-title { font-size: 1.3rem; font-weight: 700; color: var(--text-primary, #e2e8f0); } .monitoring-actions { display: flex; align-items: center; gap: 12px; } .uptime-badge { font-size: 0.8rem; padding: 4px 12px; background: var(--bg-secondary, #1a1d2e); border: 1px solid var(--border-color, #2a2d3e); border-radius: 20px; color: var(--text-secondary, #94a3b8); } .btn-icon { background: none; border: 1px solid var(--border-color, #2a2d3e); border-radius: 8px; padding: 6px; cursor: pointer; color: var(--text-secondary, #94a3b8); transition: color 0.2s, border-color 0.2s; } .btn-icon:hover { color: var(--accent-primary, #6c63ff); border-color: var(--accent-primary, #6c63ff); } .monitoring-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px; } .monitor-card { background: var(--bg-card, #161926); border: 1px solid var(--border-color, #2a2d3e); border-radius: 12px; padding: 16px; transition: border-color 0.2s; } .monitor-card.wide { grid-column: span 2; } .monitor-card.alert-warning { border-color: #f59e0b; } .monitor-card.alert-critical { border-color: #ef4444; } .monitor-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } .monitor-model-name { font-weight: 600; font-size: 0.95rem; color: var(--text-primary, #e2e8f0); } .monitor-status-dot { width: 10px; height: 10px; border-radius: 50%; background: #6b7280; } .monitor-status-dot.ready { background: #22c55e; } .monitor-status-dot.not-ready { background: #ef4444; } .monitor-stats { display: flex; flex-direction: column; gap: 8px; } .stat-row { display: flex; justify-content: space-between; font-size: 0.83rem; } .stat-row span:first-child { color: var(--text-secondary, #94a3b8); } .stat-row span:last-child { color: var(--text-primary, #e2e8f0); font-weight: 500; font-variant-numeric: tabular-nums; } /* Alerts Banner */ .alerts-banner { margin-bottom: 16px; display: flex; flex-direction: column; gap: 8px; } .alerts-banner.hidden { display: none; } .alert-item { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-radius: 8px; font-size: 0.85rem; font-weight: 500; } .alert-item.warning { background: rgba(245, 158, 11, 0.12); border: 1px solid rgba(245, 158, 11, 0.4); color: #fbbf24; } .alert-item.critical { background: rgba(239, 68, 68, 0.12); border: 1px solid rgba(239, 68, 68, 0.4); color: #f87171; } .alert-severity { font-size: 0.7rem; text-transform: uppercase; font-weight: 700; padding: 2px 6px; border-radius: 4px; } .alert-item.warning .alert-severity { background: rgba(245, 158, 11, 0.25); } .alert-item.critical .alert-severity { background: rgba(239, 68, 68, 0.25); } @media (max-width: 768px) { .monitoring-grid { grid-template-columns: 1fr; } .monitor-card.wide { grid-column: span 1; } } .spinner { width: 48px; height: 48px; border: 3px solid var(--spinner-border); border-top-color: var(--spinner-active); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 16px; } @keyframes spin { to { transform: rotate(360deg); } } /* ===================================================== LIVE TRANSCRIPT STATE (Streaming) ===================================================== */ .live-transcript-state { padding: 8px 0; min-height: 200px; } .live-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.3); border-radius: var(--radius-full); font-size: 0.7rem; font-weight: 700; color: #ef4444; letter-spacing: 0.1em; margin-bottom: 16px; } .live-dot { width: 8px; height: 8px; background: #ef4444; border-radius: 50%; animation: live-pulse 1.5s ease-in-out infinite; } @keyframes live-pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7); } 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(239, 68, 68, 0); } } .live-transcript-text { font-size: 1.05rem; line-height: 1.8; color: var(--transcript-text); padding: 16px; background: var(--live-text-bg); border-radius: var(--radius-md); border-left: 3px solid #ef4444; min-height: 120px; position: relative; word-wrap: break-word; } .live-transcript-text .live-placeholder { color: var(--transcript-muted); font-style: italic; } .live-transcript-text .live-word { animation: wordFadeIn 0.3s ease-out forwards; opacity: 0; } @keyframes wordFadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } .live-cursor { display: inline-block; width: 2px; height: 1.1em; background: #ef4444; margin-left: 2px; vertical-align: text-bottom; animation: cursorBlink 1s step-end infinite; } @keyframes cursorBlink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } /* Results Container */ .results-container { display: flex; flex-direction: column; gap: 20px; } /* Review Notice */ .review-notice { display: flex; gap: 12px; padding: 16px; background: var(--notice-bg); border: 1px solid var(--notice-border); border-radius: var(--radius-md); } .review-notice svg { width: 20px; height: 20px; color: var(--amber-500); flex-shrink: 0; margin-top: 2px; } .review-notice strong { display: block; color: var(--notice-strong); font-weight: 600; margin-bottom: 4px; } .review-notice p { font-size: 0.85rem; color: var(--notice-text); } .compliance-meta-notice { margin-top: 8px; font-size: 0.78rem; line-height: 1.45; opacity: 0.9; } .reliability-legend { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; } /* Result Sections */ .result-section { padding: 16px; background: var(--result-bg); border: 1px solid var(--result-border); border-radius: var(--radius-md); } .result-section h4 { font-size: 0.85rem; font-weight: 600; color: var(--result-heading); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; } .transcription-text { font-size: 1rem; line-height: 1.7; color: var(--result-text); padding: 16px; background: var(--result-code-bg); border-radius: var(--radius-sm); border-left: 3px solid var(--cyan-500); } .chief-complaint { font-size: 1.1rem; font-weight: 600; color: var(--result-text); } .symptom-details ul { list-style: none; padding: 0; } .symptom-details li { padding: 8px 0; border-bottom: 1px solid var(--result-detail-border); color: var(--result-detail-text); } .symptom-details li:last-child { border-bottom: none; } .symptom-details strong { color: var(--result-text); } .confidence-list { list-style: none; margin: 0; padding: 0; } .confidence-row { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--result-detail-border); } .confidence-row:last-child { border-bottom: none; } .confidence-field { flex: 1; color: var(--result-detail-text); line-height: 1.45; } .confidence-field strong { color: var(--result-text); } .confidence-pill { display: inline-flex; align-items: center; white-space: nowrap; border-radius: var(--radius-full); padding: 4px 10px; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.02em; border: 1px solid transparent; } .confidence-green { background: rgba(16, 185, 129, 0.18); color: #10b981; border-color: rgba(16, 185, 129, 0.32); } .confidence-yellow { background: rgba(245, 158, 11, 0.18); color: #f59e0b; border-color: rgba(245, 158, 11, 0.32); } .confidence-red { background: rgba(239, 68, 68, 0.18); color: #ef4444; border-color: rgba(239, 68, 68, 0.32); } .soap-note { padding: 16px; background: var(--result-code-bg); border-radius: var(--radius-sm); border-left: 3px solid var(--emerald-500); white-space: pre-wrap; line-height: 1.8; color: var(--result-soap-text); } /* Audio Playback */ .audio-playback-section { margin-top: 16px; padding: 16px; background: var(--audio-bg); border-radius: var(--radius-md); border: 1px solid var(--audio-border); } .audio-playback-header { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; color: var(--audio-text); font-weight: 600; font-size: 0.9rem; } .audio-playback-header svg { width: 18px; height: 18px; } .audio-player { width: 100%; height: 40px; border-radius: var(--radius-sm); } /* Text Input Indicator */ .text-input-indicator { margin-top: 16px; padding: 12px 16px; background: var(--text-ind-bg); border-radius: var(--radius-md); border: 1px solid var(--text-ind-border); display: flex; align-items: center; gap: 8px; color: var(--text-ind-text); font-weight: 500; font-size: 0.9rem; } .text-input-indicator svg { width: 18px; height: 18px; } /* Badges */ .badge { padding: 4px 10px; border-radius: var(--radius-full); font-size: 0.65rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; margin-left: auto; } .badge.success { background: var(--emerald-500); color: white; } .badge.info { background: #3b82f6; color: white; } /* Transcript Footer */ .transcript-footer { padding: 16px 24px; background: var(--footer-bg); border-top: 1px solid var(--footer-border); } .disclaimer { font-size: 0.75rem; color: var(--transcript-muted); text-align: center; } /* ===================================================== RESPONSIVE ===================================================== */ @media (max-width: 640px) { .content-grid { padding: 16px; } .voice-card-content { padding: 24px; } .voice-card-header h2 { font-size: 1.5rem; } .action-cards { grid-template-columns: 1fr; } .compliance-badge span { display: none; } } /* ===================================================== SETTINGS DASHBOARD ("NEURAL CONFIG") ===================================================== */ .settings-view { padding: 32px; height: 100%; overflow-y: auto; background: var(--bg-primary); } .settings-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 32px; } .settings-header h2 { font-size: 1.75rem; font-weight: 700; color: var(--text-primary); } .neural-badge { display: flex; align-items: center; gap: 8px; padding: 6px 16px; background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.2); border-radius: var(--radius-full); color: var(--emerald-500); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.1em; } .pulse-dot { width: 8px; height: 8px; background: var(--emerald-500); border-radius: 50%; box-shadow: 0 0 12px var(--emerald-500); animation: pulse-dot 2s infinite; } @keyframes pulse-dot { 0% { transform: scale(0.95); opacity: 0.7; } 50% { transform: scale(1.2); opacity: 1; box-shadow: 0 0 20px var(--emerald-500); } 100% { transform: scale(0.95); opacity: 0.7; } } /* Settings Grid */ .settings-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; } .settings-card { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius-xl); padding: 24px; transition: var(--transition); } .settings-card:hover { border-color: var(--violet-500); box-shadow: 0 0 32px rgba(139, 92, 246, 0.05); } .settings-card.full-width { grid-column: 1 / -1; } .settings-card h3 { font-size: 1rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 20px; text-transform: uppercase; letter-spacing: 0.05em; } .auth-status-text { margin-bottom: 16px; font-size: 0.85rem; color: var(--text-muted); } .auth-login-form { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; align-items: end; } .auth-field { display: flex; flex-direction: column; gap: 6px; } .auth-field label { font-size: 0.75rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-muted); } .auth-field input { width: 100%; padding: 10px 12px; border: 1px solid var(--border-color); border-radius: var(--radius-md); background: var(--bg-secondary); color: var(--text-primary); font-size: 0.9rem; } .auth-field input:focus { outline: none; border-color: var(--violet-500); box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.18); } .auth-actions { display: flex; gap: 8px; flex-wrap: wrap; } .auth-btn { padding: 10px 14px; border: 1px solid var(--border-color); border-radius: var(--radius-md); background: var(--bg-secondary); color: var(--text-primary); font-size: 0.85rem; font-weight: 600; } .auth-btn.primary { background: var(--violet-500); border-color: var(--violet-500); color: #fff; } .auth-btn:hover { opacity: 0.92; } .auth-role-hint { margin-top: 12px; font-size: 0.78rem; color: var(--text-muted); } @media (max-width: 640px) { .auth-login-form { grid-template-columns: 1fr; } } /* Theme Matrix */ .theme-options { display: flex; gap: 20px; flex-wrap: wrap; } .theme-card { flex: 1; min-width: 140px; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 16px; cursor: pointer; text-align: center; transition: var(--transition); } .theme-card:hover { background: rgba(255, 255, 255, 0.05); transform: translateY(-2px); } .theme-card.active { border-color: var(--violet-500); background: rgba(139, 92, 246, 0.1); } .theme-preview { height: 60px; border-radius: var(--radius-md); margin-bottom: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); } .theme-preview.glass { background: linear-gradient(135deg, #1a1d2e 0%, #0f111a 100%); border: 1px solid rgba(139, 92, 246, 0.3); } .theme-preview.neon { background: #000; border: 1px solid #ff00ff; box-shadow: 0 0 12px rgba(255, 0, 255, 0.4); } .theme-preview.midnight { background: #000; border: 1px solid #333; } .theme-preview.light { background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); border: 1px solid rgba(99, 102, 241, 0.3); } .theme-preview.aurora { background: linear-gradient(135deg, #1a1525 0%, #2d1b3d 50%, #1a1525 100%); border: 1px solid rgba(251, 146, 60, 0.4); box-shadow: 0 0 12px rgba(251, 146, 60, 0.2); } .theme-card span { font-size: 0.85rem; font-weight: 500; color: var(--text-primary); } /* Sliders */ .slider-group { margin-bottom: 24px; } .slider-group:last-child { margin-bottom: 0; } .slider-group label { display: flex; justify-content: space-between; margin-bottom: 12px; font-size: 0.9rem; color: var(--text-secondary); } .value-display { color: var(--violet-500); font-family: monospace; font-weight: 600; } .neural-slider { -webkit-appearance: none; appearance: none; width: 100%; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: var(--radius-full); outline: none; } .neural-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; background: var(--violet-500); border-radius: 50%; cursor: pointer; box-shadow: 0 0 16px var(--violet-500); transition: transform 0.2s; } .neural-slider::-webkit-slider-thumb:hover { transform: scale(1.2); } /* Neural Graph */ .neural-graph-container { height: 140px; background: rgba(0, 0, 0, 0.2); border-radius: var(--radius-lg); border: 1px solid var(--border-color); position: relative; overflow: hidden; } #neuralGraph { width: 100%; height: 100%; } .graph-overlay { position: absolute; top: 12px; right: 12px; display: flex; flex-direction: column; gap: 4px; align-items: flex-end; } .stat-item { font-size: 0.7rem; font-family: monospace; color: var(--text-muted); } .stat-item .val { color: var(--emerald-500); font-weight: 600; margin-left: 8px; } /* Toggles Row */ .toggles-row { display: flex; flex-wrap: wrap; gap: 32px; } .toggle-item { flex: 1; min-width: 240px; display: flex; align-items: center; justify-content: space-between; } .toggle-info { display: flex; flex-direction: column; } .toggle-label { font-size: 0.95rem; color: var(--text-primary); font-weight: 500; } .toggle-desc { font-size: 0.8rem; color: var(--text-muted); } /* Switch Toggle */ .switch { position: relative; display: inline-block; width: 50px; height: 28px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.1); transition: .4s; border-radius: 34px; } .slider:before { position: absolute; content: ""; height: 20px; width: 20px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; } input:checked+.slider { background-color: var(--violet-500); box-shadow: 0 0 16px var(--violet-glow); } input:checked+.slider:before { transform: translateX(22px); } /* ===================================================== THEME VARIANTS ===================================================== */ /* Neon Cyber Theme */ body.theme-neon { --bg-primary: #050505; --bg-secondary: #0a0a0a; --bg-card: #0f0f0f; --bg-sidebar: rgba(5, 5, 5, 0.95); --violet-500: #d946ef; --violet-600: #c026d3; --violet-glow: rgba(217, 70, 239, 0.4); --indigo-500: #06b6d4; --indigo-600: #0891b2; --indigo-glow: rgba(6, 182, 212, 0.4); --text-primary: #ffffff; --text-muted: #71717a; --border-color: rgba(217, 70, 239, 0.2); /* Content area — dark neon */ --transcript-bg: #0a0a0a; --transcript-header-bg: #0f0f0f; --transcript-header-border: rgba(217, 70, 239, 0.15); --transcript-content-bg: #080808; --transcript-text: #f0f0f0; --transcript-muted: #71717a; --transcript-shadow: rgba(217, 70, 239, 0.15); --result-bg: #0f0f0f; --result-border: rgba(217, 70, 239, 0.15); --result-heading: #a78bfa; --result-text: #e4e4e7; --result-detail-text: #a1a1aa; --result-detail-border: rgba(217, 70, 239, 0.08); --result-code-bg: #0a0a0a; --result-soap-text: #d4d4d8; --action-btn-hover-bg: rgba(217, 70, 239, 0.1); --action-btn-color: #71717a; --action-btn-hover-color: #d946ef; --notice-bg: linear-gradient(135deg, rgba(217, 70, 239, 0.08), rgba(6, 182, 212, 0.05)); --notice-border: rgba(217, 70, 239, 0.25); --notice-strong: #d946ef; --notice-text: #a78bfa; --footer-bg: #0a0a0a; --footer-border: rgba(217, 70, 239, 0.15); --live-text-bg: #0f0f0f; --audio-bg: linear-gradient(135deg, rgba(6, 182, 212, 0.08), rgba(6, 182, 212, 0.04)); --audio-border: rgba(6, 182, 212, 0.2); --audio-text: #22d3ee; --text-ind-bg: linear-gradient(135deg, rgba(217, 70, 239, 0.08), rgba(217, 70, 239, 0.04)); --text-ind-border: rgba(217, 70, 239, 0.2); --text-ind-text: #d946ef; --header-bg: rgba(5, 5, 5, 0.9); --spinner-border: rgba(217, 70, 239, 0.15); --spinner-active: #d946ef; --loading-text: #71717a; --logo-gradient-start: #d946ef; --logo-gradient-end: #06b6d4; --empty-state-color: #52525b; } body.theme-neon .neural-slider::-webkit-slider-thumb { background: #d946ef; box-shadow: 0 0 20px #d946ef; } /* Midnight Void Theme */ body.theme-midnight { --bg-primary: #000000; --bg-secondary: #080808; --bg-card: #0a0a0a; --bg-sidebar: #000000; --violet-500: #ffffff; --violet-600: #e5e5e5; --violet-glow: rgba(255, 255, 255, 0.2); --indigo-500: #a3a3a3; --indigo-600: #737373; --text-primary: #ffffff; --text-muted: #525252; --border-color: #262626; /* Content area — pure dark */ --transcript-bg: #0a0a0a; --transcript-header-bg: #0f0f0f; --transcript-header-border: #1a1a1a; --transcript-content-bg: #050505; --transcript-text: #e5e5e5; --transcript-muted: #525252; --transcript-shadow: rgba(0, 0, 0, 0.5); --result-bg: #0a0a0a; --result-border: #1a1a1a; --result-heading: #a3a3a3; --result-text: #e5e5e5; --result-detail-text: #a3a3a3; --result-detail-border: #1a1a1a; --result-code-bg: #0f0f0f; --result-soap-text: #d4d4d4; --action-btn-hover-bg: rgba(255, 255, 255, 0.05); --action-btn-color: #525252; --action-btn-hover-color: #ffffff; --notice-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)); --notice-border: #333; --notice-strong: #e5e5e5; --notice-text: #a3a3a3; --footer-bg: #0a0a0a; --footer-border: #1a1a1a; --live-text-bg: #0f0f0f; --audio-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01)); --audio-border: #262626; --audio-text: #e5e5e5; --text-ind-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)); --text-ind-border: #262626; --text-ind-text: #e5e5e5; --header-bg: rgba(0, 0, 0, 0.95); --spinner-border: #262626; --spinner-active: #ffffff; --loading-text: #525252; --logo-gradient-start: #fff; --logo-gradient-end: #525252; --empty-state-color: #3f3f46; } body.theme-midnight .voice-card-glow { opacity: 0.3; background: #ffffff; } /* ── Clinical Light Theme ── */ body.theme-light { --bg-primary: #f0f4f8; --bg-secondary: #e2e8f0; --bg-card: #ffffff; --bg-sidebar: rgba(255, 255, 255, 0.95); --violet-500: #6d28d9; --violet-600: #5b21b6; --violet-glow: rgba(109, 40, 217, 0.15); --indigo-500: #4f46e5; --indigo-600: #4338ca; --text-primary: #1e293b; --text-secondary: #475569; --text-muted: #94a3b8; --border-color: rgba(148, 163, 184, 0.25); --border-hover: rgba(109, 40, 217, 0.3); /* Content area — bright */ --transcript-bg: #ffffff; --transcript-header-bg: #f8fafc; --transcript-header-border: #e2e8f0; --transcript-content-bg: #fafbfc; --transcript-text: #1e293b; --transcript-muted: #94a3b8; --transcript-shadow: rgba(0, 0, 0, 0.08); --result-bg: #ffffff; --result-border: #e2e8f0; --result-heading: #64748b; --result-text: #1e293b; --result-detail-text: #475569; --result-detail-border: #f1f5f9; --result-code-bg: #f8fafc; --result-soap-text: #334155; --action-btn-hover-bg: #f1f5f9; --action-btn-color: #94a3b8; --action-btn-hover-color: var(--indigo-600); --notice-bg: linear-gradient(135deg, #fffbeb, #fef3c7); --notice-border: #fcd34d; --notice-strong: #92400e; --notice-text: #a16207; --footer-bg: #ffffff; --footer-border: #e2e8f0; --live-text-bg: #f8fafc; --audio-bg: linear-gradient(135deg, #f0fdf4, #dcfce7); --audio-border: rgba(16, 185, 129, 0.2); --audio-text: #166534; --text-ind-bg: linear-gradient(135deg, #eff6ff, #dbeafe); --text-ind-border: rgba(59, 130, 246, 0.2); --text-ind-text: #1e40af; --header-bg: rgba(255, 255, 255, 0.85); --spinner-border: #e2e8f0; --spinner-active: var(--indigo-600); --loading-text: #64748b; --logo-gradient-start: #1e293b; --logo-gradient-end: #6d28d9; --empty-state-color: #94a3b8; } body.theme-light .sidebar { border-right-color: rgba(148, 163, 184, 0.2); } body.theme-light .nav-item.active { background: rgba(109, 40, 217, 0.08); border-color: rgba(109, 40, 217, 0.15); color: var(--violet-500); } body.theme-light .nav-item:hover { background: rgba(0, 0, 0, 0.03); } body.theme-light .user-card { background: rgba(0, 0, 0, 0.02); border-color: rgba(148, 163, 184, 0.2); } body.theme-light .voice-card-glow { opacity: 0.15; } body.theme-light .action-card { background: rgba(0, 0, 0, 0.01); } body.theme-light .action-card:hover { background: rgba(0, 0, 0, 0.03); } body.theme-light .duration-display { background: rgba(0, 0, 0, 0.04); } body.theme-light .settings-card { background: #ffffff; } body.theme-light .theme-card { background: rgba(0, 0, 0, 0.02); } body.theme-light .theme-card:hover { background: rgba(0, 0, 0, 0.04); } body.theme-light .theme-card.active { background: rgba(109, 40, 217, 0.06); } body.theme-light .neural-slider { background: rgba(0, 0, 0, 0.08); } body.theme-light .neural-graph-container { background: rgba(0, 0, 0, 0.04); } body.theme-light .slider:not(:checked) { background-color: rgba(0, 0, 0, 0.12); } body.theme-light .soap-section-card { background: #ffffff; border-color: #e2e8f0; } body.theme-light .soap-card-header { background: rgba(0, 0, 0, 0.02); border-bottom-color: #e2e8f0; } body.theme-light .soap-card-actions { background: rgba(0, 0, 0, 0.01); border-top-color: #e2e8f0; } body.theme-light .soap-history-panel { background: rgba(0, 0, 0, 0.02); } /* ── Aurora Dusk Theme ── */ body.theme-aurora { --bg-primary: #141020; --bg-secondary: #1c1630; --bg-card: #1a1428; --bg-sidebar: rgba(20, 16, 32, 0.96); --violet-500: #f97316; --violet-600: #ea580c; --violet-glow: rgba(249, 115, 22, 0.25); --indigo-500: #fb923c; --indigo-600: #f97316; --rose-500: #fb7185; --rose-glow: rgba(251, 113, 133, 0.3); --cyan-500: #fbbf24; --text-primary: #fef3c7; --text-secondary: #c4b5a0; --text-muted: #78716c; --border-color: rgba(251, 146, 60, 0.12); --border-hover: rgba(249, 115, 22, 0.3); /* Content area — warm dark */ --transcript-bg: #1a1428; --transcript-header-bg: #1c1630; --transcript-header-border: rgba(251, 146, 60, 0.1); --transcript-content-bg: #160f24; --transcript-text: #fef3c7; --transcript-muted: #78716c; --transcript-shadow: rgba(249, 115, 22, 0.1); --result-bg: #1a1428; --result-border: rgba(251, 146, 60, 0.1); --result-heading: #fb923c; --result-text: #fef3c7; --result-detail-text: #c4b5a0; --result-detail-border: rgba(251, 146, 60, 0.06); --result-code-bg: #1c1630; --result-soap-text: #d6d3d1; --action-btn-hover-bg: rgba(249, 115, 22, 0.1); --action-btn-color: #78716c; --action-btn-hover-color: #f97316; --notice-bg: linear-gradient(135deg, rgba(249, 115, 22, 0.08), rgba(251, 146, 60, 0.04)); --notice-border: rgba(249, 115, 22, 0.25); --notice-strong: #fb923c; --notice-text: #c4b5a0; --footer-bg: #1a1428; --footer-border: rgba(251, 146, 60, 0.1); --live-text-bg: #1c1630; --audio-bg: linear-gradient(135deg, rgba(251, 191, 36, 0.06), rgba(251, 191, 36, 0.03)); --audio-border: rgba(251, 191, 36, 0.15); --audio-text: #fbbf24; --text-ind-bg: linear-gradient(135deg, rgba(249, 115, 22, 0.08), rgba(249, 115, 22, 0.04)); --text-ind-border: rgba(249, 115, 22, 0.2); --text-ind-text: #fb923c; --header-bg: rgba(20, 16, 32, 0.9); --spinner-border: rgba(251, 146, 60, 0.12); --spinner-active: #f97316; --loading-text: #78716c; --logo-gradient-start: #fbbf24; --logo-gradient-end: #f97316; --empty-state-color: #57534e; } body.theme-aurora .neural-slider::-webkit-slider-thumb { background: #f97316; box-shadow: 0 0 16px rgba(249, 115, 22, 0.5); } body.theme-aurora .voice-card-glow.glow-1 { background: rgba(249, 115, 22, 0.2); } body.theme-aurora .voice-card-glow.glow-2 { background: rgba(251, 191, 36, 0.15); } body.theme-aurora .record-btn { background: linear-gradient(135deg, #ea580c, #f97316); box-shadow: 0 8px 32px rgba(249, 115, 22, 0.3); } /* ── Theme Toggle Button ── */ .theme-toggle-btn { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border: 1px solid var(--border-color); border-radius: var(--radius-full); background: transparent; color: var(--text-muted); cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; } .theme-toggle-btn:hover { color: var(--text-primary); border-color: var(--violet-500); background: rgba(139, 92, 246, 0.1); transform: rotate(15deg); } .theme-toggle-btn svg { width: 20px; height: 20px; transition: transform 0.4s ease, opacity 0.3s ease; } .theme-toggle-btn .theme-icon-sun, .theme-toggle-btn .theme-icon-moon { position: absolute; } .theme-toggle-btn .theme-icon-sun { opacity: 0; transform: rotate(-90deg) scale(0.5); } .theme-toggle-btn .theme-icon-moon { opacity: 1; transform: rotate(0deg) scale(1); } /* When a light theme is active, show sun */ body.theme-light .theme-toggle-btn .theme-icon-sun { opacity: 1; transform: rotate(0deg) scale(1); } body.theme-light .theme-toggle-btn .theme-icon-moon { opacity: 0; transform: rotate(90deg) scale(0.5); } /* ===================================================== SOAP SECTION CARDS ===================================================== */ .soap-sections-container { margin-top: 8px; } .soap-sections-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; padding: 0 4px; } .soap-sections-header h4 { font-size: 1rem; color: var(--text-primary); margin: 0; } .soap-section-card { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: 10px; margin-bottom: 10px; overflow: hidden; transition: border-color 0.3s ease, box-shadow 0.3s ease; } .soap-section-card:hover { border-color: var(--violet-500); box-shadow: 0 0 12px rgba(139, 92, 246, 0.08); } .soap-section-card.approved { border-color: #10b981; box-shadow: 0 0 8px rgba(16, 185, 129, 0.12); } .soap-section-card.editing { border-color: #3b82f6; box-shadow: 0 0 12px rgba(59, 130, 246, 0.15); } /* Card Header */ .soap-card-header { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid var(--border-color); background: rgba(0, 0, 0, 0.1); } .soap-card-header h5 { margin: 0; font-size: 0.88rem; font-weight: 600; color: var(--text-primary); flex: 1; } /* SOAP Letter Labels */ .soap-label { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 6px; font-weight: 700; font-size: 0.82rem; flex-shrink: 0; letter-spacing: 0; } .soap-label-s { background: rgba(59, 130, 246, 0.2); color: #60a5fa; border: 1px solid rgba(59, 130, 246, 0.3); } .soap-label-o { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.3); } .soap-label-a { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.3); } .soap-label-p { background: rgba(139, 92, 246, 0.2); color: #a78bfa; border: 1px solid rgba(139, 92, 246, 0.3); } .soap-label-cc { background: rgba(236, 72, 153, 0.2); color: #f472b6; border: 1px solid rgba(236, 72, 153, 0.3); } .soap-label-cd { background: rgba(20, 184, 166, 0.2); color: #2dd4bf; border: 1px solid rgba(20, 184, 166, 0.3); } .soap-history-restore-btn { margin-left: auto; background: transparent; border: 1px solid rgba(139, 92, 246, 0.3); color: #a78bfa; font-size: 0.65rem; padding: 2px 6px; border-radius: 4px; cursor: pointer; transition: all 0.2s; } .soap-history-restore-btn:hover { background: rgba(139, 92, 246, 0.1); border-color: #a78bfa; } /* Status Badges */ .soap-status { font-size: 0.7rem; padding: 2px 8px; border-radius: 4px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; white-space: nowrap; } .soap-status.badge.warning { background: rgba(245, 158, 11, 0.15); color: #f59e0b; border: 1px solid rgba(245, 158, 11, 0.25); } .soap-status.badge.success { background: rgba(16, 185, 129, 0.15); color: #10b981; border: 1px solid rgba(16, 185, 129, 0.25); } .soap-status.badge.info { background: rgba(59, 130, 246, 0.15); color: #3b82f6; border: 1px solid rgba(59, 130, 246, 0.25); } /* Card Body (editable content) */ .soap-card-body { padding: 12px 14px; font-size: 0.88rem; line-height: 1.6; color: var(--text-primary); min-height: 36px; transition: background 0.2s ease, outline 0.2s ease; outline: 2px solid transparent; border-radius: 0; } .soap-card-body[contenteditable="true"] { background: rgba(59, 130, 246, 0.05); outline: 2px solid rgba(59, 130, 246, 0.3); cursor: text; } .soap-card-body:empty::before { content: "Pending..."; color: var(--text-muted); opacity: 0.6; } /* Card Actions */ .soap-card-actions { display: flex; gap: 6px; padding: 8px 14px; border-top: 1px solid var(--border-color); background: rgba(0, 0, 0, 0.05); } .soap-edit-btn, .soap-approve-btn { display: inline-flex; align-items: center; gap: 5px; padding: 5px 12px; border: 1px solid var(--border-color); border-radius: 6px; background: transparent; color: var(--text-muted); font-size: 0.78rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .soap-edit-btn:hover { background: rgba(59, 130, 246, 0.1); color: #60a5fa; border-color: rgba(59, 130, 246, 0.3); } .soap-approve-btn:hover { background: rgba(16, 185, 129, 0.1); color: #34d399; border-color: rgba(16, 185, 129, 0.3); } .soap-edit-btn.saving { background: rgba(59, 130, 246, 0.15); color: #60a5fa; border-color: #3b82f6; } .soap-approve-btn.approved { background: rgba(16, 185, 129, 0.15); color: #10b981; border-color: #10b981; pointer-events: none; } .soap-approve-btn:disabled, .soap-edit-btn:disabled { opacity: 0.4; pointer-events: none; } /* AI Suggestion Notice */ .soap-ai-notice { display: flex; align-items: flex-start; gap: 8px; padding: 10px 14px; margin-top: 8px; border-radius: 8px; background: rgba(245, 158, 11, 0.06); border: 1px solid rgba(245, 158, 11, 0.15); color: var(--text-muted); font-size: 0.78rem; line-height: 1.5; } .soap-ai-notice svg { color: #f59e0b; flex-shrink: 0; margin-top: 1px; } /* Approval Flash Animation */ @keyframes approvalFlash { 0% { background: rgba(16, 185, 129, 0.2); } 100% { background: transparent; } } .soap-section-card.just-approved { animation: approvalFlash 0.8s ease-out; } /* Reject Button */ .soap-reject-btn { display: inline-flex; align-items: center; gap: 5px; padding: 5px 12px; border: 1px solid var(--border-color); border-radius: 6px; background: transparent; color: var(--text-muted); font-size: 0.78rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .soap-reject-btn:hover { background: rgba(239, 68, 68, 0.1); color: #f87171; border-color: rgba(239, 68, 68, 0.3); } .soap-reject-btn.rejected { background: rgba(239, 68, 68, 0.15); color: #ef4444; border-color: #ef4444; pointer-events: none; } .soap-reject-btn:disabled { opacity: 0.4; pointer-events: none; } /* Rejected Card State */ .soap-section-card.rejected { border-color: #ef4444; box-shadow: 0 0 8px rgba(239, 68, 68, 0.12); opacity: 0.85; } .soap-section-card.rejected .soap-card-body { text-decoration: line-through; opacity: 0.6; } .soap-status.badge.danger { background: rgba(239, 68, 68, 0.15); color: #ef4444; border: 1px solid rgba(239, 68, 68, 0.25); } @keyframes rejectionFlash { 0% { background: rgba(239, 68, 68, 0.2); } 100% { background: transparent; } } .soap-section-card.just-rejected { animation: rejectionFlash 0.8s ease-out; } /* History Toggle Button */ .soap-history-toggle { display: inline-flex; align-items: center; gap: 5px; padding: 5px 12px; border: 1px solid var(--border-color); border-radius: 6px; background: transparent; color: var(--text-muted); font-size: 0.78rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; margin-left: auto; } .soap-history-toggle:hover { background: rgba(139, 92, 246, 0.1); color: #a78bfa; border-color: rgba(139, 92, 246, 0.3); } .soap-history-toggle.active { background: rgba(139, 92, 246, 0.12); color: #a78bfa; border-color: rgba(139, 92, 246, 0.3); } /* History Panel */ .soap-history-panel { padding: 12px 14px; border-top: 1px solid var(--border-color); background: rgba(0, 0, 0, 0.08); max-height: 250px; overflow-y: auto; } .soap-history-panel.hidden { display: none; } .soap-history-original { padding: 8px 10px; margin-bottom: 10px; background: rgba(139, 92, 246, 0.06); border: 1px solid rgba(139, 92, 246, 0.12); border-radius: 6px; font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; } .soap-history-original-label { font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: #a78bfa; margin-bottom: 4px; } .soap-history-timeline { list-style: none; padding: 0; margin: 0; } .soap-history-entry { display: flex; align-items: flex-start; gap: 8px; padding: 6px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.04); font-size: 0.78rem; line-height: 1.4; } .soap-history-entry:last-child { border-bottom: none; } .soap-history-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; margin-top: 4px; } .soap-history-dot.edited { background: #3b82f6; } .soap-history-dot.approved { background: #10b981; } .soap-history-dot.rejected { background: #ef4444; } .soap-history-dot.generated { background: #a78bfa; } .soap-history-time { color: var(--text-muted); font-size: 0.7rem; white-space: nowrap; min-width: 56px; } .soap-history-action { color: var(--text-primary); flex: 1; } .soap-history-empty { color: var(--text-muted); font-size: 0.78rem; font-style: italic; padding: 8px 0; } /* ===================================================== PDF PRINT TEMPLATE (Hidden from UI) ===================================================== */ .pdf-template { width: 800px; padding: 40px; font-family: 'Helvetica', 'Arial', sans-serif; color: #1a1a1a; background: white; box-sizing: border-box; } .pdf-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 20px; } .pdf-logo { display: flex; align-items: center; gap: 12px; } .pdf-logo svg { color: #4f46e5; } .pdf-logo h2 { font-size: 24px; margin: 0; color: #1e293b; font-weight: 700; } .pdf-meta p { margin: 4px 0; font-size: 14px; color: #475569; } .pdf-divider { border: none; border-top: 2px solid #e2e8f0; margin: 20px 0; } .pdf-patient-info { background: #f8fafc; padding: 16px; border-radius: 8px; margin-bottom: 30px; } .pdf-info-row { display: flex; justify-content: space-between; } .pdf-info-row span { font-size: 14px; color: #334155; } .pdf-content { margin-bottom: 40px; } .pdf-section-title { font-size: 16px; color: #1e293b; border-bottom: 1px solid #cbd5e1; padding-bottom: 8px; margin-top: 24px; margin-bottom: 12px; text-transform: uppercase; letter-spacing: 0.05em; } .pdf-content p { font-size: 14px; line-height: 1.6; margin: 0 0 16px 0; color: #334155; white-space: pre-wrap; } #pdfClinicalDetails ul { margin: 0 0 16px 20px; font-size: 14px; color: #334155; } #pdfClinicalDetails li { margin-bottom: 8px; } .pdf-soap-section { margin-bottom: 20px; } .pdf-soap-section h4 { font-size: 14px; margin: 0 0 8px 0; color: #4f46e5; } .pdf-soap-section p { margin: 0; } .pdf-footer { display: flex; justify-content: space-between; margin-top: 60px; } .pdf-signature { width: 45%; } .sig-line { border-bottom: 1px solid #000; margin-bottom: 8px; } .pdf-signature p { margin: 0; font-size: 12px; color: #64748b; } .pdf-signature p.sig-name { font-weight: 600; color: #1e293b; margin-top: 4px; } .pdf-page-number { text-align: center; font-size: 10px; color: #94a3b8; margin-top: 40px; border-top: 1px solid #f1f5f9; padding-top: 16px; } .html2pdf__page-break { page-break-before: always; } /* ===================================================== HISTORY VIEW STYLES ===================================================== */ .history-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; padding: 10px; } .history-card { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: 12px; padding: 16px; display: flex; flex-direction: column; gap: 12px; cursor: pointer; transition: var(--transition); } .history-card:hover { border-color: var(--violet-500); transform: translateY(-2px); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2), 0 0 15px var(--violet-glow); } .history-card:focus { outline: 2px solid var(--violet-500); } .history-card-header { display: flex; justify-content: space-between; align-items: flex-start; border-bottom: 1px solid var(--border-color); padding-bottom: 10px; } .history-card-header h4 { margin: 0 0 4px 0; color: var(--text-primary); font-size: 1rem; font-weight: 600; } .history-date { display: block; color: var(--text-muted); font-size: 0.8rem; } .history-card-body { flex: 1; } .history-card-body p { margin: 0 0 6px 0; font-size: 0.85rem; color: var(--text-secondary); line-height: 1.4; } .history-card-body strong { color: var(--text-primary); } .history-card-footer { display: flex; justify-content: flex-end; padding-top: 10px; border-top: 1px solid var(--border-color); } .load-session-btn { display: flex; align-items: center; gap: 6px; background: transparent; border: none; color: var(--violet-500); font-size: 0.85rem; font-weight: 600; cursor: pointer; padding: 4px 8px; border-radius: 6px; transition: background 0.2s; } .history-card:hover .load-session-btn { background: rgba(139, 92, 246, 0.1); } .history-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 20px; text-align: center; color: var(--text-muted); } .history-empty svg { width: 64px; height: 64px; color: var(--empty-state-color, #334155); margin-bottom: 20px; } .history-empty h3 { margin: 0 0 8px 0; color: var(--text-primary); font-size: 1.2rem; } .history-empty p { margin: 0; font-size: 0.95rem; } /* ===================================================== PWA & OFFLINE STYLES ===================================================== */ .offline-badge { display: flex; align-items: center; gap: 8px; padding: 8px 16px; background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.2); border-radius: var(--radius-full); color: var(--rose-500); font-size: 0.8rem; font-weight: 600; } [data-theme="" high-contrast""] .offline-badge { background: #000; border: 1px solid #ff00ff; color: #ff00ff; } .offline-badge svg { width: 16px; height: 16px; } .install-app-btn { display: flex; align-items: center; gap: 8px; padding: 8px 16px; background: linear-gradient(135deg, var(--violet-600), var(--indigo-600)); color: white; border: none; border-radius: var(--radius-full); font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: var(--transition); box-shadow: 0 4px 12px var(--violet-glow); } .install-app-btn:hover { transform: translateY(-1px); box-shadow: 0 6px 16px var(--violet-glow); } [data-theme="" high-contrast""] .install-app-btn { background: #ffff00; color: #000; border: 2px solid #ffff00; box-shadow: none; } [data-theme="" high-contrast""] .install-app-btn:hover { background: #000; color: #ffff00; } .install-app-btn svg { width: 16px; height: 16px; } /* ===================================================== MEDICAL NER ENTITY STYLES ===================================================== */ .soap-label-ner { background: linear-gradient(135deg, #06b6d4, #8b5cf6) !important; } .ner-entities-body { display: flex; flex-direction: column; gap: 16px; padding: 16px 0; } .ner-category-label { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 8px; } .ner-category-label svg { color: var(--violet-500); } .ner-badges { display: flex; flex-wrap: wrap; gap: 8px; } .entity-badge { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--radius-full); font-size: 0.78rem; font-weight: 500; transition: var(--transition); cursor: default; } .entity-badge:hover { transform: translateY(-1px); } .entity-badge .entity-name { font-weight: 600; } .entity-badge .entity-code { font-size: 0.7rem; opacity: 0.7; font-family: monospace; } /* Condition badges (warm red/orange tones) */ .entity-condition { background: rgba(239, 68, 68, 0.1); color: var(--rose-500); border: 1px solid rgba(239, 68, 68, 0.2); } [data-theme="" high-contrast""] .entity-condition { background: #000; color: #ff00ff; border: 1px solid #ff00ff; } /* Medication badges (cool blue/purple tones) */ .entity-medication { background: rgba(124, 58, 237, 0.1); color: var(--violet-500); border: 1px solid rgba(124, 58, 237, 0.2); } [data-theme="" high-contrast""] .entity-medication { background: #000; color: #00ffff; border: 1px solid #00ffff; } .ner-empty-state { color: var(--text-muted); font-style: italic; font-size: 0.8rem; } /* ===================================================== FHIR / EHR EXPORT STYLES ===================================================== */ /* EHR Modal */ .ehr-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; display: flex; align-items: center; justify-content: center; } .ehr-modal.hidden { display: none; } .ehr-modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); } .ehr-modal-content { position: relative; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius-lg); width: 90%; max-width: 480px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); animation: modalSlideIn 0.25s ease-out; } @keyframes modalSlideIn { from { opacity: 0; transform: translateY(-20px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } } .ehr-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--border); } .ehr-modal-header h4 { margin: 0; font-size: 1rem; color: var(--text-primary); } .ehr-modal-close { background: none; border: none; color: var(--text-secondary); font-size: 1.4rem; cursor: pointer; padding: 4px 8px; border-radius: var(--radius-sm); transition: var(--transition); } .ehr-modal-close:hover { color: var(--text-primary); background: var(--bg-hover); } .ehr-modal-body { padding: 20px; display: flex; flex-direction: column; gap: 16px; } .ehr-field label { display: block; font-size: 0.8rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; } .ehr-field input { width: 100%; padding: 10px 12px; font-size: 0.85rem; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text-primary); transition: var(--transition); box-sizing: border-box; } .ehr-field input:focus { outline: none; border-color: var(--violet-500); box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.2); } .ehr-presets { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .ehr-presets-label { font-size: 0.75rem; color: var(--text-muted); font-weight: 600; } .ehr-preset-btn { padding: 4px 10px; font-size: 0.72rem; border-radius: var(--radius-full); border: 1px solid var(--border); background: var(--bg-secondary); color: var(--text-secondary); cursor: pointer; transition: var(--transition); } .ehr-preset-btn:hover { background: var(--violet-500); color: white; border-color: var(--violet-500); } .ehr-modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid var(--border); } /* ===================================================== HIPAA COMPLIANCE DASHBOARD ===================================================== */ .hipaa-actions { display: flex; align-items: center; gap: 12px; } .hipaa-purge-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.3); color: #ef4444; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; transition: all 0.2s; } .hipaa-purge-btn:hover { background: rgba(239, 68, 68, 0.2); border-color: rgba(239, 68, 68, 0.5); } .hipaa-purge-result { font-size: 0.85rem; color: var(--text-secondary); } .hipaa-export-logs { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; max-height: 300px; overflow-y: auto; } .hipaa-export-logs .text-muted { padding: 16px; color: var(--text-secondary); text-align: center; font-size: 0.85rem; } .hipaa-export-row { display: grid; grid-template-columns: 1fr 80px 100px 120px 80px; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--border); font-size: 0.82rem; align-items: center; } .hipaa-export-row:last-child { border-bottom: none; } .hipaa-export-row.header { background: var(--bg-secondary); font-weight: 600; color: var(--text-secondary); text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.05em; position: sticky; top: 0; } .hipaa-export-status { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 500; } .hipaa-export-status.success { background: rgba(34, 197, 94, 0.15); color: #22c55e; } .hipaa-export-status.failed { background: rgba(239, 68, 68, 0.15); color: #ef4444; }