├── .dockerignore ├── public ├── favicon.ico └── index.html ├── screenshot ├── mobile-1.png ├── mobile-2.png ├── pagina-1.png ├── pagina-2.png ├── popup-1.png └── popup-2.png ├── babel.config.js ├── src ├── assets │ └── logo.png ├── pages │ ├── Root.vue │ ├── Home.vue │ └── Basket.vue ├── utils │ ├── source │ │ ├── toJson.js │ │ ├── joinInGroups.js │ │ ├── parseData.js │ │ └── localStorage │ │ │ ├── index.js │ │ │ └── utils │ │ │ └── index.js │ └── index.js ├── store │ ├── modules │ │ ├── static.js │ │ ├── popUp.js │ │ ├── headerVisible.js │ │ ├── menuItems.js │ │ └── shoppingBasket.js │ └── index.js ├── main.js ├── components │ ├── source │ │ ├── Container.vue │ │ ├── Footer.vue │ │ ├── Loading.vue │ │ ├── Header.vue │ │ ├── Card.vue │ │ └── PopUp.vue │ └── index.js ├── icons │ ├── source │ │ ├── SendIcon.vue │ │ ├── MinusIcon.vue │ │ ├── ArrowBackIcon.vue │ │ ├── InstagramIcon.vue │ │ ├── PlusIcon.vue │ │ ├── PizzaIcon.vue │ │ ├── PhoneIcon.vue │ │ ├── TrashIcon.vue │ │ ├── KnifeForkIcon.vue │ │ ├── BasketIcon.vue │ │ ├── WhatsappIcon.vue │ │ ├── HamburguerIcon.vue │ │ ├── DrinkIcon.vue │ │ └── LogoIcon.vue │ └── index.js ├── router │ └── index.js └── App.vue ├── vue.config.js ├── .gitignore ├── docker-compose.yml ├── package.json ├── LICENSE └── README.md /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /screenshot/mobile-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/mobile-1.png -------------------------------------------------------------------------------- /screenshot/mobile-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/mobile-2.png -------------------------------------------------------------------------------- /screenshot/pagina-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/pagina-1.png -------------------------------------------------------------------------------- /screenshot/pagina-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/pagina-2.png -------------------------------------------------------------------------------- /screenshot/popup-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/popup-1.png -------------------------------------------------------------------------------- /screenshot/popup-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danroxha/digital-menu/HEAD/screenshot/popup-2.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:03d6d6da2545d3b3402855b8e721b779abaa87d113e69d9329ea6ea6325a83ce 3 | size 6849 4 | -------------------------------------------------------------------------------- /src/pages/Root.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /src/utils/source/toJson.js: -------------------------------------------------------------------------------- 1 | export default function toJSON(arr){ 2 | 3 | let obj = {} 4 | 5 | for(let i = 0; i < arr.length; i++){ 6 | if(i % 2 == 0){ 7 | obj[arr[i]] = arr[i+1] 8 | } 9 | } 10 | return obj 11 | } -------------------------------------------------------------------------------- /src/store/modules/static.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | namespaced: true, 4 | state: { 5 | phone: '+5598988998019', 6 | instagram: 'https://www.instagram.com/pizzariacolosso/?igshid=1h7f4x1saumts', 7 | }, 8 | actions: {}, 9 | gettets: {}, 10 | } 11 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from '@/App.vue' 3 | import store from '@/store' 4 | import router from '@/router' 5 | 6 | Vue.config.productionTip = false 7 | 8 | new Vue({ 9 | render: h => h(App), 10 | store, 11 | router, 12 | }).$mount('#app') 13 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | export { default as toJSON } from './source/toJson.js' 2 | export { default as joinInGroups } from './source/joinInGroups.js' 3 | export { default as parseData } from './source/parseData.js' 4 | export { default as LocalStorage } from './source/localStorage/index.js' -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: '/digital-menu', 3 | outputDir: '../digital-menu-build', 4 | chainWebpack: (config) => { 5 | config 6 | .plugin('html') 7 | .tap((args) => { 8 | args[0].title = 'Menu Colosso'; 9 | return args; 10 | }); 11 | }, 12 | } -------------------------------------------------------------------------------- /src/components/source/Container.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/utils/source/joinInGroups.js: -------------------------------------------------------------------------------- 1 | export default function joinInGroups(data){ 2 | 3 | let group = new Object() 4 | 5 | for(var item of data){ 6 | if(!Object.prototype.hasOwnProperty.call(group, item?.group)){ 7 | group[item.group] = [item] 8 | continue 9 | } 10 | group[item.group].push(item) 11 | } 12 | 13 | return group 14 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | .DS_Store 3 | node_modules 4 | /dist 5 | 6 | 7 | 8 | # local env files 9 | .env.local 10 | .env.*.local 11 | 12 | # Log files 13 | npm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* 16 | pnpm-debug.log* 17 | 18 | # Editor directories and files 19 | .idea 20 | .vscode 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as Card } from './source/Card.vue' 2 | export { default as Container } from './source/Container.vue' 3 | export { default as Footer } from './source/Footer.vue' 4 | export { default as Header } from './source/Header.vue' 5 | export { default as PopUp } from './source/PopUp.vue' 6 | export { default as Loading } from './source/Loading.vue' 7 | 8 | -------------------------------------------------------------------------------- /src/icons/source/SendIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/store/modules/popUp.js: -------------------------------------------------------------------------------- 1 | export default { 2 | namespaced: true, 3 | 4 | state: { 5 | visible: false, 6 | data: {} 7 | }, 8 | 9 | mutations: { 10 | openPopUp: (state, data) => { 11 | state.visible = true 12 | state.data = data 13 | }, 14 | closePopUp: state => state.visible = false, 15 | }, 16 | 17 | actions: {}, 18 | 19 | gettets: {}, 20 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | develop: 4 | image: 'node:16.8-alpine3.11' 5 | container_name: digital-menu-app 6 | restart: always 7 | working_dir: /home/digitalmenu/app 8 | ports: 9 | - 8080:8080 10 | volumes: 11 | - .:/home/digitalmenu/app 12 | - ./node_modules:/home/digitalmenu/app/node_modules 13 | command: "sh -c 'npm install && npm run serve'" 14 | -------------------------------------------------------------------------------- /src/icons/source/MinusIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/source/ArrowBackIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | > -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import menuItems from './modules/menuItems' 4 | import popUp from './modules/popUp' 5 | import shoppingBasket from './modules/shoppingBasket' 6 | import statics from './modules/static' 7 | import headerVisible from './modules/headerVisible' 8 | 9 | Vue.use(Vuex) 10 | 11 | 12 | export default new Vuex.Store({ 13 | modules: { 14 | menuItems, 15 | popUp, 16 | shoppingBasket, 17 | statics, 18 | headerVisible, 19 | } 20 | }) -------------------------------------------------------------------------------- /src/icons/source/InstagramIcon.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/utils/source/parseData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * @param {JSON} table JSON from Google SpreadSheet 4 | * @returns JSON clean 5 | */ 6 | export default function parseData({table}) { 7 | return table.rows.map(row => [ 8 | ...table.cols.map((col, index) => ({ [col.label]: row.c[index].v,})) 9 | ] 10 | ) 11 | .map(data => 12 | data.reduce((acc, value) => ({...acc, ...value}), {}) 13 | ) 14 | .map(tuple => ({ 15 | ...tuple, 16 | ingredientes: tuple.ingredientes.replace(/\s+/ig, '').split(";") 17 | })); 18 | } -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | import Home from '@/pages/Home' 5 | import Basket from '@/pages/Basket' 6 | 7 | Vue.use(Router) 8 | 9 | export default new Router({ 10 | routes: [ 11 | { 12 | name: 'default', 13 | path: '*', 14 | component: Home, 15 | }, 16 | { 17 | name: 'home', 18 | path: '/', 19 | component: Home, 20 | }, 21 | { 22 | name: 'basket', 23 | path: '/basket', 24 | component: Basket, 25 | } 26 | ] 27 | }) 28 | -------------------------------------------------------------------------------- /src/store/modules/headerVisible.js: -------------------------------------------------------------------------------- 1 | export default { 2 | namespaced: true, 3 | 4 | state: { 5 | visible: true, 6 | otherCondicion: true, 7 | }, 8 | 9 | mutations: { 10 | onMoveScroll: (state, event) => 11 | state.visible = event.target.scrollTop < 70 && state.otherCondicion, 12 | changeOtherCondicion: (state, bool) => 13 | state.otherCondicion = bool, 14 | al: (state) => console.log('Chamou ' + state.otherCondicion), 15 | }, 16 | 17 | actions: {}, 18 | 19 | gettets: {}, 20 | } -------------------------------------------------------------------------------- /src/utils/source/localStorage/index.js: -------------------------------------------------------------------------------- 1 | import Tools from './utils/index.js' 2 | 3 | export default class LocalStorage { 4 | 5 | static async findAll(setting){ 6 | 7 | if(setting.localStorage.getItem(setting.storage)) 8 | return Tools.JSONToMap(setting.localStorage.getItem(setting.storage)) 9 | 10 | return new Map() 11 | 12 | } 13 | 14 | static async updateAll(setting, data){ 15 | setting.localStorage.setItem(setting.storage, Tools.MapToJSON(data)) 16 | } 17 | 18 | static async removeAll(setting) { 19 | setting.localStorage.removeItem(setting.storage) 20 | } 21 | } -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/icons/source/PlusIcon.vue: -------------------------------------------------------------------------------- 1 | 26 | -------------------------------------------------------------------------------- /src/icons/source/PizzaIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/source/PhoneIcon.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/utils/source/localStorage/utils/index.js: -------------------------------------------------------------------------------- 1 | // https://2ality.com/2015/08/es6-map-json.html 2 | 3 | export default class Tools { 4 | 5 | static MapToObject(map) { 6 | 7 | let object = Object.create(null) 8 | 9 | for (let [key, value] of map) 10 | object[key] = value 11 | 12 | return object 13 | } 14 | 15 | static ObjectToMap(object) { 16 | 17 | let map = new Map() 18 | 19 | for (let key of Object.keys(object)) 20 | map.set(key, object[key]) 21 | 22 | return map 23 | } 24 | 25 | static MapToJSON(map) { 26 | return JSON.stringify(Tools.MapToObject(map)) 27 | } 28 | 29 | static JSONToMap(json) { 30 | return Tools.ObjectToMap(JSON.parse(json)) 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /src/icons/source/TrashIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/store/modules/menuItems.js: -------------------------------------------------------------------------------- 1 | import { joinInGroups, parseData } from '../../utils' 2 | 3 | 4 | export default { 5 | namespaced: true, 6 | 7 | state: { 8 | items: [], 9 | isEmpty: true 10 | }, 11 | 12 | mutations: {}, 13 | 14 | actions: { 15 | async ['loadData']({state}){ 16 | 17 | const id = '1Hrhw7xC5NFxNyblD7aZ7afD1DFzHlSsQidav0e6Hshw' 18 | const url = `https://docs.google.com/spreadsheets/d/${id}/gviz/tq?tqx=out:json` 19 | 20 | state.items = await fetch(url) 21 | .then(res => res.text()).then(text => JSON.parse(text.substr(47).slice(0, -2))) 22 | .then(json => joinInGroups(parseData(json))) 23 | 24 | state.isEmpty = !!state.items.length 25 | }, 26 | }, 27 | gettets: {}, 28 | } -------------------------------------------------------------------------------- /src/icons/index.js: -------------------------------------------------------------------------------- 1 | export { default as ArrowBackIcon } from './source/ArrowBackIcon.vue' 2 | export { default as BasketIcon } from './source/BasketIcon.vue' 3 | export { default as DrinkIcon } from './source/DrinkIcon.vue' 4 | export { default as HamburguerIcon } from './source/HamburguerIcon.vue' 5 | export { default as InstagramIcon } from './source/InstagramIcon.vue' 6 | export { default as KnifeForkIcon } from './source/KnifeForkIcon.vue' 7 | export { default as LogoIcon } from './source/LogoIcon.vue' 8 | export { default as MinusIcon } from './source/MinusIcon.vue' 9 | export { default as PhoneIcon } from './source/PhoneIcon.vue' 10 | export { default as PlusIcon } from './source/PlusIcon.vue' 11 | export { default as PizzaIcon } from './source/PizzaIcon.vue' 12 | export { default as TrashIcon } from './source/TrashIcon.vue' 13 | export { default as SendIcon } from './source/SendIcon.vue' 14 | export { default as WhatsappIcon } from './source/WhatsappIcon.vue' 15 | -------------------------------------------------------------------------------- /src/icons/source/KnifeForkIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/source/BasketIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "digital-menu", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "core-js": "^3.6.5", 12 | "vue": "^2.6.11", 13 | "vue-router": "^3.4.3", 14 | "vuex": "^3.5.1" 15 | }, 16 | "devDependencies": { 17 | "@vue/cli-plugin-babel": "~4.5.0", 18 | "@vue/cli-plugin-eslint": "~4.5.0", 19 | "@vue/cli-service": "~4.5.0", 20 | "babel-eslint": "^10.1.0", 21 | "eslint": "^6.7.2", 22 | "eslint-plugin-vue": "^6.2.2", 23 | "vue-template-compiler": "^2.6.11" 24 | }, 25 | "eslintConfig": { 26 | "root": true, 27 | "env": { 28 | "node": true 29 | }, 30 | "extends": [ 31 | "plugin:vue/essential", 32 | "eslint:recommended" 33 | ], 34 | "parserOptions": { 35 | "parser": "babel-eslint" 36 | }, 37 | "rules": {} 38 | }, 39 | "browserslist": [ 40 | "> 1%", 41 | "last 2 versions", 42 | "not dead" 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Daniel Rocha 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/pages/Home.vue: -------------------------------------------------------------------------------- 1 | 18 | 41 | 42 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 20 | 54 | -------------------------------------------------------------------------------- /src/components/source/Footer.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | 31 | -------------------------------------------------------------------------------- /src/icons/source/WhatsappIcon.vue: -------------------------------------------------------------------------------- 1 | 24 | -------------------------------------------------------------------------------- /src/store/modules/shoppingBasket.js: -------------------------------------------------------------------------------- 1 | import { LocalStorage } from '../../utils/index.js' 2 | 3 | 4 | export default { 5 | namespaced: true, 6 | 7 | state: { 8 | shoppingBasket: new Map(), 9 | volume: 0, 10 | setting: { 11 | storage: 'shoppingBasket', 12 | localStorage: null, 13 | } 14 | }, 15 | 16 | mutations: { 17 | 18 | async addItemToBasket(state, data) { 19 | let { item, quantity } = data 20 | quantity = parseInt(quantity) 21 | 22 | if(state.shoppingBasket.has(item?.nome) ){ 23 | quantity += state.shoppingBasket.get(item?.nome).quantity 24 | state.shoppingBasket.set(item?.nome, {item, quantity }) 25 | 26 | await LocalStorage.updateAll(state.setting, state.shoppingBasket ) 27 | 28 | }else { 29 | state.shoppingBasket.set(item?.nome, { item, quantity }) 30 | await LocalStorage.updateAll(state.setting, state.shoppingBasket ) 31 | } 32 | 33 | state.volume = state.shoppingBasket.size 34 | 35 | }, 36 | 37 | removeAll(state) { 38 | state.shoppingBasket.clear() 39 | state.volume = state.shoppingBasket.size 40 | LocalStorage.removeAll(state.setting) 41 | }, 42 | 43 | removeItemFromBasket(state, itemName) { 44 | state.shoppingBasket.delete(itemName) 45 | }, 46 | 47 | setLocalStorage(state, instance) { 48 | state.setting.localStorage = instance 49 | } 50 | }, 51 | 52 | actions: { 53 | 54 | loadShoppingBasket: async ({state}) => { 55 | state.shoppingBasket = await LocalStorage.findAll(state.setting) 56 | state.volume = state.shoppingBasket.size 57 | }, 58 | 59 | }, 60 | 61 | gettets: {}, 62 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![License](https://img.shields.io/github/license/dannrocha/digital-menu) 2 | ![Repo size](https://img.shields.io/github/repo-size/dannrocha/digital-menu) 3 | ![Last commit](https://img.shields.io/github/last-commit/dannRocha/digital-menu) 4 | ![Dev](https://img.shields.io/badge/daniel%20rocha-dev-green) 5 | 6 | # Digital Menu 7 | Cardápio online de fácil gerenciamento. Aplicação web para apresentar um cardápio de lanchonete de forma online e com redirecionamento dos pedidos para Whatsapp. O cardápio é gerenciado por uma planilha (Google Sheets), na qual mudanças na planilha refletem nos dados do cardápio. 8 | 9 | 10 | Cardápio: [Google SpreadSheet](https://docs.google.com/spreadsheets/d/1Hrhw7xC5NFxNyblD7aZ7afD1DFzHlSsQidav0e6Hshw/edit?usp=sharing) 11 | 12 | Página: https://pizzariacolosso.github.io/digital-menu/ 13 | 14 | ## Screenshot 15 | 16 |

17 | 18 | 19 | 20 |

21 | 22 |

23 | 24 | 25 | 26 |

27 | 28 | ## Observação 29 | Como não é usado uma API personalizada para aplicação, os dados do cardápio podem se torna inacessível caso o google remova ou altere a URL de obtenção dos dados. 30 | 31 | ## Project setup 32 | * :pushpin: *![docker@20.10.8](https://img.shields.io/badge/Docker@20.10.8-%230077B6.svg?&style=flat-square&logo=docker&logoColor=white&color=384d54&labelColor=0db7ed)* 33 | * :pushpin: *![docker-compose@1.29.2](https://img.shields.io/badge/Docker-Compose@1.29.2-%230077B6.svg?&style=flat-square&logo=docker&logoColor=white&color=384d54&labelColor=0db7ed)* 34 | 35 | ### Run 36 | 37 | ``` 38 | docker-compose up --build 39 | ``` 40 | -------------------------------------------------------------------------------- /src/icons/source/HamburguerIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/source/Loading.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/source/Header.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 47 | 48 | -------------------------------------------------------------------------------- /src/icons/source/DrinkIcon.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/Basket.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 70 | 71 | -------------------------------------------------------------------------------- /src/components/source/Card.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 64 | 65 | -------------------------------------------------------------------------------- /src/components/source/PopUp.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 72 | 73 | -------------------------------------------------------------------------------- /src/icons/source/LogoIcon.vue: -------------------------------------------------------------------------------- 1 | 1019 | --------------------------------------------------------------------------------