From cac08cc44ac2a6f986e629ff08e370b8e0a3f8ac Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Wed, 25 Feb 2026 19:41:33 -0800 Subject: [PATCH] Add cycling terminal quips referencing mycoverse projects Typewriter effect cycles through 16 witty prompts touching on compost capitalism, nofi, undernet, yourspace, mycofi, permaculture economies, pluralistic value, and more. Co-Authored-By: Claude Opus 4.6 --- components/hero-section.tsx | 64 ++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/components/hero-section.tsx b/components/hero-section.tsx index dcc98e3..f13e16a 100644 --- a/components/hero-section.tsx +++ b/components/hero-section.tsx @@ -2,11 +2,67 @@ import { useSectionReveal } from "@/hooks/use-section-reveal" import { ChevronDown } from "lucide-react" +import { useState, useEffect } from "react" const TITLE = "MycoStack" +const QUIPS = [ + "(com)post-capitalism, growing alternatives", + "routing nutrients, not profits", + "the network beneath the network", + "stop making money, start making sense", + "building from beneath the surface", + "the (post-app)lication layer for regeneration", + "(you)r space, (you)r rules, (you)r data", + "encrypted, entangled, evolving", + "permaculture economies, pluralistic value", + "peer for peer, people for planet", + "voice for all, extraction for none", + "design global, manufacture local", + "funding flows where needed, not where hoarded", + "the more we share, the more we have", + "sovereign tech for sovereign communities", + "composting the old, inoculating the new", +] + export function HeroSection() { const sectionRef = useSectionReveal() + const [quipIndex, setQuipIndex] = useState(0) + const [displayed, setDisplayed] = useState("") + const [phase, setPhase] = useState<"typing" | "holding" | "erasing">("typing") + + useEffect(() => { + const quip = QUIPS[quipIndex] + + if (phase === "typing") { + if (displayed.length < quip.length) { + const timeout = setTimeout(() => { + setDisplayed(quip.slice(0, displayed.length + 1)) + }, 35 + Math.random() * 25) + return () => clearTimeout(timeout) + } else { + const timeout = setTimeout(() => setPhase("holding"), 100) + return () => clearTimeout(timeout) + } + } + + if (phase === "holding") { + const timeout = setTimeout(() => setPhase("erasing"), 3000) + return () => clearTimeout(timeout) + } + + if (phase === "erasing") { + if (displayed.length > 0) { + const timeout = setTimeout(() => { + setDisplayed(displayed.slice(0, -1)) + }, 18) + return () => clearTimeout(timeout) + } else { + setQuipIndex((prev) => (prev + 1) % QUIPS.length) + setPhase("typing") + } + } + }, [displayed, phase, quipIndex]) return (
- {/* Terminal tagline */} + {/* Cycling terminal tagline */}
- > composting capitalism, - growing alternatives + >{" "} + {displayed} _