diff --git a/apps/website/app/[locale]/[...rest]/page.tsx b/apps/website/app/[locale]/[...rest]/page.tsx
index 0ff96242f..4583936ca 100644
--- a/apps/website/app/[locale]/[...rest]/page.tsx
+++ b/apps/website/app/[locale]/[...rest]/page.tsx
@@ -1,5 +1,5 @@
-import { notFound } from 'next/navigation'
+import { notFound } from "next/navigation";
export default function CatchAll() {
- notFound()
+ notFound();
}
diff --git a/apps/website/app/[locale]/layout.tsx b/apps/website/app/[locale]/layout.tsx
index e1edcf5b8..89e15a9b0 100644
--- a/apps/website/app/[locale]/layout.tsx
+++ b/apps/website/app/[locale]/layout.tsx
@@ -1,94 +1,90 @@
-import clsx from 'clsx'
-import { Inter, Lexend } from 'next/font/google'
-import '@/styles/tailwind.css'
-import GoogleAnalytics from '@/components/analitycs/google'
+import clsx from "clsx";
+import { Inter, Lexend } from "next/font/google";
+import "@/styles/tailwind.css";
+import GoogleAnalytics from "@/components/analitycs/google";
-import { NextIntlClientProvider } from 'next-intl'
-import { getMessages } from 'next-intl/server'
+import { NextIntlClientProvider } from "next-intl";
+import { getMessages } from "next-intl/server";
-import type { Metadata } from 'next'
+import type { Metadata } from "next";
export const metadata: Metadata = {
title: {
- default: 'Dokploy - Effortless Deployment Solutions',
- template: '%s | Simplify Your DevOps',
+ default: "Dokploy - Effortless Deployment Solutions",
+ template: "%s | Simplify Your DevOps",
},
alternates: {
- canonical: 'https://dokploy.com',
+ canonical: "https://dokploy.com",
languages: {
- en: 'https://dokploy.com',
+ en: "https://dokploy.com",
},
},
description:
- 'Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.',
- applicationName: 'Dokploy',
+ "Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.",
+ applicationName: "Dokploy",
keywords: [
- 'Dokploy',
- 'Docker',
- 'Traefik',
- 'deployment',
- 'VPS',
- 'application management',
- 'database management',
- 'DevOps',
- 'cloud infrastructure',
- 'UI Self hosted',
+ "Dokploy",
+ "Docker",
+ "Traefik",
+ "deployment",
+ "VPS",
+ "application management",
+ "database management",
+ "DevOps",
+ "cloud infrastructure",
+ "UI Self hosted",
],
- referrer: 'origin',
- robots: 'index, follow',
+ referrer: "origin",
+ robots: "index, follow",
openGraph: {
- type: 'website',
- url: 'https://dokploy.com',
- title: 'Dokploy - Effortless Deployment Solutions',
+ type: "website",
+ url: "https://dokploy.com",
+ title: "Dokploy - Effortless Deployment Solutions",
description:
- 'Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.',
- siteName: 'Dokploy',
+ "Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.",
+ siteName: "Dokploy",
images: [
{
- url: 'http://dokploy.com/og.png',
+ url: "http://dokploy.com/og.png",
},
],
},
twitter: {
- card: 'summary_large_image',
- site: '@Dokploy',
- creator: '@Dokploy',
- title: 'Dokploy - Simplify Your DevOps',
+ card: "summary_large_image",
+ site: "@Dokploy",
+ creator: "@Dokploy",
+ title: "Dokploy - Simplify Your DevOps",
description:
- 'Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.',
- images: 'https://dokploy.com/og.png',
+ "Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.",
+ images: "https://dokploy.com/og.png",
},
-}
+};
const inter = Inter({
- subsets: ['latin'],
- display: 'swap',
- variable: '--font-inter',
-})
+ subsets: ["latin"],
+ display: "swap",
+ variable: "--font-inter",
+});
const lexend = Lexend({
- subsets: ['latin'],
- display: 'swap',
- variable: '--font-lexend',
-})
+ subsets: ["latin"],
+ display: "swap",
+ variable: "--font-lexend",
+});
export default async function RootLayout({
children,
params,
}: {
- children: React.ReactNode
- params: { locale: string }
+ children: React.ReactNode;
+ params: { locale: string };
}) {
- const { locale } = params
- const messages = await getMessages()
+ const { locale } = params;
+ const messages = await getMessages();
return (
@@ -97,5 +93,5 @@ export default async function RootLayout({
- )
+ );
}
diff --git a/apps/website/app/[locale]/not-found.tsx b/apps/website/app/[locale]/not-found.tsx
index e690048a1..fa38b6a30 100644
--- a/apps/website/app/[locale]/not-found.tsx
+++ b/apps/website/app/[locale]/not-found.tsx
@@ -1,5 +1,5 @@
-import { SlimLayout } from '@/components/SlimLayout'
+import { SlimLayout } from "@/components/SlimLayout";
export default function NotFound() {
- return
+ return ;
}
diff --git a/apps/website/app/[locale]/page.tsx b/apps/website/app/[locale]/page.tsx
index b459b2dae..c6c1b2bbf 100644
--- a/apps/website/app/[locale]/page.tsx
+++ b/apps/website/app/[locale]/page.tsx
@@ -1,11 +1,11 @@
-import { CallToAction } from '@/components/CallToAction'
-import { Faqs } from '@/components/Faqs'
-import { Footer } from '@/components/Footer'
-import { Header } from '@/components/Header'
-import { Hero } from '@/components/Hero'
-import { PrimaryFeatures } from '@/components/PrimaryFeatures'
-import { SecondaryFeatures } from '@/components/SecondaryFeatures'
-import { Testimonials } from '../../components/Testimonials'
+import { CallToAction } from "@/components/CallToAction";
+import { Faqs } from "@/components/Faqs";
+import { Footer } from "@/components/Footer";
+import { Header } from "@/components/Header";
+import { Hero } from "@/components/Hero";
+import { PrimaryFeatures } from "@/components/PrimaryFeatures";
+import { SecondaryFeatures } from "@/components/SecondaryFeatures";
+import { Testimonials } from "../../components/Testimonials";
export default function Home() {
return (
@@ -21,5 +21,5 @@ export default function Home() {
- )
+ );
}
diff --git a/apps/website/app/layout.tsx b/apps/website/app/layout.tsx
index b7bc5467b..7c05c3105 100644
--- a/apps/website/app/layout.tsx
+++ b/apps/website/app/layout.tsx
@@ -1,11 +1,11 @@
-import { ReactNode } from 'react'
+import type { ReactNode } from "react";
type Props = {
- children: ReactNode
-}
+ children: ReactNode;
+};
// Since we have a `not-found.tsx` page on the root, a layout file
// is required, even if it's just passing children through.
export default function RootLayout({ children }: Props) {
- return children
+ return children;
}
diff --git a/apps/website/app/not-found.tsx b/apps/website/app/not-found.tsx
index 77d255e1d..f68a31c12 100644
--- a/apps/website/app/not-found.tsx
+++ b/apps/website/app/not-found.tsx
@@ -1,13 +1,13 @@
-'use client'
+"use client";
-import Error from 'next/error'
+import NextError from "next/error";
export default function NotFound() {
return (
-
+
- )
+ );
}
diff --git a/apps/website/components/CallToAction.tsx b/apps/website/components/CallToAction.tsx
index 871c0e6f1..9b3e72ac1 100644
--- a/apps/website/components/CallToAction.tsx
+++ b/apps/website/components/CallToAction.tsx
@@ -1,11 +1,11 @@
-import { Container } from '@/components/Container'
-import Link from 'next/link'
-import { Button } from './ui/button'
-import { useTranslations } from 'next-intl'
+import { Container } from "@/components/Container";
+import { useTranslations } from "next-intl";
+import Link from "next/link";
+import { Button } from "./ui/button";
export function CallToAction() {
- const t = useTranslations('HomePage')
- const linkT = useTranslations('Link')
+ const t = useTranslations("HomePage");
+ const linkT = useTranslations("Link");
return (
-
+
@@ -38,25 +33,25 @@ export function CallToAction() {
- {t('callToAction.title')}
+ {t("callToAction.title")}
- {t('callToAction.des')}
+ {t("callToAction.des")}
{/* @ts-expect-error */}
- )
+ );
}
diff --git a/apps/website/components/Faqs.tsx b/apps/website/components/Faqs.tsx
index bf8c0ee3e..10a6d60ea 100644
--- a/apps/website/components/Faqs.tsx
+++ b/apps/website/components/Faqs.tsx
@@ -1,58 +1,57 @@
-import { useTranslations } from 'next-intl'
-import { Container } from './Container'
+import { useTranslations } from "next-intl";
+import { Container } from "./Container";
const faqs = [
[
{
- question: 'faq.q1',
- answer: 'faq.a1',
+ question: "faq.q1",
+ answer: "faq.a1",
},
{
- question: 'faq.q2',
- answer: 'faq.a2',
+ question: "faq.q2",
+ answer: "faq.a2",
},
{
- question: 'faq.q3',
- answer: 'faq.a3',
+ question: "faq.q3",
+ answer: "faq.a3",
},
{
- question: 'faq.q4',
- answer: 'faq.a4',
+ question: "faq.q4",
+ answer: "faq.a4",
},
],
[
{
- question: 'faq.q5',
- answer: 'faq.a5',
+ question: "faq.q5",
+ answer: "faq.a5",
},
{
- question: 'faq.q6',
- answer: 'faq.a6',
+ question: "faq.q6",
+ answer: "faq.a6",
},
{
- question: 'faq.q7',
+ question: "faq.q7",
answer: "faq.a7",
},
],
[
{
- question:
- 'faq.q8',
- answer: 'faq.a8',
+ question: "faq.q8",
+ answer: "faq.a8",
},
{
- question: 'faq.q9',
- answer: 'faq.a9',
+ question: "faq.q9",
+ answer: "faq.a9",
},
{
- question: 'faq.q10',
- answer: 'faq.a10',
+ question: "faq.q10",
+ answer: "faq.a10",
},
],
-]
+];
export function Faqs() {
- const t = useTranslations('HomePage')
+ const t = useTranslations("HomePage");
return (
- {t('faq.title')}
+ {t("faq.title")}
- {t('faq.des')}
+ {t("faq.des")}
@@ -91,5 +90,5 @@ export function Faqs() {
- )
+ );
}
diff --git a/apps/website/components/Footer.tsx b/apps/website/components/Footer.tsx
index d0c0fb362..c1235add3 100644
--- a/apps/website/components/Footer.tsx
+++ b/apps/website/components/Footer.tsx
@@ -1,13 +1,13 @@
-import Link from 'next/link'
+import Link from "next/link";
-import { Container } from './Container'
-import { NavLink } from './NavLink'
-import { Logo } from './shared/Logo'
-import { useTranslations } from 'next-intl'
+import { useTranslations } from "next-intl";
+import { Container } from "./Container";
+import { NavLink } from "./NavLink";
+import { Logo } from "./shared/Logo";
export function Footer() {
- const t = useTranslations('HomePage')
- const linkT = useTranslations('Link')
+ const t = useTranslations("HomePage");
+ const linkT = useTranslations("Link");
return (
- )
+ );
}
diff --git a/apps/website/components/Header.tsx b/apps/website/components/Header.tsx
index 3c7508b38..1bfa60a12 100644
--- a/apps/website/components/Header.tsx
+++ b/apps/website/components/Header.tsx
@@ -1,40 +1,40 @@
-'use client'
+"use client";
-import { cn } from '@/lib/utils'
-import { Popover, Transition } from '@headlessui/react'
-import { HeartIcon } from 'lucide-react'
-import { Fragment, JSX, SVGProps } from 'react'
-import { Container } from './Container'
-import { NavLink } from './NavLink'
-import { trackGAEvent } from './analitycs'
-import { Logo } from './shared/Logo'
-import { Button, buttonVariants } from './ui/button'
-import { useLocale, useTranslations } from 'next-intl'
-import { Link, useRouter } from '@/i18n/routing'
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
-} from '@/components/ui/select'
+} from "@/components/ui/select";
+import { Link, useRouter } from "@/i18n/routing";
+import { cn } from "@/lib/utils";
+import { Popover, Transition } from "@headlessui/react";
+import { HeartIcon } from "lucide-react";
+import { useLocale, useTranslations } from "next-intl";
+import { Fragment, type JSX, type SVGProps } from "react";
+import { Container } from "./Container";
+import { NavLink } from "./NavLink";
+import { trackGAEvent } from "./analitycs";
+import { Logo } from "./shared/Logo";
+import { Button, buttonVariants } from "./ui/button";
function MobileNavLink({
href,
children,
target,
}: {
- href: string
- children: React.ReactNode
- target?: string
+ href: string;
+ children: React.ReactNode;
+ target?: string;
}) {
return (
{
trackGAEvent({
- action: 'Nav Link Clicked',
- category: 'Navigation',
+ action: "Nav Link Clicked",
+ category: "Navigation",
label: href,
- })
+ });
}}
as={Link}
href={href}
@@ -43,7 +43,7 @@ function MobileNavLink({
>
{children}
- )
+ );
}
function MobileNavIcon({ open }: { open: boolean }) {
@@ -57,20 +57,17 @@ function MobileNavIcon({ open }: { open: boolean }) {
>
- )
+ );
}
const I18nIcon = (props: JSX.IntrinsicAttributes & SVGProps) => (
@@ -89,11 +86,11 @@ const I18nIcon = (props: JSX.IntrinsicAttributes & SVGProps) => (
d="m478.33 433.6-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362 368 281.65 401.17 362zm-66.99-19.08a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73 39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93.92 1.19 1.83 2.35 2.74 3.51-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59 22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z"
/>
-)
+);
function MobileNavigation() {
- const t = useTranslations('HomePage')
- const linkT = useTranslations('Link')
+ const t = useTranslations("HomePage");
+ const linkT = useTranslations("Link");
return (
- {t('navigation.features')}
+ {t("navigation.features")}
{/* Testimonials */}
-
- {t('navigation.faqs')}
-
-
- {t('navigation.docs')}
+ {t("navigation.faqs")}
+
+ {t("navigation.docs")}
- )
+ );
}
export function Header() {
- const router = useRouter()
- const locale = useLocale()
- const t = useTranslations('HomePage')
- const linkT = useTranslations('Link')
+ const router = useRouter();
+ const locale = useLocale();
+ const t = useTranslations("HomePage");
+ const linkT = useTranslations("Link");
return (
@@ -163,57 +155,50 @@ export function Header() {
-
- {t('navigation.features')}
-
+ {t("navigation.features")}
{/* Testimonials */}
-
- {t('navigation.faqs')}
-
-
- {t('navigation.docs')}
+ {t("navigation.faqs")}
+
+ {t("navigation.docs")}
- {t('navigation.support')}{' '}
+ {t("navigation.support")}{" "}
@@ -236,7 +221,7 @@ export function Header() {
>
- {t('navigation.discord')}
+ {t("navigation.discord")}
@@ -246,5 +231,5 @@ export function Header() {
- )
+ );
}
diff --git a/apps/website/components/Hero.tsx b/apps/website/components/Hero.tsx
index 018962c28..9f391fe1c 100644
--- a/apps/website/components/Hero.tsx
+++ b/apps/website/components/Hero.tsx
@@ -1,10 +1,10 @@
-'use client'
-import { Check, Copy } from 'lucide-react'
-import Link from 'next/link'
-import { useEffect, useState } from 'react'
-import { Container } from './Container'
-import { Button } from './ui/button'
-import { useTranslations } from 'next-intl'
+"use client";
+import { Check, Copy } from "lucide-react";
+import { useTranslations } from "next-intl";
+import Link from "next/link";
+import { useEffect, useState } from "react";
+import { Container } from "./Container";
+import { Button } from "./ui/button";
const ProductHunt = () => {
return (
@@ -35,19 +35,19 @@ const ProductHunt = () => {
- )
-}
+ );
+};
export function Hero() {
- const t = useTranslations('HomePage')
- const [isCopied, setIsCopied] = useState(false)
+ const t = useTranslations("HomePage");
+ const [isCopied, setIsCopied] = useState(false);
useEffect(() => {
const timer = setTimeout(() => {
- setIsCopied(false)
- }, 2000)
- return () => clearTimeout(timer)
- }, [isCopied])
+ setIsCopied(false);
+ }, 2000);
+ return () => clearTimeout(timer);
+ }, [isCopied]);
return (
@@ -56,21 +56,12 @@ export function Hero() {
-
+
-
+
@@ -79,7 +70,7 @@ export function Hero() {
- {t('hero.deploy')}{' '}
+ {t("hero.deploy")}{" "}
- {t('hero.anywhere')}
- {' '}
- {t('hero.with')}
+ {t("hero.anywhere")}
+ {" "}
+ {t("hero.with")}
- {t('hero.des')}
+ {t("hero.des")}
@@ -104,9 +95,7 @@ export function Hero() {
type="button"
onClick={() =>
navigator.clipboard
- .writeText(
- 'curl -sSL https://dokploy.com/install.sh | sh',
- )
+ .writeText("curl -sSL https://dokploy.com/install.sh | sh")
.then(() => setIsCopied(true))
.catch(() => setIsCopied(false))
}
@@ -144,10 +133,7 @@ export function Hero() {
target="_blank"
className="flex flex-row items-center gap-2"
>
-
- )
+ );
}
diff --git a/apps/website/components/NavLink.tsx b/apps/website/components/NavLink.tsx
index 2e5a275ed..06f0f7edd 100644
--- a/apps/website/components/NavLink.tsx
+++ b/apps/website/components/NavLink.tsx
@@ -1,7 +1,7 @@
"use client";
+import { Link } from "@/i18n/routing";
import { trackGAEvent } from "./analitycs";
-import { Link } from '@/i18n/routing'
export function NavLink({
href,
diff --git a/apps/website/components/PrimaryFeatures.tsx b/apps/website/components/PrimaryFeatures.tsx
index 579f0ed36..ef4ecfd96 100644
--- a/apps/website/components/PrimaryFeatures.tsx
+++ b/apps/website/components/PrimaryFeatures.tsx
@@ -1,73 +1,73 @@
-'use client'
+"use client";
-import { Tab } from '@headlessui/react'
-import { AnimatePresence, motion } from 'framer-motion'
-import { useEffect, useState } from 'react'
+import { Tab } from "@headlessui/react";
+import { AnimatePresence, motion } from "framer-motion";
+import { useEffect, useState } from "react";
-import { cn } from '@/lib/utils'
-import { Container } from './Container'
-import { useTranslations } from 'next-intl'
+import { cn } from "@/lib/utils";
+import { useTranslations } from "next-intl";
+import { Container } from "./Container";
const features = [
{
- title: 'primaryFeatures.projects',
- description: 'primaryFeatures.projectsDes',
- image: '/primary/projects.png',
+ title: "primaryFeatures.projects",
+ description: "primaryFeatures.projectsDes",
+ image: "/primary/projects.png",
},
{
- title: 'primaryFeatures.applications',
- description: 'primaryFeatures.applicationsDes',
- image: '/primary/applications.png',
+ title: "primaryFeatures.applications",
+ description: "primaryFeatures.applicationsDes",
+ image: "/primary/applications.png",
},
{
- title: 'primaryFeatures.compose',
- description: 'primaryFeatures.composeDes',
- image: '/primary/compose.png',
+ title: "primaryFeatures.compose",
+ description: "primaryFeatures.composeDes",
+ image: "/primary/compose.png",
},
{
- title: 'primaryFeatures.multinode',
- description: 'primaryFeatures.multinodeDes',
- image: '/primary/multinode.png',
+ title: "primaryFeatures.multinode",
+ description: "primaryFeatures.multinodeDes",
+ image: "/primary/multinode.png",
},
{
- title: 'primaryFeatures.monitoring',
- description: 'primaryFeatures.monitoringDes',
- image: '/primary/monitoring.png',
+ title: "primaryFeatures.monitoring",
+ description: "primaryFeatures.monitoringDes",
+ image: "/primary/monitoring.png",
},
{
- title: 'primaryFeatures.backups',
- description: 'primaryFeatures.backupsDes',
- image: '/primary/backups.png',
+ title: "primaryFeatures.backups",
+ description: "primaryFeatures.backupsDes",
+ image: "/primary/backups.png",
},
-]
+];
export function PrimaryFeatures() {
- const t = useTranslations('HomePage')
+ const t = useTranslations("HomePage");
const [tabOrientation, setTabOrientation] = useState<
- 'horizontal' | 'vertical'
- >('horizontal')
+ "horizontal" | "vertical"
+ >("horizontal");
useEffect(() => {
- const lgMediaQuery = window.matchMedia('(min-width: 1024px)')
+ const lgMediaQuery = window.matchMedia("(min-width: 1024px)");
function onMediaQueryChange({ matches }: { matches: boolean }) {
- setTabOrientation(matches ? 'vertical' : 'horizontal')
+ setTabOrientation(matches ? "vertical" : "horizontal");
}
- onMediaQueryChange(lgMediaQuery)
- lgMediaQuery.addEventListener('change', onMediaQueryChange)
+ onMediaQueryChange(lgMediaQuery);
+ lgMediaQuery.addEventListener("change", onMediaQueryChange);
return () => {
- lgMediaQuery.removeEventListener('change', onMediaQueryChange)
- }
- }, [])
+ lgMediaQuery.removeEventListener("change", onMediaQueryChange);
+ };
+ }, []);
- const [isMounted, setIsMounted] = useState(false)
+ const [isMounted, setIsMounted] = useState(false);
// Cambiar isMounted a true después del primer render
useEffect(() => {
- setIsMounted(true)
- }, [])
+ setIsMounted(true);
+ }, []);
return (
- {t('primaryFeatures.title')}
+ {t("primaryFeatures.title")}
- {t('primaryFeatures.des')}
+ {t("primaryFeatures.des")}
{({ selectedIndex }) => (
<>
@@ -113,12 +113,11 @@ export function PrimaryFeatures() {
initial={false}
key={`feature-${featureIndex}`}
className={cn(
- 'group relative rounded-full px-4 py-1 transition-colors lg:rounded-l-xl lg:rounded-r-none lg:p-6 ',
+ "group relative rounded-full px-4 py-1 transition-colors lg:rounded-l-xl lg:rounded-r-none lg:p-6 ",
)}
>
- {selectedIndex ===
- featureIndex && (
+ {selectedIndex === featureIndex && (
@@ -145,7 +144,7 @@ export function PrimaryFeatures() {
{t(feature.description)}
@@ -166,19 +165,11 @@ export function PrimaryFeatures() {
- )
+ );
}
diff --git a/apps/website/components/SecondaryFeatures.tsx b/apps/website/components/SecondaryFeatures.tsx
index 218b8c44d..275116d25 100644
--- a/apps/website/components/SecondaryFeatures.tsx
+++ b/apps/website/components/SecondaryFeatures.tsx
@@ -1,38 +1,38 @@
-'use client'
+"use client";
-import { cn } from '@/lib/utils'
-import { Tab } from '@headlessui/react'
-import { motion } from 'framer-motion'
-import { Layers, Terminal, Users } from 'lucide-react'
-import { Container } from './Container'
-import { useTranslations } from 'next-intl'
+import { cn } from "@/lib/utils";
+import { Tab } from "@headlessui/react";
+import { motion } from "framer-motion";
+import { Layers, Terminal, Users } from "lucide-react";
+import { useTranslations } from "next-intl";
+import { Container } from "./Container";
interface Feature {
- name: React.ReactNode
- summary: string
- description: string
- image: string
- icon: React.ComponentType
+ name: React.ReactNode;
+ summary: string;
+ description: string;
+ image: string;
+ icon: React.ComponentType;
}
const features: Array
= [
{
- name: 'secondaryFeatures.templates',
- summary: 'secondaryFeatures.templatesSummary',
- description: 'secondaryFeatures.templatesDes',
- image: '/secondary/templates.png',
+ name: "secondaryFeatures.templates",
+ summary: "secondaryFeatures.templatesSummary",
+ description: "secondaryFeatures.templatesDes",
+ image: "/secondary/templates.png",
icon: function ReportingIcon() {
return (
<>
>
- )
+ );
},
},
{
- name: 'secondaryFeatures.traefik',
- summary: 'secondaryFeatures.traefikSummary',
- description: 'secondaryFeatures.traefikDes',
- image: '/secondary/traefik.png',
+ name: "secondaryFeatures.traefik",
+ summary: "secondaryFeatures.traefikSummary",
+ description: "secondaryFeatures.traefikDes",
+ image: "/secondary/traefik.png",
icon: function ReportingIcon() {
return (
<>
@@ -82,12 +82,7 @@ const features: Array = [
d="M299.847 285.567c10.027 58.288 105.304 42.877 91.619-15.91-12.271-52.716-94.951-38.124-91.619 15.91m-113.855 9.427c12.996 50.745 94.24 37.753 91.178-13.149-3.669-60.964-103.603-49.2-91.178 13.149m132.351 58.517c.044 7.79 1.843 15.403.289 24.148-1.935 3.656-5.729 4.043-9.001 5.52-4.524-.71-8.328-3.68-10.143-7.912-1.161-9.202.433-18.111.726-27.316l18.129 5.56z"
fill="#fff"
/>
-
+
= [
ry="3.777"
fill="#fff"
/>
-
+
-
+
= [
>
- )
+ );
},
},
{
- name: 'secondaryFeatures.users',
- summary: 'secondaryFeatures.usersSummary',
- description: 'secondaryFeatures.usersDes',
- image: '/secondary/users.png',
+ name: "secondaryFeatures.users",
+ summary: "secondaryFeatures.usersSummary",
+ description: "secondaryFeatures.usersDes",
+ image: "/secondary/users.png",
icon: function InventoryIcon() {
return (
<>
>
- )
+ );
},
},
{
- name: 'secondaryFeatures.terminal',
- summary: 'secondaryFeatures.terminalSummary',
- description: 'secondaryFeatures.terminalDes',
- image: '/secondary/terminal.png',
+ name: "secondaryFeatures.terminal",
+ summary: "secondaryFeatures.terminalSummary",
+ description: "secondaryFeatures.terminalDes",
+ image: "/secondary/terminal.png",
icon: function ContactsIcon() {
return (
<>
>
- )
+ );
},
},
-]
+];
function Feature({
feature,
isActive,
className,
...props
-}: React.ComponentPropsWithoutRef<'div'> & {
- feature: Feature
- isActive: boolean
+}: React.ComponentPropsWithoutRef<"div"> & {
+ feature: Feature;
+ isActive: boolean;
}) {
- const t = useTranslations('HomePage')
+ const t = useTranslations("HomePage");
return (
@@ -289,7 +274,7 @@ function Feature({
layoutId="bubble"
className="absolute inset-0 z-10 rounded-xl bg-white/5 mix-blend-difference"
transition={{
- type: 'spring',
+ type: "spring",
bounce: 0.2,
duration: 0.6,
}}
@@ -297,8 +282,8 @@ function Feature({
)}
{feature.name}
@@ -310,7 +295,7 @@ function Feature({
{t(feature.description)}
- )
+ );
}
function FeaturesMobile() {
@@ -318,11 +303,7 @@ function FeaturesMobile() {
{features.map((feature) => (
-
+
@@ -337,11 +318,11 @@ function FeaturesMobile() {
))}
- )
+ );
}
function FeaturesDesktop() {
- const t = useTranslations('HomePage')
+ const t = useTranslations("HomePage");
return (
{({ selectedIndex }) => (
@@ -371,9 +352,8 @@ function FeaturesDesktop() {
static
key={feature.summary}
className={cn(
- 'px-5 transition duration-500 ease-in-out ui-not-focus-visible:outline-none',
- featureIndex !== selectedIndex &&
- 'opacity-60',
+ "px-5 transition duration-500 ease-in-out ui-not-focus-visible:outline-none",
+ featureIndex !== selectedIndex && "opacity-60",
)}
style={{
transform: `translateX(-${selectedIndex * 100}%)`,
@@ -396,11 +376,11 @@ function FeaturesDesktop() {
>
)}
- )
+ );
}
export function SecondaryFeatures() {
- const t = useTranslations('HomePage')
+ const t = useTranslations("HomePage");
return (
- {t('secondaryFeatures.title')}
+ {t("secondaryFeatures.title")}
- {t('secondaryFeatures.des')}
+ {t("secondaryFeatures.des")}
- )
+ );
}
diff --git a/apps/website/components/SlimLayout.tsx b/apps/website/components/SlimLayout.tsx
index 13a78d8bd..cc32991eb 100644
--- a/apps/website/components/SlimLayout.tsx
+++ b/apps/website/components/SlimLayout.tsx
@@ -1,10 +1,10 @@
-import { Link } from '@/i18n/routing'
-import { Footer } from './Footer'
-import { Header } from './Header'
-import { useTranslations } from 'next-intl'
+import { Link } from "@/i18n/routing";
+import { useTranslations } from "next-intl";
+import { Footer } from "./Footer";
+import { Header } from "./Header";
export function SlimLayout() {
- const t = useTranslations('404')
+ const t = useTranslations("404");
return (
<>
@@ -12,16 +12,12 @@ export function SlimLayout() {
-
- 404
-
-
- {t('title')}
-
+
404
+
{t("title")}
- {t('des')}{' '}
+ {t("des")}{" "}
- {t('action')}
+ {t("action")}
@@ -30,5 +26,5 @@ export function SlimLayout() {
>
- )
+ );
}
diff --git a/apps/website/components/ui/select.tsx b/apps/website/components/ui/select.tsx
index 61e679915..e4f033f02 100644
--- a/apps/website/components/ui/select.tsx
+++ b/apps/website/components/ui/select.tsx
@@ -1,16 +1,16 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as SelectPrimitive from '@radix-ui/react-select'
-import { Check, ChevronDown, ChevronUp } from 'lucide-react'
+import * as SelectPrimitive from "@radix-ui/react-select";
+import { Check, ChevronDown, ChevronUp } from "lucide-react";
+import * as React from "react";
-import { cn } from '@/lib/utils'
+import { cn } from "@/lib/utils";
-const Select = SelectPrimitive.Root
+const Select = SelectPrimitive.Root;
-const SelectGroup = SelectPrimitive.Group
+const SelectGroup = SelectPrimitive.Group;
-const SelectValue = SelectPrimitive.Value
+const SelectValue = SelectPrimitive.Value;
const SelectTrigger = React.forwardRef<
React.ElementRef
,
@@ -19,7 +19,7 @@ const SelectTrigger = React.forwardRef<
span]:line-clamp-1',
+ "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
className,
)}
{...props}
@@ -29,8 +29,8 @@ const SelectTrigger = React.forwardRef<
-))
-SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
const SelectScrollUpButton = React.forwardRef<
React.ElementRef,
@@ -39,15 +39,15 @@ const SelectScrollUpButton = React.forwardRef<
-))
-SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
const SelectScrollDownButton = React.forwardRef<
React.ElementRef,
@@ -56,28 +56,28 @@ const SelectScrollDownButton = React.forwardRef<
-))
+));
SelectScrollDownButton.displayName =
- SelectPrimitive.ScrollDownButton.displayName
+ SelectPrimitive.ScrollDownButton.displayName;
const SelectContent = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, children, position = 'popper', ...props }, ref) => (
+>(({ className, children, position = "popper", ...props }, ref) => (
{children}
@@ -96,8 +96,8 @@ const SelectContent = React.forwardRef<
-))
-SelectContent.displayName = SelectPrimitive.Content.displayName
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
const SelectLabel = React.forwardRef<
React.ElementRef,
@@ -105,11 +105,11 @@ const SelectLabel = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-SelectLabel.displayName = SelectPrimitive.Label.displayName
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
const SelectItem = React.forwardRef<
React.ElementRef,
@@ -118,7 +118,7 @@ const SelectItem = React.forwardRef<
{children}
-))
-SelectItem.displayName = SelectPrimitive.Item.displayName
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
const SelectSeparator = React.forwardRef<
React.ElementRef,
@@ -140,11 +140,11 @@ const SelectSeparator = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-SelectSeparator.displayName = SelectPrimitive.Separator.displayName
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
export {
Select,
@@ -157,4 +157,4 @@ export {
SelectSeparator,
SelectScrollUpButton,
SelectScrollDownButton,
-}
+};
diff --git a/apps/website/i18n/request.tsx b/apps/website/i18n/request.tsx
index 714e7404a..943d95245 100644
--- a/apps/website/i18n/request.tsx
+++ b/apps/website/i18n/request.tsx
@@ -1,12 +1,12 @@
-import { notFound } from 'next/navigation'
-import { getRequestConfig } from 'next-intl/server'
-import { routing } from './routing'
+import { getRequestConfig } from "next-intl/server";
+import { notFound } from "next/navigation";
+import { routing } from "./routing";
export default getRequestConfig(async ({ locale }) => {
- // Validate that the incoming `locale` parameter is valid
- if (!routing.locales.includes(locale as any)) notFound()
+ // Validate that the incoming `locale` parameter is valid
+ if (!routing.locales.includes(locale as any)) notFound();
- return {
- messages: (await import(`../locales/${locale}.json`)).default,
- }
-})
+ return {
+ messages: (await import(`../locales/${locale}.json`)).default,
+ };
+});
diff --git a/apps/website/i18n/routing.ts b/apps/website/i18n/routing.ts
index a60e3d1a5..fdb0f21e0 100644
--- a/apps/website/i18n/routing.ts
+++ b/apps/website/i18n/routing.ts
@@ -1,16 +1,16 @@
-import { defineRouting } from 'next-intl/routing'
-import { createSharedPathnamesNavigation } from 'next-intl/navigation'
+import { createSharedPathnamesNavigation } from "next-intl/navigation";
+import { defineRouting } from "next-intl/routing";
export const routing = defineRouting({
// A list of all locales that are supported
- locales: ['en', 'zh-Hans'],
+ locales: ["en", "zh-Hans"],
// Used when no locale matches
- defaultLocale: 'en',
- localePrefix: 'as-needed',
-})
+ defaultLocale: "en",
+ localePrefix: "as-needed",
+});
// Lightweight wrappers around Next.js' navigation APIs
// that will consider the routing configuration
export const { Link, redirect, usePathname, useRouter } =
- createSharedPathnamesNavigation(routing)
+ createSharedPathnamesNavigation(routing);
diff --git a/apps/website/locales/en.json b/apps/website/locales/en.json
index ee44bf1bb..321d09cf9 100644
--- a/apps/website/locales/en.json
+++ b/apps/website/locales/en.json
@@ -7,8 +7,8 @@
"support": "Support",
"discord": "Discord",
"i18nButtonPlaceholder": "Language",
- "i18nEn":"English",
- "i18nZh-Hans":"简体中文"
+ "i18nEn": "English",
+ "i18nZh-Hans": "简体中文"
},
"hero": {
"deploy": "Deploy",
diff --git a/apps/website/locales/zh-Hans.json b/apps/website/locales/zh-Hans.json
index c17dab2f5..c852c2abd 100644
--- a/apps/website/locales/zh-Hans.json
+++ b/apps/website/locales/zh-Hans.json
@@ -7,8 +7,8 @@
"support": "赞助",
"discord": "Discord",
"i18nButtonPlaceholder": "语言",
- "i18nEn":"English",
- "i18nZh-Hans":"简体中文"
+ "i18nEn": "English",
+ "i18nZh-Hans": "简体中文"
},
"hero": {
"deploy": "部署在",
diff --git a/apps/website/middleware.ts b/apps/website/middleware.ts
index fb1e42317..a8d13b846 100644
--- a/apps/website/middleware.ts
+++ b/apps/website/middleware.ts
@@ -1,9 +1,9 @@
-import createMiddleware from 'next-intl/middleware'
-import { routing } from './i18n/routing'
+import createMiddleware from "next-intl/middleware";
+import { routing } from "./i18n/routing";
-export default createMiddleware(routing)
+export default createMiddleware(routing);
export const config = {
// Match only internationalized pathnames
- matcher: ['/((?!_next|.*\\..*).*)']
-}
+ matcher: ["/((?!_next|.*\\..*).*)"],
+};
diff --git a/apps/website/next.config.js b/apps/website/next.config.js
index 5792410a3..e75eb1cba 100644
--- a/apps/website/next.config.js
+++ b/apps/website/next.config.js
@@ -1,15 +1,15 @@
-const createNextIntlPlugin = require('next-intl/plugin')
+const createNextIntlPlugin = require("next-intl/plugin");
-const withNextIntl = createNextIntlPlugin()
+const withNextIntl = createNextIntlPlugin();
/** @type {import('next').NextConfig} */
const nextConfig = {
- eslint: {
- ignoreDuringBuilds: true,
- },
- typescript: {
- ignoreBuildErrors: true,
- },
-}
+ eslint: {
+ ignoreDuringBuilds: true,
+ },
+ typescript: {
+ ignoreBuildErrors: true,
+ },
+};
-module.exports = withNextIntl(nextConfig)
+module.exports = withNextIntl(nextConfig);
diff --git a/apps/website/prettier.config.js b/apps/website/prettier.config.js
index c72d02994..59790a466 100644
--- a/apps/website/prettier.config.js
+++ b/apps/website/prettier.config.js
@@ -4,5 +4,5 @@ module.exports = {
semi: false,
tabWidth: 4,
useTabs: true,
- plugins: ['prettier-plugin-tailwindcss'],
-}
+ plugins: ["prettier-plugin-tailwindcss"],
+};