/* ============================================================
   Төрмен — i18n (RU / KZ) + content data
   Everything bilingual. Exposed on window for the other files.
   ============================================================ */
const { createContext, useContext, useState, useEffect, useRef, useCallback } = React;

/* ---------- UI strings ---------- */
const STR = {
  // nav
  nav_home:     { ru:'Главная',     kz:'Басты бет' },
  nav_catalog:  { ru:'Каталог',     kz:'Каталог' },
  nav_broths:   { ru:'Бульоны',     kz:'Сорпалар' },
  nav_blog:     { ru:'Блог',        kz:'Блог' },
  nav_about:    { ru:'О бренде',     kz:'Бренд туралы' },
  nav_profile:  { ru:'Профиль',     kz:'Профиль' },

  // generic
  add_cart:     { ru:'В корзину',   kz:'Себетке' },
  in_cart:      { ru:'В корзине',   kz:'Себетте' },
  buy_now:      { ru:'Оформить заказ', kz:'Тапсырыс беру' },
  details:      { ru:'Подробнее',   kz:'Толығырақ' },
  from:         { ru:'от',          kz:'бастап' },
  persons:      { ru:'персон',      kz:'адамға' },
  person_for:   { ru:'на',          kz:'' },
  weight:       { ru:'Вес',         kz:'Салмағы' },
  composition:  { ru:'Состав набора', kz:'Жинақ құрамы' },
  serves_note:  { ru:'Хватит на сытный стол', kz:'Мол дастарханға жетеді' },
  all:          { ru:'Все',         kz:'Барлығы' },
  watch:        { ru:'Смотреть',    kz:'Көру' },
  min:          { ru:'мин',         kz:'мин' },
  views:        { ru:'просмотров',  kz:'қаралым' },
  back:         { ru:'Назад',       kz:'Артқа' },
  lang_name:    { ru:'RU',          kz:'ҚАЗ' },

  // hero
  hero_eyebrow: { ru:'СЕМЕЙНЫЕ МЯСНЫЕ НАБОРЫ · С 2019',  kz:'ОТБАСЫЛЫҚ ЕТ ЖИНАҚТАРЫ · 2019 ЖЫЛДАН' },
  hero_title_1: { ru:'Мясо, вокруг',  kz:'Ет —' },
  hero_title_2: { ru:'которого собирается семья', kz:'отбасыны бір дастарханға жинайды' },
  hero_sub:     { ru:'Готовые наборы, отборное мясо с фермы и наваристые бульоны — для бешбармака, казана и большого стола. Доставка по городу.',
                  kz:'Дайын жинақтар, ферманың іріктелген еті және наварлы сорпалар — бешбармаққа, қазанға және үлкен дастарханға. Қала бойынша жеткізу.' },
  hero_cta:     { ru:'Выбрать набор',  kz:'Жинақ таңдау' },
  hero_cta2:    { ru:'Помощь Ai-повара', kz:'Ai-аспаз көмегі' },
  stat_sets:    { ru:'наборов в линейке', kz:'жинақ ассортиментте' },
  stat_families:{ ru:'семей за год',    kz:'отбасы бір жылда' },
  stat_rating:  { ru:'средняя оценка',  kz:'орташа баға' },

  // sections
  sec_picks:    { ru:'ВЫБОР СЕМЕЙ',    kz:'ОТБАСЫЛАР ТАҢДАУЫ' },
  sec_picks_t:  { ru:'Популярные наборы', kz:'Танымал жинақтар' },
  sec_how:      { ru:'КАК ЭТО РАБОТАЕТ', kz:'ҚАЛАЙ ЖҰМЫС ІСТЕЙДІ' },
  sec_how_t:    { ru:'От выбора до стола — четыре шага', kz:'Таңдаудан дастарханға — төрт қадам' },
  sec_broths:   { ru:'НАВАРИСТЫЕ БУЛЬОНЫ', kz:'НАВАРЛЫ СОРПАЛАР' },
  sec_broths_t: { ru:'Сорпа, томлённая по-домашнему', kz:'Үйдегідей қайнатылған сорпа' },
  sec_blog:     { ru:'МЯСНОЙ БЛОГ',    kz:'ЕТ БЛОГЫ' },
  sec_blog_t:   { ru:'Рецепты, разделка и истории', kz:'Рецепттер, бөлшектеу және әңгімелер' },
  sec_about:    { ru:'НАША ФЕРМА',     kz:'БІЗДІҢ ФЕРМА' },
  view_all:     { ru:'Смотреть все',   kz:'Барлығын көру' },

  how_1:        { ru:'Выберите продукты', kz:'Өнімдерді таңдаңыз' },
  how_1d:       { ru:'Наборы, мясо, деликатесы или бульоны — под гостей и повод', kz:'Жинақтар, ет, деликатестер немесе сорпа — қонаққа қарай' },
  how_2:        { ru:'Соберём свежим', kz:'Жаңа піскенін жинаймыз' },
  how_2d:       { ru:'Режем и упаковываем в день доставки', kz:'Жеткізу күні кесіп, орап береміз' },
  how_3:        { ru:'Привезём',       kz:'Жеткіземіз' },
  how_3d:       { ru:'По Алматы · в день заказа', kz:'Алматы бойынша · тапсырыс күні' },
  how_4:        { ru:'Готовьте',       kz:'Дайындаңыз' },
  how_4d:       { ru:'Рецепты и видео — в каждом наборе', kz:'Әр жинақта рецепт пен бейне' },

  // catalog
  cat_title:    { ru:'Всё для дастархана', kz:'Дастарханға бәрі' },
  cat_sub:      { ru:'Наборы, мясо с фермы, деликатесы и наваристые бульоны — под гостей и повод.', kz:'Жинақтар, ферма еті, деликатестер және сорпалар — қонақ пен той-думанға.' },
  filter_persons:{ru:'Количество персон', kz:'Адам саны' },
  filter_cat:   { ru:'Тип набора',     kz:'Жинақ түрі' },
  sort:         { ru:'Сортировка',     kz:'Сұрыптау' },
  sort_pop:     { ru:'По популярности', kz:'Танымалдылық' },
  sort_cheap:   { ru:'Сначала дешевле', kz:'Алдымен арзан' },
  sort_exp:     { ru:'Сначала дороже',  kz:'Алдымен қымбат' },
  nothing:      { ru:'Ничего не нашли — измените фильтры', kz:'Ештеңе табылмады — сүзгіні өзгертіңіз' },

  // product
  choose_size:  { ru:'На сколько человек', kz:'Неше адамға' },
  choose_qty:   { ru:'Выберите количество', kz:'Санын таңдаңыз' },
  variant_standard:{ ru:'Стандарт', kz:'Стандарт' },
  whats_inside: { ru:'Что внутри',     kz:'Ішінде не бар' },
  storage:      { ru:'Хранение и доставка', kz:'Сақтау және жеткізу' },
  storage_d:    { ru:'Охлаждённое, не заморозка. Хранить при 0…+4 °C до 5 суток. Доставка в термоупаковке в день заказа.',
                  kz:'Салқындатылған, мұздатылмаған. 0…+4 °C-та 5 тәулікке дейін сақтаңыз. Тапсырыс күні термо-қаппен жеткіземіз.' },
  recipes_in:   { ru:'Рецепты для этого набора', kz:'Осы жинаққа арналған рецепттер' },
  ask_ai:       { ru:'Спросить Ai-повара', kz:'Ai-аспаздан сұрау' },
  per_person:   { ru:'≈ на одного', kz:'≈ бір адамға' },

  // cart / checkout
  cart:         { ru:'Корзина',       kz:'Себет' },
  cart_empty:   { ru:'В корзине пока пусто', kz:'Себет әзірге бос' },
  cart_empty_d: { ru:'Выберите набор — и соберём для вашего стола', kz:'Жинақ таңдаңыз — дастарханыңызға жинаймыз' },
  go_catalog:   { ru:'К наборам',     kz:'Жинақтарға' },
  subtotal:     { ru:'Сумма',         kz:'Сома' },
  delivery:     { ru:'Доставка',      kz:'Жеткізу' },
  free:         { ru:'Бесплатно',     kz:'Тегін' },
  total:        { ru:'Итого',         kz:'Барлығы' },
  checkout:     { ru:'Оформление заказа', kz:'Тапсырысты рәсімдеу' },
  co_err_name:  { ru:'Укажите имя (минимум 2 буквы)', kz:'Атыңызды жазыңыз (кемінде 2 әріп)' },
  co_err_phone: { ru:'Номер Казахстана: +7 и 10 цифр', kz:'Қазақстан нөмірі: +7 және 10 сан' },
  co_err_email: { ru:'Укажите корректный email', kz:'Дұрыс email жазыңыз' },
  co_email_ph:  { ru:'Email для подтверждения', kz:'Растауға email' },
  co_email_hint:{ ru:'Пришлём ссылку для отслеживания заказа', kz:'Тапсырысты бақылау сілтемесін жібереміз' },
  co_err_addr:  { ru:'Укажите адрес доставки', kz:'Жеткізу мекенжайын жазыңыз' },
  co_err_district: { ru:'Выберите район или микрорайон из списка', kz:'Тізімнен аудан немесе микрорайон таңдаңыз' },
  co_err_district_free: { ru:'Укажите район или населённый пункт', kz:'Аудан немесе елді мекенді жазыңыз' },
  co_err_street: { ru:'Укажите улицу, дом и квартиру', kz:'Көше, үй және пәтер нөмірін жазыңыз' },
  co_city_ph: { ru:'Город', kz:'Қала' },
  co_city_search: { ru:'Поиск города…', kz:'Қала іздеу…' },
  co_district_ph: { ru:'Район / микрорайон', kz:'Аудан / микрорайон' },
  co_district_ph_free: { ru:'Район / населённый пункт', kz:'Аудан / елді мекен' },
  co_district_search: { ru:'Поиск района…', kz:'Аудан іздеу…' },
  co_no_results: { ru:'Ничего не найдено', kz:'Ештеңе табылмады' },
  co_street_ph: { ru:'Улица, дом, квартира', kz:'Көше, үй, пәтер' },
  co_phone_ph:  { ru:'+7 (7__) ___-__-__', kz:'+7 (7__) ___-__-__' },
  name_f:       { ru:'Ваше имя',      kz:'Атыңыз' },
  phone_f:      { ru:'Телефон',       kz:'Телефон' },
  addr_f:       { ru:'Адрес доставки', kz:'Жеткізу мекенжайы' },
  date_f:       { ru:'Дата и время',  kz:'Күні мен уақыты' },
  pay_tg:       { ru:'Подтвердить через Telegram', kz:'Telegram арқылы растау' },
  qty:          { ru:'шт',            kz:'дана' },
  remove:       { ru:'Убрать',        kz:'Алып тастау' },

  // telegram flow
  tg_title:     { ru:'Подтверждение в Telegram', kz:'Telegram-да растау' },
  tg_step1:     { ru:'Заказ отправлен боту',  kz:'Тапсырыс ботқа жіберілді' },
  tg_step1d:    { ru:'@tormen_bot получил состав и сумму', kz:'@tormen_bot құрам мен соманы алды' },
  tg_step2:     { ru:'Подтвердите детали',    kz:'Деректерді растаңыз' },
  tg_step2d:    { ru:'Бот спросит адрес и удобное время', kz:'Бот мекенжай мен уақытты сұрайды' },
  tg_step3:     { ru:'Следите за статусом',   kz:'Күйін бақылаңыз' },
  tg_step3d:    { ru:'Уведомления: собран → в пути → доставлен', kz:'Хабарлама: жиналды → жолда → жеткізілді' },
  tg_open:      { ru:'Открыть @tormen_bot',   kz:'@tormen_bot ашу' },
  tg_done:      { ru:'Готово',                kz:'Дайын' },
  order_no:     { ru:'Заказ',                 kz:'Тапсырыс' },

  // profile
  pf_title:     { ru:'Личный кабинет', kz:'Жеке кабинет' },
  pf_orders:    { ru:'Мои заказы',     kz:'Тапсырыстарым' },
  pf_repeat:    { ru:'Повторить',      kz:'Қайталау' },
  pf_status_way:{ ru:'В пути',         kz:'Жолда' },
  pf_status_done:{ru:'Доставлен',      kz:'Жеткізілді' },
  pf_status_cook:{ru:'Собираем',       kz:'Жинаудамыз' },
  pf_tg_linked: { ru:'Telegram привязан', kz:'Telegram байланыстырылған' },
  pf_bonus:     { ru:'Бонусов',        kz:'Бонус' },
  pf_signout:   { ru:'Выйти',          kz:'Шығу' },
  pf_signin:    { ru:'Войти',          kz:'Кіру' },
  pf_guest:     { ru:'Войдите, чтобы видеть заказы и бонусы', kz:'Тапсырыстар мен бонустар үшін кіріңіз' },
  pf_loading:   { ru:'Загрузка…',      kz:'Жүктелуде…' },
  pf_role_admin:{ ru:'Администратор',  kz:'Әкімші' },
  pf_role_manager:{ru:'Менеджер',      kz:'Менеджер' },

  // auth
  auth_eyebrow:   { ru:'ВХОД', kz:'КІРУ' },
  auth_title:     { ru:'Войти в Төрмен', kz:'Төрменге кіру' },
  auth_sub:       { ru:'Email и пароль — аккаунт Medusa', kz:'Email және пароль — Medusa аккаунты' },
  auth_register_title:{ ru:'Создать аккаунт', kz:'Аккаунт ашу' },
  auth_register_sub:{ ru:'Минимум 8 символов в пароле', kz:'Пароль кемінде 8 таңба' },
  auth_phone:     { ru:'Телефон', kz:'Телефон' },
  auth_phone_soon:{ ru:'Телефон · скоро', kz:'Телефон · жақында' },
  auth_email:     { ru:'Email', kz:'Email' },
  auth_phone_hint:{ ru:'SMS-вход подключим на следующем этапе', kz:'SMS кіру келесі кезеңде' },
  auth_email_hint:{ ru:'Введите email и пароль от аккаунта', kz:'Аккаунттың email мен паролін енгізіңіз' },
  auth_password_ph:{ ru:'Пароль (мин. 8 символов)', kz:'Пароль (кемінде 8 таңба)' },
  auth_password_hint:{ ru:'Пароль хранится в Medusa — не передавайте его третьим лицам', kz:'Пароль Medusa-да сақталады' },
  auth_login_btn: { ru:'Войти', kz:'Кіру' },
  auth_register_btn:{ ru:'Создать аккаунт', kz:'Аккаунт ашу' },
  auth_switch_register:{ ru:'Нет аккаунта? Зарегистрироваться', kz:'Аккаунт жоқ па? Тіркелу' },
  auth_switch_login:{ ru:'Уже есть аккаунт? Войти', kz:'Аккаунт бар ма? Кіру' },
  auth_verifying: { ru:'Проверяем…', kz:'Тексерілуде…' },
  auth_name_title:{ ru:'Как к вам обращаться?', kz:'Сізді қалай атаймыз?' },
  auth_name_sub:  { ru:'Имя появится в профиле и в заказах', kz:'Аты профиль мен тапсырыста көрінеді' },
  auth_name_ph:   { ru:'Ваше имя', kz:'Атыңыз' },
  auth_continue:  { ru:'Продолжить', kz:'Жалғастыру' },
  auth_save:      { ru:'Сохранить', kz:'Сақтау' },
  auth_skip:      { ru:'Пропустить', kz:'Өткізу' },
  auth_guest_note:{ ru:'Оформить заказ можно и без входа — телефон укажете при оформлении', kz:'Кірмей-ақ тапсырыс беруге болады — рәсімдеу кезінде телефон көрсетесіз' },
  nav_track:      { ru:'Отследить заказ', kz:'Тапсырысты бақылау' },
  auth_err_config:{ ru:'Medusa не настроена — .env, npm run config, npm run medusa:dev', kz:'Medusa бапталмаған — .env, npm run config, npm run medusa:dev' },
  auth_err_phone: { ru:'Введите корректный номер +7', kz:'Дұрыс +7 нөмірін енгізіңіз' },
  auth_err_email: { ru:'Введите корректный email', kz:'Дұрыс email енгізіңіз' },
  auth_err_password:{ ru:'Пароль — минимум 8 символов', kz:'Пароль — кемінде 8 таңба' },
  auth_err_credentials:{ ru:'Неверный email или пароль', kz:'Қате email немесе пароль' },
  auth_err_offline:{ ru:'Medusa недоступна — запустите npm run medusa:dev', kz:'Medusa қолжетімсіз — npm run medusa:dev іске қосыңыз' },
  auth_err_generic:{ ru:'Не получилось — попробуйте снова', kz:'Орындалмады — қайта көріңіз' },

  // chat
  chat_title:   { ru:'Ai-повар Төрмен', kz:'Төрмен Ai-аспазы' },
  chat_sub:     { ru:'Помогу выбрать набор и подскажу рецепт', kz:'Жинақ таңдауға және рецептке көмектесемін' },
  chat_ph:      { ru:'Спросите про набор, состав или рецепт…', kz:'Жинақ, құрам не рецепт туралы сұраңыз…' },
  chat_send:    { ru:'Отправить',      kz:'Жіберу' },
  chat_typing:  { ru:'печатает…',      kz:'жазып жатыр…' },
  chat_hi:      { ru:'Сәлеметсіз бе! Я Ai-повар Төрмен. Сколько будет гостей и что готовите — бешбармак, казан или гриль? Подберу набор и подскажу, как приготовить.',
                  kz:'Сәлеметсіз бе! Мен Төрмен Ai-аспазымын. Қонақ нешеу және не дайындайсыз — бешбармақ, қазан әлде гриль? Жинақ таңдап, дайындауды үйретемін.' },
  chat_q1:      { ru:'Набор на 5 человек для бешбармака', kz:'5 адамға бешбармақ жинағы' },
  chat_q2:      { ru:'Как варить бешбармак?', kz:'Бешбармақты қалай пісіреді?' },
  chat_q3:      { ru:'Что взять на 10 гостей до 60 000 ₸?', kz:'10 қонаққа 60 000 ₸-ге дейін не алам?' },
  chat_order:   { ru:'Добавить в корзину', kz:'Себетке қосу' },

  // footer
  foot_tag:     { ru:'Семейные мясные наборы', kz:'Отбасылық ет жинақтары' },
  foot_made:    { ru:'Сделано с уважением к столу · Алматы · 2026', kz:'Дастарханға құрметпен жасалған · Алматы · 2026' },
  write_tg:     { ru:'Написать в Telegram', kz:'Telegram-ға жазу' },

  // tweaks
  tw_theme:     { ru:'Тема',           kz:'Тема' },
  tw_theme_dark:{ ru:'Тёмная тема',    kz:'Қараңғы тема' },
  tw_theme_light:{ ru:'Светлая тема',  kz:'Жарық тема' },
  tw_accent:    { ru:'Акцент',         kz:'Акцент' },
  tw_embers:    { ru:'Угольки в фоне', kz:'Фондағы ұшқындар' },
  tw_radius:    { ru:'Скругление',     kz:'Дөңгелектеу' },

  // reviews
  rev_eyebrow:  { ru:'ОТЗЫВЫ',         kz:'ПІКІРЛЕР' },
  rev_title:    { ru:'Что говорят о наборе', kz:'Жинақ туралы пікірлер' },
  rev_reviews:  { ru:'отзывов',        kz:'пікір' },
  rev_verified: { ru:'Проверенная покупка', kz:'Расталған сатып алу' },
  rev_write:    { ru:'Написать отзыв', kz:'Пікір жазу' },
  rev_write_hint:{ ru:'Поставьте оценку и напишите пару строк — форма откроется здесь', kz:'Баға қойып, бірнеше сөз жазыңыз — форма осы жерде ашылады' },
  rev_your_rating:{ ru:'Ваша оценка',  kz:'Бағаңыз' },
  rev_your_text:{ ru:'Ваш отзыв',     kz:'Сіздің пікіріңіз' },
  rev_list_title:{ ru:'Отзывы покупателей', kz:'Сатып алушылар пікірі' },
  rev_placeholder:{ ru:'Например: мясо свежее, гостям понравилось, доставили вовремя…', kz:'Мысалы: ет жаңа, қонақтарға ұнады, уақытында жеткізді…' },
  rev_submit:   { ru:'Отправить отзыв', kz:'Пікір жіберу' },
  rev_thanks:   { ru:'Спасибо за отзыв!', kz:'Пікіріңізге рахмет!' },
  rev_thanks_d: { ru:'Он появится после модерации', kz:'Ол модерациядан кейін көрінеді' },
  rev_show_all: { ru:'Показать все отзывы', kz:'Барлық пікірді көру' },
  sec_reviews:  { ru:'ЧТО ГОВОРЯТ',    kz:'НЕ ДЕЙДІ' },
  rev_store_t:  { ru:'Нас выбирают семьи', kz:'Бізді отбасылар таңдайды' },
  rev_recommend:{ ru:'рекомендуют нас друзьям', kz:'бізді достарына ұсынады' },
  rev_helpful:  { ru:'Полезно',         kz:'Пайдалы' },
  rev_sort:     { ru:'Сортировка',      kz:'Сұрыптау' },
  rev_sort_new: { ru:'Новые',           kz:'Жаңа' },
  rev_sort_top: { ru:'По оценке',       kz:'Баға бойынша' },
  rev_sort_helpful:{ ru:'Полезные',     kz:'Пайдалы' },
  rev_empty:      { ru:'Пока нет отзывов — будьте первым', kz:'Әзірге пікір жоқ — бірінші болыңыз' },
  rev_add_photo:  { ru:'Добавить фото', kz:'Фото қосу' },
  rev_photos_hint:{ ru:'До 4 фото блюда или упаковки, до 5 МБ каждое', kz:'Тағам немесе қаптама фотосы — 4 дейін, әрқайсысы 5 МБ' },
  rev_uploading:  { ru:'Загружаем фото…', kz:'Фото жүктелуде…' },
  nav_fav:      { ru:'Избранное',       kz:'Таңдаулы' },
  cat_found:    { ru:'наборов в подборке', kz:'жинақ таңдауда' },
};
const SETS = [
  { id:'beshbarmak-toi', cat:'beshbarmak', badge:'gold', best:true, ph:'cut',
    name:{ru:'Той-бешбармак',kz:'Той-бешбармақ'},
    tagline:{ru:'Праздничный набор с қазы и жаей',kz:'Қазы мен жаясы бар мерекелік жинақ'},
    desc:{ru:'Конина и молодая баранина, домашняя қазы, жая и тонкое тесто ручной раскатки — всё для настоящего праздничного бешбармака.',
          kz:'Жылқы еті мен жас қой еті, үй қазысы, жая және қолмен жайылған жұқа қамыр — нағыз мерекелік бешбармаққа барлығы.'},
    items:{ru:['Конина (рёбра, грудинка)','Молодая баранина','Қазы домашняя','Жая','Тесто ручной раскатки','Лук для туздыка'],
           kz:['Жылқы еті (қабырға, төс)','Жас қой еті','Үй қазысы','Жая','Қолмен жайылған қамыр','Тұздыққа пияз']},
    variants:[{persons:5,price:34900,weight:'4.4 кг'},{persons:10,price:64900,weight:'8.6 кг'}] },

  { id:'beshbarmak-dala', cat:'beshbarmak', badge:null, ph:'cut',
    name:{ru:'Дала-бешбармак',kz:'Дала-бешбармақ'},
    tagline:{ru:'Говяжий, на каждый день',kz:'Сиыр етінен, күнделікке'},
    desc:{ru:'Сбалансированный набор из отборной говядины и тонкого теста — будничный бешбармак без лишних хлопот.',
          kz:'Іріктелген сиыр еті мен жұқа қамырдан тұратын теңдестірілген жинақ — қарапайым бешбармақ.'},
    items:{ru:['Говядина (грудинка, лопатка)','Тесто ручной раскатки','Лук','Зелень','Специи для сорпы'],
           kz:['Сиыр еті (төс, жая)','Қолмен жайылған қамыр','Пияз','Көкөніс','Сорпаға дәмдеуіш']},
    variants:[{persons:3,price:18900,weight:'2.4 кг'},{persons:5,price:28900,weight:'3.9 кг'}] },

  { id:'grill-otbasy', cat:'grill', badge:'ember', best:true, ph:'grill',
    name:{ru:'Отбасы-гриль',kz:'Отбасы-гриль'},
    tagline:{ru:'Маринованное мясо для мангала',kz:'Мангалға маринадталған ет'},
    desc:{ru:'Шашлычные наборы из баранины и говядины в трёх маринадах, готовые к огню. Привозим уже нанизанными по желанию.',
          kz:'Қой және сиыр етінен үш маринадтағы шашлық жинағы, отқа дайын. Қаласаңыз шанышқыға тізіп әкелеміз.'},
    items:{ru:['Баранья корейка','Говяжья вырезка','Куриное бедро','3 маринада на выбор','Овощи на гриль','Лаваш'],
           kz:['Қой еті (сүбе)','Сиыр етінің жұмсағы','Тауық саны','3 маринад','Грильге көкөніс','Жұқа нан']},
    variants:[{persons:5,price:31900,weight:'4.0 кг'},{persons:10,price:58900,weight:'7.8 кг'}] },

  { id:'kazan-zharkop', cat:'kazan', badge:null, ph:'kazan',
    name:{ru:'Қазан-ет',kz:'Қазан-ет'},
    tagline:{ru:'Для жаркопа и куырдака',kz:'Жарқоп пен қуырдаққа'},
    desc:{ru:'Мясо с правильным соотношением мякоти и косточки — для томлёного жаркопа, куырдака и плова в казане.',
          kz:'Жұмсақ пен сүйектің дұрыс үйлесімі — қазандағы жарқоп, қуырдақ және палауға арналған ет.'},
    items:{ru:['Говядина мякоть','Бараньи рёбрышки','Курдючный жир','Картофель','Лук, морковь','Специи'],
           kz:['Сиыр еті жұмсақ','Қой қабырғасы','Құйрық майы','Картоп','Пияз, сәбіз','Дәмдеуіш']},
    variants:[{persons:3,price:16900,weight:'2.6 кг'},{persons:5,price:25900,weight:'4.1 кг'}] },

  { id:'sogym-lux', cat:'sogym', badge:'gold', ph:'cut',
    name:{ru:'Согым Люкс',kz:'Соғым Люкс'},
    tagline:{ru:'Зимний запас на большую семью',kz:'Үлкен отбасыға қысқы қор'},
    desc:{ru:'Премиальный зимний согым: конина, баранина, домашние деликатесы — қазы, жая, шужык, карта. Фасуем под порции.',
          kz:'Премиум қысқы соғым: жылқы, қой еті, үй деликатестері — қазы, жая, шұжық, қарта. Порцияға бөліп орамыз.'},
    items:{ru:['Конина (полутуша, разделка)','Баранина','Қазы, жая, шужык','Карта','Деление на порции','Вакуумная упаковка'],
           kz:['Жылқы еті (бөлшектелген)','Қой еті','Қазы, жая, шұжық','Қарта','Порцияға бөлу','Вакуум қаптама']},
    variants:[{persons:10,price:129000,weight:'18 кг'}] },

  { id:'syrne-set', cat:'kazan', badge:null, ph:'grill',
    name:{ru:'Сырне',kz:'Сірне'},
    tagline:{ru:'Молодая баранина по-чабански',kz:'Шопанша жас қой еті'},
    desc:{ru:'Нежная молодая баранина для сырне — обжарка на кости с луком и перцем. Любимое блюдо степного застолья.',
          kz:'Сүйекпен қуырылатын нәзік жас қой еті — сірнеге арналған. Дала дастарханының сүйікті асы.'},
    items:{ru:['Молодая баранина на кости','Курдюк','Лук','Болгарский перец','Зира, перец'],
           kz:['Сүйектегі жас қой еті','Құйрық','Пияз','Бұрыш','Зире, бұрыш']},
    variants:[{persons:3,price:21900,weight:'2.5 кг'},{persons:5,price:33900,weight:'4.0 кг'}] },
];

/* ---------- broths ---------- */
const BROTHS = [
  { id:'bone', ph:'broth', name:{ru:'Костный сорпа',kz:'Сүйекті сорпа'},
    desc:{ru:'Говяжьи мозговые кости, томлённые 12 часов. База для любого блюда.',kz:'12 сағат қайнатылған сиыр сүйегі. Кез келген асқа негіз.'},
    tags:{ru:['12 ч томления','без добавок'],kz:['12 сағ қайнау','қоспасыз']}, vol:'1 л', price:2900 },
  { id:'lamb', ph:'broth', name:{ru:'Бараний сорпа',kz:'Қой сорпасы'},
    desc:{ru:'Наваристый бульон из баранины с кореньями — для согрева и сил.',kz:'Тамырлармен қайнатылған қой сорпасы — жылыну мен қуатқа.'},
    tags:{ru:['наваристый','с кореньями'],kz:['наварлы','тамырмен']}, vol:'1 л', price:3400 },
  { id:'chicken', ph:'broth', name:{ru:'Куриный сорпа',kz:'Тауық сорпасы'},
    desc:{ru:'Лёгкий бульон из домашней курицы. Мягкий вкус, золотистый цвет.',kz:'Үй тауығынан жеңіл сорпа. Жұмсақ дәм, алтын түс.'},
    tags:{ru:['лёгкий','домашняя курица'],kz:['жеңіл','үй тауығы']}, vol:'1 л', price:2400 },
  { id:'concentrate', ph:'broth', name:{ru:'Сорпа-концентрат',kz:'Сорпа-концентрат'},
    desc:{ru:'Густой концентрат: развести водой — и готов наваристый сорпа за 5 минут.',kz:'Қою концентрат: суға араластырыңыз — 5 минутта наварлы сорпа.'},
    tags:{ru:['порционно','5 минут'],kz:['порциямен','5 минут']}, vol:'4×250 мл', price:4200 },
];

/* ---------- video blog ---------- */
const VIDEOS = [
  { id:'v1', cat:'recipe', dur:'14', views:'128K', ph:'video', feat:true,
    title:{ru:'Бешбармак, как у апашки: пошагово',kz:'Әжемдікіндей бешбармақ: қадам-қадам'} },
  { id:'v2', cat:'farm', dur:'9', views:'74K', ph:'video',
    title:{ru:'Откуда наше мясо: один день на ферме',kz:'Етіміз қайдан: фермадағы бір күн'} },
  { id:'v3', cat:'cut', dur:'7', views:'52K', ph:'video',
    title:{ru:'Что входит в набор на 10 человек',kz:'10 адамдық жинақта не бар'} },
  { id:'v4', cat:'recipe', dur:'11', views:'96K', ph:'video',
    title:{ru:'Куырдак за 30 минут в казане',kz:'Қазанда 30 минутта қуырдақ'} },
  { id:'v5', cat:'story', dur:'6', views:'40K', ph:'video',
    title:{ru:'История Төрмен: с чего всё началось',kz:'Төрмен тарихы: бәрі неден басталды'} },
  { id:'v6', cat:'cut', dur:'8', views:'61K', ph:'video',
    title:{ru:'Қазы и жая: как мы их готовим',kz:'Қазы мен жая: оларды қалай дайындаймыз'} },
];

const VIDEO_CATS = [
  { id:'all',    label:{ru:'Все',kz:'Барлығы'} },
  { id:'recipe', label:{ru:'Рецепты',kz:'Рецепттер'} },
  { id:'farm',   label:{ru:'О ферме',kz:'Ферма туралы'} },
  { id:'cut',    label:{ru:'Разделка',kz:'Бөлшектеу'} },
  { id:'story',  label:{ru:'Истории',kz:'Әңгімелер'} },
];

/* ---------- helpers ---------- */
function fmtPrice(n){ return n.toLocaleString('ru-RU').replace(/,/g,' ') + ' ₸'; }
function minPrice(set){ return Math.min(...set.variants.map(v=>v.price)); }

/* ---------- lang context ---------- */
const LangContext = createContext(null);
function LangProvider({ children }){
  const [lang, setLang] = useState(()=> localStorage.getItem('tormen_lang') || 'ru');
  useEffect(()=>{ localStorage.setItem('tormen_lang', lang);
    document.documentElement.lang = lang==='kz'?'kk':'ru'; }, [lang]);
  const t  = useCallback((k)=> (STR[k] && STR[k][lang]) || (STR[k] && STR[k].ru) || k, [lang]);
  const tx = useCallback((obj)=> obj ? (obj[lang] || obj.ru) : '', [lang]);
  return <LangContext.Provider value={{ lang, setLang, t, tx }}>{children}</LangContext.Provider>;
}
function useLang(){ return useContext(LangContext); }

Object.assign(window, {
  STR, SETS, BROTHS, VIDEOS, VIDEO_CATS,
  fmtPrice, minPrice, LangProvider, useLang,
});
