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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +480 -0
  3. package/bin/create-openclass-uniminuto.mjs +142 -0
  4. package/package.json +39 -0
  5. package/template/.github/workflows/deploy.yml +64 -0
  6. package/template/README.md +326 -0
  7. package/template/config/openclass.config.iot-desde-openclass-iot.json +77 -0
  8. package/template/config/openclass.config.iot-ejemplo.json +81 -0
  9. package/template/demo_semana1.md +11 -0
  10. package/template/demo_semana2.md +11 -0
  11. package/template/demo_semana3.md +11 -0
  12. package/template/demo_semana4.md +11 -0
  13. package/template/demo_semana5.md +11 -0
  14. package/template/demo_semana6.md +11 -0
  15. package/template/demo_semana7.md +11 -0
  16. package/template/demo_semana8.md +11 -0
  17. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana1.md +12 -0
  18. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana2.md +12 -0
  19. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana3.md +12 -0
  20. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana4.md +12 -0
  21. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana5.md +12 -0
  22. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana6.md +12 -0
  23. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana7.md +12 -0
  24. package/template/ejemplos/iot-semanas-1-a-3/raiz/iot_semana8.md +12 -0
  25. package/template/ejemplos/iot-semanas-1-a-3/raiz/slides.md +154 -0
  26. package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana1.md +846 -0
  27. package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana2.md +1040 -0
  28. package/template/ejemplos/iot-semanas-1-a-3/semanas/iot_semana3.md +1071 -0
  29. package/template/openclass.config.json +79 -0
  30. package/template/package-lock.json +11568 -0
  31. package/template/package.json +61 -0
  32. package/template/plantillas/launcher.md +11 -0
  33. package/template/plantillas/semana.md +177 -0
  34. package/template/public/descargas/.gitkeep +0 -0
  35. package/template/public/favicon.png +0 -0
  36. package/template/public/fondos/slide-01-portada.png +0 -0
  37. package/template/public/fondos/slide-02-titulo.png +0 -0
  38. package/template/public/fondos/slide-03-imagen-izquierda.png +0 -0
  39. package/template/public/fondos/slide-04-imagen-derecha.png +0 -0
  40. package/template/public/fondos/slide-05-template.png +0 -0
  41. package/template/public/fondos/slide-06-cierre.png +0 -0
  42. package/template/public/imagenes/.gitkeep +0 -0
  43. package/template/public/videos/.gitkeep +0 -0
  44. package/template/scripts/build-incremental.mjs +33 -0
  45. package/template/scripts/build-site.mjs +33 -0
  46. package/template/scripts/decks.mjs +29 -0
  47. package/template/scripts/dev-all.mjs +37 -0
  48. package/template/scripts/export-downloads.mjs +53 -0
  49. package/template/scripts/export-incremental.mjs +49 -0
  50. package/template/scripts/generar-desde-config.mjs +279 -0
  51. package/template/scripts/nuevo-curso.mjs +104 -0
  52. package/template/scripts/preparar-github-pages.mjs +52 -0
  53. package/template/scripts/publicar.mjs +36 -0
  54. package/template/scripts/semana.mjs +122 -0
  55. package/template/scripts/zip-template.mjs +70 -0
  56. package/template/semanas/demo_semana1.md +177 -0
  57. package/template/semanas/demo_semana2.md +177 -0
  58. package/template/semanas/demo_semana3.md +177 -0
  59. package/template/semanas/demo_semana4.md +177 -0
  60. package/template/semanas/demo_semana5.md +177 -0
  61. package/template/semanas/demo_semana6.md +177 -0
  62. package/template/semanas/demo_semana7.md +177 -0
  63. package/template/semanas/demo_semana8.md +177 -0
  64. package/template/setup/shiki.ts +10 -0
  65. package/template/slides.md +65 -0
  66. package/template/snippets/external.ts +12 -0
  67. package/template/theme/uniminuto/README-AutoFit.md +28 -0
  68. package/template/theme/uniminuto/components/AutoFitText.vue +159 -0
  69. package/template/theme/uniminuto/components/Counter.vue +37 -0
  70. package/template/theme/uniminuto/components/FontToggle.vue +42 -0
  71. package/template/theme/uniminuto/layouts/slide-01-portada.vue +119 -0
  72. package/template/theme/uniminuto/layouts/slide-02-titulo.vue +63 -0
  73. package/template/theme/uniminuto/layouts/slide-03-imagen-izquierda.vue +110 -0
  74. package/template/theme/uniminuto/layouts/slide-04-imagen-derecha.vue +110 -0
  75. package/template/theme/uniminuto/layouts/slide-05-titulo-superior-texto-derecha.vue +104 -0
  76. package/template/theme/uniminuto/layouts/slide-06-titulo-superior-texto-izquierda.vue +109 -0
  77. package/template/theme/uniminuto/layouts/slide-07-multimedia-con-titulo.vue +87 -0
  78. package/template/theme/uniminuto/layouts/slide-08-titulo-texto.vue +78 -0
  79. package/template/theme/uniminuto/layouts/slide-09-objetivos.vue +77 -0
  80. package/template/theme/uniminuto/layouts/slide-10-titulo-dos-columnas.vue +89 -0
  81. package/template/theme/uniminuto/layouts/slide-11-dos-titulos-dos-columnas.vue +98 -0
  82. package/template/theme/uniminuto/layouts/slide-12-cierre.vue +27 -0
  83. package/template/theme/uniminuto/layouts/slide-codigo.vue +133 -0
  84. package/template/theme/uniminuto/package.json +13 -0
  85. package/template/theme/uniminuto/styles/base.css +109 -0
  86. 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>