initial commit

This commit is contained in:
Sergey Krylov 2023-04-30 16:37:12 +03:00
commit e1b4c2ed9d
128 changed files with 3950 additions and 0 deletions

37
.gitignore vendored Normal file
View File

@ -0,0 +1,37 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
.idea

26
index.ts Normal file
View File

@ -0,0 +1,26 @@
import express from 'express';
import cors from 'cors';
import * as path from 'path';
import apiRouter from './src/api';
import bodyParser from 'body-parser';
const app = express();
const port = 5000;
app.use(cors())
app.use('/static', express.static(path.join(__dirname, 'static')))
// app.use(express.static(path.join(__dirname, 'static')))
// @ts-ignore
app.use(bodyParser.raw({ type: 'application/soap+xml' }));
app.use(bodyParser.json({ limit: '20mb' }));
// app.use(express.urlencoded({ extended: false }));
// @ts-ignore
app.use(express.json());
app.use('/api', apiRouter)
app.listen(port, () => {
console.log(`Arkids backend app start on port ${port}`);
});

26
package.json Normal file
View File

@ -0,0 +1,26 @@
{
"name": "arkids-main-app-backend",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"@types/body-parser": "^1.19.2",
"@types/node": "^18.16.3",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"express": "^4.18.2",
"nodemon": "^2.0.22",
"ts-node": "^10.9.1",
"typescript": "^5.0.4",
"uuid": "^9.0.0"
},
"devDependencies": {
"@types/cors": "^2.8.13",
"@types/express": "types/express",
"@types/uuid": "^9.0.1"
},
"scripts": {
"dev": "nodemon index.ts",
"start": "ts-node --esm index.ts"
}
}

29
src/api/index.ts Normal file
View File

@ -0,0 +1,29 @@
import express, { Router } from 'express';
import { ApiRoute } from '../constants';
import hallsRouter from './routes/halls';
import questRouter from './routes/quests';
import rateRouter from './routes/rate';
import statisticsRouter from './routes/statistic';
import storiesRouter from './routes/stories';
import textRouter from './routes/text';
import infoRouter from './routes/info';
import breadcrumbsRouter from './routes/breadcrumbs';
import servicesRouter from './routes/services';
import faqRouter from './routes/faq';
const apiRouter = express.Router()
apiRouter.use(ApiRoute.BREADCRUMBS, breadcrumbsRouter)
apiRouter.use(ApiRoute.FAQ, faqRouter)
apiRouter.use(ApiRoute.INFO, infoRouter)
apiRouter.use(ApiRoute.SERVICES, servicesRouter)
apiRouter.use(ApiRoute.TEXT, textRouter)
apiRouter.use(ApiRoute.HALLS, hallsRouter)
apiRouter.use(ApiRoute.RATE, rateRouter)
apiRouter.use(ApiRoute.STORIES, storiesRouter)
apiRouter.use(ApiRoute.STATISTIC_INFO, statisticsRouter)
apiRouter.use(ApiRoute.QUESTS, questRouter)
export default apiRouter;

View File

@ -0,0 +1,57 @@
import { Request, Response } from 'express';
import { PAGE_LINK, PAGE_LINK_LABEL } from '../../../constants';
export type BreadcrumbsType = {
href?: string;
label: string;
};
const birthdayPageBreadcrumbs: BreadcrumbsType[] = [
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
{ href: PAGE_LINK.BIRTHDAY, label: PAGE_LINK_LABEL[PAGE_LINK.BIRTHDAY] },
];
const graduationPageBreadcrumbs: BreadcrumbsType[] = [
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
{ href: PAGE_LINK.GRADUATION, label: PAGE_LINK_LABEL[PAGE_LINK.GRADUATION] },
];
const outdoorsPageBreadcrumbs: BreadcrumbsType[] = [
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
{ href: PAGE_LINK.OUTDOORS, label: PAGE_LINK_LABEL[PAGE_LINK.OUTDOORS] },
];
const questsPageBreadcrumbs: BreadcrumbsType[] = [
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
{ href: PAGE_LINK.QUESTS, label: PAGE_LINK_LABEL[PAGE_LINK.QUESTS] },
];
export const getBreadcrumbs = (req: Request, res: Response) => {
// @ts-ignore
const {page} = req.body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayPageBreadcrumbs);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationPageBreadcrumbs);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsPageBreadcrumbs);
}
case PAGE_LINK.QUESTS: {
return res.status(200).json(questsPageBreadcrumbs);
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,10 @@
import express, { Request, Response } from 'express';
import { getBreadcrumbs } from './controller';
const router = express.Router()
router.post('/', (req: Request, res: Response) => {
return getBreadcrumbs(req, res);
})
export default router;

View File

@ -0,0 +1,93 @@
import { Request, Response } from 'express';
import { PAGE_LINK } from '../../../constants';
export type QuestionType = {
answer: string;
question: string;
};
const birthdayQuestions: QuestionType[] = [
{
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
question: 'Как забронировать зал для проведения Дня рождения?',
},
{
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
+ 'Мероприятие оплачивается на месте перед его началом.',
question: 'Как производится оплата мероприятия?',
},
{
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
question: 'Какое максимальное количество детей допустимо на празднике?',
},
];
const graduationQuestions: QuestionType[] = [
{
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
question: 'Как забронировать зал для проведения Дня рождения?',
},
{
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона.'
+ ' Мероприятие оплачивается на месте перед его началом.',
question: 'Как производится оплата мероприятия?',
},
{
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
question: 'Какое максимальное количество детей допустимо на празднике?',
},
];
const outdoorsQuestions: QuestionType[] = [
{
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
question: 'Как забронировать зал для проведения Дня рождения?',
},
{
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
+ 'Мероприятие оплачивается на месте перед его началом.',
question: 'Как производится оплата мероприятия?',
},
{
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
question: 'Какое максимальное количество детей допустимо на празднике?',
},
];
export const getFaq = (req: Request, res: Response) => {
// @ts-ignore
const { id, page } = req.body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayQuestions);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationQuestions);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsQuestions);
}
case PAGE_LINK.QUESTS: {
switch (id) {
case 'eger':
return res.status(200).json(outdoorsQuestions);
case 'mult':
return res.status(200).json(outdoorsQuestions);
case 'faraon':
return res.status(200).json(outdoorsQuestions);
default:
return res.status(404);
}
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,9 @@
import express, { Request, Response } from 'express';
import { getFaq } from './controller';
const router = express.Router()
router.post('/', (req: Request, res: Response) => {
return getFaq(req, res)
})
export default router;

View File

@ -0,0 +1,28 @@
import { Request, Response } from 'express';
import * as path from 'path';
const imageRootDir = 'static/images/information/halls/';
const Hall1Image = path.join(imageRootDir, 'hall1.jpg')
const Hall2Image = path.join(imageRootDir, 'hall2.jpg')
const Hall3Image = path.join(imageRootDir, 'hall3.jpg')
export type HallType = {
area: number;
img: {
alt: string;
src: string;
};
name: string;
};
const halls: HallType[] = [
{ area: 25, img: { alt: 'Средний Зал', src: Hall1Image }, name: 'Средний Зал' },
{ area: 50, img: { alt: 'Большой Зал', src: Hall2Image }, name: 'Большой Зал' },
{ area: 60, img: { alt: 'Зал Лофт', src: Hall3Image }, name: 'Зал Лофт' },
];
export const getHalls = (req: Request, res: Response) => {
return res.status(200).json(halls);
}

View File

@ -0,0 +1,9 @@
import express, { Request, Response } from 'express';
import { getHalls } from './controller';
const hallsRouter = express.Router()
hallsRouter.get('/', (req: Request, res: Response) => {
return getHalls(req, res)
})
export default hallsRouter;

View File

@ -0,0 +1,25 @@
import { Request, Response } from 'express';
import { PAGE_LINK } from '../../../constants';
const videoLink = 'https://www.youtube.com/watch?v=VqWkQCRsKD0';
type HomeInfo = {
video: string;
};
type ReturnInfoType = HomeInfo;
export const getInfo = (req: Request, res: Response) => {
// @ts-ignore
const body = req.body;
const { page } = body;
switch (page) {
case PAGE_LINK.HOME:
return res.status(200).json({ video: videoLink });
default:
return res.status(404);
}
}

View File

@ -0,0 +1,10 @@
import express, { Request, Response } from 'express';
import { getInfo } from './controller';
const router = express.Router()
router.post('/', (req: Request, res: Response) => {
return getInfo(req, res);
})
export default router;

View File

@ -0,0 +1,432 @@
import { Request, Response } from 'express';
import * as path from 'path';
import { COLORS, ColorVariant } from '../../../constants';
import { StoryType } from '../stories/controller';
import {v4 as uuid} from 'uuid';
const imageRootDir = 'static/images/quests/';
const egerFeedbackImage = path.join(imageRootDir, 'stories/eger/desktop/feedback.png');
const egerGalleryImage = path.join(imageRootDir, 'stories/eger/desktop/gallery.png');
const egerPlotImage = path.join(imageRootDir, 'stories/eger/desktop/plot.png');
const egerFeedbackMobileImage = path.join(imageRootDir, 'stories/eger/mobile/feedback.png');
const egerGalleryMobileImage = path.join(imageRootDir, 'stories/eger/mobile/gallery.png');
const egerPlotMobileImage = path.join(imageRootDir, 'stories/eger/mobile/plot.png');
const egerBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/eger/desktop/background.png')
const egerBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/eger/mobile/background.png')
const egerCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/eger-card.png')
const egerCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/eger-card.png')
const faraonFeedbackImage = path.join(imageRootDir, 'stories/faraon/desktop/feedback.png');
const faraonGalleryImage = path.join(imageRootDir, 'stories/faraon/desktop/gallery.png');
const faraonPlotImage = path.join(imageRootDir, 'stories/faraon/desktop/plot.png');
const faraonFeedbackMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/feedback.png');
const faraonGalleryMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/gallery.png');
const faraonPlotMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/plot.png');
const faraonBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/faraon/desktop/background.png')
const faraonBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/faraon/mobile/background.png')
const faraonCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/faraon-card.png')
const faraonCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/faraon-card.png')
const multFeedbackImage = path.join(imageRootDir, '/stories/mult/desktop/feedback.png');
const multGalleryImage = path.join(imageRootDir, '/stories/mult/desktop/gallery.png');
const multPlotImage = path.join(imageRootDir, '/stories/mult/desktop/plot.png');
const multFeedbackMobileImage = path.join(imageRootDir, '/stories/mult/mobile/feedback.png');
const multGalleryMobileImage = path.join(imageRootDir, '/stories/mult/mobile/gallery.png');
const multPlotMobileImage = path.join(imageRootDir, '/stories/mult/mobile/plot.png');
const multBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/mult/desktop/background.png')
const multBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/mult/mobile/background.png')
const multCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/mult-card.png')
const multCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/mult-card.png')
export type QuestItemType = {
age: {
styles?: object;
text: string;
};
backgrounds?: {
mobileSrc: string;
src: string;
};
cardBgImg: {
mobileSrc: string;
src: string;
};
description: string;
id: string;
labels: {
items: {
mark?: true;
markMobile?: true;
text: string;
}[];
styles?: object;
};
partySize: {
max: number;
min: number;
styles?: object;
};
price: number;
rating: number;
statisticsBackground: string;
stories?: StoryType[];
time: {
styles?: object;
text: string;
};
title: {
styles?: object;
text: string;
};
type: {
styles?: object;
text: string;
};
};
const egerStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Сюжет',
src: egerPlotImage,
},
imgMobile: {
alt: 'Сюжет',
src: egerPlotMobileImage,
},
modal: {
type: 'questPlot',
},
title: 'Сюжет',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: egerFeedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: egerFeedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: egerGalleryImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: egerGalleryMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\\n и видео',
},
];
export const egerQuest: QuestItemType = {
age: {
text: '10+',
},
backgrounds: {
mobileSrc: egerBackgroundMobileImage,
src: egerBackgroundDesktopImage,
},
cardBgImg: {
mobileSrc: egerCardBackgroundMobileImage,
src: egerCardBackgroundDesktopImage,
},
description: 'Команда попадает в дом лесника с множеством спецэффектов и скрытых ходов. '
+ 'Есть возможность выбрать уровень сложности: от детского до самого страшного',
id: 'eger',
labels: {
items: [
{ text: 'страшный' },
{ mark: true, markMobile: true, text: 'для большой компании' },
{ mark: true, text: 'дымовые и световые спецэффекты' },
{ text: 'уровни с актёрами' },
{ mark: true, markMobile: true, text: 'подойдёт детям' },
{ mark: true, text: 'квест на день рождения' },
{ mark: true, markMobile: true, text: 'подвижный' },
],
},
partySize: {
max: 12,
min: 2,
},
price: 3500,
rating: 230,
statisticsBackground: COLORS[ColorVariant.GRADIENT_PERI4],
stories: egerStories,
time: {
text: '60 минут',
},
title: {
styles: {
color: '#fff',
fontFamily: 'DwarvenStonecraftCyr',
fontSize: 45,
},
text: 'Егерь',
},
type: {
text: 'квест\\n с актёрами',
},
};
const faraonStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Сюжет',
src: faraonPlotImage,
},
imgMobile: {
alt: 'Сюжет',
src: faraonPlotMobileImage,
},
modal: {
type: 'questPlot',
},
title: 'Сюжет',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: faraonFeedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: faraonFeedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: faraonGalleryImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: faraonGalleryMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\\n и видео',
},
];
export const faraonQuest: QuestItemType = {
age: {
styles: {
borderColor: COLORS[ColorVariant.VERI_PERI],
color: COLORS[ColorVariant.VERI_PERI],
},
text: '5+',
},
backgrounds: {
mobileSrc: faraonBackgroundMobileImage,
src: faraonBackgroundDesktopImage,
},
cardBgImg: {
mobileSrc: faraonCardBackgroundMobileImage,
src: faraonCardBackgroundDesktopImage,
},
description: 'Команда попадает в пирамиду: тоннели, лабиринты, спуски и подъёмы, продуманная '
+ 'электроника и задания как в настоящем фильме про Египет',
id: 'faraon',
labels: {
items: [
{ text: 'древний египет' },
{ mark: true, markMobile: true, text: 'уровни с актёрами' },
{ mark: true, text: 'логический квест' },
{ mark: true, markMobile: true, text: 'подойдёт детям' },
{ text: 'подвижный' },
{ mark: true, markMobile: true, text: 'для большой компании' },
{ mark: true, text: 'квест на день рождения' },
],
styles: {
color: COLORS[ColorVariant.VERI_PERI],
},
},
partySize: {
max: 15,
min: 6,
styles: {
borderColor: COLORS[ColorVariant.VERI_PERI],
color: COLORS[ColorVariant.VERI_PERI],
},
},
price: 4500,
rating: 230,
statisticsBackground: COLORS[ColorVariant.GRADIENT_ORANGE],
stories: faraonStories,
time: {
styles: {
borderColor: COLORS[ColorVariant.VERI_PERI],
color: COLORS[ColorVariant.VERI_PERI],
},
text: '60 минут',
},
title: {
styles: {
border: '3px #fff',
color: 'linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)',
fontFamily: 'Angry',
fontSize: 45,
},
text: 'Фараон',
},
type: {
styles: {
color: COLORS[ColorVariant.VERI_PERI],
},
text: 'экшн-квест',
},
};
const stories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Сюжет',
src: multPlotImage,
},
imgMobile: {
alt: 'Сюжет',
src: multPlotMobileImage,
},
modal: {
type: 'questPlot',
},
title: 'Сюжет',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: multFeedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: multFeedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: multGalleryImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: multGalleryMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\\n и видео',
},
];
export const multQuest: QuestItemType = {
age: {
text: '5+',
},
backgrounds: {
mobileSrc: multBackgroundMobileImage,
src: multBackgroundDesktopImage,
},
cardBgImg: {
mobileSrc: multCardBackgroundMobileImage,
src: multCardBackgroundDesktopImage,
},
description: 'Команда попадает в мультвселенную, где собраны самые популярные сюжеты мультфильмов и детские герои: '
+ 'Гравити Фолз, Алиса, Миньоны и Холодное сердце',
id: 'mult',
labels: {
items: [
{ text: 'детский квест' },
{ mark: true, markMobile: true, text: 'с сопровождающим' },
{ mark: true, text: 'логический квест' },
{ mark: true, markMobile: true, text: 'подойдёт детям' },
{ text: 'подвижный' },
{ mark: true, markMobile: true, text: 'для большой компании' },
{ mark: true, text: 'квест на день рождения' },
],
},
partySize: {
max: 60,
min: 3,
},
price: 7500,
rating: 230,
statisticsBackground: COLORS[ColorVariant.GRADIENT_GREEN],
stories,
time: {
text: '60 минут',
},
title: {
styles: {
border: '4px #fff',
color: 'linear-gradient(134.56deg, #FFF500 11.78%, #FF3399 84.81%)',
fontFamily: 'Airfool',
fontSize: 54,
},
text: 'Мульт',
},
type: {
text: 'детский квест',
},
};
export const getOne = (req: Request, res: Response) => {
const {id} = req.params;
switch (id) {
case 'eger':
return res.status(200).json(egerQuest);
case 'faraon':
return res.status(200).json(faraonQuest);
case 'mult':
return res.status(200).json(multQuest);
default:
return res.status(404);
}
}
export const getAll = (req: Request, res: Response) => {
return res.status(200).json([
egerQuest,
faraonQuest,
multQuest,
])
}

View File

@ -0,0 +1,14 @@
import express, { Request, Response } from 'express';
import { getAll, getOne } from './controller';
const questRouter = express.Router()
questRouter.get('/', (req: Request, res: Response) => {
return getAll(req, res);
})
questRouter.get('/:id', (req: Request, res: Response) => {
return getOne(req, res);
})
export default questRouter;

View File

@ -0,0 +1,532 @@
import { Request, Response } from 'express';
import * as path from 'path';
import { PAGE_LINK, SERVICE } from '../../../constants';
const imageRootDir = 'static/images/rate/';
const BaseImg = path.join(imageRootDir, 'base.png');
const PremiumImg = path.join(imageRootDir, 'premium.png');
const StandartImg = path.join(imageRootDir, 'standart.png');
const VipImg = path.join(imageRootDir, 'vip.png');
export type SingleItemServiceType = {
enable: boolean;
price?: number;
startPrice?: number;
value?: string;
};
export type ItemServiceType = {
[name: string]: SingleItemServiceType;
};
export type RateItemType = {
id: string;
img: {
alt: string;
height?: number;
src: string;
width?: number;
};
maxPeople: number;
overpayment: number;
price?: number;
pricePerPerson?: number;
services: ItemServiceType;
title: string;
};
const birthdayPageRate: RateItemType[] = [
{
id: 'base',
img: {
alt: 'Базовый',
src: BaseImg,
},
maxPeople: 6,
overpayment: 500,
price: 9900,
services: {
[SERVICE.ANIMATOR]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: false,
price: 1000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.HALL]: {
enable: true,
value: '1,5 часа',
},
[SERVICE.MASTERCLASS]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOS]: {
enable: false,
price: 1000,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: false,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: false,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Базовый',
},
{
id: 'standart',
img: {
alt: 'Стандарт',
src: StandartImg,
},
maxPeople: 10,
overpayment: 500,
price: 13900,
services: {
[SERVICE.ANIMATOR]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: false,
price: 1000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.HALL]: {
enable: true,
value: '2 часа',
},
[SERVICE.MASTERCLASS]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOS]: {
enable: true,
price: 1000,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: false,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Стандарт',
},
{
id: 'premium',
img: {
alt: 'Премиум',
src: PremiumImg,
},
maxPeople: 12,
overpayment: 500,
price: 19900,
services: {
[SERVICE.ANIMATOR]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: false,
price: 1000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.HALL]: {
enable: true,
value: '3 часа',
},
[SERVICE.MASTERCLASS]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOS]: {
enable: true,
price: 1000,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: true,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Премиум',
},
{
id: 'vip',
img: {
alt: 'VIP',
src: VipImg,
},
maxPeople: 20,
overpayment: 500,
price: 29900,
services: {
[SERVICE.ANIMATOR]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: true,
price: 1000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.HALL]: {
enable: true,
value: '4 часа',
},
[SERVICE.MASTERCLASS]: {
enable: true,
startPrice: 1000,
},
[SERVICE.PHOTOS]: {
enable: true,
price: 1000,
},
[SERVICE.QUEST]: {
enable: true,
value: '2 квеста',
},
[SERVICE.SCREENWRITER]: {
enable: true,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Вип',
},
];
const graduationPageRate: RateItemType[] = [
{
id: 'base',
img: {
alt: 'Базовый',
src: BaseImg,
},
maxPeople: 6,
overpayment: 500,
pricePerPerson: 1390,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: false,
price: 4000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.DIPLOMA]: {
enable: true,
},
[SERVICE.FACE_PAINTING]: {
enable: false,
startPrice: 4900,
},
[SERVICE.HALL]: {
enable: true,
value: '1,5 часа',
},
[SERVICE.MASTERCLASS]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: false,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: false,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Базовый',
},
{
id: 'standart',
img: {
alt: 'Стандарт',
src: StandartImg,
},
maxPeople: 10,
overpayment: 500,
pricePerPerson: 1990,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: false,
price: 4000,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.DIPLOMA]: {
enable: true,
},
[SERVICE.FACE_PAINTING]: {
enable: false,
startPrice: 4900,
},
[SERVICE.HALL]: {
enable: true,
value: '2 часа',
},
[SERVICE.MASTERCLASS]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: true,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Стандарт',
},
{
id: 'premium',
img: {
alt: 'Премиум',
src: PremiumImg,
},
maxPeople: 12,
overpayment: 500,
pricePerPerson: 2990,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.CRYO_SHOW]: {
enable: true,
},
[SERVICE.DECORATION]: {
enable: true,
},
[SERVICE.DIPLOMA]: {
enable: true,
},
[SERVICE.FACE_PAINTING]: {
enable: true,
},
[SERVICE.HALL]: {
enable: true,
value: '3 часа',
},
[SERVICE.MASTERCLASS]: {
enable: true,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SCREENWRITER]: {
enable: true,
price: 1000,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TABLEWARE_FESTIVE]: {
enable: true,
},
},
title: 'Премиум',
},
];
const outdoorsPageRate: RateItemType[] = [
{
id: 'base',
img: {
alt: 'Базовый',
src: BaseImg,
},
maxPeople: 6,
overpayment: 500,
price: 9900,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.DURATION]: {
enable: true,
value: '2 часа',
},
[SERVICE.FACE_PAINTING]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SHOW_DISCO]: {
enable: false,
price: 4000,
},
[SERVICE.TEAM_BUILDING]: {
enable: true,
},
},
title: 'Базовый',
},
{
id: 'standart',
img: {
alt: 'Стандарт',
src: StandartImg,
},
maxPeople: 10,
overpayment: 500,
price: 13900,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.DURATION]: {
enable: true,
value: '3 часа',
},
[SERVICE.FACE_PAINTING]: {
enable: false,
startPrice: 4900,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TEAM_BUILDING]: {
enable: true,
},
},
title: 'Стандарт',
},
{
id: 'premium',
img: {
alt: 'Премиум',
src: PremiumImg,
},
maxPeople: 12,
overpayment: 500,
price: 19900,
services: {
[SERVICE.ANIMATION]: {
enable: true,
},
[SERVICE.DURATION]: {
enable: true,
value: '4 часа',
},
[SERVICE.FACE_PAINTING]: {
enable: true,
},
[SERVICE.PHOTOGRAPHER]: {
enable: true,
},
[SERVICE.QUEST]: {
enable: true,
},
[SERVICE.SHOW_DISCO]: {
enable: true,
price: 4000,
},
[SERVICE.TEAM_BUILDING]: {
enable: true,
},
},
title: 'Премиум',
},
];
export const getRate = (req: Request, res: Response) => {
// @ts-ignore
const {page} = req.body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayPageRate);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationPageRate);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsPageRate);
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,10 @@
import express, { Request, Response } from 'express';
import { getRate } from './controller';
const rateRouter = express.Router()
rateRouter.post('/', (req: Request, res: Response) => {
return getRate(req, res);
})
export default rateRouter;

View File

@ -0,0 +1,64 @@
import { Request, Response } from 'express';
import { PAGE_LINK, SERVICE, servicesList, ServiceType } from '../../../constants';
const birthdayPageServices: ServiceType[] = [
servicesList[SERVICE.QUEST],
servicesList[SERVICE.HALL],
servicesList[SERVICE.ANIMATOR],
servicesList[SERVICE.DECORATION],
servicesList[SERVICE.TABLEWARE_FESTIVE],
servicesList[SERVICE.PHOTOS],
servicesList[SERVICE.SHOW_DISCO],
servicesList[SERVICE.SCREENWRITER],
servicesList[SERVICE.MASTERCLASS],
servicesList[SERVICE.CRYO_SHOW],
];
const graduationPageServices: ServiceType[] = [
servicesList[SERVICE.QUEST],
servicesList[SERVICE.HALL],
servicesList[SERVICE.ANIMATION],
servicesList[SERVICE.PHOTOGRAPHER],
servicesList[SERVICE.DECORATION],
servicesList[SERVICE.TABLEWARE_FESTIVE],
servicesList[SERVICE.DIPLOMA],
servicesList[SERVICE.SHOW_DISCO],
servicesList[SERVICE.SCREENWRITER],
servicesList[SERVICE.MASTERCLASS],
servicesList[SERVICE.FACE_PAINTING],
servicesList[SERVICE.CRYO_SHOW],
];
const outdoorsPageServices: ServiceType[] = [
servicesList[SERVICE.QUEST],
servicesList[SERVICE.DURATION],
servicesList[SERVICE.ANIMATION],
servicesList[SERVICE.PHOTOGRAPHER],
servicesList[SERVICE.TEAM_BUILDING],
servicesList[SERVICE.SHOW_DISCO],
servicesList[SERVICE.FACE_PAINTING],
];
export const getServices = (req: Request, res: Response) => {
// @ts-ignore
const {page} = req.body;
// @ts-ignore
console.log('Body', req.body);
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayPageServices);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationPageServices);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsPageServices);
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,11 @@
import express, { Request, Response } from 'express';
import {
getServices } from './controller';
const router = express.Router()
router.post('/', (req: Request, res: Response) => {
return getServices(req, res);
})
export default router;

View File

@ -0,0 +1,939 @@
import { Request, Response } from 'express';
import * as path from 'path';
import { PAGE_LINK } from '../../../constants';
const imageRootDir = 'static/images/information/statistics';
const DecorationDesktopImg = path.join(imageRootDir, 'desktop/decoration.png');
const DiplomaDesktopImg = path.join(imageRootDir, 'desktop/graduation/diploma.png');
const KidsDesktopImg = path.join(imageRootDir, 'desktop/kids.png');
const LikeDesktopImg = path.join(imageRootDir, 'desktop/like.png');
const StatDecorDesktopImg = path.join(imageRootDir, 'desktop/outdoors/decoration.png');
const StatScooterDesktopImg = path.join(imageRootDir, 'desktop/outdoors/scooter.png');
const PinataDesktopImg = path.join(imageRootDir, 'desktop/pinata.png');
const ProgramsDesktopImg = path.join(imageRootDir, 'desktop/programms.png');
const BooksDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/books.png');
const KeysDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/keys.png');
const MapDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/map.png');
const RateDesktopImg = path.join(imageRootDir, 'desktop/rate.png');
const StarDesktopImg = path.join(imageRootDir, 'desktop/star.png');
const CupMobileImg = path.join(imageRootDir, 'mobile/cup.png');
const DecorationMobileImg = path.join(imageRootDir, 'mobile/decoration.png');
const DiplomaMobileImg = path.join(imageRootDir, 'mobile/graduation/diploma.png');
const KidsMobileImg = path.join(imageRootDir, 'mobile/kids.png');
const Kids2MobileImg = path.join(imageRootDir, 'mobile/kids2.png');
const LikeMobileImg = path.join(imageRootDir, 'mobile/like.png');
const StatDecorMobileImg = path.join(imageRootDir, 'mobile/outdoors/decoration.png');
const StatScooterMobileImg = path.join(imageRootDir, 'mobile/outdoors/scooter.png');
const PinataMobileImg = path.join(imageRootDir, 'mobile/pinata.png');
const ProgramsMobileImg = path.join(imageRootDir, 'mobile/programms.png');
const BooksMobileImg = path.join(imageRootDir, 'mobile/quests/eger/books.png');
const KeysMobileImg = path.join(imageRootDir, 'mobile/quests/eger/keys.png');
const MapMobileImg = path.join(imageRootDir, 'mobile/quests/eger/map.png');
const RateMobileImg = path.join(imageRootDir, 'mobile/rate.png');
const StarMobileImg = path.join(imageRootDir, 'mobile/star.png');
export type StatisticsItem = {
img?: {
alt: string;
mobilePosition?: {
bottom?: number;
left?: number;
right?: number;
top?: number;
};
mobileSrc?: string;
position?: {
bottom?: number;
left?: number;
right?: number;
top?: number;
};
src: string;
height: number;
mobileHeight?: number;
mobileWidth?: number;
width: number;
};
mobileOrder?: number;
mobileText?: string;
order?: number;
size: {
sm: number | 'auto';
width: number | 'auto';
xs: number;
};
text: string;
title: string;
};
const birthdayItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'combo',
mobilePosition: {
right: 12,
top: -10,
},
mobileSrc: RateMobileImg,
mobileHeight: 106,
mobileWidth: 60,
position: {
right: 22,
top: 15,
},
src: RateDesktopImg,
width: 80,
height: 90
},
size: {
sm: 2,
width: 130,
xs: 5,
},
text: 'комбо для\\n лучшего праздника',
title: 'Выгодные',
},
{
img: {
alt: 'programs',
mobilePosition: {
right: 10,
top: -20,
},
mobileSrc: ProgramsMobileImg,
mobileHeight: 84,
mobileWidth: 110,
position: {
right: 0,
top: 15,
},
src: ProgramsDesktopImg,
width: 72,
height: 96
},
size: {
sm: 2,
width: 210,
xs: 6,
},
text: 'индивидуальные программы',
title: 'Тематические',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 10,
top: 10,
},
mobileSrc: DecorationMobileImg,
mobileHeight: 116,
mobileWidth: 90,
position: {
right: 35,
top: 15,
},
src: DecorationDesktopImg,
width: 106,
height: 80
},
size: {
sm: 2,
width: 180,
xs: 5,
},
text: 'украшенные\\n и просторные',
title: 'Залы',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 26,
top: -10,
},
mobileSrc: KidsMobileImg,
mobileHeight: 108,
mobileWidth: 74,
position: {
right: -10,
top: 16,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
mobileText: 'для детей разных возрастов',
size: {
sm: 2,
width: 160,
xs: 6,
},
text: 'для детей\\n разных возрастов',
title: 'Развлечения',
},
];
const homeItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'pinata',
mobilePosition: {
left: 37,
top: -40,
},
mobileSrc: PinataMobileImg,
mobileHeight: 131,
mobileWidth: 128,
src: PinataDesktopImg,
width: 123,
height: 120
},
size: {
sm: 2,
width: 150,
xs: 5,
},
text: 'праздников\\n проведено',
title: '5700 +',
},
{
img: {
alt: 'star',
mobilePosition: {
right: 6,
top: -20,
},
mobileSrc: StarMobileImg,
mobileHeight: 112,
mobileWidth: 112,
position: {
right: 35,
top: 15,
},
src: StarDesktopImg,
width: 66,
height: 66
},
size: {
sm: 2,
width: 190,
xs: 6,
},
text: 'отзывы клиентов\\n на Яндекс',
title: '5 звёзд',
},
{
img: {
alt: 'like',
mobilePosition: {
right: 17,
top: -14,
},
mobileSrc: LikeMobileImg,
mobileHeight: 89,
mobileWidth: 87,
position: {
right: 5,
top: 15,
},
src: LikeDesktopImg,
width: 76,
height: 72
},
size: {
sm: 2,
width: 150,
xs: 5,
},
text: 'цены и гибкий\\n подход к клиенту',
title: 'Выгодные',
},
{
img: {
alt: 'cup',
mobilePosition: {
right: 3,
top: -29,
},
src: CupMobileImg,
height: 101,
width: 101,
mobileHeight: 131,
mobileWidth: 131
},
size: {
sm: 2,
width: 190,
xs: 6,
},
text: 'успешной работы\\n в сфере развлечений',
title: '6 лет',
},
];
const graduationItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру в сфере развлечений',
},
{
img: {
alt: 'combo',
mobilePosition: {
left: 12,
top: -10,
},
mobileSrc: RateMobileImg,
mobileHeight: 106,
mobileWidth: 60,
position: {
right: 22,
top: 5,
},
src: RateDesktopImg,
width: 80,
height: 90
},
size: {
sm: 2,
width: 130,
xs: 5,
},
text: 'комбо для лучшего праздника',
title: 'Выгодные',
},
{
img: {
alt: 'diploma',
mobilePosition: {
right: 10,
top: -10,
},
mobileSrc: DiplomaMobileImg,
mobileHeight: 90,
mobileWidth: 100,
position: {
right: 22,
top: 15,
},
src: DiplomaDesktopImg,
width: 76,
height: 85
},
size: {
sm: 2,
width: 210,
xs: 6,
},
text: 'индивидуальных\\n дипломов',
title: 'Вручение',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 10,
top: 10,
},
mobileSrc: DecorationMobileImg,
mobileHeight: 116,
mobileWidth: 90,
position: {
right: 35,
top: 10,
},
src: DecorationDesktopImg,
width: 106,
height: 80
},
size: {
sm: 2,
width: 180,
xs: 5,
},
text: 'украшенные и просторные',
title: 'Залы',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 10,
top: -10,
},
mobileSrc: KidsMobileImg,
mobileHeight: 108,
mobileWidth: 74,
position: {
right: -10,
top: 15,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
size: {
sm: 2,
width: 160,
xs: 6,
},
text: 'для больших\\n команд',
title: 'Квесты',
},
];
const outdoorsItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'combo',
mobilePosition: {
left: 12,
top: -10,
},
mobileSrc: RateMobileImg,
mobileHeight: 106,
mobileWidth: 60,
position: {
right: 22,
top: 5,
},
src: RateDesktopImg,
width: 80,
height: 90
},
size: {
sm: 2,
width: 130,
xs: 5,
},
text: 'комбо для\\n лучшего праздника',
title: 'Выгодные',
},
{
img: {
alt: 'programs',
mobilePosition: {
right: 10,
top: -10,
},
mobileSrc: StatScooterMobileImg,
mobileHeight: 116,
mobileWidth: 114,
position: {
right: 22,
top: 15,
},
src: StatScooterDesktopImg,
width: 94,
height: 98
},
size: {
sm: 2,
width: 210,
xs: 6,
},
text: 'по Москве\\n и Московской области',
title: 'Выезд',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 14,
top: 10,
},
mobileSrc: StatDecorMobileImg,
mobileHeight: 76,
mobileWidth: 136,
position: {
right: 35,
top: 10,
},
src: StatDecorDesktopImg,
width: 60,
height: 108
},
size: {
sm: 2,
width: 180,
xs: 5,
},
text: 'реквизит\\n на заказ',
title: 'Проф',
},
{
img: {
alt: 'kids',
mobilePosition: {
left: 28,
top: -10,
},
mobileSrc: KidsMobileImg,
mobileHeight: 108,
mobileWidth: 74,
position: {
right: -10,
top: 15,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
size: {
sm: 2,
width: 160,
xs: 6,
},
text: 'для детей\\n разных возрастов',
title: 'Развлечения',
},
];
const egerQuestItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 15,
top: -20,
},
mobileSrc: Kids2MobileImg,
mobileHeight: 106,
mobileWidth: 110,
position: {
right: 22,
top: 20,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
mobileOrder: 1,
order: 1,
size: {
sm: 2,
width: 200,
xs: 5,
},
text: 'для детей\\n разных возрастов',
title: 'Задания',
},
{
img: {
alt: 'programs',
mobilePosition: {
right: -20,
top: 5,
},
mobileSrc: BooksMobileImg,
mobileHeight: 116,
mobileWidth: 122,
position: {
right: 22,
top: 15,
},
src: BooksDesktopImg,
width: 109,
height: 90
},
mobileOrder: 4,
order: 2,
size: {
sm: 2,
width: 180,
xs: 6,
},
text: 'сюжет\\n каждый год',
title: 'Новый',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 14,
top: 10,
},
mobileSrc: MapMobileImg,
mobileHeight: 68,
mobileWidth: 94,
position: {
right: 35,
top: 10,
},
src: MapDesktopImg,
width: 69,
height: 94
},
mobileOrder: 3,
order: 3,
size: {
sm: 2,
width: 160,
xs: 5,
},
text: 'различных\\n локаций',
title: 'Шесть',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 0,
top: -15,
},
mobileSrc: KeysMobileImg,
mobileHeight: 64,
mobileWidth: 94,
position: {
right: 30,
top: 15,
},
src: KeysDesktopImg,
width: 69,
height: 94
},
mobileOrder: 2,
order: 4,
size: {
sm: 2,
width: 140,
xs: 6,
},
text: 'система\\n бронирования',
title: 'Быстрая',
},
];
const faraonQuestItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 15,
top: -20,
},
mobileSrc: Kids2MobileImg,
mobileHeight: 106,
mobileWidth: 110,
position: {
right: 22,
top: 20,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
mobileOrder: 1,
order: 1,
size: {
sm: 2,
width: 200,
xs: 5,
},
text: 'для детей\\n разных возрастов',
title: 'Задания',
},
{
img: {
alt: 'programs',
mobilePosition: {
right: -20,
top: 5,
},
mobileSrc: BooksMobileImg,
mobileHeight: 116,
mobileWidth: 122,
position: {
right: 22,
top: 15,
},
src: BooksDesktopImg,
width: 109,
height: 90
},
mobileOrder: 4,
order: 2,
size: {
sm: 2,
width: 180,
xs: 6,
},
text: 'сюжет\\n каждый год',
title: 'Новый',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 14,
top: 10,
},
mobileSrc: MapMobileImg,
mobileHeight: 68,
mobileWidth: 94,
position: {
right: 35,
top: 10,
},
src: MapDesktopImg,
width: 69,
height: 94
},
mobileOrder: 3,
order: 3,
size: {
sm: 2,
width: 160,
xs: 5,
},
text: 'различных\\n локаций',
title: 'Шесть',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 0,
top: -15,
},
mobileSrc: KeysMobileImg,
mobileHeight: 64,
mobileWidth: 94,
position: {
right: 30,
top: 15,
},
src: KeysDesktopImg,
width: 69,
height: 94
},
mobileOrder: 2,
order: 4,
size: {
sm: 2,
width: 140,
xs: 6,
},
text: 'система\\n бронирования',
title: 'Быстрая',
},
];
const multQuestItems: StatisticsItem[] = [
{
size: {
sm: 'auto',
width: 'auto',
xs: 12,
},
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
title: 'Доверьтесь лидеру\\n в сфере развлечений',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 15,
top: -20,
},
mobileSrc: Kids2MobileImg,
mobileHeight: 106,
mobileWidth: 110,
position: {
right: 22,
top: 20,
},
src: KidsDesktopImg,
width: 90,
height: 94
},
mobileOrder: 1,
order: 1,
size: {
sm: 2,
width: 200,
xs: 5,
},
text: 'для детей\\n разных возрастов',
title: 'Задания',
},
{
img: {
alt: 'programs',
mobilePosition: {
right: -20,
top: 5,
},
mobileSrc: BooksMobileImg,
mobileHeight: 116,
mobileWidth: 122,
position: {
right: 22,
top: 15,
},
src: BooksDesktopImg,
width: 109,
height: 90
},
mobileOrder: 4,
order: 2,
size: {
sm: 2,
width: 180,
xs: 6,
},
text: 'сюжет\\n каждый год',
title: 'Новый',
},
{
img: {
alt: 'decor',
mobilePosition: {
right: 14,
top: 10,
},
mobileSrc: MapMobileImg,
mobileHeight: 68,
mobileWidth: 94,
position: {
right: 35,
top: 10,
},
src: MapDesktopImg,
width: 69,
height: 94
},
mobileOrder: 3,
order: 3,
size: {
sm: 2,
width: 160,
xs: 5,
},
text: 'различных\\n локаций',
title: 'Шесть',
},
{
img: {
alt: 'kids',
mobilePosition: {
right: 0,
top: -15,
},
mobileSrc: KeysMobileImg,
mobileHeight: 64,
mobileWidth: 94,
position: {
right: 30,
top: 15,
},
src: KeysDesktopImg,
width: 69,
height: 94
},
mobileOrder: 2,
order: 4,
size: {
sm: 2,
width: 140,
xs: 6,
},
text: 'система\\n бронирования',
title: 'Быстрая',
},
];
export const getStatistics = (req: Request, res: Response) => {
// @ts-ignore
const {page, id} = req.body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayItems);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationItems);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsItems);
}
case PAGE_LINK.HOME: {
return res.status(200).json(homeItems);
}
case PAGE_LINK.QUESTS: {
switch (id) {
case 'eger':
return res.status(200).json(egerQuestItems);
case 'mult':
return res.status(200).json(multQuestItems);
case 'faraon':
return res.status(200).json(faraonQuestItems);
default:
return res.status(404);
}
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,10 @@
import express, { Request, Response } from 'express';
import { getStatistics } from './controller';
const statisticsRouter = express.Router()
statisticsRouter.post('/', (req: Request, res: Response) => {
return getStatistics(req, res);
})
export default statisticsRouter;

View File

@ -0,0 +1,327 @@
import { Request, Response } from 'express';
import * as path from 'path';
import { v4 as uuid } from 'uuid';
import { PAGE_LINK } from '../../../constants';
const imageRootDir = 'static/images/stories/';
const faqImage = path.join(imageRootDir, 'birthday/faq.png')
const faqMobileImage = path.join(imageRootDir, 'birthday/faq_mobile.png')
const feedbackImage = path.join(imageRootDir, 'birthday/feedback.png')
const feedbackMobileImage = path.join(imageRootDir, 'birthday/feedback_mobile.png')
const photoImage = path.join(imageRootDir, 'birthday/photo.png')
const photoMobileImage = path.join(imageRootDir, 'birthday/photo_mobile.png')
const example = path.join(imageRootDir, 'example.png')
const example2 = path.join(imageRootDir, 'example2.jpg')
export type StoryFeedbackModalType = {};
export type StoryGalleryModalType = {};
export type StoryInfoModalType = {};
export type StoryQuestPlotModalType = {};
export type StoryModalContent = StoryFeedbackModalType | StoryGalleryModalType | StoryInfoModalType | StoryQuestPlotModalType;
export type StoryModalType = 'faq' | 'feedback' | 'gallery' | 'info' | 'questPlot';
export type StoryImageType = {
alt: string;
height?: number;
src: string;
width?: number;
};
export type StoryType = {
border?: {
inner?: {
color: string;
};
outer?: {
color: string;
};
};
id: string;
img: StoryImageType;
imgMobile?: StoryImageType;
modal: {
content?: StoryModalContent;
type: StoryModalType;
};
title?: string;
};
const birthdayPageStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Ответы на вопросы',
src: faqImage,
},
imgMobile: {
alt: 'Ответы на вопросы',
src: faqMobileImage,
},
modal: {
type: 'faq',
},
title: 'Ответы\\n на вопросы',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: feedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: feedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: photoImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: photoMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\n и видео',
},
];
const graduationPageStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Ответы на вопросы',
src: faqImage,
},
imgMobile: {
alt: 'Ответы на вопросы',
src: faqMobileImage,
},
modal: {
type: 'faq',
},
title: 'Ответы\\n на вопросы',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: feedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: feedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: photoImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: photoMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\n и видео',
},
];
const outdoorsPageStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Ответы на вопросы',
src: faqImage,
},
imgMobile: {
alt: 'Ответы на вопросы',
src: faqMobileImage,
},
modal: {
type: 'faq',
},
title: 'Ответы\\n на вопросы',
},
{
id: uuid(),
img: {
alt: 'Отзывы наших клиентов',
src: feedbackImage,
},
imgMobile: {
alt: 'Отзывы наших клиентов',
src: feedbackMobileImage,
},
modal: {
type: 'feedback',
},
title: 'Отзывы\\n наших клиентов',
},
{
id: uuid(),
img: {
alt: 'Фотографии и видео',
src: photoImage,
},
imgMobile: {
alt: 'Фотографии и видео',
src: photoMobileImage,
},
modal: {
type: 'gallery',
},
title: 'Фотографии\n и видео',
},
];
const homePageStories: StoryType[] = [
{
id: uuid(),
img: {
alt: 'Рекомендации по квестам',
src: example,
},
imgMobile: {
alt: 'Рекомендации по квестам',
src: example,
},
modal: {
type: 'info',
},
title: 'Рекомендации\\n по квестам',
},
{
id: uuid(),
img: {
alt: 'День Рождения в Arkids парке',
src: example2,
},
imgMobile: {
alt: 'День Рождения в Arkids парке',
src: example2,
},
modal: {
type: 'info',
},
title: 'День Рождения\\n в Arkids парке',
},
{
id: uuid(),
img: {
alt: 'Новые программы для праздника',
src: example,
},
imgMobile: {
alt: 'Новые программы для праздника',
src: example,
},
modal: {
type: 'info',
},
title: 'Новые программы\\n для праздника',
},
{
id: uuid(),
img: {
alt: 'Рекомендации по квестам',
src: example,
},
imgMobile: {
alt: 'Рекомендации по квестам',
src: example,
},
modal: {
type: 'info',
},
title: 'Рекомендации\\n по квестам',
},
{
id: uuid(),
img: {
alt: 'День Рождения в Arkids парке',
src: example2,
},
imgMobile: {
alt: 'День Рождения в Arkids парке',
src: example2,
},
modal: {
type: 'info',
},
title: 'День Рождения\\n в Arkids парке',
},
{
id: uuid(),
img: {
alt: 'Новые программы для праздника',
src: example,
},
imgMobile: {
alt: 'Новые программы для праздника',
src: example,
},
modal: {
type: 'info',
},
title: 'Новые программы\\n для праздника',
},
{
id: uuid(),
img: {
alt: 'Новые программы для праздника',
src: example,
},
imgMobile: {
alt: 'Новые программы для праздника',
src: example,
},
modal: {
type: 'info',
},
title: 'Новые программы\\n для праздника',
},
];
export const getStories = (req: Request, res: Response) => {
// @ts-ignore
const {page} = req.body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
return res.status(200).json(birthdayPageStories);
}
case PAGE_LINK.GRADUATION: {
return res.status(200).json(graduationPageStories);
}
case PAGE_LINK.OUTDOORS: {
return res.status(200).json(outdoorsPageStories);
}
case PAGE_LINK.HOME: {
return res.status(200).json(homePageStories);
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,10 @@
import express, { Request, Response } from 'express';
import { getStories } from './controller';
const storiesRouter = express.Router()
storiesRouter.post('/', (req: Request, res: Response) => {
return getStories(req, res);
})
export default storiesRouter;

View File

@ -0,0 +1,98 @@
import { Request, Response } from 'express';
import { PAGE_LINK, TextSection } from '../../../constants';
const birthdayTitleText = {
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, тематические программы, '
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
title: 'День Рождения',
};
const graduationTitleText = {
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, индивидуальные дипломы, '
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
title: 'Выпускной',
};
const outdoorsTitleText = {
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, '
+ 'тематические программы, творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
title: 'Выездной праздник',
};
const questsTitleText = {
description: 'Выбираете квест для ребенка? Может, для компании своих друзей/коллег? '
+ 'Или просто хотите отдохнуть всей семьей?\\n\\n '
+ 'У нас есть решения под любые цели и для любых возрастов!\n',
title: 'Квесты',
};
const parkInfo = {
text: '-интерактивный парк нового поколения,\n'
+ ' объединяющий популярные услуги\n'
+ ' и развлечения для детей и взрослых',
title: 'Arkids Парк',
};
export const getTitle = (req: Request, res: Response) => {
console.log('headers', req.headers);
// @ts-ignore
const body = req.body;
console.log('body', body);
const { page, section } = body;
switch (page) {
case PAGE_LINK.BIRTHDAY: {
switch (section) {
case TextSection.TITLE:
return res.status(200).json(birthdayTitleText);
default:
return res.status(404);
}
}
case PAGE_LINK.GRADUATION: {
switch (section) {
case TextSection.TITLE:
return res.status(200).json(graduationTitleText);
default:
return res.status(404);
}
}
case PAGE_LINK.OUTDOORS: {
switch (section) {
case TextSection.TITLE:
return res.status(200).json(outdoorsTitleText);
default:
return res.status(404);
}
}
case PAGE_LINK.QUESTS: {
switch (section) {
case TextSection.TITLE:
return res.status(200).json(questsTitleText);
default:
return res.status(404);
}
}
case PAGE_LINK.HOME: {
switch (section) {
case TextSection.PARK:
return res.status(200).json(parkInfo);
default:
return res.status(404);
}
}
default:
return res.status(404);
}
}

View File

@ -0,0 +1,21 @@
// const express = require('express')
import express, { NextFunction, Request, Response } from 'express';
import { getTitle } from './controller';
const router = express.Router()
// middleware that is specific to this router
router.use((req: Request, res: Response, next: NextFunction) => {
console.log('Time: ', Date.now())
next()
})
router.get('/', (req: Request, res: Response) => {
return res.send('Api text GET response')
})
router.post('/', (req: Request, res: Response) => {
return getTitle(req, res);
})
export default router;

View File

@ -0,0 +1,39 @@
// Color list
$color_veri_peri: #6767AB;
$color_veri_peri_dark: #5656A9;
$color_orange: #FFB76F;
$color_gradient_red: linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%);
$color_gradient_red_dark: linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%);
$color_gradient_peri: linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%);
$color_gradient_peri3: linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%);
$color_gradient_peri4: linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%);
$color_gradient_peri2: linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%);
$color_gradient_yellow: linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%);
$color_gradient_orange: linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%);
$color_gradient_green: linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%);;
$color_white: #FFFFFF;
$color_black: #000000;
$color_grey: #F1F7FD;
$color_green: #15B555;
$color_black_light: #3C3C3C;
:export {
veri_peri: $color_veri_peri;
veri_peri_dark: $color_veri_peri_dark;
orange: $color_orange;
gradient_red: $color_gradient_red;
gradient_red_dark: $color_gradient_red_dark;
gradient_peri: $color_gradient_peri;
gradient_peri2: $color_gradient_peri2;
gradient_peri3: $color_gradient_peri3;
gradient_peri4: $color_gradient_peri4;
gradient_yellow: $color_gradient_yellow;
gradient_orange: $color_gradient_orange;
gradient_green: $color_gradient_green;
white: $color_white;
black: $color_black;
black_light: $color_black_light;
grey: $color_grey;
green: $color_green;
transparent: 'transparent';
}

224
src/constants/index.ts Normal file
View File

@ -0,0 +1,224 @@
export const enum PAGE_LINK {
ABOUT = '/about',
BIRTHDAY = '/holidays/birthday',
COMBO = '/combo',
CONTACTS = '/contacts',
COOPERATION = '/cooperation',
ESCORT = '/escort',
FAQ = '/faq',
FEEDBACK = '/feedback',
FRANCHISE = '/franchise',
GALLERY = '/gallery',
GRADUATION = '/holidays/graduation',
HOLIDAYS = '/holidays',
HOME = '/',
MASTER_CLASSES = '/master_classes',
NEW_YEAR = '/new_year',
OUTDOORS = '/holidays/outdoors',
PARTNERS = '/partners',
PRICE = '/price',
QUESTS = '/quests',
RENT = '/rent',
SERVICE = '/service',
}
export type PAGE_LINK_LABEL_TYPE = {
[key in PAGE_LINK]: string;
};
export const PAGE_LINK_LABEL: PAGE_LINK_LABEL_TYPE = {
[PAGE_LINK.ABOUT]: 'О нас',
[PAGE_LINK.BIRTHDAY]: 'День Рождения',
[PAGE_LINK.HOLIDAYS]: 'Праздники',
[PAGE_LINK.HOME]: 'Главная',
[PAGE_LINK.COMBO]: 'Комбо',
[PAGE_LINK.CONTACTS]: 'Контакты',
[PAGE_LINK.COOPERATION]: 'Сотрудничество',
[PAGE_LINK.ESCORT]: 'Сопровождение',
[PAGE_LINK.FAQ]: 'Частые вопросы',
[PAGE_LINK.FEEDBACK]: 'Отзывы',
[PAGE_LINK.FRANCHISE]: 'Франшиза',
[PAGE_LINK.GRADUATION]: 'Выпускные',
[PAGE_LINK.GALLERY]: 'Галерея',
[PAGE_LINK.MASTER_CLASSES]: 'Мастер классы',
[PAGE_LINK.NEW_YEAR]: 'Новый год',
[PAGE_LINK.OUTDOORS]: 'Выездные праздники',
[PAGE_LINK.PARTNERS]: 'Корпоративным клиентам и партнёрам',
[PAGE_LINK.PRICE]: 'Цены',
[PAGE_LINK.QUESTS]: 'Квесты',
[PAGE_LINK.RENT]: 'Аренда залов',
[PAGE_LINK.SERVICE]: 'Услуги для праздника',
};
export enum TextSection {
PARK = 'parkInfo',
TITLE = 'title',
}
export enum SERVICE {
ANIMATION = 'animation',
ANIMATOR = 'animator',
CRYO_SHOW = 'cryoShow',
DECORATION = 'decoration',
DIPLOMA = 'diploma',
DURATION = 'duration',
FACE_PAINTING = 'facePainting',
HALL = 'hall',
MASTERCLASS = 'masterclass',
PHOTOGRAPHER = 'photographer',
PHOTOS = 'photos',
QUEST = 'quest',
SCREENWRITER = 'screenWriter',
SHOW_DISCO = 'showDisco',
TABLEWARE_FESTIVE = 'tablewareFestive',
TEAM_BUILDING = 'teamBuilding',
}
export type ServiceType = {
enabled: boolean;
id: SERVICE;
name: string;
tooltip?: boolean;
};
export enum ApiRoute {
BREADCRUMBS = '/breadcrumbs',
FAQ = '/faq',
HALLS = '/halls',
INFO = '/info',
QUESTS = '/quests',
RATE = '/rate',
SERVICES = '/services',
STATISTIC_INFO = '/statistic',
STORIES = '/stories',
TEXT = '/text',
}
export const servicesList: { [k in SERVICE]: ServiceType } = {
[SERVICE.QUEST]: {
enabled: true,
id: SERVICE.QUEST,
name: 'Квест',
},
[SERVICE.ANIMATION]: {
enabled: true,
id: SERVICE.ANIMATION,
name: 'Тематическая анимация',
},
[SERVICE.DURATION]: {
enabled: true,
id: SERVICE.DURATION,
name: 'Продолжительность',
},
[SERVICE.ANIMATOR]: {
enabled: true,
id: SERVICE.ANIMATOR,
name: 'Аниматор',
},
[SERVICE.CRYO_SHOW]: {
enabled: true,
id: SERVICE.CRYO_SHOW,
name: 'Крио-Шоу',
},
[SERVICE.DECORATION]: {
enabled: true,
id: SERVICE.DECORATION,
name: 'Украшение зала',
},
[SERVICE.DIPLOMA]: {
enabled: true,
id: SERVICE.DIPLOMA,
name: 'Диплом выпускника',
},
[SERVICE.FACE_PAINTING]: {
enabled: true,
id: SERVICE.FACE_PAINTING,
name: 'Аква грим',
},
[SERVICE.HALL]: {
enabled: true,
id: SERVICE.HALL,
name: 'Зал для праздника',
tooltip: true,
},
[SERVICE.MASTERCLASS]: {
enabled: true,
id: SERVICE.MASTERCLASS,
name: 'Мастер класс',
},
[SERVICE.PHOTOGRAPHER]: {
enabled: true,
id: SERVICE.PHOTOGRAPHER,
name: 'Фотограф',
},
[SERVICE.PHOTOS]: {
enabled: true,
id: SERVICE.PHOTOS,
name: 'Фотографии',
},
[SERVICE.SCREENWRITER]: {
enabled: true,
id: SERVICE.SCREENWRITER,
name: 'Сценарист',
},
[SERVICE.SHOW_DISCO]: {
enabled: true,
id: SERVICE.SHOW_DISCO,
name: 'Шоу дискотека',
},
[SERVICE.TABLEWARE_FESTIVE]: {
enabled: true,
id: SERVICE.TABLEWARE_FESTIVE,
name: 'Праздничная посуда',
},
[SERVICE.TEAM_BUILDING]: {
enabled: true,
id: SERVICE.TEAM_BUILDING,
name: 'Тимбилдинг',
},
};
export enum ColorVariant {
BLACK,
BLACK_LIGHT,
GRADIENT_PERI,
GRADIENT_PERI2,
GRADIENT_PERI3,
GRADIENT_PERI4,
GRADIENT_RED,
GRADIENT_RED_DARK,
GRADIENT_YELLOW,
GRADIENT_ORANGE,
GRADIENT_GREEN,
GREEN,
GREY,
ORANGE,
TRANSPARENT,
VERI_PERI,
VERI_PERI_DARK,
WHITE,
}
type ColorType = {
[k in ColorVariant]: string;
};
export const COLORS: ColorType = {
[ColorVariant.BLACK]: "#000000",
[ColorVariant.BLACK_LIGHT]: "#3C3C3C",
[ColorVariant.GRADIENT_PERI]: "linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%)",
[ColorVariant.GRADIENT_PERI2]: "linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%)",
[ColorVariant.GRADIENT_PERI3]: "linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%)",
[ColorVariant.GRADIENT_PERI4]: "linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%)",
[ColorVariant.GRADIENT_RED]: "linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)",
[ColorVariant.GRADIENT_RED_DARK]: "linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%)",
[ColorVariant.GRADIENT_YELLOW]: "linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%)",
[ColorVariant.GRADIENT_ORANGE]: "linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%)",
[ColorVariant.GRADIENT_GREEN]: "linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%)",
[ColorVariant.GREEN]: "#15B555",
[ColorVariant.GREY]: "#F1F7FD",
[ColorVariant.ORANGE]: "#FFB76F",
[ColorVariant.TRANSPARENT]: 'transparent',
[ColorVariant.VERI_PERI]: "#6767AB",
[ColorVariant.VERI_PERI_DARK]: "#5656A9",
[ColorVariant.WHITE]: "#FFFFFF",
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Some files were not shown because too many files have changed in this diff Show More