diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx index fe3fdef..56f571c 100644 --- a/apps/web/src/app/[locale]/layout.tsx +++ b/apps/web/src/app/[locale]/layout.tsx @@ -7,7 +7,6 @@ import { Providers } from "~/lib/providers/providers"; import { ImpersonatingBanner } from "~/modules/admin/users/user/impersonating-banner"; import { BaseLayout } from "~/modules/common/layout/base"; import { Toaster } from "~/modules/common/toast"; -import { BuyCtaDialog } from "~/modules/marketing/layout/buy-cta-dialog"; export function generateStaticParams() { return config.locales.map((locale) => ({ locale })); @@ -33,7 +32,6 @@ export default async function RootLayout({ {children} - diff --git a/apps/web/src/app/opengraph-image.png b/apps/web/src/app/opengraph-image.png index cea977e..c05dd70 100644 Binary files a/apps/web/src/app/opengraph-image.png and b/apps/web/src/app/opengraph-image.png differ diff --git a/apps/web/src/lib/metadata.ts b/apps/web/src/lib/metadata.ts index 981b69d..414d9e0 100644 --- a/apps/web/src/lib/metadata.ts +++ b/apps/web/src/lib/metadata.ts @@ -49,7 +49,7 @@ export const getMetadata = ( { title, - description = "common:product.description", + description = "Connect your Claude Code sessions to each other. Zero config. End-to-end encrypted. Peer mesh for Claude Code teams.", url, canonical, images = [DEFAULT_IMAGE], diff --git a/apps/web/src/modules/marketing/layout/buy-cta-dialog.tsx b/apps/web/src/modules/marketing/layout/buy-cta-dialog.tsx deleted file mode 100644 index ddd58b6..0000000 --- a/apps/web/src/modules/marketing/layout/buy-cta-dialog.tsx +++ /dev/null @@ -1,119 +0,0 @@ -"use client"; - -import { useEffect, useRef, useState } from "react"; - -import { useTranslation } from "@turbostarter/i18n"; -import { cn } from "@turbostarter/ui"; -import { buttonVariants } from "@turbostarter/ui-web/button"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@turbostarter/ui-web/dialog"; -import { Icons } from "@turbostarter/ui-web/icons"; - -const MIN_DELAY_MS = 15_000; -const STORAGE_LAST_SHOWN_AT = "buyCtaDialog:lastShownAt"; -const STORAGE_PREV_DELAY_MS = "buyCtaDialog:prevDelayMs"; - -export const BuyCtaDialog = () => { - const { t } = useTranslation(["common", "marketing"]); - - const [open, setOpen] = useState(false); - const timeoutIdRef = useRef(null); - - useEffect(() => { - const scheduleNext = () => { - const now = Date.now(); - const storedLastShown = Number( - window.localStorage.getItem(STORAGE_LAST_SHOWN_AT) ?? "0", - ); - const prevDelayMs = Number( - window.localStorage.getItem(STORAGE_PREV_DELAY_MS) ?? "0", - ); - - const nextDelay = Math.max( - MIN_DELAY_MS, - prevDelayMs ? prevDelayMs * 2 : MIN_DELAY_MS, - ); - - const baseNextShow = storedLastShown - ? storedLastShown + nextDelay - : now + nextDelay; - - const delayFromNow = Math.max(MIN_DELAY_MS, baseNextShow - now); - - if (timeoutIdRef.current) { - window.clearTimeout(timeoutIdRef.current); - } - - timeoutIdRef.current = window.setTimeout(() => { - setOpen(true); - - const shownAt = Date.now(); - window.localStorage.setItem(STORAGE_LAST_SHOWN_AT, String(shownAt)); - window.localStorage.setItem(STORAGE_PREV_DELAY_MS, String(nextDelay)); - - scheduleNext(); - }, delayFromNow); - }; - - scheduleNext(); - - return () => { - if (timeoutIdRef.current) { - window.clearTimeout(timeoutIdRef.current); - } - }; - }, []); - - return ( - - - - {t("cta.buy.question")} - - {t("cta.buy.description")} - - - - - - {t("cta.buy.button")} - - -
- - {t("or")} - -
- -
-

{t("cta.buy.join.description")}

- - - - - {t("cta.buy.join.button")} - - -
-
-
- ); -};