fix(web): theme the auth layout with claudemesh design tokens
Some checks failed
CI / Tests / 🧪 Test (push) Has been cancelled
Some checks failed
CI / Tests / 🧪 Test (push) Has been cancelled
Auth routes (/login, /register, /forgot-password, /update-password, /join) were rendering with the default Geist fonts + shadcn neutral palette + turbostarter SVG logos — completely off-brand against the marketing landing. User reported from production. Rewire auth/layout.tsx to: - use --cm-bg / --cm-fg / --cm-clay tokens (dark #141413) - Anthropic Sans for UI, Anthropic Serif for the right-aside tagline - claudemesh wordmark (mesh glyph + serif) in place of Icons.Logo / Icons.LogoText - right aside: mesh glyph + serif tagline "Every Claude Code session, woven into one mesh." + description paragraph, matching the CTA copy from the landing - subtle orange radial glow on the aside for depth Inner form components (BetterAuth password/social buttons) pick up the tokens from globals.css, so the forms look native on the dark layout without per-component rewrites. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,35 +1,98 @@
|
|||||||
import { getTranslation } from "@turbostarter/i18n/server";
|
import Link from "next/link";
|
||||||
import { Icons } from "@turbostarter/ui-web/icons";
|
|
||||||
|
|
||||||
import { pathsConfig } from "~/config/paths";
|
export default function AuthLayout({
|
||||||
import { TurboLink } from "~/modules/common/turbo-link";
|
|
||||||
|
|
||||||
export default async function AuthLayout({
|
|
||||||
children,
|
children,
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
const { t } = await getTranslation({ ns: "common" });
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="grid h-full w-full flex-1 lg:grid-cols-2">
|
<main
|
||||||
<section className="flex h-full flex-col items-center justify-center p-6 lg:p-10">
|
className="grid min-h-screen w-full flex-1 bg-[var(--cm-bg)] text-[var(--cm-fg)] antialiased lg:grid-cols-2"
|
||||||
<header className="text-navy -mt-1 mb-auto flex self-start justify-self-start">
|
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||||
<TurboLink
|
>
|
||||||
href={pathsConfig.index}
|
<section className="relative flex h-full min-h-screen flex-col items-center justify-center px-6 py-10 lg:px-12">
|
||||||
className="flex shrink-0 items-center gap-3"
|
<header className="absolute left-6 top-6 lg:left-12 lg:top-10">
|
||||||
aria-label={t("home")}
|
<Link
|
||||||
|
href="/"
|
||||||
|
aria-label="claudemesh home"
|
||||||
|
className="group flex shrink-0 items-center gap-2.5"
|
||||||
>
|
>
|
||||||
<Icons.Logo className="text-primary h-8" />
|
<svg
|
||||||
<Icons.LogoText className="text-foreground h-4" />
|
width="22"
|
||||||
</TurboLink>
|
height="22"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
className="text-[var(--cm-clay)] transition-transform duration-300 group-hover:rotate-180"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="4" r="2" fill="currentColor" />
|
||||||
|
<circle cx="4" cy="12" r="2" fill="currentColor" />
|
||||||
|
<circle cx="20" cy="12" r="2" fill="currentColor" />
|
||||||
|
<circle cx="12" cy="20" r="2" fill="currentColor" />
|
||||||
|
<path
|
||||||
|
d="M12 4L4 12M12 4L20 12M4 12L12 20M20 12L12 20M4 12L20 12M12 4L12 20"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="1.2"
|
||||||
|
opacity="0.45"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<span
|
||||||
|
className="text-[17px] font-medium tracking-tight text-[var(--cm-fg)]"
|
||||||
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||||
|
>
|
||||||
|
claudemesh
|
||||||
|
</span>
|
||||||
|
</Link>
|
||||||
</header>
|
</header>
|
||||||
<div className="mt-16 mb-auto flex w-full max-w-md flex-col gap-6 pb-16">
|
<div className="flex w-full max-w-md flex-col gap-6">{children}</div>
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<aside className="bg-muted hidden flex-1 lg:block"></aside>
|
<aside
|
||||||
|
className="relative hidden overflow-hidden border-l border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] lg:block"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="absolute inset-0 opacity-[0.15]"
|
||||||
|
style={{
|
||||||
|
backgroundImage:
|
||||||
|
"radial-gradient(circle at 50% 50%, var(--cm-clay) 0%, transparent 60%)",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="relative flex h-full flex-col items-center justify-center px-10 py-16 text-center">
|
||||||
|
<svg
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
className="mb-8 text-[var(--cm-clay)]"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="4" r="2" fill="currentColor" />
|
||||||
|
<circle cx="4" cy="12" r="2" fill="currentColor" />
|
||||||
|
<circle cx="20" cy="12" r="2" fill="currentColor" />
|
||||||
|
<circle cx="12" cy="20" r="2" fill="currentColor" />
|
||||||
|
<path
|
||||||
|
d="M12 4L4 12M12 4L20 12M4 12L12 20M20 12L12 20M4 12L20 12M12 4L12 20"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="1.2"
|
||||||
|
opacity="0.45"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<h2
|
||||||
|
className="max-w-sm text-[clamp(1.75rem,3vw,2.25rem)] font-medium leading-[1.15] text-[var(--cm-fg)]"
|
||||||
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||||
|
>
|
||||||
|
Every Claude Code session,{" "}
|
||||||
|
<span className="italic text-[var(--cm-clay)]">
|
||||||
|
woven into one mesh.
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
<p
|
||||||
|
className="text-muted-foreground mt-6 max-w-sm text-[15px] leading-[1.6] text-[var(--cm-fg-secondary)]"
|
||||||
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||||
|
>
|
||||||
|
Connect every Claude Code session on your team into one live mesh.
|
||||||
|
Ship context, not screenshots.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
</main>
|
</main>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user