mirror of
https://github.com/better-auth/better-auth.git
synced 2026-05-22 14:21:55 -05:00
docs: add enterprise page and form for support (#6607)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
This commit is contained in:
@@ -32,4 +32,5 @@ vinxi
|
||||
giget
|
||||
segoe
|
||||
conar
|
||||
nuxtzzle
|
||||
nuxtzzle
|
||||
Deel
|
||||
@@ -1,4 +1,17 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { Resend } from "resend";
|
||||
|
||||
// Helper function to escape HTML entities
|
||||
function escapeHtml(text: string): string {
|
||||
const map: Record<string, string> = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">",
|
||||
'"': """,
|
||||
"'": "'",
|
||||
};
|
||||
return text.replace(/[&<>"']/g, (m) => map[m]);
|
||||
}
|
||||
|
||||
export async function POST(request: Request) {
|
||||
try {
|
||||
@@ -12,6 +25,8 @@ export async function POST(request: Request) {
|
||||
interest,
|
||||
features,
|
||||
additional,
|
||||
migrating,
|
||||
currentPlatform,
|
||||
} = body ?? {};
|
||||
|
||||
if (!name || !email) {
|
||||
@@ -20,34 +35,47 @@ export async function POST(request: Request) {
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
const payload = {
|
||||
name,
|
||||
email,
|
||||
company: company ?? "",
|
||||
website: website ?? "",
|
||||
userCount: userCount ?? "",
|
||||
interest: interest ?? "",
|
||||
features: features ?? "",
|
||||
additional: additional ?? "",
|
||||
submittedAt: new Date().toISOString(),
|
||||
userAgent: request.headers.get("user-agent") ?? undefined,
|
||||
referer: request.headers.get("referer") ?? undefined,
|
||||
};
|
||||
|
||||
const webhook = process.env.SUPPORT_WEBHOOK_URL;
|
||||
if (webhook) {
|
||||
const toEmail = process.env.SUPPORT_EMAIL;
|
||||
if (!toEmail) {
|
||||
return NextResponse.json(
|
||||
{ error: "Missing required fields" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
const resendApiKey = process.env.RESEND_API_KEY;
|
||||
if (resendApiKey) {
|
||||
try {
|
||||
await fetch(webhook, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(payload),
|
||||
const resend = new Resend(resendApiKey);
|
||||
await resend.emails.send({
|
||||
from: "Enterprise Support <enterprise@better-auth.com>",
|
||||
to: toEmail || "",
|
||||
subject: `${interest === "enterprise" ? "Enterprise" : "Support"} Inquiry from ${name}`,
|
||||
html: `
|
||||
<div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
|
||||
<h2 style="color: #18181b;">${interest === "enterprise" ? "Enterprise" : "Support"} Inquiry</h2>
|
||||
<div style="background: #f4f4f5; padding: 20px; border-radius: 8px; margin: 20px 0;">
|
||||
<p><strong>Name:</strong> ${escapeHtml(name)}</p>
|
||||
<p><strong>Email:</strong> ${escapeHtml(email)}</p>
|
||||
${company ? `<p><strong>Company:</strong> ${escapeHtml(company)}</p>` : ""}
|
||||
${website ? `<p><strong>Website:</strong> ${escapeHtml(website)}</p>` : ""}
|
||||
${userCount ? `<p><strong>User Count:</strong> ${escapeHtml(userCount)}</p>` : ""}
|
||||
${migrating ? `<p><strong>Migrating:</strong> ${migrating === "yes" ? "Yes" : "No"}</p>` : ""}
|
||||
${currentPlatform ? `<p><strong>Current Platform:</strong> ${escapeHtml(currentPlatform)}</p>` : ""}
|
||||
${interest ? `<p><strong>Interest:</strong> ${escapeHtml(interest)}</p>` : ""}
|
||||
${features ? `<p><strong>Features:</strong> ${escapeHtml(features)}</p>` : ""}
|
||||
${additional ? `<p><strong>Message:</strong><br/>${escapeHtml(additional).replace(/\n/g, "<br/>")}</p>` : ""}
|
||||
</div>
|
||||
<p style="color: #71717a; font-size: 12px;">
|
||||
Submitted: ${new Date().toLocaleString()}<br/>
|
||||
User Agent: ${escapeHtml(request.headers.get("user-agent") || "N/A")}<br/>
|
||||
Referer: ${escapeHtml(request.headers.get("referer") || "N/A")}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error("Support webhook failed", e);
|
||||
console.error("Resend email failed", e);
|
||||
}
|
||||
} else {
|
||||
console.log("[support] submission", payload);
|
||||
}
|
||||
|
||||
return NextResponse.json({ ok: true });
|
||||
|
||||
@@ -27,7 +27,7 @@ export default function Stats({
|
||||
<path
|
||||
fill="none"
|
||||
stroke="#ffffff"
|
||||
stroke-linecap="round"
|
||||
strokeLinecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M9 8a3 3 0 1 0 6 0M3 16.8V7.2c0-1.12 0-1.68.218-2.108c.192-.377.497-.682.874-.874C4.52 4 5.08 4 6.2 4h11.6c1.12 0 1.68 0 2.107.218c.377.192.683.497.875.874c.218.427.218.987.218 2.105v9.607c0 1.118 0 1.677-.218 2.104a2 2 0 0 1-.875.874c-.427.218-.986.218-2.104.218H6.197c-1.118 0-1.678 0-2.105-.218a2 2 0 0 1-.874-.874C3 18.48 3 17.92 3 16.8"
|
||||
@@ -57,7 +57,7 @@ export default function Stats({
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-gradient-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-linear-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
Discord
|
||||
</span>
|
||||
</div>
|
||||
@@ -71,7 +71,7 @@ export default function Stats({
|
||||
>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t-[1px] border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
>
|
||||
<span className="uppercase font-mono group-hover:text-black duration-300 dark:group-hover:text-white">
|
||||
Join Our Discord
|
||||
@@ -98,7 +98,7 @@ export default function Stats({
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-gradient-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-linear-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
Reddit
|
||||
</span>
|
||||
</div>
|
||||
@@ -111,7 +111,7 @@ export default function Stats({
|
||||
>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t-[1px] border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
>
|
||||
<span className="uppercase font-mono group-hover:text-black duration-300 dark:group-hover:text-white">
|
||||
Join Subreddit
|
||||
@@ -138,7 +138,7 @@ export default function Stats({
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-gradient-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
<span className="text-xl uppercase tracking-tighter font-bold font-mono bg-linear-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
Twitter
|
||||
</span>
|
||||
</div>
|
||||
@@ -151,7 +151,7 @@ export default function Stats({
|
||||
>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t-[1px] border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
>
|
||||
<span className="uppercase font-mono group-hover:text-black duration-300 dark:group-hover:text-white">
|
||||
Follow on 𝕏
|
||||
@@ -168,7 +168,7 @@ export default function Stats({
|
||||
<div className="flex md:flex-row flex-col w-full dark:[box-shadow:0_-20px_80px_-20px_#dfbf9f1f_inset]">
|
||||
<div className="w-full text-center border-r pt-5">
|
||||
<div className="relative p-3 ">
|
||||
<span className="text-[70px] tracking-tighter font-bold font-mono bg-gradient-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
<span className="text-[70px] tracking-tighter font-bold font-mono bg-linear-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
{kFormatter(npmDownloads)}
|
||||
</span>
|
||||
</div>
|
||||
@@ -181,7 +181,7 @@ export default function Stats({
|
||||
>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t-[1px] border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
@@ -210,7 +210,7 @@ export default function Stats({
|
||||
|
||||
<div className="w-full text-center pt-5">
|
||||
<div className="relative p-3">
|
||||
<span className="text-[70px] tracking-tighter font-bold font-mono bg-gradient-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
<span className="text-[70px] tracking-tighter font-bold font-mono bg-linear-to-b dark:from-stone-200 dark:via-stone-400 dark:to-stone-700 bg-clip-text text-transparent drop-shadow-[0_0_10px_rgba(255,255,255,0.1)] from-stone-800 via-stone-600 to-stone-400">
|
||||
{kFormatter(githubStars)}
|
||||
</span>
|
||||
</div>
|
||||
@@ -223,7 +223,7 @@ export default function Stats({
|
||||
>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t-[1px] border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
className="group duration-500 cursor-pointer text-gray-400 flex items-center gap-2 text-md hover:bg-transparent border-l-input/50 border-r-input/50 md:border-r-0 md:border-l-0 border-t border-t-input py-7 w-full hover:text-black dark:hover:text-white"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
265
docs/app/enterprise/_components/enterprise-form.tsx
Normal file
265
docs/app/enterprise/_components/enterprise-form.tsx
Normal file
@@ -0,0 +1,265 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
import { Grid } from "@/components/blocks/features";
|
||||
import { Button } from "@/components/ui/button";
|
||||
|
||||
export function EnterpriseForm() {
|
||||
const [formData, setFormData] = useState({
|
||||
name: "",
|
||||
email: "",
|
||||
company: "",
|
||||
userCount: "",
|
||||
migrating: "",
|
||||
currentPlatform: "",
|
||||
additional: "",
|
||||
});
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const [submitStatus, setSubmitStatus] = useState<
|
||||
"idle" | "success" | "error"
|
||||
>("idle");
|
||||
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
setIsSubmitting(true);
|
||||
|
||||
try {
|
||||
const response = await fetch("/api/support", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...formData,
|
||||
interest: "enterprise",
|
||||
}),
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
setSubmitStatus("success");
|
||||
setFormData({
|
||||
name: "",
|
||||
email: "",
|
||||
company: "",
|
||||
userCount: "",
|
||||
migrating: "",
|
||||
currentPlatform: "",
|
||||
additional: "",
|
||||
});
|
||||
} else {
|
||||
setSubmitStatus("error");
|
||||
}
|
||||
} catch (error) {
|
||||
setSubmitStatus("error");
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
setTimeout(() => setSubmitStatus("idle"), 5000);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="relative bg-gradient-to-b from-zinc-50 to-white dark:from-zinc-950 dark:to-zinc-950 border-2 border-zinc-200 dark:border-zinc-800 shadow-[0_0_50px_-15px_rgba(0,0,0,0.1)] dark:shadow-[0_0_50px_-15px_rgba(255,255,255,0.05)] w-full max-w-xl overflow-hidden">
|
||||
<Grid size={20} />
|
||||
<div className="absolute top-0 left-0 w-full h-px bg-gradient-to-r from-transparent via-zinc-300 dark:via-zinc-700 to-transparent"></div>
|
||||
<div className="relative z-10 p-4 md:p-5">
|
||||
<div className="mb-3">
|
||||
<h2 className="text-lg md:text-xl font-bold text-zinc-900 dark:text-white mb-1">
|
||||
Get in touch
|
||||
</h2>
|
||||
<p className="text-xs text-zinc-600 dark:text-zinc-400">
|
||||
Fill out the form and we'll be in touch soon
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{submitStatus === "success" && (
|
||||
<div className="mb-6 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 text-green-800 dark:text-green-200 text-sm">
|
||||
Thank you! We'll be in touch soon.
|
||||
</div>
|
||||
)}
|
||||
|
||||
{submitStatus === "error" && (
|
||||
<div className="mb-6 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 text-red-800 dark:text-red-200 text-sm">
|
||||
Something went wrong. Please try again.
|
||||
</div>
|
||||
)}
|
||||
|
||||
<form onSubmit={handleSubmit} className="space-y-2.5">
|
||||
<div>
|
||||
<label
|
||||
htmlFor="name"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
Full name
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="name"
|
||||
required
|
||||
value={formData.name}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, name: e.target.value })
|
||||
}
|
||||
placeholder="Your name"
|
||||
className="w-full px-4 py-2 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-900 dark:focus:ring-zinc-400 focus:border-transparent transition-all text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label
|
||||
htmlFor="company"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
Company
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="company"
|
||||
required
|
||||
value={formData.company}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, company: e.target.value })
|
||||
}
|
||||
placeholder="Company name"
|
||||
className="w-full px-4 py-2 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-900 dark:focus:ring-zinc-400 focus:border-transparent transition-all text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label
|
||||
htmlFor="email"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
Company email
|
||||
</label>
|
||||
<input
|
||||
type="email"
|
||||
id="email"
|
||||
required
|
||||
value={formData.email}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, email: e.target.value })
|
||||
}
|
||||
placeholder="name@email.com"
|
||||
className="w-full px-4 py-2 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-900 dark:focus:ring-zinc-400 focus:border-transparent transition-all text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label
|
||||
htmlFor="userCount"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
Expected user count
|
||||
</label>
|
||||
<select
|
||||
id="userCount"
|
||||
value={formData.userCount}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, userCount: e.target.value })
|
||||
}
|
||||
className="w-full px-4 py-2 pr-10 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white focus:outline-none focus:border-zinc-400 dark:focus:border-zinc-600 transition-all text-sm appearance-none bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 fill=%27none%27 viewBox=%270 0 20 20%27%3E%3Cpath stroke=%27%2371717a%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%271.5%27 d=%27m6 8 4 4 4-4%27/%3E%3C/svg%3E')] bg-[length:1.25rem] bg-[right_0.5rem_center] bg-no-repeat"
|
||||
>
|
||||
<option value="">Select range</option>
|
||||
<option value="1-1000">1-1,000 users</option>
|
||||
<option value="1000-10000">1,000-10,000 users</option>
|
||||
<option value="10000-100000">10,000-100,000 users</option>
|
||||
<option value="100000-1000000">100,000-1M users</option>
|
||||
<option value="1000000+">1M+ users</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2">
|
||||
Are you migrating from another platform?
|
||||
</label>
|
||||
<div className="flex gap-4">
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="migrating"
|
||||
value="yes"
|
||||
checked={formData.migrating === "yes"}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, migrating: e.target.value })
|
||||
}
|
||||
className="w-4 h-4 text-zinc-900 dark:text-white border-zinc-300 dark:border-zinc-700 focus:ring-0"
|
||||
/>
|
||||
<span className="text-sm text-zinc-700 dark:text-zinc-300">
|
||||
Yes
|
||||
</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="migrating"
|
||||
value="no"
|
||||
checked={formData.migrating === "no"}
|
||||
onChange={(e) => {
|
||||
setFormData({
|
||||
...formData,
|
||||
migrating: e.target.value,
|
||||
currentPlatform: "",
|
||||
});
|
||||
}}
|
||||
className="w-4 h-4 text-zinc-900 dark:text-white border-zinc-300 dark:border-zinc-700 focus:ring-0"
|
||||
/>
|
||||
<span className="text-sm text-zinc-700 dark:text-zinc-300">
|
||||
No
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{formData.migrating === "yes" && (
|
||||
<div>
|
||||
<label
|
||||
htmlFor="currentPlatform"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
Which platform are you currently using?
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="currentPlatform"
|
||||
value={formData.currentPlatform}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, currentPlatform: e.target.value })
|
||||
}
|
||||
placeholder="e.g., Auth0, Clerk, Supabase Auth"
|
||||
className="w-full px-4 py-2 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-900 dark:focus:ring-zinc-400 focus:border-transparent transition-all text-sm"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div>
|
||||
<label
|
||||
htmlFor="additional"
|
||||
className="block text-sm font-medium text-zinc-700 dark:text-zinc-300 mb-2"
|
||||
>
|
||||
What problem are you trying to solve?
|
||||
</label>
|
||||
<textarea
|
||||
id="additional"
|
||||
required
|
||||
rows={2}
|
||||
value={formData.additional}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, additional: e.target.value })
|
||||
}
|
||||
placeholder="We need help with..."
|
||||
className="w-full px-4 py-2 bg-white dark:bg-zinc-900 border border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-900 dark:focus:ring-zinc-400 focus:border-transparent transition-all resize-none text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
disabled={isSubmitting}
|
||||
className="w-full hover:shadow-sm dark:border-stone-100 dark:hover:shadow-sm border-2 border-black bg-white px-6 py-3 text-sm uppercase text-black shadow-[1px_1px_rgba(0,0,0),2px_2px_rgba(0,0,0),3px_3px_rgba(0,0,0),4px_4px_rgba(0,0,0),5px_5px_0px_0px_rgba(0,0,0)] transition duration-200 dark:shadow-[1px_1px_rgba(255,255,255),2px_2px_rgba(255,255,255),3px_3px_rgba(255,255,255),4px_4px_rgba(255,255,255),5px_5px_0px_0px_rgba(255,255,255)] disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{isSubmitting ? "Sending..." : "Send"}
|
||||
</Button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
193
docs/app/enterprise/_components/enterprise-hero.tsx
Normal file
193
docs/app/enterprise/_components/enterprise-hero.tsx
Normal file
@@ -0,0 +1,193 @@
|
||||
"use client";
|
||||
|
||||
import {
|
||||
Tooltip,
|
||||
TooltipContent,
|
||||
TooltipTrigger,
|
||||
} from "@/components/ui/tooltip";
|
||||
|
||||
export function EnterpriseHero() {
|
||||
return (
|
||||
<div className="max-w-xl">
|
||||
<div className="space-y-2 xl:space-y-3 text-center xl:text-left">
|
||||
<h1 className="text-3xl sm:text-4xl md:text-5xl tracking-tight text-zinc-900 dark:text-white">
|
||||
<span className="block sm:inline">BETTER AUTH</span>{" "}
|
||||
<span className="relative inline-block">
|
||||
<span className="relative z-10 font-extralight">ENTERPRISE</span>
|
||||
<span className="absolute bottom-0.5 sm:bottom-1 left-0 w-full h-1.5 sm:h-2 bg-zinc-200 dark:bg-zinc-800"></span>
|
||||
</span>
|
||||
</h1>
|
||||
<p className="text-sm sm:text-base md:text-lg text-zinc-600 dark:text-zinc-400 leading-snug tracking-tight">
|
||||
Get direct support from the Better Auth team and deploy Better Auth
|
||||
securely inside your organization.
|
||||
</p>
|
||||
|
||||
{/* Trusted By Section */}
|
||||
<div className="pt-6 border-t border-zinc-200 dark:border-zinc-800">
|
||||
<p className="text-xs text-zinc-600 dark:text-zinc-400 mb-1 text-center xl:text-left">
|
||||
Trusted by teams at
|
||||
</p>
|
||||
<div className="flex flex-wrap items-center justify-center xl:justify-start gap-6 md:gap-4 opacity-60 text-zinc-900 dark:text-white">
|
||||
{/* OpenAI */}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<a
|
||||
href="https://openai.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-block cursor-pointer hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1.3em"
|
||||
height="1.3em"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="m14.805 10.432l.375-.65zm-8.162-5.32l-.65-.374zm6.18-1.656l.375-.65zm2.463.46v-.75zm4.525 4.525h.75zm.832 2.363l.65-.375zm-1.656 6.182l.375.65zm-1.63 1.901l.65.375zm-6.18 1.657l-.375.65zm-2.463-.46v.75zM4.19 15.559h-.75zm-.832-2.363l-.65.375zm1.656-6.18l-.375-.65zm10.117-.01l.374-.65l-.374-.216l-.376.216zm2.76 5.207h.75v-.433l-.375-.216zM9.195 6.817l-.375-.65a.75.75 0 0 0-.375.65zm5.61 10.364l.375.65a.75.75 0 0 0 .375-.65zm-5.845-.134l-.375.649a.75.75 0 0 0 .75 0zM6.11 11.89h-.75a.75.75 0 0 0 .374.65zM12 8.812l-.375.65l2.805 1.62l.375-.65l.375-.65l-2.805-1.62zm2.805 1.62h-.75v3.24h1.5v-3.24zm0 3.24l-.375-.65l-2.805 1.62l.375.65l.375.649l2.805-1.62zM12 15.292l.375-.65l-2.805-1.62l-.375.65l-.375.65l2.805 1.619zm-2.805-1.62h.75v-3.24h-1.5v3.24zm0-3.24l.375.65l2.805-1.62l-.375-.65l-.375-.65l-2.805 1.62zm-2.552-5.32l.65.376a3.775 3.775 0 0 1 5.155-1.382l.375-.65l.375-.65a5.275 5.275 0 0 0-7.205 1.932zm6.18-1.656l-.375.65q.441.256.786.603l.53-.53l.53-.53a5.3 5.3 0 0 0-1.096-.842zm.941.723l.252.706a3.8 3.8 0 0 1 1.27-.219v-1.5c-.621 0-1.219.108-1.774.307zm1.522-.263v.75a3.775 3.775 0 0 1 3.775 3.775h1.5a5.275 5.275 0 0 0-5.275-5.275zm4.525 4.525h-.75q-.002.511-.13.983l.724.194l.724.195a5.3 5.3 0 0 0 .182-1.372zm-.156 1.177l-.486.572c.321.272.602.603.825.99l.65-.376l.649-.375a5.3 5.3 0 0 0-1.152-1.382zm.988 1.186l-.65.375a3.775 3.775 0 0 1-1.381 5.157l.375.65l.375.65a5.275 5.275 0 0 0 1.93-7.207zm-1.656 6.182l-.375-.65c-.293.17-.6.293-.916.377l.194.725l.194.725c.435-.117.866-.29 1.277-.528zm-1.097.452l-.738-.135a3.8 3.8 0 0 1-.444 1.21l.65.374l.649.375c.31-.538.515-1.11.62-1.69zm-.533 1.45l-.65-.376a3.775 3.775 0 0 1-5.155 1.382l-.375.65l-.375.65a5.275 5.275 0 0 0 7.205-1.932zm-6.18 1.656l.375-.65a3.8 3.8 0 0 1-.787-.604l-.53.53l-.532.53c.32.32.688.606 1.099.843zm-.943-.724l-.252-.706a3.8 3.8 0 0 1-1.268.22v1.5a5.3 5.3 0 0 0 1.772-.308zm-1.52.264v-.75a3.775 3.775 0 0 1-3.775-3.775h-1.5a5.275 5.275 0 0 0 5.275 5.275zM4.19 15.559h.75q.001-.512.13-.983l-.725-.194l-.724-.195a5.3 5.3 0 0 0-.18 1.372zm.155-1.177l.486-.572c-.32-.272-.6-.603-.823-.99l-.65.376l-.65.375c.31.537.703 1 1.151 1.382zm-.987-1.186l.65-.375a3.774 3.774 0 0 1 1.38-5.156l-.374-.65l-.375-.65a5.274 5.274 0 0 0-1.93 7.206zm1.656-6.18l.375.649a3.8 3.8 0 0 1 .915-.38l-.194-.724l-.194-.725a5.3 5.3 0 0 0-1.277.53zm1.096-.455l.738.135c.075-.413.222-.821.445-1.208l-.649-.375l-.65-.375a5.3 5.3 0 0 0-.622 1.688zM12 8.812l.375.65l1.565-.903l1.565-.904l-.376-.65l-.374-.649l-1.565.903l-1.565.904zm2.805 1.62l-.375.65l3.085 1.78l.375-.649l.375-.65l-3.085-1.78zm3.085 7.006h.75v-5.225h-1.5v5.225zm-8.695-7.006h.75V6.817h-1.5v3.615zm5.61 3.24h-.75v3.509h1.5v-3.51zM12 15.292l-.375-.65l-3.04 1.755l.375.65l.375.649l3.04-1.755zM6.11 6.56h-.75v5.33h1.5V6.56zm3.085 7.11l.375-.649l-3.086-1.781l-.375.65l-.375.649L8.82 14.32zm5.935-6.665l-.376.65l4.526 2.612l.375-.65l.375-.65l-4.526-2.612zm-5.935-.189l.375.65l4.57-2.639l-.376-.65l-.375-.649l-4.57 2.639zm1.04 13.003l.374.65l4.571-2.64l-.375-.65l-.375-.649l-4.57 2.64zm-5.89-5.438l-.376.65l4.616 2.664l.375-.65l.375-.649l-4.616-2.665z"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<p>OpenAI</p>
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
{/* Google Labs */}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<a
|
||||
href="https://labs.google"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-block cursor-pointer hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<svg
|
||||
xmlns="https://www.w3.org/2000/svg"
|
||||
width="1.3em"
|
||||
viewBox="0 0 18 18"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
d="M17.1778 13.7607L12.0833 5.96232C11.7775 5.50541 11.6077 4.98344 11.6077 4.46125V1.29615H12.0153C12.355 1.29615 12.6266 1.03506 12.6266 0.708906C12.6266 0.415179 12.3548 0.154297 12.0153 0.154297H5.96984C5.63013 0.154297 5.39255 0.415388 5.39255 0.708906C5.39255 1.03527 5.63035 1.29615 5.96984 1.29615H6.37749V4.46125C6.37749 4.98323 6.20764 5.50541 5.93587 5.96232L0.807364 13.7607C-0.0756596 15.2618 1.04516 17.1543 2.87915 17.1543H15.1402C16.9402 17.1543 18.095 15.2618 17.178 13.7607H17.1778ZM6.30933 12.1946C5.29042 12.4883 3.28658 12.162 3.93181 11.1831L6.92059 6.5822C7.32824 5.92968 7.56582 5.21168 7.56582 4.46125V1.29615H10.4527V4.46125C10.4527 5.21168 10.6565 5.92968 11.0639 6.5822L12.796 9.25776C13.1018 9.71467 12.6262 9.94291 12.2527 9.97555C9.53569 10.1714 8.55053 11.5743 6.30911 12.1944L6.30933 12.1946Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<p>Google Labs</p>
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
{/* Vercel */}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<a
|
||||
href="https://vercel.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-block cursor-pointer hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<svg
|
||||
width="1.3em"
|
||||
height="1.3em"
|
||||
viewBox="0 0 76 65"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M37.5274 0L75.0548 65H0L37.5274 0Z"
|
||||
fill="#ffffff"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<p>Vercel</p>
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
{/* Databricks */}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<a
|
||||
href="https://databricks.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-block cursor-pointer hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1.3em"
|
||||
height="1.3em"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M.95 14.184L12 20.403l9.919-5.55v2.21L12 22.662l-10.484-5.96l-.565.308v.77L12 24l11.05-6.218v-4.317l-.515-.309L12 19.118l-9.867-5.653v-2.21L12 16.805l11.05-6.218V6.32l-.515-.308L12 11.974L2.647 6.681L12 1.388l7.76 4.368l.668-.411v-.566L12 0L.95 6.27v.72L12 13.207l9.919-5.55v2.26L12 15.52L1.516 9.56l-.565.308Z"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<p>Databricks</p>
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
{/* Deel */}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<a
|
||||
href="https://deel.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-block cursor-pointer hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="3em"
|
||||
height="3em"
|
||||
viewBox="0 0 78 27"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Hug">
|
||||
<g id="Vector">
|
||||
<path
|
||||
d="M32.9309 26.3952C30.9274 26.3952 29.1412 26.009 27.5722 25.2366C26.0032 24.4642 24.7601 23.3417 23.8428 21.8693C22.9497 20.3727 22.5031 18.5986 22.5031 16.5468C22.5031 14.3985 22.9376 12.5036 23.8066 10.8622C24.6756 9.22083 25.8825 7.95357 27.4274 7.06045C28.9963 6.1432 30.7946 5.68457 32.8223 5.68457C34.9223 5.68457 36.6844 6.1432 38.1086 7.06045C39.5327 7.95357 40.5948 9.24497 41.2948 10.9347C42.019 12.6243 42.369 14.6278 42.3448 16.9451H24.4945V13.5778H39.5568L37.4206 15.1709C37.4206 13.9881 37.2516 12.9502 36.9137 12.0571C36.5999 11.164 36.093 10.4519 35.393 9.92084C34.7171 9.3898 33.8602 9.12428 32.8223 9.12428C31.7602 9.12428 30.8308 9.41394 30.0343 9.99326C29.2377 10.5726 28.6222 11.4174 28.1877 12.5278C27.7532 13.6381 27.536 14.9416 27.536 16.4382C27.536 17.7658 27.7653 18.9124 28.2239 19.8779C28.7067 20.8434 29.3584 21.5796 30.1791 22.0865C31.024 22.5693 31.9533 22.8107 32.9671 22.8107C34.3671 22.8107 35.5258 22.4366 36.443 21.6883C37.3844 20.9158 38.0723 19.9503 38.5068 18.7917L42.5983 21.2538C41.4396 22.9917 40.0275 24.2831 38.362 25.128C36.7206 25.9728 34.9102 26.3952 32.9309 26.3952Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M54.2042 26.3952C52.2007 26.3952 50.4145 26.009 48.8455 25.2366C47.2765 24.4642 46.0334 23.3417 45.1161 21.8693C44.223 20.3727 43.7764 18.5986 43.7764 16.5468C43.7764 14.3985 44.2109 12.5036 45.0799 10.8622C45.9489 9.22083 47.1558 7.95357 48.7006 7.06045C50.2696 6.1432 52.0679 5.68457 54.0956 5.68457C56.1956 5.68457 57.9577 6.1432 59.3818 7.06045C60.806 7.95357 61.8681 9.24497 62.5681 10.9347C63.2922 12.6243 63.6423 14.6278 63.6181 16.9451H45.7678V13.5778H60.8301L58.6939 15.1709C58.6939 13.9881 58.5249 12.9502 58.187 12.0571C57.8732 11.164 57.3663 10.4519 56.6663 9.92084C55.9904 9.3898 55.1335 9.12428 54.0956 9.12428C53.0335 9.12428 52.1041 9.41394 51.3076 9.99326C50.511 10.5726 49.8955 11.4174 49.461 12.5278C49.0265 13.6381 48.8093 14.9416 48.8093 16.4382C48.8093 17.7658 49.0386 18.9124 49.4972 19.8779C49.98 20.8434 50.6317 21.5796 51.4524 22.0865C52.2972 22.5693 53.2266 22.8107 54.2404 22.8107C55.6404 22.8107 56.799 22.4366 57.7163 21.6883C58.6577 20.9158 59.3456 19.9503 59.7801 18.7917L63.8716 21.2538C62.7129 22.9917 61.3008 24.2831 59.6353 25.128C57.9939 25.9728 56.1835 26.3952 54.2042 26.3952Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M65.2308 0H70.0826V21.1814C70.0826 22.8952 70.167 24.4642 70.336 25.8883H65.2308V0Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M0 16.0536C0 8.88282 4.57742 5.69628 9.59667 5.69628C14.1776 5.69628 16.1093 8.60687 16.1093 8.60687V0.00960845H21.0708V21.1967C21.0708 22.9359 21.1306 24.5052 21.252 25.9046H16.1109V23.5265C16.1109 23.5265 14.1423 26.411 9.59829 26.411C4.75405 26.411 0 23.6312 0 16.0536ZM10.8639 22.604C14.3778 22.604 16.6497 19.9295 16.6497 16.0536C16.6497 12.0422 14.3762 9.5032 10.8639 9.5032C7.35158 9.5032 5.16209 11.9168 5.16209 16.0536C5.16209 20.1904 7.4438 22.604 10.8639 22.604Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</g>
|
||||
<path
|
||||
id="."
|
||||
d="M73.2188 21.2539H77.9981V25.8885H73.2188V21.2539Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<p>Deel</p>
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
72
docs/app/enterprise/page.tsx
Normal file
72
docs/app/enterprise/page.tsx
Normal file
@@ -0,0 +1,72 @@
|
||||
import Section from "@/components/landing/section";
|
||||
import { EnterpriseForm } from "./_components/enterprise-form";
|
||||
import { EnterpriseHero } from "./_components/enterprise-hero";
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
const baseUrl = process.env.NEXT_PUBLIC_URL || process.env.VERCEL_URL;
|
||||
const ogImage = `${
|
||||
baseUrl?.startsWith("http") ? baseUrl : `https://${baseUrl}`
|
||||
}/enterprise.png`;
|
||||
|
||||
return {
|
||||
title: "Enterprise | Better Auth",
|
||||
description:
|
||||
"Get direct support from the Better Auth team and deploy Better Auth securely inside your organization.",
|
||||
openGraph: {
|
||||
title: "Enterprise | Better Auth",
|
||||
description:
|
||||
"Get direct support from the Better Auth team and deploy Better Auth securely inside your organization.",
|
||||
images: [
|
||||
{
|
||||
url: ogImage,
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: "Better Auth Community",
|
||||
},
|
||||
],
|
||||
url: `${
|
||||
baseUrl?.startsWith("http") ? baseUrl : `https://${baseUrl}`
|
||||
}/enterprise`,
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Enterprise | Better Auth",
|
||||
description:
|
||||
"Get direct support from the Better Auth team and deploy Better Auth securely inside your organization.",
|
||||
images: [ogImage],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default function EnterprisePage() {
|
||||
return (
|
||||
<main className="h-min mx-auto overflow-x-hidden">
|
||||
<Section
|
||||
className="mb-1 overflow-hidden"
|
||||
crosses
|
||||
crossesOffset="lg:translate-y-[5.25rem]"
|
||||
customPaddings
|
||||
id="enterprise"
|
||||
>
|
||||
<section className=" bg-white/96 dark:bg-black/96 antialiased min-h-screen overflow-y-auto">
|
||||
<div className="absolute inset-0 left-5 right-5 lg:left-16 lg:right-14 xl:left-16 xl:right-14">
|
||||
<div className="absolute inset-0 bg-grid text-muted/50 dark:text-white/2" />
|
||||
<div className="absolute inset-0 bg-linear-to-b from-transparent via-transparent to-background" />
|
||||
</div>
|
||||
|
||||
<div className="z-10 max-w-5xl mx-auto px-4 py-12 md:py-16 flex items-center min-h-[95vh]">
|
||||
<div className="grid grid-cols-1 xl:grid-cols-2 gap-3 md:gap-10 items-center w-full">
|
||||
<div className="flex items-center justify-center xl:justify-start z-10">
|
||||
<EnterpriseHero />
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-center">
|
||||
<EnterpriseForm />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</Section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -87,7 +87,7 @@
|
||||
}
|
||||
|
||||
@theme inline {
|
||||
--breakpoint-navbar: 56rem;
|
||||
--breakpoint-navbar: 74rem;
|
||||
--color-background: var(--background);
|
||||
--color-foreground: var(--foreground);
|
||||
--color-card: var(--card);
|
||||
|
||||
@@ -10,7 +10,7 @@ import { NavbarMobile, NavbarMobileBtn } from "./nav-mobile";
|
||||
|
||||
export const navMenu = [
|
||||
{
|
||||
name: "helo_",
|
||||
name: "_hello",
|
||||
path: "/",
|
||||
},
|
||||
{
|
||||
@@ -106,6 +106,9 @@ export const Navbar = () => {
|
||||
{menu.name}
|
||||
</NavLink>
|
||||
))}
|
||||
<NavLink href="/enterprise" className="relative bg-muted/30">
|
||||
enterprise
|
||||
</NavLink>
|
||||
<NavLink
|
||||
href="https://github.com/better-auth/better-auth"
|
||||
className="bg-muted/20"
|
||||
|
||||
@@ -212,7 +212,7 @@ export const navMenu: {
|
||||
}[];
|
||||
}[] = [
|
||||
{
|
||||
name: "_helo",
|
||||
name: "hello_",
|
||||
path: "/",
|
||||
},
|
||||
|
||||
@@ -236,4 +236,8 @@ export const navMenu: {
|
||||
name: "community",
|
||||
path: "/community",
|
||||
},
|
||||
{
|
||||
name: "enterprise",
|
||||
path: "/enterprise",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -23,7 +23,7 @@ export function ThemeToggle(props: ComponentProps<typeof Button>) {
|
||||
aria-label="Toggle Theme"
|
||||
{...props}
|
||||
className={cn(
|
||||
"flex shrink-0 navbar:w-[3.56rem] navbar:h-14 navbar:border-l navbar:text-muted-foreground max-navbar:-mr-1.5 max-navbar:hover:bg-transparent ",
|
||||
"flex shrink-0 navbar:w-[3.56rem] navbar:h-14 navbar:border-l navbar:text-muted-foreground max-navbar:-mr-1.5 max-navbar:hover:bg-transparent ",
|
||||
props.className,
|
||||
)}
|
||||
>
|
||||
@@ -155,7 +155,7 @@ export function ThemeToggle(props: ComponentProps<typeof Button>) {
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 24 24"
|
||||
className="hidden dark:block size-6"
|
||||
className="hidden dark:block size-5 navbar:size-6"
|
||||
>
|
||||
<path
|
||||
fill="currentColor"
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
"recharts": "^3.1.2",
|
||||
"rehype-highlight": "^7.0.2",
|
||||
"remark": "^15.0.1",
|
||||
"resend": "^4.0.1",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"remark-mdx": "^3.1.1",
|
||||
"remark-rehype": "^11.1.2",
|
||||
|
||||
BIN
docs/public/enterprise.png
Normal file
BIN
docs/public/enterprise.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 674 KiB |
33
pnpm-lock.yaml
generated
33
pnpm-lock.yaml
generated
@@ -805,6 +805,9 @@ importers:
|
||||
remark-stringify:
|
||||
specifier: ^11.0.0
|
||||
version: 11.0.0
|
||||
resend:
|
||||
specifier: ^4.0.1
|
||||
version: 4.8.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
|
||||
shiki:
|
||||
specifier: ^3.13.0
|
||||
version: 3.13.0
|
||||
@@ -5309,6 +5312,13 @@ packages:
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/render@1.1.2':
|
||||
resolution: {integrity: sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
react-dom: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/render@1.2.1':
|
||||
resolution: {integrity: sha512-7M4Xi8ITESZKS7pOPE0HWhKJWtS/JrAqPIyFPqIPJXZJHkjFMYXn2b/tAsHOufYW5/LTk4U1IkBMaVwE06kykw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -12324,6 +12334,10 @@ packages:
|
||||
reselect@5.1.1:
|
||||
resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
|
||||
|
||||
resend@4.8.0:
|
||||
resolution: {integrity: sha512-R8eBOFQDO6dzRTDmaMEdpqrkmgSjPpVXt4nGfWsZdYOet0kqra0xgbvTES6HmCriZEXbmGk3e0DiGIaLFTFSHA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
resend@6.0.2:
|
||||
resolution: {integrity: sha512-um08qWpSVvEVqAePEy/bsa7pqtnJK+qTCZ0Et7YE7xuqM46J0C9gnSbIJKR3LIcRVMgO9jUeot8rH0UI84eqMQ==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -18220,6 +18234,14 @@ snapshots:
|
||||
dependencies:
|
||||
react: 19.2.1
|
||||
|
||||
'@react-email/render@1.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
|
||||
dependencies:
|
||||
html-to-text: 9.0.5
|
||||
prettier: 3.6.2
|
||||
react: 19.2.1
|
||||
react-dom: 19.2.1(react@19.2.1)
|
||||
react-promise-suspense: 0.3.4
|
||||
|
||||
'@react-email/render@1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
|
||||
dependencies:
|
||||
html-to-text: 9.0.5
|
||||
@@ -22521,8 +22543,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
fast-deep-equal@2.0.1:
|
||||
optional: true
|
||||
fast-deep-equal@2.0.1: {}
|
||||
|
||||
fast-deep-equal@3.1.3: {}
|
||||
|
||||
@@ -26553,7 +26574,6 @@ snapshots:
|
||||
react-promise-suspense@0.3.4:
|
||||
dependencies:
|
||||
fast-deep-equal: 2.0.1
|
||||
optional: true
|
||||
|
||||
react-qr-code@2.0.18(react@19.2.1):
|
||||
dependencies:
|
||||
@@ -26880,6 +26900,13 @@ snapshots:
|
||||
|
||||
reselect@5.1.1: {}
|
||||
|
||||
resend@4.8.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
|
||||
dependencies:
|
||||
'@react-email/render': 1.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
|
||||
transitivePeerDependencies:
|
||||
- react
|
||||
- react-dom
|
||||
|
||||
resend@6.0.2(@react-email/render@1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)):
|
||||
optionalDependencies:
|
||||
'@react-email/render': 1.2.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
|
||||
|
||||
Reference in New Issue
Block a user