├── src ├── db │ ├── schemas │ │ ├── index.ts │ │ └── users.ts │ └── index.ts ├── app │ ├── favicon.ico │ ├── opengraph-image.png │ ├── playground │ │ ├── _blocks │ │ │ ├── zustand │ │ │ │ ├── store.ts │ │ │ │ └── components.tsx │ │ │ ├── rate-limiter │ │ │ │ ├── actions.ts │ │ │ │ └── components.tsx │ │ │ ├── url-state │ │ │ │ └── components.tsx │ │ │ ├── email │ │ │ │ ├── actions.ts │ │ │ │ └── components.tsx │ │ │ ├── theme │ │ │ │ └── components.tsx │ │ │ ├── login │ │ │ │ ├── actions.ts │ │ │ │ └── components.tsx │ │ │ ├── metadata │ │ │ │ └── components.tsx │ │ │ └── form │ │ │ │ └── components.tsx │ │ └── page.tsx │ ├── error.tsx │ ├── page.tsx │ ├── layout.tsx │ ├── api │ │ ├── metadata │ │ │ └── route.ts │ │ └── callbacks │ │ │ ├── email │ │ │ └── route.ts │ │ │ └── google │ │ │ └── route.ts │ └── not-found.tsx ├── lib │ ├── validations.ts │ ├── utils.ts │ ├── supabase │ │ ├── client.ts │ │ └── server.ts │ ├── errors.ts │ └── rate-limit.ts ├── components │ ├── icons │ │ ├── spinner.tsx │ │ └── index.tsx │ ├── providers │ │ ├── theme.tsx │ │ └── index.tsx │ ├── ui │ │ ├── toaster.tsx │ │ ├── label.tsx │ │ ├── input.tsx │ │ ├── badge.tsx │ │ ├── shell.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ └── form.tsx │ ├── emails │ │ ├── test-email.tsx │ │ └── login-email.tsx │ └── sections │ │ └── hero.tsx ├── types │ └── index.ts ├── actions │ └── github.ts ├── hooks │ └── use-window.tsx ├── env.ts └── styles │ └── globals.css ├── postcss.config.mjs ├── .editorconfig ├── .env.example ├── next.config.mjs ├── drizzle.config.ts ├── components.json ├── .gitignore ├── tsconfig.json ├── package.json ├── tailwind.config.ts ├── README.md ├── biome.json └── pnpm-lock.yaml /src/db/schemas/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./users" 2 | -------------------------------------------------------------------------------- /src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sujjeee/starter/HEAD/src/app/favicon.ico -------------------------------------------------------------------------------- /src/app/opengraph-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sujjeee/starter/HEAD/src/app/opengraph-image.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | } 7 | 8 | export default config 9 | -------------------------------------------------------------------------------- /src/lib/validations.ts: -------------------------------------------------------------------------------- 1 | import * as z from "zod" 2 | 3 | export const emailSchema = z.object({ 4 | email: z.string().email({ 5 | message: "Please enter a valid email", 6 | }), 7 | }) 8 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /src/components/icons/spinner.tsx: -------------------------------------------------------------------------------- 1 | import { Icons } from "@/components/icons" 2 | 3 | export function Spinner() { 4 | return ( 5 |