initial site
This commit is contained in:
commit
da5b259d06
167 files changed
+34157
No files matched your search
@@ -0,0 +1,365 @@
|
||||
/**
|
||||
* БАРНОЕ МЕНЮ: закуски, напитки и десерты, снеки, лимонады и энергетики.
|
||||
*
|
||||
*/
|
||||
|
||||
export const SNACKS_CATEGORY = "ЗАКУСКИ";
|
||||
export const DRINKS_DESSERTS_CATEGORY = "НАПИТКИ И ДЕСЕРТЫ";
|
||||
export const SWEETS_CATEGORY = "СНЕКИ И СЛАДОСТИ";
|
||||
export const LEMONADES_CATEGORY = "ЛИМОНАДЫ И ЭНЕРГЕТИКИ";
|
||||
|
||||
export interface BarCategoryMeta {
|
||||
id: string;
|
||||
label: string;
|
||||
accent: string; // неоновый акцент категории
|
||||
tagline: string;
|
||||
}
|
||||
|
||||
export const barCategories: BarCategoryMeta[] = [
|
||||
{
|
||||
id: SNACKS_CATEGORY,
|
||||
label: SNACKS_CATEGORY,
|
||||
accent: "#f59e0b", // янтарный — горячая кухня
|
||||
tagline: "Горячие закуски к кальяну и пиву — хрустящие, сытные, на компанию",
|
||||
},
|
||||
{
|
||||
id: DRINKS_DESSERTS_CATEGORY,
|
||||
label: DRINKS_DESSERTS_CATEGORY,
|
||||
accent: "#fb7185", // розовый — десерты
|
||||
tagline: "Чай, кофе и домашние десерты — сладкое продолжение вечера",
|
||||
},
|
||||
{
|
||||
id: SWEETS_CATEGORY,
|
||||
label: SWEETS_CATEGORY,
|
||||
accent: "#c084fc", // лавандовый — сладости
|
||||
tagline: "Шоколад, чипсы и хрустящие снеки — то, что уходит под дым",
|
||||
},
|
||||
{
|
||||
id: LEMONADES_CATEGORY,
|
||||
label: LEMONADES_CATEGORY,
|
||||
accent: "#a3e635", // электрический лайм — энергия
|
||||
tagline: "Грузинские лимонады и энергетики — холодные и бодрящие",
|
||||
},
|
||||
];
|
||||
|
||||
export interface BarMenuItem {
|
||||
id: string;
|
||||
name: string;
|
||||
category: string;
|
||||
portion?: string; // «8 шт», «130 гр», «900 мл»
|
||||
price: number;
|
||||
priceFormatted: string;
|
||||
desc: string;
|
||||
icon: string; // ключ иконки, см. barMenuIcons в MenuPage
|
||||
}
|
||||
|
||||
export const barMenuItems: BarMenuItem[] = [
|
||||
/* ------------------------------ ЗАКУСКИ ------------------------------ */
|
||||
{
|
||||
id: "onion-rings",
|
||||
name: "Луковые кольца",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "8 шт",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Хрустящие кольца лука в золотистой панировке. Подаём с сырным соусом.",
|
||||
icon: "donut",
|
||||
},
|
||||
{
|
||||
id: "fries",
|
||||
name: "Картофель Фри",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "130 гр",
|
||||
price: 210,
|
||||
priceFormatted: "210 ₽",
|
||||
desc: "Классический фри с морской солью — горячий и хрустящий.",
|
||||
icon: "utensils",
|
||||
},
|
||||
{
|
||||
id: "buffalo-wings",
|
||||
name: "Крылышки Баффало",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "6 шт",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Сочные крылья в остром соусе Баффало. Острота — средняя, вкус — мощный.",
|
||||
icon: "drumstick",
|
||||
},
|
||||
{
|
||||
id: "cheese-sticks",
|
||||
name: "Сырные палочки",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "6 шт",
|
||||
price: 310,
|
||||
priceFormatted: "310 ₽",
|
||||
desc: "Тягучий моцарелла в хрустящей панировке. Идеально под томатный дип.",
|
||||
icon: "croissant",
|
||||
},
|
||||
{
|
||||
id: "strips",
|
||||
name: "Стрипсы",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "6 шт",
|
||||
price: 320,
|
||||
priceFormatted: "320 ₽",
|
||||
desc: "Куриные стрипсы в специях — румяные снаружи, нежные внутри.",
|
||||
icon: "beef",
|
||||
},
|
||||
{
|
||||
id: "nuggets",
|
||||
name: "Нагетсы",
|
||||
category: SNACKS_CATEGORY,
|
||||
portion: "8 шт",
|
||||
price: 320,
|
||||
priceFormatted: "320 ₽",
|
||||
desc: "Золотистые нагетсы из куриного филе. Подаём с двумя соусами на выбор.",
|
||||
icon: "egg",
|
||||
},
|
||||
|
||||
/* ----------------------- НАПИТКИ И ДЕСЕРТЫ ----------------------- */
|
||||
{
|
||||
id: "black-tea",
|
||||
name: "Черный чай",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "900 мл",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Классический чёрный чай в стеклянном чайнике — глубокий и согревающий.",
|
||||
icon: "leaf",
|
||||
},
|
||||
{
|
||||
id: "black-tea-thyme",
|
||||
name: "Черный чай с чабрецом",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "900 мл",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Чёрный чай с веточкой чабреца — травяной аромат и мягкое тепло.",
|
||||
icon: "leaf",
|
||||
},
|
||||
{
|
||||
id: "milk-oolong",
|
||||
name: "Молочный Улун",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Нежный улун с бархатными сливочными нотами. Легенда чайной карты.",
|
||||
icon: "milk",
|
||||
},
|
||||
{
|
||||
id: "americano",
|
||||
name: "Американо",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "150 мл",
|
||||
price: 150,
|
||||
priceFormatted: "150 ₽",
|
||||
desc: "Крепкий зерновой кофе на свежем помоле. Чистый и бодрящий.",
|
||||
icon: "coffee",
|
||||
},
|
||||
{
|
||||
id: "cappuccino",
|
||||
name: "Капучино",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "200 мл",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Эспрессо с шелковистой молочной пеной. По желанию — с сиропом.",
|
||||
icon: "coffee",
|
||||
},
|
||||
{
|
||||
id: "cheesecake-ny",
|
||||
name: "Чизкейк Нью-Йорк",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "120 гр",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Классический сливочный чизкейк на песочной основе.",
|
||||
icon: "cake",
|
||||
},
|
||||
{
|
||||
id: "red-velvet",
|
||||
name: "Торт Красный бархат",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "120 гр",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Бархатные коржи с кремом из сливочного сыра.",
|
||||
icon: "cake",
|
||||
},
|
||||
{
|
||||
id: "medovik",
|
||||
name: "Торт Медовик",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "120 гр",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Домашний медовик со сметанным кремом — тает во рту.",
|
||||
icon: "cake",
|
||||
},
|
||||
{
|
||||
id: "cheesecake-strawberry",
|
||||
name: "Чизкейк Нью-Йорк клубничный",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "120 гр",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Чизкейк с клубничным соусом и свежими ягодами.",
|
||||
icon: "cake",
|
||||
},
|
||||
{
|
||||
id: "cheesecake-raspberry",
|
||||
name: "Чизкейк Нью-Йорк Малина",
|
||||
category: DRINKS_DESSERTS_CATEGORY,
|
||||
portion: "120 гр",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Сливочный чизкейк с малиновым кули и лёгкой кислинкой.",
|
||||
icon: "cake",
|
||||
},
|
||||
|
||||
/* ------------------------- СНЕКИ И СЛАДОСТИ ------------------------- */
|
||||
{
|
||||
id: "alpen-gold",
|
||||
name: "Alpen Gold",
|
||||
category: SWEETS_CATEGORY,
|
||||
price: 210,
|
||||
priceFormatted: "210 ₽",
|
||||
desc: "Молочный шоколад с орехами и карамелью.",
|
||||
icon: "candy",
|
||||
},
|
||||
{
|
||||
id: "milka",
|
||||
name: "Milka",
|
||||
category: SWEETS_CATEGORY,
|
||||
price: 230,
|
||||
priceFormatted: "230 ₽",
|
||||
desc: "Нежный молочный шоколад из альпийского молока.",
|
||||
icon: "candy",
|
||||
},
|
||||
{
|
||||
id: "leys",
|
||||
name: "Чипсы Leys",
|
||||
category: SWEETS_CATEGORY,
|
||||
portion: "90 гр",
|
||||
price: 210,
|
||||
priceFormatted: "210 ₽",
|
||||
desc: "Хрустящие картофельные чипсы — классика под дым.",
|
||||
icon: "popcorn",
|
||||
},
|
||||
{
|
||||
id: "korochki",
|
||||
name: "3 Корочки",
|
||||
category: SWEETS_CATEGORY,
|
||||
portion: "60 гр",
|
||||
price: 150,
|
||||
priceFormatted: "150 ₽",
|
||||
desc: "Хрустящие ржаные корочки со специями.",
|
||||
icon: "popcorn",
|
||||
},
|
||||
{
|
||||
id: "hrustim",
|
||||
name: "Хрустим team",
|
||||
category: SWEETS_CATEGORY,
|
||||
portion: "40 гр",
|
||||
price: 100,
|
||||
priceFormatted: "100 ₽",
|
||||
desc: "Лёгкий хрустящий снек — маленькая пачка, большое удовольствие.",
|
||||
icon: "popcorn",
|
||||
},
|
||||
|
||||
/* --------------------- ЛИМОНАДЫ И ЭНЕРГЕТИКИ --------------------- */
|
||||
{
|
||||
id: "natakhtari-pear",
|
||||
name: "НАТАХТАРИ ГРУША",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Грузинский газированный напиток со вкусом спелой груши.",
|
||||
icon: "glass",
|
||||
},
|
||||
{
|
||||
id: "strawberry-kiwi",
|
||||
name: "Клубника Киви",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 150,
|
||||
priceFormatted: "150 ₽",
|
||||
desc: "Ягодный лимонад: клубника и киви в одном бокале.",
|
||||
icon: "cupsoda",
|
||||
},
|
||||
{
|
||||
id: "feijoa",
|
||||
name: "Фейхоа",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 150,
|
||||
priceFormatted: "150 ₽",
|
||||
desc: "Освежающий лимонад с экзотическим вкусом фейхоа.",
|
||||
icon: "cupsoda",
|
||||
},
|
||||
{
|
||||
id: "natakhtari-feijoa",
|
||||
name: "НАТАХТАРИ ФЕЙХОА",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Грузинская газировка с ярким вкусом фейхоа.",
|
||||
icon: "glass",
|
||||
},
|
||||
{
|
||||
id: "natakhtari-saperavi",
|
||||
name: "НАТАХТАРИ САПЕРАВИ",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Виноградный напиток из грузинского сорта Саперави.",
|
||||
icon: "grape",
|
||||
},
|
||||
{
|
||||
id: "burn-original",
|
||||
name: "BURN Оригинальный",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Классический энергетик BURN — заряд на всю ночь.",
|
||||
icon: "zap",
|
||||
},
|
||||
{
|
||||
id: "adrenaline-rush",
|
||||
name: "Adrenaline RUSH Абсолютная ЭНЕРГИЯ",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Adrenaline Rush — абсолютная энергия без компромиссов.",
|
||||
icon: "battery",
|
||||
},
|
||||
{
|
||||
id: "burn-apple-kiwi",
|
||||
name: "BURN Яблоко Киви",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "BURN со вкусом яблока и киви — кислинка плюс энергия.",
|
||||
icon: "apple",
|
||||
},
|
||||
{
|
||||
id: "burn-mango",
|
||||
name: "BURN Со вкусом МАНГО",
|
||||
category: LEMONADES_CATEGORY,
|
||||
portion: "1 шт",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Тропический BURN с насыщенным вкусом спелого манго.",
|
||||
icon: "zap",
|
||||
},
|
||||
];
|
||||
|
||||
/** Суммарный список всех барных позиций (для поиска и счётчиков) */
|
||||
export const allBarItems = barMenuItems;
|
||||
@@ -0,0 +1,170 @@
|
||||
export interface BeerItem {
|
||||
id: string;
|
||||
name: string;
|
||||
category: string;
|
||||
type: string; // "Светлое", "Тёмное", "Пшеничное", "Фруктовое / Сидр", "Лагер"
|
||||
volume: string;
|
||||
price: number;
|
||||
priceFormatted: string;
|
||||
desc: string;
|
||||
accentColor: string;
|
||||
}
|
||||
|
||||
export const BEER_CATEGORY = "ПИВНАЯ КАРТА";
|
||||
|
||||
export const beerList: BeerItem[] = [
|
||||
{
|
||||
id: "bud",
|
||||
name: "Bud",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Светлый лагер",
|
||||
volume: "0,44 л",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Легендарный американский светлый лагер с чистым освежающим вкусом и тонким хмелевым ароматом.",
|
||||
accentColor: "#ef4444",
|
||||
},
|
||||
{
|
||||
id: "kozel-dark",
|
||||
name: "Kozel темный",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Тёмный лагер",
|
||||
volume: "0,45 л",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Чешский бархатистый тёмный лагер с приятными нотами карамельного солода, шоколада и мягкой горчинкой.",
|
||||
accentColor: "#a855f7",
|
||||
},
|
||||
{
|
||||
id: "stary-melnik-light",
|
||||
name: "Старый мельник светлое",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Светлое классическое",
|
||||
volume: "0,45 л",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Традиционное светлое пиво из отборного ячменного солода с мягким сбалансированным вкусом.",
|
||||
accentColor: "#eab308",
|
||||
},
|
||||
{
|
||||
id: "krone-blanche",
|
||||
name: "Krone Blanche",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Белое пшеничное",
|
||||
volume: "0,45 л",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Освежающее пшеничное белое пиво с яркими цитрусовыми оттенками цедры апельсина и нотками кориандра.",
|
||||
accentColor: "#00f0ff",
|
||||
},
|
||||
{
|
||||
id: "erzmann",
|
||||
name: "Erzmann",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Классический лагер",
|
||||
volume: "0,45 л",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Европейский светлый лагер с благородным солодовым телом и освежающим сухим послевкусием.",
|
||||
accentColor: "#38bdf8",
|
||||
},
|
||||
{
|
||||
id: "el-capulco",
|
||||
name: "El Capulco",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Мексиканский лагер",
|
||||
volume: "0,45 л",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Лёгкое мексиканское пиво золотистого оттенка с нотками агавы, кукурузных хлопьев и мягкой цитрусовой свежестью.",
|
||||
accentColor: "#facc15",
|
||||
},
|
||||
{
|
||||
id: "stella",
|
||||
name: "Stella",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Премиум лагер",
|
||||
volume: "0,44 л",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Знаменитый бельгийский премиальный лагер Stella Artois с чистой искристостью и благородной горчинкой сортов Saaz.",
|
||||
accentColor: "#ef4444",
|
||||
},
|
||||
{
|
||||
id: "kozel-light",
|
||||
name: "Kozel светлый",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Светлый лагер",
|
||||
volume: "0,45 л",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Лёгкий чешский светлый лагер с тонким ароматом хмеля и золотистой пенной шапкой.",
|
||||
accentColor: "#f59e0b",
|
||||
},
|
||||
{
|
||||
id: "stary-melnik-dark",
|
||||
name: "Старый мельник темное",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Тёмный эль / лагер",
|
||||
volume: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Глубокий рубиново-тёмный цвет, мягкая солодовая сладость с лёгкими хлебно-карамельными тонами.",
|
||||
accentColor: "#c084fc",
|
||||
},
|
||||
{
|
||||
id: "pablos-lime",
|
||||
name: "Pablo's с соком лайма",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Пивной напиток / лайм",
|
||||
volume: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Освежающий яркий пивной напиток с натуральным соком лайма — бодрящий, кисленький и летний.",
|
||||
accentColor: "#22c55e",
|
||||
},
|
||||
{
|
||||
id: "redds",
|
||||
name: "Redd's",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Фруктовое / яблочное",
|
||||
volume: "1 шт",
|
||||
price: 200,
|
||||
priceFormatted: "200 ₽",
|
||||
desc: "Лёгкий фильтрованный напиток с искристым кисло-сладким вкусом спелых сочных яблок.",
|
||||
accentColor: "#f43f5e",
|
||||
},
|
||||
{
|
||||
id: "spaten",
|
||||
name: "Spatten",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Мюнхенский хель",
|
||||
volume: "0,45 л",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Классический немецкий Spaten Münchner Hell — эталон баварского пивоварения с мягким сбалансированным вкусом.",
|
||||
accentColor: "#10b981",
|
||||
},
|
||||
{
|
||||
id: "hoegaarden",
|
||||
name: "Hoegaarden",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Бланш / Пшеничное",
|
||||
volume: "0,45 л",
|
||||
price: 220,
|
||||
priceFormatted: "220 ₽",
|
||||
desc: "Аутентичный бельгийский нефильтрованный бланш с пикантным акцентом кюрасао и семян кориандра.",
|
||||
accentColor: "#fbbf24",
|
||||
},
|
||||
{
|
||||
id: "corona-extra",
|
||||
name: "Corona Extra",
|
||||
category: BEER_CATEGORY,
|
||||
type: "Мексиканский лагер",
|
||||
volume: "1 шт",
|
||||
price: 250,
|
||||
priceFormatted: "250 ₽",
|
||||
desc: "Всемирно известный мексиканский лагер в прозрачной бутылке — пьётся холодным с долькой сочного лайма.",
|
||||
accentColor: "#38bdf8",
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,681 @@
|
||||
export type TobaccoStrength = 1 | 2 | 3;
|
||||
|
||||
export const strengthLabels: Record<TobaccoStrength, string> = {
|
||||
1: "лёгкая",
|
||||
2: "средняя",
|
||||
3: "крепкая",
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Авторские миксы кальянов */
|
||||
/* Формат: название · крепость (1–5) · холодок (0–3) · вкусы · цена */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Миксы «НЕОНа» */
|
||||
/* Страница «Миксы НЕОНа» показывает витрину генераций AI-сомелье */
|
||||
/* (те же миксы, что собирает вкладка «Автоподбор микса», — см. */
|
||||
/* mixEngine.generateShowcaseMixes). Фирменные миксы бара хозяин */
|
||||
/* добавляет в CRM — на сайте это блок «Миксы мастера». */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
import { CATEGORY_LABELS, FLAVORS } from "./flavors";
|
||||
import { generateShowcaseMixes, getFlavor } from "../lib/mixEngine";
|
||||
|
||||
export type MixStrength = 1 | 2 | 3 | 4 | 5;
|
||||
export type CoolingLevel = 0 | 1 | 2 | 3;
|
||||
|
||||
export type HookahMix = {
|
||||
id: string;
|
||||
name: string;
|
||||
desc: string;
|
||||
strength: MixStrength;
|
||||
cooling: CoolingLevel; // 0 = нет холодка, 3 = максимальный
|
||||
flavorTags: string[]; // напр. "ягоды", "цитрус", "мята"
|
||||
price: string;
|
||||
featured?: boolean;
|
||||
/** состав витринного микса: вкусы движка в порядке «основа → добавка → оттенок» */
|
||||
items: { flavorId: string }[];
|
||||
};
|
||||
|
||||
export const mixStrengthLabels: Record<MixStrength, string> = {
|
||||
1: "Лёгкая",
|
||||
2: "Ниже среднего",
|
||||
3: "Средняя",
|
||||
4: "Выше средней",
|
||||
5: "Крепкая",
|
||||
};
|
||||
|
||||
export const mixCoolingLabels: Record<CoolingLevel, string> = {
|
||||
0: "Без холодка",
|
||||
1: "Лёгкая",
|
||||
2: "Средний",
|
||||
3: "Сильный",
|
||||
};
|
||||
|
||||
const PRICE_BASE = "1 400 ₽";
|
||||
const PRICE_STRONG = "1 800 ₽";
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Авторские миксы — показываются в карусели на главной */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export type SignatureMix = {
|
||||
id: string;
|
||||
name: string;
|
||||
desc: string;
|
||||
price: string;
|
||||
strength: TobaccoStrength;
|
||||
badge?: { label: string; hot?: boolean };
|
||||
};
|
||||
|
||||
const BASE_PRICE = "1 400 ₽";
|
||||
|
||||
export const signatureMixes: SignatureMix[] = [
|
||||
{
|
||||
id: "neon-signature",
|
||||
name: "НЕОН Signature Mix",
|
||||
desc: "Виноград, мята и тропические ноты. Наш фирменный микс, с которого начинают гости.",
|
||||
price: BASE_PRICE,
|
||||
strength: 1,
|
||||
badge: { label: "Хит", hot: true },
|
||||
},
|
||||
{
|
||||
id: "berry-haze",
|
||||
name: "Berry Haze",
|
||||
desc: "Лесные ягоды и сливки. Десертный вкус с густым молочным дымом.",
|
||||
price: BASE_PRICE,
|
||||
strength: 1,
|
||||
badge: { label: "Новинка", hot: true },
|
||||
},
|
||||
{
|
||||
id: "citrus-punch",
|
||||
name: "Citrus Punch",
|
||||
desc: "Цитрус, лайм и лёгкое охлаждение. Яркий и освежающий, как неоновая вывеска.",
|
||||
price: BASE_PRICE,
|
||||
strength: 2,
|
||||
},
|
||||
{
|
||||
id: "midnight-grape",
|
||||
name: "Midnight Grape",
|
||||
desc: "Тёмный виноград с мятой. Глубокий вечерний вкус для долгих разговоров.",
|
||||
price: BASE_PRICE,
|
||||
strength: 1,
|
||||
},
|
||||
{
|
||||
id: "cyan-breeze",
|
||||
name: "Cyan Breeze",
|
||||
desc: "Арбуз, лёд и мята. Самый холодный микс в нашей карте. Свежесть до утра.",
|
||||
price: BASE_PRICE,
|
||||
strength: 1,
|
||||
},
|
||||
{
|
||||
id: "violet-dream",
|
||||
name: "Violet Dream",
|
||||
desc: "Дыня, ежевика и лаванда. Мягкий микс с цветочным шлейфом.",
|
||||
price: BASE_PRICE,
|
||||
strength: 1,
|
||||
},
|
||||
{
|
||||
id: "dark-mango",
|
||||
name: "Dark Mango",
|
||||
desc: "Манго, маракуйя и холодок. Тропические ноты для долгого вечера.",
|
||||
price: BASE_PRICE,
|
||||
strength: 2,
|
||||
},
|
||||
{
|
||||
id: "electric-cola",
|
||||
name: "Electric Cola",
|
||||
desc: "Кола, вишня и лёд. Знакомый вкус в неоновом исполнении.",
|
||||
price: BASE_PRICE,
|
||||
strength: 2,
|
||||
},
|
||||
];
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Справочник табаков — страница «Вкусы» */
|
||||
/* Формат: вкус · крепость · фирма · холодок */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export type TobaccoFlavor = {
|
||||
id: string;
|
||||
name: string;
|
||||
brand: string;
|
||||
strength: TobaccoStrength;
|
||||
cooling: boolean;
|
||||
note?: string;
|
||||
available: boolean;
|
||||
image?: string;
|
||||
createdAt?: string; // заполнено для вкусов, добавленных владельцем через CRM
|
||||
};
|
||||
|
||||
export type TobaccoBrandInfo = {
|
||||
url?: string;
|
||||
image: string;
|
||||
accent: string;
|
||||
};
|
||||
|
||||
export const tobaccoBrandInfo: Record<string, TobaccoBrandInfo> = {
|
||||
Blackburn: { url: "https://burntobacco.com/", image: "./images/hookah-smoke.jpg", accent: "#ff3636" },
|
||||
Overdose: { url: "https://overdose.pro/", image: "./images/hookah-smoke.jpg", accent: "#ff8a00" },
|
||||
Banger: { url: "https://www.bangertobacco.com/", image: "./images/interior-bar.jpg", accent: "#d4af37" },
|
||||
Undercoal: { url: "https://musthave.ru/", image: "./images/hookah-smoke.jpg", accent: "#ff4d8d" },
|
||||
Darkside: { url: "https://darksidecorp.ru/", image: "https://static.tildacdn.com/tild3036-6566-4231-a239-313362636638/mainFooter.png", accent: "#ef2b2d" },
|
||||
"Хулиган / WOOD": { url: "https://hlgn.cc/tobacco", image: "https://static.tildacdn.com/tild6662-6138-4437-b334-303162643234/_2____1.png", accent: "#ff453a" },
|
||||
Hupreme: { url: "https://t.me/s/Hypremetc", image: "./images/interior-sofas.jpg", accent: "#b026ff" },
|
||||
"JENT Alcohol Line": { url: "https://vk.com/jent.club", image: "https://sun9-6.userapi.com/impg/VSLGmsKem1jEfrzMwQ2zntx8tvmHu-mhR7h8iA/dja__TnVak0.jpg", accent: "#e2b04a" },
|
||||
DEUS: { url: "https://t.me/deus_tobacco", image: "./images/hookah-smoke.jpg", accent: "#a7a7a7" },
|
||||
Северный: { url: "https://www.tabak-sever.ru/", image: "./images/interior-sofas.jpg", accent: "#a8d7ff" },
|
||||
Bliss: { url: "https://taplink.cc/blisstobacco", image: "https://p.taplink.st/a/0/3/b/e/bc523d.png?2", accent: "#78a7d2" },
|
||||
Muassel: { url: "http://muassel.ru/", image: "https://muassel.ru/images/22_1.jpg", accent: "#d5a760" },
|
||||
Chabacco: { url: "https://chabacco.ru/", image: "https://static.tildacdn.com/tild3466-3934-4163-b131-653731646231/banner-new-chabacco-.png", accent: "#ffca28" },
|
||||
"Joy Kiwichanga": { url: "https://alphahookah.ru/mix-joy/", image: "https://alphahookah.ru/upload/iblock/7e9/ah3jnujz5k06qd717ml9wo52t0s3bi3v.png", accent: "#00d68f" },
|
||||
Хулиган: { url: "https://hlgn.cc/tobacco", image: "https://static.tildacdn.com/tild6662-6138-4437-b334-303162643234/_2____1.png", accent: "#ff453a" },
|
||||
Сарма: { url: "https://sarmahookah.ru/", image: "https://static.tildacdn.com/tild6465-6337-4363-b365-376134396533/image_7.png", accent: "#e44e2d" },
|
||||
Добавка: { image: "./images/menu-bg.jpg", accent: "#00f0ff" },
|
||||
};
|
||||
|
||||
const tobacco = (
|
||||
id: string,
|
||||
brand: string,
|
||||
name: string,
|
||||
note: string | undefined,
|
||||
strength: TobaccoStrength,
|
||||
cooling = false,
|
||||
available = true,
|
||||
image?: string,
|
||||
): TobaccoFlavor => ({ id, brand, name, note, strength, cooling, available, image });
|
||||
|
||||
export const tobaccoFlavors: TobaccoFlavor[] = [
|
||||
tobacco("bb-cola", "Blackburn", "Классическая кола", undefined, 3),
|
||||
tobacco("bb-lulo", "Blackburn", "Lulo", undefined, 3),
|
||||
tobacco("bb-real-pf", "Blackburn", "Real P.F.", "Маракуйя", 3),
|
||||
tobacco("bb-white-grape", "Blackburn", "White Grape", "Белый виноград", 3),
|
||||
tobacco("bb-forest-raspberry", "Blackburn", "Лесная малина", undefined, 3),
|
||||
tobacco("bb-brownie", "Blackburn", "Брауни", undefined, 3),
|
||||
tobacco("bb-blackberry-lemonade", "Blackburn", "Blackberry Lemonade", "Ежевичный лимонад", 3),
|
||||
tobacco("bb-lemon-shock", "Blackburn", "Lemon Shock", "Ультракислый лимон", 3),
|
||||
tobacco("bb-blueberry", "Blackburn", "Blueberry", "Голубика", 3),
|
||||
tobacco("bb-apple-shock", "Blackburn", "Apple Shock", "Кислое зелёное яблоко", 3),
|
||||
tobacco("bb-red-energy", "Blackburn", "Red Energy", "Энергетик", 3),
|
||||
tobacco("bb-kiwi-stoner", "Blackburn", "Kiwi Stoner", "Смузи из киви", 3),
|
||||
tobacco("bb-bananini", "Blackburn", "Bananini", "Банан", 3),
|
||||
tobacco("bb-honey-melon", "Blackburn", "Медовая дыня", undefined, 3),
|
||||
tobacco("bb-pineapple", "Blackburn", "Pineapple", "Сочный ананас", 3),
|
||||
tobacco("bb-grape-lollipop", "Blackburn", "Виноградный чупа-чупс", undefined, 3),
|
||||
tobacco("bb-fir", "Blackburn", "Ёлка", undefined, 3, true),
|
||||
tobacco("bb-red-orange", "Blackburn", "Красный апельсин", undefined, 3),
|
||||
tobacco("bb-juicy-mango", "Blackburn", "Сочное манго", undefined, 3),
|
||||
tobacco("bb-basilic", "Blackburn", "Basilic", "Базилик", 3),
|
||||
tobacco("bb-berry-sorbet", "Blackburn", "Ягодный сорбет", "С грейпфрутом", 3),
|
||||
tobacco("bb-ananas-shock", "Blackburn", "Ananas Shock", "Кислый ананас", 3),
|
||||
tobacco("bb-after-8", "Blackburn", "After 8", "Шоколад-мята", 3, true),
|
||||
tobacco("bb-overdose", "Blackburn", "Overdose", "Лимон-лайм", 3),
|
||||
tobacco("bb-pina-colada", "Blackburn", "Pina Colada", undefined, 3),
|
||||
tobacco("bb-pistachio-ice", "Blackburn", "Pistachio Ice Snow", "Фисташковое мороженое", 3, true),
|
||||
tobacco("bb-pomelo", "Blackburn", "Pomelo", undefined, 3),
|
||||
tobacco("bb-pear-lemonade", "Blackburn", "Pear Lemonade", "Грушевый лимонад", 3),
|
||||
|
||||
tobacco("od-lost-futura", "Overdose", "Lost Futura", "Мускусная вишня", 3),
|
||||
tobacco("od-frustyle", "Overdose", "Frustyle", "Кактус-лайм", 3),
|
||||
tobacco("od-black-banano", "Overdose", "Black Banano", "Амбровый банан", 3),
|
||||
tobacco("od-gin-cucumber", "Overdose", "Gin Cucumber", "Огуречный джин", 3),
|
||||
|
||||
tobacco("banger-black-white", "Banger", "Black and White", "Печенье Oreo", 2),
|
||||
tobacco("banger-cream-soda", "Banger", "Cream Soda", "Крем-сода", 2),
|
||||
tobacco("banger-sexy", "Banger", "Sexy", "Грейпфрут, клубника, малина", 2),
|
||||
tobacco("banger-grapefruit", "Banger", "Grapefruit", "Грейпфрут", 2),
|
||||
tobacco("banger-green-day", "Banger", "Green Day", "Яблоко, киви, кислинка", 2),
|
||||
tobacco("banger-cola-bella", "Banger", "Cola Bella", "Ванильная кола", 2),
|
||||
|
||||
tobacco("uc-pinkman", "Undercoal", "Pinkman", "Клубника, малина, грейпфрут", 2),
|
||||
tobacco("uc-coconut-shake", "Undercoal", "Кокосовый шейк", undefined, 2, false, false),
|
||||
tobacco("uc-caribbean-rum", "Undercoal", "Caribbean Rum", undefined, 2),
|
||||
tobacco("uc-mango-rose", "Undercoal", "Манго, маракуйя, личи и роза", undefined, 2),
|
||||
tobacco("uc-tropical-juice", "Undercoal", "Тропический сок", undefined, 2),
|
||||
tobacco("uc-cactus-kiwi", "Undercoal", "Кактус, киви и абсент", undefined, 2),
|
||||
tobacco("uc-milky-oolong", "Undercoal", "Чай «Молочный улун»", undefined, 2),
|
||||
tobacco("uc-cranberry", "Undercoal", "Клюква", undefined, 2),
|
||||
tobacco("uc-pear-tarragon", "Undercoal", "Груша, лимон и тархун", undefined, 2),
|
||||
tobacco("uc-cinnamon-roll", "Undercoal", "Cinnamon Roll", undefined, 2),
|
||||
tobacco("uc-cookie", "Undercoal", "Cookie", "Печенье", 2),
|
||||
|
||||
tobacco("ds-alpine-trip", "Darkside", "Алтайский трип", "Хвоя, фейхоа, эвкалипт", 2, true),
|
||||
|
||||
tobacco("wood-begemot", "Хулиган / WOOD", "Begemot", "Бергамот-мандарин", 2),
|
||||
tobacco("wood-boo", "Хулиган / WOOD", "Boo", "Яблоко-гранат", 2),
|
||||
tobacco("wood-old", "Хулиган / WOOD", "Old", "Лимон с мёдом", 2),
|
||||
tobacco("wood-berry-ninja", "Хулиган / WOOD", "Берри Ниндзя", "Лесные ягоды", 2),
|
||||
tobacco("wood-sir-hard", "Хулиган / WOOD", "Sir Hard", "Воздушный рис", 3),
|
||||
|
||||
tobacco("hupreme-milk-tea", "Hupreme", "Чай с молоком", undefined, 2),
|
||||
tobacco("hupreme-gooseberry", "Hupreme", "Крыжовник", undefined, 2),
|
||||
tobacco("hupreme-guava", "Hupreme", "Гуава", undefined, 2),
|
||||
|
||||
tobacco("jent-blue-agave", "JENT Alcohol Line", "Blue Agave", "«Текила Бум»", 2),
|
||||
tobacco("jent-havana", "JENT Alcohol Line", "Havana 290", "Мохито", 2, true),
|
||||
tobacco("jent-cuba-libre", "JENT Alcohol Line", "Cuba Libre", undefined, 2),
|
||||
|
||||
tobacco("deus-blackberry-wine", "DEUS", "Blackberry Wine", "Ежевичное вино", 2),
|
||||
tobacco("deus-guinness", "DEUS", "Guinness", "Тёмное пиво", 2),
|
||||
tobacco("deus-peonies", "DEUS", "Peonies", "Пионы", 2),
|
||||
tobacco("deus-violet-zephyr", "DEUS", "Violet Zephyr", "Фиалковый зефир", 2),
|
||||
tobacco("deus-cherry-jelly", "DEUS", "Cherry Jelly", "Вишнёвое желе", 2),
|
||||
tobacco("deus-pumpkin-pie", "DEUS", "Pumpkin Pie", "Тыквенный пирог с миндалём", 2),
|
||||
tobacco("deus-blueberry-yogurt", "DEUS", "Blueberry Yogurt", "Черничный йогурт", 2),
|
||||
tobacco("deus-base", "DEUS", "Base", "Табачный лист", 2),
|
||||
tobacco("deus-champagne", "DEUS", "Champagne", "Игристое вино", 2),
|
||||
|
||||
tobacco("north-flower", "Северный", "Цветочный", undefined, 3),
|
||||
tobacco("north-feijoa", "Северный", "Финдеперцовый фейхоа", undefined, 3),
|
||||
tobacco("north-elderberry", "Северный", "Бузина", undefined, 3),
|
||||
tobacco("north-sorbet", "Северный", "Sorbet", "Фруктовый", 3),
|
||||
|
||||
tobacco("bliss-mango-chamomile", "Bliss", "Манго-ромашка", undefined, 1),
|
||||
tobacco("bliss-peach-yogurt", "Bliss", "Персик-йогурт", undefined, 1),
|
||||
tobacco("bliss-lime", "Bliss", "Лайм", undefined, 1),
|
||||
tobacco("bliss-love-shot", "Bliss", "Love Shot", "Маракуйя, арбуз, лимон, холодок", 1, true),
|
||||
tobacco("bliss-strawberry", "Bliss", "Клубника", undefined, 1),
|
||||
|
||||
tobacco("muassel-cinnamon-gum", "Muassel", "Жвачка с корицей", undefined, 3),
|
||||
tobacco("chabacco-strawberry-milksake", "Chabacco", "Mix", "Клубничный милкшейк", 2),
|
||||
tobacco("joy-kiwichanga", "Joy Kiwichanga", "Киви, фейхоа", undefined, 2, false, true, "https://alphahookah.ru/upload/iblock/7e9/ah3jnujz5k06qd717ml9wo52t0s3bi3v.png"),
|
||||
tobacco("hooligan-grapefruit", "Хулиган", "Грейпфрутовый сок", undefined, 2),
|
||||
tobacco("sarma-drunk-pear", "Сарма", "Дачная груша", undefined, 2),
|
||||
tobacco("sarma-corn-paprika", "Сарма", "Кукуруза-паприка", undefined, 2),
|
||||
tobacco("hooligan-flash", "Хулиган", "«Флеш»", "Медовая малина", 2),
|
||||
tobacco("add-north", "Добавка", "Север", "Бустер", 1, true),
|
||||
tobacco("add-cooling", "Добавка", "Холодок", undefined, 1, true),
|
||||
];
|
||||
|
||||
export const tobaccoBrands = [...new Set(tobaccoFlavors.map((f) => f.brand))].sort((a, b) =>
|
||||
a.localeCompare(b, "ru")
|
||||
);
|
||||
|
||||
export const tobaccoCatalogNotice =
|
||||
"Актуальный ассортимент по вашей карте. Изображение показывает упаковку или визуал бренда; наличие отмечено в каждой карточке.";
|
||||
|
||||
/** Витрина: генерации движка по всем профилям/крепостям/холодку. */
|
||||
/** Табаки, которых нет на сайте (или они помечены недоступными), в витрину
|
||||
* не берём: каждый микс собран из реального ассортимента «Вкусов». */
|
||||
const siteUnavailableFlavorIds: string[] = FLAVORS.filter((f) => {
|
||||
const t = tobaccoFlavors.find((x) => x.id === (f.catalogId ?? f.id));
|
||||
return !!t && !t.available;
|
||||
}).map((f) => f.id);
|
||||
|
||||
/** Витрина: генерации движка по всем профилям/крепостям/холодку. */
|
||||
const showcase = generateShowcaseMixes(siteUnavailableFlavorIds);
|
||||
|
||||
/** Тег фильтра «Вкус» из категории вкуса состава; холодок-добавка — «лёд». */
|
||||
const flavorTag = (flavorId: string): string | null => {
|
||||
const f = getFlavor(flavorId);
|
||||
if (!f) return null;
|
||||
return f.category === "cooling" ? "лёд" : CATEGORY_LABELS[f.category];
|
||||
};
|
||||
|
||||
export const hookahMixes: HookahMix[] = showcase.map(({ mix, strength, cooling }, index) => ({
|
||||
id: `showcase-${index + 1}`,
|
||||
name: mix.name,
|
||||
desc: mix.description,
|
||||
strength,
|
||||
cooling,
|
||||
flavorTags: [...new Set(mix.items.map((i) => flavorTag(i.flavorId)).filter((t): t is string => !!t))],
|
||||
price: strength >= 5 ? PRICE_STRONG : PRICE_BASE,
|
||||
featured: index < 5,
|
||||
items: mix.items.map((i) => ({ flavorId: i.flavorId })),
|
||||
}));
|
||||
|
||||
export const mixFlavorTags = [...new Set(hookahMixes.flatMap((m) => m.flavorTags))].sort(
|
||||
(a, b) => a.localeCompare(b, "ru")
|
||||
);
|
||||
|
||||
export const mixesCatalogNotice =
|
||||
"Цены указаны за один кальян. Крепкие миксы — 1 800 ₽, остальные — 1 400 ₽.";
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* PlayStation 5 */
|
||||
/* Формат: название · изображение · жанр · макс. игроков */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export type Ps5Game = {
|
||||
id: string;
|
||||
name: string;
|
||||
genre: string;
|
||||
maxPlayers: number;
|
||||
image: string; // путь к обложке, пустая строка = CSS-плейсхолдер
|
||||
accent?: string; // цвет для плейсхолдера
|
||||
};
|
||||
|
||||
export const ps5Games: Ps5Game[] = [
|
||||
{
|
||||
id: "fifa-25",
|
||||
name: "FIFA 25",
|
||||
genre: "Футбольный симулятор",
|
||||
maxPlayers: 4,
|
||||
image: "/images/games/fifa25.jfif",
|
||||
},
|
||||
{
|
||||
id: "ufc-5",
|
||||
name: "UFC 5",
|
||||
genre: "Файтинг",
|
||||
maxPlayers: 2,
|
||||
image: "/images/games/ufc5.jfif",
|
||||
},
|
||||
{
|
||||
id: "mortal-kombat-1",
|
||||
name: "Mortal Kombat 1",
|
||||
genre: "Файтинг",
|
||||
maxPlayers: 2,
|
||||
image: "/images/games/mk1.jpg",
|
||||
},
|
||||
{
|
||||
id: "move-or-die",
|
||||
name: "Move or Die",
|
||||
genre: "Кооперативная аркада",
|
||||
maxPlayers: 4,
|
||||
image: "/images/games/mod.jpg",
|
||||
},
|
||||
{
|
||||
id: "overcooked",
|
||||
name: "Overcooked",
|
||||
genre: "Кооперативная аркада",
|
||||
maxPlayers: 4,
|
||||
image: "/images/games/over.jpg",
|
||||
},
|
||||
|
||||
/* --- сингл-игры --- */
|
||||
{
|
||||
id: "god-of-war-ragnarok",
|
||||
name: "God of War Ragnarök",
|
||||
genre: "Экшен-приключение",
|
||||
maxPlayers: 1,
|
||||
image: "/images/games/gowr.jpg",
|
||||
},
|
||||
{
|
||||
id: "god-of-war",
|
||||
name: "God of War",
|
||||
genre: "Экшен-приключение",
|
||||
maxPlayers: 1,
|
||||
image: "/images/games/gow.jpg",
|
||||
},
|
||||
{
|
||||
id: "spider-man-remastered",
|
||||
name: "Marvel's Spider-Man Remastered",
|
||||
genre: "Экшен-приключение",
|
||||
maxPlayers: 1,
|
||||
image: "/images/games/smr.jpg",
|
||||
},
|
||||
];
|
||||
|
||||
export const gameGenres = [...new Set(ps5Games.map((g) => g.genre))].sort((a, b) =>
|
||||
a.localeCompare(b, "ru")
|
||||
);
|
||||
|
||||
export const gamesCatalogNotice =
|
||||
"Количество геймпадов уточняйте при бронировании VIP-зала.";
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Настольные игры */
|
||||
/* Формат: название · тип · игроки (мин–макс) · время · сложность */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export type BoardGameCategory =
|
||||
| "Карточные"
|
||||
| "Классика"
|
||||
| "Компанейские"
|
||||
| "Стратегия"
|
||||
| "На логику";
|
||||
|
||||
export type BoardGameDifficulty = 1 | 2 | 3; // 1 — правила за минуту, 3 — надо вникать
|
||||
|
||||
export type BoardGame = {
|
||||
id: string;
|
||||
name: string;
|
||||
category: BoardGameCategory;
|
||||
minPlayers: number;
|
||||
maxPlayers: number;
|
||||
duration: string; // «20–40 мин»
|
||||
difficulty: BoardGameDifficulty;
|
||||
desc: string;
|
||||
icon: string; // ключ иконки для карточки
|
||||
accent: string; // цвет плейсхолдера
|
||||
hit?: boolean;
|
||||
};
|
||||
|
||||
export const boardGameDifficultyLabels: Record<BoardGameDifficulty, string> = {
|
||||
1: "Простая",
|
||||
2: "Средняя",
|
||||
3: "Сложная",
|
||||
};
|
||||
|
||||
export const boardGames: BoardGame[] = [
|
||||
{
|
||||
id: "mafia",
|
||||
name: "Мафия",
|
||||
category: "Компанейские",
|
||||
minPlayers: 6,
|
||||
maxPlayers: 16,
|
||||
duration: "40–90 мин",
|
||||
difficulty: 1,
|
||||
desc: "Город засыпает — просыпается мафия. Психологическая игра на блеф и дедукцию для большой компании.",
|
||||
icon: "eye",
|
||||
accent: "#b026ff",
|
||||
hit: true,
|
||||
},
|
||||
{
|
||||
id: "bunker",
|
||||
name: "Бункер",
|
||||
category: "Компанейские",
|
||||
minPlayers: 4,
|
||||
maxPlayers: 16,
|
||||
duration: "40–60 мин",
|
||||
difficulty: 1,
|
||||
desc: "Апокалипсис близко, а мест в бункере на всех не хватит. Докажи, что именно ты нужен человечеству.",
|
||||
icon: "skull",
|
||||
accent: "#00f0ff",
|
||||
hit: true,
|
||||
},
|
||||
{
|
||||
id: "cards",
|
||||
name: "Игральные карты",
|
||||
category: "Карточные",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 8,
|
||||
duration: "10–60 мин",
|
||||
difficulty: 1,
|
||||
desc: "Классическая колода 54 карты: дурак, покер, 21, бридж — играйте во что угодно.",
|
||||
icon: "spade",
|
||||
accent: "#ff4d6d",
|
||||
hit: true,
|
||||
},
|
||||
{
|
||||
id: "chess",
|
||||
name: "Шахматы",
|
||||
category: "Классика",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 2,
|
||||
duration: "20–60 мин",
|
||||
difficulty: 3,
|
||||
desc: "Королевская игра. Дуэль умов на 64 клетках под неоновым светом.",
|
||||
icon: "crown",
|
||||
accent: "#e0e0e0",
|
||||
},
|
||||
{
|
||||
id: "backgammon",
|
||||
name: "Нарды",
|
||||
category: "Классика",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 2,
|
||||
duration: "20–40 мин",
|
||||
difficulty: 2,
|
||||
desc: "Длинные и короткие нарды. Кости, стратегия и немного удачи — идеально под кальян.",
|
||||
icon: "dices",
|
||||
accent: "#f4a261",
|
||||
hit: true,
|
||||
},
|
||||
{
|
||||
id: "domino",
|
||||
name: "Домино",
|
||||
category: "Классика",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 4,
|
||||
duration: "15–30 мин",
|
||||
difficulty: 1,
|
||||
desc: "Забей «козла» — простая и азартная игра, в которую можно играть часами.",
|
||||
icon: "grid",
|
||||
accent: "#ffd23d",
|
||||
},
|
||||
{
|
||||
id: "checkers",
|
||||
name: "Шашки",
|
||||
category: "Классика",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 2,
|
||||
duration: "10–30 мин",
|
||||
difficulty: 1,
|
||||
desc: "Русские шашки и поддавки. Быстро, азартно, знакомо с детства.",
|
||||
icon: "circle",
|
||||
accent: "#4dff88",
|
||||
},
|
||||
{
|
||||
id: "uno",
|
||||
name: "UNO",
|
||||
category: "Карточные",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 10,
|
||||
duration: "15–30 мин",
|
||||
difficulty: 1,
|
||||
desc: "Скинь все карты первым. +4, пропуск хода и разворот — главное, не забудь крикнуть «УНО!».",
|
||||
icon: "hash",
|
||||
accent: "#ff3636",
|
||||
hit: true,
|
||||
},
|
||||
{
|
||||
id: "monopoly",
|
||||
name: "Монополия",
|
||||
category: "Стратегия",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 6,
|
||||
duration: "60–120 мин",
|
||||
difficulty: 2,
|
||||
desc: "Скупай улицы, строй отели и разоряй друзей. Классика, которая ссорит компании уже сто лет.",
|
||||
icon: "landmark",
|
||||
accent: "#2ec27e",
|
||||
},
|
||||
{
|
||||
id: "jenga",
|
||||
name: "Дженга",
|
||||
category: "Компанейские",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 8,
|
||||
duration: "10–20 мин",
|
||||
difficulty: 1,
|
||||
desc: "Вытаскивай брусок и клади наверх. Кто уронит башню — тот и проиграл. Твёрдая рука обязательна.",
|
||||
icon: "layout",
|
||||
accent: "#d4af37",
|
||||
},
|
||||
{
|
||||
id: "alias",
|
||||
name: "Alias",
|
||||
category: "Компанейские",
|
||||
minPlayers: 4,
|
||||
maxPlayers: 12,
|
||||
duration: "30–60 мин",
|
||||
difficulty: 1,
|
||||
desc: "Объясни слово команде, не называя его. Игра на скорость мысли и командную химию.",
|
||||
icon: "brain",
|
||||
accent: "#ff8a00",
|
||||
},
|
||||
{
|
||||
id: "imaginarium",
|
||||
name: "Имаджинариум",
|
||||
category: "Компанейские",
|
||||
minPlayers: 4,
|
||||
maxPlayers: 7,
|
||||
duration: "30–60 мин",
|
||||
difficulty: 1,
|
||||
desc: "Загадай ассоциацию к карточке с сюрреалистичной картинкой. Творческая игра для душевной компании.",
|
||||
icon: "puzzle",
|
||||
accent: "#c77dff",
|
||||
},
|
||||
{
|
||||
id: "crocodile",
|
||||
name: "Крокодил",
|
||||
category: "Компанейские",
|
||||
minPlayers: 4,
|
||||
maxPlayers: 16,
|
||||
duration: "20–60 мин",
|
||||
difficulty: 1,
|
||||
desc: "Покажи слово жестами — без звуков и подсказок. Гарантированно смешно.",
|
||||
icon: "users",
|
||||
accent: "#00c2a8",
|
||||
},
|
||||
{
|
||||
id: "poker",
|
||||
name: "Покерный набор",
|
||||
category: "Карточные",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 9,
|
||||
duration: "60–180 мин",
|
||||
difficulty: 2,
|
||||
desc: "Фишки, колоды и дилерская кнопка. Техасский холдем на серьёзных щах — но только на интерес.",
|
||||
icon: "club",
|
||||
accent: "#1fa37a",
|
||||
},
|
||||
{
|
||||
id: "exploding-kittens",
|
||||
name: "Взрывные котята",
|
||||
category: "Карточные",
|
||||
minPlayers: 2,
|
||||
maxPlayers: 5,
|
||||
duration: "15 мин",
|
||||
difficulty: 1,
|
||||
desc: "Русская рулетка с котиками. Тяни карту и молись, чтобы не попался взрывной котёнок.",
|
||||
icon: "ghost",
|
||||
accent: "#ff6b9d",
|
||||
},
|
||||
{
|
||||
id: "catan",
|
||||
name: "Колонизаторы (Catan)",
|
||||
category: "Стратегия",
|
||||
minPlayers: 3,
|
||||
maxPlayers: 4,
|
||||
duration: "60–90 мин",
|
||||
difficulty: 2,
|
||||
desc: "Строй дороги и поселения, торгуй ресурсами. Одна из лучших стратегий в истории настолок.",
|
||||
icon: "castle",
|
||||
accent: "#e9c46a",
|
||||
},
|
||||
{
|
||||
id: "dixit",
|
||||
name: "Диксит",
|
||||
category: "Компанейские",
|
||||
minPlayers: 3,
|
||||
maxPlayers: 6,
|
||||
duration: "30 мин",
|
||||
difficulty: 1,
|
||||
desc: "Расскажи историю по картинке так, чтобы угадала часть игроков — но не все.",
|
||||
icon: "heart",
|
||||
accent: "#f77f00",
|
||||
},
|
||||
{
|
||||
id: "codenames",
|
||||
name: "Кодовые имена",
|
||||
category: "На логику",
|
||||
minPlayers: 4,
|
||||
maxPlayers: 8,
|
||||
duration: "15–30 мин",
|
||||
difficulty: 2,
|
||||
desc: "Капитаны дают ассоциации одним словом, команда ищет своих агентов. Напряжённо и умно.",
|
||||
icon: "target",
|
||||
accent: "#4895ef",
|
||||
},
|
||||
];
|
||||
|
||||
export const boardGameCategories = [...new Set(boardGames.map((g) => g.category))].sort(
|
||||
(a, b) => a.localeCompare(b, "ru")
|
||||
);
|
||||
|
||||
export const boardGamesNotice =
|
||||
"Все игры бесплатны для гостей — просто попросите у бармена. Наличие конкретной игры уточняйте на месте.";
|
||||
@@ -0,0 +1,628 @@
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* База вкусов для rule-based генератора миксов */
|
||||
/* Владелец сайта добавляет новые вкусы только в этот файл: */
|
||||
/* 1) дописать объект в массив FLAVORS; */
|
||||
/* 2) если вводит новую категорию — добавить её в CATEGORY_MATRIX. */
|
||||
/* Код движка и UI трогать не нужно. */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export type FlavorCategory =
|
||||
| "fruits"
|
||||
| "berries"
|
||||
| "citrus"
|
||||
| "tropical"
|
||||
| "dessert"
|
||||
| "drinks"
|
||||
| "spices"
|
||||
| "cooling";
|
||||
|
||||
export type FlavorStrength = "light" | "medium" | "strong";
|
||||
export type FlavorRole = "base" | "accent";
|
||||
|
||||
export type ProfileId =
|
||||
| "fresh"
|
||||
| "dessert"
|
||||
| "tropical"
|
||||
| "berry"
|
||||
| "citrus";
|
||||
|
||||
export interface Flavor {
|
||||
id: string; // slug, латиницей — используется в share-ссылках
|
||||
catalogId?: string; // id этого вкуса в каталоге tobaccoFlavors (data/catalog.ts), если слаги различаются; по нему работает стоп-лист CRM
|
||||
name: string; // название для гостя
|
||||
brand: string; // производитель (для карточки)
|
||||
category: FlavorCategory;
|
||||
intensity: 1 | 2 | 3 | 4 | 5; // «громкость» вкуса, 1 — фон, 5 — доминанта
|
||||
sweetness: number; // 0–100
|
||||
sourness: number; // 0–100
|
||||
cooling: number; // 0–100, собственная ментоловость вкуса
|
||||
roles: FlavorRole[]; // в каких ролях может стоять в чаше
|
||||
pairs_with: FlavorCategory[]; // предпочтительные категории-партнёры
|
||||
avoid_with: string[]; // жёсткий запрет: id или категория
|
||||
strength: FlavorStrength | "any"; // any — добавка, подходит под любую крепость
|
||||
popularity: number; // 0–1, стартовый вес в случайном выборе
|
||||
}
|
||||
|
||||
/* Категории, с которых микс может начинаться (основа) по профилям */
|
||||
export const PROFILES: Record<
|
||||
ProfileId,
|
||||
{ label: string; baseCategories: FlavorCategory[] }
|
||||
> = {
|
||||
fresh: { label: "Свежий", baseCategories: ["citrus", "fruits", "berries"] },
|
||||
dessert: {
|
||||
label: "Десертный",
|
||||
baseCategories: ["dessert", "drinks", "tropical", "berries"],
|
||||
},
|
||||
tropical: { label: "Тропический", baseCategories: ["tropical", "fruits"] },
|
||||
berry: { label: "Ягодный", baseCategories: ["berries"] },
|
||||
citrus: { label: "Цитрусовый", baseCategories: ["citrus"] },
|
||||
};
|
||||
|
||||
export const CATEGORY_LABELS: Record<FlavorCategory, string> = {
|
||||
fruits: "Фрукты",
|
||||
berries: "Ягоды",
|
||||
citrus: "Цитрус",
|
||||
tropical: "Тропики",
|
||||
dessert: "Десерты",
|
||||
drinks: "Напитки",
|
||||
spices: "Пряности",
|
||||
cooling: "Холодок",
|
||||
};
|
||||
|
||||
export const STRENGTH_LABELS: Record<FlavorStrength, string> = {
|
||||
light: "Лёгкая",
|
||||
medium: "Средняя",
|
||||
strong: "Крепкая",
|
||||
};
|
||||
|
||||
/* Матрица совместимости категорий:
|
||||
1 — отлично дружат;
|
||||
0 — нейтрально, генератор берёт, но с весом ×0.5;
|
||||
-1 — конфликт, такая пара запрещена. */
|
||||
export const CATEGORY_MATRIX: Record<
|
||||
FlavorCategory,
|
||||
Partial<Record<FlavorCategory, number>>
|
||||
> = {
|
||||
berries: {
|
||||
berries: 1,
|
||||
citrus: 1,
|
||||
fruits: 1,
|
||||
tropical: 1,
|
||||
dessert: 1, // ягоды со сливками
|
||||
drinks: 0,
|
||||
spices: 0,
|
||||
cooling: 1,
|
||||
},
|
||||
citrus: {
|
||||
citrus: 1,
|
||||
fruits: 1,
|
||||
tropical: 1,
|
||||
dessert: 0,
|
||||
drinks: 1, // лимон в колу/лимонад
|
||||
spices: 1, // лайм с базиликом (мохито)
|
||||
cooling: 1,
|
||||
},
|
||||
fruits: {
|
||||
fruits: 1,
|
||||
tropical: 1,
|
||||
dessert: 1, // яблочный пирог
|
||||
drinks: 0,
|
||||
spices: 0,
|
||||
cooling: 1,
|
||||
},
|
||||
tropical: {
|
||||
tropical: 1,
|
||||
dessert: 1, // банан со сливками, пина-колада
|
||||
drinks: 1,
|
||||
spices: 0,
|
||||
cooling: 1,
|
||||
},
|
||||
dessert: {
|
||||
dessert: 1,
|
||||
drinks: 1, // ванильная кола, печенье с латте
|
||||
spices: 0,
|
||||
cooling: 1, // шоколад-мята, фисташковый лёд
|
||||
},
|
||||
drinks: {
|
||||
drinks: 1,
|
||||
spices: -1, // кола с базиликом не работает
|
||||
cooling: 1,
|
||||
},
|
||||
spices: {
|
||||
spices: 0,
|
||||
cooling: 1, // мята-базилик
|
||||
},
|
||||
cooling: {
|
||||
cooling: -1, // два холодка в одной чаше — перебор
|
||||
},
|
||||
};
|
||||
|
||||
/* 20 актуальных вкусов из ассортимента бара */
|
||||
export const FLAVORS: Flavor[] = [
|
||||
/* ---------------- Крепкие (Blackburn) ---------------- */
|
||||
{
|
||||
id: "white-grape",
|
||||
catalogId: "bb-white-grape",
|
||||
name: "White Grape — белый виноград",
|
||||
brand: "Blackburn",
|
||||
category: "berries",
|
||||
intensity: 3,
|
||||
sweetness: 72,
|
||||
sourness: 18,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["dessert", "citrus", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.55,
|
||||
},
|
||||
{
|
||||
id: "blueberry-bb",
|
||||
catalogId: "bb-blueberry",
|
||||
name: "Blueberry — голубика",
|
||||
brand: "Blackburn",
|
||||
category: "berries",
|
||||
intensity: 4,
|
||||
sweetness: 60,
|
||||
sourness: 30,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["dessert", "citrus", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.7,
|
||||
},
|
||||
{
|
||||
id: "lemon-shock",
|
||||
catalogId: "bb-lemon-shock",
|
||||
name: "Lemon Shock — ультракислый лимон",
|
||||
brand: "Blackburn",
|
||||
category: "citrus",
|
||||
intensity: 5,
|
||||
sweetness: 25,
|
||||
sourness: 92,
|
||||
cooling: 0,
|
||||
roles: ["accent", "base"],
|
||||
pairs_with: ["berries", "fruits", "tropical", "cooling"],
|
||||
avoid_with: ["dessert"],
|
||||
strength: "strong",
|
||||
popularity: 0.75,
|
||||
},
|
||||
{
|
||||
id: "pineapple-bb",
|
||||
catalogId: "bb-pineapple",
|
||||
name: "Pineapple — сочный ананас",
|
||||
brand: "Blackburn",
|
||||
category: "tropical",
|
||||
intensity: 4,
|
||||
sweetness: 75,
|
||||
sourness: 35,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["citrus", "dessert", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.6,
|
||||
},
|
||||
{
|
||||
id: "mango-bb",
|
||||
catalogId: "bb-juicy-mango",
|
||||
name: "Сочное манго",
|
||||
brand: "Blackburn",
|
||||
category: "tropical",
|
||||
intensity: 4,
|
||||
sweetness: 80,
|
||||
sourness: 15,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["citrus", "dessert", "berries"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.66,
|
||||
},
|
||||
{
|
||||
id: "bananini",
|
||||
catalogId: "bb-bananini",
|
||||
name: "Bananini — банан",
|
||||
brand: "Blackburn",
|
||||
category: "tropical",
|
||||
intensity: 3,
|
||||
sweetness: 78,
|
||||
sourness: 5,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["dessert", "berries"],
|
||||
avoid_with: ["citrus"], // банан с кислым лимоном распадается
|
||||
strength: "strong",
|
||||
popularity: 0.42,
|
||||
},
|
||||
{
|
||||
id: "brownie",
|
||||
catalogId: "bb-brownie",
|
||||
name: "Брауни",
|
||||
brand: "Blackburn",
|
||||
category: "dessert",
|
||||
intensity: 4,
|
||||
sweetness: 85,
|
||||
sourness: 0,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["berries", "drinks", "tropical"],
|
||||
avoid_with: ["citrus"], // шоколад + агрессивная кислота = конфликт
|
||||
strength: "strong",
|
||||
popularity: 0.5,
|
||||
},
|
||||
{
|
||||
id: "pistachio-ice-snow",
|
||||
catalogId: "bb-pistachio-ice",
|
||||
name: "Pistachio Ice Snow — фисташковое мороженое",
|
||||
brand: "Blackburn",
|
||||
category: "dessert",
|
||||
intensity: 3,
|
||||
sweetness: 70,
|
||||
sourness: 5,
|
||||
cooling: 35,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["drinks", "berries"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.45,
|
||||
},
|
||||
{
|
||||
id: "basilic",
|
||||
catalogId: "bb-basilic",
|
||||
name: "Basilic — базилик",
|
||||
brand: "Blackburn",
|
||||
category: "spices",
|
||||
intensity: 3,
|
||||
sweetness: 10,
|
||||
sourness: 20,
|
||||
cooling: 0,
|
||||
roles: ["accent"],
|
||||
pairs_with: ["citrus", "cooling", "fruits"],
|
||||
avoid_with: ["drinks"],
|
||||
strength: "strong",
|
||||
popularity: 0.38,
|
||||
},
|
||||
{
|
||||
id: "classic-cola",
|
||||
catalogId: "bb-cola",
|
||||
name: "Классическая кола",
|
||||
brand: "Blackburn",
|
||||
category: "drinks",
|
||||
intensity: 4,
|
||||
sweetness: 65,
|
||||
sourness: 10,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["dessert", "citrus", "cooling"],
|
||||
avoid_with: ["spices"],
|
||||
strength: "strong",
|
||||
popularity: 0.58,
|
||||
},
|
||||
{
|
||||
id: "honey-melon",
|
||||
catalogId: "bb-honey-melon",
|
||||
name: "Медовая дыня",
|
||||
brand: "Blackburn",
|
||||
category: "fruits",
|
||||
intensity: 3,
|
||||
sweetness: 68,
|
||||
sourness: 12,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["citrus", "cooling", "tropical"],
|
||||
avoid_with: [],
|
||||
strength: "strong",
|
||||
popularity: 0.44,
|
||||
},
|
||||
|
||||
/* ---------------- Средняя крепость (Undercoal / Banger) ---------------- */
|
||||
{
|
||||
id: "pinkman",
|
||||
catalogId: "uc-pinkman",
|
||||
name: "Pinkman — клубника, малина, грейпфрут",
|
||||
brand: "Undercoal",
|
||||
category: "berries",
|
||||
intensity: 4,
|
||||
sweetness: 45,
|
||||
sourness: 60,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["citrus", "dessert", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "medium",
|
||||
popularity: 0.72,
|
||||
},
|
||||
{
|
||||
id: "pear-lemon-tarhun",
|
||||
catalogId: "uc-pear-tarragon",
|
||||
name: "Груша, лимон и тархун",
|
||||
brand: "Undercoal",
|
||||
category: "citrus",
|
||||
intensity: 3,
|
||||
sweetness: 40,
|
||||
sourness: 55,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["fruits", "berries", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "medium",
|
||||
popularity: 0.5,
|
||||
},
|
||||
{
|
||||
id: "cookie-uc",
|
||||
catalogId: "uc-cookie",
|
||||
name: "Cookie — печенье",
|
||||
brand: "Undercoal",
|
||||
category: "dessert",
|
||||
intensity: 3,
|
||||
sweetness: 80,
|
||||
sourness: 5,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["drinks", "berries", "tropical"],
|
||||
avoid_with: [],
|
||||
strength: "medium",
|
||||
popularity: 0.52,
|
||||
},
|
||||
{
|
||||
id: "green-day",
|
||||
catalogId: "banger-green-day",
|
||||
name: "Green Day — яблоко, киви, кислинка",
|
||||
brand: "Banger",
|
||||
category: "fruits",
|
||||
intensity: 3,
|
||||
sweetness: 35,
|
||||
sourness: 55,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["citrus", "cooling", "berries"],
|
||||
avoid_with: [],
|
||||
strength: "medium",
|
||||
popularity: 0.6,
|
||||
},
|
||||
|
||||
/* ---------------- Лёгкая крепость (Bliss) ---------------- */
|
||||
{
|
||||
id: "bliss-lime",
|
||||
name: "Лайм",
|
||||
brand: "Bliss",
|
||||
category: "citrus",
|
||||
intensity: 4,
|
||||
sweetness: 30,
|
||||
sourness: 70,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["berries", "fruits", "tropical", "cooling"],
|
||||
avoid_with: [],
|
||||
strength: "light",
|
||||
popularity: 0.57,
|
||||
},
|
||||
{
|
||||
id: "bliss-pomelo",
|
||||
catalogId: "bb-pomelo",
|
||||
name: "Помело",
|
||||
brand: "Bliss",
|
||||
category: "citrus",
|
||||
intensity: 3,
|
||||
sweetness: 35,
|
||||
sourness: 55,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["tropical", "fruits", "berries"],
|
||||
avoid_with: [],
|
||||
strength: "light",
|
||||
popularity: 0.48,
|
||||
},
|
||||
{
|
||||
id: "bliss-mango-chamomile",
|
||||
name: "Манго-ромашка",
|
||||
brand: "Bliss",
|
||||
category: "tropical",
|
||||
intensity: 3,
|
||||
sweetness: 70,
|
||||
sourness: 20,
|
||||
cooling: 0,
|
||||
roles: ["base"],
|
||||
pairs_with: ["citrus", "berries", "dessert"],
|
||||
avoid_with: [],
|
||||
strength: "light",
|
||||
popularity: 0.55,
|
||||
},
|
||||
{
|
||||
id: "bliss-strawberry",
|
||||
name: "Клубника",
|
||||
brand: "Bliss",
|
||||
category: "berries",
|
||||
intensity: 3,
|
||||
sweetness: 62,
|
||||
sourness: 35,
|
||||
cooling: 0,
|
||||
roles: ["base", "accent"],
|
||||
pairs_with: ["citrus", "dessert", "cooling", "tropical"],
|
||||
avoid_with: [],
|
||||
strength: "light",
|
||||
popularity: 0.63,
|
||||
},
|
||||
|
||||
/* ---------------- Добавка-холодок (под любую крепость) ---------------- */
|
||||
{
|
||||
id: "frost",
|
||||
catalogId: "add-cooling",
|
||||
name: "Super Frost — холодок",
|
||||
brand: "Добавка",
|
||||
category: "cooling",
|
||||
intensity: 3,
|
||||
sweetness: 0,
|
||||
sourness: 0,
|
||||
cooling: 100,
|
||||
roles: ["accent"],
|
||||
pairs_with: ["citrus", "fruits", "berries", "tropical", "drinks", "dessert"],
|
||||
avoid_with: ["spices"],
|
||||
strength: "any",
|
||||
popularity: 0.9, // добавка есть всегда, высока вероятность попадания
|
||||
},
|
||||
];
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Кураторские миксы — страховка, если генератор за 50 попыток */
|
||||
/* не собрал валидный микс (например, узкий профиль + стоп-лист). */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
export interface CuratedMix {
|
||||
id: string;
|
||||
name: string;
|
||||
profile: ProfileId;
|
||||
strength: FlavorStrength;
|
||||
cooling: boolean;
|
||||
recipe: { flavorId: string; percent: number }[];
|
||||
}
|
||||
|
||||
export const CURATED_MIXES: CuratedMix[] = [
|
||||
{
|
||||
id: "cur-cyan-breeze",
|
||||
name: "Циановый бриз",
|
||||
profile: "fresh",
|
||||
strength: "medium",
|
||||
cooling: true,
|
||||
recipe: [
|
||||
{ flavorId: "green-day", percent: 55 },
|
||||
{ flavorId: "pinkman", percent: 30 },
|
||||
{ flavorId: "frost", percent: 15 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "cur-frost-melon",
|
||||
name: "Морозная дыня",
|
||||
profile: "fresh",
|
||||
strength: "strong",
|
||||
cooling: true,
|
||||
recipe: [
|
||||
{ flavorId: "honey-melon", percent: 55 },
|
||||
{ flavorId: "lemon-shock", percent: 30 },
|
||||
{ flavorId: "frost", percent: 15 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "cur-midnight-grape",
|
||||
name: "Полночный виноград",
|
||||
profile: "berry",
|
||||
strength: "strong",
|
||||
cooling: false,
|
||||
recipe: [
|
||||
{ flavorId: "white-grape", percent: 60 },
|
||||
{ flavorId: "blueberry-bb", percent: 40 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "cur-velvet-plombir",
|
||||
name: "Бархатный пломбир",
|
||||
profile: "dessert",
|
||||
strength: "strong",
|
||||
cooling: false,
|
||||
recipe: [
|
||||
{ flavorId: "pistachio-ice-snow", percent: 55 },
|
||||
{ flavorId: "brownie", percent: 30 },
|
||||
{ flavorId: "classic-cola", percent: 15 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "cur-sunset-lagoon",
|
||||
name: "Закатная лагуна",
|
||||
profile: "tropical",
|
||||
strength: "light",
|
||||
cooling: true,
|
||||
recipe: [
|
||||
{ flavorId: "bliss-mango-chamomile", percent: 60 },
|
||||
{ flavorId: "bliss-lime", percent: 25 },
|
||||
{ flavorId: "frost", percent: 15 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "cur-neon-citrus",
|
||||
name: "Неоновый цитрус",
|
||||
profile: "citrus",
|
||||
strength: "light",
|
||||
cooling: false,
|
||||
recipe: [
|
||||
{ flavorId: "bliss-pomelo", percent: 65 },
|
||||
{ flavorId: "bliss-lime", percent: 35 },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
/** Эпитет в трёх родах — согласуется с названием вкуса («Морозная дыня») */
|
||||
export interface EpithetForms {
|
||||
m: string;
|
||||
f: string;
|
||||
n: string;
|
||||
}
|
||||
|
||||
/* Неоновые эпитеты для генерации названий по профилям */
|
||||
export const PROFILE_EPITHETS: Record<ProfileId, EpithetForms[]> = {
|
||||
fresh: [
|
||||
{ m: "Морозный", f: "Морозная", n: "Морозное" },
|
||||
{ m: "Ледяной", f: "Ледяная", n: "Ледяное" },
|
||||
{ m: "Кристальный", f: "Кристальная", n: "Кристальное" },
|
||||
{ m: "Полярный", f: "Полярная", n: "Полярное" },
|
||||
],
|
||||
dessert: [
|
||||
{ m: "Бархатный", f: "Бархатная", n: "Бархатное" },
|
||||
{ m: "Ночной", f: "Ночная", n: "Ночное" },
|
||||
{ m: "Вельветовый", f: "Вельветовая", n: "Вельветовое" },
|
||||
{ m: "Сливочный", f: "Сливочная", n: "Сливочное" },
|
||||
],
|
||||
tropical: [
|
||||
{ m: "Тропический", f: "Тропическая", n: "Тропическое" },
|
||||
{ m: "Закатный", f: "Закатная", n: "Закатное" },
|
||||
{ m: "Солнечный", f: "Солнечная", n: "Солнечное" },
|
||||
{ m: "Спелый", f: "Спелая", n: "Спелое" },
|
||||
],
|
||||
berry: [
|
||||
{ m: "Неоновый", f: "Неоновая", n: "Неоновое" },
|
||||
{ m: "Пурпурный", f: "Пурпурная", n: "Пурпурное" },
|
||||
{ m: "Космический", f: "Космическая", n: "Космическое" },
|
||||
{ m: "Ягодный", f: "Ягодная", n: "Ягодное" },
|
||||
],
|
||||
citrus: [
|
||||
{ m: "Искрящийся", f: "Искрящаяся", n: "Искрящееся" },
|
||||
{ m: "Звонкий", f: "Звонкая", n: "Звонкое" },
|
||||
{ m: "Цитрусовый", f: "Цитрусовая", n: "Цитрусовое" },
|
||||
{ m: "Бодрящий", f: "Бодрящая", n: "Бодрящее" },
|
||||
],
|
||||
};
|
||||
|
||||
/* Фирменные «хвосты» для однострочного описания по профилям */
|
||||
/* Перевод вкуса для гостей: часть из названий миксов пришла на английском,
|
||||
поэтому даём русское прочтение каждого вкуса. */
|
||||
export const FLAVOR_TRANSLATIONS: Record<string, string> = {
|
||||
"white-grape": "Белый виноград",
|
||||
"blueberry-bb": "Голубика",
|
||||
"lemon-shock": "Ультракислый лимон",
|
||||
"pineapple-bb": "Сочный ананас",
|
||||
"mango-bb": "Сочное манго",
|
||||
bananini: "Банан",
|
||||
brownie: "Шоколадный брауни",
|
||||
"pistachio-ice-snow": "Фисташковое мороженое",
|
||||
basilic: "Базилик",
|
||||
"classic-cola": "Классическая кола",
|
||||
"honey-melon": "Медовая дыня",
|
||||
pinkman: "Клубника, малина и грейпфрут",
|
||||
"pear-lemon-tarhun": "Груша, лимон и тархун",
|
||||
"cookie-uc": "Печенье",
|
||||
"green-day": "Яблоко, киви и кислинка",
|
||||
"bliss-lime": "Лайм",
|
||||
"bliss-pomelo": "Помело",
|
||||
"bliss-mango-chamomile": "Манго-ромашка",
|
||||
"bliss-strawberry": "Клубника",
|
||||
frost: "Холодок (Super Frost)",
|
||||
};
|
||||
|
||||
export const PROFILE_TAILS: Record<ProfileId, string[]> = {
|
||||
fresh: ["свежесть до утра", "ледяной и чистый финиш", "прохлада с первой затяжки"],
|
||||
dessert: ["для долгих разговоров", "густое сладкое послевкусие", "мягкий десертный дым"],
|
||||
tropical: ["как закат у бара", "сочный тропический характер", "волна спелых фруктов"],
|
||||
berry: ["яркая ягодная волна", "сочная ягодная кислинка", "спелые ягоды в каждом вдохе"],
|
||||
citrus: ["бодрая цитрусовая искра", "звонкая кислинка на выдохе", "энергия чистого цитруса"],
|
||||
};
|
||||
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Реестр фотографий, которые реально присутствуют в public/menu.
|
||||
* Ключи — id позиций меню, поэтому фотографию нельзя случайно привязать к соседнему товару.
|
||||
*
|
||||
* Для авторского чая используются файлы из того же набора изображений:
|
||||
* названия фотографий исторически отличаются от названий позиций в каталоге,
|
||||
* но визуально и по составу соответствуют конкретным позициям.
|
||||
*/
|
||||
export const menuPhotos: Record<string, string> = {
|
||||
// Авторский чай
|
||||
"blackberry-mint": "./menu/myatnaya-ezhevika.avif",
|
||||
"raspberry-mint": "./menu/myatnaya-malina.avif",
|
||||
"seabuckthorn-orange": "./menu/osennyaya-oblepikha.avif",
|
||||
"seabuckthorn-cinnamon": "./menu/pryanyy-apelsin.avif",
|
||||
"forest-berries": "./menu/yagodnyy-vzryv.avif",
|
||||
"mango-seabuckthorn": "./menu/mangovyy-ray.avif",
|
||||
"raspberry-ginger": "./menu/malinovyy-s-imbirem.avif",
|
||||
|
||||
// Пивная карта
|
||||
bud: "./menu/bud.avif",
|
||||
"kozel-dark": "./menu/kozel-temnyy.avif",
|
||||
"stary-melnik-light": "./menu/staryy-melnik-svetloe.avif",
|
||||
"krone-blanche": "./menu/krone-blanche.avif",
|
||||
erzmann: "./menu/erzmann.avif",
|
||||
"el-capulco": "./menu/el-capulco.avif",
|
||||
stella: "./menu/stella.avif",
|
||||
"kozel-light": "./menu/kozel-svetlyy.avif",
|
||||
"stary-melnik-dark": "./menu/staryy-melnik-temnoe.avif",
|
||||
"pablos-lime": "./menu/pablo-s-s-sokom-layma.avif",
|
||||
redds: "./menu/redd-s.avif",
|
||||
spaten: "./menu/spatten.avif",
|
||||
hoegaarden: "./menu/hoegaarden.avif",
|
||||
"corona-extra": "./menu/corona-extra.avif",
|
||||
|
||||
// Закуски
|
||||
"onion-rings": "./menu/lukovye-koltsa.avif",
|
||||
fries: "./menu/kartofel-fri.avif",
|
||||
"buffalo-wings": "./menu/krylyshki-baffalo.avif",
|
||||
"cheese-sticks": "./menu/syrnye-palochki.avif",
|
||||
strips: "./menu/stripsy.avif",
|
||||
nuggets: "./menu/nagetsy.avif",
|
||||
|
||||
// Напитки и десерты
|
||||
"black-tea": "./menu/chernyy-chay.avif",
|
||||
"black-tea-thyme": "./menu/chernyy-chay-s-chabretsom.avif",
|
||||
"milk-oolong": "./menu/molochnyy-ulun.avif",
|
||||
americano: "./menu/amerikano.avif",
|
||||
cappuccino: "./menu/kapuchino.avif",
|
||||
"cheesecake-ny": "./menu/chizkeyk-nyu-york.avif",
|
||||
"red-velvet": "./menu/tort-krasnyy-barkhat.avif",
|
||||
medovik: "./menu/tort-medovik.avif",
|
||||
"cheesecake-strawberry": "./menu/chizkeyk-nyu-york-klubnichnyy.avif",
|
||||
"cheesecake-raspberry": "./menu/chizkeyk-nyu-york-malina.avif",
|
||||
|
||||
// Снеки и сладости
|
||||
"alpen-gold": "./menu/alpen-gold.avif",
|
||||
milka: "./menu/milka.avif",
|
||||
leys: "./menu/chipsy-leys.avif",
|
||||
korochki: "./menu/3-korochki.avif",
|
||||
hrustim: "./menu/khrustim-team.avif",
|
||||
|
||||
// Лимонады и энергетики
|
||||
"natakhtari-pear": "./menu/natakhtari-grusha.avif",
|
||||
"strawberry-kiwi": "./menu/klubnika-kivi.avif",
|
||||
feijoa: "./menu/feykhoa.avif",
|
||||
"natakhtari-feijoa": "./menu/natakhtari-feykhoa.avif",
|
||||
"natakhtari-saperavi": "./menu/natakhtari-saperavi.avif",
|
||||
"burn-original": "./menu/burn-originalnyy.avif",
|
||||
"adrenaline-rush": "./menu/adrenaline-rush-absolyutnaya-energiya.avif",
|
||||
"burn-apple-kiwi": "./menu/burn-yabloko-kivi.avif",
|
||||
"burn-mango": "./menu/burn-so-vkusom-mango.avif",
|
||||
};
|
||||
@@ -0,0 +1,94 @@
|
||||
export interface TeaItem {
|
||||
id: string;
|
||||
name: string;
|
||||
category: string;
|
||||
volume: string;
|
||||
price: number;
|
||||
priceFormatted: string;
|
||||
desc: string;
|
||||
ingredients: string[];
|
||||
accentColor: string; // Неоновый цвет рамки
|
||||
}
|
||||
|
||||
export const TEA_CATEGORY = "АВТОРСКИЙ ЧАЙ";
|
||||
|
||||
|
||||
export const authorTeas: TeaItem[] = [
|
||||
{
|
||||
id: "blackberry-mint",
|
||||
name: "Ежевика-мята",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Глубокий рубиновый настой спелой ежевики со свежей мятой. Освежающий, с лёгкой природной кислинкой и долгим послевкусием.",
|
||||
ingredients: ["Спелая ежевика", "Перечная мята", "Чайный сбор", "Тростниковый сахар"],
|
||||
accentColor: "#a855f7",
|
||||
},
|
||||
{
|
||||
id: "raspberry-mint",
|
||||
name: "Малина-мята",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Нежный ягодный чай на основе сочной лесной малины и ароматных мятных листьев. Согревающий и насыщенный вкус.",
|
||||
ingredients: ["Лесная малина", "Свежая мята", "Цветочный чай", "Натуральный сироп"],
|
||||
accentColor: "#ec4899",
|
||||
},
|
||||
{
|
||||
id: "seabuckthorn-orange",
|
||||
name: "Облепиха-апельсин",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Золотистый витаминный чай с сочными кружочками апельсина и отборной сибирской облепихой. Яркий цитрусовый заряд.",
|
||||
ingredients: ["Ягоды облепихи", "Свежий апельсин", "Апельсиновый сок", "Мёд"],
|
||||
accentColor: "#f59e0b",
|
||||
},
|
||||
{
|
||||
id: "seabuckthorn-cinnamon",
|
||||
name: "Облепиха-корица",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Пряный согревающий купаж с цельными палочками корицы, кружками апельсина и яркой облепихой. Идеально под вечерний кальян.",
|
||||
ingredients: ["Облепиха", "Палочки корицы", "Дольки апельсина", "Гвоздика", "Мёд"],
|
||||
accentColor: "#f97316",
|
||||
},
|
||||
{
|
||||
id: "forest-berries",
|
||||
name: "Лесные ягоды",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Густой ягодный микс из спелой ежевики и малины. Насыщенный цвет, природная сладость и лёгкая ягодная терпкость.",
|
||||
ingredients: ["Ежевика", "Малина", "Чёрный байховый чай", "Ягодный концентрат"],
|
||||
accentColor: "#d946ef",
|
||||
},
|
||||
{
|
||||
id: "mango-seabuckthorn",
|
||||
name: "Манго-облепиха",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Экзотический микс нежной мякоти манго и сибирской облепихи. Солнечный тропический вкус с бархатистой текстурой.",
|
||||
ingredients: ["Кусочки спелого манго", "Облепиха", "Тропический чай", "Фруктовый нектар"],
|
||||
accentColor: "#eab308",
|
||||
},
|
||||
{
|
||||
id: "raspberry-ginger",
|
||||
name: "Малина-имбирь",
|
||||
category: TEA_CATEGORY,
|
||||
volume: "900 мл",
|
||||
price: 350,
|
||||
priceFormatted: "350 ₽",
|
||||
desc: "Пикантное сочетание спелой малины и тонких слайсов свежего имбиря. Бодрит, согревает и оставляет приятную лёгкую остринку.",
|
||||
ingredients: ["Малина", "Свежий корень имбиря", "Лимонный сок", "Чайный сбор"],
|
||||
accentColor: "#ef4444",
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,117 @@
|
||||
/* Переводы вкусов для каталога табаков (src/data/catalog.ts).
|
||||
Ключ — id табака из массива tobaccoFlavors.
|
||||
Показывается на карточке как «Перевод вкуса», чтобы гость сразу понимал,
|
||||
что кроется за английским названием. */
|
||||
|
||||
export const tobaccoTranslations: Record<string, string> = {
|
||||
/* ---------------- Blackburn ---------------- */
|
||||
"bb-cola": "Классическая кола",
|
||||
"bb-lulo": "Луло (колумбийский цитрус)",
|
||||
"bb-real-pf": "Маракуйя",
|
||||
"bb-white-grape": "Белый виноград",
|
||||
"bb-forest-raspberry": "Лесная малина",
|
||||
"bb-brownie": "Шоколадный брауни",
|
||||
"bb-blackberry-lemonade": "Ежевичный лимонад",
|
||||
"bb-lemon-shock": "Ультракислый лимон",
|
||||
"bb-blueberry": "Голубика",
|
||||
"bb-apple-shock": "Кислое зелёное яблоко",
|
||||
"bb-red-energy": "Энергетик",
|
||||
"bb-kiwi-stoner": "Смузи из киви",
|
||||
"bb-bananini": "Банан",
|
||||
"bb-honey-melon": "Медовая дыня",
|
||||
"bb-pineapple": "Сочный ананас",
|
||||
"bb-grape-lollipop": "Виноградный чупа-чупс",
|
||||
"bb-fir": "Ёлка (хвоя)",
|
||||
"bb-red-orange": "Красный апельсин",
|
||||
"bb-juicy-mango": "Сочное манго",
|
||||
"bb-basilic": "Базилик",
|
||||
"bb-berry-sorbet": "Ягодный сорбет с грейпфрутом",
|
||||
"bb-ananas-shock": "Кислый ананас",
|
||||
"bb-after-8": "Шоколад-мята",
|
||||
"bb-overdose": "Лимон-лайм",
|
||||
"bb-pina-colada": "Пина-колада",
|
||||
"bb-pistachio-ice-snow": "Фисташковое мороженое",
|
||||
"bb-pomelo": "Помело",
|
||||
"bb-pear-lemonade": "Грушевый лимонад",
|
||||
|
||||
/* ---------------- Overdose ---------------- */
|
||||
"od-lost-futura": "Мускусная вишня",
|
||||
"od-frustyle": "Кактус-лайм",
|
||||
"od-black-banano": "Амбровый банан",
|
||||
"od-gin-cucumber": "Огуречный джин",
|
||||
|
||||
/* ---------------- Banger ---------------- */
|
||||
"banger-black-white": "Печенье «Орео»",
|
||||
"banger-cream-soda": "Крем-сода",
|
||||
"banger-sexy": "Грейпфрут, клубника и малина",
|
||||
"banger-grapefruit": "Грейпфрут",
|
||||
"banger-green-day": "Яблоко, киви и кислинка",
|
||||
"banger-cola-bella": "Ванильная кола",
|
||||
|
||||
/* ---------------- Undercoal ---------------- */
|
||||
"uc-pinkman": "Клубника, малина и грейпфрут",
|
||||
"uc-coconut-shake": "Кокосовый шейк",
|
||||
"uc-caribbean-rum": "Карибский ром",
|
||||
"uc-mango-rose": "Манго, маракуйя, личи и роза",
|
||||
"uc-tropical-juice": "Тропический сок",
|
||||
"uc-cactus-kiwi": "Кактус, киви и абсент",
|
||||
"uc-milky-oolong": "Чай «Молочный улун»",
|
||||
"uc-cranberry": "Клюква",
|
||||
"uc-pear-tarragon": "Груша, лимон и тархун",
|
||||
"uc-cinnamon-roll": "Коричная булочка",
|
||||
"uc-cookie": "Печенье",
|
||||
|
||||
/* ---------------- Darkside ---------------- */
|
||||
"ds-alpine-trip": "Хвоя, фейхоа и эвкалипт",
|
||||
|
||||
/* ---------------- Хулиган / WOOD ---------------- */
|
||||
"wood-begemot": "Бергамот-мандарин",
|
||||
"wood-boo": "Яблоко-гранат",
|
||||
"wood-old": "Лимон с мёдом",
|
||||
"wood-berry-ninja": "Лесные ягоды",
|
||||
"wood-sir-hard": "Воздушный рис",
|
||||
|
||||
/* ---------------- Hupreme ---------------- */
|
||||
"hupreme-milk-tea": "Чай с молоком",
|
||||
"hupreme-gooseberry": "Крыжовник",
|
||||
"hupreme-guava": "Гуава",
|
||||
|
||||
/* ---------------- JENT Alcohol Line ---------------- */
|
||||
"jent-blue-agave": "Текила «Бум»",
|
||||
"jent-havana": "Мохито",
|
||||
"jent-cuba-libre": "Куба-Либре",
|
||||
|
||||
/* ---------------- DEUS ---------------- */
|
||||
"deus-blackberry-wine": "Ежевичное вино",
|
||||
"deus-guinness": "Тёмное пиво",
|
||||
"deus-peonies": "Пионы",
|
||||
"deus-violet-zephyr": "Фиалковый зефир",
|
||||
"deus-cherry-jelly": "Вишнёвое желе",
|
||||
"deus-pumpkin-pie": "Тыквенный пирог с миндалём",
|
||||
"deus-blueberry-yogurt": "Черничный йогурт",
|
||||
"deus-base": "Чистый табачный лист",
|
||||
"deus-champagne": "Игристое вино (шампанское)",
|
||||
|
||||
/* ---------------- Северный ---------------- */
|
||||
"north-flower": "Цветочный микс",
|
||||
"north-feijoa": "Фейхоа с перцем",
|
||||
"north-elderberry": "Бузина",
|
||||
"north-sorbet": "Фруктовый сорбет",
|
||||
|
||||
/* ---------------- Bliss ---------------- */
|
||||
"bliss-mango-chamomile": "Манго-ромашка",
|
||||
"bliss-peach-yogurt": "Персик-йогурт",
|
||||
"bliss-lime": "Лайм",
|
||||
"bliss-love-shot": "Маракуйя, арбуз, лимон с холодком",
|
||||
|
||||
/* ---------------- Остальные ---------------- */
|
||||
"muassel-cinnamon-gum": "Жвачка с корицей",
|
||||
"chabacco-strawberry-milksake": "Клубничный милкшейк",
|
||||
"joy-kiwichanga": "Киви и фейхоа",
|
||||
"hooligan-grapefruit": "Грейпфрутовый сок",
|
||||
"sarma-drunk-pear": "Дачная груша",
|
||||
"sarma-corn-paprika": "Кукуруза с паприкой",
|
||||
"hooligan-flash": "«Флеш» (медовая малина)",
|
||||
"add-north": "Бустер «Север» (ароматизатор)",
|
||||
"add-cooling": "Холодок (ароматизатор)",
|
||||
};
|
||||
Reference in new issue
Block a user