60 | {page.title} 61 |
62 | {page.description && ( 63 |{page.description}
64 | )} 65 |67 |
{text}
} 17 |+180.1% from last month
20 |19 | {description} 20 |
21 |20 | {subtitle} 21 |
22 | ) : null} 23 |16 | Page not found. Back to{" "} 17 | 21 | Homepage 22 | 23 | . 24 |
25 |Enter your email to sign in to your account
26 | 27 |46 | {authors[username].name} 47 |
48 |49 | @{authors[username].twitter} 50 |
51 |{page.description}
64 | )} 65 |31 | You are an {user.role}. Back to{" "} 32 | 36 | Dashboard 37 | 38 |
39 |43 | {isCanceled 44 | ? "Your plan will be canceled on " 45 | : "Your plan renews on "} 46 | {formatDate(stripeCurrentPeriodEnd)}. 47 |
48 | ) : null} 49 | 50 | {isPaid && stripeCustomerId ? ( 51 |
39 | {JSON.stringify(data, null, 2)}
40 |
41 | ),
42 | });
43 | }
44 |
45 | return (
46 |
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/components/forms/newsletter-form.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { zodResolver } from "@hookform/resolvers/zod";
4 | import { useForm } from "react-hook-form";
5 | import { z } from "zod";
6 |
7 | import { Button } from "@/components/ui/button";
8 | import {
9 | Form,
10 | FormControl,
11 | FormField,
12 | FormItem,
13 | FormLabel,
14 | FormMessage,
15 | } from "@/components/ui/form";
16 | import { Input } from "@/components/ui/input";
17 | import { toast } from "@/components/ui/use-toast";
18 |
19 | const FormSchema = z.object({
20 | email: z.string().email({
21 | message: "Enter a valid email.",
22 | }),
23 | });
24 |
25 | export function NewsletterForm() {
26 | const form = useForm
39 | {JSON.stringify(data, null, 2)}
40 |
41 | ),
42 | });
43 | }
44 |
45 | return (
46 |
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/components/sections/testimonials.tsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 |
3 | import { testimonials } from "@/config/landing";
4 | import { HeaderSection } from "@/components/shared/header-section";
5 |
6 | export default function Testimonials() {
7 | return (
8 | 35 | {item.name} 36 |
37 |38 | {item.job} 39 |
40 |{item.review}43 |
25 | {data.description} 26 |
27 |24 | Enter your email and we'll send you instructions for creating a new password. 25 |
26 |Reset Password
30 | 31 | 32 |Don't have an account?
34 | 35 |36 | Sign up 37 |
38 | 39 |Address
22 |Where we should pick up your clothes
24 |Add more address details
28 | 29 | 30 | 33 | 34 | 35 | Continue 36 | 37 |59 | {data.description} 60 |
61 | )} 62 |72 | {formatDate(data.date)} 73 |
74 | )} 75 |33 | This is strictly for demo purposes - only your email and profile 34 | picture will be stored. 35 |
36 |39 | {feature.description} 40 |
41 | 42 |41 | Build your next project using Next.js 14, Prisma, Neon, Auth.js v5, 42 | Resend, React Email, Shadcn/ui, Stripe. 43 |
44 | 45 |75 | Star on GitHub{" "} 76 | {nFormatter(stars)} 77 |
78 | 79 |