/* ============================================ COMPONENTS - Reusable UI Components ============================================ */ /* Unified Island Component */ .island { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 12px; padding: 1.5rem; overflow-y: auto; } /* Island with header/content structure */ .island.with-header { padding: 0; display: flex; flex-direction: column; overflow: hidden; } .island-header { padding: 1rem 1.5rem; border-bottom: 1px solid var(--border); background: var(--bg-secondary); } .island-header h3 { margin: 0; color: var(--text-primary); font-size: 1rem; font-weight: 600; } .island-content { flex: 1; padding: 1.5rem; overflow-y: auto; background: var(--bg-secondary); } /* Buttons */ .btn { padding: 0.625rem 1.25rem; border: none; border-radius: 6px; font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: all 0.2s; display: inline-flex; align-items: center; gap: 0.5rem; } .btn-primary { background: var(--accent); color: white; } .btn-primary:hover { background: var(--accent-hover); } .btn-secondary { background: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border); } .btn-secondary:hover { background: var(--bg-secondary); border-color: var(--accent); } .btn-danger { background: var(--error); color: white; } .btn-danger:hover { background: #dc2626; } .btn-success { background: var(--success); color: white; } .btn-success:hover { background: #059669; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Status Badges */ .status-badge { padding: 0.25rem 0.625rem; border-radius: 12px; font-size: 0.75rem; font-weight: 600; text-transform: capitalize; } .status-created { background: #64748b; color: white; } .status-queued { background: #3b82f6; color: white; } .status-running { background: #f59e0b; color: white; } .status-completed { background: #10b981; color: white; } .status-failed { background: #ef4444; color: white; } .status-unknown { background: #64748b; color: white; } /* Loading Spinner */ .loading-spinner { display: flex; align-items: center; justify-content: center; padding: 2rem; color: var(--text-muted); font-size: 0.875rem; } /* Status Display */ .status-display { display: flex; align-items: center; justify-content: center; padding: 2rem; text-align: center; } .status-display.idle { color: var(--text-muted); } .status-display.running { color: var(--warning); } .status-display.completed { color: var(--success); } .status-display.error { color: var(--error); } .status-text h4 { margin-bottom: 0.5rem; color: inherit; } .status-text p { color: var(--text-muted); font-size: 0.875rem; } /* Code Block */ .code-block { background: var(--bg-primary); border: 1px solid var(--border); border-radius: 4px; padding: 1rem; color: var(--text-primary); font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; font-size: 0.875rem; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; margin: 0; } /* Toast Notifications */ .toast { position: fixed; top: 80px; right: 1.5rem; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 8px; padding: 1rem 1.5rem; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); z-index: 1000; max-width: 400px; animation: slideIn 0.3s ease-out; } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .toast.error { border-color: var(--error); } .toast.success { border-color: var(--success); } /* Form Elements */ input[type="text"], input[type="password"], input[type="number"], textarea, select { background: var(--bg-primary); border: 1px solid var(--border); border-radius: 6px; padding: 0.625rem; color: var(--text-primary); font-size: 0.875rem; width: 100%; transition: border-color 0.2s; } input:focus, textarea:focus, select:focus { outline: none; border-color: var(--accent); } textarea { resize: vertical; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; } /* Pulse Animation */ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } .pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }