main
Elmer Yujra Condori 2 months ago
parent 53dbbe5382
commit 495595033d

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 MiB

File diff suppressed because it is too large Load Diff

@ -0,0 +1,139 @@
<!-- components/contact/ContactSection.vue -->
<template>
<section class="contact-section">
<div class="section-container">
<div class="contact-grid">
<div class="contact-info">
<h2 class="section-title">¿Necesitas Ayuda?</h2>
<p class="contact-subtitle">Nuestro equipo está listo para asistirte en todo el proceso de admisión</p>
<div class="contact-methods">
<div class="contact-method">
<PhoneOutlined />
<div>
<h4>Teléfono</h4>
<p>(01) 123-4567</p>
</div>
</div>
<div class="contact-method">
<MailOutlined />
<div>
<h4>Email</h4>
<p>admision@universidad.edu.pe</p>
</div>
</div>
<div class="contact-method">
<ClockCircleOutlined />
<div>
<h4>Horario</h4>
<p>Lun-Vie: 8:00 AM - 6:00 PM</p>
</div>
</div>
</div>
</div>
<div class="contact-form">
<h3>Envíanos un Mensaje</h3>
<a-form layout="vertical">
<a-form-item label="Nombre completo">
<a-input placeholder="Ingresa tu nombre completo" />
</a-form-item>
<a-form-item label="Email">
<a-input placeholder="tu@email.com" />
</a-form-item>
<a-form-item label="Consulta">
<a-textarea placeholder="Describe tu consulta..." :rows="4" />
</a-form-item>
<a-button type="primary" block>Enviar Mensaje</a-button>
</a-form>
</div>
</div>
</div>
</section>
</template>
<script setup>
import { PhoneOutlined, MailOutlined, ClockCircleOutlined } from '@ant-design/icons-vue'
</script>
<style scoped>
.contact-section {
padding: 80px 0;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.contact-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
align-items: start;
}
.section-title {
font-size: 2.5rem;
font-weight: 700;
color: #1a237e;
margin-bottom: 16px;
}
.contact-subtitle {
color: #666;
font-size: 1.125rem;
margin-bottom: 40px;
}
.contact-methods {
display: flex;
flex-direction: column;
gap: 24px;
}
.contact-method {
display: flex;
align-items: center;
gap: 16px;
}
.contact-method svg {
color: #1890ff;
font-size: 24px;
}
.contact-method h4 {
margin: 0 0 4px;
color: #1a237e;
}
.contact-method p {
margin: 0;
color: #666;
}
.contact-form {
background: white;
padding: 40px;
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
}
.contact-form h3 {
margin: 0 0 32px;
color: #1a237e;
}
@media (max-width: 992px) {
.contact-grid {
grid-template-columns: 1fr;
gap: 48px;
}
.section-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,310 @@
<!-- components/convocatorias/ConvocatoriasSection.vue -->
<template>
<section id="convocatorias" class="convocatorias-modern">
<div class="section-container">
<div class="section-header">
<div class="header-with-badge">
<h2 class="section-title">Convocatorias Vigentes</h2>
<a-badge count="Nuevo" class="new-badge" />
</div>
<p class="section-subtitle">Selecciona el proceso de admisión que se ajuste a tu perfil</p>
</div>
<div class="convocatorias-grid">
<!-- Convocatoria Principal -->
<!-- Convocatoria Principal -->
<a-card class="main-convocatoria-card">
<div class="card-badge">Principal</div>
<div class="main-card-content">
<!-- IZQUIERDA: CONTENIDO -->
<div class="main-card-text">
<div class="convocatoria-header">
<div>
<h3>Admisión Ordinaria 2024-I</h3>
<p class="convocatoria-date">
Inscripciones: 20 Oct - 30 Nov 2023
</p>
</div>
<a-tag color="success" class="status-tag">Abierto</a-tag>
</div>
<p class="convocatoria-desc">
Proceso de admisión general para todas las carreras profesionales de pregrado.
Examen de conocimientos: 15 de diciembre 2023.
</p>
<a-divider class="custom-divider" />
<div class="quick-actions">
<h4>Acciones Rápidas</h4>
<div class="action-buttons-grid">
<a-button class="action-btn" @click="$emit('show-modal', 'requisitos')">
<template #icon><FileTextOutlined /></template>
Requisitos
</a-button>
<a-button class="action-btn" @click="$emit('show-modal', 'pagos')">
<template #icon><DollarOutlined /></template>
Pagos
</a-button>
<a-button class="action-btn" @click="$emit('show-modal', 'vacantes')">
<template #icon><TeamOutlined /></template>
Vacantes
</a-button>
<a-button class="action-btn" @click="$emit('show-modal', 'cronograma')">
<template #icon><CalendarOutlined /></template>
Cronograma
</a-button>
</div>
</div>
<a-divider class="custom-divider" />
<div class="preinscripcion-section">
<div class="preinscripcion-info">
<h4>Preinscripción en Línea</h4>
<p>Completa tu preinscripción de manera digital y segura</p>
</div>
<a-button
type="primary"
size="large"
class="preinscripcion-btn"
@click="$emit('open-preinscripcion')"
>
<template #icon><FormOutlined /></template>
Iniciar Preinscripción
</a-button>
</div>
</div>
</div>
</a-card>
<!-- IMAGEN DERECHA -->
<div class="convocatoria-image-wrapper">
<a-image
src="/images/extra.jpg"
alt="Convocatoria"
:preview="true"
class="convocatoria-image"
/>
</div>
<!-- Otras convocatorias -->
<a-card class="secondary-convocatoria-card" >
<div class="convocatoria-header">
<div>
<h4>cepreuna</h4>
<p class="convocatoria-date">30 de enero</p>
</div>
<a-tag class="status-tag">FINALIZADO</a-tag>
</div>
<p class="convocatoria-desc">postulaNTES DEL CEPRE </p>
<div class="card-footer">
<a-button type="link" size="small">Ver detalles</a-button>
<a-button type="primary" ghost size="small">Consultar</a-button>
</div>
</a-card>
<a-card class="secondary-convocatoria-card" >
<div class="convocatoria-header">
<div>
<h4>cepreuna</h4>
<p class="convocatoria-date">30 de enero</p>
</div>
<a-tag class="status-tag">FINALIZADO</a-tag>
</div>
<p class="convocatoria-desc">postulaNTES DEL CEPRE </p>
<div class="card-footer">
<a-button type="link" size="small">Ver detalles</a-button>
<a-button type="primary" ghost size="small">Consultar</a-button>
</div>
</a-card>
</div>
</div>
</section>
</template>
<script setup>
import { FileTextOutlined, DollarOutlined, TeamOutlined, CalendarOutlined, FormOutlined } from '@ant-design/icons-vue'
defineProps({
otrasConvocatorias: {
type: Array,
required: true
}
})
defineEmits(['show-modal', 'open-preinscripcion'])
</script>
<style scoped>
.convocatorias-modern {
padding: 80px 0;
font-family: "Times New Roman", Times, serif;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.section-header {
text-align: center;
margin-bottom: 60px;
}
.section-title {
font-size: 2.8rem;
font-weight: 700;
color: #0d1b52;
margin-bottom: 16px;
}
.section-subtitle {
font-size: 1.125rem;
color: #666;
max-width: 600px;
margin: 0 auto;
}
.header-with-badge {
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
}
.new-badge :deep(.ant-badge-count) {
background: linear-gradient(45deg, #ff6b6b, #ffd700);
box-shadow: 0 2px 8px rgba(255, 107, 107, 0.3);
}
.convocatorias-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 24px;
}
.main-convocatoria-card {
position: relative;
border: none;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
border-radius: 16px;
padding: 32px;
}
.card-badge {
position: absolute;
top: -12px;
left: 24px;
background: linear-gradient(45deg, #1890ff, #52c41a);
color: white;
padding: 6px 16px;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 600;
}
.convocatoria-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20px;
}
.convocatoria-header h3 {
margin: 0;
font-size: 1.5rem;
color: #1a237e;
}
.convocatoria-date {
color: #666;
margin: 8px 0 0;
}
.status-tag {
font-weight: 600;
padding: 4px 12px;
border-radius: 20px;
}
.convocatoria-desc {
color: #666;
line-height: 1.6;
margin-bottom: 24px;
}
.custom-divider {
margin: 24px 0;
}
.action-buttons-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
margin-top: 16px;
}
.action-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
height: 48px;
}
.preinscripcion-section {
display: flex;
justify-content: space-between;
align-items: center;
gap: 24px;
}
.preinscripcion-info h4 {
margin: 0 0 8px;
color: #1a237e;
}
.preinscripcion-btn {
background: linear-gradient(135deg, #1a237e 0%, #283593 100%);
border: none;
height: 56px;
font-weight: 600;
}
.secondary-convocatoria-card {
border: none;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
border-radius: 12px;
}
.card-footer {
display: flex;
justify-content: space-between;
margin-top: 20px;
}
@media (max-width: 768px) {
.convocatorias-grid {
grid-template-columns: 1fr;
}
.preinscripcion-section {
flex-direction: column;
text-align: center;
}
.section-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,147 @@
<!-- components/hero/HeroSection.vue -->
<template>
<section class="modern-hero">
<div class="hero-container">
<div class="hero-content">
<a-tag color="blue" class="hero-tag">Convocatoria 2026</a-tag>
<h1 class="hero-title">
Admision
<span class="gradient-text">2026</span>
</h1>
<p class="hero-subtitle">
Forma parte de la comunidad universitaria más prestigiosa del país.
<br>Admisión 2024-I | Inscripciones abiertas
</p>
<div class="hero-actions">
<a-button type="primary" size="large" class="cta-button" @click="$emit('scroll-to-convocatoria')">
<template #icon><RightCircleOutlined /></template>
Postular Ahora
</a-button>
<a-button size="large" class="secondary-button" @click="$emit('virtual-tour')">
<template #icon><PlayCircleOutlined /></template>
Tour Virtual
</a-button>
</div>
</div>
<div class="hero-visual">
<div class="floating-card">
<div class="card-header">
<CalendarOutlined />
<span>Próximo Evento</span>
</div>
<h3>Charla Informativa</h3>
<p>25 Nov | 4:00 PM - Virtual</p>
<a-button type="link" size="small">Registrarse</a-button>
</div>
</div>
</div>
</section>
</template>
<script setup>
import { RightCircleOutlined, PlayCircleOutlined, CalendarOutlined } from '@ant-design/icons-vue'
defineEmits(['scroll-to-convocatoria', 'virtual-tour'])
</script>
<style scoped>
.modern-hero {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 80px 0;
}
.hero-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
align-items: center;
}
.hero-tag {
background: rgba(255, 255, 255, 0.2);
border: none;
color: white;
margin-bottom: 24px;
}
.hero-title {
font-size: 3.5rem;
font-weight: 800;
line-height: 1.1;
margin-bottom: 24px;
}
.gradient-text {
background: linear-gradient(45deg, #ffd700, #ff6b6b);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-subtitle {
font-size: 1.25rem;
opacity: 0.9;
margin-bottom: 32px;
line-height: 1.6;
}
.hero-actions {
display: flex;
gap: 16px;
}
.cta-button {
background: white;
border: none;
color: #1a237e;
font-weight: 600;
}
.secondary-button {
background: transparent;
border: 2px solid rgba(255, 255, 255, 0.3);
color: white;
}
.floating-card {
background: white;
color: #333;
padding: 24px;
border-radius: 12px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}
.card-header {
display: flex;
align-items: center;
gap: 8px;
color: #666;
margin-bottom: 16px;
}
@media (max-width: 992px) {
.hero-container {
grid-template-columns: 1fr;
text-align: center;
gap: 48px;
}
.hero-title {
font-size: 2.5rem;
}
.hero-actions {
flex-direction: column;
}
}
@media (max-width: 768px) {
.hero-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,120 @@
<!-- components/modalidades/ModalidadesSection.vue -->
<template>
<section class="modalidades-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">Modalidades de Admisión</h2>
<p class="section-subtitle">Diferentes formas de ingresar a nuestra universidad</p>
</div>
<div class="modalidades-grid">
<a-card v-for="modalidad in modalidades" :key="modalidad.id" class="modalidad-card">
<div class="modalidad-icon" :style="{ backgroundColor: modalidad.color }">
<component :is="modalidad.icono" />
</div>
<h4>{{ modalidad.nombre }}</h4>
<p>{{ modalidad.descripcion }}</p>
<a-tag :color="modalidad.estadoColor" class="modalidad-status">
{{ modalidad.estado }}
</a-tag>
</a-card>
</div>
</div>
</section>
</template>
<script setup>
defineProps({
modalidades: {
type: Array,
required: true
}
})
</script>
<style scoped>
.modalidades-section {
padding: 80px 0;
background: #f8f9fa;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.section-header {
text-align: center;
margin-bottom: 60px;
}
.section-title {
font-size: 2.5rem;
font-weight: 700;
color: #1a237e;
margin-bottom: 16px;
}
.section-subtitle {
font-size: 1.125rem;
color: #666;
max-width: 600px;
margin: 0 auto;
}
.modalidades-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 24px;
}
.modalidad-card {
border: none;
border-radius: 12px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
text-align: center;
padding: 32px 24px;
transition: transform 0.3s ease;
}
.modalidad-card:hover {
transform: translateY(-4px);
}
.modalidad-icon {
width: 64px;
height: 64px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 20px;
color: white;
font-size: 28px;
}
.modalidad-card h4 {
margin: 0 0 12px;
color: #1a237e;
}
.modalidad-card p {
color: #666;
font-size: 0.875rem;
line-height: 1.5;
margin-bottom: 16px;
}
.modalidad-status {
font-weight: 500;
padding: 4px 16px;
border-radius: 20px;
}
@media (max-width: 992px) {
.section-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,134 @@
<!-- components/noticias/NoticiasSection.vue -->
<template>
<section class="noticias-modern">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">Noticias y Comunicados</h2>
<a-button type="link" class="view-all">Ver todos</a-button>
</div>
<div class="noticias-grid-modern">
<a-card v-for="noticia in noticias" :key="noticia.id" class="noticia-card-modern">
<div class="noticia-image" :style="{ backgroundImage: `url(${noticia.imagen})` }">
<a-tag :color="noticia.tagColor" class="noticia-tag">{{ noticia.categoria }}</a-tag>
</div>
<div class="noticia-content">
<div class="noticia-meta">
<CalendarOutlined />
<span>{{ noticia.fecha }}</span>
</div>
<h4>{{ noticia.titulo }}</h4>
<p>{{ noticia.descripcion }}</p>
<a-button type="link" size="small">Leer más</a-button>
</div>
</a-card>
</div>
</div>
</section>
</template>
<script setup>
import { CalendarOutlined } from '@ant-design/icons-vue'
defineProps({
noticias: {
type: Array,
required: true
}
})
</script>
<style scoped>
.noticias-modern {
padding: 80px 0;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 60px;
}
.section-title {
font-size: 2.5rem;
font-weight: 700;
color: #1a237e;
margin: 0;
}
.view-all {
color: #1890ff;
font-weight: 500;
}
.noticias-grid-modern {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 32px;
}
.noticia-card-modern {
border: none;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
transition: transform 0.3s ease;
}
.noticia-card-modern:hover {
transform: translateY(-4px);
}
.noticia-image {
height: 200px;
background-size: cover;
background-position: center;
position: relative;
}
.noticia-tag {
position: absolute;
top: 16px;
left: 16px;
border: none;
font-weight: 500;
}
.noticia-content {
padding: 24px;
}
.noticia-meta {
display: flex;
align-items: center;
gap: 8px;
color: #666;
font-size: 0.875rem;
margin-bottom: 12px;
}
.noticia-content h4 {
margin: 0 0 12px;
color: #1a237e;
font-size: 1.125rem;
}
.noticia-content p {
color: #666;
line-height: 1.5;
margin-bottom: 16px;
}
@media (max-width: 992px) {
.section-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,115 @@
<!-- components/process/ProcessSection.vue -->
<template>
<section class="process-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">Proceso de Admisión 2026</h2>
<p class="section-subtitle">
Sigue estos pasos para postular al Examen General 2026-I
</p>
</div>
<div class="process-timeline">
<a-steps :current="2" class="modern-steps">
<a-step title="Preinscripción Virtual" description="20 Oct - 30 Nov" />
<a-step title="Inscripción Presencial" description="1 - 5 Dic" />
<a-step title="Examen" description="15 Diciembre" />
<a-step title="Resultados" description="20 Diciembre" />
<a-step title="Control Biométrico Ingresantes" description="8 - 12 Ene" />
</a-steps>
</div>
</div>
</section>
</template>
<style scoped>
.process-section {
padding: 30px 0; /* mucho menos espacio */
background: #ffffff; /* quitamos el gris */
font-family: "Times New Roman", Times, serif;
}
.section-container {
max-width: 1100px;
margin: 0 auto;
padding: 0 20px;
}
.section-header {
text-align: center;
margin-bottom: 25px; /* reducido */
}
.section-title {
font-size: 2.1rem;
font-weight: 600;
color: #2c3e50;
margin: 0 0 6px 0; /* sin espacio exagerado */
line-height: 1.2;
}
.section-subtitle {
font-size: 1rem;
color: #777;
margin: 0;
line-height: 1.4;
}
/* ====== STEPS ====== */
.process-timeline {
max-width: 900px;
margin: 0 auto;
}
.modern-steps {
padding: 15px 10px; /* MUY compacto */
}
/* QUITAR ESPACIO EXTRA DE ANT DESIGN */
.modern-steps :deep(.ant-steps-item) {
padding-bottom: 0;
}
.modern-steps :deep(.ant-steps-item-title) {
font-size: 0.9rem;
font-weight: 600;
color: #34495e;
line-height: 1.2;
}
.modern-steps :deep(.ant-steps-item-description) {
font-size: 0.8rem;
color: #888;
margin-top: 2px;
}
/* Iconos más pequeños */
.modern-steps :deep(.ant-steps-item-icon) {
width: 28px;
height: 28px;
line-height: 28px;
font-size: 13px;
}
/* Línea más fina */
.modern-steps :deep(.ant-steps-item-tail::after) {
height: 2px;
background: #dfe6e9;
}
/* Step activo */
.modern-steps :deep(.ant-steps-item-process .ant-steps-item-icon) {
background-color: #4a69bd;
border-color: #4a69bd;
}
/* Quitar altura extra que mete Ant */
.modern-steps :deep(.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item) {
margin-top: 0;
}
</style>

@ -0,0 +1,161 @@
<!-- components/programas/ProgramasSection.vue -->
<template>
<section class="programas-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">Programas Académicos</h2>
<p class="section-subtitle">Explora nuestra oferta académica de pregrado y posgrado</p>
</div>
<div class="facultades-tabs">
<a-tabs v-model:activeKey="facultadActiva">
<a-tab-pane v-for="facultad in facultades" :key="facultad.id" :tab="facultad.nombre">
<div class="carreras-grid">
<a-card v-for="carrera in facultad.carreras" :key="carrera.id" class="carrera-card">
<div class="carrera-header">
<div class="carrera-icon">
<component :is="carrera.icono" />
</div>
<div>
<h4>{{ carrera.nombre }}</h4>
<p class="carrera-grado">{{ carrera.grado }}</p>
</div>
</div>
<p class="carrera-desc">{{ carrera.descripcion }}</p>
<div class="carrera-stats">
<span><UserOutlined /> Vacantes: {{ carrera.vacantes }}</span>
<span><TrophyOutlined /> Puntaje: {{ carrera.puntaje }}</span>
</div>
<a-button type="link" size="small" class="carrera-link">Ver plan de estudios</a-button>
</a-card>
</div>
</a-tab-pane>
</a-tabs>
</div>
</div>
</section>
</template>
<script setup>
import { ref } from 'vue'
import { UserOutlined, TrophyOutlined } from '@ant-design/icons-vue'
defineProps({
facultades: {
type: Array,
required: true
}
})
const facultadActiva = ref('1')
</script>
<style scoped>
.programas-section {
padding: 80px 0;
background: #f8f9fa;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.section-header {
text-align: center;
margin-bottom: 60px;
}
.section-title {
font-size: 2.5rem;
font-weight: 700;
color: #1a237e;
margin-bottom: 16px;
}
.section-subtitle {
font-size: 1.125rem;
color: #666;
max-width: 600px;
margin: 0 auto;
}
.facultades-tabs :deep(.ant-tabs-nav) {
margin-bottom: 40px;
}
.carreras-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
}
.carrera-card {
border: none;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
border-radius: 12px;
transition: transform 0.3s ease;
}
.carrera-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
}
.carrera-header {
display: flex;
gap: 16px;
align-items: center;
margin-bottom: 16px;
}
.carrera-icon {
background: linear-gradient(135deg, #1a237e 0%, #283593 100%);
color: white;
width: 48px;
height: 48px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
}
.carrera-header h4 {
margin: 0;
color: #1a237e;
}
.carrera-grado {
color: #666;
font-size: 0.875rem;
margin: 4px 0 0;
}
.carrera-desc {
color: #666;
font-size: 0.875rem;
line-height: 1.5;
margin-bottom: 16px;
}
.carrera-stats {
display: flex;
justify-content: space-between;
color: #666;
font-size: 0.875rem;
margin-bottom: 16px;
}
.carrera-link {
color: #1890ff;
font-weight: 500;
}
@media (max-width: 992px) {
.section-title {
font-size: 2rem;
}
}
</style>

@ -0,0 +1,63 @@
<!-- components/stats/StatsSection.vue -->
<template>
<section class="stats-section">
<div class="section-container">
<div class="stats-grid">
<div class="stat-card">
<h3>25+</h3>
<p>Carreras Profesionales</p>
</div>
<div class="stat-card">
<h3>98%</h3>
<p>Indice de Satisfacción</p>
</div>
<div class="stat-card">
<h3>15,000+</h3>
<p>Estudiantes Activos</p>
</div>
<div class="stat-card">
<h3>85%</h3>
<p>Egresados Laborando</p>
</div>
</div>
</div>
</section>
</template>
<style scoped>
.stats-section {
padding: 60px 0;
background: linear-gradient(135deg, #1a237e 0%, #283593 100%);
color: white;
}
.section-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 40px;
text-align: center;
}
.stat-card h3 {
font-size: 3rem;
font-weight: 800;
margin: 0;
background: linear-gradient(45deg, #ffd700, #ff6b6b);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.stat-card p {
font-size: 1rem;
opacity: 0.9;
margin: 8px 0 0;
}
</style>

@ -0,0 +1,118 @@
<!-- components/modals/PreinscripcionModal.vue -->
<template>
<a-modal
:open="visible"
@update:open="$emit('update:visible', $event)"
title="Preinscripción en Línea"
width="600px"
:footer="null"
class="modern-modal"
>
<div class="modal-steps">
<a-steps :current="0" size="small">
<a-step title="Datos Personales" />
<a-step title="Programa" />
<a-step title="Documentos" />
<a-step title="Confirmación" />
</a-steps>
</div>
<a-form layout="vertical" class="modal-form">
<h3>Información Personal</h3>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="Nombres">
<a-input placeholder="Ingresa tus nombres" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="Apellidos">
<a-input placeholder="Ingresa tus apellidos" />
</a-form-item>
</a-col>
</a-row>
<a-form-item label="Correo Electrónico">
<a-input type="email" placeholder="ejemplo@correo.com" />
</a-form-item>
<a-form-item label="Programa de Interés">
<a-select placeholder="Selecciona un programa">
<a-select-option v-for="facultad in facultades" :key="facultad.id">
<optgroup :label="facultad.nombre">
<a-select-option v-for="carrera in facultad.carreras" :key="carrera.id" :value="carrera.id">
{{ carrera.nombre }}
</a-select-option>
</optgroup>
</a-select-option>
</a-select>
</a-form-item>
<a-form-item>
<a-checkbox>
Acepto los términos y condiciones del proceso de admisión
</a-checkbox>
</a-form-item>
<div class="modal-actions">
<a-button @click="$emit('update:visible', false)">Cancelar</a-button>
<a-button type="primary" @click="$emit('submit')">Continuar</a-button>
</div>
</a-form>
</a-modal>
</template>
<script setup>
defineProps({
visible: {
type: Boolean,
required: true
},
facultades: {
type: Array,
required: true
}
})
defineEmits(['update:visible', 'submit'])
</script>
<style scoped>
.modern-modal :deep(.ant-modal-content) {
border-radius: 16px;
overflow: hidden;
}
.modern-modal :deep(.ant-modal-header) {
border-bottom: none;
padding: 32px 32px 0;
}
.modern-modal :deep(.ant-modal-body) {
padding: 32px;
}
.modern-modal :deep(.ant-modal-title) {
font-size: 1.5rem;
font-weight: 600;
color: #1a237e;
}
.modal-steps {
margin-bottom: 32px;
}
.modal-form h3 {
margin: 0 0 24px;
color: #1a237e;
}
.modal-actions {
display: flex;
gap: 12px;
justify-content: flex-end;
margin-top: 32px;
}
</style>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save