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.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: 'Оплата',