diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/app/favicon.ico and /dev/null differ diff --git a/app/globals.css b/app/globals.css index 50bd9fc..0b46ea1 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,42 +1,76 @@ @tailwind base; @tailwind components; @tailwind utilities; - + @layer base { :root { - --background: 200 20% 98%; - --btn-background: 200 10% 91%; - --btn-background-hover: 200 10% 89%; - --foreground: 200 50% 3%; - } + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; - @media (prefers-color-scheme: dark) { - :root { - --background: 200 50% 3%; - --btn-background: 200 10% 9%; - --btn-background-hover: 200 10% 12%; - --foreground: 200 20% 96%; - } + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240 10% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 240 4.9% 83.9%; } } - + @layer base { * { - @apply border-foreground/20; + @apply border-border; } -} - -.animate-in { - animation: animateIn 0.3s ease 0.15s both; -} - -@keyframes animateIn { - from { - opacity: 0; - transform: translateY(10px); + body { + @apply bg-background text-foreground; } - to { - opacity: 1; - transform: translateY(0); - } -} +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 39e5666..536fade 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,8 +7,8 @@ const defaultUrl = process.env.VERCEL_URL export const metadata = { metadataBase: new URL(defaultUrl), - title: "Next.js and Supabase Starter Kit", - description: "The fastest way to build apps with Next.js and Supabase", + title: "Stan Runge", + description: "Stan Runge's Website", }; export default function RootLayout({ diff --git a/app/opengraph-image.png b/app/opengraph-image.png deleted file mode 100644 index 57595e6..0000000 Binary files a/app/opengraph-image.png and /dev/null differ diff --git a/app/page.tsx b/app/page.tsx index 5520816..5e563f2 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,9 +1,4 @@ -import DeployButton from "../components/DeployButton"; -import AuthButton from "../components/AuthButton"; import { createClient } from "@/utils/supabase/server"; -import ConnectSupabaseSteps from "@/components/ConnectSupabaseSteps"; -import SignUpUserSteps from "@/components/SignUpUserSteps"; -import Header from "@/components/Header"; import { cookies } from "next/headers"; export default async function Index() { @@ -22,36 +17,5 @@ export default async function Index() { const isSupabaseConnected = canInitSupabaseClient(); - return ( -
- - -
-
-
-

Next steps

- {isSupabaseConnected ? : } -
-
- - -
- ); + return <>; } diff --git a/app/twitter-image.png b/app/twitter-image.png deleted file mode 100644 index 57595e6..0000000 Binary files a/app/twitter-image.png and /dev/null differ diff --git a/components.json b/components.json new file mode 100644 index 0000000..db015dc --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "app/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/components/AuthButton.tsx b/components/AuthButton.tsx deleted file mode 100644 index ee9a333..0000000 --- a/components/AuthButton.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { createClient } from "@/utils/supabase/server"; -import Link from "next/link"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; - -export default async function AuthButton() { - const cookieStore = cookies(); - const supabase = createClient(cookieStore); - - const { - data: { user }, - } = await supabase.auth.getUser(); - - const signOut = async () => { - "use server"; - - const cookieStore = cookies(); - const supabase = createClient(cookieStore); - await supabase.auth.signOut(); - return redirect("/login"); - }; - - return user ? ( -
- Hey, {user.email}! -
- -
-
- ) : ( - - Login - - ); -} diff --git a/components/Code.tsx b/components/Code.tsx deleted file mode 100644 index f96d0cf..0000000 --- a/components/Code.tsx +++ /dev/null @@ -1,58 +0,0 @@ -"use client"; - -import { useState } from "react"; - -const CopyIcon = () => ( - - - - -); - -const CheckIcon = () => ( - - - -); - -export default function Code({ code }: { code: string }) { - const [icon, setIcon] = useState(CopyIcon); - - const copy = async () => { - await navigator?.clipboard?.writeText(code); - setIcon(CheckIcon); - setTimeout(() => setIcon(CopyIcon), 2000); - }; - - return ( -
-      
-      {code}
-    
- ); -} diff --git a/components/ConnectSupabaseSteps.tsx b/components/ConnectSupabaseSteps.tsx deleted file mode 100644 index 0493b8d..0000000 --- a/components/ConnectSupabaseSteps.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import Step from "./Step"; - -export default function ConnectSupabaseSteps() { - return ( -
    - -

    - Head over to{" "} - - database.new - {" "} - and create a new Supabase project. -

    -
    - - -

    - Rename the{" "} - - .env.example - {" "} - file in your Next.js app to{" "} - - .env.local - {" "} - and populate with values from{" "} - - your Supabase project's API Settings - - . -

    -
    - - -

    - You may need to quit your Next.js development server and run{" "} - - npm run dev - {" "} - again to load the new environment variables. -

    -
    - - -

    - You may need to refresh the page for Next.js to load the new - environment variables. -

    -
    -
- ); -} diff --git a/components/DeployButton.tsx b/components/DeployButton.tsx deleted file mode 100644 index c46d23f..0000000 --- a/components/DeployButton.tsx +++ /dev/null @@ -1,23 +0,0 @@ -export default function DeployButton() { - return ( - - - - - Deploy to Vercel - - ); -} diff --git a/components/Header.tsx b/components/Header.tsx deleted file mode 100644 index 9996d5d..0000000 --- a/components/Header.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import NextLogo from "./NextLogo"; -import SupabaseLogo from "./SupabaseLogo"; - -export default function Header() { - return ( -
-
- - - - - - - -
-

Supabase and Next.js Starter Template

-

- The fastest way to build apps with{" "} - - Supabase - {" "} - and{" "} - - Next.js - -

-
-
- ); -} diff --git a/components/NextLogo.tsx b/components/NextLogo.tsx deleted file mode 100644 index 1655582..0000000 --- a/components/NextLogo.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export default function NextLogo() { - return ( - - - - - - - - - - - ); -} diff --git a/components/SignUpUserSteps.tsx b/components/SignUpUserSteps.tsx deleted file mode 100644 index 954fced..0000000 --- a/components/SignUpUserSteps.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import Link from "next/link"; -import Step from "./Step"; -import Code from "@/components/Code"; - -const create = ` -create table notes ( - id serial primary key, - title text -); - -insert into notes(title) -values - ('Today I created a Supabase project.'), - ('I added some data and queried it from Next.js.'), - ('It was awesome!'); -`.trim(); - -const server = ` -import { createClient } from '@/utils/supabase/server' -import { cookies } from 'next/headers' - -export default async function Page() { - const cookieStore = cookies() - const supabase = createClient(cookieStore) - const { data: notes } = await supabase.from('notes').select() - - return
{JSON.stringify(notes, null, 2)}
-} -`.trim(); - -const client = ` -'use client' - -import { createClient } from '@/utils/supabase/client' -import { useEffect, useState } from 'react' - -export default function Page() { - const [notes, setNotes] = useState(null) - const supabase = createClient() - - useEffect(() => { - const getData = async () => { - const { data } = await supabase.from('notes').select() - setNotes(data) - } - getData() - }, []) - - return
{JSON.stringify(notes, null, 2)}
-} -`.trim(); - -export default function SignUpUserSteps() { - return ( -
    - -

    - Head over to the{" "} - - Login - {" "} - page and sign up your first user. It's okay if this is just you for - now. Your awesome idea will have plenty of users later! -

    -
    - - -

    - Head over to the{" "} - - Table Editor - {" "} - for your Supabase project to create a table and insert some example - data. If you're stuck for creativity, you can copy and paste the - following into the{" "} - - SQL Editor - {" "} - and click RUN! -

    - -
    - - -

    - To create a Supabase client and query data from an Async Server - Component, create a new page.tsx file at{" "} - - /app/notes/page.tsx - {" "} - and add the following. -

    - -

    Alternatively, you can use a Client Component.

    - -
    - - -

    You're ready to launch your product to the world! 🚀

    -
    -
- ); -} diff --git a/components/Step.tsx b/components/Step.tsx deleted file mode 100644 index cad86cf..0000000 --- a/components/Step.tsx +++ /dev/null @@ -1,24 +0,0 @@ -export default function Step({ - title, - children, -}: { - title: string; - children: React.ReactNode; -}) { - return ( -
  • - - -
    - {children} -
    -
  • - ); -} diff --git a/components/SupabaseLogo.tsx b/components/SupabaseLogo.tsx deleted file mode 100644 index 96a56a5..0000000 --- a/components/SupabaseLogo.tsx +++ /dev/null @@ -1,102 +0,0 @@ -export default function SupabaseLogo() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/stan-website/app/page.tsx b/stan-website/app/page.tsx deleted file mode 100644 index b596012..0000000 --- a/stan-website/app/page.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import DeployButton from "../../components/DeployButton"; -import AuthButton from "../../components/AuthButton"; -import { createClient } from "@/utils/supabase/server"; -import ConnectSupabaseSteps from "@/components/ConnectSupabaseSteps"; -import SignUpUserSteps from "@/components/SignUpUserSteps"; -import Header from "@/components/Header"; -import { cookies } from "next/headers"; - -export default async function Index() { - const cookieStore = cookies(); - - const canInitSupabaseClient = () => { - // This function is just for the interactive tutorial. - // Feel free to remove it once you have Supabase connected. - try { - createClient(cookieStore); - return true; - } catch (e) { - return false; - } - }; - - const isSupabaseConnected = canInitSupabaseClient(); - - return ( -
    - - -
    -
    -
    -

    Next steps

    - {isSupabaseConnected ? : } -
    -
    - - -
    - ); -} diff --git a/tailwind.config.js b/tailwind.config.js index 8c3a2ab..7cb7e37 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,20 +1,77 @@ /** @type {import('tailwindcss').Config} */ module.exports = { + darkMode: ["class"], content: [ - "./app/**/*.{js,ts,jsx,tsx,mdx}", - "./components/**/*.{js,ts,jsx,tsx,mdx}", + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', ], + prefix: "", theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, extend: { colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", background: "hsl(var(--background))", foreground: "hsl(var(--foreground))", - btn: { - background: "hsl(var(--btn-background))", - "background-hover": "hsl(var(--btn-background-hover))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", }, }, }, - plugins: [], -}; + plugins: [require("tailwindcss-animate")], +} \ No newline at end of file