category row added
168
components/CategoryRow.vue
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
<template>
|
||||||
|
<div class="row container">
|
||||||
|
<ClientOnly placeholder="Loading...">
|
||||||
|
<Carousel
|
||||||
|
ref="categoryDetails"
|
||||||
|
class="carousel"
|
||||||
|
:items-to-show="itemsToShow"
|
||||||
|
:breakpoints="config.breakpoints"
|
||||||
|
:gap="1"
|
||||||
|
:pagination-enabled="false"
|
||||||
|
:wrap-around="false"
|
||||||
|
:mouse-wheel="false"
|
||||||
|
:breakpoints-enabled="true"
|
||||||
|
>
|
||||||
|
<Slide v-for="item in items" :key="`category-${item.image}`" class="slide-container">
|
||||||
|
<div class="slide" @click="searchByCategory(item.name)">
|
||||||
|
<div class="image-container">
|
||||||
|
<img class="image" :src="item.image ? item.image : defaultImage" :alt="`${item.name} category image`" />
|
||||||
|
</div>
|
||||||
|
<p class="category-name">{{ item.name }}</p>
|
||||||
|
</div>
|
||||||
|
</Slide>
|
||||||
|
<template #addons>
|
||||||
|
<Navigation />
|
||||||
|
</template>
|
||||||
|
</Carousel>
|
||||||
|
</ClientOnly>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { Carousel, Slide, Navigation } from 'vue3-carousel'
|
||||||
|
import 'vue3-carousel/dist/carousel.css'
|
||||||
|
import defaultImage from '@/assets/img/producto-default.png'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Carousel,
|
||||||
|
Slide,
|
||||||
|
Navigation
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
items: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
itemsToShow: {
|
||||||
|
type: Number,
|
||||||
|
default: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
defaultImage,
|
||||||
|
config: {
|
||||||
|
height: 200,
|
||||||
|
breakpointMode: 'carousel', // o 'viewport'
|
||||||
|
breakpoints: {
|
||||||
|
768: {
|
||||||
|
itemsToShow: 3,
|
||||||
|
snapAlign: 'center',
|
||||||
|
},
|
||||||
|
1024: {
|
||||||
|
itemsToShow: 4,
|
||||||
|
snapAlign: 'start',
|
||||||
|
},
|
||||||
|
1440: {
|
||||||
|
itemsToShow: 5,
|
||||||
|
snapAlign: 'start',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
searchByCategory(categoryName) {
|
||||||
|
const formattedCategory = categoryName
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/á/g, 'a')
|
||||||
|
.replace(/é/g, 'e')
|
||||||
|
.replace(/í/g, 'i')
|
||||||
|
.replace(/ó/g, 'o')
|
||||||
|
.replace(/ú/g, 'u')
|
||||||
|
.replace(/ñ/g, 'n')
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
console.log('Searching by category:', formattedCategory)
|
||||||
|
this.$router.push(`/busqueda?category=${formattedCategory}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.row {
|
||||||
|
padding: 0 4rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 50%;
|
||||||
|
display: flex;
|
||||||
|
@include mobile {
|
||||||
|
max-height: 10rem;
|
||||||
|
max-width: 10rem;
|
||||||
|
}
|
||||||
|
.image {
|
||||||
|
width: fit-content;
|
||||||
|
height: fit-content;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-container {
|
||||||
|
padding: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
width: 179px;
|
||||||
|
height: 213px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: stretch;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 5px solid white;
|
||||||
|
border-radius: 24px;
|
||||||
|
box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.15);
|
||||||
|
text-decoration: none;
|
||||||
|
position: relative; // necesario para controlar hijos absolutos
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 16px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
transform: translateY(-4px);
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
display: -webkit-box;
|
||||||
|
--webkit-line-clamp: 3;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100%;
|
||||||
|
font-weight: $medium;
|
||||||
|
font-size: $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.category-name {
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -34,6 +34,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="items">
|
||||||
|
<div class="title-container">
|
||||||
|
<div class="title-lines"></div>
|
||||||
|
<h5 class="items-title">Explora por temática</h5>
|
||||||
|
<div class="title-lines"></div>
|
||||||
|
</div>
|
||||||
|
<div class="items-container">
|
||||||
|
<CategoryRow :type="`caterories`" :items="categories" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="items">
|
<div class="items">
|
||||||
<div class="title-container">
|
<div class="title-container">
|
||||||
<div class="title-lines"></div>
|
<div class="title-lines"></div>
|
||||||
@@ -80,7 +90,23 @@ export default {
|
|||||||
cards: null,
|
cards: null,
|
||||||
carouselProducts: null,
|
carouselProducts: null,
|
||||||
carouselCompanies: null,
|
carouselCompanies: null,
|
||||||
carouselCategories: null
|
carouselCategories: null,
|
||||||
|
categories: [
|
||||||
|
{name: 'Alimentación', image: '/categories/alimentacion.png'},
|
||||||
|
{name: 'Agricultura', image: '/categories/agricultura.png'},
|
||||||
|
{name: 'Energía', image: '/categories/energia.png'},
|
||||||
|
{name: 'Hogar y Jardín', image: '/categories/hogar-jardin.png'},
|
||||||
|
{name: 'Moda y Textil', image: '/categories/moda-textil.png'},
|
||||||
|
{name: 'Salud y Cuidados', image: '/categories/salud-cuidados.png'},
|
||||||
|
{name: 'Movilidad y Mensajería', image: '/categories/movilidad-mensajeria.png'},
|
||||||
|
{name: 'Ocio y Deporte', image: '/categories/ocio-deporte.png'},
|
||||||
|
{name: 'Turismo y Gastronomía', image: '/categories/turismo-gastronomia.png'},
|
||||||
|
{name: 'Cultura, Educación y Medios', image: '/categories/cultura-educacion-medios.png'},
|
||||||
|
{name: 'Tecnología y Servicios Digitales', image: '/categories/tecnologia-servicios-digitales.png'},
|
||||||
|
{name: 'Economía Circular y Reparación', image: '/categories/economia-circular-reparacion.png'},
|
||||||
|
{name: 'Finanzas Éticas y Seguros', image: '/categories/finanzas-eticas-seguros.png'},
|
||||||
|
{name: 'Servicios Profesionales', image: '/categories/servicios-profesionales.png'},
|
||||||
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
|
|||||||
BIN
public/categories/agricultura.png
Normal file
|
After Width: | Height: | Size: 1013 B |
BIN
public/categories/alimentacion.png
Normal file
|
After Width: | Height: | Size: 892 B |
BIN
public/categories/cultura-educacion-medios.png
Normal file
|
After Width: | Height: | Size: 1006 B |
BIN
public/categories/economia-circular-reparacion.png
Normal file
|
After Width: | Height: | Size: 898 B |
BIN
public/categories/energia.png
Normal file
|
After Width: | Height: | Size: 786 B |
BIN
public/categories/finanzas-eticas-seguros.png
Normal file
|
After Width: | Height: | Size: 751 B |
BIN
public/categories/hogar-jardin.png
Normal file
|
After Width: | Height: | Size: 616 B |
BIN
public/categories/moda-textil.png
Normal file
|
After Width: | Height: | Size: 736 B |
BIN
public/categories/movilidad-mensajeria.png
Normal file
|
After Width: | Height: | Size: 895 B |
BIN
public/categories/ocio-deporte.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/categories/salud-cuidados.png
Normal file
|
After Width: | Height: | Size: 919 B |
BIN
public/categories/servicios-profesionales.png
Normal file
|
After Width: | Height: | Size: 766 B |
BIN
public/categories/tecnologia-servicios-digitales.png
Normal file
|
After Width: | Height: | Size: 629 B |
BIN
public/categories/turismo-gastronomia.png
Normal file
|
After Width: | Height: | Size: 943 B |