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="preconnect" href="https://fonts.googleapis.com">
<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" />
<title>Tayrona Foods</title>
</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,
description: String
},
methods: {
getImage(image) {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
},
}
}
</script>
<template>
<div class="different-box">
<img :src="getImage(image)" class="image" />
<img :src="$helper.getImage(image)" class="image" />
<h3 class="title">{{ title }}</h3>
<p class="description">{{ description }}</p>
</div>

View File

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

View File

@ -5,16 +5,11 @@ export default {
title: String,
description: String
},
methods: {
getImage(image) {
return new URL(`/src/assets/images/${image}`, import.meta.url).href;
},
}
}
</script>
<template>
<div class="origin-box">
<img :src="getImage(image)" class="image" />
<img :src="$helper.getImage(image)" class="image" />
<h3 class="title">{{ title }}</h3>
<p class="description">{{ description }}</p>
</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: {
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 App from './App.vue'
import helper from './plugins/helper';
const app = createApp(App);
app.use(router);
app.use(VueMobileDetection);
app.use(i18n);
app.use(helper);
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 'vue3-carousel/dist/carousel.css'
import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel'
import ProductFlipCard from "../../components/ProductFlipCard.vue";
const slides = [
const products = [
{
kind: 'earth',
image: 'logo_tierra.svg',
class: 'tierra',
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.'
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: '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',
class: 'agua',
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.'
slogan: '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.',
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',
class: 'aire',
title: 'Aire 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.'
kind: 'air',
image: 'logo_aire2.svg',
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.',
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 {
data() {
return {
slides,
products,
};
},
components: {
@ -35,7 +90,8 @@
Carousel,
Slide,
Pagination,
Navigation
Navigation,
ProductFlipCard
},
methods: {
getImage(image) {
@ -51,6 +107,9 @@
<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 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">
<Slide v-for="slide in slides" :key="slide.class">
<div class="carousel__item" :class="slide.class">
@ -77,7 +136,16 @@
<style lang="scss" scoped>
.cards {
display: grid;
grid-template-columns: 50% 50%;
}
.card {
margin: 8px;
}
.carousel {
&__item {
height: 444px;
width: 625px;