/* ============================================================================ Cards ============================================================================ */ .admin-card { background: var(--card-bg); border: 1px solid var(--glass-border); box-shadow: var(--glass-shadow); border-radius: var(--border-radius); overflow: hidden; margin-bottom: 1rem; } .admin-card:last-child { margin-bottom: 0; } .admin-card-header { padding: 14px 18px; border-bottom: 1px solid var(--border-color); } .admin-card-title { font-size: 14px; font-weight: 650; color: var(--text-primary); margin: 0 0 12px 0; } .admin-card-body { padding: 18px; } @media (max-width: 480px) { .admin-card-body { padding: 12px; } .admin-card-header { padding: 12px; } } /* ============================================================================ Badges ============================================================================ */ .admin-badge { display: inline-flex; align-items: center; gap: 0.375rem; padding: 3px 9px; border-radius: 9999px; font-size: 11.5px; font-weight: 600; border: none; font-family: inherit; white-space: nowrap; max-width: 100%; } .admin-badge-wrap { white-space: normal; word-break: break-word; border-radius: var(--border-radius-sm); text-align: left; } .admin-badge-admin { background: var(--accent-soft); color: var(--accent-color); } .admin-badge-viewer { background: var(--bg-tertiary); color: var(--text-secondary); } .admin-badge-active { background: var(--success-soft); color: var(--success); cursor: pointer; transition: var(--transition); } .admin-badge-active:hover { background: color-mix(in srgb, var(--success) 20%, transparent); } .admin-badge-inactive { background: var(--danger-soft); color: var(--danger); cursor: pointer; transition: var(--transition); } .admin-badge-inactive:hover { background: color-mix(in srgb, var(--danger) 20%, transparent); } .admin-badge-success { background: var(--success-soft); color: var(--success); } .admin-badge-warning { background: var(--warning-soft); color: var(--warning); } .admin-badge-secondary { background: var(--bg-tertiary); color: var(--text-muted); } .admin-badge-info { background: var(--info-soft); color: var(--info); } .admin-badge-danger { background: var(--danger-soft); color: var(--danger); } /* Status Badges - Leave Requests */ .badge-pending { background: color-mix(in srgb, var(--warning) 15%, transparent); color: var(--warning); } .badge-approved { background: color-mix(in srgb, var(--success) 15%, transparent); color: var(--success); } .badge-rejected { background: color-mix(in srgb, var(--danger) 15%, transparent); color: var(--danger); } .badge-cancelled { background: var(--muted-light); color: var(--muted); } /* Status Badges - Orders */ .admin-badge-order-prijata { background: color-mix(in srgb, var(--info) 15%, transparent); color: var(--info); } .admin-badge-order-realizace { background: color-mix(in srgb, var(--warning) 15%, transparent); color: var(--warning); } .admin-badge-order-dokoncena { background: color-mix(in srgb, var(--success) 15%, transparent); color: var(--success); } .admin-badge-order-stornovana { background: color-mix(in srgb, var(--danger) 15%, transparent); color: var(--danger); } /* Status Badges - Projects */ .admin-badge-project-aktivni { background: color-mix(in srgb, var(--success) 15%, transparent); color: var(--success); } .admin-badge-project-dokonceny { background: color-mix(in srgb, var(--info) 15%, transparent); color: var(--info); } .admin-badge-project-zruseny { background: color-mix(in srgb, var(--danger) 15%, transparent); color: var(--danger); } /* Badge on mobile - larger for touch */ @media (max-width: 768px) { .admin-badge { padding: 4px 10px; font-size: 12px; } button.admin-badge { min-height: 32px; } } /* ============================================================================ Modals ============================================================================ */ .admin-modal-overlay { position: fixed; inset: 0; z-index: 50; display: flex; align-items: center; justify-content: center; padding: 1rem; overflow: hidden; overscroll-behavior: none; touch-action: none; } .admin-modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.6); touch-action: none; } .admin-modal { position: relative; width: 100%; max-width: 480px; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--border-radius); max-height: calc(100vh - 2rem); max-height: calc(100dvh - 2rem); overflow: hidden; display: flex; flex-direction: column; touch-action: auto; } .admin-modal-lg { max-width: 900px; } .admin-modal-header { padding: 18px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .admin-modal-title { font-size: 16px; font-weight: 700; color: var(--text-primary); } .admin-modal-body { padding: 18px; overflow-y: auto; flex: 1; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; background: var(--bg-primary); } .admin-modal-footer { padding: 14px 18px; border-top: 1px solid var(--border-color); display: flex; gap: 0.75rem; justify-content: flex-end; flex-shrink: 0; } @media (max-width: 768px) { .admin-modal-overlay { padding: 0; } .admin-modal, .admin-modal.admin-modal-lg { max-width: 100%; width: 100%; height: 100%; height: 100dvh; max-height: 100%; max-height: 100dvh; border-radius: 0; border: none; } .admin-modal-header { padding: 1rem; padding-top: calc(1rem + env(safe-area-inset-top, 0px)); } .admin-modal-body { padding: 1rem; flex: 1; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; } .admin-modal-footer { padding: 1rem; padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); } .admin-modal .admin-form-input, .admin-modal .admin-form-select, .admin-modal .admin-form-textarea { max-width: 100%; } } /* Confirm Modal */ .admin-confirm-modal { max-width: 400px; } .admin-confirm-content { text-align: center; padding: 2rem 1.5rem; } .admin-confirm-icon { width: 56px; height: 56px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1.25rem; } .admin-confirm-icon-danger { background: var(--danger-light); color: var(--danger); } .admin-confirm-icon-warning { background: var(--warning-light); color: var(--warning); } .admin-confirm-icon-info { background: var(--info-light); color: var(--info); } .admin-confirm-icon-default { background: var(--bg-tertiary); color: var(--text-secondary); } .admin-confirm-title { font-size: 1.25rem; font-weight: 700; color: var(--text-primary); margin-bottom: 0.5rem; } .admin-confirm-message { color: var(--text-secondary); font-size: 0.95rem; line-height: 1.5; } @media (max-width: 768px) { .admin-confirm-modal { max-width: 100%; height: auto; max-height: calc(100% - 2rem); max-height: calc(100dvh - 2rem); margin: 1rem; border-radius: var(--border-radius); border: 1px solid var(--border-color); } .admin-confirm-modal .admin-modal-footer { padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); } } /* Confirm modal on small mobile */ @media (max-width: 480px) { .admin-confirm-content { padding: 1.5rem 1rem; } .admin-confirm-title { font-size: 1.1rem; } .admin-confirm-message { font-size: 0.875rem; } } /* ============================================================================ Toast Alerts ============================================================================ */ .admin-alert-container { position: fixed; bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); right: 1rem; z-index: 100; display: flex; flex-direction: column-reverse; gap: 0.5rem; max-width: 400px; width: calc(100% - 2rem); pointer-events: none; transform: translateZ(0); } @media (min-width: 640px) { .admin-alert-container { bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px)); right: 1.5rem; } } .admin-toast { display: flex; align-items: center; gap: 0.75rem; padding: 0.875rem 1rem; border-radius: var(--border-radius-sm); background: var(--bg-secondary); border: 1px solid var(--border-color); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); pointer-events: auto; } .admin-toast-icon { flex-shrink: 0; display: flex; align-items: center; justify-content: center; } .admin-toast-message { flex: 1; font-size: 0.875rem; color: var(--text-primary); } .admin-toast-close { flex-shrink: 0; padding: 0.25rem; background: transparent; border: none; color: var(--text-muted); cursor: pointer; border-radius: var(--border-radius-sm); transition: var(--transition); } .admin-toast-close:hover { background: var(--bg-tertiary); color: var(--text-primary); } .admin-toast-success .admin-toast-icon { color: var(--success); } .admin-toast-error .admin-toast-icon { color: var(--danger); } .admin-toast-warning .admin-toast-icon { color: var(--warning); } .admin-toast-info .admin-toast-icon { color: var(--info); } /* ============================================================================ Tabs (Global) ============================================================================ */ .admin-tabs { display: inline-flex; gap: 4px; padding: 4px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 0.625rem; } .admin-tab { position: relative; display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1.25rem; background: transparent; border: none; border-radius: 0.5rem; color: var(--text-muted); font-size: 0.8125rem; font-weight: 500; font-family: inherit; cursor: pointer; transition: color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease; letter-spacing: 0.01em; white-space: nowrap; } .admin-tab:hover { color: var(--text-primary); } .admin-tab.active { color: var(--text-primary); font-weight: 600; background: var(--bg-secondary); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 0 0 1px var(--border-color); } /* ============================================================================ Empty State ============================================================================ */ .admin-empty-state { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 3rem 1.5rem; color: var(--text-secondary); } .admin-empty-icon { width: 64px; height: 64px; border-radius: 50%; background: var(--bg-tertiary); color: var(--text-muted); display: flex; align-items: center; justify-content: center; margin-bottom: 1.25rem; } .admin-empty-state p { margin-bottom: 1rem; font-size: 0.95rem; max-width: 320px; } .admin-role-locked-notice { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; background: var(--warning-light); border: 1px solid color-mix(in srgb, var(--warning) 25%, transparent); border-radius: 0.5rem; color: var(--warning); font-size: 0.875rem; margin-bottom: 0.5rem; } /* ============================================================================ Forbidden (403) ============================================================================ */ .forbidden-page { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 60vh; text-align: center; padding: 2rem; } .forbidden-icon { color: var(--accent-color); margin-bottom: 1.5rem; opacity: 0.8; } .forbidden-title { font-family: var(--font-heading); font-size: 2rem; font-weight: 700; color: var(--text-primary); margin: 0 0 0.75rem; } .forbidden-text { color: var(--text-secondary); font-size: 1rem; max-width: 400px; line-height: 1.6; margin: 0 0 2rem; } .forbidden-link { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: var(--accent-color); color: #fff; border-radius: var(--border-radius-sm); text-decoration: none; font-weight: 600; transition: var(--transition); } .forbidden-link:hover { background: var(--accent-hover); transform: translateY(-1px); } /* ============================================================================ Stat Cards ============================================================================ */ .admin-stat-card { position: relative; background: var(--glass-bg); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid var(--glass-border); box-shadow: var(--glass-shadow); border-radius: var(--border-radius); padding: 1.25rem; display: flex; flex-direction: column; gap: 0.5rem; overflow: hidden; } .admin-stat-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--accent-color); border-radius: var(--border-radius) var(--border-radius) 0 0; } .admin-stat-card.success::before { background: var(--success); } .admin-stat-card.warning::before { background: var(--warning); } .admin-stat-card.danger::before { background: var(--danger); } .admin-stat-card.info::before { background: var(--info); } .admin-stat-icon { width: 40px; height: 40px; border-radius: var(--border-radius-sm); background: var(--accent-soft); color: var(--accent-color); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .admin-stat-content { display: flex; flex-direction: column; gap: 0.125rem; } .admin-stat-value { font-size: 28px; font-weight: 700; color: var(--text-primary); font-family: var(--font-mono); letter-spacing: -0.02em; line-height: 1.2; } .admin-stat-label { font-size: 0.6875rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; } .admin-stat-footer { font-size: 0.75rem; color: var(--text-secondary); } .admin-stat-icon.danger { background: var(--danger-soft); color: var(--danger); } .admin-stat-icon.info { background: var(--info-soft); color: var(--info); } .admin-stat-icon.success { background: var(--success-soft); color: var(--success); } .admin-stat-icon.warning { background: var(--warning-soft); color: var(--warning); } /* ============================================================================ KPI Grid ============================================================================ */ .admin-kpi-grid { display: grid; gap: 0.875rem; } .admin-kpi-4 { grid-template-columns: repeat(4, 1fr); } .admin-kpi-3 { grid-template-columns: repeat(3, 1fr); } .admin-kpi-2 { grid-template-columns: repeat(2, 1fr); } .admin-kpi-1 { grid-template-columns: 1fr; max-width: 320px; } @media (max-width: 1024px) { .admin-kpi-4 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 768px) { .admin-kpi-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 480px) { .admin-kpi-grid { grid-template-columns: 1fr; } } /* ============================================================================ Editor Section Cards ============================================================================ */ .admin-editor-section { background: var(--glass-bg); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid var(--glass-border); box-shadow: var(--glass-shadow); border-radius: 0.75rem; padding: 1.5rem; margin-bottom: 1.5rem; } @media (max-width: 640px) { .admin-editor-section { padding: 1rem; } } /* ============================================================================ Totals Summary ============================================================================ */ .admin-totals-summary { display: flex; flex-direction: column; align-items: flex-end; gap: 0.25rem; padding-top: 0.75rem; border-top: 1px solid var(--border-color); } .admin-totals-row { display: flex; gap: 2rem; justify-content: flex-end; min-width: 250px; padding: 0.25rem 0; font-size: 0.875rem; color: var(--text-secondary); } .admin-totals-row span:last-child { min-width: 100px; text-align: right; font-weight: 500; color: var(--text-primary); } .admin-totals-total { border-top: 2px solid var(--text-primary); margin-top: 0.25rem; padding-top: 0.5rem; font-size: 1rem; font-weight: 600; } .admin-totals-total span:last-child { font-weight: 700; } @media (max-width: 640px) { .admin-totals-summary { align-items: stretch; } .admin-totals-row { min-width: unset; } } /* ============================================================================ Scope Sections ============================================================================ */ .admin-scope-list { margin-top: 1.25rem; display: flex; flex-direction: column; gap: 1rem; } .admin-scope-section { border: 1px solid var(--border-color); border-radius: 0.5rem; overflow: visible; transition: border-color var(--transition); background: var(--bg-primary); } .admin-scope-content { overflow: hidden; } .admin-scope-section:hover { border-color: color-mix( in srgb, var(--border-color) 70%, var(--accent-color) ); } .admin-scope-section-header { display: flex; align-items: center; padding: 0.625rem 1rem; background: var(--bg-tertiary); border-bottom: 1px solid var(--border-color); border-radius: 0.5rem 0.5rem 0 0; gap: 0.5rem; } .admin-scope-section-header .admin-scope-number { font-size: 0.75rem; font-weight: 600; color: var(--text-tertiary); flex-shrink: 0; min-width: 1.25rem; } .admin-scope-section-header .admin-scope-title { font-weight: 600; font-size: 0.875rem; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; } .admin-scope-section-header .admin-scope-actions { display: flex; gap: 0.25rem; margin-left: auto; flex-shrink: 0; } .admin-scope-section .admin-form { padding: 1rem; } /* ============================================================================ Logo Section ============================================================================ */ .admin-logo-section { display: flex; flex-direction: column; align-items: center; gap: 1rem; padding: 1rem; } .admin-logo-preview { max-width: 200px; max-height: 100px; border: 1px solid var(--border-color); border-radius: 0.5rem; overflow: hidden; display: flex; align-items: center; justify-content: center; padding: 0.5rem; background: #fff; } .admin-logo-preview img { max-width: 100%; max-height: 80px; object-fit: contain; }