Initialized repository for chat Longtail Financial clone

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
This commit is contained in:
v0 2025-11-08 07:26:18 +00:00
commit 47d047fc28
40 changed files with 4453 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 @@
# Longtail Financial clone
*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-longtail-financial-clone)
[![Built with v0](https://img.shields.io/badge/Built%20with-v0.app-black?style=for-the-badge)](https://v0.app/chat/rtwbxB4UZ3T)
## 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-longtail-financial-clone](https://vercel.com/jeff-emmetts-projects/v0-longtail-financial-clone)**
## Build your app
Continue building your app on:
**[https://v0.app/chat/rtwbxB4UZ3T](https://v0.app/chat/rtwbxB4UZ3T)**
## 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

172
app/about/page.tsx Normal file
View File

@ -0,0 +1,172 @@
import Image from "next/image"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { Linkedin, Github, Mail } from "lucide-react"
export default function AboutPage() {
return (
<main className="min-h-screen bg-white">
{/* Hero Section */}
<section className="relative px-6 pt-24 pb-16 bg-gradient-to-b from-gray-50 to-white">
<div className="max-w-4xl mx-auto text-center">
<h1 className="text-5xl md:text-6xl font-bold text-gray-900 mb-6 text-balance">About Long Tail Financial</h1>
<p className="text-xl text-gray-600 text-pretty">
Building the future of tokenomics and regenerative finance through innovative engineering and research
</p>
</div>
</section>
{/* Founder Profile */}
<section className="px-6 py-16">
<div className="max-w-5xl mx-auto">
<div className="grid md:grid-cols-[300px_1fr] gap-12 items-start">
{/* Profile Image */}
<div className="relative">
<div className="aspect-square rounded-2xl overflow-hidden bg-gray-100">
<Image
src="/tech-ceo-headshot.png"
alt="Shawn Anderson"
width={400}
height={400}
className="w-full h-full object-cover"
/>
</div>
<div className="mt-6 flex gap-3 justify-center">
<Link
href="https://www.linkedin.com/in/shawnwanderson/"
target="_blank"
rel="noopener noreferrer"
className="p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition-colors"
>
<Linkedin className="w-5 h-5 text-gray-700" />
</Link>
<Link
href="https://github.com/longtailfinancial"
target="_blank"
rel="noopener noreferrer"
className="p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition-colors"
>
<Github className="w-5 h-5 text-gray-700" />
</Link>
</div>
</div>
{/* Bio Content */}
<div className="space-y-6">
<div>
<h2 className="text-3xl font-bold text-gray-900 mb-2">Shawn Anderson</h2>
<p className="text-xl text-[#FF6B35] font-semibold mb-4">CEO & Founder</p>
</div>
<div className="space-y-4 text-gray-700 leading-relaxed">
<p>
Shawn Anderson is the CEO and Founder of Long Tail Financial, a token engineering consultancy
dedicated to designing sustainable tokenomics and regenerative financial systems.
</p>
<p>
With a background in data science, machine learning, and distributed systems, Shawn has worked at the
intersection of finance and technology for over a decade. His work spans from building AI trading
systems and portfolio management algorithms to pioneering research in decentralized banking and
regenerative economics.
</p>
<p>
As a Data Scientist at RBC Amplify, Shawn led the development of Bundle, an award-winning internal
solution leveraging machine learning for access management. His academic research includes deep
reinforcement learning for portfolio management, cryptocurrency market visualization, and distributed
multi-agent learning systems.
</p>
<p>
Shawn is passionate about using blockchain technology and token engineering to address climate change
and build regenerative economic systems. He has authored numerous articles on topics including Nature
2.0, Solarpunk frameworks for carbon neutrality, and the role of DAOs in human collaboration.
</p>
<p>
Through Long Tail Financial, Shawn works with projects to design intelligent agent behavior on-chain,
create sustainable tokenomics models, and build the infrastructure for a more equitable and
regenerative financial future.
</p>
</div>
<div className="pt-6">
<Link href="https://shawnwanderson.github.io/portfolio/" target="_blank" rel="noopener noreferrer">
<Button variant="outline" className="rounded-full bg-transparent">
View Full Portfolio
</Button>
</Link>
</div>
</div>
</div>
</div>
</section>
{/* Key Achievements */}
<section className="px-6 py-16 bg-gray-50">
<div className="max-w-5xl mx-auto">
<h3 className="text-3xl font-bold text-gray-900 mb-12 text-center">Key Achievements & Expertise</h3>
<div className="grid md:grid-cols-2 gap-8">
<div className="bg-white p-6 rounded-xl border border-gray-200">
<h4 className="text-lg font-bold text-gray-900 mb-3">Research & Innovation</h4>
<ul className="space-y-2 text-gray-700">
<li> Token engineering frameworks for on-chain intelligent agents</li>
<li> Deep reinforcement learning for portfolio management</li>
<li> Cryptocurrency market visualization and forecasting</li>
<li> Evolution strategies in financial machine learning</li>
</ul>
</div>
<div className="bg-white p-6 rounded-xl border border-gray-200">
<h4 className="text-lg font-bold text-gray-900 mb-3">Industry Experience</h4>
<ul className="space-y-2 text-gray-700">
<li> Data Scientist at RBC Amplify (Award-winning solutions)</li>
<li> Blockchain and cryptocurrency markets expert</li>
<li> AI and machine learning systems architecture</li>
<li> Distributed systems and cloud computing</li>
</ul>
</div>
<div className="bg-white p-6 rounded-xl border border-gray-200">
<h4 className="text-lg font-bold text-gray-900 mb-3">Speaking & Media</h4>
<ul className="space-y-2 text-gray-700">
<li> AIBC Summit Malta 2019 - "The Rise of The New World"</li>
<li> Blockgeeks Workshop on AI in Crypto Markets</li>
<li> Economics of Wellbeing Podcast</li>
<li> Bloom Living Podcast on Decentralized Banking</li>
</ul>
</div>
<div className="bg-white p-6 rounded-xl border border-gray-200">
<h4 className="text-lg font-bold text-gray-900 mb-3">Thought Leadership</h4>
<ul className="space-y-2 text-gray-700">
<li> Author on Nature 2.0 and token engineering</li>
<li> Solarpunk and regenerative land management</li>
<li> DAOs and future of human collaboration</li>
<li> ReFi (Regenerative Finance) education and advocacy</li>
</ul>
</div>
</div>
</div>
</section>
{/* CTA Section */}
<section className="px-6 py-20">
<div className="max-w-3xl mx-auto text-center">
<h3 className="text-3xl font-bold text-gray-900 mb-6">Let's Build the Future Together</h3>
<p className="text-lg text-gray-600 mb-8">
Interested in token engineering, regenerative finance, or collaborating on innovative Web3 projects?
</p>
<Link href="mailto:contact@longtailfinancial.com">
<Button size="lg" className="bg-[#FF6B35] hover:bg-[#E55A2B] text-white rounded-full">
<Mail className="w-4 h-4 mr-2" />
Get in Touch
</Button>
</Link>
</div>
</section>
</main>
)
}

124
app/globals.css Normal file
View File

@ -0,0 +1,124 @@
@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 {
/* 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);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

46
app/layout.tsx Normal file
View File

@ -0,0 +1,46 @@
import type React from "react"
import type { Metadata } from "next"
import { Inter } from "next/font/google"
import { Analytics } from "@vercel/analytics/next"
import "./globals.css"
const inter = Inter({ subsets: ["latin"] })
export const metadata: Metadata = {
title: "Long Tail Financial | Token Engineering",
description:
"We design, model, and verify complex tokenomic systems proven to boost your funding and activate your community.",
generator: "v0.app",
icons: {
icon: [
{
url: "/icon-light-32x32.png",
media: "(prefers-color-scheme: light)",
},
{
url: "/icon-dark-32x32.png",
media: "(prefers-color-scheme: dark)",
},
{
url: "/icon.svg",
type: "image/svg+xml",
},
],
apple: "/apple-icon.png",
},
}
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
return (
<html lang="en">
<body className={`${inter.className} antialiased`}>
{children}
<Analytics />
</body>
</html>
)
}

127
app/page.tsx Normal file
View File

@ -0,0 +1,127 @@
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { FileText, Atom, Rocket } from "lucide-react"
import { Header } from "@/components/header"
import { Footer } from "@/components/footer"
export default function Home() {
return (
<div className="min-h-screen bg-white">
{/* Header Component */}
<Header />
{/* Hero Section */}
<section className="relative px-6 pt-20 pb-32 overflow-hidden">
{/* Orange gradient blob */}
<div className="absolute right-0 top-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full bg-gradient-to-br from-orange-400/30 via-orange-500/20 to-red-400/30 blur-3xl" />
<div className="relative max-w-4xl mx-auto text-center">
<h1 className="text-5xl md:text-6xl lg:text-7xl font-bold text-gray-900 mb-6 text-balance">
Elevate Your Impact with Token Engineering
</h1>
<p className="text-lg md:text-xl text-gray-600 mb-8 max-w-2xl mx-auto">
We design, model, and verify complex tokenomic systems proven to boost your funding and activate your
community.
</p>
<Button size="lg" className="bg-black hover:bg-gray-800 text-white px-8 py-6 text-lg rounded-full">
Activate Your Network
</Button>
</div>
</section>
{/* What We Do Section */}
<section className="px-6 py-20 bg-gray-50">
<div className="max-w-6xl mx-auto">
<h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-12">What We Do</h2>
<div className="grid md:grid-cols-3 gap-6">
{/* Card 1 */}
<Card className="bg-white border-none shadow-sm hover:shadow-md transition-shadow">
<CardContent className="p-8">
<div className="bg-orange-500 w-16 h-16 rounded-2xl flex items-center justify-center mb-6 relative">
<FileText className="w-8 h-8 text-white" />
<div className="absolute -top-1 -right-1 bg-black text-white w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold">
1
</div>
</div>
<h3 className="text-2xl font-bold text-gray-900 mb-4">Research, Collect and Analyze Data</h3>
<p className="text-gray-600 leading-relaxed">
Our data scientists extend the AI capacity of the client, researching and collecting data from open
markets and variable input which are understood through general token engineering dashboard tools.
</p>
</CardContent>
</Card>
{/* Card 2 */}
<Card className="bg-white border-none shadow-sm hover:shadow-md transition-shadow">
<CardContent className="p-8">
<div className="bg-orange-500 w-16 h-16 rounded-2xl flex items-center justify-center mb-6 relative">
<Atom className="w-8 h-8 text-white" />
<div className="absolute -top-1 -right-1 bg-black text-white w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold">
2
</div>
</div>
<h3 className="text-2xl font-bold text-gray-900 mb-4">Design, Simulate and Model Systems</h3>
<p className="text-gray-600 leading-relaxed">
To fully understand and make optimizations to the token system, we build simulations and models to
inform strategic decision making and confirm hypotheses.
</p>
</CardContent>
</Card>
{/* Card 3 */}
<Card className="bg-white border-none shadow-sm hover:shadow-md transition-shadow">
<CardContent className="p-8">
<div className="bg-orange-500 w-16 h-16 rounded-2xl flex items-center justify-center mb-6 relative">
<Rocket className="w-8 h-8 text-white" />
<div className="absolute -top-1 -right-1 bg-black text-white w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold">
3
</div>
</div>
<h3 className="text-2xl font-bold text-gray-900 mb-4">Optimize and Deploy Tokenomic System</h3>
<p className="text-gray-600 leading-relaxed">
Once fully understood and optimized, we advise on platform development, market presence, NFT
implementation, token configuration, as well as ecosystem and mechanism design.
</p>
</CardContent>
</Card>
</div>
</div>
</section>
{/* Case Study Section */}
<section className="px-6 py-20">
<div className="max-w-6xl mx-auto">
<div className="grid md:grid-cols-2 gap-12 items-center">
<div className="relative">
<img
src="/futuristic-nft-drop-poster-with-green-and-teal-tec.jpg"
alt="Future Thinkers NFT Drop"
className="rounded-3xl shadow-2xl w-full"
/>
</div>
<div>
<h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-6 text-balance">
Over $800,000 raised with Future Thinkers Podcast
</h2>
<p className="text-lg text-gray-600 mb-8 leading-relaxed">
We provide services across all stages of the token model generation processes. Check out this project!
</p>
<Button
variant="outline"
size="lg"
className="border-2 border-gray-900 text-gray-900 hover:bg-gray-900 hover:text-white px-8 py-6 text-lg rounded-full bg-transparent"
>
View Case Study
</Button>
</div>
</div>
</div>
</section>
{/* Footer Component */}
<Footer />
</div>
)
}

131
app/research/page.tsx Normal file
View File

@ -0,0 +1,131 @@
import { Header } from "@/components/header"
import { Footer } from "@/components/footer"
import { Card, CardContent } from "@/components/ui/card"
import { ExternalLink } from "lucide-react"
import Image from "next/image"
const articles = [
{
title: "On Nature 2.0: A Token Engineering Framework",
description: "A token engineering framework for designing on-chain behaviour of intelligent agents",
url: "https://shawnltf.medium.com/on-nature-2-0-a-token-engineering-framework-for-designing-on-chain-behaviour-of-intelligent-agents-432a266e5af1",
image: "/nature-technology-artificial-intelligence-network.jpg",
},
{
title: "Longtail Token: Block Rewards for Evolution Strategies",
description: "Exploring block rewards for evolution strategies in financial machine learning",
url: "https://shawnltf.medium.com/longtail-token-block-rewards-for-evolution-strategies-in-financial-machine-learning-6491bddad83f",
image: "/blockchain-tokens-machine-learning-evolution.jpg",
},
{
title: "Longtail Financial: Exposure to the Singularity",
description: "Understanding how Longtail Financial positions itself in relation to technological singularity",
url: "https://shawnltf.medium.com/longtail-financial-is-exposure-to-the-singularity-d345b1c46a5c",
image: "/technological-singularity-future-ai-exponential.jpg",
},
{
title: "Solarpunk: A Regenerative Land Management Framework",
description: "A framework for economical carbon neutrality through regenerative land management",
url: "https://shawnltf.medium.com/solarpunk-a-regenerative-land-management-framework-for-economical-carbon-neutrality-499479e6c07e",
image: "/solarpunk-green-sustainable-nature-renewable-energ.jpg",
},
{
title: "Token Engineering in Our Heritage",
description: "What we can learn from ancient and modern indigenous cultures about token engineering",
url: "https://medium.com/token-engineering-commons/token-engineering-in-our-heritage-what-we-can-learn-from-ancient-and-modern-indigenous-cultures-fb4961a8cd24",
image: "/indigenous-culture-heritage-community-collaboratio.jpg",
},
{
title: "DAOs: The Latest Iteration in Human Collaboration",
description: "Exploring decentralized autonomous organizations as the next evolution of human cooperation",
url: "https://medium.com/longtail-financial/daos-the-latest-iteration-in-human-collaboration-5db2dde7a984",
image: "/dao-collaboration-decentralized-network-community.jpg",
},
{
title: "Looking for Flexible Work? Join a DAO",
description: "Discover flexible work-from-home opportunities through decentralized autonomous organizations",
url: "https://medium.com/longtail-financial/looking-for-a-flexible-work-from-home-opportunity-join-a-dao-dd55d81327df",
image: "/remote-work-flexibility-digital-nomad-collaboratio.jpg",
},
{
title: "Introducing Longtail Financial's ReFi Bootcamp",
description: "Let's engineer a brighter future together with regenerative finance education",
url: "https://medium.com/longtail-financial/lets-engineer-a-brighter-future-together-introducing-longtail-financial-s-refi-bootcamp-daf1323a8ed4",
image: "/education-bootcamp-learning-regenerative-finance.jpg",
},
{
title: "Healing the Earth by Healing the Economy",
description: "Could the blockchain help us create a regenerative economic system?",
url: "https://medium.com/longtail-financial/to-heal-the-earth-we-must-heal-the-economy-could-the-blockchain-help-us-get-there-e48072bcb697",
image: "/earth-healing-regenerative-economy-sustainability.jpg",
},
]
export default function ResearchPage() {
return (
<div className="min-h-screen bg-white">
<Header />
{/* Hero Section */}
<section className="px-6 pt-20 pb-16 bg-gradient-to-b from-gray-50 to-white">
<div className="max-w-4xl mx-auto text-center">
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold text-gray-900 mb-6 text-balance">
Research & Resources
</h1>
<p className="text-lg md:text-xl text-gray-600 max-w-2xl mx-auto">
Explore our thought leadership on token engineering, regenerative finance, DAOs, and the future of economic
systems.
</p>
</div>
</section>
{/* Articles Grid */}
<section className="px-6 py-16">
<div className="max-w-6xl mx-auto">
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{articles.map((article, index) => (
<Card
key={index}
className="bg-white border border-gray-200 hover:shadow-lg transition-shadow group cursor-pointer overflow-hidden"
>
<a href={article.url} target="_blank" rel="noopener noreferrer" className="block h-full">
<div className="relative w-full h-48 bg-gray-100 overflow-hidden">
<Image
src={article.image || "/placeholder.svg"}
alt={article.title}
fill
className="object-cover group-hover:scale-105 transition-transform duration-300"
/>
</div>
<CardContent className="p-6 flex flex-col">
<div className="flex items-start justify-between mb-4">
<div className="bg-orange-100 text-orange-600 px-3 py-1 rounded-full text-xs font-semibold">
Article
</div>
<ExternalLink className="w-4 h-4 text-gray-400 group-hover:text-orange-500 transition-colors" />
</div>
<h3 className="text-xl font-bold text-gray-900 mb-3 text-balance group-hover:text-orange-600 transition-colors">
{article.title}
</h3>
<p className="text-gray-600 leading-relaxed flex-grow">{article.description}</p>
<div className="mt-4 pt-4 border-t border-gray-100">
<span className="text-sm text-orange-600 font-semibold group-hover:underline">
Read on Medium
</span>
</div>
</CardContent>
</a>
</Card>
))}
</div>
</div>
</section>
<Footer />
</div>
)
}

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"
}

69
components/footer.tsx Normal file
View File

@ -0,0 +1,69 @@
import Link from "next/link"
import { Twitter, Linkedin, Github } from "lucide-react"
export function Footer() {
return (
<footer className="bg-gray-900 text-white px-6 py-12">
<div className="max-w-6xl mx-auto">
<div className="grid md:grid-cols-3 gap-8 mb-8">
<div>
<h3 className="text-xl font-bold mb-4">Long Tail Financial</h3>
<p className="text-gray-400">
Token engineering consultancy helping organizations design and deploy tokenomic systems.
</p>
</div>
<div>
<h4 className="font-semibold mb-4">Quick Links</h4>
<ul className="space-y-2">
<li>
<Link href="/" className="text-gray-400 hover:text-white transition-colors">
Home
</Link>
</li>
<li>
<Link href="/research" className="text-gray-400 hover:text-white transition-colors">
Research & Resources
</Link>
</li>
</ul>
</div>
<div>
<h4 className="font-semibold mb-4">Connect With Us</h4>
<div className="flex gap-4">
<a
href="https://x.com/LongTailFinTech"
target="_blank"
rel="noopener noreferrer"
className="bg-gray-800 p-2 rounded-full hover:bg-gray-700 transition-colors"
>
<Twitter className="w-5 h-5" />
</a>
<a
href="https://www.linkedin.com/company/longtail-financial"
target="_blank"
rel="noopener noreferrer"
className="bg-gray-800 p-2 rounded-full hover:bg-gray-700 transition-colors"
>
<Linkedin className="w-5 h-5" />
</a>
<a
href="https://github.com/longtailfinancial"
target="_blank"
rel="noopener noreferrer"
className="bg-gray-800 p-2 rounded-full hover:bg-gray-700 transition-colors"
>
<Github className="w-5 h-5" />
</a>
</div>
</div>
</div>
<div className="pt-8 border-t border-gray-800 text-center text-gray-400 text-sm">
© {new Date().getFullYear()} Long Tail Financial. All rights reserved.
</div>
</div>
</footer>
)
}

26
components/header.tsx Normal file
View File

@ -0,0 +1,26 @@
import Link from "next/link"
import { Button } from "@/components/ui/button"
export function Header() {
return (
<header className="sticky top-0 z-50 w-full border-b bg-white/80 backdrop-blur-sm">
<div className="max-w-7xl mx-auto px-6 h-16 flex items-center justify-between">
<Link href="/" className="text-xl font-bold text-gray-900">
Long Tail Financial
</Link>
<nav className="flex items-center gap-8">
<Link href="/about" className="text-gray-600 hover:text-gray-900 transition-colors">
About
</Link>
<Link href="/research" className="text-gray-600 hover:text-gray-900 transition-colors">
Research
</Link>
<Button size="sm" className="bg-black hover:bg-gray-800 text-white rounded-full">
Contact
</Button>
</nav>
</div>
</header>
)
}

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))
}

17
next.config.mjs Normal file
View File

@ -0,0 +1,17 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
distDir: 'out',
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},
images: {
unoptimized: true,
},
trailingSlash: 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"
}
}

3233
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/apple-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
public/icon-dark-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

BIN
public/icon-light-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

26
public/icon.svg Normal file
View File

@ -0,0 +1,26 @@
<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
<style>
@media (prefers-color-scheme: light) {
.background { fill: black; }
.foreground { fill: white; }
}
@media (prefers-color-scheme: dark) {
.background { fill: white; }
.foreground { fill: black; }
}
</style>
<g clip-path="url(#clip0_7960_43945)">
<rect class="background" width="180" height="180" rx="37" />
<g style="transform: scale(95%); transform-origin: center">
<path class="foreground"
d="M101.141 53H136.632C151.023 53 162.689 64.6662 162.689 79.0573V112.904H148.112V79.0573C148.112 78.7105 148.098 78.3662 148.072 78.0251L112.581 112.898C112.701 112.902 112.821 112.904 112.941 112.904H148.112V126.672H112.941C98.5504 126.672 86.5638 114.891 86.5638 100.5V66.7434H101.141V100.5C101.141 101.15 101.191 101.792 101.289 102.422L137.56 66.7816C137.255 66.7563 136.945 66.7434 136.632 66.7434H101.141V53Z" />
<path class="foreground"
d="M65.2926 124.136L14 66.7372H34.6355L64.7495 100.436V66.7372H80.1365V118.47C80.1365 126.278 70.4953 129.958 65.2926 124.136Z" />
</g>
</g>
<defs>
<clipPath id="clip0_7960_43945">
<rect width="180" height="180" fill="white" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 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"]
}