Initialized repository for chat Psilo-cybernetics website

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
This commit is contained in:
v0 2025-11-02 00:10:51 +00:00
commit 7cd1ceb3eb
27 changed files with 4532 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 @@
# Psilo-cybernetics 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-psilo-cybernetics-website)
[![Built with v0](https://img.shields.io/badge/Built%20with-v0.app-black?style=for-the-badge)](https://v0.app/chat/fSq1ioBSqMS)
## 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-psilo-cybernetics-website](https://vercel.com/jeff-emmetts-projects/v0-psilo-cybernetics-website)**
## Build your app
Continue building your app on:
**[https://v0.app/chat/fSq1ioBSqMS](https://v0.app/chat/fSq1ioBSqMS)**
## 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

183
app/globals.css Normal file
View File

@ -0,0 +1,183 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
/* Tron-style cyber aesthetic with neon colors */
--background: oklch(0.08 0.02 265);
--foreground: oklch(0.95 0.05 200);
--card: oklch(0.12 0.03 265);
--card-foreground: oklch(0.95 0.05 200);
--popover: oklch(0.12 0.03 265);
--popover-foreground: oklch(0.95 0.05 200);
--primary: oklch(0.65 0.25 195);
--primary-foreground: oklch(0.08 0.02 265);
--secondary: oklch(0.7 0.28 320);
--secondary-foreground: oklch(0.08 0.02 265);
--muted: oklch(0.15 0.03 265);
--muted-foreground: oklch(0.6 0.08 200);
--accent: oklch(0.75 0.3 180);
--accent-foreground: oklch(0.08 0.02 265);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.95 0.05 200);
--border: oklch(0.25 0.08 195);
--input: oklch(0.25 0.08 195);
--ring: oklch(0.65 0.25 195);
--chart-1: oklch(0.65 0.25 195);
--chart-2: oklch(0.7 0.28 320);
--chart-3: oklch(0.75 0.3 180);
--chart-4: oklch(0.6 0.22 280);
--chart-5: oklch(0.7 0.26 160);
--radius: 0.5rem;
--sidebar: oklch(0.12 0.03 265);
--sidebar-foreground: oklch(0.95 0.05 200);
--sidebar-primary: oklch(0.65 0.25 195);
--sidebar-primary-foreground: oklch(0.08 0.02 265);
--sidebar-accent: oklch(0.15 0.03 265);
--sidebar-accent-foreground: oklch(0.95 0.05 200);
--sidebar-border: oklch(0.25 0.08 195);
--sidebar-ring: oklch(0.65 0.25 195);
}
.dark {
/* Dark mode maintains cyber aesthetic */
--background: oklch(0.05 0.02 265);
--foreground: oklch(0.98 0.05 200);
--card: oklch(0.1 0.03 265);
--card-foreground: oklch(0.98 0.05 200);
--popover: oklch(0.1 0.03 265);
--popover-foreground: oklch(0.98 0.05 200);
--primary: oklch(0.7 0.28 195);
--primary-foreground: oklch(0.05 0.02 265);
--secondary: oklch(0.75 0.3 320);
--secondary-foreground: oklch(0.05 0.02 265);
--muted: oklch(0.12 0.03 265);
--muted-foreground: oklch(0.65 0.08 200);
--accent: oklch(0.8 0.32 180);
--accent-foreground: oklch(0.05 0.02 265);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.98 0.05 200);
--border: oklch(0.3 0.1 195);
--input: oklch(0.3 0.1 195);
--ring: oklch(0.7 0.28 195);
--chart-1: oklch(0.7 0.28 195);
--chart-2: oklch(0.75 0.3 320);
--chart-3: oklch(0.8 0.32 180);
--chart-4: oklch(0.65 0.24 280);
--chart-5: oklch(0.75 0.28 160);
--sidebar: oklch(0.1 0.03 265);
--sidebar-foreground: oklch(0.98 0.05 200);
--sidebar-primary: oklch(0.7 0.28 195);
--sidebar-primary-foreground: oklch(0.05 0.02 265);
--sidebar-accent: oklch(0.12 0.03 265);
--sidebar-accent-foreground: oklch(0.98 0.05 200);
--sidebar-border: oklch(0.3 0.1 195);
--sidebar-ring: oklch(0.7 0.28 195);
}
@theme inline {
--font-sans: "Geist", "Geist Fallback";
--font-mono: "Geist Mono", "Geist Mono Fallback";
--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;
}
}
/* Adding cyber glow effects and animations */
@keyframes glow-pulse {
0%,
100% {
filter: drop-shadow(0 0 2px currentColor) drop-shadow(0 0 8px currentColor);
}
50% {
filter: drop-shadow(0 0 4px currentColor) drop-shadow(0 0 16px currentColor);
}
}
@keyframes scan-line {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(100vh);
}
}
@keyframes fractal-spin {
0% {
transform: rotate(0deg) scale(1);
}
50% {
transform: rotate(180deg) scale(1.1);
}
100% {
transform: rotate(360deg) scale(1);
}
}
.glow-text {
text-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor;
}
.glow-border {
box-shadow: 0 0 10px currentColor, 0 0 20px currentColor, inset 0 0 10px currentColor;
}
.scan-lines::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(transparent 50%, rgba(0, 255, 255, 0.03) 50%);
background-size: 100% 4px;
pointer-events: none;
z-index: 1;
}
.cyber-grid {
background-image: linear-gradient(rgba(0, 255, 255, 0.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 255, 255, 0.1) 1px, transparent 1px);
background-size: 50px 50px;
}

30
app/layout.tsx Normal file
View File

@ -0,0 +1,30 @@
import type React from "react"
import type { Metadata } from "next"
import { Geist, Geist_Mono } from "next/font/google"
import { Analytics } from "@vercel/analytics/next"
import "./globals.css"
const _geist = Geist({ subsets: ["latin"] })
const _geistMono = Geist_Mono({ subsets: ["latin"] })
export const metadata: Metadata = {
title: "MycoFi | Psilo-Cybernetics & Institutional Neuroplasticity",
description:
"Exploring the emergence of institutional neuroplasticity through myco-principic design and real-time community collaboration tools",
generator: "v0.app",
}
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
return (
<html lang="en">
<body className={`font-sans antialiased`}>
{children}
<Analytics />
</body>
</html>
)
}

19
app/page.tsx Normal file
View File

@ -0,0 +1,19 @@
import { Hero } from "@/components/hero"
import { ConceptsGrid } from "@/components/concepts-grid"
import { NetworkVisualization } from "@/components/network-visualization"
import { Principles } from "@/components/principles"
import { Applications } from "@/components/applications"
import { Footer } from "@/components/footer"
export default function Home() {
return (
<main className="min-h-screen">
<Hero />
<ConceptsGrid />
<NetworkVisualization />
<Principles />
<Applications />
<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"
}

135
components/applications.tsx Normal file
View File

@ -0,0 +1,135 @@
import { Card } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import { Coins, Vote, Database, MessageSquare, ArrowRight } from "lucide-react"
const applications = [
{
icon: Coins,
title: "Economic Collaboration",
description:
"Decentralized resource allocation, mutual credit systems, and transparent value flows that adapt to community needs in real-time.",
features: ["Mutual Credit Networks", "Dynamic Resource Pools", "Value Flow Tracking"],
},
{
icon: Vote,
title: "Democratic Governance",
description:
"Participatory decision-making tools that scale from local to global, enabling fluid consensus and adaptive policy formation.",
features: ["Liquid Democracy", "Quadratic Voting", "Consent-Based Protocols"],
},
{
icon: Database,
title: "Computational Infrastructure",
description:
"Distributed computing networks that grow organically, sharing processing power and data storage across community nodes.",
features: ["Peer-to-Peer Computing", "Federated Data Storage", "Edge Processing"],
},
{
icon: MessageSquare,
title: "Knowledge Commons",
description:
"Collaborative learning environments where insights propagate through the network, creating collective intelligence.",
features: ["Distributed Knowledge Graphs", "Collaborative Sense-Making", "Emergent Documentation"],
},
]
export function Applications() {
return (
<section className="py-24 px-4 relative overflow-hidden scan-lines">
<div className="absolute inset-0 cyber-grid opacity-10" />
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-primary/5 rounded-full blur-3xl animate-pulse" />
<div className="max-w-7xl mx-auto relative z-10">
<div className="text-center mb-16">
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-balance glow-text text-primary">
{"Real-Time Collaboration Tools"}
</h2>
<p className="text-lg text-accent max-w-2xl mx-auto text-pretty glow-text">
{"Practical applications of MycoFi principles for community coordination and collective action"}
</p>
</div>
<div className="grid lg:grid-cols-2 gap-8">
{applications.map((app, index) => {
const Icon = app.icon
const hue = 180 + index * 40
return (
<Card
key={index}
className="p-8 hover:shadow-lg transition-all border-2 glow-border bg-card/80 backdrop-blur-sm hover:scale-105"
style={{
borderColor: `hsl(${hue}, 100%, 50%)`,
boxShadow: `0 0 25px hsla(${hue}, 100%, 50%, 0.3)`,
}}
>
<div className="space-y-4">
<div
className="w-14 h-14 rounded-xl flex items-center justify-center border-2"
style={{
borderColor: `hsl(${hue}, 100%, 60%)`,
color: `hsl(${hue}, 100%, 60%)`,
boxShadow: `0 0 20px hsla(${hue}, 100%, 60%, 0.5)`,
}}
>
<Icon className="w-7 h-7" style={{ animation: "glow-pulse 2s ease-in-out infinite" }} />
</div>
<h3 className="text-2xl font-semibold glow-text" style={{ color: `hsl(${hue}, 100%, 70%)` }}>
{app.title}
</h3>
<p className="text-muted-foreground leading-relaxed">{app.description}</p>
<div className="pt-2">
<p className="text-sm font-medium mb-2 text-accent glow-text">{"Key Features:"}</p>
<ul className="space-y-1">
{app.features.map((feature, i) => (
<li key={i} className="text-sm text-muted-foreground flex items-center gap-2">
<div
className="w-1.5 h-1.5 rounded-full"
style={{
backgroundColor: `hsl(${hue}, 100%, 60%)`,
boxShadow: `0 0 5px hsl(${hue}, 100%, 60%)`,
}}
/>
{feature}
</li>
))}
</ul>
</div>
</div>
</Card>
)
})}
</div>
<div className="mt-16 text-center">
<Card className="p-12 border-2 border-primary glow-border bg-gradient-to-br from-primary/20 to-secondary/20 backdrop-blur-sm">
<h3 className="text-2xl md:text-3xl font-bold mb-4 text-balance glow-text text-primary">
{"Ready to Explore the Network?"}
</h3>
<p className="text-lg mb-8 max-w-2xl mx-auto text-accent glow-text">
{
"Dive deeper into psilo-cybernetics and discover how myco-principic design can transform your community or organization"
}
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button
size="lg"
className="gap-2 border-2 border-accent bg-accent/20 text-accent glow-border hover:bg-accent/30"
>
{"Access the Book"}
<ArrowRight className="w-4 h-4" />
</Button>
<Button
size="lg"
variant="outline"
className="gap-2 border-2 border-secondary text-secondary glow-border hover:bg-secondary/10 bg-transparent"
>
{"Join the Community"}
</Button>
</div>
</Card>
</div>
</div>
</section>
)
}

View File

@ -0,0 +1,70 @@
import { Card } from "@/components/ui/card"
import { Brain, Network, Sprout, Users } from "lucide-react"
const concepts = [
{
icon: Brain,
title: "Psilo-Cybernetics",
description:
"The study of feedback loops and self-organizing systems inspired by mycelial networks and psychedelic insights into interconnectedness.",
},
{
icon: Sprout,
title: "Institutional Neuroplasticity",
description:
"Organizations that adapt and evolve like neural networks, continuously learning and reorganizing based on environmental feedback.",
},
{
icon: Network,
title: "MycoFi Framework",
description:
"A decentralized infrastructure connecting economic, democratic, and computational systems through myco-principic design patterns.",
},
{
icon: Users,
title: "Community Collaboration",
description:
"Real-time tooling for collective decision-making, resource allocation, and knowledge sharing across distributed networks.",
},
]
export function ConceptsGrid() {
return (
<section className="py-24 px-4 relative overflow-hidden">
<div className="absolute inset-0 cyber-grid opacity-10" />
<div className="max-w-7xl mx-auto relative z-10">
<div className="text-center mb-16">
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-balance glow-text text-secondary">
{"Core Concepts"}
</h2>
<p className="text-lg text-accent max-w-2xl mx-auto text-pretty glow-text">
{"Understanding the foundational principles that enable adaptive, interconnected systems"}
</p>
</div>
<div className="grid md:grid-cols-2 gap-6">
{concepts.map((concept, index) => {
const Icon = concept.icon
return (
<Card
key={index}
className="p-8 hover:shadow-lg transition-all border-2 border-primary/50 glow-border bg-card/80 backdrop-blur-sm hover:border-primary"
>
<div className="flex items-start gap-4">
<div className="p-3 rounded-lg border-2 border-accent text-accent glow-border">
<Icon className="w-6 h-6" style={{ animation: "glow-pulse 3s ease-in-out infinite" }} />
</div>
<div className="flex-1">
<h3 className="text-xl font-semibold mb-2 text-primary glow-text">{concept.title}</h3>
<p className="text-muted-foreground leading-relaxed">{concept.description}</p>
</div>
</div>
</Card>
)
})}
</div>
</div>
</section>
)
}

40
components/footer.tsx Normal file
View File

@ -0,0 +1,40 @@
import { Network } from "lucide-react"
export function Footer() {
return (
<footer className="border-t bg-muted/30 py-12 px-4">
<div className="max-w-7xl mx-auto">
<div className="flex flex-col md:flex-row justify-between items-center gap-6">
<div className="flex items-center gap-2">
<div className="w-8 h-8 rounded-lg bg-primary/10 text-primary flex items-center justify-center">
<Network className="w-5 h-5" />
</div>
<span className="font-semibold text-lg">{"MycoFi"}</span>
</div>
<div className="flex flex-wrap justify-center gap-6 text-sm text-muted-foreground">
<a href="#" className="hover:text-foreground transition-colors">
{"About"}
</a>
<a href="#" className="hover:text-foreground transition-colors">
{"Research"}
</a>
<a href="#" className="hover:text-foreground transition-colors">
{"Community"}
</a>
<a href="https://book.mycofi.earth" className="hover:text-foreground transition-colors">
{"Book"}
</a>
<a href="#" className="hover:text-foreground transition-colors">
{"Contact"}
</a>
</div>
</div>
<div className="mt-8 pt-8 border-t text-center text-sm text-muted-foreground">
<p>{"Exploring institutional neuroplasticity through myco-principic design"}</p>
</div>
</div>
</footer>
)
}

107
components/hero.tsx Normal file
View File

@ -0,0 +1,107 @@
import { Button } from "@/components/ui/button"
import { ArrowRight, Network } from "lucide-react"
export function Hero() {
return (
<section className="relative min-h-screen flex items-center justify-center overflow-hidden px-4 py-20 scan-lines">
<div className="absolute inset-0 cyber-grid opacity-20" />
<div className="absolute inset-0 overflow-hidden">
<div className="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/20 rounded-full blur-3xl animate-pulse" />
<div
className="absolute bottom-1/4 right-1/4 w-96 h-96 bg-secondary/20 rounded-full blur-3xl animate-pulse"
style={{ animationDelay: "1s" }}
/>
<div
className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-accent/10 rounded-full blur-3xl animate-pulse"
style={{ animationDelay: "2s" }}
/>
</div>
<svg className="absolute inset-0 w-full h-full opacity-30" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="laser-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style={{ stopColor: "rgb(0, 255, 255)", stopOpacity: 0 }} />
<stop offset="50%" style={{ stopColor: "rgb(0, 255, 255)", stopOpacity: 1 }} />
<stop offset="100%" style={{ stopColor: "rgb(255, 0, 255)", stopOpacity: 0 }} />
</linearGradient>
</defs>
<line
x1="0"
y1="0"
x2="100%"
y2="100%"
stroke="url(#laser-gradient)"
strokeWidth="2"
className="animate-pulse"
/>
<line
x1="100%"
y1="0"
x2="0"
y2="100%"
stroke="url(#laser-gradient)"
strokeWidth="2"
className="animate-pulse"
style={{ animationDelay: "0.5s" }}
/>
<circle
cx="50%"
cy="50%"
r="200"
fill="none"
stroke="rgb(0, 255, 255)"
strokeWidth="1"
opacity="0.3"
className="animate-pulse"
/>
<circle
cx="50%"
cy="50%"
r="300"
fill="none"
stroke="rgb(255, 0, 255)"
strokeWidth="1"
opacity="0.2"
className="animate-pulse"
style={{ animationDelay: "1s" }}
/>
</svg>
<div className="relative max-w-5xl mx-auto text-center space-y-8 z-10">
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full border-2 border-primary text-primary text-sm font-medium mb-4 glow-border">
<Network className="w-4 h-4" style={{ animation: "glow-pulse 2s ease-in-out infinite" }} />
<span className="glow-text">{"Myco-Principic Design"}</span>
</div>
<h1 className="text-5xl md:text-7xl font-bold tracking-tight text-balance glow-text">
{"Psilo-Cybernetics"}
<span className="block text-primary mt-2 glow-text">{"& Institutional Neuroplasticity"}</span>
</h1>
<p className="text-xl md:text-2xl text-accent max-w-3xl mx-auto text-pretty leading-relaxed glow-text">
{
"Exploring the emergence of adaptive institutions through MycoFi—a framework connecting mycelial intelligence with decentralized systems for real-time community collaboration"
}
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center pt-4">
<Button
size="lg"
className="gap-2 text-base glow-border bg-primary hover:bg-primary/80 border-2 border-primary"
>
{"Explore the Framework"}
<ArrowRight className="w-4 h-4" />
</Button>
<Button
size="lg"
variant="outline"
className="text-base border-2 border-secondary text-secondary glow-border hover:bg-secondary/10 bg-transparent"
>
{"Read the Book"}
</Button>
</div>
</div>
</section>
)
}

View File

@ -0,0 +1,143 @@
"use client"
import { useEffect, useRef } from "react"
export function NetworkVisualization() {
const canvasRef = useRef<HTMLCanvasElement>(null)
useEffect(() => {
const canvas = canvasRef.current
if (!canvas) return
const ctx = canvas.getContext("2d")
if (!ctx) return
// Set canvas size
const updateSize = () => {
canvas.width = canvas.offsetWidth * window.devicePixelRatio
canvas.height = canvas.offsetHeight * window.devicePixelRatio
ctx.scale(window.devicePixelRatio, window.devicePixelRatio)
}
updateSize()
window.addEventListener("resize", updateSize)
const nodes: Array<{
x: number
y: number
vx: number
vy: number
radius: number
hue: number
pulsePhase: number
}> = []
const nodeCount = 40
for (let i = 0; i < nodeCount; i++) {
nodes.push({
x: Math.random() * canvas.offsetWidth,
y: Math.random() * canvas.offsetHeight,
vx: (Math.random() - 0.5) * 0.8,
vy: (Math.random() - 0.5) * 0.8,
radius: Math.random() * 4 + 2,
hue: Math.random() * 60 + 170, // Cyan to magenta range
pulsePhase: Math.random() * Math.PI * 2,
})
}
let time = 0
// Animation loop
let animationId: number
const animate = () => {
time += 0.01
ctx.fillStyle = "rgba(13, 13, 26, 0.1)"
ctx.fillRect(0, 0, canvas.offsetWidth, canvas.offsetHeight)
// Update and draw nodes
nodes.forEach((node, i) => {
node.x += node.vx
node.y += node.vy
node.pulsePhase += 0.05
// Bounce off edges
if (node.x < 0 || node.x > canvas.offsetWidth) node.vx *= -1
if (node.y < 0 || node.y > canvas.offsetHeight) node.vy *= -1
nodes.forEach((otherNode, j) => {
if (i === j) return
const dx = otherNode.x - node.x
const dy = otherNode.y - node.y
const distance = Math.sqrt(dx * dx + dy * dy)
if (distance < 180) {
const opacity = (1 - distance / 180) * 0.6
const gradient = ctx.createLinearGradient(node.x, node.y, otherNode.x, otherNode.y)
gradient.addColorStop(0, `hsla(${node.hue}, 100%, 60%, ${opacity})`)
gradient.addColorStop(1, `hsla(${otherNode.hue}, 100%, 60%, ${opacity})`)
ctx.strokeStyle = gradient
ctx.lineWidth = 2
ctx.shadowBlur = 10
ctx.shadowColor = `hsl(${node.hue}, 100%, 60%)`
ctx.beginPath()
ctx.moveTo(node.x, node.y)
ctx.lineTo(otherNode.x, otherNode.y)
ctx.stroke()
ctx.shadowBlur = 0
}
})
const pulse = Math.sin(node.pulsePhase) * 0.5 + 1
const glowRadius = node.radius * pulse * 3
// Outer glow
const gradient = ctx.createRadialGradient(node.x, node.y, 0, node.x, node.y, glowRadius)
gradient.addColorStop(0, `hsla(${node.hue}, 100%, 60%, 0.8)`)
gradient.addColorStop(0.5, `hsla(${node.hue}, 100%, 60%, 0.3)`)
gradient.addColorStop(1, `hsla(${node.hue}, 100%, 60%, 0)`)
ctx.fillStyle = gradient
ctx.beginPath()
ctx.arc(node.x, node.y, glowRadius, 0, Math.PI * 2)
ctx.fill()
// Core node
ctx.fillStyle = `hsl(${node.hue}, 100%, 70%)`
ctx.shadowBlur = 15
ctx.shadowColor = `hsl(${node.hue}, 100%, 60%)`
ctx.beginPath()
ctx.arc(node.x, node.y, node.radius * pulse, 0, Math.PI * 2)
ctx.fill()
ctx.shadowBlur = 0
})
animationId = requestAnimationFrame(animate)
}
animate()
return () => {
window.removeEventListener("resize", updateSize)
cancelAnimationFrame(animationId)
}
}, [])
return (
<section className="py-24 px-4 relative overflow-hidden scan-lines">
<div className="absolute inset-0 cyber-grid opacity-10" />
<canvas ref={canvasRef} className="absolute inset-0 w-full h-full" />
<div className="relative max-w-4xl mx-auto text-center space-y-6 z-10">
<h2 className="text-3xl md:text-5xl font-bold text-balance glow-text text-primary">
{"Mycelial Intelligence"}
</h2>
<p className="text-lg md:text-xl text-accent leading-relaxed glow-text">
{
"Like mycelial networks that connect forest ecosystems, MycoFi creates living infrastructure for communities to share resources, make decisions, and evolve together. Each node strengthens the whole, enabling emergence of collective intelligence."
}
</p>
</div>
</section>
)
}

97
components/principles.tsx Normal file
View File

@ -0,0 +1,97 @@
import { Card } from "@/components/ui/card"
import { GitBranch, Layers, Zap, RefreshCw, Share2, Target } from "lucide-react"
const principles = [
{
icon: GitBranch,
title: "Distributed Architecture",
description: "No single point of failure—resilience through decentralization",
},
{
icon: Layers,
title: "Emergent Complexity",
description: "Simple rules create sophisticated collective behaviors",
},
{
icon: Zap,
title: "Real-Time Adaptation",
description: "Continuous feedback loops enable rapid organizational learning",
},
{
icon: RefreshCw,
title: "Regenerative Systems",
description: "Self-healing networks that grow stronger through use",
},
{
icon: Share2,
title: "Resource Sharing",
description: "Efficient allocation through transparent, collaborative protocols",
},
{
icon: Target,
title: "Intentional Design",
description: "Purpose-driven architecture aligned with community values",
},
]
export function Principles() {
return (
<section className="py-24 px-4 relative overflow-hidden">
<div className="absolute inset-0 overflow-hidden">
<div className="absolute top-0 left-1/4 w-64 h-64 bg-primary/10 rounded-full blur-3xl animate-pulse" />
<div
className="absolute bottom-0 right-1/4 w-64 h-64 bg-secondary/10 rounded-full blur-3xl animate-pulse"
style={{ animationDelay: "1.5s" }}
/>
</div>
<div className="max-w-7xl mx-auto relative z-10">
<div className="text-center mb-16">
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-balance glow-text text-accent">
{"Myco-Principic Design"}
</h2>
<p className="text-lg text-secondary max-w-2xl mx-auto text-pretty glow-text">
{"Six foundational principles inspired by mycelial networks and applied to institutional design"}
</p>
</div>
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-6">
{principles.map((principle, index) => {
const Icon = principle.icon
const hue = 180 + index * 30 // Cycle through cyan to magenta
return (
<Card
key={index}
className="p-6 hover:shadow-lg transition-all border-2 glow-border bg-card/80 backdrop-blur-sm hover:scale-105"
style={{
borderColor: `hsl(${hue}, 100%, 50%)`,
boxShadow: `0 0 20px hsla(${hue}, 100%, 50%, 0.3)`,
}}
>
<div className="space-y-3">
<div
className="w-12 h-12 rounded-lg flex items-center justify-center border-2"
style={{
borderColor: `hsl(${hue}, 100%, 60%)`,
color: `hsl(${hue}, 100%, 60%)`,
boxShadow: `0 0 15px hsla(${hue}, 100%, 60%, 0.5)`,
}}
>
<Icon
className="w-6 h-6"
style={{ animation: "glow-pulse 2.5s ease-in-out infinite", animationDelay: `${index * 0.2}s` }}
/>
</div>
<h3 className="text-lg font-semibold glow-text" style={{ color: `hsl(${hue}, 100%, 70%)` }}>
{principle.title}
</h3>
<p className="text-muted-foreground text-sm leading-relaxed">{principle.description}</p>
</div>
</Card>
)
})}
</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,
}

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

73
package.json Normal file
View File

@ -0,0 +1,73 @@
{
"name": "my-v0-project",
"version": "0.1.0",
"private": true,
"scripts": {
"build": "next build",
"dev": "next dev",
"lint": "eslint .",
"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",
"input-otp": "1.4.1",
"lucide-react": "^0.454.0",
"next": "16.0.0",
"next-themes": "^0.4.6",
"react": "19.2.0",
"react-day-picker": "9.8.0",
"react-dom": "19.2.0",
"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.76"
},
"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"
}
}

3212
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

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: 'Geist', 'Geist Fallback';
--font-mono: 'Geist Mono', 'Geist Mono Fallback';
--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"]
}