@ecored-sena/base-kit 0.0.1
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/README.md +1 -0
- package/package.json +49 -0
- package/plugin/components/AccordionRED.vue +78 -0
- package/plugin/components/AcordionA.vue +78 -0
- package/plugin/components/Audio.vue +20 -0
- package/plugin/components/BannerHero.vue +104 -0
- package/plugin/components/CarouselCard.vue +70 -0
- package/plugin/components/CarouselRED.vue +65 -0
- package/plugin/components/Complementario.vue +81 -0
- package/plugin/components/Creditos.vue +101 -0
- package/plugin/components/Dialogo.vue +30 -0
- package/plugin/components/DialogoActividad.vue +274 -0
- package/plugin/components/DialogoBurbuja.vue +46 -0
- package/plugin/components/DialogoChat.vue +88 -0
- package/plugin/components/Footer.vue +42 -0
- package/plugin/components/GlobalComponents.js +39 -0
- package/plugin/components/Glosario.vue +100 -0
- package/plugin/components/ImagenInfografica.vue +100 -0
- package/plugin/components/ImagenInfograficaB.vue +68 -0
- package/plugin/components/Inicio.vue +128 -0
- package/plugin/components/LineaTiempoA.vue +30 -0
- package/plugin/components/LineaTiempoB.vue +36 -0
- package/plugin/components/LineaTiempoC.vue +95 -0
- package/plugin/components/LineaTiempoD.vue +51 -0
- package/plugin/components/LineaTiempoE.vue +25 -0
- package/plugin/components/ModalA.vue +22 -0
- package/plugin/components/PasosA.vue +59 -0
- package/plugin/components/PasosB.vue +90 -0
- package/plugin/components/Referencias.vue +45 -0
- package/plugin/components/ScrollHorizontal.vue +105 -0
- package/plugin/components/Separador.vue +12 -0
- package/plugin/components/SlyderA.vue +65 -0
- package/plugin/components/SlyderB.vue +48 -0
- package/plugin/components/SlyderC.vue +53 -0
- package/plugin/components/SlyderD.vue +50 -0
- package/plugin/components/SlyderE.vue +58 -0
- package/plugin/components/SlyderF.vue +141 -0
- package/plugin/components/TabsA.vue +44 -0
- package/plugin/components/TabsB.vue +40 -0
- package/plugin/components/TabsC.vue +39 -0
- package/plugin/components/TarjetaAudio.vue +65 -0
- package/plugin/components/TimeLineRED.vue +51 -0
- package/plugin/components/actividad/ActividadController.vue +34 -0
- package/plugin/components/actividad/actividadCompletar/ActividadCompletar.vue +283 -0
- package/plugin/components/actividad/actividadCompletar/ActividadCompletarFooter.vue +63 -0
- package/plugin/components/actividad/actividadCompletar/ActividadParrafo.vue +218 -0
- package/plugin/components/actividad/actividadCompletar/ActividadResultados.vue +215 -0
- package/plugin/components/actividad/actividadCuestionario/Actividad.vue +222 -0
- package/plugin/components/actividad/actividadCuestionario/ActividadBarraAvance.vue +116 -0
- package/plugin/components/actividad/actividadCuestionario/ActividadPregunta.vue +146 -0
- package/plugin/components/actividad/actividadCuestionario/ActividadResultados.vue +215 -0
- package/plugin/components/audioMixins.js +73 -0
- package/plugin/components/componentSlotMixins.js +87 -0
- package/plugin/components/dialogoMixins.js +28 -0
- package/plugin/components/globalMixins.js +11 -0
- package/plugin/components/plantilla/Accesibilidad.vue +101 -0
- package/plugin/components/plantilla/AsideMenu.vue +242 -0
- package/plugin/components/plantilla/BannerInterno.vue +66 -0
- package/plugin/components/plantilla/BannerPrincipal.vue +104 -0
- package/plugin/components/plantilla/BarraAvance.vue +379 -0
- package/plugin/components/plantilla/Curso.vue +12 -0
- package/plugin/components/plantilla/Footer.vue +42 -0
- package/plugin/components/plantilla/Header.vue +152 -0
- package/plugin/components/plantilla/ScrollHorizontal.vue +105 -0
- package/plugin/components/plantillaMixins.js +34 -0
- package/plugin/components/slyderMixins.js +18 -0
- package/plugin/plugin.js +49 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.horizontal-scroll__wrapper(ref="hContainer")
|
|
3
|
+
.horizontal-scroll(
|
|
4
|
+
:class="[{'horizontal-scroll--item-fw':itemFullWidth},{'row':row}]"
|
|
5
|
+
:style="[{transform: `translate(${scrollVal}px,0px)`}]"
|
|
6
|
+
)
|
|
7
|
+
slot
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script>
|
|
11
|
+
export default {
|
|
12
|
+
name: 'ScrollHorizontal',
|
|
13
|
+
props: {
|
|
14
|
+
selectedId: {
|
|
15
|
+
type: String,
|
|
16
|
+
default: '',
|
|
17
|
+
},
|
|
18
|
+
itemFullWidth: {
|
|
19
|
+
type: Boolean,
|
|
20
|
+
default: false,
|
|
21
|
+
},
|
|
22
|
+
row: {
|
|
23
|
+
type: Boolean,
|
|
24
|
+
default: false,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
data() {
|
|
28
|
+
return {
|
|
29
|
+
scrollVal: 0,
|
|
30
|
+
ids: [],
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
watch: {
|
|
34
|
+
selectedId(newVal) {
|
|
35
|
+
if (newVal.length) {
|
|
36
|
+
this.scroll()
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
mounted() {
|
|
41
|
+
this.getCords()
|
|
42
|
+
this.scroll()
|
|
43
|
+
window.addEventListener('resize', this.scroll)
|
|
44
|
+
},
|
|
45
|
+
updated() {
|
|
46
|
+
this.getCords()
|
|
47
|
+
},
|
|
48
|
+
beforeDestroy() {
|
|
49
|
+
window.removeEventListener('resize', this.scroll)
|
|
50
|
+
},
|
|
51
|
+
methods: {
|
|
52
|
+
scroll() {
|
|
53
|
+
const selectedElementId = this.ids.find(
|
|
54
|
+
item => item.id === this.selectedId,
|
|
55
|
+
)?.id
|
|
56
|
+
const selectedElement = document.getElementById(selectedElementId)
|
|
57
|
+
if (
|
|
58
|
+
!Object.keys(this.$slots.default).length ||
|
|
59
|
+
!this.selectedId.length ||
|
|
60
|
+
selectedElement === null
|
|
61
|
+
)
|
|
62
|
+
return
|
|
63
|
+
const container = this.$refs.hContainer
|
|
64
|
+
const scrollContentTotalWidth =
|
|
65
|
+
selectedElement.offsetWidth * this.ids.length
|
|
66
|
+
let newScrollVal = selectedElement.offsetLeft
|
|
67
|
+
const elementsFitInContainer =
|
|
68
|
+
container.offsetWidth / selectedElement.offsetWidth
|
|
69
|
+
if (
|
|
70
|
+
elementsFitInContainer > 1 &&
|
|
71
|
+
scrollContentTotalWidth - newScrollVal < container.offsetWidth
|
|
72
|
+
) {
|
|
73
|
+
newScrollVal = scrollContentTotalWidth - container.offsetWidth
|
|
74
|
+
}
|
|
75
|
+
this.scrollVal = this.ids.length === 1 ? 0 : -newScrollVal
|
|
76
|
+
},
|
|
77
|
+
getCords() {
|
|
78
|
+
if (this.$slots.default) {
|
|
79
|
+
this.ids = this.$slots.default.map(element => ({
|
|
80
|
+
id: element.elm.id,
|
|
81
|
+
key: element.key,
|
|
82
|
+
}))
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
</script>
|
|
88
|
+
|
|
89
|
+
<style lang="sass" scoped>
|
|
90
|
+
.horizontal-scroll__wrapper
|
|
91
|
+
overflow: hidden
|
|
92
|
+
.horizontal-scroll
|
|
93
|
+
display: flex
|
|
94
|
+
transition: transform 0.5s ease-in-out
|
|
95
|
+
align-items: center
|
|
96
|
+
flex-wrap: nowrap
|
|
97
|
+
&:not(.row)
|
|
98
|
+
width: 100%
|
|
99
|
+
&--item-fw
|
|
100
|
+
& ::v-deep > div
|
|
101
|
+
flex-grow: 0
|
|
102
|
+
flex-shrink: 0
|
|
103
|
+
width: 100%
|
|
104
|
+
margin: 0 !important
|
|
105
|
+
</style>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.slyder-a
|
|
3
|
+
.slyder-a__tipo-a(v-if="tipo === 'a'")
|
|
4
|
+
.slyder-a__btn--sigt(
|
|
5
|
+
v-if="navObj.next"
|
|
6
|
+
@click="selected = navObj.next"
|
|
7
|
+
@mouseover="mostrarIndicador = false"
|
|
8
|
+
)
|
|
9
|
+
.indicador__container.indicador--left(v-if="mostrarIndicador")
|
|
10
|
+
.indicador--click
|
|
11
|
+
.slyder-a__btn--atrs(v-if="navObj.back" @click="selected = navObj.back")
|
|
12
|
+
.slyder-a__bullets
|
|
13
|
+
.slyder-a__bullets__item(
|
|
14
|
+
v-for="bullet in elements"
|
|
15
|
+
:key="'sl-blt-key-'+bullet.id"
|
|
16
|
+
:class="{'slyder-a__bullets__item--active' : selected === bullet.id}"
|
|
17
|
+
@click="selected = bullet.id"
|
|
18
|
+
)
|
|
19
|
+
ScrollHorizontal(v-if="elements.length && rendered" :selectedId="'sl-' + selected" item-full-width)
|
|
20
|
+
.slyder-a__item(
|
|
21
|
+
v-for="item in elements"
|
|
22
|
+
:key="'sl-key-'+item.id"
|
|
23
|
+
:id="'sl-'+item.id"
|
|
24
|
+
v-child="item.elm"
|
|
25
|
+
)
|
|
26
|
+
.slyder-a__tipo-b.mt-3(v-if="tipo === 'b'")
|
|
27
|
+
.slyder-a__btn--atrs(:class="{'hide' : !navObj.back}" @click="selected = navObj.back")
|
|
28
|
+
|
|
29
|
+
.slyder-a__bullets
|
|
30
|
+
.slyder-a__bullets__item(
|
|
31
|
+
v-for="bullet in elements"
|
|
32
|
+
:key="'sl-blt-key-'+bullet.id"
|
|
33
|
+
:class="{'slyder-a__bullets__item--active' : selected === bullet.id}"
|
|
34
|
+
@click="selected = bullet.id"
|
|
35
|
+
)
|
|
36
|
+
.slyder-a__btn--sigt(
|
|
37
|
+
:class="{'hide' : !navObj.next}"
|
|
38
|
+
@click="selected = navObj.next"
|
|
39
|
+
@mouseover="mostrarIndicador = false"
|
|
40
|
+
)
|
|
41
|
+
.indicador__container.indicador--left(v-if="mostrarIndicador")
|
|
42
|
+
.indicador--click
|
|
43
|
+
.hidden-slot
|
|
44
|
+
slot
|
|
45
|
+
</template>
|
|
46
|
+
|
|
47
|
+
<script>
|
|
48
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
49
|
+
export default {
|
|
50
|
+
name: 'SlyderA',
|
|
51
|
+
mixins: [componentSlotMixins],
|
|
52
|
+
props: {
|
|
53
|
+
tipo: {
|
|
54
|
+
type: String,
|
|
55
|
+
default: 'a',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
data: () => ({
|
|
59
|
+
mostrarIndicador: true,
|
|
60
|
+
secuencial: true,
|
|
61
|
+
}),
|
|
62
|
+
}
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.slyder-b
|
|
3
|
+
ScrollHorizontal(v-if="datos.length" :selectedId="selected" item-full-width)
|
|
4
|
+
.slyder-b__slyde(
|
|
5
|
+
v-for="(item,index) in datos"
|
|
6
|
+
:key="'key-'+getId(index)"
|
|
7
|
+
:id="getId(index)"
|
|
8
|
+
)
|
|
9
|
+
.row
|
|
10
|
+
.col-lg-8.order-lg-2.mb-4.mb-lg-0
|
|
11
|
+
figure.slyder-b__img
|
|
12
|
+
img(:src='item.imagen', :alt='item.leyendaImagen')
|
|
13
|
+
figcaption(v-if="item.leyendaImagen" v-html="item.leyendaImagen")
|
|
14
|
+
|
|
15
|
+
.col-lg-4.order-lg-1
|
|
16
|
+
h3(v-if="item.hasOwnProperty('titulo')" v-html="item.titulo")
|
|
17
|
+
p.mb-3(v-html="item.texto")
|
|
18
|
+
.slyder__action
|
|
19
|
+
.slyder__pagination {{index+1}}/{{datos.length}}
|
|
20
|
+
a.slyder__btn(v-if="index -1 >= 0" @click="selected = getId(index -1)")
|
|
21
|
+
i.fas.fa-angle-left
|
|
22
|
+
a.slyder__btn(
|
|
23
|
+
v-if="index != datos.length -1"
|
|
24
|
+
@click="selected = getId(index +1)"
|
|
25
|
+
@mouseover="mostrarIndicador = false"
|
|
26
|
+
)
|
|
27
|
+
i.fas.fa-angle-right
|
|
28
|
+
.indicador__container(v-if="mostrarIndicador && index === 0")
|
|
29
|
+
.indicador--click.indicador--sm
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script>
|
|
33
|
+
import ScrollHorizontal from './ScrollHorizontal'
|
|
34
|
+
import slyderMixins from './slyderMixins'
|
|
35
|
+
export default {
|
|
36
|
+
name: 'SlyderB',
|
|
37
|
+
components: { ScrollHorizontal },
|
|
38
|
+
mixins: [slyderMixins],
|
|
39
|
+
data: () => ({
|
|
40
|
+
mostrarIndicador: true,
|
|
41
|
+
}),
|
|
42
|
+
mounted() {
|
|
43
|
+
this.selected = this.getId(0)
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.slyder-c
|
|
3
|
+
ScrollHorizontal(v-if="datos.length" :selectedId="selected" item-full-width)
|
|
4
|
+
.slyder-c__slyde(
|
|
5
|
+
v-for="(item,index) in datos"
|
|
6
|
+
:key="'key-'+getId(index)"
|
|
7
|
+
:id="getId(index)"
|
|
8
|
+
)
|
|
9
|
+
.slyder-c__imagen.mb-4
|
|
10
|
+
figure.slyder-c__img
|
|
11
|
+
img(:src='item.imagen', :alt='item.leyendaImagen')
|
|
12
|
+
figcaption(v-if="item.leyendaImagen") {{item.leyendaImagen}}
|
|
13
|
+
.slyder-c__content
|
|
14
|
+
.slyder-c__content__header.mb-4
|
|
15
|
+
.row
|
|
16
|
+
.col
|
|
17
|
+
h3.mb-2.mb-md-0(v-if="item.hasOwnProperty('titulo')" v-html="item.titulo")
|
|
18
|
+
.col-auto
|
|
19
|
+
.slyder__action
|
|
20
|
+
.slyder__pagination {{index+1}}/{{datos.length}}
|
|
21
|
+
a.slyder__btn(v-if="index -1 >= 0" @click="selected = getId(index -1)")
|
|
22
|
+
i.fas.fa-angle-left
|
|
23
|
+
a.slyder__btn(
|
|
24
|
+
v-if="index != datos.length -1"
|
|
25
|
+
@click="selected = getId(index +1)"
|
|
26
|
+
@mouseover="mostrarIndicador = false"
|
|
27
|
+
)
|
|
28
|
+
i.fas.fa-angle-right
|
|
29
|
+
.indicador__container.indicador--left(v-if="mostrarIndicador && index === 0")
|
|
30
|
+
.indicador--click.indicador--sm
|
|
31
|
+
|
|
32
|
+
.slyder-c__content__body
|
|
33
|
+
p.mb-3(v-html="item.texto")
|
|
34
|
+
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<script>
|
|
38
|
+
import slyderMixins from './slyderMixins'
|
|
39
|
+
import ScrollHorizontal from './ScrollHorizontal'
|
|
40
|
+
export default {
|
|
41
|
+
name: 'SlyderC',
|
|
42
|
+
components: { ScrollHorizontal },
|
|
43
|
+
mixins: [slyderMixins],
|
|
44
|
+
data: () => ({
|
|
45
|
+
mostrarIndicador: true,
|
|
46
|
+
}),
|
|
47
|
+
mounted() {
|
|
48
|
+
this.selected = this.getId(0)
|
|
49
|
+
},
|
|
50
|
+
}
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.slyder-d
|
|
3
|
+
ScrollHorizontal(v-if="datos.length" :selectedId="selected" item-full-width)
|
|
4
|
+
.slyder-d__slyde(
|
|
5
|
+
v-for="(item,index) in datos"
|
|
6
|
+
:key="'key-'+getId(index)"
|
|
7
|
+
:id="getId(index)"
|
|
8
|
+
)
|
|
9
|
+
.slyder-d__imagen.mb-4
|
|
10
|
+
figure.slyder-d__img
|
|
11
|
+
img(:src='item.imagen', :alt='item.leyendaImagen')
|
|
12
|
+
|
|
13
|
+
.slyder-d__content
|
|
14
|
+
.row
|
|
15
|
+
.col-md-8.col-lg-6
|
|
16
|
+
.slyder-d__content__card.p-4
|
|
17
|
+
h3(v-if="item.hasOwnProperty('titulo')" v-html="item.titulo")
|
|
18
|
+
p.mb-3(v-html="item.texto")
|
|
19
|
+
.slyder__action
|
|
20
|
+
.slyder__pagination {{index+1}}/{{datos.length}}
|
|
21
|
+
a.slyder__btn(v-if="index -1 >= 0" @click="selected = getId(index -1)")
|
|
22
|
+
i.fas.fa-angle-left
|
|
23
|
+
a.slyder__btn(
|
|
24
|
+
v-if="index != datos.length -1"
|
|
25
|
+
@click="selected = getId(index +1)"
|
|
26
|
+
@mouseover="mostrarIndicador = false"
|
|
27
|
+
)
|
|
28
|
+
i.fas.fa-angle-right
|
|
29
|
+
.indicador__container(v-if="mostrarIndicador && index === 0")
|
|
30
|
+
.indicador--click.indicador--sm
|
|
31
|
+
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script>
|
|
35
|
+
import slyderMixins from './slyderMixins'
|
|
36
|
+
import ScrollHorizontal from './ScrollHorizontal'
|
|
37
|
+
export default {
|
|
38
|
+
name: 'SlyderD',
|
|
39
|
+
components: { ScrollHorizontal },
|
|
40
|
+
mixins: [slyderMixins],
|
|
41
|
+
data: () => ({
|
|
42
|
+
mostrarIndicador: true,
|
|
43
|
+
}),
|
|
44
|
+
mounted() {
|
|
45
|
+
this.selected = this.getId(0)
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.slyder-e
|
|
3
|
+
ScrollHorizontal(v-if="elements.length && rendered" :selectedId="'sl-' + selected" item-full-width)
|
|
4
|
+
.slyder-e__slyde(
|
|
5
|
+
v-for="(item, index) in elements"
|
|
6
|
+
:key="'sl-key-'+item.id"
|
|
7
|
+
:id="'sl-'+item.id"
|
|
8
|
+
)
|
|
9
|
+
.slyder-e__content(
|
|
10
|
+
v-child="item.elm"
|
|
11
|
+
)
|
|
12
|
+
.slyder-e__actions.d-flex.p-2(
|
|
13
|
+
:class="[{'justify-content-center' : indicadores === 'centro'},{'justify-content-end' : indicadores === 'derecha'}]"
|
|
14
|
+
)
|
|
15
|
+
.slyder__action
|
|
16
|
+
.slyder__pagination {{index+1}}/{{elements.length}}
|
|
17
|
+
a.slyder__btn(
|
|
18
|
+
v-if="navObj.back"
|
|
19
|
+
@click="selected = navObj.back"
|
|
20
|
+
@mouseover="mostrarIndicador = false"
|
|
21
|
+
)
|
|
22
|
+
i.fas.fa-angle-left
|
|
23
|
+
a.slyder__btn(
|
|
24
|
+
v-if="navObj.next"
|
|
25
|
+
@click="selected = navObj.next"
|
|
26
|
+
@mouseover="mostrarIndicador = false"
|
|
27
|
+
)
|
|
28
|
+
i.fas.fa-angle-right
|
|
29
|
+
.indicador__container.indicador--left(v-if="mostrarIndicador && index === 0")
|
|
30
|
+
.indicador--click.indicador--sm
|
|
31
|
+
|
|
32
|
+
.hidden-slot
|
|
33
|
+
slot
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<script>
|
|
37
|
+
import ScrollHorizontal from './ScrollHorizontal'
|
|
38
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
39
|
+
export default {
|
|
40
|
+
name: 'SlyderE',
|
|
41
|
+
components: { ScrollHorizontal },
|
|
42
|
+
mixins: [componentSlotMixins],
|
|
43
|
+
props: {
|
|
44
|
+
indicadores: {
|
|
45
|
+
type: String,
|
|
46
|
+
default: 'izquierda',
|
|
47
|
+
validator: value =>
|
|
48
|
+
['izquierda', 'centro', 'derecha'].indexOf(value) !== -1,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
data: () => ({
|
|
52
|
+
mostrarIndicador: true,
|
|
53
|
+
secuencial: true,
|
|
54
|
+
}),
|
|
55
|
+
}
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
|
|
3
|
+
.slyder-f
|
|
4
|
+
.slyder-f__btn.pe-3(
|
|
5
|
+
@click="clickAnterior"
|
|
6
|
+
:class="{ 'is-disabled': isFirst }"
|
|
7
|
+
)
|
|
8
|
+
i.fas.fa-chevron-left
|
|
9
|
+
|
|
10
|
+
.slyder-f__main(:id="'slyder-f-' + mainId")
|
|
11
|
+
ScrollHorizontal(
|
|
12
|
+
v-if="elements.length && rendered"
|
|
13
|
+
:selectedId="'sl-' + selected"
|
|
14
|
+
row
|
|
15
|
+
)
|
|
16
|
+
.slyder-f__slyde(
|
|
17
|
+
v-for="(item, index) in elements"
|
|
18
|
+
:key="'sl-key-'+item.id"
|
|
19
|
+
:id="'sl-'+item.id"
|
|
20
|
+
:class="columnas"
|
|
21
|
+
v-child="item.elm"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
.slyder-f__btn.ps-3(
|
|
25
|
+
@click="clickSiguiente"
|
|
26
|
+
:class="{ 'is-disabled': isLast }"
|
|
27
|
+
)
|
|
28
|
+
i.fas.fa-chevron-right
|
|
29
|
+
|
|
30
|
+
.hidden-slot
|
|
31
|
+
slot
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script>
|
|
35
|
+
import ScrollHorizontal from './ScrollHorizontal'
|
|
36
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
37
|
+
import slyderMixins from './slyderMixins'
|
|
38
|
+
export default {
|
|
39
|
+
name: 'SlyderF',
|
|
40
|
+
components: { ScrollHorizontal },
|
|
41
|
+
mixins: [componentSlotMixins, slyderMixins],
|
|
42
|
+
props: {
|
|
43
|
+
columnas: {
|
|
44
|
+
type: String,
|
|
45
|
+
default: '',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
computed: {
|
|
49
|
+
isFirst() {
|
|
50
|
+
if (!this.elements.length) return true
|
|
51
|
+
return this.selected === this.elements[0].id
|
|
52
|
+
},
|
|
53
|
+
isLast() {
|
|
54
|
+
if (!this.elements.length) return true
|
|
55
|
+
//const visibleCount = this.getVisibleCardsCount()
|
|
56
|
+
const visibles = this.getVisibleSlides()
|
|
57
|
+
console.log('visibles', visibles)
|
|
58
|
+
|
|
59
|
+
const ids = this.elements.map(e => e.id)
|
|
60
|
+
const idx = ids.indexOf(this.selected)
|
|
61
|
+
return idx >= ids.length - visibles
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
methods: {
|
|
65
|
+
clickAnterior() {
|
|
66
|
+
const ids = this.elements.map(element => element.id)
|
|
67
|
+
const idxOfSelected = ids.indexOf(this.selected)
|
|
68
|
+
if (idxOfSelected > 0) {
|
|
69
|
+
this.selected = ids[idxOfSelected - 1]
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
clickSiguiente() {
|
|
73
|
+
if (this.isLast) return
|
|
74
|
+
const ids = this.elements.map(e => e.id)
|
|
75
|
+
const idx = ids.indexOf(this.selected)
|
|
76
|
+
if (idx < ids.length - 1) {
|
|
77
|
+
this.selected = ids[idx + 1]
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
getVisibleCardsCount() {
|
|
81
|
+
const width = window.innerWidth
|
|
82
|
+
// Simula Bootstrap: xl ≥ 1200px, lg ≥ 992px
|
|
83
|
+
if (width >= 1200) return 3 // col-xl-3
|
|
84
|
+
if (width >= 992) return 2 // col-lg-4
|
|
85
|
+
if (width >= 768) return 2 // supongamos col-md-6
|
|
86
|
+
return 1 // móviles
|
|
87
|
+
},
|
|
88
|
+
getVisibleSlides() {
|
|
89
|
+
const clases = this.columnas.split(' ')
|
|
90
|
+
let cols = 12 // valor por defecto
|
|
91
|
+
|
|
92
|
+
// Definir breakpoints de Bootstrap
|
|
93
|
+
const width = window.innerWidth
|
|
94
|
+
let claseActiva = null
|
|
95
|
+
|
|
96
|
+
// Buscar la clase más específica según el ancho
|
|
97
|
+
if (width >= 1200) {
|
|
98
|
+
claseActiva = clases.find(c => c.startsWith('col-xl-'))
|
|
99
|
+
}
|
|
100
|
+
if (!claseActiva && width >= 992) {
|
|
101
|
+
claseActiva = clases.find(c => c.startsWith('col-lg-'))
|
|
102
|
+
}
|
|
103
|
+
if (!claseActiva && width >= 768) {
|
|
104
|
+
claseActiva = clases.find(c => c.startsWith('col-md-'))
|
|
105
|
+
}
|
|
106
|
+
if (!claseActiva && width >= 576) {
|
|
107
|
+
claseActiva = clases.find(c => c.startsWith('col-sm-'))
|
|
108
|
+
}
|
|
109
|
+
if (!claseActiva) {
|
|
110
|
+
claseActiva = clases.find(
|
|
111
|
+
c => c.startsWith('col-') && !c.match(/col-(sm|md|lg|xl)-/),
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Extraer el número de columnas de la clase activa
|
|
116
|
+
if (claseActiva) {
|
|
117
|
+
const match = claseActiva.match(/col(?:-(?:sm|md|lg|xl))?-(\d+)/)
|
|
118
|
+
if (match) {
|
|
119
|
+
cols = parseInt(match[1])
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Calcular cuántos slides caben
|
|
124
|
+
return Math.floor(12 / cols)
|
|
125
|
+
},
|
|
126
|
+
mounted() {
|
|
127
|
+
if (this.elements.length && !this.selected) {
|
|
128
|
+
this.selected = this.elements[0].id
|
|
129
|
+
}
|
|
130
|
+
// Opcional: recalcular al cambiar el tamaño de pantalla
|
|
131
|
+
window.addEventListener('resize', this.$forceUpdate)
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
</script>
|
|
136
|
+
|
|
137
|
+
<style lang="sass">
|
|
138
|
+
.slyder-f__btn.is-disabled
|
|
139
|
+
opacity: 0.1
|
|
140
|
+
pointer-events: none
|
|
141
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.tabs-a
|
|
3
|
+
.row
|
|
4
|
+
.col-lg-4.col-xl-3
|
|
5
|
+
.row
|
|
6
|
+
.col-sm-6.col-lg-12.mb-3(
|
|
7
|
+
v-for="(elm,index) of elements"
|
|
8
|
+
:key="'tabs-menu-'+elm.id"
|
|
9
|
+
)
|
|
10
|
+
button.tabs-a__tab(
|
|
11
|
+
:class="{'tabs-a__tab__selected': selected === elm.id}"
|
|
12
|
+
@click="selected = elm.id"
|
|
13
|
+
@mouseover="mostrarIndicador = mostrarIndicador && index >= 1 ? false : mostrarIndicador"
|
|
14
|
+
)
|
|
15
|
+
.tabs-a__tab__text(v-html="elm.titulo")
|
|
16
|
+
.indicador__container(v-if="mostrarIndicador && index === 1")
|
|
17
|
+
.indicador--click
|
|
18
|
+
|
|
19
|
+
.col-lg-8.col-xl-9
|
|
20
|
+
.tabs-a__content-item(
|
|
21
|
+
v-for="elm of elements"
|
|
22
|
+
:key="'tabs-a-content-'+elm.id"
|
|
23
|
+
v-show="selected === elm.id"
|
|
24
|
+
:class="{'tabs-a__content-item--active' : selected === elm.id}"
|
|
25
|
+
v-child="elm.elm"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
.hidden-slot
|
|
29
|
+
slot
|
|
30
|
+
|
|
31
|
+
</template>
|
|
32
|
+
|
|
33
|
+
<script>
|
|
34
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
35
|
+
export default {
|
|
36
|
+
name: 'TabsA',
|
|
37
|
+
mixins: [componentSlotMixins],
|
|
38
|
+
data: () => ({
|
|
39
|
+
mostrarIndicador: true,
|
|
40
|
+
}),
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.tabs-b
|
|
3
|
+
.tabs-b__header.row.m-0
|
|
4
|
+
.col-6.col-sm-4.col-lg.tabs-b__tab(
|
|
5
|
+
v-for="(elm,index) of elements"
|
|
6
|
+
:key="'tabs-b-menu-'+elm.id"
|
|
7
|
+
:class="{'tabs-b__tab--active' : selected === elm.id}"
|
|
8
|
+
@click="selected = elm.id"
|
|
9
|
+
@mouseover="mostrarIndicador = mostrarIndicador && index >= 1 ? false : mostrarIndicador"
|
|
10
|
+
)
|
|
11
|
+
.indicador__container(v-if="mostrarIndicador && index === 1")
|
|
12
|
+
.indicador--click
|
|
13
|
+
.tabs-b__tab__icon(v-if="elm.icono")
|
|
14
|
+
img(:src="elm.icono")
|
|
15
|
+
.tabs-b__tab__title
|
|
16
|
+
span(v-html="elm.titulo")
|
|
17
|
+
|
|
18
|
+
.tabs-b__content-item(
|
|
19
|
+
v-for="elm of elements"
|
|
20
|
+
:key="'tabs-content-'+elm.id"
|
|
21
|
+
v-show="selected === elm.id"
|
|
22
|
+
v-child="elm.elm"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
.hidden-slot
|
|
26
|
+
slot
|
|
27
|
+
</template>
|
|
28
|
+
|
|
29
|
+
<script>
|
|
30
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
31
|
+
export default {
|
|
32
|
+
name: 'TabsB',
|
|
33
|
+
mixins: [componentSlotMixins],
|
|
34
|
+
data: () => ({
|
|
35
|
+
mostrarIndicador: true,
|
|
36
|
+
}),
|
|
37
|
+
}
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<style lang="sass"></style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template lang="pug">
|
|
2
|
+
.tabs-c
|
|
3
|
+
.tabs-c__header
|
|
4
|
+
.row.m-0
|
|
5
|
+
.col-sm-6.col-lg-4.col-xl.tabs-c__tab.py-3(
|
|
6
|
+
v-for="(elm,index) of elements"
|
|
7
|
+
:key="'tabs-c-menu-'+elm.id"
|
|
8
|
+
:class="{'tabs-c__tab--active' : selected === elm.id}"
|
|
9
|
+
@click="selected = elm.id"
|
|
10
|
+
role="button"
|
|
11
|
+
@mouseover="mostrarIndicador = mostrarIndicador && index >= 1 ? false : mostrarIndicador"
|
|
12
|
+
)
|
|
13
|
+
.indicador__container(v-if="mostrarIndicador && index === 1")
|
|
14
|
+
.indicador--click
|
|
15
|
+
span(v-html="elm.titulo")
|
|
16
|
+
.tabs-c__content-item(
|
|
17
|
+
v-for="elm of elements"
|
|
18
|
+
:key="'tabs-content-'+elm.id"
|
|
19
|
+
v-show="selected === elm.id"
|
|
20
|
+
v-child="elm.elm"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
.hidden-slot
|
|
24
|
+
slot
|
|
25
|
+
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<script>
|
|
29
|
+
import componentSlotMixins from './componentSlotMixins'
|
|
30
|
+
export default {
|
|
31
|
+
name: 'TabsC',
|
|
32
|
+
mixins: [componentSlotMixins],
|
|
33
|
+
data: () => ({
|
|
34
|
+
mostrarIndicador: true,
|
|
35
|
+
}),
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<style lang="sass"></style>
|