├── src
├── entities
│ ├── article
│ │ └── card
│ │ │ ├── types.ts
│ │ │ ├── index.ts
│ │ │ └── ui.vue
│ ├── modal
│ │ ├── index.ts
│ │ └── model
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── store.ts
│ ├── person
│ │ ├── index.ts
│ │ └── model
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── store.ts
│ ├── product
│ │ └── card
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── ui.vue
│ ├── screen
│ │ ├── index.ts
│ │ └── model
│ │ │ ├── types.ts
│ │ │ ├── index.ts
│ │ │ └── store.ts
│ └── catalog
│ │ ├── index.ts
│ │ └── model
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── store.ts
├── shims-vue.d.ts
├── pages
│ └── home
│ │ ├── index.ts
│ │ └── ui.vue
├── shared
│ ├── button
│ │ ├── index.ts
│ │ ├── button.spec.js
│ │ └── ui.vue
│ ├── logo
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── avatar
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── badge
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── content
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── field
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── rating
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── container
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── modal
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── typography
│ │ ├── index.ts
│ │ └── ui.vue
│ └── icon
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
├── features
│ ├── like
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── header
│ │ ├── navigation
│ │ │ ├── index.ts
│ │ │ └── ui.vue
│ │ ├── dropdown-menu
│ │ │ ├── index.ts
│ │ │ └── ui.vue
│ │ └── user-menu
│ │ │ ├── model
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── store.ts
│ │ │ ├── index.ts
│ │ │ └── ui.vue
│ ├── main-carousel
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── modals
│ │ └── modal-sign-in
│ │ │ ├── index.ts
│ │ │ └── ui.vue
│ └── special-offer
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
├── widgets
│ ├── footer
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── header
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── modals
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
│ ├── special-offers
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── article-cards
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
│ ├── bottom-tab-navigator
│ │ ├── index.ts
│ │ └── ui.vue
│ ├── shops-map
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
│ └── product-cards
│ │ ├── index.ts
│ │ ├── types.ts
│ │ └── ui.vue
├── app
│ ├── helpers
│ │ ├── index.ts
│ │ └── formatCurrency.ts
│ ├── logo.svg
│ ├── base.css
│ ├── stores
│ │ └── counter.ts
│ ├── router
│ │ └── index.ts
│ ├── App.vue
│ └── main.css
├── assets
│ ├── avatar.png
│ ├── article-1.png
│ ├── article-2.png
│ ├── article-3.png
│ ├── mock-map.png
│ ├── product-1.png
│ ├── slide-1-bg.png
│ ├── special-offer-1.png
│ ├── special-offer-2.png
│ ├── slide-1-bg-mobile.png
│ └── slide-1-bg-tablet.png
└── main.ts
├── env.d.ts
├── public
├── favicon.ico
└── footer-bg-pattern.png
├── .vscode
└── extensions.json
├── .prettierrc.json
├── tsconfig.vitest.json
├── tsconfig.json
├── tsconfig.app.json
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── vitest.config.ts
├── Dockerfile
├── .eslintrc.cjs
├── index.html
├── .github
└── workflows
│ └── build.yml
├── package.json
└── README.md
/src/entities/article/card/types.ts:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/shims-vue.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.vue';
--------------------------------------------------------------------------------
/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/pages/home/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Home } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/button/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Button } from './ui.vue';
--------------------------------------------------------------------------------
/src/shared/logo/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Logo } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/entities/modal/index.ts:
--------------------------------------------------------------------------------
1 | export { useModalStore } from './model';
2 |
3 |
--------------------------------------------------------------------------------
/src/entities/person/index.ts:
--------------------------------------------------------------------------------
1 | export { usePersonStore } from './model';
2 |
--------------------------------------------------------------------------------
/src/features/like/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Like } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/avatar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Avatar } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/badge/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Badge } from "./ui.vue";
2 |
--------------------------------------------------------------------------------
/src/shared/content/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Content } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/field/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Field } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/rating/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Rating } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/widgets/footer/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Footer } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/widgets/header/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Header } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/widgets/modals/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Modals } from "./ui.vue";
2 |
--------------------------------------------------------------------------------
/src/app/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export { formatCurrency } from "./formatCurrency";
2 |
--------------------------------------------------------------------------------
/src/entities/modal/model/index.ts:
--------------------------------------------------------------------------------
1 | export { useModalStore } from './store';
2 |
3 |
--------------------------------------------------------------------------------
/src/shared/container/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Container } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/shared/modal/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Modal } from './ui.vue';
2 |
3 |
--------------------------------------------------------------------------------
/src/shared/typography/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Typography } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/entities/article/card/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ArticleCard } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/entities/product/card/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ProductCard } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/entities/screen/index.ts:
--------------------------------------------------------------------------------
1 | export { useScreenStore, type Platform } from './model';
2 |
--------------------------------------------------------------------------------
/src/features/header/navigation/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Navigation } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/features/main-carousel/index.ts:
--------------------------------------------------------------------------------
1 | export { default as MainCarousel } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/widgets/special-offers/index.ts:
--------------------------------------------------------------------------------
1 | export { default as SpecialOffers } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/entities/catalog/index.ts:
--------------------------------------------------------------------------------
1 | export { useCatalogStore, type CatalogSection } from './model';
2 |
--------------------------------------------------------------------------------
/src/features/header/dropdown-menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DropdownMenu } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/features/modals/modal-sign-in/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ModalSignIn } from "./ui.vue";
2 |
--------------------------------------------------------------------------------
/src/widgets/article-cards/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ArticleCards } from './ui.vue';
2 |
3 |
--------------------------------------------------------------------------------
/src/assets/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/avatar.png
--------------------------------------------------------------------------------
/src/entities/modal/model/types.ts:
--------------------------------------------------------------------------------
1 | type ModalStore = string[];
2 |
3 | export { type ModalStore };
4 |
--------------------------------------------------------------------------------
/src/widgets/bottom-tab-navigator/index.ts:
--------------------------------------------------------------------------------
1 | export { default as BottomTabNavigator } from './ui.vue';
2 |
--------------------------------------------------------------------------------
/src/assets/article-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/article-1.png
--------------------------------------------------------------------------------
/src/assets/article-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/article-2.png
--------------------------------------------------------------------------------
/src/assets/article-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/article-3.png
--------------------------------------------------------------------------------
/src/assets/mock-map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/mock-map.png
--------------------------------------------------------------------------------
/src/assets/product-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/product-1.png
--------------------------------------------------------------------------------
/src/assets/slide-1-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/slide-1-bg.png
--------------------------------------------------------------------------------
/public/footer-bg-pattern.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/public/footer-bg-pattern.png
--------------------------------------------------------------------------------
/src/assets/special-offer-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/special-offer-1.png
--------------------------------------------------------------------------------
/src/assets/special-offer-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/special-offer-2.png
--------------------------------------------------------------------------------
/src/shared/icon/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Icon } from './ui.vue';
2 | export { type IconType } from './types';
3 |
--------------------------------------------------------------------------------
/src/widgets/shops-map/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ShopsMap } from './ui.vue';
2 | export { type Shop } from './types';
--------------------------------------------------------------------------------
/src/app/helpers/formatCurrency.ts:
--------------------------------------------------------------------------------
1 | const formatCurrency = (v: number) => v.toFixed(2);
2 |
3 | export { formatCurrency };
--------------------------------------------------------------------------------
/src/assets/slide-1-bg-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/slide-1-bg-mobile.png
--------------------------------------------------------------------------------
/src/assets/slide-1-bg-tablet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/etopipec/severyanochka/HEAD/src/assets/slide-1-bg-tablet.png
--------------------------------------------------------------------------------
/src/entities/person/model/index.ts:
--------------------------------------------------------------------------------
1 | export { usePersonStore } from './store';
2 | export { type Person } from './types';
3 |
--------------------------------------------------------------------------------
/src/entities/screen/model/types.ts:
--------------------------------------------------------------------------------
1 | type Platform = 'desktop' | 'tablet' | 'mobile';
2 |
3 | export { type Platform };
4 |
--------------------------------------------------------------------------------
/src/widgets/modals/types.ts:
--------------------------------------------------------------------------------
1 | interface ModalsProps {
2 | items: string[];
3 | }
4 |
5 | export { type ModalsProps };
6 |
--------------------------------------------------------------------------------
/src/entities/screen/model/index.ts:
--------------------------------------------------------------------------------
1 | export { useScreenStore } from './store';
2 | export { type Platform } from './types';
3 |
--------------------------------------------------------------------------------
/src/widgets/shops-map/types.ts:
--------------------------------------------------------------------------------
1 | type Shop = {
2 | name: string;
3 | checked: boolean;
4 | };
5 |
6 | export { type Shop };
--------------------------------------------------------------------------------
/src/entities/catalog/model/index.ts:
--------------------------------------------------------------------------------
1 | export { useCatalogStore } from './store';
2 | export { type CatalogSection } from './types';
3 |
--------------------------------------------------------------------------------
/src/features/header/user-menu/model/index.ts:
--------------------------------------------------------------------------------
1 | export { useUserMenuStore } from './store';
2 | export { type Menu } from './types';
3 |
--------------------------------------------------------------------------------
/src/features/special-offer/index.ts:
--------------------------------------------------------------------------------
1 | export { default as SpecialOffer } from './ui.vue';
2 | export { type Offer } from "./types";
3 |
--------------------------------------------------------------------------------
/src/entities/person/model/types.ts:
--------------------------------------------------------------------------------
1 | interface Person {
2 | name: string;
3 | avatar: string;
4 | }
5 |
6 | export { type Person };
7 |
--------------------------------------------------------------------------------
/src/widgets/product-cards/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ProductCards } from './ui.vue';
2 | export { type CardsProps, type Card } from './types';
3 |
--------------------------------------------------------------------------------
/src/features/header/user-menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default as UserMenu } from './ui.vue';
2 | export { useUserMenuStore, type Menu } from './model';
3 |
--------------------------------------------------------------------------------
/src/features/header/user-menu/model/types.ts:
--------------------------------------------------------------------------------
1 | type Menu = {
2 | label: string;
3 | link?: string;
4 | action?: string;
5 | }[];
6 |
7 | export { type Menu };
8 |
--------------------------------------------------------------------------------
/src/features/special-offer/types.ts:
--------------------------------------------------------------------------------
1 | interface Offer {
2 | title: string;
3 | description?: string;
4 | background: string;
5 | }
6 |
7 | export { type Offer };
8 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "Vue.volar",
4 | "Vue.vscode-typescript-vue-plugin",
5 | "dbaeumer.vscode-eslint",
6 | "esbenp.prettier-vscode"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/prettierrc",
3 | "semi": false,
4 | "tabWidth": 2,
5 | "singleQuote": true,
6 | "printWidth": 100,
7 | "trailingComma": "none"
8 | }
--------------------------------------------------------------------------------
/tsconfig.vitest.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.app.json",
3 | "exclude": [],
4 | "compilerOptions": {
5 | "composite": true,
6 | "lib": [],
7 | "types": ["node", "jsdom"]
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/features/modals/modal-sign-in/ui.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 | sign in
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/widgets/article-cards/types.ts:
--------------------------------------------------------------------------------
1 | interface ArticlesProps {
2 | info: {
3 | title: string;
4 | listLinkText: string;
5 | listLinkHref: string;
6 | };
7 | items: [];
8 | }
9 |
10 | export { type ArticlesProps };
11 |
12 |
--------------------------------------------------------------------------------
/src/entities/catalog/model/types.ts:
--------------------------------------------------------------------------------
1 | interface CatalogStore {
2 | sections: CatalogSection[];
3 | }
4 |
5 | interface CatalogSection {
6 | label: string;
7 | link: string;
8 | }
9 |
10 | export { type CatalogSection, type CatalogStore };
11 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | {
5 | "path": "./tsconfig.node.json"
6 | },
7 | {
8 | "path": "./tsconfig.app.json"
9 | },
10 | {
11 | "path": "./tsconfig.vitest.json"
12 | }
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/src/entities/product/card/types.ts:
--------------------------------------------------------------------------------
1 | interface Card {
2 | id: number;
3 | img: string;
4 | name: string;
5 | price: number;
6 | priceWithSale: number;
7 | count?: number;
8 | sale?: number;
9 | isLiked?: boolean;
10 | }
11 |
12 | export { type Card };
13 |
--------------------------------------------------------------------------------
/src/app/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/shared/icon/types.ts:
--------------------------------------------------------------------------------
1 | type IconType =
2 | 'menu' |
3 | 'favorite' |
4 | 'orders' |
5 | 'cart' |
6 | 'chevron' |
7 | 'insta' |
8 | 'vk' |
9 | 'fb' |
10 | 'ok' |
11 | 'phone' |
12 | 'login' |
13 | 'plus' |
14 | 'minus';
15 |
16 | export { type IconType };
17 |
--------------------------------------------------------------------------------
/src/widgets/product-cards/types.ts:
--------------------------------------------------------------------------------
1 | import { type Card } from "@/entities/product/card/types";
2 |
3 | interface CardsProps {
4 | info: {
5 | title: string;
6 | listLinkText: string;
7 | listLinkHref: string;
8 | };
9 | items: Card[];
10 | }
11 |
12 | export { type CardsProps, type Card };
13 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@vue/tsconfig/tsconfig.dom.json",
3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4 | "exclude": ["src/**/__tests__/*"],
5 | "compilerOptions": {
6 | "composite": true,
7 | "baseUrl": ".",
8 | "paths": {
9 | "@/*": ["./src/*"]
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/widgets/modals/ui.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/app/base.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | box-sizing: border-box;
5 | outline: none;
6 | font-family: 'Rubik', sans-serif;
7 | font-weight: 400;
8 | }
9 |
10 | body {
11 | background-color: var(--main-page-background);
12 | }
13 |
14 | ul, ol {
15 | list-style: none;
16 | }
17 |
18 | a {
19 | text-decoration: none;
20 | color: unset;
21 | }
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import 'vue3-carousel/dist/carousel.css';
2 | import '@/app/main.css';
3 |
4 | import { createApp } from 'vue';
5 | import { createPinia } from 'pinia';
6 |
7 | import App from '@/app/App.vue';
8 | import router from '@/app/router';
9 |
10 | const app = createApp(App);
11 |
12 | app.use(createPinia());
13 | app.use(router);
14 |
15 | app.mount('#app');
16 |
--------------------------------------------------------------------------------
/src/app/stores/counter.ts:
--------------------------------------------------------------------------------
1 | import { ref, computed } from 'vue'
2 | import { defineStore } from 'pinia'
3 |
4 | export const useCounterStore = defineStore('counter', () => {
5 | const count = ref(0)
6 | const doubleCount = computed(() => count.value * 2)
7 | function increment() {
8 | count.value++
9 | }
10 |
11 | return { count, doubleCount, increment }
12 | })
13 |
--------------------------------------------------------------------------------
/src/app/router/index.ts:
--------------------------------------------------------------------------------
1 | import { createRouter, createWebHistory } from 'vue-router'
2 | import { Home } from '@/pages/home';
3 |
4 | const router = createRouter({
5 | history: createWebHistory(import.meta.env.BASE_URL),
6 | routes: [
7 | {
8 | path: '/',
9 | name: 'home',
10 | component: Home,
11 | },
12 | ]
13 | })
14 |
15 | export default router
16 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'node:url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [
9 | vue(),
10 | ],
11 | resolve: {
12 | alias: {
13 | '@': fileURLToPath(new URL('./src', import.meta.url))
14 | }
15 | }
16 | })
17 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/node18/tsconfig.json",
3 | "include": [
4 | "vite.config.*",
5 | "vitest.config.*",
6 | "cypress.config.*",
7 | "nightwatch.conf.*",
8 | "playwright.config.*"
9 | ],
10 | "compilerOptions": {
11 | "composite": true,
12 | "module": "ESNext",
13 | "moduleResolution": "Bundler",
14 | "types": ["node"]
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/shared/modal/ui.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/shared/avatar/ui.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
![avatar]()
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | .DS_Store
12 | dist
13 | dist-ssr
14 | coverage
15 | *.local
16 |
17 | /cypress/videos/
18 | /cypress/screenshots/
19 |
20 | # Editor directories and files
21 | .vscode/*
22 | !.vscode/extensions.json
23 | .idea
24 | *.suo
25 | *.ntvs*
26 | *.njsproj
27 | *.sln
28 | *.sw?
29 |
--------------------------------------------------------------------------------
/src/shared/container/ui.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/vitest.config.ts:
--------------------------------------------------------------------------------
1 | import { fileURLToPath } from 'node:url'
2 | import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'
3 | import viteConfig from './vite.config'
4 |
5 | export default mergeConfig(
6 | viteConfig,
7 | defineConfig({
8 | test: {
9 | environment: 'jsdom',
10 | exclude: [...configDefaults.exclude, 'e2e/*'],
11 | root: fileURLToPath(new URL('./', import.meta.url))
12 | }
13 | })
14 | )
15 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine3.20 as build-stage
2 |
3 | WORKDIR /app
4 |
5 | RUN apk update \
6 | && apk add git \
7 | && git clone https://github.com/vadimkaKharitonenko/severyanochka.git . \
8 | && git pull
9 |
10 | COPY package*.json ./
11 | RUN npm install
12 | COPY . .
13 | RUN npm run build-only
14 |
15 | FROM nginx:stable-alpine as production-stage
16 | COPY --from=build-stage /app/dist /usr/share/nginx/html
17 | EXPOSE 80
18 | CMD ["nginx", "-g", "daemon off;"]
--------------------------------------------------------------------------------
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | /* eslint-env node */
2 | require('@rushstack/eslint-patch/modern-module-resolution')
3 |
4 | module.exports = {
5 | root: true,
6 | 'extends': [
7 | 'plugin:vue/vue3-essential',
8 | 'eslint:recommended',
9 | '@vue/eslint-config-typescript',
10 | '@vue/eslint-config-prettier/skip-formatting'
11 | ],
12 | parserOptions: {
13 | ecmaVersion: 'latest'
14 | },
15 | rules: {
16 | 'vue/multi-word-component-names': 'off',
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/features/header/user-menu/model/store.ts:
--------------------------------------------------------------------------------
1 | import { reactive } from 'vue';
2 | import { defineStore } from 'pinia';
3 | import { type Menu } from './types';
4 |
5 | export const useUserMenuStore = defineStore('user-menu', () => {
6 | let menu = reactive