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.

161 lines
3.4 KiB
Vue

2 months ago
<!-- 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>