/* frontend/src/App.css */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; } .container { width: 100%; max-width: 600px; margin: 0 auto; } .card { background: white; border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); padding: 40px; animation: slideUp 0.5s ease; } @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .header { text-align: center; margin-bottom: 30px; } .header h1 { color: #333; font-size: 2rem; margin-bottom: 10px; } .header p { color: #666; font-size: 1rem; } .form { margin-bottom: 20px; } .input-group { margin-bottom: 20px; } .input-group label { display: block; color: #333; font-weight: 600; margin-bottom: 8px; font-size: 0.95rem; } .input { width: 100%; padding: 12px 16px; border: 2px solid #e1e8ed; border-radius: 10px; font-size: 1rem; transition: all 0.3s ease; font-family: monospace; } .input:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } .input:disabled { background: #f5f5f5; cursor: not-allowed; } .input-group small { display: block; color: #999; font-size: 0.85rem; margin-top: 5px; } .button { width: 100%; padding: 14px 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 10px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); } .button:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5); } .button:active:not(:disabled) { transform: translateY(0); } .button:disabled { opacity: 0.6; cursor: not-allowed; } .button.loading { position: relative; color: transparent; } .button.loading::after { content: ''; position: absolute; width: 20px; height: 20px; top: 50%; left: 50%; margin-left: -10px; margin-top: -10px; border: 3px solid white; border-radius: 50%; border-top-color: transparent; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .pairing-code { background: #f8f9fa; border-radius: 12px; padding: 20px; margin-bottom: 20px; animation: fadeIn 0.5s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .pairing-code h3 { color: #333; margin-bottom: 15px; font-size: 1.1rem; } .code-display { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; } .code { flex: 1; background: white; padding: 15px 20px; border-radius: 8px; font-family: 'Courier New', monospace; font-size: 1.8rem; font-weight: bold; color: #667eea; text-align: center; letter-spacing: 3px; border: 2px dashed #667eea; } .copy-btn { background: #667eea; color: white; border: none; border-radius: 8px; padding: 12px 16px; font-size: 1.2rem; cursor: pointer; transition: all 0.3s ease; } .copy-btn:hover { background: #5568d3; transform: scale(1.1); } .instructions { background: white; padding: 15px; border-radius: 8px; border-left: 4px solid #667eea; } .instructions p { color: #333; font-weight: 600; margin-bottom: 10px; } .instructions ol { margin-left: 20px; color: #666; } .instructions li { margin-bottom: 8px; line-height: 1.5; } .status { padding: 12px 16px; border-radius: 8px; margin-bottom: 20px; font-weight: 500; animation: fadeIn 0.3s ease; } .status.success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .status.error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .logs { background: #f8f9fa; border-radius: 12px; padding: 20px; margin-top: 20px; } .logs h3 { color: #333; margin-bottom: 15px; font-size: 1.1rem; } .log-container { max-height: 300px; overflow-y: auto; background: white; border-radius: 8px; padding: 10px; } .log-entry { padding: 8px 12px; margin-bottom: 5px; border-radius: 6px; font-size: 0.9rem; display: flex; gap: 10px; animation: slideIn 0.3s ease; } @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } } .log-entry.info { background: #e7f3ff; border-left: 3px solid #2196f3; } .log-entry.success { background: #e8f5e9; border-left: 3px solid #4caf50; } .log-entry.error { background: #ffebee; border-left: 3px solid #f44336; } .log-time { color: #999; font-size: 0.85rem; font-family: monospace; min-width: 80px; } .log-message { color: #333; flex: 1; } .footer { text-align: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #e1e8ed; } .footer p { color: #999; font-size: 0.85rem; margin-bottom: 5px; } /* Scrollbar styling */ .log-container::-webkit-scrollbar { width: 8px; } .log-container::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } .log-container::-webkit-scrollbar-thumb { background: #667eea; border-radius: 4px; } .log-container::-webkit-scrollbar-thumb:hover { background: #5568d3; } /* Responsive */ @media (max-width: 640px) { .card { padding: 25px; } .header h1 { font-size: 1.5rem; } .code { font-size: 1.4rem; letter-spacing: 2px; } }