Merge branch 'dev' into add-pages
This commit is contained in:
commit
68a8d3e228
@ -74,8 +74,7 @@ export default function PromotionSlider() {
|
||||
};
|
||||
|
||||
return (
|
||||
<div className='relative'>
|
||||
<div className='overflow-hidden'>
|
||||
<div className='relative overflow-hidden'>
|
||||
<div
|
||||
className='flex transition-transform duration-300 ease-in-out'
|
||||
style={{
|
||||
@ -120,22 +119,19 @@ export default function PromotionSlider() {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
variant='outline'
|
||||
size='icon'
|
||||
className='absolute top-1/2 left-0 z-10 -translate-x-1/2 -translate-y-1/2 border-gray-200 bg-white shadow-lg'
|
||||
className='absolute top-1/2 left-0 z-10 -translate-y-1/2 border-gray-200 bg-white shadow-lg'
|
||||
onClick={prevSlide}
|
||||
>
|
||||
<ChevronLeft className='h-4 w-4' />
|
||||
<span className='sr-only'>Предыдущий</span>
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
variant='outline'
|
||||
size='icon'
|
||||
className='absolute top-1/2 right-0 z-10 translate-x-1/2 -translate-y-1/2 border-gray-200 bg-white shadow-lg'
|
||||
className='absolute top-1/2 right-0 z-10 -translate-y-1/2 border-gray-200 bg-white shadow-lg'
|
||||
onClick={nextSlide}
|
||||
>
|
||||
<ChevronRight className='h-4 w-4' />
|
||||
|
||||
@ -1,16 +1,9 @@
|
||||
'use client';
|
||||
|
||||
import { Loader } from 'lucide-react';
|
||||
import {
|
||||
createContext,
|
||||
type ReactNode,
|
||||
useContext,
|
||||
useEffect,
|
||||
useState,
|
||||
} from 'react';
|
||||
import { createContext, type ReactNode, useEffect, useState } from 'react';
|
||||
|
||||
import enTranslations from './locales/en.json';
|
||||
import ruTranslations from './locales/ru.json';
|
||||
import enTranslations from '../locales/en.json';
|
||||
import ruTranslations from '../locales/ru.json';
|
||||
|
||||
// Define available languages
|
||||
export const languages = {
|
||||
@ -36,7 +29,7 @@ type LanguageContextType = {
|
||||
t: (key: string) => string;
|
||||
};
|
||||
|
||||
const LanguageContext = createContext<LanguageContextType | undefined>(
|
||||
export const LanguageContext = createContext<LanguageContextType | undefined>(
|
||||
undefined,
|
||||
);
|
||||
|
||||
@ -44,7 +37,6 @@ const LanguageContext = createContext<LanguageContextType | undefined>(
|
||||
export function LanguageProvider({ children }: { children: ReactNode }) {
|
||||
// Default to Russian, but check localStorage on client
|
||||
const [language, setLanguageState] = useState<Language>('ru');
|
||||
const [isLoaded, setIsLoaded] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
// Check if we're in the browser
|
||||
@ -53,7 +45,6 @@ export function LanguageProvider({ children }: { children: ReactNode }) {
|
||||
if (savedLanguage && languages[savedLanguage]) {
|
||||
setLanguageState(savedLanguage);
|
||||
}
|
||||
setIsLoaded(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
@ -80,17 +71,3 @@ export function LanguageProvider({ children }: { children: ReactNode }) {
|
||||
</LanguageContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
// Create hook
|
||||
export function useLanguage() {
|
||||
const context = useContext(LanguageContext);
|
||||
if (context === undefined) {
|
||||
throw new Error('useLanguage must be used within a LanguageProvider');
|
||||
}
|
||||
|
||||
if (typeof context.t !== 'function') {
|
||||
throw new Error('Translation function (t) is not available');
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
18
src/shared/language/hooks/use-language.ts
Normal file
18
src/shared/language/hooks/use-language.ts
Normal file
@ -0,0 +1,18 @@
|
||||
'use client';
|
||||
|
||||
import { useContext } from 'react';
|
||||
|
||||
import { LanguageContext } from '../context/language-provider';
|
||||
|
||||
export function useLanguage() {
|
||||
const context = useContext(LanguageContext);
|
||||
if (context === undefined) {
|
||||
throw new Error('useLanguage must be used within a LanguageProvider');
|
||||
}
|
||||
|
||||
if (typeof context.t !== 'function') {
|
||||
throw new Error('Translation function (t) is not available');
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
6
src/shared/language/index.ts
Normal file
6
src/shared/language/index.ts
Normal file
@ -0,0 +1,6 @@
|
||||
export {
|
||||
LanguageProvider,
|
||||
languages,
|
||||
type Language,
|
||||
} from './context/language-provider';
|
||||
export { useLanguage } from './hooks/use-language';
|
||||
@ -17,6 +17,7 @@
|
||||
"common.buttons.sendResume": "Send Resume",
|
||||
"common.buttons.showAllStations": "Show All Stations",
|
||||
"common.buttons.allPromotions": "All Promotions",
|
||||
|
||||
"common.navigation.home": "Home",
|
||||
"common.navigation.about": "About Us",
|
||||
"common.navigation.clients": "For Clients",
|
||||
@ -26,14 +27,17 @@
|
||||
"common.navigation.charity": "Charity",
|
||||
"common.navigation.certificates": "Certificates",
|
||||
"common.navigation.contacts": "Contacts",
|
||||
|
||||
"common.footer.contacts": "Contacts",
|
||||
"common.footer.navigation": "Navigation",
|
||||
"common.footer.subscribe": "Subscribe",
|
||||
"common.footer.subscribeText": "Subscribe to our newsletter to receive news and special offers.",
|
||||
"common.footer.yourEmail": "Your email",
|
||||
"common.footer.rights": "All rights reserved.",
|
||||
|
||||
"home.hero.title": "Modern Gas Station Network in Tajikistan",
|
||||
"home.hero.description": "Quality fuel, convenient locations, and excellent service for our customers",
|
||||
|
||||
"home.about.title": "About Our Company",
|
||||
"home.about.description1": "Our gas station network is one of the leading in Tajikistan. We provide high-quality fuel and a high level of service for our customers for more than 15 years.",
|
||||
"home.about.description2": "We are constantly developing, opening new stations and improving service at existing ones. Our goal is to make refueling as convenient and fast as possible for every customer.",
|
||||
@ -43,10 +47,13 @@
|
||||
"home.about.features.equipment.description": "All our stations are equipped with modern equipment",
|
||||
"home.about.features.staff.title": "Professional Staff",
|
||||
"home.about.features.staff.description": "Our employees are professionals in their field",
|
||||
|
||||
"home.stations.title": "Our Stations",
|
||||
"home.stations.description": "Find the nearest station in our network. We are located in convenient places throughout Tajikistan.",
|
||||
|
||||
"home.promotions.title": "Current Promotions",
|
||||
"home.promotions.description": "Special offers and promotions for our customers. Refuel profitably!",
|
||||
|
||||
"home.vacancies.title": "Vacancies",
|
||||
"home.vacancies.description": "Join our team of professionals. We offer stable work and opportunities for growth.",
|
||||
"home.vacancies.all": "All vacancies",
|
||||
@ -56,10 +63,12 @@
|
||||
"home.vacancies.experience": "Experience from 1 year",
|
||||
"home.vacancies.shiftWork": "Shift work",
|
||||
"home.vacancies.training": "Training",
|
||||
|
||||
"home.partners.title": "Our Partners",
|
||||
"home.partners.description": "We cooperate with leading companies to provide the best services to our customers.",
|
||||
"home.partners.becomePartner": "Become Our Partner",
|
||||
"home.partners.becomePartnerText": "We are open to cooperation and new partnerships. Contact us to discuss opportunities.",
|
||||
|
||||
"home.charity.title": "Charity Foundation",
|
||||
"home.charity.description": "Our charity foundation was created to support socially significant projects in Tajikistan. We strive to contribute to the development of society and help those in need.",
|
||||
"home.charity.directions": "Main directions of our foundation's activities:",
|
||||
@ -68,8 +77,10 @@
|
||||
"home.charity.ecology": "Environmental initiatives",
|
||||
"home.charity.sports": "Support for sports events",
|
||||
"home.charity.learnMore": "Learn More About the Foundation",
|
||||
|
||||
"home.cta.title": "Join Us",
|
||||
"home.cta.description": "Become part of our network. Get special offers, bonuses, and discounts.",
|
||||
|
||||
"certificates.title": "Our Certificates",
|
||||
"certificates.description": "GasNetwork adheres to high standards of quality and safety. Our certificates confirm the compliance of our products and services with international and national standards.",
|
||||
"certificates.requestInfo": "Request Additional Information",
|
||||
@ -77,6 +88,7 @@
|
||||
"certificates.issueDate": "Issue Date",
|
||||
"certificates.expiryDate": "Valid Until",
|
||||
"certificates.faq": "Frequently Asked Questions",
|
||||
|
||||
"auth.title": "Login to your account",
|
||||
"auth.description": "Log in to your personal account to access information about your bonuses, transaction history and other features.",
|
||||
"auth.bonusClient": "Bonus Client",
|
||||
@ -88,6 +100,7 @@
|
||||
"auth.phoneNumber": "Phone number",
|
||||
"auth.cardNumber": "Card number",
|
||||
"auth.loginIssues": "Having trouble logging in?",
|
||||
|
||||
"map.filters": "Filters",
|
||||
"map.stationsList": "Stations List",
|
||||
"map.noStations": "No stations matching the selected filters",
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
"common.buttons.sendResume": "Отправить резюме",
|
||||
"common.buttons.showAllStations": "Показать все заправки",
|
||||
"common.buttons.allPromotions": "Все акции",
|
||||
|
||||
"common.navigation.home": "Главная",
|
||||
"common.navigation.about": "О нас",
|
||||
"common.navigation.clients": "Клиентам",
|
||||
@ -26,14 +27,17 @@
|
||||
"common.navigation.charity": "Благотворительность",
|
||||
"common.navigation.certificates": "Сертификаты",
|
||||
"common.navigation.contacts": "Контакты",
|
||||
|
||||
"common.footer.contacts": "Контакты",
|
||||
"common.footer.navigation": "Навигация",
|
||||
"common.footer.subscribe": "Подписка",
|
||||
"common.footer.subscribeText": "Подпишитесь на нашу рассылку, чтобы получать новости и специальные предложения.",
|
||||
"common.footer.yourEmail": "Ваш email",
|
||||
"common.footer.rights": "Все права защищены.",
|
||||
|
||||
"home.hero.title": "Сеть современных заправок в Таджикистане",
|
||||
"home.hero.description": "Качественное топливо, удобное расположение и отличный сервис для наших клиентов",
|
||||
|
||||
"home.about.title": "О нашей компании",
|
||||
"home.about.description1": "Наша сеть заправок является одной из ведущих в Таджикистане. Мы предоставляем качественное топливо и высокий уровень обслуживания для наших клиентов уже более 15 лет.",
|
||||
"home.about.description2": "Мы постоянно развиваемся, открывая новые станции и улучшая сервис на существующих. Наша цель - сделать заправку автомобиля максимально удобной и быстрой для каждого клиента.",
|
||||
@ -43,10 +47,13 @@
|
||||
"home.about.features.equipment.description": "Все наши станции оснащены современным оборудованием",
|
||||
"home.about.features.staff.title": "Профессиональный персонал",
|
||||
"home.about.features.staff.description": "Наши сотрудники - профессионалы своего дела",
|
||||
|
||||
"home.stations.title": "Наши заправки",
|
||||
"home.stations.description": "Найдите ближайшую к вам заправку нашей сети. Мы расположены в удобных местах по всему Таджикистану.",
|
||||
|
||||
"home.promotions.title": "Актуальные акции",
|
||||
"home.promotions.description": "Специальные предложения и акции для наших клиентов. Заправляйтесь выгодно!",
|
||||
|
||||
"home.vacancies.title": "Вакансии",
|
||||
"home.vacancies.description": "Присоединяйтесь к нашей команде профессионалов. Мы предлагаем стабильную работу и возможности для роста.",
|
||||
"home.vacancies.all": "Все вакансии",
|
||||
@ -56,10 +63,12 @@
|
||||
"home.vacancies.experience": "Опыт от 1 года",
|
||||
"home.vacancies.shiftWork": "Сменный график",
|
||||
"home.vacancies.training": "Обучение",
|
||||
|
||||
"home.partners.title": "Наши партнеры",
|
||||
"home.partners.description": "Мы сотрудничаем с ведущими компаниями для предоставления лучших услуг нашим клиентам.",
|
||||
"home.partners.becomePartner": "Станьте нашим партнером",
|
||||
"home.partners.becomePartnerText": "Мы открыты для сотрудничества и новых партнерских отношений. Свяжитесь с нами для обсуждения возможностей.",
|
||||
|
||||
"home.charity.title": "Благотворительный фонд",
|
||||
"home.charity.description": "Наш благотворительный фонд был создан для поддержки социально значимых проектов в Таджикистане. Мы стремимся внести свой вклад в развитие общества и помочь тем, кто в этом нуждается.",
|
||||
"home.charity.directions": "Основные направления деятельности нашего фонда:",
|
||||
@ -68,8 +77,10 @@
|
||||
"home.charity.ecology": "Экологические инициативы",
|
||||
"home.charity.sports": "Поддержка спортивных мероприятий",
|
||||
"home.charity.learnMore": "Подробнее о фонде",
|
||||
|
||||
"home.cta.title": "Присоединяйтесь к нам",
|
||||
"home.cta.description": "Станьте частью нашей сети. Получайте специальные предложения, бонусы и скидки.",
|
||||
|
||||
"certificates.title": "Наши сертификаты",
|
||||
"certificates.description": "GasNetwork придерживается высоких стандартов качества и безопасности. Наши сертификаты подтверждают соответствие нашей продукции и услуг международным и национальным стандартам.",
|
||||
"certificates.requestInfo": "Запросить дополнительную информацию",
|
||||
@ -77,6 +88,7 @@
|
||||
"certificates.issueDate": "Дата выдачи",
|
||||
"certificates.expiryDate": "Действителен до",
|
||||
"certificates.faq": "Часто задаваемые вопросы",
|
||||
|
||||
"auth.title": "Вход в личный кабинет",
|
||||
"auth.description": "Войдите в личный кабинет, чтобы получить доступ к информации о ваших бонусах, истории операций и другим возможностям.",
|
||||
"auth.bonusClient": "Бонусный клиент",
|
||||
@ -88,6 +100,7 @@
|
||||
"auth.phoneNumber": "Номер телефона",
|
||||
"auth.cardNumber": "Номер карты",
|
||||
"auth.loginIssues": "Возникли проблемы со входом?",
|
||||
|
||||
"map.filters": "Фильтры",
|
||||
"map.stationsList": "Список заправок",
|
||||
"map.noStations": "Нет заправок, соответствующих выбранным фильтрам",
|
||||
|
||||
44
src/shared/language/ui/language-switcher.tsx
Normal file
44
src/shared/language/ui/language-switcher.tsx
Normal file
@ -0,0 +1,44 @@
|
||||
'use client';
|
||||
|
||||
import { Check, Globe } from 'lucide-react';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { type Language, languages, useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
} from '@/shared/shadcn-ui/dropdown-menu';
|
||||
|
||||
export function LanguageSwitcher() {
|
||||
const { language, setLanguage } = useLanguage();
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<DropdownMenu open={open} onOpenChange={setOpen}>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant='ghost' size='sm' className='h-8 w-8 px-0'>
|
||||
<Globe className='h-4 w-4' />
|
||||
<span className='sr-only'>Switch language</span>
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align='end'>
|
||||
{Object.entries(languages).map(([code, { name, flag }]) => (
|
||||
<DropdownMenuItem
|
||||
key={code}
|
||||
onClick={() => {
|
||||
setLanguage(code as Language);
|
||||
setOpen(false);
|
||||
}}
|
||||
>
|
||||
<span className='mr-2'>{flag}</span>
|
||||
{name}
|
||||
{code === language && <Check className='ml-2 h-4 w-4' />}
|
||||
</DropdownMenuItem>
|
||||
))}
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
);
|
||||
}
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
import { LanguageProvider } from '../language';
|
||||
import { store } from '../store';
|
||||
import { ThemeProvider } from '../theme/theme-provider';
|
||||
import { AosProvider } from './aos-provider';
|
||||
import { Toaster } from './toaster';
|
||||
import { LanguageProvider } from '../language';
|
||||
|
||||
type ProvidersProps = {
|
||||
children: React.ReactNode;
|
||||
|
||||
@ -1,30 +1,27 @@
|
||||
'use client';
|
||||
|
||||
import { Users } from 'lucide-react';
|
||||
import Image from 'next/image';
|
||||
|
||||
import AboutCounter from '@/shared/components/about-counter';
|
||||
import { useLanguage } from '@/shared/language';
|
||||
|
||||
export const AboutSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='about' className='py-16'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='grid items-center gap-12 md:grid-cols-2'>
|
||||
<div data-aos='fade-right'>
|
||||
<div>
|
||||
<div className='mb-4 inline-flex items-center justify-center rounded-full bg-red-100 p-2'>
|
||||
<Users className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-6 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
О нашей компании
|
||||
{t('home.about.title')}
|
||||
</h2>
|
||||
<p className='mb-6 text-gray-600'>
|
||||
Наша сеть заправок является одной из ведущих в Таджикистане. Мы
|
||||
предоставляем качественное топливо и высокий уровень обслуживания
|
||||
для наших клиентов уже более 15 лет.
|
||||
</p>
|
||||
<p className='mb-6 text-gray-600'>
|
||||
Мы постоянно развиваемся, открывая новые станции и улучшая сервис
|
||||
на существующих. Наша цель - сделать заправку автомобиля
|
||||
максимально удобной и быстрой для каждого клиента.
|
||||
</p>
|
||||
<p className='mb-6 text-gray-600'>{t('home.about.description1')}</p>
|
||||
<p className='mb-6 text-gray-600'>{t('home.about.description2')}</p>
|
||||
|
||||
<AboutCounter />
|
||||
<div className='space-y-4'>
|
||||
@ -33,9 +30,11 @@ export const AboutSection = () => {
|
||||
<span className='text-xs text-white'>✓</span>
|
||||
</div>
|
||||
<div className='ml-3'>
|
||||
<h3 className='text-lg font-medium'>Качественное топливо</h3>
|
||||
<h3 className='text-lg font-medium'>
|
||||
{t('home.about.features.quality.title')}
|
||||
</h3>
|
||||
<p className='text-gray-600'>
|
||||
Мы гарантируем высокое качество нашего топлива
|
||||
{t('home.about.features.quality.description')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -45,10 +44,10 @@ export const AboutSection = () => {
|
||||
</div>
|
||||
<div className='ml-3'>
|
||||
<h3 className='text-lg font-medium'>
|
||||
Современное оборудование
|
||||
{t('home.about.features.equipment.title')}
|
||||
</h3>
|
||||
<p className='text-gray-600'>
|
||||
Все наши станции оснащены современным оборудованием
|
||||
{t('home.about.features.equipment.description')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -58,18 +57,18 @@ export const AboutSection = () => {
|
||||
</div>
|
||||
<div className='ml-3'>
|
||||
<h3 className='text-lg font-medium'>
|
||||
Профессиональный персонал
|
||||
{t('home.about.features.staff.title')}
|
||||
</h3>
|
||||
<p className='text-gray-600'>
|
||||
Наши сотрудники - профессионалы своего дела
|
||||
{t('home.about.features.staff.description')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
data-aos='fade-up'
|
||||
className='relative h-[400px] overflow-hidden rounded-xl shadow-xl'
|
||||
data-aos='zoom-in-down'
|
||||
>
|
||||
<Image
|
||||
src='/placeholder.svg?height=400&width=600'
|
||||
|
||||
@ -1,16 +1,21 @@
|
||||
'use client';
|
||||
|
||||
import { ChevronRight, Heart } from 'lucide-react';
|
||||
import Image from 'next/image';
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const CharitySection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='charity' className='py-16'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='grid items-center gap-12 md:grid-cols-2'>
|
||||
<div
|
||||
data-aos='zoom-in'
|
||||
className='relative order-2 h-[400px] overflow-hidden rounded-xl shadow-xl md:order-1'
|
||||
data-aos='zoom-out-up'
|
||||
>
|
||||
<Image
|
||||
src='/placeholder.svg?height=400&width=600'
|
||||
@ -24,36 +29,32 @@ export const CharitySection = () => {
|
||||
<Heart className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-6 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Благотворительный фонд
|
||||
{t('home.charity.title')}
|
||||
</h2>
|
||||
<p className='mb-6 text-gray-600'>
|
||||
Наш благотворительный фонд был создан для поддержки социально
|
||||
значимых проектов в Таджикистане. Мы стремимся внести свой вклад в
|
||||
развитие общества и помочь тем, кто в этом нуждается.
|
||||
</p>
|
||||
<p className='mb-6 text-gray-600'>
|
||||
Основные направления деятельности нашего фонда:
|
||||
{t('home.charity.description')}
|
||||
</p>
|
||||
<p className='mb-6 text-gray-600'>{t('home.charity.directions')}</p>
|
||||
<ul className='mb-6 space-y-2'>
|
||||
<li className='flex items-center'>
|
||||
<ChevronRight className='mr-2 h-5 w-5 text-red-600' />
|
||||
<span>Поддержка образовательных программ</span>
|
||||
<span>{t('home.charity.education')}</span>
|
||||
</li>
|
||||
<li className='flex items-center'>
|
||||
<ChevronRight className='mr-2 h-5 w-5 text-red-600' />
|
||||
<span>Помощь детям из малообеспеченных семей</span>
|
||||
<span>{t('home.charity.children')}</span>
|
||||
</li>
|
||||
<li className='flex items-center'>
|
||||
<ChevronRight className='mr-2 h-5 w-5 text-red-600' />
|
||||
<span>Экологические инициативы</span>
|
||||
<span>{t('home.charity.ecology')}</span>
|
||||
</li>
|
||||
<li className='flex items-center'>
|
||||
<ChevronRight className='mr-2 h-5 w-5 text-red-600' />
|
||||
<span>Поддержка спортивных мероприятий</span>
|
||||
<span>{t('home.charity.sports')}</span>
|
||||
</li>
|
||||
</ul>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Подробнее о фонде
|
||||
{t('home.charity.learnMore')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,21 +1,23 @@
|
||||
'use client';
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const CtaSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section className='bg-red-600 py-16 text-white'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='flex flex-col items-center text-center'>
|
||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Присоединяйтесь к нам
|
||||
{t('home.cta.title')}
|
||||
</h2>
|
||||
<p className='mb-8 max-w-2xl'>
|
||||
Станьте частью нашей сети. Получайте специальные предложения, бонусы
|
||||
и скидки.
|
||||
</p>
|
||||
<p className='mb-8 max-w-2xl'>{t('home.cta.description')}</p>
|
||||
<div className='flex flex-col gap-4 sm:flex-row'>
|
||||
<Button variant='outline'>Скачать приложение</Button>
|
||||
<Button variant='secondary'>
|
||||
Получить карту лояльности
|
||||
<Button variant='outline'>{t('common.buttons.downloadApp')}</Button>
|
||||
<Button className='bg-white text-red-600 hover:bg-gray-100'>
|
||||
{t('common.buttons.getLoyaltyCard')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,23 +1,25 @@
|
||||
'use client';
|
||||
|
||||
import { Fuel, Mail, MapPin, Phone } from 'lucide-react';
|
||||
import Link from 'next/link';
|
||||
import '.././app/globals.css'
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const Footer = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<footer className='bg-gray-900 py-12 text-white'>
|
||||
<div className='container mx-auto'>
|
||||
<footer className='bg-gray-900 py-12 text-white px-4'>
|
||||
<div className='containe mx-autor'>
|
||||
<div className='grid grid-cols-1 gap-8 md:grid-cols-4'>
|
||||
<div>
|
||||
<div className='mb-4 flex items-center gap-2'>
|
||||
<Fuel className='h-6 w-6 text-red-500' />
|
||||
<span className='text-xl font-bold'>GasNetwork</span>
|
||||
</div>
|
||||
<p className='mb-4 text-gray-400'>
|
||||
Сеть современных заправок в Таджикистане. Качественное топливо и
|
||||
отличный сервис.
|
||||
</p>
|
||||
<p className='mb-4 text-gray-400'>{t('home.hero.description')}</p>
|
||||
<div className='flex space-x-4'>
|
||||
<a href='#' className='text-gray-400 hover:text-white'>
|
||||
<svg
|
||||
@ -60,7 +62,9 @@ export const Footer = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className='mb-4 text-lg font-semibold'>Контакты</h3>
|
||||
<h3 className='mb-4 text-lg font-semibold'>
|
||||
{t('common.footer.contacts')}
|
||||
</h3>
|
||||
<div className='space-y-3'>
|
||||
<div className='flex items-start'>
|
||||
<MapPin className='mt-0.5 mr-3 h-5 w-5 text-red-500' />
|
||||
@ -77,68 +81,60 @@ export const Footer = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className='mb-4 text-lg font-semibold'>Навигация</h3>
|
||||
<h3 className='mb-4 text-lg font-semibold'>
|
||||
{t('common.footer.navigation')}
|
||||
</h3>
|
||||
<ul className='space-y-2'>
|
||||
<li>
|
||||
<Link
|
||||
href='#stations'
|
||||
className='text-gray-400 hover:text-white'
|
||||
>
|
||||
Наши заправки
|
||||
<Link href='/' className='text-gray-400 hover:text-white'>
|
||||
{t('common.navigation.home')}
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href='#about' className='text-gray-400 hover:text-white'>
|
||||
О нас
|
||||
<Link href='/about' className='text-gray-400 hover:text-white'>
|
||||
{t('common.navigation.about')}
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
href='#vacancies'
|
||||
href='/clients/loyalty'
|
||||
className='text-gray-400 hover:text-white'
|
||||
>
|
||||
Вакансии
|
||||
{t('common.navigation.clients')}
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
href='#promotions'
|
||||
href='/#stations'
|
||||
className='text-gray-400 hover:text-white'
|
||||
>
|
||||
Акции
|
||||
{t('common.navigation.stations')}
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
href='#partners'
|
||||
href='/#vacancies'
|
||||
className='text-gray-400 hover:text-white'
|
||||
>
|
||||
Партнеры
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
href='#charity'
|
||||
className='text-gray-400 hover:text-white'
|
||||
>
|
||||
Благотворительность
|
||||
{t('common.navigation.vacancies')}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className='mb-4 text-lg font-semibold'>Подписка</h3>
|
||||
<h3 className='mb-4 text-lg font-semibold'>
|
||||
{t('common.footer.subscribe')}
|
||||
</h3>
|
||||
<p className='mb-4 text-gray-400'>
|
||||
Подпишитесь на нашу рассылку, чтобы получать новости и специальные
|
||||
предложения.
|
||||
{t('common.footer.subscribeText')}
|
||||
</p>
|
||||
<form className='space-y-2'>
|
||||
<input
|
||||
type='email'
|
||||
placeholder='Ваш email'
|
||||
placeholder={t('common.footer.yourEmail')}
|
||||
className='w-full rounded-md border border-gray-700 bg-gray-800 px-4 py-2 text-white'
|
||||
/>
|
||||
<Button className='w-full bg-red-600 hover:bg-red-700 heartbeat'>
|
||||
<Button className='w-full bg-red-600 hover:bg-red-700'>
|
||||
Подписаться
|
||||
</Button>
|
||||
</form>
|
||||
@ -146,7 +142,8 @@ export const Footer = () => {
|
||||
</div>
|
||||
<div className='mt-8 border-t border-gray-800 pt-8 text-center text-gray-400'>
|
||||
<p>
|
||||
© {new Date().getFullYear()} GasNetwork. Все права защищены.
|
||||
© {new Date().getFullYear()} GasNetwork.{' '}
|
||||
{t('common.footer.rights')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -14,7 +14,7 @@ import {
|
||||
|
||||
export function DesktopNav() {
|
||||
return (
|
||||
<NavigationMenu className='hidden md:flex'>
|
||||
<NavigationMenu className='hidden lg:flex'>
|
||||
<NavigationMenuList>
|
||||
<NavigationMenuItem>
|
||||
<Link href='/' scroll>
|
||||
|
||||
@ -1,24 +1,37 @@
|
||||
'use client';
|
||||
|
||||
import { UserCircle } from 'lucide-react';
|
||||
import Link from 'next/link';
|
||||
|
||||
import { Logo } from '@/shared/assets/logo';
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { LanguageSwitcher } from '@/shared/language/ui/language-switcher';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
import { DesktopNav } from './desktop-nav';
|
||||
import { MobileNav } from './mobile-nav';
|
||||
|
||||
export function Header() {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<header className='sticky top-0 z-40 w-full border-b bg-white'>
|
||||
<div className='container mx-auto flex h-16 items-center justify-between p-4'>
|
||||
<Logo />
|
||||
<DesktopNav />
|
||||
<div className='flex items-center gap-6 md:contents'>
|
||||
<div className='flex items-center gap-6 lg:contents'>
|
||||
<MobileNav />
|
||||
<div className='flex items-center gap-6'>
|
||||
<LanguageSwitcher />
|
||||
<Link href={'/login'}>
|
||||
<Button>Вход</Button>
|
||||
<Button className='flex items-center gap-2'>
|
||||
<UserCircle className='size-4' />
|
||||
{t('common.buttons.login')}
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
@ -19,7 +19,7 @@ export function MobileNav() {
|
||||
return (
|
||||
<Sheet open={open} onOpenChange={setOpen}>
|
||||
<SheetTrigger asChild>
|
||||
<Button variant='ghost' className='md:hidden' size='icon'>
|
||||
<Button variant='ghost' className='lg:hidden' size='icon'>
|
||||
<Menu className='h-6 w-6' />
|
||||
<span className='sr-only'>Открыть меню</span>
|
||||
</Button>
|
||||
|
||||
@ -1,10 +1,15 @@
|
||||
'use client';
|
||||
|
||||
import { MapPin } from 'lucide-react';
|
||||
import Image from 'next/image';
|
||||
import '../../src/app/globals.css'
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const HeroSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section className='relative'>
|
||||
<div className='relative h-[500px] w-full overflow-hidden'>
|
||||
@ -19,20 +24,18 @@ export const HeroSection = () => {
|
||||
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='max-w-lg space-y-4 text-white'>
|
||||
<div className='flex tracking-in-expand'>
|
||||
<h1 className='text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
||||
Сеть современных заправок в Таджикистане
|
||||
</h1>
|
||||
</div>
|
||||
<p className='text-lg text-gray-200'>
|
||||
Качественное топливо, удобное расположение и отличный сервис для
|
||||
наших клиентов
|
||||
{t('home.hero.description')}
|
||||
</p>
|
||||
<div className='flex gap-4'>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Найти заправку <MapPin className='ml-2 h-4 w-4' />
|
||||
{t('common.buttons.findStation')}{' '}
|
||||
<MapPin className='ml-2 h-4 w-4' />
|
||||
</Button>
|
||||
<Button variant='outline' className='animate-pulse'
|
||||
<Button variant='outline'
|
||||
>
|
||||
Узнать больше
|
||||
</Button>
|
||||
|
||||
@ -1,10 +1,15 @@
|
||||
'use client';
|
||||
|
||||
import { ChevronRight, MapPin } from 'lucide-react';
|
||||
|
||||
import { GasStationMap } from '@/features/map';
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const MapSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='stations' className='bg-gray-50 py-16'>
|
||||
<div className='container mx-auto'>
|
||||
@ -13,22 +18,22 @@ export const MapSection = () => {
|
||||
<MapPin className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Наши заправки
|
||||
{t('home.stations.title')}
|
||||
</h2>
|
||||
<p className='max-w-2xl text-gray-600'>
|
||||
Найдите ближайшую к вам заправку нашей сети. Мы расположены в
|
||||
удобных местах по всему Таджикистану.
|
||||
{t('home.stations.description')}
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
data-aos='fade-up'
|
||||
className='h-[500px] overflow-hidden rounded-xl border shadow-lg'
|
||||
data-aos='fade-up'
|
||||
>
|
||||
<GasStationMap />
|
||||
</div>
|
||||
<div className='mt-8 flex justify-center'>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Показать все заправки <ChevronRight className='ml-2 h-4 w-4' />
|
||||
{t('common.buttons.viewAll')}{' '}
|
||||
<ChevronRight className='ml-2 h-4 w-4' />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,9 +1,14 @@
|
||||
'use client';
|
||||
|
||||
import { Handshake } from 'lucide-react';
|
||||
import Image from 'next/image';
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const PartnersSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='partners' className='bg-gray-50 py-16'>
|
||||
<div className='container mx-auto'>
|
||||
@ -12,11 +17,10 @@ export const PartnersSection = () => {
|
||||
<Handshake className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Наши партнеры
|
||||
{t('home.partners.title')}
|
||||
</h2>
|
||||
<p className='max-w-2xl text-gray-600'>
|
||||
Мы сотрудничаем с ведущими компаниями для предоставления лучших
|
||||
услуг нашим клиентам.
|
||||
{t('home.partners.description')}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@ -25,7 +29,7 @@ export const PartnersSection = () => {
|
||||
<div
|
||||
key={partner}
|
||||
className='flex h-32 items-center justify-center rounded-lg bg-white p-6 shadow-md transition-transform hover:scale-105'
|
||||
data-aos='flip-up'
|
||||
data-aos='flip-left'
|
||||
>
|
||||
<Image
|
||||
src={`/placeholder.svg?height=80&width=160&text=Partner ${partner}`}
|
||||
@ -39,13 +43,14 @@ export const PartnersSection = () => {
|
||||
</div>
|
||||
|
||||
<div className='mt-12 text-center'>
|
||||
<h3 className='mb-4 text-xl font-bold'>Станьте нашим партнером</h3>
|
||||
<h3 className='mb-4 text-xl font-bold'>
|
||||
{t('home.partners.becomePartner')}
|
||||
</h3>
|
||||
<p className='mx-auto mb-6 max-w-2xl text-gray-600'>
|
||||
Мы открыты для сотрудничества и новых партнерских отношений.
|
||||
Свяжитесь с нами для обсуждения возможностей.
|
||||
{t('home.partners.becomePartnerText')}
|
||||
</p>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Связаться с нами
|
||||
{t('common.buttons.contactUs')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,9 +1,14 @@
|
||||
'use client';
|
||||
|
||||
import { ArrowRight, Gift } from 'lucide-react';
|
||||
|
||||
import PromotionSlider from '@/shared/components/promotion-slider';
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
|
||||
export const PromotionsSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='promotions' className='bg-gray-50 py-16'>
|
||||
<div className='container mx-auto'>
|
||||
@ -12,17 +17,17 @@ export const PromotionsSection = () => {
|
||||
<Gift className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Актуальные акции
|
||||
{t('home.promotions.title')}
|
||||
</h2>
|
||||
<p className='max-w-2xl text-gray-600'>
|
||||
Специальные предложения и акции для наших клиентов. Заправляйтесь
|
||||
выгодно!
|
||||
{t('home.promotions.description')}
|
||||
</p>
|
||||
</div>
|
||||
<PromotionSlider />
|
||||
<div className='mt-8 flex justify-center'>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Все акции <ArrowRight className='ml-2 h-4 w-4' />
|
||||
{t('common.buttons.viewAll')}{' '}
|
||||
<ArrowRight className='ml-2 h-4 w-4' />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
'use client';
|
||||
|
||||
import { ArrowRight, Briefcase } from 'lucide-react';
|
||||
|
||||
import { useLanguage } from '@/shared/language';
|
||||
import { Button } from '@/shared/shadcn-ui/button';
|
||||
import { Card, CardContent } from '@/shared/shadcn-ui/card';
|
||||
import {
|
||||
@ -10,6 +13,8 @@ import {
|
||||
} from '@/shared/shadcn-ui/tabs';
|
||||
|
||||
export const VacanciesSection = () => {
|
||||
const { t } = useLanguage();
|
||||
|
||||
return (
|
||||
<section id='vacancies' className='py-16'>
|
||||
<div className='container mx-auto'>
|
||||
@ -18,11 +23,10 @@ export const VacanciesSection = () => {
|
||||
<Briefcase className='h-6 w-6 text-red-600' />
|
||||
</div>
|
||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||
Вакансии
|
||||
{t('home.vacancies.title')}
|
||||
</h2>
|
||||
<p className='max-w-2xl text-gray-600'>
|
||||
Присоединяйтесь к нашей команде профессионалов. Мы предлагаем
|
||||
стабильную работу и возможности для роста.
|
||||
{t('home.vacancies.description')}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@ -42,7 +46,7 @@ export const VacanciesSection = () => {
|
||||
<Card
|
||||
key={index}
|
||||
className='overflow-hidden transition-all hover:shadow-md'
|
||||
data-aos={index % 2 === 0 ? 'fade-right' : 'fade-left'}
|
||||
data-aos='zoom-in'
|
||||
>
|
||||
<CardContent className='p-0'>
|
||||
<div className='p-6'>
|
||||
@ -62,7 +66,7 @@ export const VacanciesSection = () => {
|
||||
</div>
|
||||
</div>
|
||||
<Button variant='outline' size='sm'>
|
||||
Подробнее
|
||||
{t('common.buttons.readMore')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@ -99,7 +103,7 @@ export const VacanciesSection = () => {
|
||||
</div>
|
||||
</div>
|
||||
<Button variant='outline' size='sm'>
|
||||
Подробнее
|
||||
{t('common.buttons.readMore')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@ -133,7 +137,7 @@ export const VacanciesSection = () => {
|
||||
</div>
|
||||
</div>
|
||||
<Button variant='outline' size='sm'>
|
||||
Подробнее
|
||||
{t('common.buttons.readMore')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@ -146,7 +150,8 @@ export const VacanciesSection = () => {
|
||||
|
||||
<div className='mt-8 flex justify-center'>
|
||||
<Button className='bg-red-600 hover:bg-red-700'>
|
||||
Отправить резюме <ArrowRight className='ml-2 h-4 w-4' />
|
||||
{t('common.buttons.sendResume')}{' '}
|
||||
<ArrowRight className='ml-2 h-4 w-4' />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user