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 (
-
-
-
-
- {isSupabaseConnected &&
}
-
-
-
-
-
-
- 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 (
-
-
- {icon}
-
- {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 (
-
-
-
- {title}
-
-
- {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 (
-
-
-
-
- {isSupabaseConnected &&
}
-
-
-
-
-
-
- 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