UNPKG

realtimecursor

Version:

Real-time collaboration system with cursor tracking and approval workflow

1,910 lines (1,645 loc) 33.7 kB
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f8fafc; color: #1e293b; line-height: 1.6; min-height: 100vh; } /* Clean scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f5f9; border-radius: 4px; } ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; transition: background 0.2s; } ::-webkit-scrollbar-thumb:hover { background: #94a3b8; } /* Layout */ .container { max-width: 1200px; margin: 0 auto; padding: 0 1.5rem; } .page-container { min-height: 100vh; padding: 2rem 0; } /* Cards */ .card { background: white; border: 1px solid #e2e8f0; border-radius: 12px; padding: 1.5rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); transition: all 0.2s ease; } .card:hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transform: translateY(-1px); } .card-header { border-bottom: 1px solid #e2e8f0; padding-bottom: 1rem; margin-bottom: 1.5rem; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; border-radius: 8px; font-weight: 500; font-size: 0.875rem; border: none; cursor: pointer; transition: all 0.2s ease; text-decoration: none; white-space: nowrap; gap: 0.5rem; } .btn:disabled { opacity: 0.6; cursor: not-allowed; } .btn-primary { background: #3b82f6; color: white; } .btn-primary:hover:not(:disabled) { background: #2563eb; } .btn-secondary { background: #6b7280; color: white; } .btn-secondary:hover:not(:disabled) { background: #4b5563; } .btn-success { background: #10b981; color: white; } .btn-success:hover:not(:disabled) { background: #059669; } .btn-warning { background: #f59e0b; color: white; } .btn-warning:hover:not(:disabled) { background: #d97706; } .btn-danger { background: #ef4444; color: white; } .btn-danger:hover:not(:disabled) { background: #dc2626; } .btn-outline { background: transparent; border: 1px solid #d1d5db; color: #374151; } .btn-outline:hover:not(:disabled) { background: #f9fafb; border-color: #9ca3af; } .btn-sm { padding: 0.5rem 1rem; font-size: 0.8rem; } .btn-lg { padding: 1rem 2rem; font-size: 1rem; } /* Inputs */ .input { width: 100%; padding: 0.75rem 1rem; border: 1px solid #d1d5db; border-radius: 8px; font-size: 0.875rem; background: white; transition: all 0.2s ease; } .input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .input::placeholder { color: #9ca3af; } .textarea { resize: vertical; min-height: 100px; font-family: inherit; } /* Form groups */ .form-group { margin-bottom: 1.5rem; } .form-label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: #374151; font-size: 0.875rem; } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem; } @media (max-width: 640px) { .form-row { grid-template-columns: 1fr; } } /* Grid */ .grid { display: grid; gap: 1.5rem; } .grid-1 { grid-template-columns: 1fr; } .grid-2 { grid-template-columns: repeat(2, 1fr); } .grid-3 { grid-template-columns: repeat(3, 1fr); } .grid-4 { grid-template-columns: repeat(4, 1fr); } @media (max-width: 1024px) { .grid-4 { grid-template-columns: repeat(2, 1fr); } .grid-3 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 640px) { .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; } } /* Badges */ .badge { display: inline-flex; align-items: center; padding: 0.25rem 0.75rem; border-radius: 20px; font-size: 0.75rem; font-weight: 500; gap: 0.25rem; } .badge-primary { background: #dbeafe; color: #1d4ed8; } .badge-success { background: #d1fae5; color: #065f46; } .badge-warning { background: #fef3c7; color: #92400e; } .badge-danger { background: #fee2e2; color: #991b1b; } .badge-gray { background: #f3f4f6; color: #374151; } /* Modals */ .modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; padding: 1rem; z-index: 50; } .modal { background: white; border-radius: 12px; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1); max-width: 90vw; max-height: 90vh; overflow: hidden; width: 100%; } .modal-header { padding: 1.5rem; border-bottom: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: between; } .modal-body { padding: 1.5rem; max-height: 60vh; overflow-y: auto; } .modal-footer { padding: 1.5rem; border-top: 1px solid #e5e7eb; background: #f9fafb; display: flex; justify-content: flex-end; gap: 0.75rem; } /* Notifications */ .notification { position: fixed; top: 1rem; right: 1rem; padding: 1rem 1.5rem; border-radius: 8px; font-weight: 500; z-index: 60; max-width: 400px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .notification-success { background: #10b981; color: white; } .notification-error { background: #ef4444; color: white; } /* Loading */ .spinner { width: 1rem; height: 1rem; border: 2px solid #e5e7eb; border-top: 2px solid #3b82f6; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Status */ .status-online { width: 0.5rem; height: 0.5rem; background: #10b981; border-radius: 50%; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* Production-Level Editor Layout */ .editor-layout { display: grid; grid-template-columns: 1fr 320px; gap: 24px; min-height: calc(100vh - 200px); max-width: 1400px; margin: 0 auto; } .focus-mode-layout { grid-template-columns: 1fr; max-width: 900px; } .editor-main { display: flex; flex-direction: column; min-height: 700px; } .editor-sidebar { display: flex; flex-direction: column; gap: 16px; max-height: calc(100vh - 200px); overflow-y: auto; padding-right: 8px; } .editor-container { background: white; border: 1px solid #e2e8f0; border-radius: 12px; overflow: hidden; flex: 1; display: flex; flex-direction: column; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } .editor-header { padding: 16px 20px; background: #f8fafc; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; justify-content: space-between; } .editor-textarea { flex: 1; min-height: 600px; padding: 20px; border: 1px solid #e2e8f0; outline: none; resize: vertical; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 14px; line-height: 1.6; background: #ffffff; color: #2d3748; tab-size: 2; overflow-y: auto; border-radius: 8px; } .editor-textarea:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .editor-textarea::placeholder { color: #9ca3af; } /* Focus Mode */ .focus-mode .editor-textarea { font-size: 16px; line-height: 1.8; padding: 30px; } /* Reading Mode */ .reading-mode .editor-textarea { font-family: 'Georgia', 'Times New Roman', serif; font-size: 16px; line-height: 1.8; color: #374151; } .editor-textarea::placeholder { color: #9ca3af; } /* Header */ .header { background: white; border-bottom: 1px solid #e5e7eb; padding: 1rem 0; margin-bottom: 2rem; } .header-content { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 1rem; } .header-title { font-size: 1.5rem; font-weight: 600; color: #1f2937; } .header-subtitle { color: #6b7280; margin-top: 0.25rem; } /* Project cards */ .project-card { background: white; border: 1px solid #e5e7eb; border-radius: 12px; padding: 1.5rem; transition: all 0.2s ease; height: 100%; display: flex; flex-direction: column; } .project-card:hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transform: translateY(-2px); } .project-icon { width: 3rem; height: 3rem; background: #3b82f6; border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-bottom: 1rem; } .project-title { font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem; color: #1f2937; } .project-description { color: #6b7280; font-size: 0.875rem; margin-bottom: 1rem; flex: 1; } .project-meta { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; font-size: 0.75rem; color: #9ca3af; } .project-actions { display: flex; gap: 0.5rem; margin-top: auto; } /* Invitations */ .invitation-card { background: #fef7ed; border: 1px solid #fed7aa; border-radius: 12px; padding: 1.5rem; margin-bottom: 1rem; } .invitation-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; } .invitation-title { font-weight: 600; color: #9a3412; } .invitation-actions { display: flex; gap: 0.5rem; } /* Collaborators */ .collaborator-list { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.5rem; } .collaborator-item { display: flex; align-items: center; gap: 0.5rem; background: #f3f4f6; padding: 0.5rem 0.75rem; border-radius: 20px; font-size: 0.75rem; position: relative; transition: all 0.2s ease; } .collaborator-item:hover { background: #e5e7eb; transform: translateY(-1px); } .collaborator-item.typing { background: rgba(59, 130, 246, 0.1); border: 1px solid rgba(59, 130, 246, 0.2); } .collaborator-item.typing::after { content: ''; position: absolute; right: 4px; top: 50%; transform: translateY(-50%); width: 4px; height: 4px; background: #3b82f6; border-radius: 50%; animation: typingIndicator 1s ease-in-out infinite; } @keyframes typingIndicator { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } /* Revolutionary Features CSS */ /* Focus Mode */ .focus-mode { font-size: 1.1rem; line-height: 1.8; padding: 3rem; background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%); } /* Dark Theme */ .dark-theme { background: #1a1a1a; color: #e5e5e5; } .dark-theme .editor-textarea { background: #2d2d2d; color: #e5e5e5; border-color: #404040; } .dark-theme .editor-header { background: #333; border-color: #404040; } /* AI Assistant */ .ai-suggestion { z-index: 20; pointer-events: none; } .ai-suggestion-bubble { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 0.5rem 0.75rem; border-radius: 12px; font-size: 0.75rem; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); position: relative; pointer-events: auto; max-width: 200px; } .ai-suggestion-bubble::before { content: ''; position: absolute; top: -4px; left: 12px; width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; border-bottom: 4px solid #667eea; } .ai-apply-btn { background: rgba(255, 255, 255, 0.2); border: 1px solid rgba(255, 255, 255, 0.3); color: white; padding: 0.25rem 0.5rem; border-radius: 6px; font-size: 0.7rem; margin-left: 0.5rem; cursor: pointer; transition: all 0.2s ease; } .ai-apply-btn:hover { background: rgba(255, 255, 255, 0.3); } .ai-suggestion-item { background: #f0f9ff; border: 1px solid #bae6fd; border-radius: 8px; padding: 0.75rem; margin-bottom: 0.5rem; } .ai-stats { background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); border-radius: 8px; padding: 0.75rem; margin-bottom: 1rem; } /* Analytics */ .analytics-item { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 0; border-bottom: 1px solid #f1f5f9; } .analytics-item:last-child { border-bottom: none; } /* Recording Indicator */ .recording-indicator { background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); color: white; padding: 0.25rem 0.75rem; border-radius: 20px; font-size: 0.75rem; font-weight: 600; animation: recordingPulse 1s ease-in-out infinite; } @keyframes recordingPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.05); } } /* Version History */ .version-item { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.75rem; margin-bottom: 0.5rem; transition: all 0.2s ease; } .version-item:hover { background: #f1f5f9; border-color: #cbd5e1; transform: translateY(-1px); } /* Enhanced Scrollbars */ .card::-webkit-scrollbar { width: 6px; } .card::-webkit-scrollbar-track { background: #f8fafc; border-radius: 3px; } .card::-webkit-scrollbar-thumb { background: linear-gradient(135deg, #cbd5e1 0%, #94a3b8 100%); border-radius: 3px; } .card::-webkit-scrollbar-thumb:hover { background: linear-gradient(135deg, #94a3b8 0%, #64748b 100%); } /* Floating Action Buttons */ .floating-actions { position: fixed; bottom: 2rem; right: 2rem; display: flex; flex-direction: column; gap: 0.5rem; z-index: 30; } .floating-btn { width: 3rem; height: 3rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transition: all 0.3s ease; border: none; cursor: pointer; } .floating-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); } .floating-btn-primary { background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); color: white; } .floating-btn-success { background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; } .floating-btn-warning { background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); color: white; } /* Glassmorphism Effects */ .glass-panel { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 16px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); } /* Micro-interactions */ .interactive-element { transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .interactive-element:hover { transform: translateY(-1px); } .interactive-element:active { transform: translateY(0); } /* Gradient Backgrounds */ .gradient-primary { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } .gradient-success { background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); } .gradient-warning { background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%); } .gradient-danger { background: linear-gradient(135deg, #fa709a 0%, #fee140 100%); } /* Advanced Animations */ @keyframes slideInFromRight { 0% { opacity: 0; transform: translateX(30px); } 100% { opacity: 1; transform: translateX(0); } } @keyframes fadeInScale { 0% { opacity: 0; transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } } /* History Panel */ .history-item { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.75rem; transition: all 0.2s ease; position: relative; } .history-item:hover { background: #f1f5f9; border-color: #cbd5e1; transform: translateY(-1px); } .history-item::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%); border-radius: 0 4px 4px 0; } .history-icon { font-size: 1rem; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; background: white; border-radius: 50%; border: 2px solid #e2e8f0; flex-shrink: 0; } /* Text-to-Speech Indicator */ .tts-active { position: relative; } .tts-active::after { content: '🔊'; position: absolute; top: -8px; right: -8px; font-size: 12px; animation: pulse 1.5s infinite; } /* Speech Animation */ @keyframes speechWave { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(1.5); } } .speaking-indicator { display: inline-flex; align-items: center; gap: 2px; margin-left: 8px; } .speaking-bar { width: 3px; height: 12px; background: #3b82f6; border-radius: 2px; animation: speechWave 0.6s ease-in-out infinite; } .speaking-bar:nth-child(2) { animation-delay: 0.1s; } .speaking-bar:nth-child(3) { animation-delay: 0.2s; } .speaking-bar:nth-child(4) { animation-delay: 0.3s; } /* GitHub-style Diff */ .diff-preview { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 11px; line-height: 1.4; } .diff-line { padding: 1px 4px; margin: 1px 0; border-radius: 2px; white-space: pre-wrap; word-break: break-all; } .diff-marker { font-weight: bold; width: 12px; display: inline-block; } .diff-line.text-green-700 { background-color: #dcfce7; border-left: 3px solid #16a34a; } .diff-line.text-red-700 { background-color: #fef2f2; border-left: 3px solid #dc2626; } .diff-line.text-gray-600 { background-color: #f9fafb; border-left: 3px solid #e5e7eb; } /* History improvements */ .history-item { background: #ffffff; border: 1px solid #e1e5e9; border-radius: 6px; padding: 12px; margin-bottom: 8px; transition: all 0.2s ease; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .history-item:hover { border-color: #d0d7de; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); } .history-icon { width: 20px; height: 20px; border-radius: 50%; background: #f6f8fa; border: 1px solid #d0d7de; display: flex; align-items: center; justify-content: center; font-size: 10px; flex-shrink: 0; } /* Invite Modal Styles */ .invite-modal { background: white; border-radius: 16px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15); width: 100%; max-width: 600px; max-height: 80vh; display: flex; flex-direction: column; overflow: hidden; animation: modalSlideIn 0.3s ease-out; } @keyframes modalSlideIn { 0% { opacity: 0; transform: translateY(-20px) scale(0.95); } 100% { opacity: 1; transform: translateY(0) scale(1); } } .invite-modal-header { padding: 24px; border-bottom: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: space-between; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; } .invite-header-content { display: flex; align-items: center; gap: 16px; } .invite-icon { width: 48px; height: 48px; background: rgba(255, 255, 255, 0.2); border-radius: 12px; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(10px); } .invite-title h3 { font-size: 20px; font-weight: 600; margin: 0; line-height: 1.2; } .invite-title p { font-size: 14px; margin: 4px 0 0 0; opacity: 0.9; } .invite-close-btn { width: 40px; height: 40px; border-radius: 8px; background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); color: white; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; } .invite-close-btn:hover { background: rgba(255, 255, 255, 0.2); transform: scale(1.05); } .invite-modal-body { flex: 1; overflow: hidden; display: flex; flex-direction: column; } .invite-search { padding: 20px 24px 16px; border-bottom: 1px solid #f1f5f9; } .invite-search-input { width: 100%; padding: 12px 16px; border: 2px solid #e2e8f0; border-radius: 10px; font-size: 14px; transition: all 0.2s ease; background: #f8fafc; } .invite-search-input:focus { outline: none; border-color: #3b82f6; background: white; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .invite-users-list { flex: 1; overflow-y: auto; padding: 8px; max-height: 400px; } .invite-user-item { margin-bottom: 4px; } .invite-user-label { display: flex; align-items: center; gap: 16px; padding: 16px; border-radius: 12px; cursor: pointer; transition: all 0.2s ease; border: 2px solid transparent; background: #fafbfc; } .invite-user-label:hover { background: #f1f5f9; border-color: #e2e8f0; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); } .invite-user-label:has(.invite-checkbox:checked) { background: #eff6ff; border-color: #3b82f6; box-shadow: 0 4px 12px rgba(59, 130, 246, 0.1); } .invite-checkbox { width: 20px; height: 20px; border-radius: 6px; border: 2px solid #d1d5db; cursor: pointer; transition: all 0.2s ease; flex-shrink: 0; } .invite-checkbox:checked { background: #3b82f6; border-color: #3b82f6; } .invite-user-avatar { width: 48px; height: 48px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; font-size: 16px; flex-shrink: 0; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } .invite-user-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; } .invite-user-name { font-weight: 600; font-size: 16px; color: #1f2937; line-height: 1.3; word-wrap: break-word; overflow-wrap: break-word; } .invite-user-email { font-size: 14px; color: #6b7280; line-height: 1.3; word-wrap: break-word; overflow-wrap: break-word; } .invite-selected-icon { width: 32px; height: 32px; background: #10b981; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: white; flex-shrink: 0; animation: checkmarkBounce 0.3s ease-out; } @keyframes checkmarkBounce { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } .invite-modal-footer { padding: 20px 24px; border-top: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: space-between; background: #f8fafc; } .invite-selected-count { font-size: 14px; font-weight: 500; color: #374151; background: #e5e7eb; padding: 8px 12px; border-radius: 8px; } .invite-actions { display: flex; gap: 12px; } /* Responsive Design */ @media (max-width: 640px) { .invite-modal { max-width: 95vw; margin: 20px; } .invite-modal-header { padding: 20px; } .invite-header-content { gap: 12px; } .invite-icon { width: 40px; height: 40px; } .invite-title h3 { font-size: 18px; } .invite-user-label { padding: 12px; gap: 12px; } .invite-user-avatar { width: 40px; height: 40px; font-size: 14px; } .invite-user-name { font-size: 15px; } .invite-user-email { font-size: 13px; } } /* Advanced Features CSS */ /* Focus Mode */ .focus-mode { border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1); background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%); } .focus-mode .editor-textarea { font-size: 1.1rem; line-height: 1.8; padding: 3rem; border: none; background: transparent; } /* Reading Mode */ .reading-mode { background: #fefefe; } .reading-mode .editor-textarea { font-family: 'Georgia', 'Times New Roman', serif; font-size: 1.2rem; line-height: 1.9; color: #2d3748; background: #fefefe; } /* Advanced AI Suggestions */ .suggestion-item { background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; margin-bottom: 12px; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .suggestion-item::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); transform: scaleY(0); transition: transform 0.3s ease; } .suggestion-item:hover { transform: translateY(-2px); box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); border-color: #c7d2fe; } .suggestion-item:hover::before { transform: scaleY(1); } .suggestion-item[data-severity="high"] { border-color: #fecaca; background: linear-gradient(135deg, #fef2f2 0%, #ffffff 100%); } .suggestion-item[data-severity="medium"] { border-color: #fed7aa; background: linear-gradient(135deg, #fffbeb 0%, #ffffff 100%); } .suggestion-item[data-severity="low"] { border-color: #bbf7d0; background: linear-gradient(135deg, #f0fdf4 0%, #ffffff 100%); } .suggestion-icon { width: 40px; height: 40px; border-radius: 12px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; color: white; flex-shrink: 0; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } .suggestion-type { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; } .suggestion-type.high { color: #dc2626; } .suggestion-type.medium { color: #d97706; } .suggestion-type.low { color: #059669; } .severity-badge { font-size: 10px; font-weight: 500; padding: 2px 6px; border-radius: 8px; text-transform: uppercase; letter-spacing: 0.05em; } .severity-badge.high { background: #fee2e2; color: #991b1b; } .severity-badge.medium { background: #fef3c7; color: #92400e; } .severity-badge.low { background: #d1fae5; color: #065f46; } .suggestion-text { font-size: 14px; line-height: 1.5; color: #374151; margin-bottom: 12px; } .suggestion-actions { display: flex; gap: 8px; } .btn-fix { background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; border: none; padding: 6px 12px; border-radius: 8px; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 4px; } .btn-fix:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3); } .btn-dismiss { background: transparent; color: #6b7280; border: 1px solid #d1d5db; padding: 6px 12px; border-radius: 8px; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 4px; } .btn-dismiss:hover { background: #f9fafb; border-color: #9ca3af; transform: translateY(-1px); } /* Recording Animation */ .btn-danger { animation: recordingPulse 1.5s ease-in-out infinite; } @keyframes recordingPulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.4); } 50% { box-shadow: 0 0 0 8px rgba(239, 68, 68, 0); } } /* TTS Active State */ .btn-success { position: relative; } .btn-success::after { content: ''; position: absolute; top: -2px; right: -2px; width: 8px; height: 8px; background: #10b981; border-radius: 50%; animation: pulse 2s infinite; } /* AI Stats Gradient */ .ai-stats { background: linear-gradient(135deg, #ddd6fe 0%, #e0e7ff 100%); border: 1px solid #c4b5fd; } /* Quick Actions Grid */ .grid-cols-2 { display: grid; grid-template-columns: repeat(2, 1fr); } /* Enhanced Tooltips */ [title] { position: relative; } [title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: #1f2937; color: white; padding: 0.5rem; border-radius: 6px; font-size: 0.75rem; white-space: nowrap; z-index: 50; margin-bottom: 4px; } [title]:hover::before { content: ''; position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); border: 4px solid transparent; border-top-color: #1f2937; z-index: 50; } /* Minimap */ .minimap { position: absolute; right: 0; top: 0; width: 120px; height: 100%; background: rgba(248, 250, 252, 0.95); border-left: 1px solid #e2e8f0; font-size: 2px; line-height: 3px; overflow: hidden; opacity: 0; transition: opacity 0.3s ease; } .editor-container:hover .minimap { opacity: 1; } /* Status Indicators */ .status-indicator { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.75rem; font-weight: 500; } .status-recording { background: rgba(239, 68, 68, 0.1); color: #dc2626; border: 1px solid rgba(239, 68, 68, 0.2); } .status-tts { background: rgba(16, 185, 129, 0.1); color: #059669; border: 1px solid rgba(16, 185, 129, 0.2); } .status-ai { background: rgba(99, 102, 241, 0.1); color: #4f46e5; border: 1px solid rgba(99, 102, 241, 0.2); } .slide-in-right { animation: slideInFromRight 0.3s ease-out; } .fade-in-scale { animation: fadeInScale 0.3s ease-out; } /* Responsive Design */ @media (max-width: 768px) { .floating-actions { bottom: 1rem; right: 1rem; } .floating-btn { width: 2.5rem; height: 2.5rem; } .ai-suggestion-bubble { max-width: 150px; font-size: 0.7rem; } .focus-mode { padding: 1.5rem; font-size: 1rem; } } .collaborator-avatar { width: 1.5rem; height: 1.5rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.625rem; font-weight: 600; color: white; } /* Live Cursors */ .live-cursor { position: fixed; pointer-events: none; z-index: 1000; transition: all 0.05s ease-out; } .cursor-pointer { width: 16px; height: 16px; border-radius: 50%; border: 3px solid white; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); animation: cursorPulse 2s infinite; } .cursor-name { color: white; padding: 0.375rem 0.75rem; border-radius: 8px; font-size: 0.75rem; font-weight: 600; margin-top: 0.75rem; white-space: nowrap; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); position: relative; } .cursor-name::before { content: ''; position: absolute; top: -4px; left: 8px; width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; border-bottom: 4px solid inherit; } @keyframes cursorPulse { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.1); opacity: 0.8; } } /* Notion-style Text Cursors */ .notion-cursor { position: absolute; width: 2px; height: 20px; pointer-events: none; z-index: 15; animation: notionCursorPulse 1.5s ease-in-out infinite; } .cursor-flag { position: absolute; top: -8px; left: -6px; width: 14px; height: 14px; border-radius: 3px; color: white; font-size: 8px; font-weight: bold; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); transform: scale(0.9); transition: transform 0.2s ease; } .notion-cursor:hover .cursor-flag { transform: scale(1.1); } @keyframes notionCursorPulse { 0%, 100% { opacity: 1; transform: scaleY(1); } 50% { opacity: 0.7; transform: scaleY(0.95); } } /* Typing indicators */ .typing-indicator { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.25rem 0.5rem; background: rgba(59, 130, 246, 0.1); border: 1px solid rgba(59, 130, 246, 0.2); border-radius: 12px; font-size: 0.75rem; color: #3b82f6; animation: typingPulse 1.5s ease-in-out infinite; } @keyframes typingPulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } .typing-dots { display: flex; gap: 2px; } .typing-dot { width: 3px; height: 3px; background: currentColor; border-radius: 50%; animation: typingDot 1.4s ease-in-out infinite; } .typing-dot:nth-child(1) { animation-delay: 0s; } .typing-dot:nth-child(2) { animation-delay: 0.2s; } .typing-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes typingDot { 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } 40% { transform: scale(1); opacity: 1; } } /* Comments */ .comment-item { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.75rem; transition: all 0.2s ease; } .comment-item:hover { background: #f1f5f9; border-color: #cbd5e1; transform: translateY(-1px); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* Utilities */ .text-center { text-align: center; } .text-left { text-align: left; } .text-right { text-align: right; } .font-medium { font-weight: 500; } .font-semibold { font-weight: 600; } .font-bold { font-weight: 700; } .text-sm { font-size: 0.875rem; } .text-xs { font-size: 0.75rem; } .text-lg { font-size: 1.125rem; } .text-xl { font-size: 1.25rem; } .text-2xl { font-size: 1.5rem; } .text-gray-500 { color: #6b7280; } .text-gray-600 { color: #4b5563; } .text-gray-700 { color: #374151; } .text-gray-900 { color: #111827; } .mb-2 { margin-bottom: 0.5rem; } .mb-4 { margin-bottom: 1rem; } .mb-6 { margin-bottom: 1.5rem; } .mb-8 { margin-bottom: 2rem; } .mt-2 { margin-top: 0.5rem; } .mt-4 { margin-top: 1rem; } .mt-6 { margin-top: 1.5rem; } .mt-8 { margin-top: 2rem; } .p-2 { padding: 0.5rem; } .p-4 { padding: 1rem; } .p-6 { padding: 1.5rem; } .w-full { width: 100%; } .h-full { height: 100%; } .flex { display: flex; } .flex-col { flex-direction: column; } .items-center { align-items: center; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .gap-2 { gap: 0.5rem; } .gap-4 { gap: 1rem; } .hidden { display: none; } @media (max-width: 640px) { .container { padding: 0 1rem; } .page-container { padding: 1rem 0; } .card { padding: 1rem; } .modal { margin: 1rem; } }