mirror of
https://github.com/anatolykopyl/bakery.git
synced 2026-03-26 13:04:27 +00:00
242 lines
6.9 KiB
Vue
242 lines
6.9 KiB
Vue
<template>
|
|
<div class="goods">
|
|
<a v-bind:style="{ transform: jumpOffset }" class="jump-to-top" href="#app"><img src="@/assets/down.png"></a>
|
|
<div id="menu">
|
|
<div class="buttons">
|
|
<a href="#pastry">
|
|
<img src="@/assets/pastry-tab.png">
|
|
<h4>Кондитерские изделия</h4>
|
|
</a>
|
|
<a href="#singles">
|
|
<img src="@/assets/singles-tab.png">
|
|
<h4>Мелкоштучные изделия</h4>
|
|
</a>
|
|
<a href="#pies">
|
|
<img src="@/assets/pies-tab.png">
|
|
<h4>Пироги</h4>
|
|
</a>
|
|
<a href="#bread">
|
|
<img src="@/assets/bread-tab.png">
|
|
<h4>Хлеба и багеты</h4>
|
|
</a>
|
|
<a href="#drinks">
|
|
<img src="@/assets/drinks-tab.png">
|
|
<h4>Напитки</h4>
|
|
</a>
|
|
</div>
|
|
<input type="text" placeholder="Поиск..." v-model="query"/>
|
|
</div>
|
|
<h2 v-if="categoryLength(['Кондитерские изделия', 'Леденцы', 'Печенье', 'Торты на заказ'])" id="pastry">Кондитерские изделия:</h2>
|
|
<div v-if="categoryLength(['Кондитерские изделия', 'Леденцы', 'Печенье', 'Торты на заказ'])" class="category">
|
|
<div v-for="n in 3" v-bind:key=n class="col">
|
|
<Card v-for="item in itemsSubset(n, ['Кондитерские изделия', 'Леденцы', 'Печенье', 'Торты на заказ'])" v-bind:key=item.nameEng :item=item :query=query />
|
|
</div>
|
|
</div>
|
|
<h2 v-if="categoryLength('Мелкоштучные изделия')" id="singles">Мелкоштучные изделия:</h2>
|
|
<div v-if="categoryLength('Мелкоштучные изделия')" class="category">
|
|
<div v-for="n in 3" v-bind:key=n class="col">
|
|
<Card v-for="item in itemsSubset(n, 'Мелкоштучные изделия')" v-bind:key=item.nameEng :item=item :query=query />
|
|
</div>
|
|
</div>
|
|
<h2 v-if="categoryLength('Пироги')" id="pies">Пироги:</h2>
|
|
<div v-if="categoryLength('Пироги')" class="category">
|
|
<div v-for="n in 3" v-bind:key=n class="col">
|
|
<Card v-for="item in itemsSubset(n, 'Пироги')" v-bind:key=item.nameEng :item=item :query=query />
|
|
</div>
|
|
</div>
|
|
<h2 v-if="categoryLength(['Хлеба, багеты', 'Сухарики'])" id="bread">Хлеба и багеты:</h2>
|
|
<div v-if="categoryLength(['Хлеба, багеты', 'Сухарики'])" class="category">
|
|
<div v-for="n in 3" v-bind:key=n class="col">
|
|
<Card v-for="item in itemsSubset(n, ['Хлеба, багеты', 'Сухарики'])" v-bind:key=item.nameEng :item=item :query=query />
|
|
</div>
|
|
</div>
|
|
<h2 v-if="categoryLength('Напитки')" id="drinks">Напитки:</h2>
|
|
<div v-if="categoryLength('Напитки')" class="category">
|
|
<div v-for="n in 3" v-bind:key=n class="col">
|
|
<Card v-for="item in itemsSubset(n, 'Напитки')" v-bind:key=item.nameEng :item=item :query=query />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import Card from "@/components/Card.vue";
|
|
import items from '@/assets/items.js'
|
|
|
|
export default {
|
|
name: "Goods",
|
|
components: {
|
|
Card
|
|
},
|
|
data() {
|
|
return {
|
|
items: items,
|
|
query: '',
|
|
jumpOffset: "translateY(100px)"
|
|
}
|
|
},
|
|
methods: {
|
|
itemsSubset: function(col, category) {
|
|
return this.items.filter((v, i) => (i % 3 === col-1) && category.includes(v.category));
|
|
},
|
|
categoryLength: function(category) {
|
|
let cropped = this.items.filter((v) => category.includes(v.category));
|
|
let result = cropped.filter((v) => v.name.toLowerCase().includes(this.query.toLowerCase()));
|
|
return result.length;
|
|
},
|
|
handleScroll: function() {
|
|
let offset = Math.max(150-window.scrollY, 0);
|
|
this.jumpOffset = `translateY(${offset}px)`;
|
|
}
|
|
},
|
|
mounted() {
|
|
window.addEventListener('scroll', this.handleScroll);
|
|
window.scrollTo(0, 0)
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
#menu {
|
|
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.4);
|
|
background: rgb(255,255,255);
|
|
background: linear-gradient(0deg, rgba(255,255,255,0.4) 0%, rgba(255,255,255,0) 100%);
|
|
padding-top: 80px;
|
|
padding-bottom: 40px;
|
|
margin-bottom: 60px;
|
|
}
|
|
|
|
#menu input {
|
|
color: #b4a89c;
|
|
background-color: #F8F3E7;
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
padding: 12px;
|
|
width: 40em;
|
|
border: none;
|
|
border-bottom: 2px solid #F8F3E7;
|
|
border-radius: 6px;
|
|
background-image: url("../assets/search.svg");
|
|
background-repeat: no-repeat;
|
|
background-position: center left;
|
|
background-size: 2em;
|
|
background-position-x: 20px;
|
|
}
|
|
|
|
#menu input:focus {
|
|
outline: none;
|
|
border-bottom: 2px solid #b4a89c;
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.buttons {
|
|
max-width: 100%;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: top;
|
|
justify-content: space-evenly;
|
|
padding-left: 10%;
|
|
padding-right: 10%;
|
|
margin-bottom: 30px;
|
|
}
|
|
|
|
.buttons h4 {
|
|
font-family: 'Playfair Display', serif;
|
|
font-size: 17px;
|
|
font-weight: 100;
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.buttons a {
|
|
width: 204.8px;
|
|
transition: transform .2s;
|
|
cursor: pointer;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.buttons a:hover {
|
|
transform: scale(1.05);
|
|
}
|
|
|
|
.buttons img {
|
|
width: 70%;
|
|
border: rgb(253, 253, 253) solid;
|
|
border-radius: 100%;
|
|
border-width: 0.35vw;
|
|
box-shadow: 0.35vw 0.35vw 0.35vw rgba(0, 0, 0, 0.4);
|
|
}
|
|
|
|
h2 {
|
|
text-align: left;
|
|
margin-left: 5vh;
|
|
font-family: 'Playfair Display', serif;
|
|
font-weight: 500;
|
|
font-size: 30px;
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.category {
|
|
display: flex;
|
|
padding-left: 20px;
|
|
padding-right: 20px;
|
|
}
|
|
|
|
h2::before {
|
|
display: block;
|
|
content: " ";
|
|
margin-top: -100px;
|
|
height: 100px;
|
|
visibility: hidden;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.col {
|
|
width: 33.33%;
|
|
padding: 30px;
|
|
}
|
|
|
|
.jump-to-top {
|
|
position: fixed;
|
|
opacity: 0.75;
|
|
right: 2vw;
|
|
bottom: 2vw;
|
|
z-index: 100;
|
|
}
|
|
|
|
.jump-to-top img {
|
|
width: 7vh;
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
@media screen and (max-width: 1024px) {
|
|
#menu {
|
|
padding-top: 4vh;
|
|
padding-bottom: 4vh;
|
|
}
|
|
|
|
#menu input {
|
|
width: 85%;
|
|
}
|
|
|
|
.buttons {
|
|
padding: 0px;
|
|
}
|
|
|
|
.category {
|
|
display: inline-block;
|
|
padding: 0px;
|
|
width: 90%;
|
|
}
|
|
|
|
.col {
|
|
width: 100%;
|
|
padding: 0px;
|
|
}
|
|
|
|
.jump-to-top img {
|
|
width: 15vw;
|
|
}
|
|
}
|
|
</style>
|