/* Admin Panel Styles */ /* Core Variables */ :root { --primary-color: #4f46e5; --primary-hover: #4338ca; --success-color: #10b981; --success-hover: #059669; --warning-color: #f59e0b; --warning-hover: #d97706; --error-color: #ef4444; --error-hover: #dc2626; --info-color: #3b82f6; --info-hover: #2563eb; } /* Dark Mode Variables */ .dark { --bg-color: #0f172a; --card-bg: #1e293b; --border-color: #334155; --text-primary: #f8fafc; --text-secondary: #e2e8f0; --hover-bg: #334155; --input-bg: #1e293b; --shadow-color: rgba(0, 0, 0, 0.3); --table-header-bg: #1e293b; --table-row-hover: #334155; --dark-btn-hover: #475569; } /* Light Mode Variables */ :root { --bg-color: #f8fafc; --card-bg: #ffffff; --border-color: #e2e8f0; --text-primary: #1e293b; --text-secondary: #64748b; --hover-bg: #f1f5f9; --input-bg: #ffffff; --shadow-color: rgba(0, 0, 0, 0.1); --table-header-bg: #f8fafc; --table-row-hover: #f1f5f9; --dark-btn-hover: #f1f5f9; } /* Korrektur für Dark Mode Hintergrund */ .dark .bg-white.dark\:bg-dark-card { background-color: #1e293b !important; } /* Zusätzliche Dark Mode Korrekturen */ html.dark body .bg-white.dark\:bg-dark-card { background-color: #1e293b !important; } .dark .bg-slate-50 { background-color: #0f172a !important; } .dark .bg-slate-800 { background-color: #0f172a !important; } .dark .printer-card { background-color: #1e293b !important; } .dark tbody.bg-white.dark\:bg-dark-card { background-color: #1e293b !important; } /* Spezifischere Selektoren für das Admin-Panel im Dark Mode */ body.dark .admin-container .bg-white.dark\:bg-dark-card { background-color: #1e293b !important; } body.dark #users-tab .bg-white.dark\:bg-dark-card, body.dark #printers-tab .bg-white.dark\:bg-dark-card, body.dark #scheduler-tab .bg-white.dark\:bg-dark-card, body.dark #system-tab .bg-white.dark\:bg-dark-card, body.dark #logs-tab .bg-white.dark\:bg-dark-card { background-color: #1e293b !important; } body.dark .admin-stats .stat-card { background-color: #1e293b !important; } body.dark .bg-slate-50.dark\:bg-slate-800 { background-color: #0f172a !important; } /* Admin Panel Container */ .admin-container { max-width: 1280px; margin: 0 auto; padding: 2rem; } /* Navigation Tabs */ .nav-tabs { display: flex; border-bottom: 1px solid var(--border-color); margin-bottom: 1rem; overflow-x: auto; scrollbar-width: thin; } .nav-tabs::-webkit-scrollbar { height: 5px; } .nav-tabs::-webkit-scrollbar-thumb { background-color: var(--border-color); border-radius: 5px; } .nav-tab { padding: 1rem 1.5rem; color: var(--text-secondary); border-bottom: 2px solid transparent; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; } .nav-tab:hover { color: var(--text-primary); background-color: var(--hover-bg); } .nav-tab.active { color: var(--primary-color); border-bottom: 2px solid var(--primary-color); font-weight: 500; } .nav-tab .icon { margin-right: 0.5rem; } /* Tab Content */ .tab-content { margin-top: 2rem; } .tab-pane { display: none; } .tab-pane.active { display: block; } /* Admin Stats */ .admin-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem; margin-bottom: 2rem; } .stat-card { background-color: var(--card-bg); border-radius: 0.75rem; border: 1px solid var(--border-color); padding: 1.25rem; position: relative; overflow: hidden; box-shadow: 0 4px 6px -1px var(--shadow-color), 0 2px 4px -1px var(--shadow-color); transition: transform 0.2s ease, box-shadow 0.2s ease; } .stat-card:hover { transform: translateY(-2px); box-shadow: 0 10px 15px -3px var(--shadow-color), 0 4px 6px -2px var(--shadow-color); } .stat-icon { position: absolute; top: 1rem; right: 1rem; opacity: 0.15; font-size: 2.5rem; } .stat-title { font-size: 0.875rem; color: var(--text-secondary); margin-bottom: 0.5rem; font-weight: 500; text-transform: uppercase; } .stat-value { font-size: 1.5rem; font-weight: 600; color: var(--text-primary); margin-bottom: 0.25rem; } .stat-desc { font-size: 0.875rem; color: var(--text-secondary); } /* Primary Button */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.5rem 1rem; font-weight: 500; font-size: 0.875rem; border-radius: 0.375rem; cursor: pointer; transition: all 0.2s ease; } .btn-primary { background-color: var(--primary-color); color: white; } .btn-primary:hover { background-color: var(--primary-hover); } .btn-secondary { background-color: transparent; color: var(--text-primary); border: 1px solid var(--border-color); } .btn-secondary:hover { background-color: var(--hover-bg); } .btn-success { background-color: var(--success-color); color: white; } .btn-success:hover { background-color: var(--success-hover); } .btn-error { background-color: var(--error-color); color: white; } .btn-error:hover { background-color: var(--error-hover); } .btn-warning { background-color: var(--warning-color); color: white; } .btn-warning:hover { background-color: var(--warning-hover); } .btn-info { background-color: var(--info-color); color: white; } .btn-info:hover { background-color: var(--info-hover); } /* Form Elements */ .form-group { margin-bottom: 1.5rem; } .form-label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: var(--text-primary); } .form-input, .form-select, .form-textarea { width: 100%; padding: 0.625rem; border: 1px solid var(--border-color); border-radius: 0.375rem; background-color: var(--input-bg); color: var(--text-primary); transition: border-color 0.2s ease; } .form-input:focus, .form-select:focus, .form-textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2); } /* Modal Styles */ .modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: none; z-index: 50; align-items: center; justify-content: center; overflow-y: auto; transition: opacity 0.3s ease; opacity: 0; } .modal.show { display: flex; opacity: 1; } .modal-dialog { background-color: var(--card-bg); border-radius: 0.5rem; box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); width: 100%; max-width: 500px; transform: scale(0.9); transition: transform 0.3s ease; } .modal.show .modal-dialog { transform: scale(1); } .modal-header { display: flex; align-items: center; justify-content: space-between; padding: 1rem 1.5rem; border-bottom: 1px solid var(--border-color); } .modal-title { font-size: 1.25rem; font-weight: 600; color: var(--text-primary); margin: 0; } .modal-close { background: transparent; border: none; color: var(--text-secondary); padding: 0.25rem; cursor: pointer; transition: color 0.2s ease; display: flex; align-items: center; justify-content: center; } .modal-close:hover { color: var(--error-color); } .modal-body { padding: 1.5rem; } .modal-footer { display: flex; align-items: center; justify-content: flex-end; gap: 0.75rem; padding: 1rem 1.5rem; border-top: 1px solid var(--border-color); } /* Badge Styles */ .badge { display: inline-flex; align-items: center; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; } .badge-success { background-color: rgba(16, 185, 129, 0.1); color: var(--success-color); } .badge-error { background-color: rgba(239, 68, 68, 0.1); color: var(--error-color); } .badge-warning { background-color: rgba(245, 158, 11, 0.1); color: var(--warning-color); } .badge-info { background-color: rgba(59, 130, 246, 0.1); color: var(--info-color); } /* Log Entry Styles */ .log-entry { padding: 0.75rem; border-radius: 0.375rem; margin-bottom: 0.5rem; font-size: 0.875rem; transition: background-color 0.2s ease; } .log-entry:hover { background-color: var(--hover-bg); } .log-debug { border-left: 3px solid #9ca3af; background-color: rgba(156, 163, 175, 0.1); } .log-info { border-left: 3px solid var(--info-color); background-color: rgba(59, 130, 246, 0.1); } .log-warning { border-left: 3px solid var(--warning-color); background-color: rgba(245, 158, 11, 0.1); } .log-error { border-left: 3px solid var(--error-color); background-color: rgba(239, 68, 68, 0.1); } .log-critical { border-left: 3px solid #7c3aed; background-color: rgba(124, 58, 237, 0.1); } /* Scheduler Status */ .scheduler-status { display: flex; align-items: center; padding: 1rem; background-color: var(--card-bg); border-radius: 0.5rem; border: 1px solid var(--border-color); margin-bottom: 1rem; } .status-indicator { width: 12px; height: 12px; border-radius: 50%; margin-right: 0.75rem; } .status-running { background-color: var(--success-color); animation: pulse 2s infinite; } .status-stopped { background-color: var(--error-color); } .pulse { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7); animation: pulse 2s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); } 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); } } .status-text { font-weight: 500; } .printer-card { background-color: var(--card-bg); border-radius: 0.5rem; border: 1px solid var(--border-color); padding: 1rem; transition: all 0.2s ease; } .printer-card:hover { transform: translateY(-2px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } .printer-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 1rem; } .printer-name { font-weight: 600; color: var(--text-primary); margin-bottom: 0.25rem; } .printer-actions { display: flex; gap: 0.5rem; } .printer-info { display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; margin-bottom: 1rem; } .printer-status { display: flex; align-items: center; font-size: 0.875rem; margin-bottom: 0.5rem; } .printer-status .status-indicator { width: 8px; height: 8px; } .tasks-table { width: 100%; border-collapse: collapse; } .tasks-table th { padding: 0.75rem 1rem; text-align: left; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; color: var(--text-secondary); border-bottom: 1px solid var(--border-color); } .tasks-table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); } .tasks-table tr:hover td { background-color: var(--hover-bg); } @media (max-width: 768px) { .admin-stats { grid-template-columns: 1fr; } .modal-dialog { max-width: 90%; margin: 1rem; } } .dark .stat-card { background-color: var(--card-bg); } .dark .form-input, .dark .form-select, .dark .form-textarea { background-color: var(--input-bg); border-color: var(--border-color); color: var(--text-primary); } .dark .form-input:focus, .dark .form-select:focus, .dark .form-textarea:focus { border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.3); } .dark .modal-dialog { background-color: var(--card-bg); border-color: var(--border-color); box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.4); } .dark .modal-header { border-bottom-color: var(--border-color); } .dark .modal-footer { border-top-color: var(--border-color); } .dark .scheduler-status { background-color: var(--card-bg); border-color: var(--border-color); } .dark .pulse { animation: darkPulse 2s infinite; } @keyframes darkPulse { 0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); } 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); } } .dark .bg-slate-50 { background-color: #1e293b; } .dark .bg-slate-800 { background-color: #0f172a; } .dark .dark-bg-card, .dark\:bg-dark-card:is(.dark *) { background-color: var(--card-bg); } .dark .log-entry { border-color: var(--border-color); background-color: var(--card-bg); } .dark .log-entry:hover { background-color: var(--hover-bg); } .dark .badge-success { background-color: rgba(16, 185, 129, 0.2); color: #34d399; } .dark .badge-error { background-color: rgba(239, 68, 68, 0.2); color: #f87171; } .dark .badge-warning { background-color: rgba(245, 158, 11, 0.2); color: #fbbf24; } .dark .badge-info { background-color: rgba(59, 130, 246, 0.2); color: #60a5fa; } .dark .printer-card { background-color: var(--card-bg); border-color: var(--border-color); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2); } .dark .printer-card:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.2); } .dark .status-running { background-color: #10b981; box-shadow: 0 0 8px rgba(16, 185, 129, 0.6); } .dark .status-stopped { background-color: #ef4444; box-shadow: 0 0 8px rgba(239, 68, 68, 0.6); } .dark .alert { border-color: var(--border-color); } .dark .alert-success { background-color: rgba(16, 185, 129, 0.2); border-left-color: #10b981; } .dark .alert-error { background-color: rgba(239, 68, 68, 0.2); border-left-color: #ef4444; } .dark .alert-warning { background-color: rgba(245, 158, 11, 0.2); border-left-color: #f59e0b; } .dark .alert-info { background-color: rgba(59, 130, 246, 0.2); border-left-color: #3b82f6; } /* Notification Styles */ .notification { position: fixed; bottom: 2rem; left: 50%; transform: translateX(-50%) translateY(100%); background-color: var(--card-bg); border: 1px solid var(--border-color); border-radius: 0.5rem; padding: 1rem 1.5rem; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); z-index: 40; transition: transform 0.3s ease; opacity: 0; max-width: 90%; width: auto; } .notification.show { transform: translateX(-50%) translateY(0); opacity: 1; } .notification-success { border-left: 4px solid var(--success-color); } .notification-error { border-left: 4px solid var(--error-color); } .notification-warning { border-left: 4px solid var(--warning-color); } .notification-info { border-left: 4px solid var(--info-color); } /* Verbesserte Sichtbarkeit */ .hidden { display: none !important; } /* Progress Bar Classes */ .progress-bar { width: 100%; background-color: #e5e7eb; border-radius: 9999px; height: 0.625rem; } .dark .progress-bar { background-color: #374151; } .progress-bar-fill { height: 0.625rem; border-radius: 9999px; } .progress-bar-fill-blue { background-color: #2563eb; } .dark .progress-bar-fill-blue { background-color: #3b82f6; } .progress-bar-fill-green { background-color: #16a34a; } .dark .progress-bar-fill-green { background-color: #22c55e; } .progress-bar-fill-purple { background-color: #9333ea; } .dark .progress-bar-fill-purple { background-color: #a855f7; } /* Alert styles for flash messages */ .alert { padding: 1rem; border-radius: 0.5rem; margin-bottom: 1rem; font-weight: 500; } .alert-success { background-color: #d1fae5; color: #047857; } .dark .alert-success { background-color: #065f46; color: #a7f3d0; } .alert-error { background-color: #fee2e2; color: #b91c1c; } .dark .alert-error { background-color: #991b1b; color: #fecaca; } .alert-warning { background-color: #fef3c7; color: #92400e; } .dark .alert-warning { background-color: #78350f; color: #fde68a; } .alert-info { background-color: #dbeafe; color: #1e40af; } .dark .alert-info { background-color: #1e3a8a; color: #bfdbfe; } /* Additional utilities */ .transition-colors { transition-property: color, background-color, border-color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 300ms; } /* Tailwind Dark Mode Overrides */ html.dark body [class*="dark\:bg-dark-card"] { background-color: #1e293b !important; } html.dark body [class*="dark\:bg-slate-800"] { background-color: #0f172a !important; } html.dark body [class*="dark\:bg-slate-700"] { background-color: #1e293b !important; } html.dark body div[class*="dark\:hover\:bg"] { background-color: #1e293b !important; } html.dark body tr[class*="dark\:hover\:bg"] { background-color: #1e293b !important; } html.dark body tr[class*="dark\:hover\:bg"]:hover { background-color: #334155 !important; } /* Ensure proper transition */ .transition-colors { transition-property: color, background-color, border-color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 300ms; }