adding cards

This commit is contained in:
José Conde 2023-06-12 19:21:22 +02:00
parent 783b0f18c8
commit ce649bc711
11 changed files with 504 additions and 38 deletions

View File

@ -6,7 +6,7 @@
<link rel="icon" type="image/png" href="/images/logo-kreis_ico.png" /> <link rel="icon" type="image/png" href="/images/logo-kreis_ico.png" />
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@300;400&family=Righteous&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tayrona Foods</title> <title>Tayrona Foods</title>
</head> </head>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 77 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -5,16 +5,11 @@ export default {
title: String, title: String,
description: String description: String
}, },
methods: {
getImage(image) {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
},
}
} }
</script> </script>
<template> <template>
<div class="different-box"> <div class="different-box">
<img :src="getImage(image)" class="image" /> <img :src="$helper.getImage(image)" class="image" />
<h3 class="title">{{ title }}</h3> <h3 class="title">{{ title }}</h3>
<p class="description">{{ description }}</p> <p class="description">{{ description }}</p>
</div> </div>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="employee-box"> <div class="employee-box">
<img :src="getImage(image)" class="image"> <img :src="$helper.getImage(image)" class="image">
<h3 class="name">{{ name }}</h3> <h3 class="name">{{ name }}</h3>
<h4 class="role">{{ role }}</h4> <h4 class="role">{{ role }}</h4>
</div> </div>
@ -13,11 +13,6 @@ export default {
name: String, name: String,
role: String, role: String,
}, },
methods: {
getImage(image) {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
},
}
} }
</script> </script>

View File

@ -5,16 +5,11 @@ export default {
title: String, title: String,
description: String description: String
}, },
methods: {
getImage(image) {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
},
}
} }
</script> </script>
<template> <template>
<div class="origin-box"> <div class="origin-box">
<img :src="getImage(image)" class="image" /> <img :src="$helper.getImage(image)" class="image" />
<h3 class="title">{{ title }}</h3> <h3 class="title">{{ title }}</h3>
<p class="description">{{ description }}</p> <p class="description">{{ description }}</p>
</div> </div>

View File

@ -0,0 +1,357 @@
<script>
const kinds = {
earth: 'common.earth',
water: 'common.water',
air: 'common.air',
fire: 'common.fire',
}
export default {
props: {
product: Object
},
data() {
return {
flipped: false,
kinds,
}
},
methods: {
toggle() {
this.flipped = !this.flipped;
}
}
}
</script>
<template>
<div class="flip-card" :class="{flipped}" @click="toggle">
<div v-if="product" class="flip-card-inner" :class="(product && product.kind) || 'no-product'">
<div class="flip-card-front">
<img class="logo" :src="$helper.getImage(product.image)" />
<div>
<h3 class="title">{{ $t(kinds[product.kind])}}</h3>
<h3 class="slogan">{{ $t(product.slogan) }}</h3>
</div>
<div class="description">{{ $t(product.description) }}</div>
</div>
<div class="flip-card-back">
<div class="info">
<div class="info-header">
<h3 class="title centered">{{ $t(product.info.name) }}</h3>
<h3>- {{ $t(product.info.farm) }} -</h3>
<p class="strain">{{ $t(product.info.strain) }}</p>
</div>
<div class="info-data">
<div class="info-data-left">
<img class="logo" :src="$helper.getImage(product.image)" />
<p class="kind">{{ $t(kinds[product.kind]) }}</p>
<p class="slogan">{{ $t(product.slogan) }}</p>
</div>
<div class="info-data-right">
<div class="info-data-row">
<div class="info-data-box land">
<div class="info-data-box-label">{{ $t('Land / region') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('Brasil') }}/{{ $t('Cerrado, Carmo do paranaiba') }}</div>
</div>
</div>
<div class="info-data-box height">
<div class="info-data-box-label">{{ $t('Altura') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('1.100 m') }}</div>
</div>
</div>
</div>
<div class="info-data-row">
<div class="info-data-box revision">
<div class="info-data-box-label">{{ $t('Revisión') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('Secado al sol') }}</div>
</div>
</div>
<div class="info-data-box harvest">
<div class="info-data-box-label">{{ $t('Cosecha') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('Seleccionado') }}</div>
</div>
</div>
<div class="info-data-box profile">
<div class="info-data-box-label">{{ $t('Perfil') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('1/4') }}</div>
</div>
</div>
</div>
<div class="info-data-row">
<div class="info-data-box taste">
<div class="info-data-box-label">{{ $t('Sabor') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">
{{ $t('Chocolate, ligero ácido de frutas') }}
</div>
</div>
</div>
<div class="info-data-box mouthfeel">
<div class="info-data-box-label">{{ $t('Gusto') }}</div>
<div class="info-data-box-value">
<div class="text-overflow">{{ $t('Ligeramente picante') }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div v-else>
No product
</div>
</div>
</template>
<style lang="scss" scoped>
h3 {
font-weight: 500;
font-size: 36px;
line-height: 50px;
text-align: left;
}
.flip-card {
cursor: pointer;
height: 444px;
width: 600px;
color: #000;
font-size: 20px;
border-radius: 40px;
perspective: 1000px;
&.flipped &-inner {
transform: rotateY(180deg);
}
&-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.8s;
transform-style: preserve-3d;
border-radius: 40px;
&.earth {
background-color: #A6AF94;
}
&.water {
background-color: #889CA7;
}
&.air {
background-color: #F4EEB0;
}
&.fire {
background-color: #D58C83;
}
&.no-product {
background-color: #fff;
}
}
&-front {
display: grid;
grid-template-columns: 180px auto;
grid-template-rows: 160px auto;
justify-items: start;
align-items: center;
.description {
grid-column-start: 1;
grid-column-end: 3;
font-weight: 500;
font-size: 22px;
line-height: 35px;
text-align: justify;
padding: 0 44px;
align-self: flex-start;
}
.logo {
height: 184px;
width: 147px;
}
}
&-front, &-back {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
&-back {
transform: rotateY(180deg);
border-radius: 40px;
padding-top: 16px;
h3, h4 {
font-family: 'Righteous', cursive;
text-align: center;
}
.info {
height: 100%;
width: 100%;
display: grid;
grid-template-rows: 35% 65%;
.strain {
text-align: center;
font-family: 'Cormorant Garamond', serif;
font-size: 24px;
}
&-data {
display: grid;
grid-template-columns: 30% 70%;
margin: 20px;
border-style: solid;
border-width: 2px;
&-left {
padding-top: 16px;
}
&-right {
display: grid;
grid-template-rows: repeat(3, 1fr);
height: 100%;
width: 100%;
.earth & {
background-color: #babfa9;
}
.water & {
background-color: #92a7b1;
}
.air & {
background-color: #f4f4cc;
}
.fire & {
background-color: #d59c95;
}
}
&-row {
border-top-style: solid;
border-top-width: 2px;
border-bottom-style: solid;
border-bottom-width: 2px;
display: inline-flex;
// flex-wrap: nowrap;
// justify-content: space-around;
min-width: 100%;
height: 100%;
&:first-child {
border-top: none;
}
&:last-child {
border-bottom: none;
}
.earth & {
border-color: #A6AF94;
}
.water & {
border-color: #889CA7;
}
.air & {
border-color: #F4EEB0;
}
.fire & {
border-color: #D58C83;
}
}
&-box {
padding: 8px 0 0 8px;
border-right-style: solid;
border-right-width: 2px;
min-width: 100px;
flex-basis: 0px;
flex-grow: 1;
.text-overflow {
width: 98%;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
&:last-child {
border-right: none;
}
.earth & {
border-color: #A6AF94;
}
.water & {
border-color: #889CA7;
}
.air & {
border-color: #F4EEB0;
}
.fire & {
border-color: #D58C83;
}
&-label{
font-family: 'Righteous', cursive;
font-size: 20px;
text-transform: uppercase;
}
&-value{
font-family: 'Cormorant Garamond', serif;
font-size: 20px;
}
}
p {
&.kind {
font-family: 'Righteous', cursive;
text-align: left;
line-height: 20px;
margin-left: 20px;
text-transform: uppercase;
letter-spacing: 1.3px;
}
&.slogan {
font-family: 'Cormorant Garamond', serif;
font-size: 90%;
text-align: left;
line-height: 25px;
margin-left: 20px;
}
}
.earth & {
border-color: #babfa9;
}
.water & {
border-color: #92a7b1;
}
.air & {
border-color: #f4f4cc;
}
.fire & {
border-color: #d59c95;
}
}
}
}
}
</style>

View File

@ -53,4 +53,29 @@ export default {
certifications: { certifications: {
title: 'Nuestras certificaciones' title: 'Nuestras certificaciones'
}, },
products: {
brasil_de_andrade: {
slogan: 'Nacido para crear',
description: 'La tierra, buscamos activamente las mejores fincas cafeteras a nivel mundial donde suelos ricos en nutrientes son la base para formar granos de café de alta calidad. Desde las fértiles plantaciones de América Latina hasta las exóticas zonas de cultivo de África, nos centramos en la sostenibilidad y el comercio justo.',
info: {
name: 'Brasil de Andrade',
farm: 'Capim Branco',
strain: '100% Arabica',
land: 'Brasil',
region: 'Cerrado, Carmo do paranaiba',
height: '1.100 m',
revision: 'Secado al sol',
harvest: 'Seleccionado cuidadosamente',
profile: '1/4',
taste: 'Chocolate, ligero ácido de frutas.',
mouthfeel: 'Ligeramente picante'
}
}
},
common: {
earth: 'Tierra',
water: 'Agua',
air: 'Aire',
fire: 'Fuego',
}
} }

View File

@ -5,11 +5,13 @@ import VueMobileDetection from 'vue-mobile-detection';
import './style.css' import './style.css'
import App from './App.vue' import App from './App.vue'
import helper from './plugins/helper';
const app = createApp(App); const app = createApp(App);
app.use(router); app.use(router);
app.use(VueMobileDetection); app.use(VueMobileDetection);
app.use(i18n); app.use(i18n);
app.use(helper);
app.mount('#app'); app.mount('#app');

11
src/plugins/helper.js Normal file
View File

@ -0,0 +1,11 @@
const getImage = (image) => {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
}
export default {
install: (app, options) => {
app.config.globalProperties.$helper = {
getImage,
};
},
}

View File

@ -2,32 +2,87 @@
import MenuVue from "../../components/Menu.vue"; import MenuVue from "../../components/Menu.vue";
import 'vue3-carousel/dist/carousel.css' import 'vue3-carousel/dist/carousel.css'
import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel' import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel'
import ProductFlipCard from "../../components/ProductFlipCard.vue";
const slides = [ const products = [
{ {
kind: 'earth',
image: 'logo_tierra.svg', image: 'logo_tierra.svg',
class: 'tierra', slogan: 'Nacido para crear',
title: 'Tierra Nacido para crear', description: 'La tierra, buscamos activamente las mejores fincas cafeteras a nivel mundial donde suelos ricos en nutrientes son la base para formar granos de café de alta calidad. Desde las fértiles plantaciones de América Latina hasta las exóticas zonas de cultivo de África, nos centramos en la sostenibilidad y el comercio justo.',
description: 'La tierra, buscamos activamente las mejores fincas cafeteras a nivel mundial donde suelos ricos en nutrientes son la base para formar granos de café de alta calidad. Desde las fértiles plantaciones de América Latina hasta las exóticas zonas de cultivo de África, nos centramos en la sostenibilidad y el comercio justo.' info: {
name: 'Brasil de Andrade',
farm: 'Capim Branco',
strain: '100% Arabica',
land: 'Brasilien / Cerrado, Carmo do paranaiba',
height: '1.100 m',
revision: 'Secado al sol',
harvest: 'Seleccionado cuidadosamente',
profile: '1/4',
taste: 'Chocolate, ligero ácido de frutas.',
mouthfeel: 'Ligeramente picante'
}
}, },
{ {
kind: 'water',
image: 'logo_agua.svg', image: 'logo_agua.svg',
class: 'agua', slogan: 'Nacido para sentir',
title: 'Agua Nacido para sentir', description: 'El agua, juega un papel decisivo en la preparación del café. Por lo tanto, solo utilizamos agua de primera clase que se adapta perfectamente a los requisitos individuales de cada café. La cantidad y calidad correcta del agua despliega los aromas y sabores en cada taza.',
description: 'El agua, juega un papel decisivo en la preparación del café. Por lo tanto, solo utilizamos agua de primera clase que se adapta perfectamente a los requisitos individuales de cada café. La cantidad y calidad correcta del agua despliega los aromas y sabores en cada taza.' info: {
name: 'Brasil de Andrade',
farm: 'Capim Branco',
strain: '100% Arabica',
land: 'Brasilien / Cerrado, Carmo do paranaiba',
height: '1.100 m',
revision: 'Secado al sol',
harvest: 'Seleccionado cuidadosamente',
profile: '1/4',
taste: 'Chocolate, ligero ácido de frutas.',
mouthfeel: 'Ligeramente picante'
}
}, },
{ {
image: 'logo_aire.svg', kind: 'air',
class: 'aire', image: 'logo_aire2.svg',
title: 'Aire Nacido para inspirar', slogan: 'Nacido para inspirar',
description: 'El aire, es otra parte esencial de nuestra pasión por el café, damos gran importancia a los granos de café recién tostados que conservan su aroma y sabor inconfundibles. Es por eso que tostamos en pequeños lotes para asegurarnos de que cada taza que disfrutes esté llena de frescura y aroma.' description: 'El aire, es otra parte esencial de nuestra pasión por el café, damos gran importancia a los granos de café recién tostados que conservan su aroma y sabor inconfundibles. Es por eso que tostamos en pequeños lotes para asegurarnos de que cada taza que disfrutes esté llena de frescura y aroma.',
info: {
name: 'Brasil de Andrade',
farm: 'Capim Branco',
strain: '100% Arabica',
land: 'Brasilien / Cerrado, Carmo do paranaiba',
height: '1.100 m',
revision: 'Secado al sol',
harvest: 'Seleccionado cuidadosamente',
profile: '1/4',
taste: 'Chocolate, ligero ácido de frutas.',
mouthfeel: 'Ligeramente picante'
}
},
{
kind: 'fire',
image: 'logo_fuego.svg',
slogan: 'Nacido para triunfar',
description: 'El fuego, la pasión que resuena en cada paso de nuestro trabajo. Desde la selección de variedades de café verde hasta el cuidadoso tostado y la preparación amorosa, estamos allí con alma y corazón para ofrecerte una experiencia de café extraordinaria.',
info: {
name: 'Brasil de Andrade',
farm: 'Capim Branco',
strain: '100% Arabica',
land: 'Brasilien / Cerrado, Carmo do paranaiba',
height: '1.100 m',
revision: 'Secado al sol',
harvest: 'Seleccionado cuidadosamente',
profile: '1/4',
taste: 'Chocolate, ligero ácido de frutas.',
mouthfeel: 'Ligeramente picante'
}
}, },
] ]
export default { export default {
data() { data() {
return { return {
slides, products,
}; };
}, },
components: { components: {
@ -35,7 +90,8 @@
Carousel, Carousel,
Slide, Slide,
Pagination, Pagination,
Navigation Navigation,
ProductFlipCard
}, },
methods: { methods: {
getImage(image) { getImage(image) {
@ -51,6 +107,9 @@
<h2>Origen</h2> <h2>Origen</h2>
<p>Las culturas indígenas siempre han tenido una estrecha relación con su entorno natural, encontrando en la armonía con los cuatro elementos: fuego, agua, aire y tierra, el sentido de sus vidas, y es esta misma relación la que describe maravillosamente nuestra serie de cafés.</p> <p>Las culturas indígenas siempre han tenido una estrecha relación con su entorno natural, encontrando en la armonía con los cuatro elementos: fuego, agua, aire y tierra, el sentido de sus vidas, y es esta misma relación la que describe maravillosamente nuestra serie de cafés.</p>
<p class="centered"><img src="@images/v-elemento.png" /></p> <p class="centered"><img src="@images/v-elemento.png" /></p>
<div class="cards">
<ProductFlipCard class="card" v-for="product in products" :key="product.id" :product="product"></ProductFlipCard>
</div>
<Carousel :items-to-show="2" :wrap-around="true" snap-align="start"> <Carousel :items-to-show="2" :wrap-around="true" snap-align="start">
<Slide v-for="slide in slides" :key="slide.class"> <Slide v-for="slide in slides" :key="slide.class">
<div class="carousel__item" :class="slide.class"> <div class="carousel__item" :class="slide.class">
@ -77,7 +136,16 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.cards {
display: grid;
grid-template-columns: 50% 50%;
}
.card {
margin: 8px;
}
.carousel { .carousel {
&__item { &__item {
height: 444px; height: 444px;
width: 625px; width: 625px;