Initialized repository for project Composting capitalism website

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
This commit is contained in:
v0 2025-10-12 01:19:19 +00:00
commit 72a889117a
28 changed files with 4360 additions and 0 deletions

27
.gitignore vendored Normal file
View File

@ -0,0 +1,27 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
# next.js
/.next/
/out/
# production
/build
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

30
README.md Normal file
View File

@ -0,0 +1,30 @@
# Composting capitalism website
*Automatically synced with your [v0.app](https://v0.app) deployments*
[![Deployed on Vercel](https://img.shields.io/badge/Deployed%20on-Vercel-black?style=for-the-badge&logo=vercel)](https://vercel.com/jeff-emmetts-projects/v0-composting-capitalism-website)
[![Built with v0](https://img.shields.io/badge/Built%20with-v0.app-black?style=for-the-badge)](https://v0.app/chat/projects/iJavQwdtvxQ)
## Overview
This repository will stay in sync with your deployed chats on [v0.app](https://v0.app).
Any changes you make to your deployed app will be automatically pushed to this repository from [v0.app](https://v0.app).
## Deployment
Your project is live at:
**[https://vercel.com/jeff-emmetts-projects/v0-composting-capitalism-website](https://vercel.com/jeff-emmetts-projects/v0-composting-capitalism-website)**
## Build your app
Continue building your app on:
**[https://v0.app/chat/projects/iJavQwdtvxQ](https://v0.app/chat/projects/iJavQwdtvxQ)**
## How It Works
1. Create and modify your project using [v0.app](https://v0.app)
2. Deploy your chats from the v0 interface
3. Changes are automatically pushed to this repository
4. Vercel deploys the latest version from this repository

147
app/globals.css Normal file
View File

@ -0,0 +1,147 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
/* Updated to rich brown earthy palette inspired by soil, compost, and mushrooms */
--background: oklch(0.95 0.02 60);
--foreground: oklch(0.25 0.04 50);
--card: oklch(0.97 0.015 55);
--card-foreground: oklch(0.25 0.04 50);
--popover: oklch(0.97 0.015 55);
--popover-foreground: oklch(0.25 0.04 50);
--primary: oklch(0.35 0.06 45);
--primary-foreground: oklch(0.98 0.01 60);
--secondary: oklch(0.88 0.03 55);
--secondary-foreground: oklch(0.3 0.05 50);
--muted: oklch(0.9 0.025 58);
--muted-foreground: oklch(0.5 0.04 52);
--accent: oklch(0.85 0.04 50);
--accent-foreground: oklch(0.3 0.05 48);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.98 0.01 60);
--border: oklch(0.85 0.03 55);
--input: oklch(0.85 0.03 55);
--ring: oklch(0.45 0.05 48);
--chart-1: oklch(0.55 0.08 45);
--chart-2: oklch(0.48 0.06 35);
--chart-3: oklch(0.65 0.07 55);
--chart-4: oklch(0.42 0.05 40);
--chart-5: oklch(0.7 0.06 60);
--radius: 0.625rem;
--sidebar: oklch(0.96 0.02 58);
--sidebar-foreground: oklch(0.25 0.04 50);
--sidebar-primary: oklch(0.35 0.06 45);
--sidebar-primary-foreground: oklch(0.98 0.01 60);
--sidebar-accent: oklch(0.88 0.03 55);
--sidebar-accent-foreground: oklch(0.3 0.05 50);
--sidebar-border: oklch(0.85 0.03 55);
--sidebar-ring: oklch(0.45 0.05 48);
/* Adding section-specific background colors for visual variety */
--section-light: oklch(0.96 0.015 58);
--section-dark: oklch(0.82 0.04 48);
--section-decay: oklch(0.88 0.035 45);
--section-growth: oklch(0.9 0.04 85);
--section-network: oklch(0.93 0.025 52);
}
.dark {
/* Updated dark mode to deep brown/soil tones */
--background: oklch(0.2 0.03 45);
--foreground: oklch(0.95 0.015 55);
--card: oklch(0.22 0.03 48);
--card-foreground: oklch(0.95 0.015 55);
--popover: oklch(0.22 0.03 48);
--popover-foreground: oklch(0.95 0.015 55);
--primary: oklch(0.75 0.05 55);
--primary-foreground: oklch(0.25 0.04 45);
--secondary: oklch(0.32 0.04 50);
--secondary-foreground: oklch(0.95 0.015 55);
--muted: oklch(0.3 0.035 48);
--muted-foreground: oklch(0.65 0.03 52);
--accent: oklch(0.38 0.045 52);
--accent-foreground: oklch(0.95 0.015 55);
--destructive: oklch(0.5 0.18 30);
--destructive-foreground: oklch(0.95 0.015 55);
--border: oklch(0.32 0.04 50);
--input: oklch(0.32 0.04 50);
--ring: oklch(0.55 0.05 52);
--chart-1: oklch(0.6 0.08 50);
--chart-2: oklch(0.52 0.06 40);
--chart-3: oklch(0.7 0.07 58);
--chart-4: oklch(0.48 0.05 45);
--chart-5: oklch(0.75 0.06 62);
--sidebar: oklch(0.24 0.035 47);
--sidebar-foreground: oklch(0.95 0.015 55);
--sidebar-primary: oklch(0.75 0.05 55);
--sidebar-primary-foreground: oklch(0.25 0.04 45);
--sidebar-accent: oklch(0.32 0.04 50);
--sidebar-accent-foreground: oklch(0.95 0.015 55);
--sidebar-border: oklch(0.32 0.04 50);
--sidebar-ring: oklch(0.55 0.05 52);
/* Dark mode section colors */
--section-light: oklch(0.24 0.035 47);
--section-dark: oklch(0.18 0.04 42);
--section-decay: oklch(0.21 0.038 44);
--section-growth: oklch(0.23 0.04 75);
--section-network: oklch(0.22 0.035 48);
}
@theme inline {
/* optional: --font-sans, --font-serif, --font-mono if they are applied in the layout.tsx */
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
/* Adding section color utilities */
--color-section-light: var(--section-light);
--color-section-dark: var(--section-dark);
--color-section-decay: var(--section-decay);
--color-section-growth: var(--section-growth);
--color-section-network: var(--section-network);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

29
app/layout.tsx Normal file
View File

@ -0,0 +1,29 @@
import type React from "react"
import type { Metadata } from "next"
import { GeistSans } from "geist/font/sans"
import { GeistMono } from "geist/font/mono"
import { Analytics } from "@vercel/analytics/next"
import { Suspense } from "react"
import "./globals.css"
export const metadata: Metadata = {
title: "Composting Capitalism | Decomposing Extractive Systems",
description:
"Exploring how we can decompose the excesses of capitalism and cultivate regenerative systems that work for the many, not the few.",
generator: "v0.app",
}
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
return (
<html lang="en">
<body className={`font-sans ${GeistSans.variable} ${GeistMono.variable} antialiased`}>
<Suspense fallback={null}>{children}</Suspense>
<Analytics />
</body>
</html>
)
}

19
app/page.tsx Normal file
View File

@ -0,0 +1,19 @@
import { Hero } from "@/components/hero"
import { MushroomMetaphor } from "@/components/mushroom-metaphor"
import { ZombifiedInstitutions } from "@/components/zombified-institutions"
import { ResourcesForChange } from "@/components/resources-for-change"
import { NetworkLinks } from "@/components/network-links"
import { Footer } from "@/components/footer"
export default function Home() {
return (
<main className="min-h-screen">
<Hero />
<MushroomMetaphor />
<ZombifiedInstitutions />
<ResourcesForChange />
<NetworkLinks />
<Footer />
</main>
)
}

21
components.json Normal file
View File

@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

50
components/footer.tsx Normal file
View File

@ -0,0 +1,50 @@
export function Footer() {
return (
<footer className="py-12 bg-muted/50 border-t">
<div className="container mx-auto px-4">
<div className="max-w-4xl mx-auto space-y-8">
<div className="text-center space-y-4">
<h3 className="text-2xl font-bold">Composting Capitalism</h3>
<p className="text-muted-foreground leading-relaxed max-w-2xl mx-auto">
A project exploring how we can transform extractive systems into regenerative ones one mycelial
connection at a time.
</p>
</div>
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center text-sm text-muted-foreground">
<a
href="https://mycofi.earth"
target="_blank"
rel="noopener noreferrer"
className="hover:text-foreground transition-colors"
>
MycoFi.earth
</a>
<span className="hidden sm:inline"></span>
<a
href="https://post-appitalism.app"
target="_blank"
rel="noopener noreferrer"
className="hover:text-foreground transition-colors"
>
Post-Appitalism.app
</a>
<span className="hidden sm:inline"></span>
<a
href="https://book.mycofi.earth"
target="_blank"
rel="noopener noreferrer"
className="hover:text-foreground transition-colors"
>
MycoFi Book
</a>
</div>
<div className="text-center text-sm text-muted-foreground">
<p>🍄 Cultivating regenerative futures 🍄</p>
</div>
</div>
</div>
</footer>
)
}

59
components/hero.tsx Normal file
View File

@ -0,0 +1,59 @@
import { Button } from "@/components/ui/button"
import { ArrowDown } from "lucide-react"
export function Hero() {
return (
<section className="relative min-h-screen flex items-center justify-center overflow-hidden">
<div className="absolute inset-0">
<img
src="/images/mycelium-soil.jpg"
alt="Mycelium growing through soil"
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-gradient-to-b from-black/60 via-black/50 to-black/70" />
</div>
<div className="container mx-auto px-4 py-20 relative z-10">
<div className="max-w-5xl mx-auto text-center space-y-8">
<h1
className="text-6xl md:text-8xl lg:text-9xl font-bold tracking-tight text-balance text-white"
style={{ textShadow: "0 0 40px rgba(0,0,0,0.8), 0 0 80px rgba(0,0,0,0.6), 0 4px 20px rgba(0,0,0,0.9)" }}
>
Composting
<span className="block text-amber-200 mt-2">Capitalism</span>
</h1>
<p className="text-xl md:text-2xl text-white/95 max-w-3xl mx-auto text-balance leading-relaxed">
What if we treated capitalism like organic matterbreaking down its extractive excesses to nourish
regenerative systems that work for the many, not the few?
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center pt-8">
<Button size="lg" className="text-lg px-8 py-6" asChild>
<a href="https://links.mycofi.earth" target="_blank" rel="noopener noreferrer">
Explore the Mycelium
</a>
</Button>
<Button
size="lg"
variant="outline"
className="text-lg px-8 py-6 bg-[oklch(0.75_0.06_60)]/90 hover:bg-[oklch(0.75_0.06_60)] border-[oklch(0.65_0.08_55)]"
asChild
>
<a href="https://discord.com/invite/mFxSXCrfrN" target="_blank" rel="noopener noreferrer">
Join the Network
</a>
</Button>
</div>
<div className="pt-12 animate-bounce">
<ArrowDown className="w-8 h-8 mx-auto text-white/70" />
</div>
</div>
</div>
{/* Decorative mushroom illustration placeholder */}
<div className="absolute bottom-0 left-0 right-0 h-32 bg-gradient-to-t from-background to-transparent z-10" />
</section>
)
}

View File

@ -0,0 +1,63 @@
import { Card } from "@/components/ui/card"
export function MushroomMetaphor() {
return (
<section className="py-24 bg-[var(--color-section-light)]">
<div className="container mx-auto px-4">
<div className="max-w-4xl mx-auto space-y-12">
<div className="text-center space-y-4">
<h2 className="text-4xl md:text-5xl font-bold text-balance">The Mycelial Method</h2>
<p className="text-xl text-muted-foreground text-balance leading-relaxed">
Mushrooms don't destroythey transform. They break down dead matter and return nutrients to the soil,
enabling new life to flourish.
</p>
</div>
<div className="grid md:grid-cols-3 gap-6">
<Card className="p-6 space-y-4 hover:shadow-lg transition-shadow">
<div className="w-16 h-16 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<span className="text-3xl">🍄</span>
</div>
<h3 className="text-2xl font-bold">Decomposition</h3>
<p className="text-muted-foreground leading-relaxed">
Mushrooms excel at breaking down complex organic mattereven toxins. They don't fight the old, they
digest it.
</p>
</Card>
<Card className="p-6 space-y-4 hover:shadow-lg transition-shadow">
<div className="w-16 h-16 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<span className="text-3xl">🕸</span>
</div>
<h3 className="text-2xl font-bold">Network Building</h3>
<p className="text-muted-foreground leading-relaxed">
Mycelial networks connect entire forests, sharing resources and information across vast distances
underground.
</p>
</Card>
<Card className="p-6 space-y-4 hover:shadow-lg transition-shadow">
<div className="w-16 h-16 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<span className="text-3xl">🌱</span>
</div>
<h3 className="text-2xl font-bold">Regeneration</h3>
<p className="text-muted-foreground leading-relaxed">
From decay comes fertility. Mushrooms create the conditions for new growth, transforming death into
life.
</p>
</Card>
</div>
<div className="bg-card p-8 rounded-lg border space-y-4">
<h3 className="text-2xl font-bold">The Metaphor Applied</h3>
<p className="text-lg text-muted-foreground leading-relaxed">
Just as mushrooms decompose fallen trees, we can decompose extractive capitalism breaking down
monopolies, dissolving concentrations of wealth, and transforming zombie institutions into nutrients for
regenerative economies. We don't need to burn it all down. We need to compost it.
</p>
</div>
</div>
</div>
</section>
)
}

View File

@ -0,0 +1,99 @@
import { Button } from "@/components/ui/button"
import { Card } from "@/components/ui/card"
import { ExternalLink } from "lucide-react"
export function NetworkLinks() {
return (
<section className="py-24 bg-[var(--color-section-network)]">
<div className="container mx-auto px-4">
<div className="max-w-4xl mx-auto space-y-12">
<div className="text-center space-y-4">
<h2 className="text-4xl md:text-5xl font-bold text-balance">The Mycelial Network</h2>
<p className="text-xl text-muted-foreground text-balance leading-relaxed">
Like mushrooms, we're stronger when connected. Explore related projects in the regenerative economy
ecosystem.
</p>
</div>
<div className="grid md:grid-cols-2 gap-6">
<Card className="p-8 space-y-4 hover:shadow-lg transition-shadow border-2 border-primary/20">
<div className="flex items-start justify-between">
<div className="space-y-2">
<h3 className="text-2xl font-bold">Post-Appitalism</h3>
<p className="text-muted-foreground leading-relaxed">
Exploring what comes after the app economybuilding digital tools that serve communities, not
shareholders.
</p>
</div>
</div>
<Button asChild className="w-full">
<a href="https://post-appitalism.app" target="_blank" rel="noopener noreferrer">
Visit Post-Appitalism
<ExternalLink className="ml-2 w-4 h-4" />
</a>
</Button>
</Card>
<Card className="p-8 space-y-4 hover:shadow-lg transition-shadow border-2 border-primary/20">
<div className="flex items-start justify-between">
<div className="space-y-2">
<h3 className="text-2xl font-bold">MycoFi</h3>
<p className="text-muted-foreground leading-relaxed">
Mycelial financereimagining economic systems through the lens of fungal networks and regenerative
principles.
</p>
</div>
</div>
<Button asChild className="w-full">
<a href="https://mycofi.earth" target="_blank" rel="noopener noreferrer">
Explore MycoFi
<ExternalLink className="ml-2 w-4 h-4" />
</a>
</Button>
</Card>
<Card className="p-8 space-y-4 hover:shadow-lg transition-shadow border-2 border-primary/20">
<div className="flex items-start justify-between">
<div className="space-y-2">
<h3 className="text-2xl font-bold">MycoFi Book</h3>
<p className="text-muted-foreground leading-relaxed">
Dive deeper into the theory and practice of mycelial economics and how fungal networks inspire new
models.
</p>
</div>
</div>
<Button asChild className="w-full">
<a href="https://book.mycofi.earth" target="_blank" rel="noopener noreferrer">
Read the Book
<ExternalLink className="ml-2 w-4 h-4" />
</a>
</Button>
</Card>
<Card className="p-8 space-y-4 hover:shadow-lg transition-shadow border-2 border-primary/20">
<div className="flex items-start justify-between">
<div className="space-y-2">
<h3 className="text-2xl font-bold">Permaculture Currencies</h3>
<p className="text-muted-foreground leading-relaxed">
Exploring mycoeconomics and permaculture currencieshow regenerative principles can reshape our
understanding of value and exchange.
</p>
</div>
</div>
<Button asChild className="w-full">
<a
href="https://allthingsdecent.substack.com/p/mycoeconomics-and-permaculture-currencies"
target="_blank"
rel="noopener noreferrer"
>
Read the Article
<ExternalLink className="ml-2 w-4 h-4" />
</a>
</Button>
</Card>
</div>
</div>
</div>
</section>
)
}

View File

@ -0,0 +1,76 @@
import { Card } from "@/components/ui/card"
import { Coins, Eye, Heart } from "lucide-react"
export function ResourcesForChange() {
return (
<section className="py-24 bg-[var(--color-section-growth)]">
<div className="container mx-auto px-4">
<div className="max-w-5xl mx-auto space-y-12">
<div className="text-center space-y-4">
<h2 className="text-4xl md:text-5xl font-bold text-balance">Resources for Regeneration</h2>
<p className="text-xl text-muted-foreground text-balance leading-relaxed">
What can we redirect from extractive systems toward regenerative ones?
</p>
</div>
<div className="grid md:grid-cols-3 gap-8">
<Card className="p-8 space-y-6 text-center hover:shadow-lg transition-shadow">
<div className="w-20 h-20 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<Coins className="w-10 h-10 text-primary" />
</div>
<h3 className="text-3xl font-bold">Capital</h3>
<p className="text-muted-foreground leading-relaxed">
Money is trapped in outdated instruments that perpetuate the status quo. Imagine what we could
accomplish together, if we made a livable future investable?
</p>
</Card>
<Card className="p-8 space-y-6 text-center hover:shadow-lg transition-shadow">
<div className="w-20 h-20 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<Eye className="w-10 h-10 text-primary" />
</div>
<h3 className="text-3xl font-bold">Attention</h3>
<p className="text-muted-foreground leading-relaxed">
Our collective focus, harvested by algorithms and sold to advertisers. What if we directed it toward
mutual aid, skill-sharing, and building alternatives?
</p>
</Card>
<Card className="p-8 space-y-6 text-center hover:shadow-lg transition-shadow">
<div className="w-20 h-20 rounded-full bg-primary/10 flex items-center justify-center mx-auto">
<Heart className="w-10 h-10 text-primary" />
</div>
<h3 className="text-3xl font-bold">Care</h3>
<p className="text-muted-foreground leading-relaxed">
The invisible labor that sustains lifeundervalued and exploited. What if care work was recognized,
compensated, and centered in our economic systems?
</p>
</Card>
</div>
<div className="bg-card p-8 rounded-lg border space-y-6">
<h3 className="text-2xl font-bold text-center">The Composting Process</h3>
<div className="space-y-4 text-muted-foreground leading-relaxed">
<p>
<strong className="text-foreground">1. Identify the dead matter:</strong> Which institutions, practices,
and beliefs are already decomposing? Where is the rot most visible?
</p>
<p>
<strong className="text-foreground">2. Introduce the decomposers:</strong> Worker cooperatives, mutual
aid networks, commons-based governance, regenerative practices.
</p>
<p>
<strong className="text-foreground">3. Create the right conditions:</strong> Moisture (solidarity),
oxygen (transparency), warmth (community), and time (patience).
</p>
<p>
<strong className="text-foreground">4. Harvest the nutrients:</strong> Redirect capital, attention, and
care toward systems that serve life, not extraction.
</p>
</div>
</div>
</div>
</div>
</section>
)
}

View File

@ -0,0 +1,11 @@
'use client'
import * as React from 'react'
import {
ThemeProvider as NextThemesProvider,
type ThemeProviderProps,
} from 'next-themes'
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}

60
components/ui/button.tsx Normal file
View File

@ -0,0 +1,60 @@
import * as React from 'react'
import { Slot } from '@radix-ui/react-slot'
import { cva, type VariantProps } from 'class-variance-authority'
import { cn } from '@/lib/utils'
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive:
'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
outline:
'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
secondary:
'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost:
'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
link: 'text-primary underline-offset-4 hover:underline',
},
size: {
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',
lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
icon: 'size-9',
'icon-sm': 'size-8',
'icon-lg': 'size-10',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
},
)
function Button({
className,
variant,
size,
asChild = false,
...props
}: React.ComponentProps<'button'> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean
}) {
const Comp = asChild ? Slot : 'button'
return (
<Comp
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
)
}
export { Button, buttonVariants }

92
components/ui/card.tsx Normal file
View File

@ -0,0 +1,92 @@
import * as React from 'react'
import { cn } from '@/lib/utils'
function Card({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card"
className={cn(
'bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm',
className,
)}
{...props}
/>
)
}
function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-header"
className={cn(
'@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6',
className,
)}
{...props}
/>
)
}
function CardTitle({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-title"
className={cn('leading-none font-semibold', className)}
{...props}
/>
)
}
function CardDescription({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-description"
className={cn('text-muted-foreground text-sm', className)}
{...props}
/>
)
}
function CardAction({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-action"
className={cn(
'col-start-2 row-span-2 row-start-1 self-start justify-self-end',
className,
)}
{...props}
/>
)
}
function CardContent({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-content"
className={cn('px-6', className)}
{...props}
/>
)
}
function CardFooter({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="card-footer"
className={cn('flex items-center px-6 [.border-t]:pt-6', className)}
{...props}
/>
)
}
export {
Card,
CardHeader,
CardFooter,
CardTitle,
CardAction,
CardDescription,
CardContent,
}

View File

@ -0,0 +1,66 @@
import { Card } from "@/components/ui/card"
import { Building2, Landmark, Factory, TrendingDown } from "lucide-react"
export function ZombifiedInstitutions() {
const institutions = [
{
icon: Building2,
title: "Corporate Monopolies",
description: "Extracting value while producing little, sustained by regulatory capture and market manipulation.",
examples: "Tech giants, pharmaceutical cartels, private equity vultures",
},
{
icon: Landmark,
title: "Financialized Everything",
description: "When housing, healthcare, and education become investment vehicles instead of human rights.",
examples: "Rent-seeking landlords, student debt profiteers, insurance gatekeepers",
},
{
icon: Factory,
title: "Extractive Industries",
description: "Depleting resources, externalizing costs, and leaving communities with the cleanup bill.",
examples: "Fossil fuel companies, industrial agriculture, fast fashion empires",
},
{
icon: TrendingDown,
title: "Zombie Growth Imperative",
description: "The endless demand for growth on a finite planet, sustained by debt and delusion.",
examples: "Quarterly earnings obsession, GDP worship, infinite growth mythology",
},
]
return (
<section className="py-24 bg-[var(--color-section-decay)]">
<div className="container mx-auto px-4">
<div className="max-w-6xl mx-auto space-y-12">
<div className="text-center space-y-4">
<h2 className="text-4xl md:text-5xl font-bold text-balance">Zombified Institutions</h2>
<p className="text-xl text-muted-foreground max-w-3xl mx-auto text-balance leading-relaxed">
These systems are already deadthey just don't know it yet. They shamble forward, consuming resources and
attention while producing little of value for the living.
</p>
</div>
<div className="grid md:grid-cols-2 gap-6">
{institutions.map((institution, index) => (
<Card key={index} className="p-8 space-y-4 hover:shadow-lg transition-shadow border-2">
<institution.icon className="w-12 h-12 text-primary" />
<h3 className="text-2xl font-bold">{institution.title}</h3>
<p className="text-muted-foreground leading-relaxed">{institution.description}</p>
<p className="text-sm text-muted-foreground italic">Examples: {institution.examples}</p>
</Card>
))}
</div>
<div className="bg-accent/10 border-2 border-accent p-8 rounded-lg">
<p className="text-lg text-center leading-relaxed">
<strong className="text-accent-foreground">The good news?</strong> Dead matter is exactly what mushrooms
need. These zombie institutions are ripe for decompositionwe just need to cultivate the right conditions
for transformation.
</p>
</div>
</div>
</div>
</section>
)
}

6
lib/utils.ts Normal file
View File

@ -0,0 +1,6 @@
import { clsx, type ClassValue } from 'clsx'
import { twMerge } from 'tailwind-merge'
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}

14
next.config.mjs Normal file
View File

@ -0,0 +1,14 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},
images: {
unoptimized: true,
},
}
export default nextConfig

74
package.json Normal file
View File

@ -0,0 +1,74 @@
{
"name": "my-v0-project",
"version": "0.1.0",
"private": true,
"scripts": {
"build": "next build",
"dev": "next dev",
"lint": "next lint",
"start": "next start"
},
"dependencies": {
"@hookform/resolvers": "^3.10.0",
"@radix-ui/react-accordion": "1.2.2",
"@radix-ui/react-alert-dialog": "1.1.4",
"@radix-ui/react-aspect-ratio": "1.1.1",
"@radix-ui/react-avatar": "1.1.2",
"@radix-ui/react-checkbox": "1.1.3",
"@radix-ui/react-collapsible": "1.1.2",
"@radix-ui/react-context-menu": "2.2.4",
"@radix-ui/react-dialog": "1.1.4",
"@radix-ui/react-dropdown-menu": "2.1.4",
"@radix-ui/react-hover-card": "1.1.4",
"@radix-ui/react-label": "2.1.1",
"@radix-ui/react-menubar": "1.1.4",
"@radix-ui/react-navigation-menu": "1.2.3",
"@radix-ui/react-popover": "1.1.4",
"@radix-ui/react-progress": "1.1.1",
"@radix-ui/react-radio-group": "1.2.2",
"@radix-ui/react-scroll-area": "1.2.2",
"@radix-ui/react-select": "2.1.4",
"@radix-ui/react-separator": "1.1.1",
"@radix-ui/react-slider": "1.2.2",
"@radix-ui/react-slot": "1.1.1",
"@radix-ui/react-switch": "1.1.2",
"@radix-ui/react-tabs": "1.1.2",
"@radix-ui/react-toast": "1.2.4",
"@radix-ui/react-toggle": "1.1.1",
"@radix-ui/react-toggle-group": "1.1.1",
"@radix-ui/react-tooltip": "1.1.6",
"@vercel/analytics": "latest",
"autoprefixer": "^10.4.20",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "1.0.4",
"date-fns": "4.1.0",
"embla-carousel-react": "8.5.1",
"geist": "latest",
"input-otp": "1.4.1",
"lucide-react": "^0.454.0",
"next": "15.2.4",
"next-themes": "^0.4.6",
"react": "^19",
"react-day-picker": "9.8.0",
"react-dom": "^19",
"react-hook-form": "^7.60.0",
"react-resizable-panels": "^2.1.7",
"recharts": "2.15.4",
"sonner": "^1.7.4",
"tailwind-merge": "^2.5.5",
"tailwindcss-animate": "^1.0.7",
"vaul": "^0.9.9",
"zod": "3.25.67"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.9",
"@types/node": "^22",
"@types/react": "^19",
"@types/react-dom": "^19",
"postcss": "^8.5",
"tailwindcss": "^4.1.9",
"tw-animate-css": "1.3.3",
"typescript": "^5"
}
}

3255
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

8
postcss.config.mjs Normal file
View File

@ -0,0 +1,8 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
'@tailwindcss/postcss': {},
},
}
export default config

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

BIN
public/placeholder-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="215" height="48" fill="none"><path fill="#000" d="M57.588 9.6h6L73.828 38h-5.2l-2.36-6.88h-11.36L52.548 38h-5.2l10.24-28.4Zm7.16 17.16-4.16-12.16-4.16 12.16h8.32Zm23.694-2.24c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.486-7.72.12 3.4c.534-1.227 1.307-2.173 2.32-2.84 1.04-.693 2.267-1.04 3.68-1.04 1.494 0 2.76.387 3.8 1.16 1.067.747 1.827 1.813 2.28 3.2.507-1.44 1.294-2.52 2.36-3.24 1.094-.747 2.414-1.12 3.96-1.12 1.414 0 2.64.307 3.68.92s1.84 1.52 2.4 2.72c.56 1.2.84 2.667.84 4.4V38h-4.96V25.92c0-1.813-.293-3.187-.88-4.12-.56-.96-1.413-1.44-2.56-1.44-.906 0-1.68.213-2.32.64-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.84-.48 3.04V38h-4.56V25.92c0-1.2-.133-2.213-.4-3.04-.24-.827-.626-1.453-1.16-1.88-.506-.427-1.133-.64-1.88-.64-.906 0-1.68.227-2.32.68-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.827-.48 3V38h-4.96V16.8h4.48Zm26.723 10.6c0-2.24.427-4.187 1.28-5.84.854-1.68 2.067-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.84 0 3.494.413 4.96 1.24 1.467.827 2.64 2.08 3.52 3.76.88 1.653 1.347 3.693 1.4 6.12v1.32h-15.08c.107 1.813.614 3.227 1.52 4.24.907.987 2.134 1.48 3.68 1.48.987 0 1.88-.253 2.68-.76a4.803 4.803 0 0 0 1.84-2.2l5.08.36c-.64 2.027-1.84 3.64-3.6 4.84-1.733 1.173-3.733 1.76-6 1.76-2.08 0-3.906-.453-5.48-1.36-1.573-.907-2.786-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84Zm15.16-2.04c-.213-1.733-.76-3.013-1.64-3.84-.853-.827-1.893-1.24-3.12-1.24-1.44 0-2.6.453-3.48 1.36-.88.88-1.44 2.12-1.68 3.72h9.92ZM163.139 9.6V38h-5.04V9.6h5.04Zm8.322 7.2.24 5.88-.64-.36c.32-2.053 1.094-3.56 2.32-4.52 1.254-.987 2.787-1.48 4.6-1.48 2.32 0 4.107.733 5.36 2.2 1.254 1.44 1.88 3.387 1.88 5.84V38h-4.96V25.92c0-1.253-.12-2.28-.36-3.08-.24-.8-.64-1.413-1.2-1.84-.533-.427-1.253-.64-2.16-.64-1.44 0-2.573.48-3.4 1.44-.8.933-1.2 2.307-1.2 4.12V38h-4.96V16.8h4.48Zm30.003 7.72c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.443 8.16V38h-5.6v-5.32h5.6Z"/><path fill="#171717" fill-rule="evenodd" d="m7.839 40.783 16.03-28.054L20 6 0 40.783h7.839Zm8.214 0H40L27.99 19.894l-4.02 7.032 3.976 6.914H20.02l-3.967 6.943Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
public/placeholder-user.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/placeholder.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

1
public/placeholder.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

125
styles/globals.css Normal file
View File

@ -0,0 +1,125 @@
@import 'tailwindcss';
@import 'tw-animate-css';
@custom-variant dark (&:is(.dark *));
:root {
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.145 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.145 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.985 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
--border: oklch(0.269 0 0);
--input: oklch(0.269 0 0);
--ring: oklch(0.439 0 0);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(0.269 0 0);
--sidebar-ring: oklch(0.439 0 0);
}
@theme inline {
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

27
tsconfig.json Normal file
View File

@ -0,0 +1,27 @@
{
"compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"target": "ES6",
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}