Add extended Ostrom goods matrix section with anti-rival column
Recreates the Excludability × Subtractability matrix in mycostack aesthetics with the third Anti-rival column (network goods, symbiotic goods). Commentary frames symbiotic goods as the MycoStack's territory — anti-rival and non-excludable, where every participant strengthens the whole. Placed between Legacy and Compost sections. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1f4c770272
commit
c844d86527
|
|
@ -1,6 +1,7 @@
|
||||||
import { MycelialCanvas } from "@/components/mycelial-canvas"
|
import { MycelialCanvas } from "@/components/mycelial-canvas"
|
||||||
import { HeroSection } from "@/components/hero-section"
|
import { HeroSection } from "@/components/hero-section"
|
||||||
import { LegacySection } from "@/components/legacy-section"
|
import { LegacySection } from "@/components/legacy-section"
|
||||||
|
import { GoodsMatrixSection } from "@/components/goods-matrix-section"
|
||||||
import { CompostSection } from "@/components/compost-section"
|
import { CompostSection } from "@/components/compost-section"
|
||||||
import { MyceliumSection } from "@/components/mycelium-section"
|
import { MyceliumSection } from "@/components/mycelium-section"
|
||||||
import { UndernetSection } from "@/components/undernet-section"
|
import { UndernetSection } from "@/components/undernet-section"
|
||||||
|
|
@ -17,6 +18,7 @@ export default function Home() {
|
||||||
<main className="relative z-10">
|
<main className="relative z-10">
|
||||||
<HeroSection />
|
<HeroSection />
|
||||||
<LegacySection />
|
<LegacySection />
|
||||||
|
<GoodsMatrixSection />
|
||||||
<CompostSection />
|
<CompostSection />
|
||||||
<MyceliumSection />
|
<MyceliumSection />
|
||||||
<UndernetSection />
|
<UndernetSection />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,240 @@
|
||||||
|
"use client"
|
||||||
|
|
||||||
|
import { useSectionReveal } from "@/hooks/use-section-reveal"
|
||||||
|
|
||||||
|
const MATRIX = [
|
||||||
|
{
|
||||||
|
excludability: "Excludable",
|
||||||
|
cells: [
|
||||||
|
{
|
||||||
|
type: "Private goods",
|
||||||
|
example: "e.g. coffee",
|
||||||
|
column: "rival" as const,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "Club / toll goods",
|
||||||
|
example: "e.g. museum visit",
|
||||||
|
column: "nonrival" as const,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "Network goods",
|
||||||
|
example: "e.g. Fortnite",
|
||||||
|
column: "antirival" as const,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
excludability: "Non-excludable",
|
||||||
|
cells: [
|
||||||
|
{
|
||||||
|
type: "Common-pool goods",
|
||||||
|
example: "e.g. ocean fish",
|
||||||
|
column: "rival" as const,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "Public goods",
|
||||||
|
example: "e.g. public beach",
|
||||||
|
column: "nonrival" as const,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "Symbiotic goods",
|
||||||
|
example: "e.g. the Internet",
|
||||||
|
column: "antirival" as const,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function GoodsMatrixSection() {
|
||||||
|
const sectionRef = useSectionReveal()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section ref={sectionRef} className="relative py-32 px-6 noise-overlay">
|
||||||
|
<div className="mycelial-divider mb-20" />
|
||||||
|
|
||||||
|
<div className="max-w-4xl mx-auto space-y-16">
|
||||||
|
<div className="section-reveal space-y-4 text-center">
|
||||||
|
<h2 className="font-serif text-4xl sm:text-5xl md:text-6xl font-bold">
|
||||||
|
Beyond Ostrom’s Matrix
|
||||||
|
</h2>
|
||||||
|
<p className="text-lg sm:text-xl opacity-70 max-w-2xl mx-auto">
|
||||||
|
Elinor Ostrom mapped the commons as a 2×2 grid. But the
|
||||||
|
network age reveals a third column — goods that grow{" "}
|
||||||
|
<em>more</em> valuable the more people use them.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Matrix Table — Desktop */}
|
||||||
|
<div className="section-reveal hidden sm:block" style={{ transitionDelay: "0.1s" }}>
|
||||||
|
<div className="glass-card overflow-hidden">
|
||||||
|
{/* Header row */}
|
||||||
|
<div className="grid grid-cols-[160px_1fr_1fr_1fr]">
|
||||||
|
<div className="p-4 flex items-end">
|
||||||
|
<span className="font-serif text-sm font-semibold opacity-50">
|
||||||
|
Excludability
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="col-span-3 text-center py-2 border-b border-current/10">
|
||||||
|
<span className="font-serif text-base font-semibold opacity-70">
|
||||||
|
Subtractability
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-[160px_1fr_1fr_1fr]">
|
||||||
|
<div />
|
||||||
|
<div className="p-3 text-center border-b border-current/10">
|
||||||
|
<span className="font-mono text-xs opacity-50">Rival</span>
|
||||||
|
</div>
|
||||||
|
<div className="p-3 text-center border-b border-current/10">
|
||||||
|
<span className="font-mono text-xs opacity-50">Nonrival</span>
|
||||||
|
</div>
|
||||||
|
<div className="p-3 text-center border-b border-current/10">
|
||||||
|
<span
|
||||||
|
className="font-mono text-xs font-semibold"
|
||||||
|
style={{ color: "var(--scroll-accent)" }}
|
||||||
|
>
|
||||||
|
Anti-rival
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Data rows */}
|
||||||
|
{MATRIX.map((row, ri) => (
|
||||||
|
<div
|
||||||
|
key={row.excludability}
|
||||||
|
className="grid grid-cols-[160px_1fr_1fr_1fr]"
|
||||||
|
>
|
||||||
|
<div className="p-4 flex items-center border-r border-current/10">
|
||||||
|
<span className="font-mono text-xs opacity-60">
|
||||||
|
{row.excludability}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{row.cells.map((cell) => (
|
||||||
|
<div
|
||||||
|
key={cell.type}
|
||||||
|
className={`p-4 text-center ${
|
||||||
|
ri === 0 ? "border-b border-current/5" : ""
|
||||||
|
} ${
|
||||||
|
cell.column === "antirival"
|
||||||
|
? "bg-current/[0.04]"
|
||||||
|
: ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className={`font-serif text-sm font-semibold ${
|
||||||
|
cell.column === "antirival" ? "" : "opacity-80"
|
||||||
|
}`}
|
||||||
|
style={
|
||||||
|
cell.column === "antirival"
|
||||||
|
? { color: "var(--scroll-accent)" }
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{cell.type}
|
||||||
|
</div>
|
||||||
|
<div className="font-mono text-xs opacity-40 mt-1">
|
||||||
|
{cell.example}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Matrix — Mobile (stacked cards) */}
|
||||||
|
<div className="section-reveal sm:hidden space-y-3" style={{ transitionDelay: "0.1s" }}>
|
||||||
|
{MATRIX.map((row) =>
|
||||||
|
row.cells.map((cell) => (
|
||||||
|
<div
|
||||||
|
key={cell.type}
|
||||||
|
className={`glass-card p-4 space-y-1 ${
|
||||||
|
cell.column === "antirival"
|
||||||
|
? "ring-1 ring-current/20"
|
||||||
|
: ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span
|
||||||
|
className={`font-serif text-sm font-semibold ${
|
||||||
|
cell.column === "antirival" ? "" : "opacity-80"
|
||||||
|
}`}
|
||||||
|
style={
|
||||||
|
cell.column === "antirival"
|
||||||
|
? { color: "var(--scroll-accent)" }
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{cell.type}
|
||||||
|
</span>
|
||||||
|
<span className="font-mono text-xs opacity-40">
|
||||||
|
{cell.example}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="font-mono text-xs opacity-40">
|
||||||
|
{row.excludability} ·{" "}
|
||||||
|
{cell.column === "antirival"
|
||||||
|
? "Anti-rival"
|
||||||
|
: cell.column === "nonrival"
|
||||||
|
? "Nonrival"
|
||||||
|
: "Rival"}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Commentary */}
|
||||||
|
<div
|
||||||
|
className="section-reveal max-w-3xl mx-auto space-y-6"
|
||||||
|
style={{ transitionDelay: "0.2s" }}
|
||||||
|
>
|
||||||
|
<div className="space-y-4 text-base leading-relaxed opacity-80">
|
||||||
|
<p>
|
||||||
|
Traditional economics fixates on the left two columns: private
|
||||||
|
goods to buy, public goods to fund, common-pool resources to
|
||||||
|
manage. Ostrom’s Nobel-winning work showed that communities
|
||||||
|
could govern commons without markets or states. But even her
|
||||||
|
framework didn’t fully account for what the network age
|
||||||
|
has revealed.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Anti-rival goods</strong> break the scarcity assumption
|
||||||
|
entirely. Unlike rival goods (my use diminishes yours) or
|
||||||
|
nonrival goods (my use doesn’t affect yours), anti-rival
|
||||||
|
goods become <em>more valuable</em> as more people use them.
|
||||||
|
Languages, protocols, networks, shared knowledge bases —
|
||||||
|
the value increases with every participant.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Network goods</strong> are anti-rival but excludable
|
||||||
|
— platforms that grow more valuable with users, but that
|
||||||
|
can gate access. This is where most of big tech lives:
|
||||||
|
extracting rent from network effects they didn’t create.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Symbiotic goods</strong> are the radical possibility:
|
||||||
|
anti-rival <em>and</em> non-excludable. Goods that get better
|
||||||
|
the more people participate, and that nobody can be locked out
|
||||||
|
of. Open protocols. Shared knowledge commons. Mycelial networks
|
||||||
|
of mutual support. This is where the MycoStack lives —
|
||||||
|
building the infrastructure for a world of symbiotic goods,
|
||||||
|
where abundance is the default and every participant strengthens
|
||||||
|
the whole.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<blockquote
|
||||||
|
className="section-reveal max-w-2xl mx-auto text-center"
|
||||||
|
style={{ transitionDelay: "0.25s" }}
|
||||||
|
>
|
||||||
|
<p className="font-serif text-xl sm:text-2xl italic leading-relaxed opacity-70">
|
||||||
|
“The forest floor is a symbiotic good. Every organism that
|
||||||
|
joins makes the soil richer for all.”
|
||||||
|
</p>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue