Binary files /dev/null and b/public/images/promo-cards/chats.png differ
Binary files /dev/null and b/public/images/promo-cards/copyright.png differ
Binary files /dev/null and b/public/images/promo-cards/flux.png differ
Binary files /dev/null and b/public/images/promo-cards/image-enhancement.png differ
Binary files /dev/null and b/public/images/promo-cards/stable-diff.png differ
Binary files /dev/null and b/public/images/promo-cards/video.png differ
@@ -0,0 +1,6 @@
+
@@ -0,0 +1,7 @@
+import { HomePage } from '#/views/home'
+import { getDefaultLayout } from '#/widgets/layouts'
+
+HomePage.getLayout = getDefaultLayout({ titlePage: 'Главная' })
+
+export default HomePage
+
@@ -0,0 +1,3 @@
+export { PromoCard } from './promo-card'
+export type { PromoCard as PromoCardType, PromoCardProps } from './promo-card'
+
@@ -0,0 +1,167 @@
+.card {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ min-height: 400px;
+ cursor: pointer;
+ border-radius: 16px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
+ grid-column: span 1;
+
+ &:hover {
+ transform: scale(1.02);
+ box-shadow: 0px 4px 20px rgba(130, 128, 255, 0.2);
+ }
+
+ &[data-desktop='true'] {
+ min-height: 500px;
+ min-width: 0;
+
+ &[data-flex='2'] {
+ grid-column: span 2;
+ }
+
+ &[data-flex='1'] {
+ grid-column: span 1;
+ }
+ }
+}
+
+.imageWrapper {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 0;
+}
+
+.overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ 180deg,
+ rgba(0, 0, 0, 0.3) 0%,
+ rgba(0, 0, 0, 0.5) 50%,
+ rgba(0, 0, 0, 0.7) 100%
+ );
+ z-index: 1;
+}
+
+.content {
+ position: relative;
+ z-index: 2;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ height: 100%;
+ padding: 32px 24px;
+ color: white;
+}
+
+.card[data-desktop='true'] .content {
+ padding: 40px 32px;
+}
+
+.title {
+ font-size: 32px;
+ font-weight: 700;
+ color: #ffffff;
+ margin-bottom: 16px;
+ line-height: 1.2;
+}
+
+.card[data-desktop='true'] .title {
+ font-size: 48px;
+ margin-bottom: 20px;
+}
+
+.description {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.9);
+ line-height: 1.6;
+ margin-bottom: auto;
+ max-width: 80%;
+}
+
+.card[data-desktop='true'] .description {
+ font-size: 16px;
+ max-width: 70%;
+}
+
+.buttonWrapper {
+ margin-top: 24px;
+}
+
+.card[data-desktop='true'] .buttonWrapper {
+ margin-top: 32px;
+}
+
+.button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ background-color: #ffffff !important;
+ color: #000000 !important;
+ border-radius: 12px;
+ padding: 14px 24px;
+ width: fit-content;
+ transition: background-color 0.2s ease, transform 0.2s ease;
+ cursor: pointer;
+ border: none;
+
+ &:hover {
+ background-color: rgba(255, 255, 255, 0.9) !important;
+ transform: translateX(4px);
+ }
+
+ &:disabled {
+ background-color: transparent !important;
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+ cursor: not-allowed;
+ pointer-events: none;
+
+ &:hover {
+ background-color: transparent !important;
+ transform: none;
+ }
+ }
+}
+
+.card[data-desktop='true'] .button {
+ padding: 16px 28px;
+}
+
+.buttonText {
+ font-size: 15px;
+ font-weight: 600;
+ color: #000000;
+ margin: 0;
+}
+
+.card[data-desktop='true'] .buttonText {
+ font-size: 16px;
+}
+
+.button:disabled .buttonText {
+ color: rgba(255, 255, 255, 1);
+}
+
+.arrowIcon {
+ width: 20px;
+ height: 20px;
+ transition: transform 0.2s ease;
+}
+
+.card[data-desktop='true'] .arrowIcon {
+ width: 24px;
+ height: 24px;
+}
+
@@ -0,0 +1,77 @@
+import * as React from 'react'
+import { Box, Typography } from '@mui/material'
+import { ChevronRight } from '@mui/icons-material'
+import Image from 'next/image'
+import Link from 'next/link'
+
+import { CommonButton } from '#/shared/ui/button/ui'
+import styles from './promo-card.module.scss'
+
+export interface PromoCard {
+ title: string
+ image: string
+ description: string
+ routerlink: string
+ buttonText?: string
+ buttonDisabled?: boolean
+}
+
+export interface PromoCardProps {
+ card: PromoCard
+ isDesktop?: boolean
+ flex?: number
+}
+
+export const PromoCard: React.FC = ({ card, isDesktop, flex = 1 }) => {
+ const isButtonDisabled = card.buttonDisabled ?? false;
+
+ const handleClick = (e: React.MouseEvent) => {
+ if (isButtonDisabled) {
+ e.preventDefault()
+ }
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ {card.title}
+
+
+ {card.description}
+
+
+
+
+
+ {card.buttonText || 'Попробовать'}
+
+ {!isButtonDisabled && }
+
+
+
+
+ )
+}
+
@@ -0,0 +1,2 @@
+export * from './ui'
+
@@ -0,0 +1,3 @@
+export { PromoCardsList } from './promo-cards-list'
+export type { PromoCardsListProps } from './promo-cards-list'
+
@@ -0,0 +1,13 @@
+.list {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 20px;
+ width: 100%;
+
+ &[data-desktop='true'] {
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+ max-width: 100%;
+ }
+}
+
@@ -0,0 +1,26 @@
+import * as React from 'react'
+import { Box } from '@mui/material'
+
+import { PromoCard, PromoCardType } from '#/views/home/ui/promo-card'
+import styles from './promo-cards-list.module.scss'
+
+export interface PromoCardsListProps {
+ cards: PromoCardType[]
+ isDesktop?: boolean
+}
+
+const FLEX_PATTERN = [2, 1, 1, 2]
+
+export const PromoCardsList: React.FC = ({ cards, isDesktop }) => {
+ return (
+
+ {cards.map((card, index) => {
+ const flexValue = FLEX_PATTERN[index % FLEX_PATTERN.length]
+ return (
+
+ )
+ })}
+
+ )
+}
+
@@ -0,0 +1,2 @@
+export * from './ui'
+
@@ -0,0 +1,83 @@
+import * as React from 'react'
+import { Box, Typography } from '@mui/material'
+
+import { NextPageWithLayout } from '#/pages/_app'
+import { getDeviceType } from '#/shared/lib/helpers/get-type-device'
+import { PromoCardsList } from './promo-cards-list'
+import type { PromoCardType } from './promo-card'
+
+export interface HomePageProps {}
+
+const Home: NextPageWithLayout = () => {
+ const deviceType = getDeviceType()
+
+ const promoCards: PromoCardType[] = [
+ {
+ title: 'Flux 1.1',
+ image: '/images/promo-cards/flux.png',
+ description: 'Современная нейросеть, способная анализировать данные, обрабатывать информацию и генерировать уникальный контент для различных задач.',
+ routerlink: '/images/flux',
+ buttonText: 'Попробовать',
+ },
+ {
+ title: 'Чат-боты',
+ image: '/images/promo-cards/chats.png',
+ description: 'Получите доступ к последним версиям самых передовых текстовых моделей.',
+ routerlink: '/chat-bot',
+ buttonText: 'Попробовать',
+ },
+ {
+ title: 'Stable Diffusion',
+ image: '/images/promo-cards/stable-diff.png',
+ description: 'Превращайте текстовые описания в реалистичные или художественные изображения.',
+ routerlink: '/images/stablediffusion',
+ buttonText: 'Попробовать',
+ },
+ {
+ title: 'Создание видео',
+ image: '/images/promo-cards/video.png',
+ description: 'Генерируйте и редактируйте видео с помощью передовых технологий ИИ.',
+ routerlink: '/videos',
+ buttonText: 'Попробовать',
+ },
+ {
+ title: 'Копирайтинг',
+ image: '/images/promo-cards/copyright.png',
+ description: 'Создавайте уникальные, качественные тексты для бизнеса, блогов и рекламы.',
+ routerlink: '/chat-bot',
+ buttonText: 'Скоро будет доступно',
+ buttonDisabled: true,
+ },
+ {
+ title: 'Улучшение фото',
+ image: '/images/promo-cards/image-enhancement.png',
+ description: 'Улучшайте качество, устраняйте шум и добавляйте детали с помощью ИИ.',
+ routerlink: '/images/nanobanana',
+ buttonText: 'Скоро будет доступно',
+ buttonDisabled: true,
+ },
+ ]
+
+ return (
+
+
+
+ Главная
+
+
+
+
+
+
+ )
+}
+
+export default Home
+
@@ -0,0 +1,2 @@
+export { default as HomePage } from './home'
+
@@ -0,0 +1,2 @@
+export * from './ui'
+
@@ -20,6 +20,7 @@ import { useUserSettingsContext } from '#/entities/user-account'
import { BUSINESS_ERROR_REPORT, ERROR_REPORT, getModalById } from '#/features/modals'
export const menuListTop = [
+ { title: 'Главная', link: '/home', icon: '/svg/side-menu/home-page', activeList: ['home'] },
{ title: 'Дашборд', link: '/', icon: '/svg/side-menu/market', activeList: [] },
{
title: 'Оплата',