create-openclass-uniminuto 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +480 -0
- package/bin/create-openclass-uniminuto.mjs +142 -0
- package/package.json +39 -0
- package/template/.github/workflows/deploy.yml +64 -0
- package/template/README.md +326 -0
- package/template/config/openclass.config.iot-desde-openclass-iot.json +77 -0
- package/template/config/openclass.config.iot-ejemplo.json +81 -0
- package/template/demo_semana1.md +11 -0
- package/template/demo_semana2.md +11 -0
- package/template/demo_semana3.md +11 -0
- package/template/demo_semana4.md +11 -0
- package/template/demo_semana5.md +11 -0
- package/template/demo_semana6.md +11 -0
- package/template/demo_semana7.md +11 -0
- package/template/demo_semana8.md +11 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana1.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana2.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana3.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana4.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana5.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana6.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana7.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana8.md +12 -0
- package/template/ejemplos/iot-semanas-1-a-3/raiz/slides.md +154 -0
- package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana1.md +846 -0
- package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana2.md +1040 -0
- package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana3.md +1071 -0
- package/template/openclass.config.json +79 -0
- package/template/package-lock.json +11568 -0
- package/template/package.json +61 -0
- package/template/plantillas/launcher.md +11 -0
- package/template/plantillas/semana.md +177 -0
- package/template/public/descargas/.gitkeep +0 -0
- package/template/public/favicon.png +0 -0
- package/template/public/fondos/slide-01-portada.png +0 -0
- package/template/public/fondos/slide-02-titulo.png +0 -0
- package/template/public/fondos/slide-03-imagen-izquierda.png +0 -0
- package/template/public/fondos/slide-04-imagen-derecha.png +0 -0
- package/template/public/fondos/slide-05-template.png +0 -0
- package/template/public/fondos/slide-06-cierre.png +0 -0
- package/template/public/imagenes/.gitkeep +0 -0
- package/template/public/videos/.gitkeep +0 -0
- package/template/scripts/build-incremental.mjs +33 -0
- package/template/scripts/build-site.mjs +33 -0
- package/template/scripts/decks.mjs +29 -0
- package/template/scripts/dev-all.mjs +37 -0
- package/template/scripts/export-downloads.mjs +53 -0
- package/template/scripts/export-incremental.mjs +49 -0
- package/template/scripts/generar-desde-config.mjs +279 -0
- package/template/scripts/nuevo-curso.mjs +104 -0
- package/template/scripts/preparar-github-pages.mjs +52 -0
- package/template/scripts/publicar.mjs +36 -0
- package/template/scripts/semana.mjs +122 -0
- package/template/scripts/zip-template.mjs +70 -0
- package/template/semanas/demo_semana1.md +177 -0
- package/template/semanas/demo_semana2.md +177 -0
- package/template/semanas/demo_semana3.md +177 -0
- package/template/semanas/demo_semana4.md +177 -0
- package/template/semanas/demo_semana5.md +177 -0
- package/template/semanas/demo_semana6.md +177 -0
- package/template/semanas/demo_semana7.md +177 -0
- package/template/semanas/demo_semana8.md +177 -0
- package/template/setup/shiki.ts +10 -0
- package/template/slides.md +65 -0
- package/template/snippets/external.ts +12 -0
- package/template/theme/uniminuto/README-AutoFit.md +28 -0
- package/template/theme/uniminuto/components/AutoFitText.vue +159 -0
- package/template/theme/uniminuto/components/Counter.vue +37 -0
- package/template/theme/uniminuto/components/FontToggle.vue +42 -0
- package/template/theme/uniminuto/layouts/slide-01-portada.vue +119 -0
- package/template/theme/uniminuto/layouts/slide-02-titulo.vue +63 -0
- package/template/theme/uniminuto/layouts/slide-03-imagen-izquierda.vue +110 -0
- package/template/theme/uniminuto/layouts/slide-04-imagen-derecha.vue +110 -0
- package/template/theme/uniminuto/layouts/slide-05-titulo-superior-texto-derecha.vue +104 -0
- package/template/theme/uniminuto/layouts/slide-06-titulo-superior-texto-izquierda.vue +109 -0
- package/template/theme/uniminuto/layouts/slide-07-multimedia-con-titulo.vue +87 -0
- package/template/theme/uniminuto/layouts/slide-08-titulo-texto.vue +78 -0
- package/template/theme/uniminuto/layouts/slide-09-objetivos.vue +77 -0
- package/template/theme/uniminuto/layouts/slide-10-titulo-dos-columnas.vue +89 -0
- package/template/theme/uniminuto/layouts/slide-11-dos-titulos-dos-columnas.vue +98 -0
- package/template/theme/uniminuto/layouts/slide-12-cierre.vue +27 -0
- package/template/theme/uniminuto/layouts/slide-codigo.vue +133 -0
- package/template/theme/uniminuto/package.json +13 -0
- package/template/theme/uniminuto/styles/base.css +109 -0
- package/template/theme/uniminuto/styles/index.ts +11 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
theme: ./theme/uniminuto
|
|
3
|
+
title: Curso Open Class de ejemplo — Open Class
|
|
4
|
+
favicon: /favicon.png
|
|
5
|
+
codeCopy: true
|
|
6
|
+
transition: fade
|
|
7
|
+
routerMode: hash
|
|
8
|
+
drawings:
|
|
9
|
+
persist: false
|
|
10
|
+
layout: slide-01-portada
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
::title::
|
|
14
|
+
Curso Open Class de ejemplo
|
|
15
|
+
|
|
16
|
+
::week::
|
|
17
|
+
Open Class
|
|
18
|
+
|
|
19
|
+
::date::
|
|
20
|
+
2026
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
layout: slide-08-titulo-texto
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
::title::
|
|
27
|
+
Descripción general del curso
|
|
28
|
+
|
|
29
|
+
::content::
|
|
30
|
+
Curso demostrativo para probar la plantilla OpenClass Template UNIMINUTO. Edita este texto en openclass.config.json para adaptarlo al curso real.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
layout: slide-08-titulo-texto
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
::title::
|
|
37
|
+
Ruta de aprendizaje
|
|
38
|
+
|
|
39
|
+
::content::
|
|
40
|
+
El curso se organiza en semanas. Cada semana cuenta con un lanzador raíz y un archivo interno en la carpeta `semanas/`.
|
|
41
|
+
|
|
42
|
+
Las presentaciones activas se controlan desde `openclass.config.json` mediante el campo `generation.activeWeeks`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
layout: slide-10-titulo-dos-columnas
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
::title::
|
|
49
|
+
Presentaciones disponibles
|
|
50
|
+
|
|
51
|
+
::left::
|
|
52
|
+
### **Semana 1**
|
|
53
|
+
|
|
54
|
+
<a href="./semanas/demo_semana1/#/1" target="_self">Semana de ejemplo</a>
|
|
55
|
+
|
|
56
|
+
<a href="./descargas/demo_semana1.pdf" download>Descargar PDF</a> · <a href="./descargas/demo_semana1.pptx" download>Descargar PPTX</a>
|
|
57
|
+
|
|
58
|
+
::right::
|
|
59
|
+
### Próximamente
|
|
60
|
+
|
|
61
|
+
Activa más semanas en `openclass.config.json` y ejecuta `npm run config`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
layout: slide-12-cierre
|
|
65
|
+
---
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
|
|
3
|
+
// #region snippet
|
|
4
|
+
// Inside ./snippets/external.ts
|
|
5
|
+
export function emptyArray<T>(length: number) {
|
|
6
|
+
return Array.from<T>({ length })
|
|
7
|
+
}
|
|
8
|
+
// #endregion snippet
|
|
9
|
+
|
|
10
|
+
export function sayHello() {
|
|
11
|
+
console.log('Hello from snippets/external.ts')
|
|
12
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Ajuste automático de texto para layouts UNIMINUTO
|
|
2
|
+
|
|
3
|
+
Esta versión usa `AutoFitText.vue` para ajustar el tamaño del texto al espacio disponible.
|
|
4
|
+
|
|
5
|
+
## Reglas rápidas
|
|
6
|
+
|
|
7
|
+
- Ajuste fino de posición: edita `left`, `top`, `width`, `height` en cada layout.
|
|
8
|
+
- Ajuste fino de tamaño: edita `:min`, `:max` y `line-height` en cada `<AutoFitText>`.
|
|
9
|
+
- Para contenido muy largo, el texto se reducirá hasta `min`. Si aun así no cabe, el excedente quedará oculto para proteger el diseño.
|
|
10
|
+
- Para bloques de código largos, es mejor dividir el código en varias diapositivas.
|
|
11
|
+
|
|
12
|
+
## Ejemplo
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<AutoFitText tag="h1" class="title" :min="20" :max="42" line-height="1.05">
|
|
16
|
+
<slot name="title">Agrega un título</slot>
|
|
17
|
+
</AutoFitText>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Debug visual
|
|
21
|
+
|
|
22
|
+
Puedes activar temporalmente la caja de medición agregando `debug`:
|
|
23
|
+
|
|
24
|
+
```vue
|
|
25
|
+
<AutoFitText debug tag="div" :min="16" :max="32">
|
|
26
|
+
<slot name="content" />
|
|
27
|
+
</AutoFitText>
|
|
28
|
+
```
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component
|
|
3
|
+
:is="tag"
|
|
4
|
+
ref="boxEl"
|
|
5
|
+
class="auto-fit-text"
|
|
6
|
+
:class="{ 'auto-fit-text--debug': debug }"
|
|
7
|
+
:style="{
|
|
8
|
+
fontSize: `${fontSize}px`,
|
|
9
|
+
lineHeight: lineHeight
|
|
10
|
+
}"
|
|
11
|
+
>
|
|
12
|
+
<span ref="contentEl" class="auto-fit-text__content">
|
|
13
|
+
<slot />
|
|
14
|
+
</span>
|
|
15
|
+
</component>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script setup>
|
|
19
|
+
import { ref, onMounted, onBeforeUnmount, nextTick, watch } from 'vue'
|
|
20
|
+
|
|
21
|
+
const props = defineProps({
|
|
22
|
+
tag: {
|
|
23
|
+
type: String,
|
|
24
|
+
default: 'div'
|
|
25
|
+
},
|
|
26
|
+
min: {
|
|
27
|
+
type: Number,
|
|
28
|
+
default: 16
|
|
29
|
+
},
|
|
30
|
+
max: {
|
|
31
|
+
type: Number,
|
|
32
|
+
default: 34
|
|
33
|
+
},
|
|
34
|
+
lineHeight: {
|
|
35
|
+
type: String,
|
|
36
|
+
default: '1.18'
|
|
37
|
+
},
|
|
38
|
+
debug: {
|
|
39
|
+
type: Boolean,
|
|
40
|
+
default: false
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const boxEl = ref(null)
|
|
45
|
+
const contentEl = ref(null)
|
|
46
|
+
const fontSize = ref(props.max)
|
|
47
|
+
|
|
48
|
+
let resizeObserver = null
|
|
49
|
+
let mutationObserver = null
|
|
50
|
+
let rafId = 0
|
|
51
|
+
|
|
52
|
+
function hasOverflow() {
|
|
53
|
+
const box = boxEl.value
|
|
54
|
+
const content = contentEl.value
|
|
55
|
+
if (!box || !content) return false
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
content.scrollHeight > box.clientHeight + 1 ||
|
|
59
|
+
content.scrollWidth > box.clientWidth + 1
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function fitText() {
|
|
64
|
+
await nextTick()
|
|
65
|
+
|
|
66
|
+
const box = boxEl.value
|
|
67
|
+
const content = contentEl.value
|
|
68
|
+
if (!box || !content) return
|
|
69
|
+
if (box.clientWidth <= 0 || box.clientHeight <= 0) return
|
|
70
|
+
|
|
71
|
+
let low = props.min
|
|
72
|
+
let high = props.max
|
|
73
|
+
let best = props.min
|
|
74
|
+
|
|
75
|
+
for (let i = 0; i < 14; i += 1) {
|
|
76
|
+
const mid = (low + high) / 2
|
|
77
|
+
fontSize.value = mid
|
|
78
|
+
|
|
79
|
+
await nextTick()
|
|
80
|
+
|
|
81
|
+
if (!hasOverflow()) {
|
|
82
|
+
best = mid
|
|
83
|
+
low = mid
|
|
84
|
+
} else {
|
|
85
|
+
high = mid
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fontSize.value = Math.floor(best)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function scheduleFit() {
|
|
93
|
+
cancelAnimationFrame(rafId)
|
|
94
|
+
rafId = requestAnimationFrame(() => {
|
|
95
|
+
fitText()
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
onMounted(async () => {
|
|
100
|
+
await fitText()
|
|
101
|
+
|
|
102
|
+
if (boxEl.value) {
|
|
103
|
+
resizeObserver = new ResizeObserver(scheduleFit)
|
|
104
|
+
resizeObserver.observe(boxEl.value)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (contentEl.value) {
|
|
108
|
+
mutationObserver = new MutationObserver(scheduleFit)
|
|
109
|
+
mutationObserver.observe(contentEl.value, {
|
|
110
|
+
childList: true,
|
|
111
|
+
subtree: true,
|
|
112
|
+
characterData: true
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (document?.fonts?.ready) {
|
|
117
|
+
document.fonts.ready.then(scheduleFit)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
window.addEventListener('resize', scheduleFit)
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
onBeforeUnmount(() => {
|
|
124
|
+
resizeObserver?.disconnect()
|
|
125
|
+
mutationObserver?.disconnect()
|
|
126
|
+
cancelAnimationFrame(rafId)
|
|
127
|
+
window.removeEventListener('resize', scheduleFit)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
watch(
|
|
131
|
+
() => [props.min, props.max, props.lineHeight],
|
|
132
|
+
() => scheduleFit()
|
|
133
|
+
)
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
<style scoped>
|
|
137
|
+
.auto-fit-text {
|
|
138
|
+
display: block;
|
|
139
|
+
width: 100%;
|
|
140
|
+
height: 100%;
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
box-sizing: border-box;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.auto-fit-text__content {
|
|
146
|
+
display: block;
|
|
147
|
+
width: 100%;
|
|
148
|
+
font: inherit;
|
|
149
|
+
color: inherit;
|
|
150
|
+
line-height: inherit;
|
|
151
|
+
letter-spacing: inherit;
|
|
152
|
+
text-align: inherit;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.auto-fit-text--debug {
|
|
156
|
+
outline: 2px dashed rgba(242, 181, 27, 0.85);
|
|
157
|
+
background: rgba(242, 181, 27, 0.08);
|
|
158
|
+
}
|
|
159
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
count: {
|
|
6
|
+
default: 0,
|
|
7
|
+
},
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
const counter = ref(props.count)
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<div flex="~" w="min" border="~ main rounded-md">
|
|
15
|
+
<button
|
|
16
|
+
border="r main"
|
|
17
|
+
p="2"
|
|
18
|
+
font="mono"
|
|
19
|
+
outline="!none"
|
|
20
|
+
hover:bg="gray-400 opacity-20"
|
|
21
|
+
@click="counter -= 1"
|
|
22
|
+
>
|
|
23
|
+
-
|
|
24
|
+
</button>
|
|
25
|
+
<span m="auto" p="2">{{ counter }}</span>
|
|
26
|
+
<button
|
|
27
|
+
border="l main"
|
|
28
|
+
p="2"
|
|
29
|
+
font="mono"
|
|
30
|
+
outline="!none"
|
|
31
|
+
hover:bg="gray-400 opacity-20"
|
|
32
|
+
@click="counter += 1"
|
|
33
|
+
>
|
|
34
|
+
+
|
|
35
|
+
</button>
|
|
36
|
+
</div>
|
|
37
|
+
</template>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<button class="font-toggle" @click="toggleFont">
|
|
3
|
+
{{ isOpenDyslexic ? 'Fuente institucional' : 'OpenDyslexic' }}
|
|
4
|
+
</button>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup>
|
|
8
|
+
import { onMounted, ref } from 'vue'
|
|
9
|
+
|
|
10
|
+
const isOpenDyslexic = ref(false)
|
|
11
|
+
|
|
12
|
+
function applyFont(value) {
|
|
13
|
+
isOpenDyslexic.value = value
|
|
14
|
+
document.documentElement.classList.toggle('opendyslexic', value)
|
|
15
|
+
localStorage.setItem('slidev-font-opendyslexic', value ? '1' : '0')
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function toggleFont() {
|
|
19
|
+
applyFont(!isOpenDyslexic.value)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
onMounted(() => {
|
|
23
|
+
applyFont(localStorage.getItem('slidev-font-opendyslexic') === '1')
|
|
24
|
+
})
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<style scoped>
|
|
28
|
+
.font-toggle {
|
|
29
|
+
position: fixed;
|
|
30
|
+
right: 1rem;
|
|
31
|
+
bottom: 1rem;
|
|
32
|
+
z-index: 9999;
|
|
33
|
+
padding: 0.45rem 0.75rem;
|
|
34
|
+
border: 1px solid rgba(35, 55, 99, 0.25);
|
|
35
|
+
border-radius: 999px;
|
|
36
|
+
background: rgba(255, 255, 255, 0.92);
|
|
37
|
+
color: #233763;
|
|
38
|
+
font-size: 0.72rem;
|
|
39
|
+
font-weight: 700;
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import AutoFitText from '../components/AutoFitText.vue'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="portada-layout">
|
|
7
|
+
<img
|
|
8
|
+
class="portada-bg"
|
|
9
|
+
src="/fondos/slide-01-portada.png"
|
|
10
|
+
alt="Fondo portada UNIMINUTO"
|
|
11
|
+
/>
|
|
12
|
+
|
|
13
|
+
<div class="titulo-wrap">
|
|
14
|
+
<AutoFitText
|
|
15
|
+
tag="h1"
|
|
16
|
+
class="portada-titulo"
|
|
17
|
+
:min="34"
|
|
18
|
+
:max="76"
|
|
19
|
+
line-height="1.05"
|
|
20
|
+
>
|
|
21
|
+
<slot name="title">Título de la presentación</slot>
|
|
22
|
+
</AutoFitText>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div class="meta-wrap">
|
|
26
|
+
<AutoFitText
|
|
27
|
+
tag="div"
|
|
28
|
+
class="portada-semana"
|
|
29
|
+
:min="18"
|
|
30
|
+
:max="34"
|
|
31
|
+
line-height="1.05"
|
|
32
|
+
>
|
|
33
|
+
<slot name="week">SEMANA 1</slot>
|
|
34
|
+
</AutoFitText>
|
|
35
|
+
|
|
36
|
+
<AutoFitText
|
|
37
|
+
tag="div"
|
|
38
|
+
class="portada-fecha"
|
|
39
|
+
:min="15"
|
|
40
|
+
:max="28"
|
|
41
|
+
line-height="1.05"
|
|
42
|
+
>
|
|
43
|
+
<slot name="date">MAYO 03 DE 2026</slot>
|
|
44
|
+
</AutoFitText>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<style scoped>
|
|
50
|
+
.portada-layout {
|
|
51
|
+
position: relative;
|
|
52
|
+
width: 100%;
|
|
53
|
+
height: 100%;
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
background: #ffffff;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.portada-bg {
|
|
59
|
+
position: absolute;
|
|
60
|
+
inset: 0;
|
|
61
|
+
width: 100%;
|
|
62
|
+
height: 100%;
|
|
63
|
+
object-fit: cover;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.titulo-wrap {
|
|
67
|
+
position: absolute;
|
|
68
|
+
z-index: 2;
|
|
69
|
+
left: 34%;
|
|
70
|
+
right: 5%;
|
|
71
|
+
top: 46.5%;
|
|
72
|
+
height: 27%;
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
text-align: center;
|
|
77
|
+
padding: 0 0.5rem;
|
|
78
|
+
box-sizing: border-box;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.portada-titulo {
|
|
82
|
+
margin: 0 !important;
|
|
83
|
+
color: #f2b51b;
|
|
84
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
85
|
+
font-weight: 800;
|
|
86
|
+
letter-spacing: -0.03em;
|
|
87
|
+
text-wrap: balance;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.meta-wrap {
|
|
91
|
+
position: absolute;
|
|
92
|
+
z-index: 2;
|
|
93
|
+
right: 19%;
|
|
94
|
+
bottom: 5%;
|
|
95
|
+
width: 30%;
|
|
96
|
+
height: 12%;
|
|
97
|
+
text-align: right;
|
|
98
|
+
display: grid;
|
|
99
|
+
grid-template-rows: 1fr 0.85fr;
|
|
100
|
+
gap: 0.25rem;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.portada-semana {
|
|
104
|
+
margin: 0 !important;
|
|
105
|
+
color: #000000;
|
|
106
|
+
font-family: Georgia, 'Times New Roman', serif;
|
|
107
|
+
font-weight: 700;
|
|
108
|
+
letter-spacing: 0.14em;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.portada-fecha {
|
|
112
|
+
margin: 0 !important;
|
|
113
|
+
color: #000000;
|
|
114
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
115
|
+
font-weight: 800;
|
|
116
|
+
letter-spacing: 0.06em;
|
|
117
|
+
text-transform: uppercase;
|
|
118
|
+
}
|
|
119
|
+
</style>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import AutoFitText from '../components/AutoFitText.vue'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="slide-02-layout">
|
|
7
|
+
<img
|
|
8
|
+
class="slide-bg"
|
|
9
|
+
src="/fondos/slide-02-titulo.png"
|
|
10
|
+
alt="Fondo diapositiva título"
|
|
11
|
+
/>
|
|
12
|
+
|
|
13
|
+
<div class="titulo-wrap">
|
|
14
|
+
<AutoFitText
|
|
15
|
+
tag="h1"
|
|
16
|
+
class="titulo"
|
|
17
|
+
:min="20"
|
|
18
|
+
:max="42"
|
|
19
|
+
line-height="1.05"
|
|
20
|
+
>
|
|
21
|
+
<slot name="title">Título de la presentación</slot>
|
|
22
|
+
</AutoFitText>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
26
|
+
|
|
27
|
+
<style scoped>
|
|
28
|
+
.slide-02-layout {
|
|
29
|
+
position: relative;
|
|
30
|
+
width: 100%;
|
|
31
|
+
height: 100%;
|
|
32
|
+
overflow: hidden;
|
|
33
|
+
background: #ffffff;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.slide-bg {
|
|
37
|
+
position: absolute;
|
|
38
|
+
inset: 0;
|
|
39
|
+
width: 100%;
|
|
40
|
+
height: 100%;
|
|
41
|
+
object-fit: cover;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.titulo-wrap {
|
|
45
|
+
position: absolute;
|
|
46
|
+
z-index: 2;
|
|
47
|
+
left: 33%;
|
|
48
|
+
top: 52%;
|
|
49
|
+
width: 43%;
|
|
50
|
+
height: 7%;
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
text-align: center;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.titulo {
|
|
58
|
+
margin: 0 !important;
|
|
59
|
+
color: #ffffff !important;
|
|
60
|
+
font-family: var(--font-title, 'Merriweather Sans', Arial, sans-serif);
|
|
61
|
+
font-weight: 800;
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import AutoFitText from '../components/AutoFitText.vue'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="slide-layout">
|
|
7
|
+
<img
|
|
8
|
+
class="slide-bg"
|
|
9
|
+
src="/fondos/slide-03-imagen-izquierda.png"
|
|
10
|
+
alt="Fondo diapositiva imagen izquierda"
|
|
11
|
+
/>
|
|
12
|
+
|
|
13
|
+
<div class="image-wrap">
|
|
14
|
+
<slot name="image" />
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div class="title-wrap">
|
|
18
|
+
<AutoFitText tag="h1" class="title" :min="18" :max="34" line-height="1.05">
|
|
19
|
+
<slot name="title">Agrega un título</slot>
|
|
20
|
+
</AutoFitText>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="content-wrap">
|
|
24
|
+
<AutoFitText tag="div" class="content-fit" :min="15" :max="28" line-height="1.25">
|
|
25
|
+
<slot name="content" />
|
|
26
|
+
</AutoFitText>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
|
|
31
|
+
<style scoped>
|
|
32
|
+
.slide-layout {
|
|
33
|
+
position: relative;
|
|
34
|
+
width: 100%;
|
|
35
|
+
height: 100%;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
background: #ffffff;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.slide-bg {
|
|
41
|
+
position: absolute;
|
|
42
|
+
inset: 0;
|
|
43
|
+
width: 100%;
|
|
44
|
+
height: 100%;
|
|
45
|
+
object-fit: cover;
|
|
46
|
+
z-index: 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.image-wrap {
|
|
50
|
+
position: absolute;
|
|
51
|
+
z-index: 2;
|
|
52
|
+
left: 5.5%;
|
|
53
|
+
top: 15%;
|
|
54
|
+
width: 39%;
|
|
55
|
+
height: 78%;
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
overflow: hidden;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.image-wrap :deep(img),
|
|
63
|
+
.image-wrap :deep(video),
|
|
64
|
+
.image-wrap :deep(iframe) {
|
|
65
|
+
width: 100%;
|
|
66
|
+
height: 100%;
|
|
67
|
+
object-fit: cover;
|
|
68
|
+
border: 0;
|
|
69
|
+
display: block;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.title-wrap {
|
|
73
|
+
position: absolute;
|
|
74
|
+
z-index: 2;
|
|
75
|
+
left: 49.5%;
|
|
76
|
+
top: 19.5%;
|
|
77
|
+
width: 48%;
|
|
78
|
+
height: 6.8%;
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
justify-content: center;
|
|
82
|
+
text-align: center;
|
|
83
|
+
padding: 0 1rem;
|
|
84
|
+
box-sizing: border-box;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.title {
|
|
88
|
+
margin: 0 !important;
|
|
89
|
+
color: #ffffff !important;
|
|
90
|
+
font-family: var(--font-title, 'Merriweather Sans', Arial, sans-serif);
|
|
91
|
+
font-weight: 800;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.content-wrap {
|
|
95
|
+
position: absolute;
|
|
96
|
+
z-index: 2;
|
|
97
|
+
left: 50.5%;
|
|
98
|
+
top: 30%;
|
|
99
|
+
width: 39%;
|
|
100
|
+
height: 48%;
|
|
101
|
+
color: #233763 !important;
|
|
102
|
+
font-family: var(--font-body, 'Atkinson Hyperlegible', Arial, sans-serif);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.content-fit :deep(*) { color: #233763 !important; }
|
|
106
|
+
.content-fit :deep(p) { margin: 0 0 0.7rem 0; }
|
|
107
|
+
.content-fit :deep(ul) { list-style-type: disc !important; list-style-position: outside !important; margin: 0; padding-left: 1.6rem; }
|
|
108
|
+
.content-fit :deep(li) { display: list-item !important; margin-bottom: 0.5rem; }
|
|
109
|
+
.content-fit :deep(li::marker) { color: #233763 !important; font-size: 1em; }
|
|
110
|
+
</style>
|