/** * Sistema de Diseño & Tokens de Color - Edu-Space Admin * Paleta Institucional Magenta / Uva y Soporte Claro/Oscuro */ :root { /* --- Brand Primary (Magenta / Uva) --- */ --brand-primary: #9E2D77; --brand-primary-rgb: 158, 45, 119; --brand-primary-shade: #832062; --brand-primary-tint: #B43E8E; --brand-primary-contrast: #FFFFFF; /* --- Accent Colors (Modo Claro) con Alto Contraste --- */ --accent-purple: #581C87; --accent-purple-rgb: 88, 28, 135; --secondary-magenta: #701A40; --secondary-magenta-rgb: 112, 26, 64; /* --- Global Surface & Text (Modo Claro - Diseñado para Descanso Visual y Nitidez) --- */ --app-bg: #EEF2F6; --card-bg: #FFFFFF; --card-border: #D8E0E9; --card-hover-border: #9E2D77; --card-shadow: 0 2px 10px rgba(15, 23, 42, 0.05), 0 1px 3px rgba(15, 23, 42, 0.03); --card-hover-shadow: 0 8px 24px rgba(15, 23, 42, 0.08); --text-primary: #0F172A; --text-secondary: #334155; --text-muted: #475569; --navbar-bg: linear-gradient(135deg, #9E2D77 0%, #7B2049 100%); --navbar-text: #FFFFFF; --navbar-border: transparent; --navbar-shadow: 0 4px 16px rgba(158, 45, 119, 0.22); --input-bg: #FFFFFF; --input-border: #94A3B8; --input-text: #0F172A; --input-focus-border: #9E2D77; --input-focus-shadow: 0 0 0 0.2rem rgba(158, 45, 119, 0.2); /* --- Distinctive Gradient --- */ --gradient-primary: linear-gradient(135deg, #9E2D77 0%, #832062 100%); --gradient-primary-shadow: 0 6px 18px rgba(158, 45, 119, 0.25); --gradient-hero: linear-gradient(135deg, rgba(158, 45, 119, 0.06) 0%, rgba(88, 28, 135, 0.08) 100%); /* --- Badges (Modo Claro) --- */ --badge-primary-bg: #9E2D77; --badge-primary-text: #FFFFFF; --badge-accent-bg: #581C87; --badge-accent-text: #FFFFFF; --badge-magenta-bg: #701A40; --badge-magenta-text: #FFFFFF; } [data-bs-theme="light"] { --bs-body-bg: #EEF2F6; --bs-body-color: #0F172A; --bs-secondary-color: #475569; --bs-tertiary-bg: #F1F5F9; --bs-border-color: #D8E0E9; --bs-border-color-translucent: rgba(15, 23, 42, 0.12); } /* ======================================================= MODO OSCURO ([data-bs-theme="dark"]) ======================================================= */ [data-bs-theme="dark"] { /* --- Brand Tweaks for Dark Theme --- */ --brand-primary: #B43E8E; --brand-primary-tint: #C95FA6; /* --- Accent Colors (Modo Oscuro) --- */ --accent-purple: #AE7FFF; --secondary-magenta: #FF8AB6; /* --- Surfaces & Contrast in Dark Mode --- */ --app-bg: #121622; --card-bg: #1E2442; --card-border: rgba(255, 255, 255, 0.08); --card-hover-border: rgba(180, 62, 142, 0.5); --card-shadow: 0 8px 25px rgba(0, 0, 0, 0.4); --card-hover-shadow: 0 12px 30px rgba(180, 62, 142, 0.25); --text-primary: #E2E8F0; --text-secondary: #94A3B8; --text-muted: #64748B; --navbar-bg: linear-gradient(135deg, #24142D 0%, #161A2E 100%); --navbar-text: #F8FAFC; --navbar-border: 1px solid rgba(180, 62, 142, 0.25); --navbar-shadow: 0 4px 25px rgba(0, 0, 0, 0.5); --input-bg: #161B30; --input-border: #2D3748; --input-text: #E2E8F0; --input-focus-border: #B43E8E; --input-focus-shadow: 0 0 0 0.2rem rgba(180, 62, 142, 0.35); --gradient-hero: linear-gradient(135deg, rgba(180, 62, 142, 0.18) 0%, rgba(30, 36, 66, 0.8) 100%); /* --- Badges & Chips (Translucent in Dark Mode) --- */ --badge-primary-bg: rgba(180, 62, 142, 0.25); --badge-primary-text: #FF8AB6; --badge-primary-border: 1px solid rgba(180, 62, 142, 0.45); --badge-accent-bg: rgba(104, 44, 173, 0.25); --badge-accent-text: #AE7FFF; --badge-accent-border: 1px solid rgba(174, 127, 255, 0.45); --badge-magenta-bg: rgba(123, 32, 73, 0.25); --badge-magenta-text: #FF96B4; --badge-magenta-border: 1px solid rgba(255, 138, 182, 0.4); } /* ======================================================= ELEMENTOS GLOBALES & TRANSICIONES ======================================================= */ body { background-color: var(--app-bg) !important; color: var(--text-primary) !important; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; transition: background-color 0.25s ease, color 0.25s ease; min-height: 100vh; } /* Navbar */ .navbar-app { background: var(--navbar-bg) !important; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: var(--navbar-border); box-shadow: var(--navbar-shadow); padding: 0.65rem 1.25rem; transition: background 0.3s ease, box-shadow 0.3s ease; } .navbar-app .navbar-brand { color: var(--navbar-text) !important; font-weight: 700; letter-spacing: -0.01em; display: flex; align-items: center; gap: 0.5rem; } .navbar-app .nav-link { color: rgba(255, 255, 255, 0.85) !important; font-weight: 500; transition: color 0.15s ease, transform 0.15s ease; border-radius: 8px; padding: 0.5rem 0.85rem !important; white-space: nowrap; } @media (max-width: 1280px) and (min-width: 992px) { .navbar-app { padding: 0.5rem 0.75rem !important; } .navbar-app .nav-link { padding: 0.4rem 0.5rem !important; font-size: 0.85rem; } .navbar-app .navbar-brand span { font-size: 0.95rem; } } .navbar-app .nav-link:hover, .navbar-app .nav-link:focus { color: #FFFFFF !important; background: rgba(255, 255, 255, 0.12); } .navbar-app .nav-link.active { color: #FFFFFF !important; background: rgba(255, 255, 255, 0.18); } .navbar-logo { height: 32px; width: auto; object-fit: contain; filter: none !important; } /* El isotipo de UniCABA se adapta a ambos modos sin alteraciones de color */ [data-bs-theme="light"] .navbar-logo, :root:not([data-bs-theme="dark"]) .navbar-logo, [data-bs-theme="dark"] .navbar-logo { filter: none !important; } /* User Avatar Component */ .user-avatar-small { width: 34px; height: 34px; border-radius: 50%; background: linear-gradient(135deg, #B43E8E, #682CAD); color: #FFFFFF; display: inline-flex; align-items: center; justify-content: center; font-size: 0.85rem; font-weight: 700; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); border: 2px solid rgba(255, 255, 255, 0.4); margin-right: 0.4rem; } /* Theme Toggle Button */ .theme-toggle-btn { width: 36px; height: 36px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.15); color: #FFFFFF; border: 1px solid rgba(255, 255, 255, 0.25); transition: all 0.2s ease; cursor: pointer; } .theme-toggle-btn:hover { background: rgba(255, 255, 255, 0.28); transform: rotate(15deg) scale(1.05); color: #FFFFFF; } /* Language Switcher Button (Alto Contraste en Navbar y Modo Claro) */ .navbar-app .language-switcher .btn { color: #FFFFFF !important; background: rgba(255, 255, 255, 0.16) !important; border: 1px solid rgba(255, 255, 255, 0.32) !important; border-radius: 8px; font-weight: 500; transition: all 0.2s ease; } .navbar-app .language-switcher .btn:hover, .navbar-app .language-switcher .btn:focus, .navbar-app .language-switcher .dropdown-toggle.show { color: #FFFFFF !important; background: rgba(255, 255, 255, 0.28) !important; border-color: rgba(255, 255, 255, 0.5) !important; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .navbar-app .language-switcher .dropdown-menu { border-radius: 10px; border: 1px solid var(--card-border); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); padding: 4px; } /* Dropdown Item Active (Gradiente Magenta Institucional en lugar de Azul) */ .dropdown-item { border-radius: 6px; padding: 0.45rem 0.85rem; font-size: 0.9rem; transition: background-color 0.15s ease, color 0.15s ease; } .dropdown-item.active, .dropdown-item:active { background: var(--gradient-primary) !important; color: #FFFFFF !important; } .dropdown-item.active i, .dropdown-item:active i { color: #FFFFFF !important; } /* ======================================================= CARDS & CONTENEDORES ======================================================= */ .card { background-color: var(--card-bg) !important; border: 1px solid var(--card-border) !important; color: var(--text-primary) !important; box-shadow: var(--card-shadow); border-radius: 14px; transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; } .card:hover { border-color: var(--card-hover-border) !important; } .card-header { background-color: transparent !important; border-bottom: 1px solid var(--card-border) !important; } .card-footer { background-color: rgba(0, 0, 0, 0.02) !important; border-top: 1px solid var(--card-border) !important; } [data-bs-theme="dark"] .card-footer { background-color: rgba(255, 255, 255, 0.02) !important; } /* Hero Banners */ .hero-banner { background: var(--gradient-hero) !important; border: 1px solid var(--card-border) !important; border-radius: 16px; } /* ======================================================= BOTONES Y ACCIONES ======================================================= */ .btn { border-radius: 10px; font-weight: 500; transition: all 0.2s ease-in-out; } .btn:active { transform: scale(0.98); } .btn-primary { background: var(--gradient-primary) !important; border: none !important; color: var(--brand-primary-contrast) !important; box-shadow: 0 4px 14px rgba(var(--brand-primary-rgb), 0.35); } .btn-primary:hover, .btn-primary:focus { background: linear-gradient(135deg, #9E367D 0%, #832765 100%) !important; box-shadow: 0 6px 18px rgba(var(--brand-primary-rgb), 0.45); transform: translateY(-1px); color: #FFFFFF !important; } .btn-outline-primary { color: var(--brand-primary) !important; border-color: var(--brand-primary) !important; background: transparent !important; } .btn-outline-primary:hover, .btn-outline-primary:focus { background: var(--gradient-primary) !important; border-color: var(--brand-primary-shade) !important; color: #FFFFFF !important; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(var(--brand-primary-rgb), 0.25); } /* Distinctive Text Accent */ .text-primary, .text-brand { color: var(--brand-primary) !important; } [data-bs-theme="dark"] .text-primary, [data-bs-theme="dark"] .text-brand { color: var(--brand-primary-tint) !important; } .text-accent-purple { color: var(--accent-purple) !important; } .text-secondary-magenta { color: var(--secondary-magenta) !important; } /* ======================================================= BADGES & CHIPS ======================================================= */ .badge { border-radius: 8px; font-weight: 600; padding: 0.4em 0.75em; letter-spacing: 0.01em; } .badge-brand { background-color: var(--badge-primary-bg) !important; color: var(--badge-primary-text) !important; border: var(--badge-primary-border, none); } .badge-approved { background-color: var(--badge-accent-bg) !important; color: var(--badge-accent-text) !important; border: var(--badge-accent-border, none); } .badge-schedule { background-color: var(--badge-magenta-bg) !important; color: var(--badge-magenta-text) !important; border: var(--badge-magenta-border, none); } /* ======================================================= FORMULARIOS & INPUTS ======================================================= */ .form-control, .form-select { background-color: var(--input-bg) !important; border-color: var(--input-border) !important; color: var(--input-text) !important; border-radius: 10px; padding: 0.6rem 0.9rem; transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; } .form-control:focus, .form-select:focus { border-color: var(--input-focus-border) !important; box-shadow: var(--input-focus-shadow) !important; } .form-control::placeholder { color: var(--text-muted) !important; } /* ======================================================= TARJETA DE LOGIN (.auth-card) ======================================================= */ .auth-wrapper { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 1.5rem; background: var(--app-bg); } .auth-card { background-color: var(--card-bg) !important; border: 1px solid var(--card-border) !important; border-left: 6px solid var(--brand-primary) !important; border-radius: 18px !important; box-shadow: 0 16px 40px rgba(0, 0, 0, 0.1); max-width: 460px; width: 100%; overflow: hidden; position: relative; transition: transform 0.25s ease, box-shadow 0.25s ease; } [data-bs-theme="dark"] .auth-card { box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5), 0 0 25px rgba(180, 62, 142, 0.15); } .auth-header { padding: 2.25rem 2rem 1.25rem; text-align: center; position: relative; } .auth-logo { max-height: 52px; max-width: 220px; width: auto; object-fit: contain; margin-bottom: 1rem; filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.15)); } .auth-controls { position: absolute; top: 1rem; right: 1rem; display: flex; align-items: center; gap: 0.5rem; } /* Controles de Login en Modo Claro (Tarjeta Blanca) */ [data-bs-theme="light"] .auth-controls .language-switcher .btn, :root:not([data-bs-theme="dark"]) .auth-controls .language-switcher .btn { color: var(--brand-primary) !important; background: rgba(var(--brand-primary-rgb), 0.08) !important; border: 1px solid rgba(var(--brand-primary-rgb), 0.25) !important; } [data-bs-theme="light"] .auth-controls .language-switcher .btn:hover, :root:not([data-bs-theme="dark"]) .auth-controls .language-switcher .btn:hover { color: #FFFFFF !important; background: var(--brand-primary) !important; border-color: var(--brand-primary) !important; } [data-bs-theme="light"] .auth-controls .theme-toggle-btn, :root:not([data-bs-theme="dark"]) .auth-controls .theme-toggle-btn { color: var(--brand-primary) !important; background: rgba(var(--brand-primary-rgb), 0.08) !important; border: 1px solid rgba(var(--brand-primary-rgb), 0.25) !important; } [data-bs-theme="light"] .auth-controls .theme-toggle-btn:hover, :root:not([data-bs-theme="dark"]) .auth-controls .theme-toggle-btn:hover { color: #FFFFFF !important; background: var(--brand-primary) !important; border-color: var(--brand-primary) !important; } /* ======================================================= FULLCALENDAR OVERRIDES ======================================================= */ .fc { --fc-border-color: var(--card-border); --fc-page-bg-color: transparent; --fc-neutral-bg-color: rgba(0, 0, 0, 0.02); --fc-today-bg-color: rgba(var(--brand-primary-rgb), 0.08); } [data-bs-theme="dark"] .fc { --fc-neutral-bg-color: rgba(255, 255, 255, 0.02); } .fc-event { border-radius: 8px !important; border: none !important; padding: 3px 8px !important; font-size: 0.8rem !important; font-weight: 500 !important; transition: transform 0.15s ease, box-shadow 0.15s ease; } .fc-event:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); } .fc-button-primary { background: var(--gradient-primary) !important; border: none !important; border-radius: 8px !important; box-shadow: 0 2px 6px rgba(var(--brand-primary-rgb), 0.3) !important; } .fc-button-primary:hover { background: linear-gradient(135deg, #9E367D 0%, #832765 100%) !important; } .fc-button-primary:disabled { background: var(--text-muted) !important; } /* ======================================================= FORTIGATE-STYLE RBAC PERMISSIONS MATRIX ======================================================= */ .fg-permission-card { background-color: var(--card-bg); border: 1px solid var(--card-border); border-radius: 12px; box-shadow: var(--card-shadow); overflow: hidden; } .fg-permission-card .card-header { background-color: rgba(0, 0, 0, 0.03); border-bottom: 1px solid var(--card-border); padding: 0.9rem 1.25rem; } [data-bs-theme="dark"] .fg-permission-card .card-header { background-color: rgba(255, 255, 255, 0.03); } .fg-table { margin-bottom: 0; width: 100%; } .fg-table th { font-size: 0.88rem; font-weight: 600; color: var(--text-secondary); background-color: rgba(0, 0, 0, 0.02); border-bottom: 1px solid var(--card-border); padding: 0.85rem 1.25rem; } [data-bs-theme="dark"] .fg-table th { background-color: rgba(255, 255, 255, 0.02); } .fg-table td { padding: 0.85rem 1.25rem; vertical-align: middle; border-bottom: 1px solid var(--card-border); color: var(--text-primary); } .fg-table tr:last-child td { border-bottom: none; } .fg-table tbody tr:hover { background-color: rgba(180, 62, 142, 0.04); } /* FortiGate Segmented Control */ .fg-segmented-control { display: inline-flex; border: 1px solid #ced4da; border-radius: 6px; overflow: hidden; background: #FFFFFF; } [data-bs-theme="dark"] .fg-segmented-control { border-color: rgba(255, 255, 255, 0.2); background: #1A1F36; } .fg-seg-btn { border: none; background: transparent; padding: 0.35rem 0.75rem; font-size: 0.82rem; font-weight: 500; color: #495057; display: inline-flex; align-items: center; gap: 0.35rem; cursor: pointer; transition: all 0.15s ease; border-right: 1px solid #ced4da; outline: none; user-select: none; } [data-bs-theme="dark"] .fg-seg-btn { color: #CBD5E1; border-right-color: rgba(255, 255, 255, 0.15); } .fg-seg-btn:last-child { border-right: none; } .fg-seg-btn:hover:not(.active) { background: rgba(0, 0, 0, 0.06); color: #212529; } [data-bs-theme="dark"] .fg-seg-btn:hover:not(.active) { background: rgba(255, 255, 255, 0.08); color: #FFFFFF; } /* Estado Activo FortiGate (Verde Esmeralda #2D9F6F) */ .fg-seg-btn.active { background-color: #2D9F6F !important; color: #FFFFFF !important; font-weight: 600; box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2); } .fg-seg-btn.active i { color: #FFFFFF !important; } /* Set All Dropdown Button */ .btn-fg-set-all { font-size: 0.8rem; font-weight: 500; padding: 0.25rem 0.65rem; border-radius: 6px; border: 1px solid #ced4da; background: #FFFFFF; color: #333333; } [data-bs-theme="dark"] .btn-fg-set-all { background: #1E2442; border-color: rgba(255, 255, 255, 0.2); color: #E2E8F0; } /* Chart Container Utility — previene expansión infinita en Chart.js */ .chart-container { position: relative; width: 100%; height: 260px; max-height: 320px; }