Files
admin-edu-space/frontend/views/layouts/base.html
T

351 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang="es" data-bs-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Edu-Space Admin{% endblock %}</title>
<!-- Favicon -->
<link rel="icon" type="image/png" href="/img/favicon.png">
<!-- Google Fonts: Inter -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- Bootstrap 5 & Icons -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css" rel="stylesheet">
<!-- Design System Theme -->
<link href="/css/theme.css" rel="stylesheet">
<link href="/css/style.css" rel="stylesheet">
<style>
body {
font-family: 'Inter', sans-serif;
min-height: 100vh;
margin: 0;
display: flex;
flex-direction: column;
transition: background-color 0.25s ease, color 0.25s ease;
}
/* =============================================
NAVBAR COMPACTA — limpia y sin desperdicio
============================================= */
.glass-navbar {
padding: 0 !important; /* Bootstrap agrega padding, lo neutralizamos */
min-height: 48px;
}
.glass-navbar .container-fluid {
padding-top: 0.35rem;
padding-bottom: 0.35rem;
}
/* --- MODO CLARO ([data-bs-theme="light"]) - PALETA UNICABA (ROSA, MAGENTA, BLANCO) --- */
[data-bs-theme="light"] body {
background-color: #FAF5F8 !important;
color: #1E293B !important;
}
[data-bs-theme="light"] .glass-navbar {
background: rgba(255, 255, 255, 0.96) !important;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(180, 62, 142, 0.16) !important;
box-shadow: 0 4px 16px rgba(180, 62, 142, 0.05) !important;
}
[data-bs-theme="light"] .glass-navbar .navbar-brand span {
background: linear-gradient(90deg, #B43E8E, #682CAD);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
[data-bs-theme="light"] .glass-navbar .nav-link {
color: #334155 !important;
font-weight: 600;
}
[data-bs-theme="light"] .glass-navbar .nav-link:hover,
[data-bs-theme="light"] .glass-navbar .nav-link.active {
color: #B43E8E !important;
background: rgba(180, 62, 142, 0.08);
border-radius: 7px;
}
[data-bs-theme="light"] .glass-card,
[data-bs-theme="light"] .card {
background: #FFFFFF !important;
color: #1E293B !important;
border: 1px solid rgba(180, 62, 142, 0.16) !important;
box-shadow: 0 2px 10px rgba(180, 62, 142, 0.05), 0 1px 3px rgba(0, 0, 0, 0.02) !important;
}
[data-bs-theme="light"] .card-header {
background-color: #FDF9FB !important;
border-bottom: 1px solid rgba(180, 62, 142, 0.1) !important;
color: #1E293B !important;
}
[data-bs-theme="light"] .table {
--bs-table-color: #1E293B;
border-color: rgba(180, 62, 142, 0.1) !important;
}
[data-bs-theme="light"] .table thead th {
background-color: #F8EEF4 !important;
color: #1E293B !important;
font-weight: 700 !important;
border-bottom: 2px solid rgba(180, 62, 142, 0.2) !important;
}
[data-bs-theme="light"] .text-muted {
color: #64748B !important;
}
/* Toggle button - modo claro */
[data-bs-theme="light"] .navbar-toggle-custom {
color: #334155;
border-color: rgba(180, 62, 142, 0.25);
background-color: #FFFFFF;
}
[data-bs-theme="light"] .navbar-toggle-custom:hover {
background: rgba(180, 62, 142, 0.1);
border-color: #B43E8E;
color: #B43E8E;
}
/* --- MODO OSCURO ([data-bs-theme="dark"]) --- */
[data-bs-theme="dark"] body {
background: linear-gradient(135deg, #0F172A 0%, #1E1B4B 100%) !important;
color: #F8FAFC !important;
}
[data-bs-theme="dark"] .glass-navbar {
background: rgba(15, 23, 42, 0.82) !important;
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
border-bottom: 1px solid rgba(255, 255, 255, 0.07) !important;
box-shadow: 0 2px 20px rgba(0, 0, 0, 0.35) !important;
}
[data-bs-theme="dark"] .glass-navbar .navbar-brand span {
background: linear-gradient(90deg, #FF8AB6, #AE7FFF);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
[data-bs-theme="dark"] .glass-navbar .nav-link {
color: #CBD5E1 !important;
}
[data-bs-theme="dark"] .glass-navbar .nav-link:hover,
[data-bs-theme="dark"] .glass-navbar .nav-link.active {
color: #FF8AB6 !important;
background: rgba(255, 138, 182, 0.08);
border-radius: 7px;
}
[data-bs-theme="dark"] .glass-card,
[data-bs-theme="dark"] .card {
background: rgba(30, 41, 59, 0.7) !important;
color: #F8FAFC !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3) !important;
}
/* Toggle button - modo oscuro */
[data-bs-theme="dark"] .navbar-toggle-custom {
color: #CBD5E1;
border-color: rgba(203, 213, 225, 0.25);
}
[data-bs-theme="dark"] .navbar-toggle-custom:hover {
background: rgba(255, 138, 182, 0.1);
border-color: rgba(255, 138, 182, 0.5);
color: #FF8AB6;
}
/* =============================================
BRAND / LOGO
============================================= */
.navbar-brand {
font-weight: 700;
padding-top: 0;
padding-bottom: 0;
}
.navbar-brand span {
font-weight: 700;
font-size: 0.95rem;
letter-spacing: -0.01em;
}
.navbar-logo {
height: 26px;
width: auto;
filter: none !important;
}
/* =============================================
NAV LINKS — compactos
============================================= */
.glass-navbar .nav-link {
font-size: 0.84rem;
font-weight: 500;
padding: 0.3rem 0.65rem !important;
border-radius: 7px;
transition: color 0.15s ease, background 0.15s ease;
white-space: nowrap;
}
.glass-navbar .nav-link i {
font-size: 0.82rem;
}
/* =============================================
TOGGLE BUTTON — limpio, pill style
============================================= */
.navbar-toggle-custom {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 32px;
padding: 0;
border-radius: 8px;
border: 1px solid transparent;
background: transparent;
cursor: pointer;
transition: all 0.18s ease;
outline: none;
box-shadow: none !important;
}
.navbar-toggle-custom i {
font-size: 1.3rem;
line-height: 1;
}
/* =============================================
MAIN CONTAINER — espacio eficiente
============================================= */
.main-container {
flex: 1;
padding: 1rem 0 1.5rem;
}
/* =============================================
RESPONSIVE — 720p (1360x768)
============================================= */
@media (max-height: 800px) {
.main-container {
padding: 0.65rem 0 1rem;
}
.glass-navbar .container-fluid {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
}
/* =============================================
RESPONSIVE — 1920x1080 (pantallas grandes)
============================================= */
@media (min-width: 1600px) {
.main-container {
padding: 1.25rem 0 2rem;
max-width: 1600px;
}
}
/* =============================================
MENU COLAPSADO (mobile / tablet)
============================================= */
@media (max-width: 991.98px) {
.glass-navbar .navbar-collapse {
padding: 0.5rem 0;
border-top: 1px solid rgba(128, 128, 128, 0.12);
margin-top: 0.3rem;
}
.glass-navbar .nav-link {
padding: 0.45rem 0.75rem !important;
border-radius: 8px;
margin: 1px 0;
}
.glass-navbar .navbar-nav.ms-auto {
padding-top: 0.5rem;
border-top: 1px solid rgba(128, 128, 128, 0.1);
margin-top: 0.25rem !important;
}
}
.fade-in-up {
animation: fadeInUp 0.6s ease-out forwards;
opacity: 0;
transform: translateY(20px);
}
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
}
</style>
{% block extra_css %}{% endblock %}
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-lg glass-navbar sticky-top">
<div class="container-fluid px-3 px-lg-4">
<!-- Brand -->
<a class="navbar-brand d-flex align-items-center gap-2" href="/dashboard">
<img src="/img/logo_unicaba_mini.png" alt="Logo UniCABA" class="navbar-logo">
<span>Edu-Space Admin</span>
</a>
<!-- Toggle button — limpio, sin foco feo de Bootstrap -->
<button
class="navbar-toggle-custom d-lg-none"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarNav"
aria-controls="navbarNav"
aria-expanded="false"
aria-label="Menú"
>
<i class="bi bi-list"></i>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<!-- Nav principal -->
<ul class="navbar-nav me-auto align-items-lg-center ms-lg-2 gap-lg-1">
<li class="nav-item">
<a class="nav-link" href="/dashboard">
<i class="bi bi-speedometer2 me-1"></i>Panel General
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/classrooms/list_classrooms">
<i class="bi bi-door-open me-1"></i>Espacios &amp; Sedes
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/schedule/calendar_view">
<i class="bi bi-calendar3 me-1"></i>Cronograma &amp; Reservas
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/predictive">
<i class="bi bi-cpu me-1"></i>Módulo Predictivo
</a>
</li>
</ul>
<!-- Nav derecha -->
<ul class="navbar-nav align-items-lg-center ms-auto gap-2">
<li class="nav-item">
<a class="btn btn-outline-danger btn-sm rounded-pill px-3 fw-medium" href="/auth/logout">
<i class="bi bi-box-arrow-right me-1"></i>Cerrar Sesión
</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Main Content -->
<main class="container-fluid container-xl main-container px-3 px-lg-4">
{% block content %}{% endblock %}
</main>
<!-- Scripts base -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
{% block extra_js %}{% endblock %}
</body>
</html>