You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1266 lines
29 KiB
Vue
1266 lines
29 KiB
Vue
|
2 months ago
|
<!-- components/AdminAcademia/layout/AdminLayout.vue -->
|
||
|
|
<template>
|
||
|
|
<a-layout style="min-height: 100vh;" class="admin-layout">
|
||
|
|
<!-- Header estilo ChatGPT -->
|
||
|
|
<a-layout-header class="header">
|
||
|
|
<div class="header-container">
|
||
|
|
<div class="header-left">
|
||
|
|
<div class="brand-section">
|
||
|
|
<a-button
|
||
|
|
v-if="isMobile"
|
||
|
|
type="text"
|
||
|
|
class="menu-toggle"
|
||
|
|
@click="toggleDrawer"
|
||
|
|
>
|
||
|
|
<MenuOutlined />
|
||
|
|
</a-button>
|
||
|
|
|
||
|
|
<div class="logo-wrapper">
|
||
|
|
<div class="logo-icon">
|
||
|
|
<BankOutlined />
|
||
|
|
</div>
|
||
|
|
<div class="logo-content">
|
||
|
|
<h1 class="admin-name">Dirección de Admisión</h1>
|
||
|
|
<div class="admin-role">Panel Administrativo</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Desktop Actions -->
|
||
|
|
<div class="header-right" v-if="!isMobile">
|
||
|
|
<div class="header-actions">
|
||
|
|
|
||
|
|
<!-- Notificaciones -->
|
||
|
|
<a-dropdown :trigger="['click']" placement="bottomRight">
|
||
|
|
<a-badge :count="notificacionesCount" dot>
|
||
|
|
<div class="action-btn">
|
||
|
|
<BellOutlined />
|
||
|
|
</div>
|
||
|
|
</a-badge>
|
||
|
|
<template #overlay>
|
||
|
|
<div class="notification-dropdown">
|
||
|
|
<div class="notification-header">
|
||
|
|
<h3>Notificaciones</h3>
|
||
|
|
<a-button type="link" size="small" @click="verNotificaciones">
|
||
|
|
Ver todas
|
||
|
|
</a-button>
|
||
|
|
</div>
|
||
|
|
<div class="notification-list">
|
||
|
|
<div v-for="notif in notificaciones" :key="notif.id"
|
||
|
|
class="notification-item" @click="handleNotification(notif)">
|
||
|
|
<div class="notification-icon" :style="{ color: notif.color }">
|
||
|
|
<component :is="notif.icon" />
|
||
|
|
</div>
|
||
|
|
<div class="notification-content">
|
||
|
|
<div class="notification-title">{{ notif.titulo }}</div>
|
||
|
|
<div class="notification-time">{{ formatTimeAgo(notif.fecha) }}</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</template>
|
||
|
|
</a-dropdown>
|
||
|
|
|
||
|
|
<!-- Profile -->
|
||
|
|
<a-dropdown :trigger="['click']" placement="bottomRight">
|
||
|
|
<div class="profile-btn">
|
||
|
|
<a-avatar :size="36" class="profile-avatar">
|
||
|
|
{{ userStore.user?.name?.charAt(0)?.toUpperCase() || 'A' }}
|
||
|
|
</a-avatar>
|
||
|
|
<span class="profile-name">{{ userStore.user?.name }}</span>
|
||
|
|
<DownOutlined class="dropdown-arrow" />
|
||
|
|
</div>
|
||
|
|
<template #overlay>
|
||
|
|
<a-menu class="profile-menu">
|
||
|
|
<a-menu-item @click="irPerfil">
|
||
|
|
<UserOutlined />
|
||
|
|
<span>Mi Perfil</span>
|
||
|
|
</a-menu-item>
|
||
|
|
<a-menu-divider />
|
||
|
|
<a-menu-item class="logout-item" @click="logout">
|
||
|
|
<LogoutOutlined />
|
||
|
|
<span>Cerrar Sesión</span>
|
||
|
|
</a-menu-item>
|
||
|
|
</a-menu>
|
||
|
|
</template>
|
||
|
|
</a-dropdown>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Mobile Actions -->
|
||
|
|
<div class="mobile-actions" v-else>
|
||
|
|
<a-dropdown :trigger="['click']" placement="bottomRight">
|
||
|
|
<div class="mobile-notification">
|
||
|
|
<a-badge :count="notificacionesCount" dot>
|
||
|
|
<BellOutlined />
|
||
|
|
</a-badge>
|
||
|
|
</div>
|
||
|
|
<template #overlay>
|
||
|
|
<div class="mobile-notification-dropdown">
|
||
|
|
<div class="notification-header">
|
||
|
|
<h3>Notificaciones</h3>
|
||
|
|
</div>
|
||
|
|
<div class="notification-list">
|
||
|
|
<div v-for="notif in notificaciones" :key="notif.id"
|
||
|
|
class="notification-item">
|
||
|
|
<div class="notification-icon" :style="{ color: notif.color }">
|
||
|
|
<component :is="notif.icon" />
|
||
|
|
</div>
|
||
|
|
<div class="notification-content">
|
||
|
|
<div class="notification-title">{{ notif.titulo }}</div>
|
||
|
|
<div class="notification-time">{{ formatTimeAgo(notif.fecha) }}</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</template>
|
||
|
|
</a-dropdown>
|
||
|
|
|
||
|
|
<a-dropdown :trigger="['click']" placement="bottomRight">
|
||
|
|
<a-avatar :size="32" class="mobile-avatar">
|
||
|
|
{{ userStore.user?.name?.charAt(0)?.toUpperCase() || 'A' }}
|
||
|
|
</a-avatar>
|
||
|
|
<template #overlay>
|
||
|
|
<a-menu class="mobile-profile-menu">
|
||
|
|
<a-menu-item @click="irPerfil">
|
||
|
|
<UserOutlined />
|
||
|
|
<span>Mi Perfil</span>
|
||
|
|
</a-menu-item>
|
||
|
|
<a-menu-divider />
|
||
|
|
<a-menu-item class="logout-item" @click="logout">
|
||
|
|
<LogoutOutlined />
|
||
|
|
<span>Cerrar Sesión</span>
|
||
|
|
</a-menu-item>
|
||
|
|
</a-menu>
|
||
|
|
</template>
|
||
|
|
</a-dropdown>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</a-layout-header>
|
||
|
|
|
||
|
|
<!-- Layout Principal -->
|
||
|
|
<a-layout class="main-layout">
|
||
|
|
<!-- Sidebar Desktop - Estilo ChatGPT Oscuro -->
|
||
|
|
<a-layout-sider
|
||
|
|
v-if="!isMobile"
|
||
|
|
:width="280"
|
||
|
|
theme="dark"
|
||
|
|
collapsible
|
||
|
|
v-model:collapsed="sidebarCollapsed"
|
||
|
|
:trigger="null"
|
||
|
|
class="sidebar"
|
||
|
|
:class="{ 'sidebar-collapsed': sidebarCollapsed }"
|
||
|
|
>
|
||
|
|
<div class="sidebar-header">
|
||
|
|
<div class="sidebar-brand" v-if="!sidebarCollapsed">
|
||
|
|
<div class="brand-icon">
|
||
|
|
<BankOutlined />
|
||
|
|
</div>
|
||
|
|
<div class="brand-text">
|
||
|
|
<h3>Admisión</h3>
|
||
|
|
<p>Sistema Académico</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div class="sidebar-collapse-btn" v-else>
|
||
|
|
<BankOutlined />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="sidebar-menu-container">
|
||
|
|
<a-menu
|
||
|
|
v-model:selectedKeys="selectedKeys"
|
||
|
|
mode="inline"
|
||
|
|
theme="dark"
|
||
|
|
class="sidebar-menu"
|
||
|
|
@select="handleMenuSelect"
|
||
|
|
>
|
||
|
|
<!-- Dashboard -->
|
||
|
|
<a-menu-item key="dashboard" class="menu-item">
|
||
|
|
<template #icon>
|
||
|
|
<DashboardOutlined />
|
||
|
|
</template>
|
||
|
|
<span>Dashboard</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<!-- Gestión -->
|
||
|
|
<div class="menu-divider" v-if="!sidebarCollapsed">
|
||
|
|
<span>Gestión</span>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<a-sub-menu key="estudiantes" class="sub-menu">
|
||
|
|
<template #icon>
|
||
|
|
<TeamOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Estudiantes</template>
|
||
|
|
<a-menu-item key="estudiantes-lista">Lista de Estudiantes</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<a-sub-menu key="examenes" class="sub-menu">
|
||
|
|
<template #icon>
|
||
|
|
<FileTextOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Exámenes</template>
|
||
|
|
<a-menu-item key="examenes-lista">Todos los Exámenes</a-menu-item>
|
||
|
|
<a-menu-item key="examenes-nuevo">Crear Examen</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<a-sub-menu key="preguntas" class="sub-menu">
|
||
|
|
<template #icon>
|
||
|
|
<QuestionCircleOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Gestión Preguntas</template>
|
||
|
|
<a-menu-item key="lista-areas">Áreas</a-menu-item>
|
||
|
|
<a-menu-item key="lista-cursos">Cursos</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<!-- Análisis -->
|
||
|
|
<div class="menu-divider" v-if="!sidebarCollapsed">
|
||
|
|
<span>Análisis</span>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<a-menu-item key="resultados" class="menu-item">
|
||
|
|
<template #icon>
|
||
|
|
<RiseOutlined />
|
||
|
|
</template>
|
||
|
|
<span>Resultados</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<a-menu-item key="reportes" class="menu-item">
|
||
|
|
<template #icon>
|
||
|
|
<BarChartOutlined />
|
||
|
|
</template>
|
||
|
|
<span>Reportes</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<!-- Configuración -->
|
||
|
|
<div class="menu-divider" v-if="!sidebarCollapsed">
|
||
|
|
<span>Configuración</span>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<a-menu-item key="config-academia" class="menu-item">
|
||
|
|
<template #icon>
|
||
|
|
<SettingOutlined />
|
||
|
|
</template>
|
||
|
|
<span>Academia</span>
|
||
|
|
</a-menu-item>
|
||
|
|
</a-menu>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Collapse Button -->
|
||
|
|
<div class="sidebar-footer">
|
||
|
|
<a-button
|
||
|
|
type="text"
|
||
|
|
class="collapse-btn"
|
||
|
|
@click="sidebarCollapsed = !sidebarCollapsed"
|
||
|
|
>
|
||
|
|
<template #icon>
|
||
|
|
<MenuUnfoldOutlined v-if="sidebarCollapsed" />
|
||
|
|
<MenuFoldOutlined v-else />
|
||
|
|
</template>
|
||
|
|
<span v-if="!sidebarCollapsed">Colapsar Menú</span>
|
||
|
|
</a-button>
|
||
|
|
</div>
|
||
|
|
</a-layout-sider>
|
||
|
|
|
||
|
|
<!-- Drawer Mobile -->
|
||
|
|
<a-drawer
|
||
|
|
v-model:open="drawerVisible"
|
||
|
|
title=""
|
||
|
|
placement="left"
|
||
|
|
width="280"
|
||
|
|
:body-style="{ padding: 0, backgroundColor: '#202123' }"
|
||
|
|
class="mobile-drawer"
|
||
|
|
:headerStyle="{ display: 'none' }"
|
||
|
|
>
|
||
|
|
<div class="mobile-sidebar">
|
||
|
|
<div class="mobile-sidebar-header">
|
||
|
|
<div class="mobile-brand">
|
||
|
|
<BankOutlined />
|
||
|
|
<h3>Admisión</h3>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<a-menu
|
||
|
|
v-model:selectedKeys="selectedKeys"
|
||
|
|
mode="inline"
|
||
|
|
theme="dark"
|
||
|
|
class="mobile-sidebar-menu"
|
||
|
|
@select="handleMobileMenuSelect"
|
||
|
|
>
|
||
|
|
<a-menu-item key="dashboard">
|
||
|
|
<DashboardOutlined />
|
||
|
|
<span>Dashboard</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<a-sub-menu key="estudiantes">
|
||
|
|
<template #icon>
|
||
|
|
<TeamOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Estudiantes</template>
|
||
|
|
<a-menu-item key="estudiantes-lista">Lista</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<a-sub-menu key="examenes">
|
||
|
|
<template #icon>
|
||
|
|
<FileTextOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Exámenes</template>
|
||
|
|
<a-menu-item key="examenes-lista">Todos</a-menu-item>
|
||
|
|
<a-menu-item key="examenes-nuevo">Crear</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<a-sub-menu key="preguntas">
|
||
|
|
<template #icon>
|
||
|
|
<QuestionCircleOutlined />
|
||
|
|
</template>
|
||
|
|
<template #title>Preguntas</template>
|
||
|
|
<a-menu-item key="lista-areas">Áreas</a-menu-item>
|
||
|
|
<a-menu-item key="lista-cursos">Cursos</a-menu-item>
|
||
|
|
</a-sub-menu>
|
||
|
|
|
||
|
|
<a-menu-item key="resultados">
|
||
|
|
<RiseOutlined />
|
||
|
|
<span>Resultados</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<a-menu-item key="reportes">
|
||
|
|
<BarChartOutlined />
|
||
|
|
<span>Reportes</span>
|
||
|
|
</a-menu-item>
|
||
|
|
|
||
|
|
<a-menu-item key="config-academia">
|
||
|
|
<SettingOutlined />
|
||
|
|
<span>Academia</span>
|
||
|
|
</a-menu-item>
|
||
|
|
</a-menu>
|
||
|
|
</div>
|
||
|
|
</a-drawer>
|
||
|
|
|
||
|
|
<!-- Content Area -->
|
||
|
|
<a-layout-content class="content">
|
||
|
|
<div class="content-container">
|
||
|
|
<router-view />
|
||
|
|
</div>
|
||
|
|
</a-layout-content>
|
||
|
|
</a-layout>
|
||
|
|
</a-layout>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script setup>
|
||
|
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
||
|
|
import { useRouter } from 'vue-router'
|
||
|
|
import { useUserStore } from '../../store/user'
|
||
|
|
import {
|
||
|
|
BankOutlined,
|
||
|
|
BellOutlined,
|
||
|
|
DownOutlined,
|
||
|
|
UserOutlined,
|
||
|
|
SettingOutlined,
|
||
|
|
LogoutOutlined,
|
||
|
|
DashboardOutlined,
|
||
|
|
TeamOutlined,
|
||
|
|
FileTextOutlined,
|
||
|
|
RiseOutlined,
|
||
|
|
BarChartOutlined,
|
||
|
|
MenuOutlined,
|
||
|
|
MenuFoldOutlined,
|
||
|
|
MenuUnfoldOutlined,
|
||
|
|
QuestionCircleOutlined,
|
||
|
|
PlusOutlined,
|
||
|
|
UnorderedListOutlined,
|
||
|
|
} from '@ant-design/icons-vue'
|
||
|
|
|
||
|
|
const router = useRouter()
|
||
|
|
const userStore = useUserStore()
|
||
|
|
|
||
|
|
// Estado interno
|
||
|
|
const selectedKeys = ref(['/administrador/dashboard'])
|
||
|
|
const drawerVisible = ref(false)
|
||
|
|
const sidebarCollapsed = ref(false)
|
||
|
|
const isMobile = ref(false)
|
||
|
|
|
||
|
|
// Notificaciones
|
||
|
|
const notificacionesCount = ref(3)
|
||
|
|
const notificaciones = ref([
|
||
|
|
{ id: 1, titulo: 'Nuevo estudiante registrado', fecha: new Date(Date.now() - 5 * 60000), icon: 'TeamOutlined', color: '#10b981' },
|
||
|
|
{ id: 2, titulo: 'Examen próximo a vencer', fecha: new Date(Date.now() - 30 * 60000), icon: 'FileTextOutlined', color: '#f59e0b' },
|
||
|
|
{ id: 3, titulo: 'Capacidad al 80%', fecha: new Date(Date.now() - 2 * 3600000), icon: 'BarChartOutlined', color: '#6366f1' }
|
||
|
|
])
|
||
|
|
|
||
|
|
const toggleDrawer = () => {
|
||
|
|
drawerVisible.value = !drawerVisible.value
|
||
|
|
}
|
||
|
|
|
||
|
|
const checkMobile = () => {
|
||
|
|
isMobile.value = window.innerWidth < 992
|
||
|
|
if (!isMobile.value) {
|
||
|
|
drawerVisible.value = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const handleMenuSelect = ({ key }) => {
|
||
|
|
selectedKeys.value = [key]
|
||
|
|
|
||
|
|
switch (key) {
|
||
|
|
case 'dashboard':
|
||
|
|
router.push({ name: 'AcademiaDashboard' })
|
||
|
|
break
|
||
|
|
case 'estudiantes-lista':
|
||
|
|
router.push({ name: 'AcademiaEstudiantes' })
|
||
|
|
break
|
||
|
|
case 'examenes-lista':
|
||
|
|
router.push({ name: 'AcademiaExamenes' })
|
||
|
|
break
|
||
|
|
case 'examenes-nuevo':
|
||
|
|
router.push({ name: 'AcademiaExamenNuevo' })
|
||
|
|
break
|
||
|
|
case 'reportes':
|
||
|
|
router.push({ name: 'AcademiaReportes' })
|
||
|
|
break
|
||
|
|
case 'config-academia':
|
||
|
|
router.push({ name: 'AcademiaConfig' })
|
||
|
|
break
|
||
|
|
case 'lista-areas':
|
||
|
|
router.push({ name: 'AcademiAreaLista' })
|
||
|
|
break
|
||
|
|
case 'lista-cursos':
|
||
|
|
router.push({ name: 'AcademiaCursosLista' })
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const handleMobileMenuSelect = ({ key }) => {
|
||
|
|
handleMenuSelect({ key })
|
||
|
|
drawerVisible.value = false
|
||
|
|
}
|
||
|
|
|
||
|
|
const irPerfil = () => {
|
||
|
|
router.push({ name: 'Perfil' })
|
||
|
|
}
|
||
|
|
|
||
|
|
const logout = () => {
|
||
|
|
userStore.logout()
|
||
|
|
router.push('/login')
|
||
|
|
}
|
||
|
|
|
||
|
|
const formatTimeAgo = (date) => {
|
||
|
|
const now = new Date()
|
||
|
|
const diffMs = now - new Date(date)
|
||
|
|
const diffMins = Math.floor(diffMs / 60000)
|
||
|
|
const diffHours = Math.floor(diffMs / 3600000)
|
||
|
|
const diffDays = Math.floor(diffMs / 86400000)
|
||
|
|
|
||
|
|
if (diffMins < 60) return `Hace ${diffMins} min`
|
||
|
|
if (diffHours < 24) return `Hace ${diffHours} h`
|
||
|
|
return `Hace ${diffDays} d`
|
||
|
|
}
|
||
|
|
|
||
|
|
// Lifecycle hooks
|
||
|
|
onMounted(() => {
|
||
|
|
checkMobile()
|
||
|
|
window.addEventListener('resize', checkMobile)
|
||
|
|
})
|
||
|
|
|
||
|
|
onUnmounted(() => {
|
||
|
|
window.removeEventListener('resize', checkMobile)
|
||
|
|
})
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style scoped>
|
||
|
|
/* Variables de colores estilo ChatGPT */
|
||
|
|
:root {
|
||
|
|
--sidebar-bg: #202123;
|
||
|
|
--sidebar-hover: #343541;
|
||
|
|
--sidebar-active: #40414f;
|
||
|
|
--sidebar-text: #ececf1;
|
||
|
|
--sidebar-text-secondary: #8e8ea0;
|
||
|
|
--header-bg: #ffffff;
|
||
|
|
--content-bg: #ffffff;
|
||
|
|
--border-color: #e5e5e5;
|
||
|
|
--primary-color: #10a37f;
|
||
|
|
--notification-badge: #ef4444;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Layout General */
|
||
|
|
.admin-layout {
|
||
|
|
background: var(--content-bg);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Header estilo ChatGPT */
|
||
|
|
.header {
|
||
|
|
background: var(--header-bg);
|
||
|
|
height: 64px;
|
||
|
|
padding: 0;
|
||
|
|
border-bottom: 1px solid var(--border-color);
|
||
|
|
position: sticky;
|
||
|
|
top: 0;
|
||
|
|
z-index: 100;
|
||
|
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
||
|
|
}
|
||
|
|
|
||
|
|
.header-container {
|
||
|
|
height: 100%;
|
||
|
|
max-width: 100%;
|
||
|
|
margin: 0 auto;
|
||
|
|
padding: 0 24px;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: space-between;
|
||
|
|
}
|
||
|
|
|
||
|
|
.header-left {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.brand-section {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.menu-toggle {
|
||
|
|
width: 40px;
|
||
|
|
height: 40px;
|
||
|
|
border-radius: 6px;
|
||
|
|
background: transparent;
|
||
|
|
border: none;
|
||
|
|
color: #374151;
|
||
|
|
font-size: 18px;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
transition: all 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.menu-toggle:hover {
|
||
|
|
background: #f3f4f6;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-wrapper {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 12px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-icon {
|
||
|
|
width: 40px;
|
||
|
|
height: 40px;
|
||
|
|
border-radius: 8px;
|
||
|
|
background: linear-gradient(135deg, var(--primary-color) 0%, #0d8a6d 100%);
|
||
|
|
color: white;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
font-size: 18px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-content {
|
||
|
|
display: flex;
|
||
|
|
flex-direction: column;
|
||
|
|
gap: 2px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.admin-name {
|
||
|
|
margin: 0;
|
||
|
|
font-size: 16px;
|
||
|
|
font-weight: 600;
|
||
|
|
color: #111827;
|
||
|
|
line-height: 1.2;
|
||
|
|
}
|
||
|
|
|
||
|
|
.admin-role {
|
||
|
|
font-size: 12px;
|
||
|
|
color: #6b7280;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Header Actions */
|
||
|
|
.header-right {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
}
|
||
|
|
|
||
|
|
.header-actions {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.action-btn {
|
||
|
|
width: 40px;
|
||
|
|
height: 40px;
|
||
|
|
border-radius: 8px;
|
||
|
|
background: transparent;
|
||
|
|
border: 1px solid #e5e7eb;
|
||
|
|
color: #374151;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
font-size: 16px;
|
||
|
|
cursor: pointer;
|
||
|
|
transition: all 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.action-btn:hover {
|
||
|
|
background: #f9fafb;
|
||
|
|
border-color: #d1d5db;
|
||
|
|
}
|
||
|
|
|
||
|
|
:deep(.ant-badge-dot) {
|
||
|
|
box-shadow: 0 0 0 2px var(--header-bg);
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-btn {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 8px;
|
||
|
|
padding: 6px 12px;
|
||
|
|
border-radius: 8px;
|
||
|
|
border: 1px solid #e5e7eb;
|
||
|
|
background: white;
|
||
|
|
cursor: pointer;
|
||
|
|
transition: all 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-btn:hover {
|
||
|
|
background: #f9fafb;
|
||
|
|
border-color: #d1d5db;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-avatar {
|
||
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
|
|
font-weight: 600;
|
||
|
|
color: white;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-name {
|
||
|
|
font-size: 14px;
|
||
|
|
font-weight: 500;
|
||
|
|
color: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.dropdown-arrow {
|
||
|
|
font-size: 12px;
|
||
|
|
color: #9ca3af;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Mobile Actions */
|
||
|
|
.mobile-actions {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-notification {
|
||
|
|
width: 40px;
|
||
|
|
height: 40px;
|
||
|
|
border-radius: 8px;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
color: #374151;
|
||
|
|
cursor: pointer;
|
||
|
|
transition: background 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-notification:hover {
|
||
|
|
background: #f3f4f6;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-avatar {
|
||
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
|
|
font-weight: 600;
|
||
|
|
color: white;
|
||
|
|
cursor: pointer;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Sidebar estilo ChatGPT Oscuro */
|
||
|
|
.sidebar {
|
||
|
|
background: var(--sidebar-bg) !important;
|
||
|
|
box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
|
||
|
|
height: calc(100vh - 64px);
|
||
|
|
position: fixed;
|
||
|
|
left: 0;
|
||
|
|
top: 64px;
|
||
|
|
z-index: 99;
|
||
|
|
transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar.sidebar-collapsed {
|
||
|
|
width: 80px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-header {
|
||
|
|
padding: 20px 16px;
|
||
|
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-brand {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 12px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.brand-icon {
|
||
|
|
width: 36px;
|
||
|
|
height: 36px;
|
||
|
|
border-radius: 8px;
|
||
|
|
background: linear-gradient(135deg, var(--primary-color) 0%, #0d8a6d 100%);
|
||
|
|
color: white;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
font-size: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.brand-text h3 {
|
||
|
|
margin: 0;
|
||
|
|
font-size: 16px;
|
||
|
|
font-weight: 600;
|
||
|
|
color: var(--sidebar-text);
|
||
|
|
line-height: 1.2;
|
||
|
|
}
|
||
|
|
|
||
|
|
.brand-text p {
|
||
|
|
margin: 2px 0 0 0;
|
||
|
|
font-size: 12px;
|
||
|
|
color: var(--sidebar-text-secondary);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-collapse-btn {
|
||
|
|
width: 36px;
|
||
|
|
height: 36px;
|
||
|
|
border-radius: 8px;
|
||
|
|
background: linear-gradient(135deg, var(--primary-color) 0%, #0d8a6d 100%);
|
||
|
|
color: white;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
font-size: 16px;
|
||
|
|
margin: 0 auto;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu-container {
|
||
|
|
padding: 16px 0;
|
||
|
|
overflow-y: auto;
|
||
|
|
height: calc(100% - 180px);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu-container::-webkit-scrollbar {
|
||
|
|
width: 6px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu-container::-webkit-scrollbar-track {
|
||
|
|
background: transparent;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu-container::-webkit-scrollbar-thumb {
|
||
|
|
background: rgba(255, 255, 255, 0.2);
|
||
|
|
border-radius: 3px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu {
|
||
|
|
background: transparent !important;
|
||
|
|
border-right: none !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-item),
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-title) {
|
||
|
|
height: 44px;
|
||
|
|
line-height: 44px;
|
||
|
|
margin: 4px 12px !important;
|
||
|
|
padding: 0 12px !important;
|
||
|
|
border-radius: 6px;
|
||
|
|
color: var(--sidebar-text);
|
||
|
|
transition: all 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-item:hover),
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-title:hover) {
|
||
|
|
background: var(--sidebar-hover) !important;
|
||
|
|
color: var(--sidebar-text) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-item-selected) {
|
||
|
|
background: var(--sidebar-active) !important;
|
||
|
|
color: var(--sidebar-text) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-item .ant-menu-item-icon),
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-title .ant-menu-item-icon) {
|
||
|
|
font-size: 16px;
|
||
|
|
color: var(--sidebar-text-secondary);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-item-selected .ant-menu-item-icon) {
|
||
|
|
color: var(--sidebar-text) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.menu-divider {
|
||
|
|
padding: 8px 20px 4px;
|
||
|
|
font-size: 11px;
|
||
|
|
color: var(--sidebar-text-secondary);
|
||
|
|
text-transform: uppercase;
|
||
|
|
letter-spacing: 0.5px;
|
||
|
|
font-weight: 600;
|
||
|
|
opacity: 0.7;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Submenu styles */
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-arrow) {
|
||
|
|
color: var(--sidebar-text-secondary) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-open .ant-menu-submenu-title) {
|
||
|
|
background: var(--sidebar-hover) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-menu :deep(.ant-menu-sub .ant-menu-item) {
|
||
|
|
padding-left: 48px !important;
|
||
|
|
margin: 2px 12px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Sidebar Footer */
|
||
|
|
.sidebar-footer {
|
||
|
|
position: absolute;
|
||
|
|
bottom: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
padding: 16px;
|
||
|
|
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.collapse-btn {
|
||
|
|
width: 100%;
|
||
|
|
height: 40px;
|
||
|
|
color: var(--sidebar-text-secondary) !important;
|
||
|
|
border: 1px solid rgba(255, 255, 255, 0.1) !important;
|
||
|
|
background: rgba(255, 255, 255, 0.05) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.collapse-btn:hover {
|
||
|
|
background: rgba(255, 255, 255, 0.1) !important;
|
||
|
|
border-color: rgba(255, 255, 255, 0.2) !important;
|
||
|
|
color: var(--sidebar-text) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.collapse-btn :deep(.ant-btn-icon) {
|
||
|
|
font-size: 14px;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Main Layout */
|
||
|
|
.main-layout {
|
||
|
|
margin-left: 280px;
|
||
|
|
transition: margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-collapsed + .main-layout {
|
||
|
|
margin-left: 80px;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Content */
|
||
|
|
.content {
|
||
|
|
background: var(--content-bg);
|
||
|
|
min-height: calc(100vh - 64px);
|
||
|
|
padding: 24px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-container {
|
||
|
|
background: white;
|
||
|
|
border-radius: 12px;
|
||
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||
|
|
min-height: calc(100vh - 112px);
|
||
|
|
padding: 24px;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Mobile Drawer */
|
||
|
|
.mobile-drawer :deep(.ant-drawer-content) {
|
||
|
|
background: var(--sidebar-bg);
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar {
|
||
|
|
height: 100%;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar-header {
|
||
|
|
padding: 20px 16px;
|
||
|
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-brand {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 12px;
|
||
|
|
color: var(--sidebar-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-brand h3 {
|
||
|
|
margin: 0;
|
||
|
|
font-size: 18px;
|
||
|
|
font-weight: 600;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-brand svg {
|
||
|
|
font-size: 24px;
|
||
|
|
color: var(--primary-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar-menu {
|
||
|
|
background: transparent !important;
|
||
|
|
border-right: none !important;
|
||
|
|
padding: 16px 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar-menu :deep(.ant-menu-item),
|
||
|
|
.mobile-sidebar-menu :deep(.ant-menu-submenu-title) {
|
||
|
|
color: var(--sidebar-text) !important;
|
||
|
|
height: 48px;
|
||
|
|
line-height: 48px;
|
||
|
|
margin: 2px 12px !important;
|
||
|
|
padding-left: 20px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar-menu :deep(.ant-menu-item:hover),
|
||
|
|
.mobile-sidebar-menu :deep(.ant-menu-submenu-title:hover) {
|
||
|
|
background: var(--sidebar-hover) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-sidebar-menu :deep(.ant-menu-item-selected) {
|
||
|
|
background: var(--sidebar-active) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Dropdowns */
|
||
|
|
.notification-dropdown,
|
||
|
|
.mobile-notification-dropdown {
|
||
|
|
width: 320px;
|
||
|
|
background: white;
|
||
|
|
border-radius: 12px;
|
||
|
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||
|
|
overflow: hidden;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-header {
|
||
|
|
padding: 16px 20px;
|
||
|
|
border-bottom: 1px solid var(--border-color);
|
||
|
|
display: flex;
|
||
|
|
justify-content: space-between;
|
||
|
|
align-items: center;
|
||
|
|
background: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-header h3 {
|
||
|
|
margin: 0;
|
||
|
|
font-size: 16px;
|
||
|
|
font-weight: 600;
|
||
|
|
color: #111827;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-list {
|
||
|
|
max-height: 400px;
|
||
|
|
overflow-y: auto;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-item {
|
||
|
|
padding: 16px 20px;
|
||
|
|
display: flex;
|
||
|
|
align-items: flex-start;
|
||
|
|
gap: 12px;
|
||
|
|
border-bottom: 1px solid var(--border-color);
|
||
|
|
cursor: pointer;
|
||
|
|
transition: background 0.2s;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-item:hover {
|
||
|
|
background: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-item:last-child {
|
||
|
|
border-bottom: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-icon {
|
||
|
|
width: 36px;
|
||
|
|
height: 36px;
|
||
|
|
border-radius: 8px;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
font-size: 16px;
|
||
|
|
flex-shrink: 0;
|
||
|
|
background: rgba(0, 0, 0, 0.05);
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-content {
|
||
|
|
flex: 1;
|
||
|
|
min-width: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-title {
|
||
|
|
font-size: 14px;
|
||
|
|
font-weight: 500;
|
||
|
|
color: #111827;
|
||
|
|
margin-bottom: 4px;
|
||
|
|
line-height: 1.4;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-time {
|
||
|
|
font-size: 12px;
|
||
|
|
color: #6b7280;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-menu,
|
||
|
|
.mobile-profile-menu {
|
||
|
|
border-radius: 8px;
|
||
|
|
overflow: hidden;
|
||
|
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||
|
|
border: 1px solid var(--border-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-menu :deep(.ant-menu-item),
|
||
|
|
.mobile-profile-menu :deep(.ant-menu-item) {
|
||
|
|
height: 40px;
|
||
|
|
line-height: 40px;
|
||
|
|
margin: 0 !important;
|
||
|
|
padding: 0 16px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-menu :deep(.ant-menu-item:hover),
|
||
|
|
.mobile-profile-menu :deep(.ant-menu-item:hover) {
|
||
|
|
background: #f3f4f6 !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logout-item {
|
||
|
|
color: #ef4444 !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logout-item:hover {
|
||
|
|
background: #fef2f2 !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Responsive Design */
|
||
|
|
@media (max-width: 1200px) {
|
||
|
|
.sidebar {
|
||
|
|
width: 240px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.main-layout {
|
||
|
|
margin-left: 240px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar.sidebar-collapsed {
|
||
|
|
width: 80px !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.sidebar-collapsed + .main-layout {
|
||
|
|
margin-left: 80px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 992px) {
|
||
|
|
.sidebar {
|
||
|
|
display: none !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.main-layout {
|
||
|
|
margin-left: 0 !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content {
|
||
|
|
padding: 20px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.header-container {
|
||
|
|
padding: 0 20px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
.header {
|
||
|
|
height: 60px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.header-container {
|
||
|
|
padding: 0 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content {
|
||
|
|
padding: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-container {
|
||
|
|
padding: 20px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-content {
|
||
|
|
display: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.admin-name {
|
||
|
|
font-size: 14px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-actions {
|
||
|
|
gap: 12px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 576px) {
|
||
|
|
.header-container {
|
||
|
|
padding: 0 12px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content {
|
||
|
|
padding: 12px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-container {
|
||
|
|
padding: 16px;
|
||
|
|
border-radius: 8px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-dropdown,
|
||
|
|
.mobile-notification-dropdown {
|
||
|
|
width: 280px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 480px) {
|
||
|
|
.brand-section {
|
||
|
|
gap: 8px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.menu-toggle {
|
||
|
|
width: 36px;
|
||
|
|
height: 36px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-icon {
|
||
|
|
width: 36px;
|
||
|
|
height: 36px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.mobile-actions {
|
||
|
|
gap: 8px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Animaciones */
|
||
|
|
.sidebar-menu :deep(.ant-menu-item),
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-title) {
|
||
|
|
animation: slideIn 0.3s ease-out;
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes slideIn {
|
||
|
|
from {
|
||
|
|
opacity: 0;
|
||
|
|
transform: translateX(-10px);
|
||
|
|
}
|
||
|
|
to {
|
||
|
|
opacity: 1;
|
||
|
|
transform: translateX(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Mejoras de accesibilidad */
|
||
|
|
@media (prefers-reduced-motion: reduce) {
|
||
|
|
.sidebar,
|
||
|
|
.main-layout,
|
||
|
|
.sidebar-menu :deep(.ant-menu-item),
|
||
|
|
.sidebar-menu :deep(.ant-menu-submenu-title) {
|
||
|
|
transition: none !important;
|
||
|
|
animation: none !important;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Modo oscuro del sistema */
|
||
|
|
@media (prefers-color-scheme: dark) {
|
||
|
|
:root {
|
||
|
|
--header-bg: #1f2937;
|
||
|
|
--content-bg: #111827;
|
||
|
|
--border-color: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.header {
|
||
|
|
background: var(--header-bg);
|
||
|
|
border-bottom-color: var(--border-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
.admin-name {
|
||
|
|
color: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.admin-role {
|
||
|
|
color: #9ca3af;
|
||
|
|
}
|
||
|
|
|
||
|
|
.action-btn {
|
||
|
|
background: #374151;
|
||
|
|
border-color: #4b5563;
|
||
|
|
color: #d1d5db;
|
||
|
|
}
|
||
|
|
|
||
|
|
.action-btn:hover {
|
||
|
|
background: #4b5563;
|
||
|
|
border-color: #6b7280;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-btn {
|
||
|
|
background: #374151;
|
||
|
|
border-color: #4b5563;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-btn:hover {
|
||
|
|
background: #4b5563;
|
||
|
|
border-color: #6b7280;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-name {
|
||
|
|
color: #d1d5db;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-container {
|
||
|
|
background: #1f2937;
|
||
|
|
color: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-dropdown,
|
||
|
|
.mobile-notification-dropdown {
|
||
|
|
background: #1f2937;
|
||
|
|
border-color: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-header {
|
||
|
|
background: #111827;
|
||
|
|
border-bottom-color: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-header h3 {
|
||
|
|
color: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-item:hover {
|
||
|
|
background: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-title {
|
||
|
|
color: #f9fafb;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-time {
|
||
|
|
color: #9ca3af;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-menu,
|
||
|
|
.mobile-profile-menu {
|
||
|
|
background: #1f2937;
|
||
|
|
border-color: #374151;
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-menu :deep(.ant-menu-item:hover),
|
||
|
|
.mobile-profile-menu :deep(.ant-menu-item:hover) {
|
||
|
|
background: #374151 !important;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</style>
|