diff --git a/app/globals.css b/app/globals.css index 5e81512..e2fa776 100644 --- a/app/globals.css +++ b/app/globals.css @@ -4,32 +4,37 @@ @custom-variant dark (&:is(.dark *)); :root { - /* Hack-ademic color palette - terminal greens, amber, deep blacks */ - --background: oklch(0.08 0.01 150); - --foreground: oklch(0.85 0.08 145); - --card: oklch(0.12 0.015 150); - --card-foreground: oklch(0.85 0.08 145); - --popover: oklch(0.1 0.015 150); - --popover-foreground: oklch(0.85 0.08 145); - --primary: oklch(0.7 0.18 145); - --primary-foreground: oklch(0.08 0.01 150); - --secondary: oklch(0.15 0.02 150); - --secondary-foreground: oklch(0.75 0.12 145); - --muted: oklch(0.18 0.015 150); - --muted-foreground: oklch(0.55 0.06 145); - --accent: oklch(0.75 0.15 85); - --accent-foreground: oklch(0.08 0.01 150); - --destructive: oklch(0.6 0.2 25); - --destructive-foreground: oklch(0.95 0.01 150); - --border: oklch(0.22 0.03 145); - --input: oklch(0.15 0.02 150); - --ring: oklch(0.7 0.18 145); - --radius: 0.25rem; + /* Blueprint color palette - warm cream paper with blue ink */ + --background: oklch(0.97 0.01 85); + --foreground: oklch(0.25 0.02 250); + --card: oklch(0.95 0.015 85); + --card-foreground: oklch(0.25 0.02 250); + --popover: oklch(0.96 0.01 85); + --popover-foreground: oklch(0.25 0.02 250); + --primary: oklch(0.45 0.15 250); + --primary-foreground: oklch(0.98 0.01 85); + --secondary: oklch(0.92 0.02 85); + --secondary-foreground: oklch(0.35 0.08 250); + --muted: oklch(0.90 0.015 85); + --muted-foreground: oklch(0.45 0.04 250); + --accent: oklch(0.55 0.12 30); + --accent-foreground: oklch(0.98 0.01 85); + --destructive: oklch(0.55 0.2 25); + --destructive-foreground: oklch(0.98 0.01 85); + --border: oklch(0.75 0.06 250); + --input: oklch(0.92 0.02 85); + --ring: oklch(0.45 0.15 250); + --radius: 0.125rem; + + /* Blueprint specific */ + --grid-color: oklch(0.75 0.08 250 / 0.3); + --sketch-color: oklch(0.35 0.12 250); + --annotation-color: oklch(0.50 0.15 30); } @theme inline { - --font-sans: "JetBrains Mono", "Fira Code", "SF Mono", "Monaco", monospace; - --font-mono: "JetBrains Mono", "Fira Code", "SF Mono", "Monaco", monospace; + --font-sans: "Inter", "Helvetica Neue", system-ui, sans-serif; + --font-mono: "JetBrains Mono", "Fira Code", monospace; --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); @@ -49,7 +54,7 @@ --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); - --radius-sm: calc(var(--radius) - 2px); + --radius-sm: calc(var(--radius) - 1px); --radius-md: var(--radius); --radius-lg: calc(var(--radius) + 2px); } @@ -60,16 +65,14 @@ } body { - @apply bg-background text-foreground font-mono; - cursor: none; + @apply bg-background text-foreground; + font-family: var(--font-sans); + /* Blueprint grid paper background */ background-image: - linear-gradient(rgba(0, 255, 100, 0.02) 1px, transparent 1px), - linear-gradient(90deg, rgba(0, 255, 100, 0.02) 1px, transparent 1px); - background-size: 20px 20px; - } - - a, button, [role="button"] { - cursor: none; + linear-gradient(var(--grid-color) 1px, transparent 1px), + linear-gradient(90deg, var(--grid-color) 1px, transparent 1px); + background-size: 24px 24px; + background-position: -1px -1px; } html { @@ -77,102 +80,102 @@ } ::selection { - background: rgba(52, 211, 153, 0.3); - color: #fff; + background: oklch(0.45 0.15 250 / 0.25); + color: oklch(0.20 0.02 250); } } -/* Scanline effect overlay */ -.scanlines::before { - content: ""; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 9990; - background: repeating-linear-gradient( - 0deg, - rgba(0, 0, 0, 0.1), - rgba(0, 0, 0, 0.1) 1px, - transparent 1px, - transparent 2px - ); - opacity: 0.3; -} - -/* Glitch text effect */ -.glitch { +/* Sketch/hand-drawn border effect */ +.sketch-border { position: relative; + border: 2px solid var(--sketch-color); + border-radius: 2px; } -.glitch::before, -.glitch::after { - content: attr(data-text); +.sketch-border::before { + content: ""; position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; + inset: -3px; + border: 1px solid var(--sketch-color); + border-radius: 3px; + opacity: 0.3; + pointer-events: none; } -.glitch::before { - animation: glitch-1 2s infinite linear alternate-reverse; - color: #ff0000; - z-index: -1; +/* Blueprint card styling */ +.blueprint-card { + background: oklch(0.96 0.01 85 / 0.9); + border: 1.5px solid var(--sketch-color); + border-radius: 2px; + box-shadow: + 3px 3px 0 oklch(0.45 0.15 250 / 0.1), + inset 0 0 0 1px oklch(0.45 0.15 250 / 0.05); } -.glitch::after { - animation: glitch-2 3s infinite linear alternate-reverse; - color: #00ffff; - z-index: -2; +/* Node/diagram point styling */ +.node-point { + width: 12px; + height: 12px; + border: 2px solid var(--sketch-color); + border-radius: 50%; + background: var(--background); } -@keyframes glitch-1 { - 0%, 100% { clip-path: inset(0 0 95% 0); transform: translate(-2px, 2px); } - 20% { clip-path: inset(30% 0 50% 0); transform: translate(2px, -2px); } - 40% { clip-path: inset(60% 0 20% 0); transform: translate(-2px, 0); } - 60% { clip-path: inset(10% 0 70% 0); transform: translate(0, 2px); } - 80% { clip-path: inset(80% 0 5% 0); transform: translate(2px, 0); } +.node-point.filled { + background: var(--sketch-color); } -@keyframes glitch-2 { - 0%, 100% { clip-path: inset(95% 0 0 0); transform: translate(2px, -2px); } - 20% { clip-path: inset(50% 0 30% 0); transform: translate(-2px, 2px); } - 40% { clip-path: inset(20% 0 60% 0); transform: translate(2px, 0); } - 60% { clip-path: inset(70% 0 10% 0); transform: translate(0, -2px); } - 80% { clip-path: inset(5% 0 80% 0); transform: translate(-2px, 0); } +/* Connection lines */ +.connection-line { + stroke: var(--sketch-color); + stroke-width: 1.5; + stroke-dasharray: 4 2; + fill: none; } -/* Terminal cursor blink */ -@keyframes blink { - 0%, 50% { opacity: 1; } - 51%, 100% { opacity: 0; } +.connection-line.solid { + stroke-dasharray: none; } -.cursor-blink::after { - content: "_"; - animation: blink 1s step-end infinite; +/* Annotation styling */ +.annotation { + font-family: var(--font-mono); + font-size: 0.75rem; + color: var(--annotation-color); + font-style: italic; } -/* Typing effect */ -@keyframes typing { - from { width: 0; } - to { width: 100%; } +.annotation::before { + content: "// "; + opacity: 0.6; } -.typing { - overflow: hidden; - white-space: nowrap; - animation: typing 2s steps(40, end); +/* Section label - like blueprint labels */ +.section-label { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem 0.75rem; + background: var(--sketch-color); + color: var(--background); + font-family: var(--font-mono); + font-size: 0.7rem; + font-weight: 500; + letter-spacing: 0.05em; + text-transform: uppercase; } -/* Fade in from below */ +/* Handwritten-style text */ +.handwritten { + font-family: "Caveat", "Comic Sans MS", cursive; + font-size: 1.1em; +} + +/* Fade in animation */ @keyframes fadeInUp { from { opacity: 0; - transform: translateY(30px); + transform: translateY(20px); } to { opacity: 1; @@ -181,110 +184,7 @@ } .fade-in-up { - animation: fadeInUp 0.8s ease-out forwards; -} - -/* Glow pulse */ -@keyframes glow-pulse { - 0%, 100% { - box-shadow: 0 0 5px currentColor, 0 0 10px currentColor, 0 0 15px currentColor; - opacity: 0.8; - } - 50% { - box-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor; - opacity: 1; - } -} - -.glow-pulse { - animation: glow-pulse 2s ease-in-out infinite; -} - -/* Matrix rain character style */ -.matrix-char { - font-family: monospace; - text-shadow: 0 0 8px currentColor; -} - -/* Terminal window styling */ -.terminal-window { - background: linear-gradient(180deg, rgba(15, 23, 20, 0.95) 0%, rgba(10, 18, 15, 0.98) 100%); - border: 1px solid rgba(52, 211, 153, 0.3); - box-shadow: - 0 0 20px rgba(52, 211, 153, 0.1), - inset 0 0 60px rgba(0, 0, 0, 0.5); -} - -.terminal-header { - background: linear-gradient(180deg, rgba(52, 211, 153, 0.15) 0%, rgba(52, 211, 153, 0.05) 100%); - border-bottom: 1px solid rgba(52, 211, 153, 0.2); -} - -/* Academic citation style */ -.citation { - font-size: 0.75rem; - color: rgba(52, 211, 153, 0.6); - font-style: italic; -} - -.citation::before { - content: "["; -} - -.citation::after { - content: "]"; -} - -/* Code block styling */ -.code-block { - background: rgba(0, 0, 0, 0.4); - border-left: 3px solid rgba(52, 211, 153, 0.5); - padding: 1rem; - font-family: monospace; - overflow-x: auto; -} - -/* Neon border */ -.neon-border { - border: 1px solid rgba(52, 211, 153, 0.5); - box-shadow: - 0 0 5px rgba(52, 211, 153, 0.3), - inset 0 0 5px rgba(52, 211, 153, 0.1); -} - -/* Hover glow effect */ -.hover-glow { - transition: all 0.3s ease; -} - -.hover-glow:hover { - box-shadow: 0 0 20px rgba(52, 211, 153, 0.4); - border-color: rgba(52, 211, 153, 0.8); -} - -/* ASCII art container */ -.ascii-art { - font-family: monospace; - white-space: pre; - line-height: 1.1; - font-size: 0.5rem; - color: rgba(52, 211, 153, 0.4); -} - -@media (min-width: 768px) { - .ascii-art { - font-size: 0.6rem; - } -} - -/* Floating animation */ -@keyframes float { - 0%, 100% { transform: translateY(0px); } - 50% { transform: translateY(-10px); } -} - -.animate-float { - animation: float 4s ease-in-out infinite; + animation: fadeInUp 0.6s ease-out forwards; } /* Stagger animation delays */ @@ -293,3 +193,108 @@ .stagger-3 { animation-delay: 0.3s; } .stagger-4 { animation-delay: 0.4s; } .stagger-5 { animation-delay: 0.5s; } + +/* Cursor blink for typing effect */ +@keyframes blink { + 0%, 50% { opacity: 1; } + 51%, 100% { opacity: 0; } +} + +.cursor-blink::after { + content: "|"; + animation: blink 1s step-end infinite; + margin-left: 2px; +} + +/* Graph/chart styling */ +.graph-axis { + stroke: var(--sketch-color); + stroke-width: 1.5; +} + +.graph-label { + font-family: var(--font-mono); + font-size: 0.65rem; + fill: var(--muted-foreground); +} + +/* Tag/label styling */ +.tag { + display: inline-flex; + align-items: center; + padding: 0.125rem 0.5rem; + border: 1px solid var(--border); + border-radius: 1px; + font-family: var(--font-mono); + font-size: 0.7rem; + color: var(--muted-foreground); + background: var(--secondary); +} + +.tag.primary { + border-color: var(--primary); + color: var(--primary); + background: oklch(0.45 0.15 250 / 0.08); +} + +/* Dimension lines (like architectural drawings) */ +.dimension-line { + position: relative; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.dimension-line::before, +.dimension-line::after { + content: ""; + flex: 1; + height: 1px; + background: var(--border); +} + +/* Crosshatch pattern for backgrounds */ +.crosshatch { + background-image: + repeating-linear-gradient( + 45deg, + transparent, + transparent 4px, + oklch(0.45 0.15 250 / 0.03) 4px, + oklch(0.45 0.15 250 / 0.03) 5px + ); +} + +/* Hover lift effect */ +.hover-lift { + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.hover-lift:hover { + transform: translateY(-2px); + box-shadow: 4px 4px 0 oklch(0.45 0.15 250 / 0.15); +} + +/* Link styling */ +a.blueprint-link { + color: var(--primary); + text-decoration: none; + border-bottom: 1px dashed var(--primary); + transition: border-color 0.2s; +} + +a.blueprint-link:hover { + border-bottom-style: solid; +} + +/* Status indicators */ +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + border: 1.5px solid currentColor; +} + +.status-dot.active { + background: currentColor; +} diff --git a/components/about-section.tsx b/components/about-section.tsx index 7312d34..cabcd80 100644 --- a/components/about-section.tsx +++ b/components/about-section.tsx @@ -1,152 +1,126 @@ "use client" -const MYCELIUM_ASCII = ` - ╭───╮ ╭───╮ - │ ◉ ├─────┤ ◉ │ - ╰─┬─╯ ╰─┬─╯ - │ ╭────┴────╮ - ╭──┴──╮ │ NODES │ - │ ◉◉◉ ├─┤ CONNECT │ - ╰──┬──╯ ╰────┬────╯ - │ │ - ═══╧═════════╧═══ -` - -const BIO_BLOCKS = [ +const FOCUS_AREAS = [ { - command: "cat identity.yml", - content: `name: "Jeff Emmett" -role: "Token Engineering Researcher" -focus: ["regenerative_systems", "crypto_commons", "emancipatory_tech"] -affiliation: ["Commons Stack", "MycoFi", "Bonding Curve Research Group"]`, + label: "Token Engineering", + description: "Designing sustainable crypto-economic systems", + items: ["Bonding Curves", "cadCAD Modeling", "Primary Issuance Markets"], }, { - command: "cat mission.md", - content: `## Core Mission - -Designing cyber-physical commons architectures that translate -Elinor Ostrom's principles into DAO templates. Building -customizable libraries for communal management of public goods. - -> "Just as the Golden Gate Bridge required rigorous engineering, -> our token economies need mathematical validation."`, + label: "Governance", + description: "Mechanisms for collective decision-making", + items: ["Conviction Voting", "DAO Templates", "Ostrom Principles"], }, { - command: "cat research_focus.txt", - content: `PRIMARY ISSUANCE MARKETS -└── Challenging fixed-supply paradigm -└── Dynamic token mechanisms -└── Volatility dampening -└── Sustainable ecosystem revenue - -MYCOECONOMICS -└── Fungal network-inspired economics -└── Evolutionary resource allocation -└── Regenerative protocol design -└── Mutual aid & permaculture currency`, + label: "Regenerative Economics", + description: "Beyond extractive growth models", + items: ["MycoFi", "Commons-based Systems", "Mutual Aid"], }, ] -const STATS = [ - { value: "2015", label: "// origin_block", subtext: "First entry into Web3" }, - { value: "8+", label: "// years_exp", subtext: "Token Engineering" }, - { value: "∞", label: "// impact_scope", subtext: "Regenerative systems" }, -] - export function AboutSection() { return ( -
+
{/* Section header */}
-
- $ -

- whoami -

+ About +

+ Background +

+
+ + {/* Main content card */} +
+
+

+ I'm a token engineering researcher and systems designer exploring the + intersection of economics, ecology, and decentralized coordination. My work + focuses on creating tools and frameworks that enable communities to manage + shared resources sustainably and equitably. +

+ +

+ As a co-founder of the Commons Stack, + I've been instrumental in developing cyber-physical commons architectures + that translate Elinor Ostrom's principles into DAO templates. We build + customizable libraries of tools for communal management of public goods. +

+ +

+ Through MycoFi, I explore + mycoeconomics—economic systems inspired by fungal networks. By emulating + nature's evolutionary resource allocation algorithms, we can design + regenerative protocols built on cooperation rather than extraction. +

-
-

- # Operator Profile -

-

- ## Token engineer, systems thinker, regenerative economist -

+ + {/* Timeline markers */} +
+
+
+ 2015 + Entered Web3 +
+ + + +
+
+ 2018 + Co-founded Commons Stack +
+ + + +
+
+ 2023 + Launched MycoFi +
+ + + +
+
+ now + Continuing to build... +
- {/* ASCII art and bio blocks */} -
- {/* ASCII Mycelium */} -
-
-              {MYCELIUM_ASCII}
-            
-

- mycelial_network.active -

-
- - {/* Bio blocks */} -
- {BIO_BLOCKS.map((block, index) => ( -
-
- - jeff@emmett:~$ {block.command} - -
-
-
-                    {block.content}
-                  
-
-
- ))} -
-
- - {/* Stats grid */} -
- {STATS.map((stat, index) => ( + {/* Focus areas as a diagram */} +
+ {FOCUS_AREAS.map((area, index) => (
-
- {stat.value} -
-
- {stat.label} -
-
- {stat.subtext} +
+
+

{area.label}

+

+ {area.description} +

+
    + {area.items.map((item) => ( +
  • + + {item} +
  • + ))} +
))}
- {/* Tools declaration */} -
-

/* Open Source Contributions */

-

- export const tools = [ + {/* Annotation */} +

+

+ Just as bridges require engineering, our token economies need mathematical validation

-

- "cadCAD", // Token economy simulation -

-

- "Conviction Voting", // Novel governance mechanism -

-

- "Augmented Bonding Curves", // Sustainable funding -

-

];

diff --git a/components/contact-section.tsx b/components/contact-section.tsx index cddfa6a..8b7ca3b 100644 --- a/components/contact-section.tsx +++ b/components/contact-section.tsx @@ -1,178 +1,120 @@ "use client" -const NETWORK_NODES = [ +const CONNECTIONS = [ { - protocol: "mailto:", - address: "jeff@commonsstack.org", - label: "email", - icon: "📧", - description: "pgp_key_available", + label: "Email", + value: "jeff@commonsstack.org", + href: "mailto:jeff@commonsstack.org", }, { - protocol: "https://", - address: "bsky.app/profile/jeffemmett.bsky.social", - label: "bluesky", - icon: "🦋", - description: "@jeffemmett", + label: "Bluesky", + value: "@jeffemmett", + href: "https://bsky.app/profile/jeffemmett.bsky.social", }, { - protocol: "https://", - address: "twitter.com/JeffEmmett", - label: "x/twitter", - icon: "𝕏", - description: "@JeffEmmett", + label: "X/Twitter", + value: "@JeffEmmett", + href: "https://twitter.com/JeffEmmett", }, { - protocol: "https://", - address: "medium.com/@jeffemmett", - label: "medium", - icon: "📝", - description: "long_form_research", - }, - { - protocol: "https://", - address: "commonsstack.org", - label: "commons_stack", - icon: "🏛️", - description: "primary_organization", - }, - { - protocol: "https://", - address: "mycofi.earth", - label: "mycofi", - icon: "🍄", - description: "mycoeconomics_research", + label: "Medium", + value: "jeffemmett", + href: "https://medium.com/@jeffemmett", }, ] -const ASCII_NETWORK = ` - ◉─────◉─────◉ - │╲ ╱│╲ ╱│ - │ ╲ ╱ │ ╲ ╱ │ - ◉──◉──◉──◉──◉ - │ ╱ ╲ │ ╱ ╲ │ - │╱ ╲│╱ ╲│ - ◉─────◉─────◉ -` +const PROJECTS = [ + { + label: "Commons Stack", + href: "https://commonsstack.org", + }, + { + label: "MycoFi", + href: "https://mycofi.earth", + }, + { + label: "Token Engineering", + href: "https://tokenengineering.net", + }, +] export function ContactSection() { return ( -
+
{/* Section header */}
-
- $ -

- ssh connect@jeff.emmett -

-
-
-

- # Establish Connection -

-

- ## Token engineering, regenerative economics, commons-based systems -

-
+ Connect +

+ Get In Touch +

+

+ Interested in token engineering, regenerative economics, or building + commons-based systems? Let's collaborate. +

- {/* Network visualization + links */} -
- {/* ASCII Network */} -
-
-              {ASCII_NETWORK}
-            
-

- node_mesh.active -

+ {/* Connection grid */} +
+ {/* Direct contact */} +
+
+
+

Direct

+
+
+ {CONNECTIONS.map((connection) => ( + + + {connection.label} + + + {connection.value} + + + ))} +
- {/* Connection nodes */} - -
- - {/* Connection prompt */} -
-
- - connection_status - -
-
-

- $ ping collaboration.request -

-

- PING collaboration.request (∞.∞.∞.∞): 56 data bytes -

-

- 64 bytes from jeff@emmett: icmp_seq=0 ttl=∞ time={"<"}1ms -

-

- 64 bytes from jeff@emmett: icmp_seq=1 ttl=∞ time={"<"}1ms -

-

- --- collaboration.request ping statistics --- -

-

- STATUS: READY_TO_CONNECT -

-

- Interested in token engineering, regenerative economics, or building - commons-based systems? Let's collaborate. -

+ {/* Projects */} +
+
+
+

Projects

+
+
+ {PROJECTS.map((project, index) => ( + +
{/* Footer */} -
+
-
-

- /* Built with Next.js + - TailwindCSS */ -

-
-
- ©{" "}{new Date().getFullYear()} - jeff.emmett - | - open_source_human -
-
-
-

- "Building regenerative systems one token at a time." +

+ © {new Date().getFullYear()} Jeff Emmett +

+

+ Building regenerative systems, one token at a time

diff --git a/components/cursor-effect.tsx b/components/cursor-effect.tsx index 2d482ce..e48e3ed 100644 --- a/components/cursor-effect.tsx +++ b/components/cursor-effect.tsx @@ -1,197 +1,101 @@ 'use client' -import { useEffect, useState, useCallback } from 'react' - -interface Particle { - id: number - x: number - y: number - char: string - opacity: number - velocity: { x: number; y: number } - life: number -} - -const MATRIX_CHARS = '01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン∞∂∆∇∫∮≈≠≤≥' +import { useEffect, useState } from 'react' export function CursorEffect() { const [position, setPosition] = useState({ x: -100, y: -100 }) const [isHovering, setIsHovering] = useState(false) - const [particles, setParticles] = useState([]) - const [glitchOffset, setGlitchOffset] = useState({ x: 0, y: 0 }) - - const createParticle = useCallback((x: number, y: number): Particle => { - const angle = Math.random() * Math.PI * 2 - const speed = Math.random() * 2 + 1 - return { - id: Date.now() + Math.random(), - x, - y, - char: MATRIX_CHARS[Math.floor(Math.random() * MATRIX_CHARS.length)], - opacity: 1, - velocity: { - x: Math.cos(angle) * speed, - y: Math.sin(angle) * speed + 1, // slight downward bias - }, - life: 1, - } - }, []) + const [isVisible, setIsVisible] = useState(false) useEffect(() => { - let frameId: number - let lastTime = 0 - - const animate = (time: number) => { - if (time - lastTime > 50) { - setParticles(prev => - prev - .map(p => ({ - ...p, - x: p.x + p.velocity.x, - y: p.y + p.velocity.y, - life: p.life - 0.02, - opacity: p.life, - })) - .filter(p => p.life > 0) - ) - lastTime = time - } - frameId = requestAnimationFrame(animate) - } - - frameId = requestAnimationFrame(animate) - return () => cancelAnimationFrame(frameId) - }, []) - - useEffect(() => { - let particleThrottle = 0 - const handleMouseMove = (e: MouseEvent) => { setPosition({ x: e.clientX, y: e.clientY }) - - // Spawn particles occasionally - particleThrottle++ - if (particleThrottle % 3 === 0) { - setParticles(prev => [...prev.slice(-30), createParticle(e.clientX, e.clientY)]) - } - - // Random glitch effect - if (Math.random() > 0.95) { - setGlitchOffset({ - x: (Math.random() - 0.5) * 10, - y: (Math.random() - 0.5) * 10, - }) - setTimeout(() => setGlitchOffset({ x: 0, y: 0 }), 50) - } + setIsVisible(true) const target = e.target as HTMLElement const isInteractive = target.closest('a, button, [role="button"], input, textarea') setIsHovering(!!isInteractive) } + const handleMouseLeave = () => { + setIsVisible(false) + } + window.addEventListener('mousemove', handleMouseMove) - return () => window.removeEventListener('mousemove', handleMouseMove) - }, [createParticle]) + document.addEventListener('mouseleave', handleMouseLeave) + + return () => { + window.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseleave', handleMouseLeave) + } + }, []) + + if (!isVisible) return null return ( <> - {/* Matrix particle trail */} - {particles.map(particle => ( - - {particle.char} - - ))} - - {/* Main cursor - terminal style */} + {/* Simple crosshair cursor */}
- {/* Outer scan ring */} -
- - {/* Inner crosshair */} -
+ {/* Crosshair */} + {/* Horizontal line */} -
+ {/* Vertical line */} -
+ {/* Center dot */} -
-
+
- {/* Glitch duplicate (red channel) */} - {glitchOffset.x !== 0 && ( -
- )} + {/* Subtle trailing dot */} +
) } diff --git a/components/hero-section.tsx b/components/hero-section.tsx index 34b2364..d129abd 100644 --- a/components/hero-section.tsx +++ b/components/hero-section.tsx @@ -2,57 +2,25 @@ import { useEffect, useState } from "react" -const MUSHROOM_ASCII = ` - ████████ - ██░░░░░░░░██ - ██░░░░░░░░░░░░██ - ██░░░░░░░░░░░░░░░░██ - ██░░░░██░░░░░░██░░░░░░██ - ██░░░░░░░░░░░░░░░░░░░░██ - ██░░░░░░░░░░░░░░░░██ - ████████████████ - ██░░██ - ██░░██ - ██░░░░░░██ -` - const RESEARCH_DOMAINS = [ + "token engineering", + "regenerative economics", + "commons governance", "mycoeconomics", - "token_engineering", - "psilo_cybernetics", - "institutional_neuroplasticity", - "zk_local_first_systems", - "regenerative_crypto_commons", - "emancipatory_technology", + "institutional design", + "collective intelligence", + "crypto commons", ] export function HeroSection() { const [typedText, setTypedText] = useState("") const [currentDomain, setCurrentDomain] = useState(0) const [showCursor, setShowCursor] = useState(true) - const [bootSequence, setBootSequence] = useState(0) const fullText = RESEARCH_DOMAINS[currentDomain] - // Boot sequence effect - useEffect(() => { - const bootSteps = [1, 2, 3, 4, 5] - let step = 0 - const bootInterval = setInterval(() => { - if (step < bootSteps.length) { - setBootSequence(bootSteps[step]) - step++ - } else { - clearInterval(bootInterval) - } - }, 300) - return () => clearInterval(bootInterval) - }, []) - // Typing effect useEffect(() => { - if (bootSequence < 5) return - let charIndex = 0 setTypedText("") @@ -64,12 +32,12 @@ export function HeroSection() { clearInterval(typeInterval) setTimeout(() => { setCurrentDomain((prev) => (prev + 1) % RESEARCH_DOMAINS.length) - }, 2000) + }, 2500) } - }, 80) + }, 70) return () => clearInterval(typeInterval) - }, [currentDomain, fullText, bootSequence]) + }, [currentDomain, fullText]) // Cursor blink useEffect(() => { @@ -80,154 +48,117 @@ export function HeroSection() { }, []) return ( -
- {/* Background grid pattern - handled by body in CSS */} +
+ {/* Blueprint frame corners */} +
+
+
+
- {/* Floating ASCII mushroom */} -
-
{MUSHROOM_ASCII}
-
- - {/* Main terminal window */} -
- {/* Terminal header */} -
-
-
-
-
-
- - jeff@emmett:~/research$ - + {/* Main content */} +
+ {/* Section label */} +
+ Overview
- {/* Terminal content */} -
- {/* Boot sequence */} -
- {bootSequence >= 1 && ( -

[OK] Loading cognitive_substrate.so

- )} - {bootSequence >= 2 && ( -

[OK] Initializing mycelial_network

- )} - {bootSequence >= 3 && ( -

[OK] Mounting /dev/commons

- )} - {bootSequence >= 4 && ( -

[OK] Syncing regenerative_protocols

- )} - {bootSequence >= 5 && ( -

- [READY] System initialized. Welcome. -

- )} + {/* Main title area */} +
+ {/* Name */} +

+ Jeff Emmett +

+ + {/* Exploring line with typing effect */} +
+ Exploring + + {typedText} + +
- {bootSequence >= 5 && ( - <> - {/* Main title */} -
-

- JEFF EMMETT -

+ {/* Description */} +

+ Token engineering researcher designing systems at the intersection + of regenerative economics, crypto commons, and collective intelligence. + Co-founder of Commons Stack and MycoFi. +

-
- $ - exploring - - {typedText} - - _ - - -
-
+ {/* Key affiliations as diagram nodes */} +
+
+
+ Commons Stack +
+ + + +
+
+ MycoFi +
+ + + +
+
+ Bonding Curve Research +
+
+
- {/* Description block */} -
-

- /** -

-

- * Token engineering researcher at the intersection of -

-

- * regenerative systems, crypto commons, and emancipatory tech. -

-

*

-

- * Co-founder:{" "} - Commons Stack,{" "} - MycoFi -

-

- * Research: Bonding curves, conviction voting, institutional design -

-

- */ -

-
+ {/* Navigation links */} +
+ +
+ Research + + + +
+ About + + + + - {/* Navigation links */} - - - {/* Academic citation */} -
-

- Emmett, J. (2019-present). "Towards Regenerative Cryptoeconomics: - Designing Systems for Collective Flourishing." Working papers - available at commons.stack -

-
- - )} + {/* Annotation */} +
+

+ Designing systems for collective flourishing since 2015 +

{/* Scroll indicator */} -
-
- scroll - -
+
+ scroll + + +
) diff --git a/components/skills-section.tsx b/components/skills-section.tsx index aaaa582..9e542c0 100644 --- a/components/skills-section.tsx +++ b/components/skills-section.tsx @@ -1,162 +1,132 @@ "use client" -import { useState } from "react" +const SKILL_CATEGORIES = [ + { + name: "Systems Design", + skills: [ + { name: "Token Engineering", level: 95 }, + { name: "Mechanism Design", level: 90 }, + { name: "Agent-Based Modeling", level: 85 }, + { name: "Complex Systems", level: 80 }, + ], + }, + { + name: "Governance", + skills: [ + { name: "DAO Architecture", level: 90 }, + { name: "Voting Systems", level: 92 }, + { name: "Institutional Design", level: 85 }, + { name: "Commons Management", level: 88 }, + ], + }, + { + name: "Technical", + skills: [ + { name: "cadCAD / Python", level: 88 }, + { name: "Solidity", level: 70 }, + { name: "Data Analysis", level: 82 }, + { name: "Simulation", level: 85 }, + ], + }, +] -interface SkillNode { - id: string - name: string - level: number // 0-100 - dependencies: string[] - description: string -} - -const SKILL_TREE: Record = { - "token_engineering/": [ - { id: "bc", name: "bonding_curves.sol", level: 95, dependencies: [], description: "AMMs & primary issuance markets" }, - { id: "cv", name: "conviction_voting.py", level: 90, dependencies: ["bc"], description: "Continuous decision-making" }, - { id: "abc", name: "augmented_bonding.ts", level: 88, dependencies: ["bc"], description: "Sustainable funding mechanisms" }, - { id: "cad", name: "cadCAD_modeling/", level: 92, dependencies: [], description: "Agent-based economic simulation" }, - { id: "ds", name: "dynamic_supply.rs", level: 85, dependencies: ["bc", "cad"], description: "Elastic token mechanisms" }, - ], - "governance/": [ - { id: "dao", name: "dao_templates/", level: 90, dependencies: [], description: "Cyber-physical commons frameworks" }, - { id: "ost", name: "ostrom_compliance.md", level: 88, dependencies: ["dao"], description: "8 principles encoded" }, - { id: "cgov", name: "collective_governance/", level: 85, dependencies: ["cv"], description: "Participatory systems" }, - ], - "research/": [ - { id: "myco", name: "mycoeconomics/", level: 80, dependencies: [], description: "Fungal network economics" }, - { id: "regen", name: "regenerative_economics.tex", level: 85, dependencies: ["myco"], description: "Beyond extractive models" }, - { id: "complex", name: "complex_systems.jl", level: 78, dependencies: [], description: "Emergence & adaptation" }, - { id: "behav", name: "behavioral_economics/", level: 75, dependencies: [], description: "Human coordination patterns" }, - ], - "tools/": [ - { id: "py", name: "python", level: 88, dependencies: [], description: "Primary analysis language" }, - { id: "sol", name: "solidity", level: 75, dependencies: [], description: "Smart contract development" }, - { id: "sim", name: "simulation/", level: 85, dependencies: ["py", "cad"], description: "Monte Carlo & ABM" }, - { id: "web3", name: "web3_stack/", level: 80, dependencies: ["sol"], description: "Decentralized infrastructure" }, - ], -} - -function ProgressBar({ level }: { level: number }) { - const filled = Math.floor(level / 5) - const empty = 20 - filled +function SkillBar({ level }: { level: number }) { return ( - - {"█".repeat(filled)} - {"░".repeat(empty)} - {level}% - +
+
+
) } export function SkillsSection() { - const [expandedDir, setExpandedDir] = useState("token_engineering/") - return (
{/* Section header */}
-
- $ -

- tree ~/skills --depth=2 -

-
-
-

- # Expertise & Focus Areas -

-

- ## Interdisciplinary toolkit for building resilient token economies -

-
+ Expertise +

+ Skills & Focus Areas +

+

+ Interdisciplinary approach to building resilient token economies + and regenerative systems. +

- {/* Skill tree */} -
-
- - jeff@emmett:~/skills$ - - - [SKILL_TREE v2.0] - -
-
- {/* Root */} -
~/skills/
- - {/* Directories */} - {Object.entries(SKILL_TREE).map(([dir, skills], dirIndex) => ( -
- {/* Directory name */} -
setExpandedDir(expandedDir === dir ? null : dir)} - > - - {expandedDir === dir ? "▼" : "▶"} - - {dir} - - [{skills.length} items] - -
- - {/* Skills in directory */} - {expandedDir === dir && ( -
- {skills.map((skill, index) => ( -
-
- ├── -
-
- - {skill.name} - - -
-

- └─ {skill.description} -

-
-
-
- ))} -
└── ...
-
- )} + {/* Skills diagram */} +
+ {SKILL_CATEGORIES.map((category, catIndex) => ( +
+
+
+

{category.name}

- ))} - {/* Footer */} -
-

- 4 directories,{" "} - 17 skills,{" "} - ∞ learning -

+
+ {category.skills.map((skill) => ( +
+
+ {skill.name} + + {skill.level}% + +
+ +
+ ))} +
-
+ ))}
- {/* Methodology note */} -
-

/* Methodology */

-

- // Skills interconnect like mycelial networks -

-

- // Each node strengthens the whole system -

-

- // Constant iteration, never complete + {/* Connection diagram between categories */} +

+ + {/* Connection lines */} + + + {/* Nodes */} + + + + {/* Labels */} + + Design + + + Govern + + + Build + + +
+ + {/* Annotation */} +
+

+ Skills interconnect like mycelial networks—each node strengthens the whole

diff --git a/components/work-section.tsx b/components/work-section.tsx index 240be97..029d7d2 100644 --- a/components/work-section.tsx +++ b/components/work-section.tsx @@ -21,7 +21,7 @@ const RESEARCH_ITEMS: ResearchItem[] = [ year: "2019", abstract: "Exploration of automated market makers as coordination mechanisms for decentralized communities. Analysis of augmented bonding curves for sustainable funding of public goods.", - tags: ["AMM", "DeFi", "public_goods", "cadCAD"], + tags: ["AMM", "DeFi", "public goods", "cadCAD"], link: "https://medium.com/commonsstack", status: "published", }, @@ -32,7 +32,7 @@ const RESEARCH_ITEMS: ResearchItem[] = [ year: "2020", abstract: "Time-weighted voting mechanism that allows preferences to accumulate over time, reducing plutocratic attack vectors and enabling more nuanced collective decision-making.", - tags: ["governance", "voting", "mechanism_design"], + tags: ["governance", "voting", "mechanism design"], link: "https://blog.giveth.io/conviction-voting", status: "published", }, @@ -47,16 +47,6 @@ const RESEARCH_ITEMS: ResearchItem[] = [ link: "https://mycofi.earth", status: "ongoing", }, - { - id: "psilo-cybernetics", - title: "Psilo-Cybernetics: Consciousness, Computation, and Collective Intelligence", - category: "psilo_cybernetics", - year: "2024", - abstract: - "Theoretical framework connecting altered states of consciousness with distributed systems theory. Exploring the intersection of psychedelic research and cybernetic governance.", - tags: ["consciousness", "cybernetics", "emergence"], - status: "working", - }, { id: "institutional-neuroplasticity", title: "Institutional Neuroplasticity: Adaptive Governance for Complex Systems", @@ -74,18 +64,17 @@ const RESEARCH_ITEMS: ResearchItem[] = [ year: "2025", abstract: "Architecture for local-first applications with ZK proofs for selective disclosure. Enabling community coordination without surveillance capitalism.", - tags: ["ZK", "privacy", "local_first", "p2p"], + tags: ["ZK", "privacy", "local-first", "p2p"], status: "working", }, ] const CATEGORIES = [ - { id: "all", label: "/*" }, - { id: "token_engineering", label: "token_eng" }, - { id: "governance", label: "governance" }, - { id: "mycoeconomics", label: "myco" }, - { id: "cryptography", label: "crypto" }, - { id: "psilo_cybernetics", label: "psilo" }, + { id: "all", label: "All" }, + { id: "token_engineering", label: "Token Engineering" }, + { id: "governance", label: "Governance" }, + { id: "mycoeconomics", label: "Mycoeconomics" }, + { id: "cryptography", label: "Cryptography" }, ] export function WorkSection() { @@ -102,21 +91,14 @@ export function WorkSection() {
{/* Section header */}
-
- $ -

- cat research.md -

-
-
-

- # Research & Working Papers -

-

- ## Exploring regenerative systems, token engineering, and - collective intelligence -

-
+ Research +

+ Working Papers & Publications +

+

+ Exploring regenerative systems, token engineering, and collective intelligence + through research and open-source tooling. +

{/* Category filter */} @@ -125,10 +107,8 @@ export function WorkSection() {
- {/* Research items */} + {/* Research items as diagram nodes */}
{filteredItems.map((item, index) => (
setExpandedItem(expandedItem === item.id ? null : item.id) } > {/* Header row */} -
-
-
+
+ {/* Node indicator */} +
+
+
+ + {/* Content */} +
+
{item.status} - + {item.year}
-

+

{item.title}

+
+ {item.tags.map((tag) => ( + + #{tag} + + ))} +
- - ▼ - -
- - {/* Tags */} -
- {item.tags.map((tag) => ( - - {tag} - - ))} + +
{/* Expanded content */} {expandedItem === item.id && ( -
+

{item.abstract}

@@ -205,22 +209,25 @@ export function WorkSection() { href={item.link} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center gap-2 text-sm text-emerald-400 hover:text-emerald-300 transition-colors" + className="blueprint-link text-sm" onClick={(e) => e.stopPropagation()} > - - Read more + Read more → )} -
- Emmett, J. ({item.year}). "{item.title}." -
)}
))}
+ + {/* Annotation */} +
+

+ Open access research for the commons +

+
)