Merge remote-tracking branch 'origin/main' into feat/merge

This commit is contained in:
2026-06-22 19:06:19 +03:30
50 changed files with 962 additions and 215 deletions
+20 -24
View File
@@ -3,6 +3,8 @@ export const metadata = {
description:
"فیپ یک گروه متخصص در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی. ماموریت، چشم‌انداز و ارزش‌های ما.",
};
import { Button } from "@/components/ui/button";
import Link from "next/link";
export default function AboutPage() {
return (
@@ -15,7 +17,7 @@ export default function AboutPage() {
درباره ما
</h1>
<p className="text-xl leading-relaxed tracking-normal text-muted-foreground max-w-2xl mx-auto">
ما یک گروه متخصص هستیم که در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی فعالیت می‌کنیم.
ما یک گروه متخصص هستیم که در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی فعالیت می‌کنیم.
هدف ما ارائه راهکارهای هوشمند و کارآمد برای اتصال سیستم‌ها، داده‌ها و فرآیندهای کسب‌وکار است.
</p>
</div>
@@ -32,13 +34,13 @@ export default function AboutPage() {
</h2>
<div className="space-y-4 text-muted-foreground leading-relaxed tracking-normal">
<p>
فیپ یک گروه متخصص است که در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی فعالیت می‌کند.
ما با استفاده از تکنولوژی‌های پیشرفته و رویکردهای نوآورانه، به کسب‌وکارها کمک می‌کنیم تا
فیپ یک گروه متخصص است که در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی فعالیت می‌کند.
ما با استفاده از تکنولوژی‌های پیشرفته و رویکردهای نوآورانه، به کسب‌وکارها کمک می‌کنیم تا
سیستم‌های خود را به شکلی کارآمد و قابل‌اعتماد بهم متصل کنند.
</p>
<p>
ما در زمینه یکپارچه‌سازی سیستم‌ها، اتوماسیون فرآیندها، ارتباطات چندکاناله و مدیریت داده‌ها
تخصص داریم. با استفاده از روش‌های نوین و ابزارهای پیشرفته، راهکارهای سفارشی برای هر کسب‌وکار
ما در زمینه یکپارچه‌سازی سیستم‌ها، اتوماسیون فرآیندها، ارتباطات چندکاناله و مدیریت داده‌ها
تخصص داریم. با استفاده از روش‌های نوین و ابزارهای پیشرفته، راهکارهای سفارشی برای هر کسب‌وکار
طراحی و پیاده‌سازی می‌کنیم.
</p>
</div>
@@ -56,15 +58,15 @@ export default function AboutPage() {
{/* Mission & Vision */}
<section className="bg-background py-20 md:py-28">
<div className="mx-auto max-w-6xl px-6">
<div className="grid gap-12 md:grid-cols-2">
<div className="grid gap-12 md:grid-cols-2">
<div className="space-y-6 p-8 rounded-2xl border bg-muted/30 transition-all duration-300 hover:shadow-lg hover:-translate-y-1">
<div className="space-y-4">
<h2 className="text-3xl font-bold md:text-4xl leading-tight tracking-normal">
ماموریت ما
</h2>
<p className="leading-relaxed tracking-normal text-muted-foreground text-lg">
ماموریت ما این است که با استفاده از روش‌های نوین اینتگریشن، به کسب‌وکارها کمک کنیم تا
بدون پیچیدگی‌های فنی، سیستم‌های خود را بهم متصل کنند و از قدرت اتوماسیون و ارتباطات هوشمند
ماموریت ما این است که با استفاده از روش‌های نوین اینتگریشن، به کسب‌وکارها کمک کنیم تا
بدون پیچیدگی‌های فنی، سیستم‌های خود را بهم متصل کنند و از قدرت اتوماسیون و ارتباطات هوشمند
بهره‌مند شوند.
</p>
</div>
@@ -75,8 +77,8 @@ export default function AboutPage() {
چشم‌انداز ما
</h2>
<p className="leading-relaxed tracking-normal text-muted-foreground text-lg">
ما می‌خواهیم به گروه پیشرو در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی تبدیل شویم.
چشم‌انداز ما این است که هر کسب‌وکاری، از کوچک تا بزرگ، بتواند به راحتی از خدمات ما استفاده کند
ما می‌خواهیم به گروه پیشرو در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی تبدیل شویم.
چشم‌انداز ما این است که هر کسب‌وکاری، از کوچک تا بزرگ، بتواند به راحتی از خدمات ما استفاده کند
و به اهداف خود برسد.
</p>
</div>
@@ -193,8 +195,8 @@ export default function AboutPage() {
تیم ما
</h2>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
تیم فیپ متشکل از متخصصان با تجربه در حوزه‌های اینتگریشن، فناوری اطلاعات، توسعه نرم‌افزار
و مدیریت کسب‌وکار است. ما با همکاری یکدیگر و استفاده از روش‌های نوین، راهکارهای نوآورانه و
تیم فیپ متشکل از متخصصان با تجربه در حوزه‌های اینتگریشن، فناوری اطلاعات، توسعه نرم‌افزار
و مدیریت کسب‌وکار است. ما با همکاری یکدیگر و استفاده از روش‌های نوین، راهکارهای نوآورانه و
کاربردی برای چالش‌های یکپارچه‌سازی ارائه می‌دهیم.
</p>
</div>
@@ -248,18 +250,12 @@ export default function AboutPage() {
با ما تماس بگیرید تا درباره نیازهای شما صحبت کنیم و بهترین راهکار را پیشنهاد دهیم
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<a
href="/pricing"
className="inline-flex items-center justify-center rounded-lg bg-primary px-8 py-3 text-base font-medium text-white hover:bg-accent hover:text-foreground transition-colors"
>
مشاهده قیمت‌ها
</a>
<a
href="#contact"
className="inline-flex items-center justify-center rounded-lg border border-primary px-8 py-3 text-base font-medium text-primary hover:bg-accent hover:text-foreground hover:border-accent transition-colors"
>
تماس با ما
</a>
<Button asChild size="lg">
<Link href="/pricing">مشاهده قیمت‌ها</Link>
</Button>
<Button asChild size="lg" variant="outline">
<Link href="#contact">تماس با ما</Link>
</Button>
</div>
</div>
</div>
+8 -7
View File
@@ -6,7 +6,7 @@ import { getPostBySlug, getFeaturedImageUrl, getRelatedPosts } from "@/lib/wp-ap
import { formatDateShamsi } from "@/lib/format-date";
import { ChevronRight } from "lucide-react";
import type { CollapseBlockPayload, BlockquoteBlockPayload, TipBlockPayload } from "@/lib/blog-blocks";
import { parseContentHeadings, getReadingTimeMinutes } from "@/lib/blog-utils";
import { parseContentHeadings, getReadingTimeMinutes, formatAuthorName } from "@/lib/blog-utils";
import { BlogToc } from "@/components/blog-toc";
import { BlogPostMeta } from "@/components/blog-post-meta";
import { BlogCollapseSection } from "@/components/blog-collapse-section";
@@ -71,7 +71,7 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
const modifiedDate = post.modified
? formatDateShamsi(post.modified)
: null;
const authorName = post._embedded?.author?.[0]?.name ?? null;
const authorName = formatAuthorName(post._embedded?.author?.[0]?.name);
const thumbnailUrl = getFeaturedImageUrl(post, "full");
const media = post._embedded?.["wp:featuredmedia"]?.[0];
const altText = media?.alt_text || post.title?.rendered?.replace(/<[^>]*>/g, "") || "";
@@ -94,6 +94,7 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
className="object-cover"
quality={100}
priority
sizes="(max-width: 768px) 100vw, 1024px"
/>
</div>
</div>
@@ -160,14 +161,14 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
</section>
{relatedPosts.length > 0 && (
<section className="bg-muted border-t border-b">
<div className="mx-auto max-w-6xl p-4">
<h2 className="text-xl text-center mb-6 md:mb-8">
<section className="bg-background border-t pb-16 md:pb-20">
<div className="mx-auto max-w-6xl px-6 pt-10 md:pt-14">
<h2 className="text-xl md:text-2xl text-center mb-8 md:mb-10">
مقالات مرتبط
</h2>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 min-w-0">
{relatedPosts.map((p) => (
<BlogPostCard key={p.id} post={p} variant="tiny" />
<BlogPostCard key={p.id} post={p} variant="related" />
))}
</div>
</div>
+2 -2
View File
@@ -67,7 +67,7 @@ export default async function BlogPage({ searchParams }: BlogPageProps) {
return (
<>
{/* Hero + search & filters — compact */}
{/* Hero + search & filters, compact */}
<section className="bg-background pt-24 pb-6 md:pt-28 md:pb-8">
<div className="mx-auto max-w-3xl px-4 sm:px-6">
<div className="text-center space-y-5">
@@ -98,7 +98,7 @@ export default async function BlogPage({ searchParams }: BlogPageProps) {
aria-label="جستجو در مطالب"
/>
</div>
<Button type="submit" size="default" className="h-9 px-4 shrink-0">
<Button type="submit" className="shrink-0">
جستجو
</Button>
</form>
+5
View File
@@ -295,4 +295,9 @@
.wp-block-image {
@apply rounded-md overflow-hidden shadow-sm;
}
.blog-content img {
@apply w-full h-auto;
image-rendering: auto;
}
+1 -1
View File
@@ -25,7 +25,7 @@ export function BlogBlockquote({ payload }: BlogBlockquoteProps) {
{citation ? (
<footer className="mt-4 border-t border-border/60 pt-4">
<cite className="text-sm text-muted-foreground not-italic">
— {citation}
{citation}
</cite>
</footer>
) : null}
+2 -1
View File
@@ -32,7 +32,8 @@ export function BlogCard({
alt={title}
fill
className="object-cover transition-transform duration-300 group-hover:scale-105"
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
quality={100}
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 400px"
/>
{/* Category Badge */}
<div className="absolute top-4 right-4">
+54 -4
View File
@@ -4,12 +4,13 @@ import { ImageIcon, User } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { getFeaturedImageUrl, type WpPost } from "@/lib/wp-api";
import { formatDateShamsi } from "@/lib/format-date";
import { formatAuthorName } from "@/lib/blog-utils";
function stripHtml(html: string): string {
return html.replace(/<[^>]*>/g, "").trim();
}
type BlogPostCardVariant = "default" | "tiny";
type BlogPostCardVariant = "default" | "tiny" | "related";
export function BlogPostCard({
post,
@@ -20,9 +21,57 @@ export function BlogPostCard({
}) {
const excerpt = stripHtml(post.excerpt.rendered) || stripHtml(post.content.rendered).slice(0, 160);
const modifiedDate = post.modified ? formatDateShamsi(post.modified) : null;
const authorName = post._embedded?.author?.[0]?.name ?? null;
const authorName = formatAuthorName(post._embedded?.author?.[0]?.name);
const thumbnailUrl = getFeaturedImageUrl(post, "full");
if (variant === "related") {
return (
<Link href={`/blog/${encodeURIComponent(post.slug)}`} className="block h-full min-w-0">
<Card className="h-full overflow-hidden transition-all rounded-md duration-300 hover:shadow-md flex flex-col p-0 gap-0">
<CardContent className="p-3 sm:p-4 grid grid-cols-3 gap-3 sm:gap-4 min-w-0">
{thumbnailUrl ? (
<div className="relative rounded-md aspect-[4/3] w-full overflow-hidden bg-muted shrink-0 col-span-1 min-w-0">
<Image
src={thumbnailUrl}
alt=""
fill
className="object-cover"
quality={100}
sizes="(max-width: 640px) 33vw, (max-width: 1024px) 20vw, 200px"
/>
</div>
) : (
<div
className="relative rounded-md flex aspect-[4/3] w-full items-center justify-center overflow-hidden bg-muted shrink-0 col-span-1"
aria-hidden
>
<ImageIcon className="size-10 text-muted-foreground/50" />
</div>
)}
<div className="col-span-2 min-w-0 flex flex-col justify-center">
<h4 className="text-base font-semibold leading-snug line-clamp-3">
{post.title.rendered}
</h4>
<div className="flex flex-wrap w-full items-center gap-x-4 gap-y-1 text-sm text-muted-foreground bg-muted inline-flex p-1.5 mt-3 rounded-sm">
{authorName && (
<span className="inline-flex flex-1 items-center gap-1.5 min-w-0">
<User className="size-4 shrink-0" aria-hidden />
<span className="truncate">{authorName}</span>
</span>
)}
{modifiedDate && (
<time dateTime={post.modified} className="shrink-0">
{modifiedDate}
</time>
)}
</div>
</div>
</CardContent>
</Card>
</Link>
);
}
if (variant === "tiny") {
return (
<Link href={`/blog/${encodeURIComponent(post.slug)}`} className="block h-full">
@@ -35,7 +84,8 @@ export function BlogPostCard({
alt=""
fill
className="object-cover"
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
quality={100}
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 400px"
/>
</div>
) : (
@@ -82,7 +132,7 @@ export function BlogPostCard({
className="object-cover"
quality={100}
priority
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 350px"
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 400px"
/>
</div>
) : (
-2
View File
@@ -140,7 +140,6 @@ export function BlogPostMeta({
<Button
variant="ghost"
size="icon-sm"
className="size-8 text-muted-foreground hover:text-foreground"
onClick={copyLink}
aria-label="کپی لینک"
>
@@ -160,7 +159,6 @@ export function BlogPostMeta({
<Button
variant="ghost"
size="icon-sm"
className="size-8 text-muted-foreground hover:text-foreground"
onClick={handleShare}
aria-label="اشتراک‌گذاری"
>
+1 -1
View File
@@ -20,7 +20,7 @@ export function BlogPullquote({ payload }: BlogPullquoteProps) {
{citation ? (
<footer className="mt-4">
<cite className="text-sm text-muted-foreground not-italic">
— {citation}
{citation}
</cite>
</footer>
) : null}
+4 -4
View File
@@ -24,21 +24,21 @@ export default function ContentSection() {
</div>
<div className="relative space-y-4">
<p className="text-muted-foreground leading-relaxed tracking-normal">
<p className="text-muted-foreground leading-relaxed tracking-normal text-justify sm:text-start">
فیپ یک گروه متخصص است که در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی فعالیت می‌کند.{" "}
<span className="text-accent-foreground font-bold">
<span className="text-primary font-bold">
ما با استفاده از تکنولوژی‌های پیشرفته و رویکردهای نوآورانه
</span>{" "}
به کسب‌وکارها کمک می‌کنیم تا سیستم‌های خود را به شکلی کارآمد و قابل‌اعتماد بهم متصل کنند.
</p>
<p className="text-muted-foreground leading-relaxed tracking-normal">
<p className="text-muted-foreground leading-relaxed tracking-normal text-justify sm:text-start">
ما در زمینه یکپارچه‌سازی سیستم‌ها، اتوماسیون فرآیندها، ارتباطات چندکاناله و مدیریت داده‌ها تخصص داریم. با استفاده از روش‌های نوین و ابزارهای پیشرفته، راهکارهای سفارشی برای هر کسب‌وکار طراحی و پیاده‌سازی می‌کنیم که به آن‌ها امکان می‌دهد تا از قدرت اتوماسیون و ارتباطات هوشمند بهره‌مند شوند.
</p>
<div className="pt-6">
<blockquote className="border-s-4 border-primary/30 ps-4">
<p className="leading-relaxed tracking-normal text-foreground">
ماموریت ما این است که با استفاده از روش‌های نوین اینتگریشن، به کسب‌وکارها کمک کنیم تا
ماموریت ما این است که با استفاده از روش‌های نوین اینتگریشن، به کسب‌وکارها کمک کنیم تا
بدون پیچیدگی‌های فنی، سیستم‌های خود را بهم متصل کنند و به اهداف خود برسند.
</p>
+56 -34
View File
@@ -20,22 +20,29 @@ export default function Features() {
type ImageKey = "item-1" | "item-2" | "item-3" | "item-4";
const [activeItem, setActiveItem] = useState<ImageKey>("item-1");
const sectionImage = (filename: string) =>
`/assets/main-pic/4section/${encodeURIComponent(filename)}`;
const images = {
"item-1": {
image: "/assets/main-pic/4section/Systems Integration.jpg",
alt: "System integration",
image: sectionImage("Systems Integration.jpg"),
imageDark: sectionImage("Systems Integration-dark.jpg"),
alt: "یکپارچه‌سازی سیستم‌ها",
},
"item-2": {
image: "/assets/main-pic/4section/Powerful Management panels.jpg",
alt: "Management panels",
image: sectionImage("Powerful Management panels.jpg"),
imageDark: sectionImage("Powerful Management panels-dark.jpg"),
alt: "پنل‌های مدیریتی قدرتمند",
},
"item-3": {
image: "/assets/main-pic/4section/Interaction with Social Networks.jpg",
alt: "Social media integration",
image: sectionImage("Interaction with Social Networks.jpg"),
imageDark: sectionImage("Interaction with Social Networks_dark.jpg"),
alt: "تعامل با شبکه‌های اجتماعی",
},
"item-4": {
image: "/assets/main-pic/4section/Process Automation.jpg",
alt: "Process automation",
image: sectionImage("Process Automation.jpg"),
imageDark: sectionImage("Process Automation-dark.jpg"),
alt: "اتوماسیون فرآیندها",
},
};
@@ -113,33 +120,48 @@ export default function Features() {
</AccordionItem>
</Accordion>
<div className="bg-background relative flex overflow-hidden rounded-3xl border p-0 m-0">
<div className="w-15 absolute inset-0 right-0 ml-auto border-l bg-[repeating-linear-gradient(-45deg,var(--color-border),var(--color-border)_1px,transparent_1px,transparent_8px)]"></div>
<div className="aspect-76/59 bg-background relative w-full rounded-3xl m-0 p-0">
<AnimatePresence mode="wait">
<motion.div
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-3xl m-0 p-0"
>
<Image
src={images[activeItem].image}
className="size-full object-cover dark:mix-blend-lighten"
alt={images[activeItem].alt}
width={1207}
height={929}
/>
</motion.div>
</AnimatePresence>
<div className="relative rounded-3xl bg-linear-to-br from-primary/50 via-accent/40 to-secondary/50 p-px shadow-lg shadow-primary/10">
<div className="bg-background relative flex overflow-hidden rounded-[calc(1.5rem-1px)] m-0 p-0">
<div className="w-15 absolute inset-0 right-0 ml-auto border-l border-primary/15 bg-[repeating-linear-gradient(-45deg,color-mix(in_oklab,var(--color-primary)_25%,var(--color-border)),color-mix(in_oklab,var(--color-primary)_25%,var(--color-border))_1px,transparent_1px,transparent_8px)]"></div>
<div className="aspect-76/59 bg-background relative w-full rounded-[calc(1.5rem-1px)] m-0 p-0">
<AnimatePresence mode="wait">
<motion.div
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-[calc(1.5rem-1px)] m-0 p-0"
>
<Image
src={images[activeItem].image}
className="size-full object-cover dark:hidden"
alt={images[activeItem].alt}
width={1207}
height={929}
quality={100}
sizes="(max-width: 768px) 100vw, 50vw"
/>
<Image
src={images[activeItem].imageDark}
className="hidden size-full object-cover dark:block"
alt={images[activeItem].alt}
width={1207}
height={929}
quality={100}
sizes="(max-width: 768px) 100vw, 50vw"
/>
</motion.div>
</AnimatePresence>
</div>
<BorderBeam
duration={6}
size={200}
borderWidth={1}
colorFrom="#FCC61D"
colorTo="#01796F"
/>
</div>
<BorderBeam
duration={6}
size={200}
className="from-transparent via-yellow-700 to-transparent dark:via-white/50"
/>
</div>
</div>
</div>
+68 -63
View File
@@ -72,9 +72,11 @@ export default function HeroSection() {
<Image
src="/assets/main-pic/main-pic.jpg"
alt="background"
className="hidden size-full dark:block"
width="1150"
height="613"
className="hidden size-full object-cover dark:block"
width={1150}
height={613}
quality={100}
sizes="100vw"
/>
</AnimatedGroup>
@@ -121,9 +123,7 @@ export default function HeroSection() {
as="p"
className="mx-auto mt-8 max-w-2xl text-balance text-base md:text-lg leading-relaxed tracking-normal"
>
داده‌ها، کاربران و فرآیندهای شما را از هر پلتفرمی (وب، CRM، تلگرام، سرویس‌های سفارشی) به‌صورت سریع، دقیق و امن یکپارچه کنید.
فرآیندهای کسب‌وکاری شما با سرعت به هم متصل می‌شوند.
با ابزارهای یکپارچه‌سازی، اتوماسیون و ارتباطات ما، داده‌ها، کاربران و فرآیندهای کسب‌وکارتان را از هر سیستم یا پلتفرمی، از وب‌سایت و CRM تا تلگرام و سرویس‌های سفارشی، دقیق، سریع و قابل اعتماد به هم متصل کنید.
</TextEffect>
<AnimatedGroup
@@ -144,11 +144,7 @@ export default function HeroSection() {
key={1}
className="bg-foreground/10 rounded-[calc(var(--radius-xl)+0.125rem)] border p-0.5"
>
<Button
asChild
size="lg"
className="rounded-xl px-5 text-base"
>
<Button asChild size="lg">
<Link href="#link">
<span className="text-nowrap">مشاهده راهکارها</span>
<ChevronDown />
@@ -172,78 +168,87 @@ export default function HeroSection() {
...transitionVariants,
}}
>
<div className="relative mt-8 overflow-hidden px-2 sm:mt-12 md:mt-20 p-2">
<div className="ring-background bg-background relative max-w-5xl mx-auto overflow-hidden rounded-2xl border ring-1 aspect-[3/2]">
<Image
src="/assets/main-pic/Untitled-1 copy-min.jpg"
alt="یکپارچه‌سازی سیستم‌ها و شبکه دیجیتال"
fill
className="object-cover rounded-2xl inline-block my-0"
quality={100}
priority
/>
<div className="relative mt-8 overflow-visible px-2 sm:mt-12 md:mt-20 p-2">
<div className="relative max-w-4xl mx-auto flex items-center justify-center">
<div className="relative rounded-2xl overflow-hidden">
{/* Glow effect */}
<div className="absolute inset-0 rounded-2xl bg-gradient-to-r from-blue-500/20 via-purple-500/20 to-pink-500/20 blur-3xl -z-10 scale-110 animate-pulse" />
<div className="absolute inset-0 rounded-2xl bg-gradient-to-r from-blue-400/30 via-purple-400/30 to-pink-400/30 blur-2xl -z-10 scale-105" />
<div className="relative bg-background rounded-2xl border ring-1 ring-border/50 shadow-2xl shadow-blue-500/10 dark:shadow-blue-500/20">
<Image
src="/assets/main-pic/1.jpg"
alt="یکپارچه‌سازی سیستم‌ها و شبکه دیجیتال"
width={1920}
height={1280}
className="object-contain rounded-2xl w-full h-auto max-h-[600px] md:max-h-[700px] dark:hidden"
quality={100}
priority
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 90vw, 1200px"
/>
<Image
src="/assets/main-pic/1dark.jpg"
alt="یکپارچه‌سازی سیستم‌ها و شبکه دیجیتال"
width={1920}
height={1280}
className="hidden object-contain rounded-2xl w-full h-auto max-h-[600px] md:max-h-[700px] dark:block"
quality={100}
priority
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 90vw, 1200px"
/>
</div>
</div>
</div>
</div>
</AnimatedGroup>
</div>
</section>
<section className="bg-background pb-16 pt-16 md:pb-32">
<div className="group relative m-auto max-w-5xl px-6">
<div className="absolute inset-0 z-10 flex scale-95 items-center justify-center opacity-0 duration-500 group-hover:scale-100 group-hover:opacity-100">
<Link
href="/"
className="block text-sm duration-150 hover:text-accent transition-colors"
>
<span> اتصال به سایر سیستم ها </span>
<ChevronRight className="ml-1 inline-block size-3" />
</Link>
<div className="m-auto max-w-5xl px-6">
<div className="text-center">
<p className="text-sm font-medium text-muted-foreground">
یکپارچه با ابزارهای محبوب
</p>
<h2 className="mt-2 text-lg font-semibold md:text-xl">
اتصال به سایر سیستم‌ها
</h2>
</div>
<div className="group-hover:blur-xs mx-auto mt-12 grid max-w-4xl grid-cols-4 gap-x-12 gap-y-8 transition-all duration-500 group-hover:opacity-50 sm:gap-x-16 sm:gap-y-14">
<LogoItem
icon="logos:telegram"
alt="Telegram Logo"
size="md"
className="translate-x-1"
/>
<div className="mx-auto mt-10 flex max-w-3xl flex-wrap items-center justify-center gap-4 sm:gap-5">
<LogoItem icon="logos:telegram" alt="Telegram Logo" size="md" />
<LogoItem
icon="simple-icons:n8n"
alt="n8n Logo"
size="lg"
className="translate-x-4 "
iconClassName="text-black"
/>
<LogoItem
icon="skill-icons:wordpress"
alt="WordPress Logo"
size="md"
className="-translate-x-2"
/>
<LogoItem icon="logos:google-icon" alt="Google Logo" size="md" />
<LogoItem
icon="logos:whatsapp-icon"
alt="WhatsApp Logo"
size="md"
/>
<LogoItem
icon="logos:google-icon"
alt="Google Logo"
icon="logos:microsoft-windows-icon"
alt="Microsoft Windows Logo"
size="md"
className="translate-x-5"
/>
<div className="col-span-4 flex justify-center gap-x-12 sm:gap-x-40">
<LogoItem
icon="logos:whatsapp-icon"
alt="WhatsApp Logo"
size="md"
className="translate-x-2"
/>
<LogoItem
icon="logos:microsoft-windows-icon"
alt="Microsoft Windows Logo"
size="md"
className="translate-x-2"
/>
<LogoItem
icon="skill-icons:github-dark"
alt="github Logo"
size="md"
className="translate-x-4"
/>
</div>
<LogoItem icon="logos:github-icon" alt="GitHub Logo" size="md" />
</div>
<div className="mt-8 text-center">
<Link
href="/"
className="inline-flex items-center text-sm text-muted-foreground transition-colors hover:text-accent"
>
<span>مشاهده همه یکپارچه‌سازی‌ها</span>
<ChevronRight className="ml-1 inline-block size-3" />
</Link>
</div>
</div>
</section>
+2 -9
View File
@@ -61,10 +61,7 @@ export function LoginForm({
/>
</Field>
<Field>
<Button
type="submit"
className="w-full h-10 sm:h-11 text-sm sm:text-base"
>
<Button type="submit" size="lg" className="w-full">
ورود
</Button>
</Field>
@@ -72,11 +69,7 @@ export function LoginForm({
یا ادامه با
</FieldSeparator>
<Field className="">
<Button
variant="outline"
type="button"
className="w-full h-10 sm:h-11 text-sm sm:text-base"
>
<Button variant="outline" type="button" size="lg" className="w-full">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
+3 -3
View File
@@ -18,7 +18,7 @@ export default function Pricing() {
</p>
<p className="text-lg leading-relaxed tracking-normal text-foreground font-medium">
راه‌حل‌های ما از <span className="text-primary font-bold">۲ میلیون تومان</span> شروع می‌شوند و بر اساس نیازهای دقیق شما محاسبه می‌گردند.
</p>
</p>
</div>
</div>
</div>
@@ -174,10 +174,10 @@ export default function Pricing() {
ما آماده‌ایم تا بر اساس نیازهای شما بهترین پیشنهاد را ارائه دهیم.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button asChild size="lg" className="text-base px-8 py-6">
<Button asChild size="lg">
<Link href="#chat">شروع گفتگو با تیم</Link>
</Button>
<Button asChild size="lg" variant="outline" className="text-base px-8 py-6">
<Button asChild size="lg" variant="outline">
<Link href="/about">درباره ما</Link>
</Button>
</div>
+2 -2
View File
@@ -41,11 +41,11 @@ export function ScrollToTop({ className }: { className?: string }) {
)}
>
<Button
size="icon"
size="icon-lg"
variant="outline"
onClick={scrollToTop}
aria-label="برگشت به بالا"
className="size-10 rounded-md shadow-md"
className="shadow-md"
>
<ChevronUp className="size-5" />
</Button>
+2 -4
View File
@@ -18,8 +18,7 @@ export function ThemeToggle() {
return (
<Button
variant="ghost"
size="sm"
className="size-9 rounded-lg"
size="icon"
aria-label="Toggle theme"
>
<Sun className="size-4" />
@@ -30,9 +29,8 @@ export function ThemeToggle() {
return (
<Button
variant="ghost"
size="sm"
size="icon"
onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
className="size-9 rounded-lg transition-all duration-300 hover:bg-muted"
aria-label="Toggle theme"
>
<Sun className="size-4 rotate-0 scale-100 transition-all duration-300 dark:-rotate-90 dark:scale-0" />
+1 -1
View File
@@ -57,7 +57,7 @@ export const BorderBeam = ({
delay = 0,
duration = 6,
colorFrom = "#FCC61D",
colorTo = "#0046FF",
colorTo = "#01796F",
transition,
style,
reverse = false,
+12 -10
View File
@@ -5,25 +5,27 @@ import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "@/lib/utils"
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground transition-colors",
default:
"bg-primary text-primary-foreground hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground",
destructive:
"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-[#FCC61D] dark:hover:text-foreground transition-colors",
"border border-primary text-primary bg-transparent hover:bg-accent hover:text-foreground hover:border-accent dark:bg-input/30 dark:border-input dark:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground",
secondary:
"bg-secondary text-secondary-foreground hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground transition-colors",
"bg-secondary text-secondary-foreground hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground",
ghost:
"hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground transition-colors",
link: "text-primary underline-offset-4 hover:text-accent hover:underline dark:hover:text-[#FCC61D] transition-colors",
"hover:bg-accent hover:text-foreground dark:hover:bg-[#FCC61D] dark:hover:text-foreground",
link:
"text-primary underline-offset-4 hover:text-accent hover:underline dark:hover:text-[#FCC61D]",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
default: "h-9 px-4 text-sm has-[>svg]:px-3",
sm: "h-8 gap-1.5 px-3 text-sm has-[>svg]:px-2.5",
lg: "h-11 px-8 text-base has-[>svg]:px-6",
icon: "size-9",
"icon-sm": "size-8",
"icon-lg": "size-10",
@@ -51,7 +53,7 @@ function Button({
return (
<Comp
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
className={cn(buttonVariants({ variant, size }), className)}
{...props}
/>
)
+31 -13
View File
@@ -6,26 +6,44 @@ interface LogoItemProps {
alt: string;
size?: "sm" | "md" | "lg";
className?: string;
iconClassName?: string;
}
const sizeMap = {
sm: "h-8",
md: "h-10",
lg: "h-12",
const iconSizeMap = {
sm: "size-6",
md: "size-7",
lg: "size-8",
};
export function LogoItem({ icon, alt, size = "md", className }: LogoItemProps) {
const tileSizeMap = {
sm: "size-12",
md: "size-14",
lg: "size-16",
};
export function LogoItem({
icon,
alt,
size = "md",
className,
iconClassName,
}: LogoItemProps) {
return (
<div className={cn("flex", className)}>
<Icon
icon={icon}
<div className={cn("flex items-center justify-center", className)}>
<div
className={cn(
"mx-auto w-fit dark:invert",
sizeMap[size]
"flex items-center justify-center rounded-2xl border border-border/50 bg-white shadow-sm transition-all duration-300",
"hover:-translate-y-1 hover:shadow-md",
"dark:border-white/10 dark:bg-white/95 dark:shadow-lg dark:shadow-black/25",
tileSizeMap[size]
)}
aria-label={alt}
/>
>
<Icon
icon={icon}
className={cn("shrink-0", iconSizeMap[size], iconClassName)}
aria-label={alt}
/>
</div>
</div>
);
}
+204 -5
View File
@@ -34,7 +34,7 @@ export interface TipBlockPayload {
content: string;
}
/** Payload بلاک code — بعداً پیاده‌سازی می‌شود. */
/** Payload بلاک code؛ بعداً پیاده‌سازی می‌شود. */
// export interface CodeBlockPayload { ... }
/** یونیون همهٔ payloadها برای تایپ‌امن رندر. */
@@ -122,6 +122,195 @@ function extractAccordionPayload(
return { title: "", items };
}
const FAQ_HEADING_RE = /س[وؤ]الات\s*متداول|^faq$/i;
function isFaqHeading(text: string): boolean {
return FAQ_HEADING_RE.test(text.replace(/<[^>]*>/g, "").trim());
}
function isDescendantOfExcluded(el: Element, excluded: Set<Element>): boolean {
let parent = el.parent;
while (parent && isElement(parent)) {
if (excluded.has(parent)) return true;
parent = parent.parent;
}
return false;
}
function nextElementSibling(node: unknown): Element | null {
let next = (node as { next?: unknown })?.next;
while (next) {
if (isElement(next)) return next;
next = (next as { next?: unknown }).next;
}
return null;
}
function collectH3QuestionPairs(
$: cheerio.CheerioAPI,
$container: cheerio.Cheerio<Element>,
items: { question: string; answer: string }[]
): void {
$container.find("> h3").each((_: number, h3: Element) => {
const question = $(h3).text().trim();
const answers: string[] = [];
let next = nextElementSibling(h3);
while (next) {
const tag = next.tagName?.toLowerCase();
if (tag === "h2" || tag === "h3") break;
if (tag === "p") {
const html = $(next).html()?.trim();
if (html) answers.push(html);
next = nextElementSibling(next);
continue;
}
break;
}
const answer = answers.join("");
if (question || answer) items.push({ question, answer });
});
}
/**
* استخراج سوالات متداول از گروه alignwide وردپرس (چیدمان ستونی h3 + p).
*/
function extractFaqGroupPayload(
$: cheerio.CheerioAPI,
el: Element
): CollapseBlockPayload | null {
const $el = $(el);
const $h2 = $el.children("h2").first();
if (!$h2.length || !isFaqHeading($h2.text())) return null;
const title = $h2.text().trim();
const items: { question: string; answer: string }[] = [];
$el.find(".wp-block-column").each((_: number, col: Element) => {
const $col = $(col);
const question = $col.find("h3").first().text().trim();
const $p = $col.find("p").first();
const answer = ($p.html() ?? "").trim();
if (question || answer) items.push({ question, answer });
});
if (!items.length) collectH3QuestionPairs($, $el, items);
return items.length ? { title, items } : null;
}
type FaqBlockEntry = {
el: Element;
blockType: "collapse";
blockId: number;
payload: CollapseBlockPayload;
/** برای FAQهای بدون wrapper؛ همهٔ نودهای h2 + h3 + p حذف می‌شوند. */
removeNodes?: Element[];
};
/**
* کشف بخش‌های «سوالات متداول» که به‌صورت h2 + جفت‌های h3/p در جریان محتوا آمده‌اند.
*/
function discoverStandaloneFaqSections(
$: cheerio.CheerioAPI,
excluded: Set<Element>
): FaqBlockEntry[] {
const results: FaqBlockEntry[] = [];
$("h2")
.toArray()
.filter(isElement)
.forEach((h2El) => {
if (excluded.has(h2El) || isDescendantOfExcluded(h2El, excluded)) return;
if (!isFaqHeading($(h2El).text())) return;
if ($(h2El).closest("div.wp-block-group.alignwide").length) return;
const title = $(h2El).text().trim();
const items: { question: string; answer: string }[] = [];
const removeNodes: Element[] = [h2El];
let next = nextElementSibling(h2El);
while (next) {
const tag = next.tagName?.toLowerCase();
if (tag === "h2") break;
if (tag === "h3") {
const question = $(next).text().trim();
removeNodes.push(next);
const answers: string[] = [];
let after = nextElementSibling(next);
while (after) {
const afterTag = after.tagName?.toLowerCase();
if (afterTag === "h2" || afterTag === "h3") break;
if (afterTag === "p") {
const html = $(after).html()?.trim();
removeNodes.push(after);
if (html) answers.push(html);
after = nextElementSibling(after);
continue;
}
break;
}
if (question || answers.length) {
items.push({ question, answer: answers.join("") });
}
next = nextElementSibling(removeNodes[removeNodes.length - 1]);
continue;
}
if (tag === "p" && !$(next).text().trim()) {
removeNodes.push(next);
next = nextElementSibling(next);
continue;
}
break;
}
if (items.length) {
results.push({
el: h2El,
blockType: "collapse",
blockId: -1,
payload: { title, items },
removeNodes,
});
}
});
return results;
}
function discoverFaqCollapseBlocks(
$: cheerio.CheerioAPI,
excluded: Set<Element>,
blocksByType: Record<string, BlockPayload[]>
): FaqBlockEntry[] {
const faqEntries: FaqBlockEntry[] = [];
$("div.wp-block-group.alignwide")
.toArray()
.filter(isElement)
.forEach((el) => {
if (excluded.has(el) || isDescendantOfExcluded(el, excluded)) return;
const payload = extractFaqGroupPayload($, el);
if (!payload) return;
const blockId = blocksByType.collapse.length;
blocksByType.collapse.push(payload);
faqEntries.push({ el, blockType: "collapse", blockId, payload });
excluded.add(el);
});
for (const entry of discoverStandaloneFaqSections($, excluded)) {
const blockId = blocksByType.collapse.length;
blocksByType.collapse.push(entry.payload);
faqEntries.push({ ...entry, blockId });
excluded.add(entry.el);
for (const node of entry.removeNodes ?? []) excluded.add(node);
}
return faqEntries;
}
function extractBlockquotePayload(
$: cheerio.CheerioAPI,
el: Element
@@ -236,6 +425,7 @@ export function discoverBlocks(html: string): DiscoveredContent {
blockType: BlockType;
blockId: number;
payload: BlockPayload;
removeNodes?: Element[];
};
const entries: BlockEntry[] = [];
const blocksByType: Record<string, BlockPayload[]> = {
@@ -261,15 +451,24 @@ export function discoverBlocks(html: string): DiscoveredContent {
}
}
const excluded = new Set(entries.map((entry) => entry.el));
entries.push(
...discoverFaqCollapseBlocks($, excluded, blocksByType)
);
// مرتب‌سازی بر اساس ترتیب در سند (از آخر به اول جایگزین می‌کنیم تا ایندکس‌ها جابجا نشوند)
entries.sort((a, b) => orderMap.get(a.el)! - orderMap.get(b.el)!);
// جایگزینی با placeholder از آخر به اول
for (let i = entries.length - 1; i >= 0; i--) {
const { el, blockType, blockId } = entries[i];
$(el).replaceWith(
`<div data-blog-block-type="${blockType}" data-blog-block-id="${blockId}"></div>`
);
const { el, blockType, blockId, removeNodes } = entries[i];
const placeholder = `<div data-blog-block-type="${blockType}" data-blog-block-id="${blockId}"></div>`;
if (removeNodes?.length) {
$(el).before(placeholder);
for (const node of removeNodes) $(node).remove();
} else {
$(el).replaceWith(placeholder);
}
}
const htmlWithPlaceholders = $.html() ?? html;
+30 -1
View File
@@ -3,9 +3,21 @@ import {
mergeHeadingIdsIntoContentSegments,
type ContentSegment,
} from "@/lib/blog-blocks";
import { getFullSizeWpImageUrl } from "@/lib/wp-api";
export type { ContentSegment } from "@/lib/blog-blocks";
const AUTHOR_NAME_OVERRIDES: Record<string, string> = {
adm: "احمدرضا بدیعی",
};
/** Maps WordPress author display names to site-facing labels. */
export function formatAuthorName(name: string | null | undefined): string | null {
if (!name?.trim()) return null;
const normalized = name.trim().toLowerCase();
return AUTHOR_NAME_OVERRIDES[normalized] ?? name.trim();
}
/**
* Creates a URL-safe slug from heading text (strip HTML, normalize, Persian-friendly).
*/
@@ -43,7 +55,9 @@ export function parseContentHeadings(html: string): {
toc: TocItem[];
segments: ContentSegment[];
} {
const { htmlWithPlaceholders, segments: rawSegments } = discoverBlocks(html);
const { htmlWithPlaceholders, segments: rawSegments } = discoverBlocks(
enhanceContentImages(html)
);
usedIds.clear();
const toc: TocItem[] = [];
@@ -94,3 +108,18 @@ export function getReadingTimeMinutes(html: string): number {
return Math.max(1, Math.ceil(wordCount / WPM));
}
/** Use full-size WordPress uploads and drop responsive srcset that picks smaller variants. */
export function enhanceContentImages(html: string): string {
return html.replace(/<img\b([^>]*)>/gi, (tag, attrs: string) => {
let next = attrs
.replace(/\s+srcset=(["'])[^"']*\1/gi, "")
.replace(/\s+sizes=(["'])[^"']*\1/gi, "")
.replace(/\s+src=(["'])([^"']+)\1/gi, (_m, quote: string, src: string) => {
return ` src=${quote}${getFullSizeWpImageUrl(src)}${quote}`;
});
if (!/\bloading=/i.test(next)) next += ' loading="lazy"';
if (!/\bdecoding=/i.test(next)) next += ' decoding="async"';
return `<img${next}>`;
});
}
+8 -2
View File
@@ -44,16 +44,22 @@ export interface WpPost {
};
}
/** Returns thumbnail URL for list/card (medium) or full for single post. */
/** WordPress scaled filenames: photo-1024x768.jpg → photo.jpg */
export function getFullSizeWpImageUrl(url: string): string {
return url.replace(/-\d+x\d+(?=\.(jpe?g|png|gif|webp|avif)(\?|$))/i, "");
}
/** Returns thumbnail URL for list/card (medium) or full original for single post. */
export function getFeaturedImageUrl(
post: WpPost,
size: "medium" | "medium_large" | "full" = "medium"
): string | null {
const media = post._embedded?.["wp:featuredmedia"]?.[0];
if (!media?.source_url) return null;
if (size === "full") return media.source_url;
const sizes = media.media_details?.sizes;
if (sizes?.[size]?.source_url) return sizes[size].source_url;
if (size !== "full" && sizes?.medium?.source_url) return sizes.medium.source_url;
if (sizes?.medium?.source_url) return sizes.medium.source_url;
return media.source_url;
}
+2
View File
@@ -6,6 +6,8 @@ const nextConfig: NextConfig = {
globalNotFound: true,
},
images: {
qualities: [100, 75],
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
remotePatterns: [
{
protocol: "https",
+252 -3
View File
@@ -37,11 +37,13 @@
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"cheerio": "^1.0.0",
"cheerio": "^1.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
"date-fns-jalali": "^4.1.0-0",
"date-fns-jalali": "^4.1.0-0",
"embla-carousel-react": "^8.6.0",
"input-otp": "^1.4.2",
"lucide-react": "^0.555.0",
@@ -64,6 +66,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"baseline-browser-mapping": "^2.9.19",
"eslint": "^9",
"eslint-config-next": "16.0.6",
"tailwindcss": "^4",
@@ -4232,9 +4235,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.8.32",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz",
"integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==",
"version": "2.9.19",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
"integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -4247,6 +4250,12 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
},
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -4564,6 +4573,34 @@
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-select": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
"integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0",
"css-what": "^6.1.0",
"domhandler": "^5.0.2",
"domutils": "^3.0.1",
"nth-check": "^2.0.1"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-what": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
"integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">= 6"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
@@ -4929,6 +4966,61 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"entities": "^4.2.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"license": "BSD-2-Clause"
},
"node_modules/domhandler": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
"license": "BSD-2-Clause",
"dependencies": {
"domelementtype": "^2.3.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
"integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"license": "BSD-2-Clause",
"dependencies": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
"domhandler": "^5.0.3"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -4999,6 +5091,19 @@
"url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
}
},
"node_modules/encoding-sniffer": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
"integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
"license": "MIT",
"dependencies": {
"iconv-lite": "^0.6.3",
"whatwg-encoding": "^3.1.1"
},
"funding": {
"url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
}
},
"node_modules/enhanced-resolve": {
"version": "5.18.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
@@ -5025,6 +5130,18 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es-abstract": {
"version": "1.24.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
@@ -6196,6 +6313,49 @@
"node": ">=0.10.0"
}
},
"node_modules/htmlparser2": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
"integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.3",
"domutils": "^3.2.2",
"entities": "^7.0.1"
}
},
"node_modules/htmlparser2/node_modules/entities": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
"integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -7436,6 +7596,18 @@
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
},
"funding": {
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -7688,6 +7860,55 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/parse5": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
"integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
"license": "MIT",
"dependencies": {
"entities": "^6.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5-htmlparser2-tree-adapter": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
"integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
"license": "MIT",
"dependencies": {
"domhandler": "^5.0.3",
"parse5": "^7.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5-parser-stream": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
"integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
"license": "MIT",
"dependencies": {
"parse5": "^7.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5/node_modules/entities": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -8218,6 +8439,12 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
@@ -9167,6 +9394,28 @@
"node": ">=18"
}
},
"node_modules/whatwg-encoding": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
"integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
"deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
"license": "MIT",
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
"node": ">=18"
}
},
"node_modules/whatwg-mimetype": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
"integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+2 -1
View File
@@ -9,7 +9,6 @@
"lint": "eslint"
},
"dependencies": {
"cheerio": "^1.0.0",
"@hookform/resolvers": "^5.2.2",
"@iconify/react": "^6.0.2",
"@radix-ui/react-accordion": "^1.2.12",
@@ -38,6 +37,7 @@
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"cheerio": "^1.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
@@ -65,6 +65,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"baseline-browser-mapping": "^2.9.19",
"eslint": "^9",
"eslint-config-next": "16.0.6",
"tailwindcss": "^4",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

-7
View File
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 150 150">
<!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) -->
<path d="M119.76,40.76c14.06,5.02,20.23,21.27,16.93,34.39-2.4,9.52-11.4,19.28-22.36,20.11-2.99.22-6.4-.92-8.35,1.7-1.4,1.89-.67,5.33-.85,7.57-.82,10.41-10.8,19.56-21.99,14.3-8.84-4.16-8.66-12.16-10.4-19.92-1.91-8.48-5.87-19.14-15.59-22.18-2.61-.82-6.37-1.39-9.27-.79-.5.1-3.17.99-4.02,1.3-9.23,3.29-15.03,14.73-15.7,23.38-.19,2.4-.38,8.5.01,10.69.49,2.72,4.59,3.72,5.78.66,1.04-2.69.2-8.01.44-11.09.64-8.23,6.38-17.59,15.99-18.41,1.73-.15,3.48-.11,5.58-.29.32-.03.89-.02,1.51-.72.21-.24,2.96,1.71,3.39,2.05.12.1,1.23,1.09,1.28,1.15.52.59-.3,1.28-.76,1.67-3.35,2.8-5.51,2.29-9.58,2.65-5.9.54-9.62,4.59-10.82,9.86-1.28,5.64,1.22,14.4-3.22,18.71-5.81,5.63-14.96,1.85-15.79-5.49-1.16-10.3.66-21.78,6.77-30.52,8.81-12.6,26.31-16.97,38.92-6.16,5.68,4.87,9,13.22,10.74,20.12,1.21,4.78,1.23,12.99,5.45,16.2,1.55,1.18,3.89,2.1,5.87,2.11,2.47.02,5.82-1.92,7.17-3.85,4.21-6-.55-13.27,5.69-18.77,4.41-3.89,9.58-1.44,14.5-3.02,19.57-6.27,18.54-36.54-1.41-41.74-1.88-.49-17.19-.55-18.8,0s-4.48,2.35-5.75,3.62c-8.09,8.1-2.66,24-4.4,34.08-.2,1.14-1.68,3.64-2.16,5.06-.76,2.2-1.05,4.41-1.57,6.65-.06.25-.1.78-.49.72l-1.99-8.48c.6-9.62-.76-20,0-29.53.68-8.48,8.18-18.14,17.7-18.92,4.86-.4,17.23-.42,21.56,1.13Z"/>
<path d="M23.51,55.93c0-.07,0-.14.01-.21,1.01-8.29,8.79-17.27,18-18.02s19.66.15,29.09.24c2.16.02,4.28.71,5.79,2.14,5.11,4.83,3.72,14.33-3.67,16.98-.16.06-.33.09-.5.11-9.03.75-19.04-.67-27.93.08-3.38.29-2.33,4.31-2.22,6.91.03.66-.44,1.25-1.12,1.47-.47.15-1,.39-1.27.54-.72.38-1.89,1.09-2.7,1.59q-.5.3-1.3.74c1.11-6.07-2.25-15.41,6.43-17.45.14-.03.29-.05.44-.05h27.7c.23,0,.47-.06.68-.14.47-.19.68-.34,1.08-.67,1.21-1,1.64-2.9.96-4.22s-1.88-1.91-3.46-2.03c-6.9-.54-18.8-.44-25.76.02-16.22,1.07-14.22,17.86-14.03,28.9,0,.31-.09.61-.28.87l-2.72,3.77s-.06.09-.09.14h0c-.8,1.41-3.12.89-3.12-.71v-20.98Z"/>
<path d="M92.89,58.27c.36-2.47,2.89-5.76,5.64-6.28,2.58-.49,11.71-.35,14.6-.13,7.15.57,12.08,8.33,12.04,14.51-.04,6.93-3.74,12.3-10.84,14.25-.23.06-5.8.52-8.25.79-8.04.87-12.93,9.48-13.47,16.3-.22,2.82,1.21,9.15-4.04,8.16-2.64-.5-2.54-4.13-2.47-6.07.41-10.52,6.14-22,17.75-24.93,2.78-.7,6.34.09,9.25-.56,5.76-1.3,7.26-9.22,3.96-13.27-.2-.24-2.45-2.03-2.73-2.18-1.87-.96-10.11-.89-12.53-.74-2.03.13-2.71.5-2.96,2.49-.22,1.74.32,11.34-.04,11.85-2.22.84-4.06,2.72-6.19,3.43-.14-.1.28-.33.28-.39,0-5-.68-12.58,0-17.24Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 KiB

+20 -11
View File
@@ -1,19 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.4.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 45.1 45.1" style="enable-background:new 0 0 45.1 45.1;" xml:space="preserve">
viewBox="0 0 69.9 34.2" style="enable-background:new 0 0 69.9 34.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#057A70;}
.st1{fill:#FFFFFF;}
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M35.3,41H9.8C6.6,41,4,38.4,4,35.3V9.7C4,6.6,6.6,4,9.8,4h25.6C38.5,4,41,6.6,41,9.7v25.6
C41,38.4,38.5,41,35.3,41z"/>
<path class="st0" d="M63.5,9.2c-1.2,0-2.5-0.1-3.8-0.1c-2.2,0.3-3.5,2-4,4c0,0.1,0,0.2-0.1,0.3c-0.3,1-0.5,2-0.8,3.1
c-6.4,0.3-6.5-0.8-6.1-2.4c0-0.1,0.1-0.2,0.1-0.3c0.4-1.6,0.3-1.3,0.5-2.3c0.1-0.2,0.1-0.5,0.1-0.7c0-0.8-0.1-1.4-0.5-2
c-0.4-0.5-0.9-1-1.6-1.3c-1-0.5-1.5-0.3-1.7,0.8c0,0.2-0.1,0.4-0.1,0.7C45.1,10.4,44,15,44,15c-0.4,1.3-0.8,1.5-2.6,1.5
c-1.2,0-5.3,0-5.3,0c-1.5-0.2-2.2-0.9-1.9-2.4c0-0.1,0.1-0.2,0.1-0.3c0.4-1.6,0.3-1.3,0.5-2.3c0.1-0.2,0.1-0.5,0.1-0.7
c0-0.8-0.1-1.4-0.5-2c-0.4-0.5-0.9-1-1.6-1.3c-1-0.5-1.5-0.3-1.7,0.8c0,0.2-0.1,0.4-0.1,0.7c-0.3,1.5-1.4,6.1-1.4,6.1
c-0.4,1.3-0.8,1.5-2.6,1.5c-3.4-0.1-17.9,0.1-21.2,0c-2.5-0.1-3.3,1.4-3.7,2.9l-0.5,1.8c4.6,0.1,27.4,0,27.5,0
c0.5,0,0.9-0.1,1.3-0.3c0.7-0.2,1.2-0.6,1.7-1.1c0.6,0.6,1.4,1,2.3,1.2c0.1,0,9.1,0.1,9.2,0.1c1.2-0.1,2.2-0.6,2.9-1.3
c0.7,0.7,1.6,1.1,2.7,1.2c0,0,13.7,0.2,13.9,0.2c1.7-0.1,2.5-1.1,3.1-3c0.1-0.5,0.3-0.9,0.4-1.3c0.3-1,0.6-1.9,0.8-2.9
c0-0.1,0-0.2,0-0.2C67.9,11.1,66.4,9.3,63.5,9.2z M63,14.2c-0.6,2.4-0.3,2.4-2.6,2.3c-0.2,0-0.2,0-0.5,0c-0.8,0-0.6-0.6-0.6-0.8
c0.4-1.9,0.8-2.2,2.7-2.2c0.3,0,1.1,0,1.1,0S63.1,13.9,63,14.2z"/>
<g>
<path class="st1" d="M30.6,8.7l-0.5,1.8c-0.4,1.6-1.2,2.8-3.7,2.8c-3.4,0-4.6,0-8,0.1c-2,0-2.3,0.3-2.7,2.2c0,0.2-0.2,0.9,1.2,0.9
c4.7,0,9.7,0,14.4,0c3,0,4.6,1.9,4,4.8c-0.3,1.4-0.6,2.7-1.1,4.3c-0.6,2.1-1.4,3.1-3.7,3.1c-2.9,0-5.3,0-8.1,0
c-0.9,0-1.4,0.3-1.6,1.3c-0.4,2.2-1,4.4-1.4,6.7c-0.2,0.9-0.6,1-1.3,0.8c-2.2-0.7-2.9-2.6-2.4-4.9c0.5-2.3,1.1-4.6,1.5-6.9
c0.2-1.1,0.7-1.6,1.9-1.6c3.3,0.1,6,0.1,9.3,0.1c2.3,0,2,0,2.6-2.4c0.1-0.6-0.1-0.8-0.7-0.8c-0.7,0-1.4,0-2.2,0c-4,0-8,0-12.1,0
c-1.1,0-1.5,0.4-1.7,1.4c-0.3,1.7-0.7,3.4-1,5.1c-0.2,1.1-0.7,1.3-1.7,0.8c-1.7-0.8-2.5-2.1-2.1-4c0.7-3.8,1.5-7.6,2.4-11.3
c0.5-2.1,1.9-4,4.3-4.1C16.4,8.7,26.1,8.7,30.6,8.7z"/>
<path class="st0" d="M17.9,24.3c-2.9,0-5,0-7.6,0c-2.6,0-2.9,1.5-3.3,2.6l-0.6,1.7c2.7,0,5.5,0,8.2,0c0.7,0,1.4,0,2.2,0
c0.6,0,0.9,0.2,0.7,0.8l-1.1,3.3c0.5,0,1.5,0,2,0c2.2,0,2.6-1,3.2-3.1C23.2,25.3,20.9,24.2,17.9,24.3z"/>
</g>
<path class="st0" d="M64,5.9l-2.7-0.2c-0.5-0.1-0.8-0.6-0.7-1.1l0.6-2.4c0.1-0.5,0.6-0.8,1.1-0.7l2.7,0.2c0.5,0.1,0.8,0.6,0.7,1.1
l-0.6,2.4C65,5.7,64.5,6,64,5.9z"/>
<g>
<path class="st0" d="M42.1,24.7c-0.9,0-5.7,0-8.3,0c-1.8,0-1.9,1.3-1.9,1.3l-0.7,3.2l7.8,0c2.3,0,4-1.1,4.3-3.4
C43.3,25.1,43,24.7,42.1,24.7z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

+170
View File
@@ -21,6 +21,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
"@babel/core@^7.0.0", "@babel/core@^7.24.4":
"@babel/core@^7.0.0", "@babel/core@^7.24.4":
version "7.28.5"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
@@ -171,9 +172,11 @@
dependencies:
tslib "^2.4.0"
"@emnapi/wasi-threads@1.1.0":
"@emnapi/wasi-threads@1.1.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"
resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"
integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==
dependencies:
tslib "^2.4.0"
@@ -391,6 +394,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
@@ -485,6 +489,7 @@
"@radix-ui/react-use-previous" "1.1.1"
"@radix-ui/react-use-size" "1.1.1"
"@radix-ui/react-collapsible@^1.1.12", "@radix-ui/react-collapsible@1.1.12":
"@radix-ui/react-collapsible@^1.1.12", "@radix-ui/react-collapsible@1.1.12":
version "1.1.12"
resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz"
@@ -509,6 +514,7 @@
"@radix-ui/react-primitive" "2.1.3"
"@radix-ui/react-slot" "1.2.3"
"@radix-ui/react-compose-refs@^1.1.1", "@radix-ui/react-compose-refs@1.1.2":
"@radix-ui/react-compose-refs@^1.1.1", "@radix-ui/react-compose-refs@1.1.2":
version "1.1.2"
resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"
@@ -536,6 +542,7 @@
resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz"
integrity sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==
"@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@^1.1.15", "@radix-ui/react-dialog@^1.1.6", "@radix-ui/react-dialog@1.1.15":
"@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@^1.1.15", "@radix-ui/react-dialog@^1.1.6", "@radix-ui/react-dialog@1.1.15":
version "1.1.15"
resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz"
@@ -614,6 +621,7 @@
"@radix-ui/react-primitive" "2.1.3"
"@radix-ui/react-use-controllable-state" "1.2.2"
"@radix-ui/react-id@^1.1.0", "@radix-ui/react-id@1.1.1":
"@radix-ui/react-id@^1.1.0", "@radix-ui/react-id@1.1.1":
version "1.1.1"
resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz"
@@ -741,6 +749,7 @@
"@radix-ui/react-compose-refs" "1.1.2"
"@radix-ui/react-use-layout-effect" "1.1.1"
"@radix-ui/react-primitive@^2.0.2", "@radix-ui/react-primitive@2.1.3":
"@radix-ui/react-primitive@^2.0.2", "@radix-ui/react-primitive@2.1.3":
version "2.1.3"
resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"
@@ -867,6 +876,13 @@
dependencies:
"@radix-ui/react-compose-refs" "1.1.2"
"@radix-ui/react-slot@^1.2.4", "@radix-ui/react-slot@1.2.4":
version "1.2.4"
resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"
integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==
dependencies:
"@radix-ui/react-compose-refs" "1.1.2"
"@radix-ui/react-slot@1.2.3":
version "1.2.3"
resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"
@@ -914,6 +930,7 @@
"@radix-ui/react-toggle" "1.1.10"
"@radix-ui/react-use-controllable-state" "1.2.2"
"@radix-ui/react-toggle@^1.1.10", "@radix-ui/react-toggle@1.1.10":
"@radix-ui/react-toggle@^1.1.10", "@radix-ui/react-toggle@1.1.10":
version "1.1.10"
resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz"
@@ -1075,9 +1092,11 @@
postcss "^8.4.41"
tailwindcss "4.1.17"
"@tybys/wasm-util@^0.10.0":
"@tybys/wasm-util@^0.10.0":
version "0.10.1"
resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"
resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"
integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
dependencies:
tslib "^2.4.0"
@@ -1155,11 +1174,13 @@
dependencies:
undici-types "~6.21.0"
"@types/react-dom@*", "@types/react-dom@^19":
"@types/react-dom@*", "@types/react-dom@^19":
version "19.2.3"
resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz"
integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==
"@types/react@*", "@types/react@^19", "@types/react@^19.2.0":
"@types/react@*", "@types/react@^19", "@types/react@^19.2.0":
version "19.2.7"
resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz"
@@ -1182,6 +1203,7 @@
natural-compare "^1.4.0"
ts-api-utils "^2.1.0"
"@typescript-eslint/parser@^8.48.0", "@typescript-eslint/parser@8.48.0":
"@typescript-eslint/parser@^8.48.0", "@typescript-eslint/parser@8.48.0":
version "8.48.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz"
@@ -1210,6 +1232,7 @@
"@typescript-eslint/types" "8.48.0"
"@typescript-eslint/visitor-keys" "8.48.0"
"@typescript-eslint/tsconfig-utils@^8.48.0", "@typescript-eslint/tsconfig-utils@8.48.0":
"@typescript-eslint/tsconfig-utils@^8.48.0", "@typescript-eslint/tsconfig-utils@8.48.0":
version "8.48.0"
resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz"
@@ -1226,6 +1249,7 @@
debug "^4.3.4"
ts-api-utils "^2.1.0"
"@typescript-eslint/types@^8.48.0", "@typescript-eslint/types@8.48.0":
"@typescript-eslint/types@^8.48.0", "@typescript-eslint/types@8.48.0":
version "8.48.0"
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz"
@@ -1274,6 +1298,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
version "8.15.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
@@ -1468,6 +1493,7 @@ braces@^3.0.3:
dependencies:
fill-range "^7.1.1"
browserslist@^4.24.0, "browserslist@>= 4.21.0":
browserslist@^4.24.0, "browserslist@>= 4.21.0":
version "4.28.0"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz"
@@ -1626,11 +1652,28 @@ css-what@^6.1.0:
resolved "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz"
integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
css-select@^5.1.0:
version "5.2.2"
resolved "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz"
integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==
dependencies:
boolbase "^1.0.0"
css-what "^6.1.0"
domhandler "^5.0.2"
domutils "^3.0.1"
nth-check "^2.0.1"
css-what@^6.1.0:
version "6.2.2"
resolved "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz"
integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
csstype@^3.0.2, csstype@^3.2.2:
version "3.2.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3":
d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3":
version "3.2.4"
resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
@@ -1653,6 +1696,7 @@ d3-ease@^3.0.1:
resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3":
d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3":
version "3.0.1"
resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
@@ -1690,6 +1734,7 @@ d3-shape@^3.1.0:
dependencies:
d3-time "1 - 3"
d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3":
d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3":
version "3.1.0"
resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
@@ -1841,6 +1886,36 @@ domutils@^3.0.1, domutils@^3.2.2:
domelementtype "^2.3.0"
domhandler "^5.0.3"
dom-serializer@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz"
integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
dependencies:
domelementtype "^2.3.0"
domhandler "^5.0.2"
entities "^4.2.0"
domelementtype@^2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
domhandler@^5.0.2, domhandler@^5.0.3:
version "5.0.3"
resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz"
integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
dependencies:
domelementtype "^2.3.0"
domutils@^3.0.1, domutils@^3.2.2:
version "3.2.2"
resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz"
integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==
dependencies:
dom-serializer "^2.0.0"
domelementtype "^2.3.0"
domhandler "^5.0.3"
dunder-proto@^1.0.0, dunder-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
@@ -1909,6 +1984,21 @@ entities@^7.0.1:
resolved "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz"
integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
entities@^4.2.0:
version "4.5.0"
resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
entities@^6.0.0:
version "6.0.1"
resolved "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz"
integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==
entities@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz"
integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0:
version "1.24.0"
resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz"
@@ -2088,6 +2178,7 @@ eslint-module-utils@^2.12.1:
dependencies:
debug "^3.2.7"
eslint-plugin-import@*, eslint-plugin-import@^2.32.0:
eslint-plugin-import@*, eslint-plugin-import@^2.32.0:
version "2.32.0"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz"
@@ -2187,6 +2278,7 @@ eslint-visitor-keys@^4.2.1:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9, eslint@>=9.0.0:
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9, eslint@>=9.0.0:
version "9.39.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz"
@@ -2460,6 +2552,11 @@ globals@16.4.0:
resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz"
integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==
globals@16.4.0:
version "16.4.0"
resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz"
integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==
globalthis@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
@@ -2809,6 +2906,7 @@ iterator.prototype@^1.1.4:
has-symbols "^1.1.0"
set-function-name "^2.0.2"
jiti@*, jiti@^2.6.1:
jiti@*, jiti@^2.6.1:
version "2.6.1"
resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
@@ -3077,6 +3175,13 @@ nth-check@^2.0.1:
dependencies:
boolbase "^1.0.0"
nth-check@^2.0.1:
version "2.1.1"
resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz"
integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
dependencies:
boolbase "^1.0.0"
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
@@ -3207,6 +3312,28 @@ parse5@^7.0.0, parse5@^7.3.0:
dependencies:
entities "^6.0.0"
parse5-htmlparser2-tree-adapter@^7.1.0:
version "7.1.0"
resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz"
integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
dependencies:
domhandler "^5.0.3"
parse5 "^7.0.0"
parse5-parser-stream@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz"
integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
dependencies:
parse5 "^7.0.0"
parse5@^7.0.0, parse5@^7.3.0:
version "7.3.0"
resolved "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz"
integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==
dependencies:
entities "^6.0.0"
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
@@ -3232,6 +3359,7 @@ picomatch@^2.3.1:
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
"picomatch@^3 || ^4", picomatch@^4.0.3:
"picomatch@^3 || ^4", picomatch@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
@@ -3260,6 +3388,15 @@ postcss@8.4.31:
picocolors "^1.0.0"
source-map-js "^1.0.2"
postcss@8.4.31:
version "8.4.31"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
source-map-js "^1.0.2"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@@ -3293,6 +3430,7 @@ react-day-picker@^9.11.3:
date-fns "^4.1.0"
date-fns-jalali "^4.1.0-0"
"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@19.2.0:
"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@19.2.0:
version "19.2.0"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz"
@@ -3300,6 +3438,7 @@ react-day-picker@^9.11.3:
dependencies:
scheduler "^0.27.0"
react-hook-form@^7.55.0, react-hook-form@^7.67.0:
react-hook-form@^7.55.0, react-hook-form@^7.67.0:
version "7.67.0"
resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.67.0.tgz"
@@ -3366,6 +3505,7 @@ react-transition-group@^4.4.5:
loose-envify "^1.4.0"
prop-types "^15.6.2"
"react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@>=16, react@>=16.6.0, react@>=16.8.0, react@19.2.0:
"react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@>=16, react@>=16.6.0, react@>=16.8.0, react@19.2.0:
version "19.2.0"
resolved "https://registry.npmjs.org/react/-/react-19.2.0.tgz"
@@ -3491,6 +3631,11 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
"safer-buffer@>= 2.1.2 < 3.0.0":
version "2.1.2"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
scheduler@^0.27.0:
version "0.27.0"
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
@@ -3511,6 +3656,17 @@ semver@^7.7.1:
resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
semver@^7.7.3:
semver@^7.6.0:
version "7.7.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
semver@^7.7.1:
version "7.7.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
semver@^7.7.3:
version "7.7.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
@@ -3758,6 +3914,7 @@ tailwind-merge@^3.4.0:
resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz"
integrity sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==
tailwindcss@^4, tailwindcss@4.1.17:
tailwindcss@^4, tailwindcss@4.1.17:
version "4.1.17"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz"
@@ -3875,6 +4032,7 @@ typescript-eslint@^8.46.0:
"@typescript-eslint/typescript-estree" "8.48.0"
"@typescript-eslint/utils" "8.48.0"
typescript@^5, typescript@>=3.3.1, typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0":
typescript@^5, typescript@>=3.3.1, typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0":
version "5.9.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"
@@ -4001,6 +4159,18 @@ whatwg-mimetype@^4.0.0:
resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz"
integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
whatwg-encoding@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz"
integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
dependencies:
iconv-lite "0.6.3"
whatwg-mimetype@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz"
integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"