chore: optimize homepage features sections
This commit is contained in:
parent
9e7b7ea25a
commit
532de654e2
@ -666,16 +666,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"features3": {
|
"features2": {
|
||||||
"title": "Product Features",
|
"title": "Features2",
|
||||||
"description": "Write the description of your product here, make it as detailed as possible",
|
"subtitle": "The features of your product",
|
||||||
|
"description": "Write the description of your product here",
|
||||||
"feature-1": "Product Feature One",
|
"feature-1": "Product Feature One",
|
||||||
"feature-2": "Product Feature Two",
|
"feature-2": "Product Feature Two",
|
||||||
"feature-3": "Product Feature Three",
|
"feature-3": "Product Feature Three",
|
||||||
"feature-4": "Product Feature Four"
|
"feature-4": "Product Feature Four"
|
||||||
},
|
},
|
||||||
"features5": {
|
"features3": {
|
||||||
"title": "The features of your product",
|
"title": "Features3",
|
||||||
|
"subtitle": "The features of your product",
|
||||||
"description": "Write the description of your product here",
|
"description": "Write the description of your product here",
|
||||||
"items": {
|
"items": {
|
||||||
"item-1": {
|
"item-1": {
|
||||||
|
@ -647,7 +647,7 @@
|
|||||||
"features": {
|
"features": {
|
||||||
"title": "功能",
|
"title": "功能",
|
||||||
"subtitle": "您的 SaaS 产品功能",
|
"subtitle": "您的 SaaS 产品功能",
|
||||||
"description": "请在详细介绍您的 SaaS 产品的特色功能的信息",
|
"description": "请在这里介绍您的 SaaS 产品的特色功能的信息",
|
||||||
"items": {
|
"items": {
|
||||||
"item-1": {
|
"item-1": {
|
||||||
"title": "产品特色功能一",
|
"title": "产品特色功能一",
|
||||||
@ -667,9 +667,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"features5": {
|
"features2": {
|
||||||
"title": "您的 SaaS 产品功能",
|
"title": "功能2",
|
||||||
"description": "请在详细介绍您的 SaaS 产品的特色功能的信息",
|
"subtitle": "您的 SaaS 产品功能",
|
||||||
|
"description": "请在这里介绍您的 SaaS 产品的特色功能的信息",
|
||||||
|
"feature-1": "特色功能特点一",
|
||||||
|
"feature-2": "特色功能特点二",
|
||||||
|
"feature-3": "特色功能特点三",
|
||||||
|
"feature-4": "特色功能特点四"
|
||||||
|
},
|
||||||
|
"features3": {
|
||||||
|
"title": "功能3",
|
||||||
|
"subtitle": "您的 SaaS 产品功能",
|
||||||
|
"description": "请在这里介绍您的 SaaS 产品的特色功能的信息",
|
||||||
"items": {
|
"items": {
|
||||||
"item-1": {
|
"item-1": {
|
||||||
"title": "产品特色功能一",
|
"title": "产品特色功能一",
|
||||||
@ -697,14 +707,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"features3": {
|
|
||||||
"title": "产品特色功能",
|
|
||||||
"description": "请在详细介绍您的 SaaS 产品的特色功能的信息,尽可能详细,使其更吸引用户,提高落地页的转化率",
|
|
||||||
"feature-1": "特色功能特点一",
|
|
||||||
"feature-2": "特色功能特点二",
|
|
||||||
"feature-3": "特色功能特点三",
|
|
||||||
"feature-4": "特色功能特点四"
|
|
||||||
},
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"title": "价格",
|
"title": "价格",
|
||||||
"description": "选择最适合您的付费计划"
|
"description": "选择最适合您的付费计划"
|
||||||
|
@ -3,8 +3,6 @@ import FaqSection from '@/components/blocks/faqs/faqs';
|
|||||||
import FeaturesSection from '@/components/blocks/features/features';
|
import FeaturesSection from '@/components/blocks/features/features';
|
||||||
import Features2Section from '@/components/blocks/features/features2';
|
import Features2Section from '@/components/blocks/features/features2';
|
||||||
import Features3Section from '@/components/blocks/features/features3';
|
import Features3Section from '@/components/blocks/features/features3';
|
||||||
import Features4Section from '@/components/blocks/features/features4';
|
|
||||||
import Features5Section from '@/components/blocks/features/features5';
|
|
||||||
import HeroSection from '@/components/blocks/hero/hero';
|
import HeroSection from '@/components/blocks/hero/hero';
|
||||||
import IntegrationSection from '@/components/blocks/integration/integration';
|
import IntegrationSection from '@/components/blocks/integration/integration';
|
||||||
import Integration2Section from '@/components/blocks/integration/integration2';
|
import Integration2Section from '@/components/blocks/integration/integration2';
|
||||||
@ -58,9 +56,9 @@ export default async function HomePage(props: HomePageProps) {
|
|||||||
|
|
||||||
<FeaturesSection />
|
<FeaturesSection />
|
||||||
|
|
||||||
<Features3Section />
|
<Features2Section />
|
||||||
|
|
||||||
<Features5Section />
|
<Features3Section />
|
||||||
|
|
||||||
<Integration2Section />
|
<Integration2Section />
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ import { useState } from 'react';
|
|||||||
* https://nsui.irung.me/features
|
* https://nsui.irung.me/features
|
||||||
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-12.json
|
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-12.json
|
||||||
*/
|
*/
|
||||||
export default function Features2Section() {
|
export default function FeaturesSection() {
|
||||||
const t = useTranslations('HomePage.features');
|
const t = useTranslations('HomePage.features');
|
||||||
type ImageKey = 'item-1' | 'item-2' | 'item-3' | 'item-4';
|
type ImageKey = 'item-1' | 'item-2' | 'item-3' | 'item-4';
|
||||||
const [activeItem, setActiveItem] = useState<ImageKey>('item-1');
|
const [activeItem, setActiveItem] = useState<ImageKey>('item-1');
|
||||||
|
@ -1,143 +1,75 @@
|
|||||||
'use client';
|
import { HeaderSection } from '@/components/layout/header-section';
|
||||||
|
|
||||||
import { BorderBeam } from '@/components/magicui/border-beam';
|
|
||||||
import {
|
import {
|
||||||
Accordion,
|
ActivityIcon,
|
||||||
AccordionContent,
|
DraftingCompassIcon,
|
||||||
AccordionItem,
|
MailIcon,
|
||||||
AccordionTrigger,
|
ZapIcon,
|
||||||
} from '@/components/ui/accordion';
|
|
||||||
import {
|
|
||||||
ChartBarIncreasingIcon,
|
|
||||||
Database,
|
|
||||||
Fingerprint,
|
|
||||||
IdCard,
|
|
||||||
} from 'lucide-react';
|
} from 'lucide-react';
|
||||||
import { AnimatePresence, motion } from 'motion/react';
|
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import { useState } from 'react';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* https://nsui.irung.me/features
|
* https://nsui.irung.me/features
|
||||||
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-12.json
|
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-5.json
|
||||||
*/
|
*/
|
||||||
export default function Features2Section() {
|
export default function Features2Section() {
|
||||||
const t = useTranslations('HomePage.features');
|
const t = useTranslations('HomePage.features2');
|
||||||
type ImageKey = 'item-1' | 'item-2' | 'item-3' | 'item-4';
|
|
||||||
const [activeItem, setActiveItem] = useState<ImageKey>('item-1');
|
|
||||||
|
|
||||||
const images = {
|
|
||||||
'item-1': {
|
|
||||||
image: '/blocks/music.png',
|
|
||||||
alt: 'Product Feature One',
|
|
||||||
},
|
|
||||||
'item-2': {
|
|
||||||
image: '/blocks/mail2.png',
|
|
||||||
alt: 'Product Feature Two',
|
|
||||||
},
|
|
||||||
'item-3': {
|
|
||||||
image: '/blocks/charts.png',
|
|
||||||
alt: 'Product Feature Three',
|
|
||||||
},
|
|
||||||
'item-4': {
|
|
||||||
image: '/blocks/payments.png',
|
|
||||||
alt: 'Product Feature Four',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-16">
|
<section id="features2" className="px-4 py-16">
|
||||||
<div className="bg-linear-to-b absolute inset-0 -z-10 sm:inset-6 sm:rounded-b-3xl dark:block dark:to-[color-mix(in_oklab,var(--color-zinc-900)_75%,var(--color-background))]" />
|
<div className="mx-auto max-w-6xl space-y-8 lg:space-y-20">
|
||||||
<div className="mx-auto max-w-6xl space-y-8 px-6 md:space-y-16 lg:space-y-20 dark:[--color-border:color-mix(in_oklab,var(--color-white)_10%,transparent)]">
|
<HeaderSection
|
||||||
<div className="relative z-10 mx-auto max-w-2xl space-y-6 text-center">
|
title={t('title')}
|
||||||
<h2 className="text-balance text-4xl lg:text-5xl font-semibold">
|
subtitle={t('subtitle')}
|
||||||
{t('title')}
|
subtitleAs="h2"
|
||||||
</h2>
|
description={t('description')}
|
||||||
<p>{t('description')}</p>
|
descriptionAs="p"
|
||||||
</div>
|
/>
|
||||||
|
|
||||||
<div className="grid gap-12 sm:px-12 md:grid-cols-2 lg:grid-cols-12 md:gap-12 lg:gap-24 lg:px-0">
|
<div className="grid items-center gap-12 lg:grid-cols-5 lg:gap-24">
|
||||||
<div className="bg-background w-full relative flex overflow-hidden rounded-2xl border p-2 md:h-auto lg:col-span-7">
|
<div className="lg:col-span-2">
|
||||||
<div className="aspect-76/59 bg-background relative w-full rounded-2xl">
|
<div className="lg:pr-0">
|
||||||
<AnimatePresence mode="wait">
|
<h2 className="text-4xl font-semibold">{t('title')}</h2>
|
||||||
<motion.div
|
<p className="mt-6">{t('description')}</p>
|
||||||
key={`${activeItem}-id`}
|
|
||||||
initial={{ opacity: 0, y: 6, scale: 0.98 }}
|
|
||||||
animate={{ opacity: 1, y: 0, scale: 1 }}
|
|
||||||
exit={{ opacity: 0, y: 6, scale: 0.98 }}
|
|
||||||
transition={{ duration: 0.2 }}
|
|
||||||
className="size-full overflow-hidden rounded-2xl border bg-zinc-900 shadow-md"
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
src={images[activeItem].image}
|
|
||||||
className="size-full object-cover object-left-top dark:mix-blend-lighten"
|
|
||||||
alt={images[activeItem].alt}
|
|
||||||
width={1207}
|
|
||||||
height={929}
|
|
||||||
/>
|
|
||||||
</motion.div>
|
|
||||||
</AnimatePresence>
|
|
||||||
</div>
|
</div>
|
||||||
<BorderBeam
|
|
||||||
duration={6}
|
<ul className="mt-8 divide-y border-y *:flex *:items-center *:gap-3 *:py-3">
|
||||||
size={200}
|
<li>
|
||||||
className="from-transparent via-yellow-700 to-transparent dark:via-white/50"
|
<MailIcon className="size-5" />
|
||||||
/>
|
{t('feature-1')}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<ZapIcon className="size-5" />
|
||||||
|
{t('feature-2')}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<ActivityIcon className="size-5" />
|
||||||
|
{t('feature-3')}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<DraftingCompassIcon className="size-5" />
|
||||||
|
{t('feature-4')}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="lg:col-span-5 flex flex-col items-center justify-center">
|
<div className="border-border/50 relative rounded-3xl border p-3 lg:col-span-3">
|
||||||
<Accordion
|
<div className="bg-linear-to-b aspect-76/59 relative rounded-2xl from-zinc-300 to-transparent p-px dark:from-zinc-700">
|
||||||
type="single"
|
<Image
|
||||||
value={activeItem}
|
src="/blocks/dark-card.webp"
|
||||||
onValueChange={(value) => setActiveItem(value as ImageKey)}
|
className="hidden rounded-[15px] dark:block"
|
||||||
className="w-full"
|
alt="card illustration dark"
|
||||||
>
|
width={1207}
|
||||||
<AccordionItem value="item-1">
|
height={929}
|
||||||
<AccordionTrigger>
|
/>
|
||||||
<div className="flex items-center gap-2 text-base">
|
<Image
|
||||||
<Database className="size-4" />
|
src="/blocks/card.png"
|
||||||
{t('items.item-1.title')}
|
className="rounded-[15px] shadow dark:hidden"
|
||||||
</div>
|
alt="card illustration light"
|
||||||
</AccordionTrigger>
|
width={1207}
|
||||||
<AccordionContent>
|
height={929}
|
||||||
{t('items.item-1.description')}
|
/>
|
||||||
</AccordionContent>
|
</div>
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-2">
|
|
||||||
<AccordionTrigger>
|
|
||||||
<div className="flex items-center gap-2 text-base">
|
|
||||||
<Fingerprint className="size-4" />
|
|
||||||
{t('items.item-2.title')}
|
|
||||||
</div>
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
{t('items.item-2.description')}
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-3">
|
|
||||||
<AccordionTrigger>
|
|
||||||
<div className="flex items-center gap-2 text-base">
|
|
||||||
<IdCard className="size-4" />
|
|
||||||
{t('items.item-3.title')}
|
|
||||||
</div>
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
{t('items.item-3.description')}
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-4">
|
|
||||||
<AccordionTrigger>
|
|
||||||
<div className="flex items-center gap-2 text-base">
|
|
||||||
<ChartBarIncreasingIcon className="size-4" />
|
|
||||||
{t('items.item-4.title')}
|
|
||||||
</div>
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
{t('items.item-4.description')}
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
</Accordion>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,66 +1,102 @@
|
|||||||
|
import { HeaderSection } from '@/components/layout/header-section';
|
||||||
import {
|
import {
|
||||||
ActivityIcon,
|
CpuIcon,
|
||||||
DraftingCompassIcon,
|
FingerprintIcon,
|
||||||
MailIcon,
|
PencilIcon,
|
||||||
|
Settings2Icon,
|
||||||
|
SparklesIcon,
|
||||||
ZapIcon,
|
ZapIcon,
|
||||||
} from 'lucide-react';
|
} from 'lucide-react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import Image from 'next/image';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* https://nsui.irung.me/features
|
* https://nsui.irung.me/features
|
||||||
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-5.json
|
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-4.json
|
||||||
*/
|
*/
|
||||||
export default function Features3Section() {
|
export default function Features3Section() {
|
||||||
const t = useTranslations('HomePage.features3');
|
const t = useTranslations('HomePage.features3');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-16">
|
<section id="features3" className="px-4 py-16">
|
||||||
<div className="mx-auto max-w-6xl px-6">
|
<div className="mx-auto max-w-6xl space-y-8 lg:space-y-20">
|
||||||
<div className="grid items-center gap-12 md:grid-cols-2 md:gap-12 lg:grid-cols-5 lg:gap-24">
|
<HeaderSection
|
||||||
<div className="lg:col-span-2">
|
title={t('title')}
|
||||||
<div className="md:pr-6 lg:pr-0">
|
subtitle={t('subtitle')}
|
||||||
<h2 className="text-4xl font-semibold">{t('title')}</h2>
|
subtitleAs="h2"
|
||||||
<p className="mt-6">{t('description')}</p>
|
description={t('description')}
|
||||||
</div>
|
descriptionAs="p"
|
||||||
|
/>
|
||||||
|
|
||||||
<ul className="mt-8 divide-y border-y *:flex *:items-center *:gap-3 *:py-3">
|
<div className="relative mx-auto grid divide-x divide-y border *:p-8 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
<li>
|
<div className="space-y-2">
|
||||||
<MailIcon className="size-5" />
|
<div className="flex items-center gap-2">
|
||||||
{t('feature-1')}
|
<ZapIcon className="size-4" />
|
||||||
</li>
|
<h3 className="text-base font-medium">
|
||||||
<li>
|
{t('items.item-1.title')}
|
||||||
<ZapIcon className="size-5" />
|
</h3>
|
||||||
{t('feature-2')}
|
</div>
|
||||||
</li>
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
<li>
|
{t('items.item-1.description')}
|
||||||
<ActivityIcon className="size-5" />
|
</p>
|
||||||
{t('feature-3')}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<DraftingCompassIcon className="size-5" />
|
|
||||||
{t('feature-4')}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
<div className="border-border/50 relative rounded-3xl border p-3 lg:col-span-3">
|
<div className="flex items-center gap-2">
|
||||||
<div className="bg-linear-to-b aspect-76/59 relative rounded-2xl from-zinc-300 to-transparent p-px dark:from-zinc-700">
|
<CpuIcon className="size-4" />
|
||||||
<Image
|
<h3 className="text-base font-medium">
|
||||||
src="/blocks/dark-card.webp"
|
{t('items.item-2.title')}
|
||||||
className="hidden rounded-[15px] dark:block"
|
</h3>
|
||||||
alt="card illustration dark"
|
|
||||||
width={1207}
|
|
||||||
height={929}
|
|
||||||
/>
|
|
||||||
<Image
|
|
||||||
src="/blocks/card.png"
|
|
||||||
className="rounded-[15px] shadow dark:hidden"
|
|
||||||
alt="card illustration light"
|
|
||||||
width={1207}
|
|
||||||
height={929}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
|
{t('items.item-2.description')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<FingerprintIcon className="size-4" />
|
||||||
|
|
||||||
|
<h3 className="text-base font-medium">
|
||||||
|
{t('items.item-3.title')}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
|
{t('items.item-3.description')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<PencilIcon className="size-4" />
|
||||||
|
|
||||||
|
<h3 className="text-base font-medium">
|
||||||
|
{t('items.item-4.title')}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
|
{t('items.item-4.description')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Settings2Icon className="size-4" />
|
||||||
|
|
||||||
|
<h3 className="text-base font-medium">
|
||||||
|
{t('items.item-5.title')}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
|
{t('items.item-5.description')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<SparklesIcon className="size-4" />
|
||||||
|
|
||||||
|
<h3 className="text-base font-medium">
|
||||||
|
{t('items.item-6.title')}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground mt-4">
|
||||||
|
{t('items.item-6.description')}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
import {
|
|
||||||
ActivityIcon,
|
|
||||||
DraftingCompassIcon,
|
|
||||||
MailIcon,
|
|
||||||
ZapIcon,
|
|
||||||
} from 'lucide-react';
|
|
||||||
import { useTranslations } from 'next-intl';
|
|
||||||
import Image from 'next/image';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Features4Section is Features3Section with a different layout
|
|
||||||
*
|
|
||||||
* https://nsui.irung.me/features
|
|
||||||
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-5.json
|
|
||||||
*/
|
|
||||||
export default function Features4Section() {
|
|
||||||
const t = useTranslations('HomePage.features3');
|
|
||||||
|
|
||||||
return (
|
|
||||||
<section className="py-16">
|
|
||||||
<div className="mx-auto max-w-6xl px-6">
|
|
||||||
<div className="grid items-center gap-12 md:grid-cols-2 md:gap-12 lg:grid-cols-5 lg:gap-24">
|
|
||||||
<div className="border-border/50 relative rounded-3xl border p-3 lg:col-span-3">
|
|
||||||
<div className="bg-linear-to-b aspect-76/59 relative rounded-2xl from-zinc-300 to-transparent p-px dark:from-zinc-700">
|
|
||||||
<Image
|
|
||||||
src="/blocks/payments.png"
|
|
||||||
className="hidden rounded-[15px] dark:block"
|
|
||||||
alt="payments illustration dark"
|
|
||||||
width={1207}
|
|
||||||
height={929}
|
|
||||||
/>
|
|
||||||
<Image
|
|
||||||
src="/blocks/payments-light.png"
|
|
||||||
className="rounded-[15px] shadow dark:hidden"
|
|
||||||
alt="payments illustration light"
|
|
||||||
width={1207}
|
|
||||||
height={929}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="lg:col-span-2">
|
|
||||||
<div className="md:pr-6 lg:pr-0">
|
|
||||||
<h2 className="text-4xl font-semibold">{t('title')}</h2>
|
|
||||||
<p className="mt-6">{t('description')}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ul className="mt-8 divide-y border-y *:flex *:items-center *:gap-3 *:py-3">
|
|
||||||
<li>
|
|
||||||
<MailIcon className="size-5" />
|
|
||||||
{t('feature-1')}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<ZapIcon className="size-5" />
|
|
||||||
{t('feature-2')}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<ActivityIcon className="size-5" />
|
|
||||||
{t('feature-3')}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<DraftingCompassIcon className="size-5" />
|
|
||||||
{t('feature-4')}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
CpuIcon,
|
|
||||||
FingerprintIcon,
|
|
||||||
PencilIcon,
|
|
||||||
Settings2Icon,
|
|
||||||
SparklesIcon,
|
|
||||||
ZapIcon,
|
|
||||||
} from 'lucide-react';
|
|
||||||
import { useTranslations } from 'next-intl';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* https://nsui.irung.me/features
|
|
||||||
* pnpm dlx shadcn@canary add https://nsui.irung.me/r/features-4.json
|
|
||||||
*/
|
|
||||||
export default function Features5Section() {
|
|
||||||
const t = useTranslations('HomePage.features5');
|
|
||||||
|
|
||||||
return (
|
|
||||||
<section className="py-16">
|
|
||||||
<div className="mx-auto max-w-6xl px-6 space-y-16">
|
|
||||||
<div className="text-center">
|
|
||||||
<h2 className="text-balance text-4xl lg:text-5xl font-semibold">
|
|
||||||
{t('title')}
|
|
||||||
</h2>
|
|
||||||
<p className="mt-4">{t('description')}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="relative mx-auto grid divide-x divide-y border *:p-8 sm:grid-cols-2 lg:grid-cols-3">
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<ZapIcon className="size-4" />
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-1.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-1.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<CpuIcon className="size-4" />
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-2.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-2.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<FingerprintIcon className="size-4" />
|
|
||||||
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-3.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-3.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<PencilIcon className="size-4" />
|
|
||||||
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-4.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-4.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<Settings2Icon className="size-4" />
|
|
||||||
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-5.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-5.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<SparklesIcon className="size-4" />
|
|
||||||
|
|
||||||
<h3 className="text-base font-medium">
|
|
||||||
{t('items.item-6.title')}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-muted-foreground mt-4">
|
|
||||||
{t('items.item-6.description')}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
}
|
|
@ -90,7 +90,7 @@ const IntegrationCard = ({
|
|||||||
const t = useTranslations('HomePage.integration');
|
const t = useTranslations('HomePage.integration');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className="p-6">
|
<Card className="p-6 bg-background hover:bg-accent dark:hover:bg-accent">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<div className="*:size-10">{children}</div>
|
<div className="*:size-10">{children}</div>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user