Files
dark-lord/components/market/MarketSiteChrome.tsx
drjones 78a071ba02 Harden onion boot flow and deepen site surfaces
Add persistent onion key backup and restore, improve startup resilience, and flesh out the major site verticals with richer navigation, search coverage, and operator documentation.

Made-with: Cursor
2026-04-07 21:35:52 -07:00

191 lines
8.2 KiB
TypeScript

"use client";
import Link from "next/link";
import { usePathname } from "next/navigation";
import LexiconStrip from "@/components/site/LexiconStrip";
import { MARKET_ATMOSPHERE_TAGS } from "@/lib/cyberluxZoneLexicon";
import { SHOP_PRODUCT_COUNT } from "@/lib/shopCatalog";
import { SHOP_SELLER_COUNT } from "@/lib/shopSellers";
const LAYERS: {
title: string;
items: { href: string; label: string; blurb: string }[];
}[] = [
{
title: "Layer 1 · Catalog",
items: [
{ href: "/market", label: "Full floor", blurb: "Search, facets, every SKU" },
{ href: "/vendors", label: "Vendor hall", blurb: "Stalls & bios" },
{ href: "/vendor/apply", label: "Onboard", blurb: "Bond & review queue" },
],
},
{
title: "Layer 2 · Commerce spine",
items: [
{ href: "/checkout", label: "Checkout", blurb: "Cart → settle" },
{ href: "/market/analytics", label: "Floor analytics", blurb: "Velocity, mix, heat" },
{ href: "/market/operations", label: "Operations", blurb: "Pipeline & SLAs" },
],
},
{
title: "Layer 3 · Trust & intel",
items: [
{ href: "/market/trust", label: "Escrow & keys", blurb: "Settlement tiers" },
{ href: "/market/intel", label: "Buyer intel", blurb: "Vetting & OPSEC" },
{ href: "/support", label: "Support ladder", blurb: "Tickets & mirrors" },
],
},
];
export default function MarketSiteChrome({ children }: { children: React.ReactNode }) {
const pathname = usePathname() ?? "";
const crumbs = [
{ href: "/", label: "Hub" },
{ href: "/market", label: "Market" },
];
const tail = pathname.replace(/^\/market\/?/, "");
if (tail && tail !== "") {
const seg = tail.split("/")[0];
const label =
seg === "analytics"
? "Analytics"
: seg === "operations"
? "Operations"
: seg === "trust"
? "Trust"
: seg === "intel"
? "Intel"
: seg;
crumbs.push({ href: pathname, label });
}
return (
<div className="min-h-screen bg-[#050806] text-[#c8ffd8]">
<div
className="pointer-events-none fixed inset-0 z-0 opacity-[0.07]"
style={{
backgroundImage:
"repeating-linear-gradient(-12deg, transparent, transparent 40px, rgba(0,255,65,0.04) 41px)",
}}
/>
<header className="sticky top-0 z-30 border-b border-[#00ff41]/20 bg-[#030806]/95 backdrop-blur-md">
<div className="mx-auto flex max-w-[1600px] flex-col gap-3 px-4 py-4 lg:flex-row lg:items-center lg:justify-between">
<div>
<p className="font-mono text-[9px] uppercase tracking-[0.5em] text-[#00ff41]/45">sovereign catalog · multi-layer</p>
<Link href="/market" className="mt-1 block">
<h1 className="font-mono text-2xl font-black tracking-tight text-[#7af598] md:text-3xl">
The Candy Shop
</h1>
</Link>
<p className="mt-1 max-w-xl font-mono text-[11px] text-[#00ff41]/55">
<strong className="text-[#9dffc4]">{SHOP_PRODUCT_COUNT}</strong> SKUs ·{" "}
<strong className="text-[#9dffc4]">{SHOP_SELLER_COUNT}</strong> stalls not a plugin mall; one cart, one checkout, four trust layers.
</p>
<nav className="mt-3 flex flex-wrap items-center gap-1 font-mono text-[10px] uppercase tracking-wider text-[#5a8f6a]">
{crumbs.map((c, i) => (
<span key={c.href} className="flex items-center gap-1">
{i > 0 ? <span className="text-[#00ff41]/25">/</span> : null}
<Link href={c.href} className="hover:text-[#7af598]">
{c.label}
</Link>
</span>
))}
</nav>
</div>
<div className="flex flex-wrap gap-2 font-mono text-[10px] uppercase">
<Link href="/" className="border border-[#00ff41]/30 px-3 py-2 text-[#8fccb0] hover:border-[#00ff41]/60">
Hub
</Link>
<Link href="/forum" className="border border-[#c45c26]/35 px-3 py-2 text-[#e8b896] hover:border-[#ff9a3c]/50">
Forum
</Link>
<Link href="/exchange" className="border border-[#8d6e4a]/40 px-3 py-2 text-[#d4c4b0] hover:border-[#c4a574]/60">
Exchange
</Link>
<Link href="/barter" className="border border-[#1a3d24] bg-[#0a120d] px-3 py-2 text-[#7cfc9a] hover:border-[#39ff14]/40">
Barter
</Link>
<Link href="/hidden-wiki" className="border border-[#3d5a80]/30 px-3 py-2 text-[#9fb5d2] hover:border-[#7dd3fc]/50">
Wiki
</Link>
<Link href="/darknet-atlas" className="border border-[#1e3a5f] px-3 py-2 text-[#7eb8ff] hover:border-[#38bdf8]/50">
Atlas
</Link>
<Link href="/syndicate" className="border border-fuchsia-900/40 px-3 py-2 text-fuchsia-200 hover:border-fuchsia-500/50">
Syndicate
</Link>
<Link href="/search" className="border border-[#00ff41]/25 px-3 py-2 text-[#6bdc8e] hover:border-[#00ff41]/45">
Crawler
</Link>
<Link href="/account/hidden-services" className="border border-[#00ff41]/20 px-3 py-2 text-[#82a98c] hover:border-[#00ff41]/45">
Mirrors
</Link>
</div>
</div>
<div className="border-t border-[#00ff41]/10 lg:hidden">
<div className="mx-auto flex max-w-[1600px] gap-2 overflow-x-auto px-4 py-2 scrollbar-none">
{LAYERS.flatMap((L) =>
L.items.map((it) => (
<Link
key={it.href}
href={it.href}
className={`shrink-0 rounded border px-3 py-1.5 font-mono text-[10px] uppercase ${
pathname === it.href
? "border-[#00ff41] bg-[#00ff41]/15 text-[#b4ffcc]"
: "border-[#00ff41]/20 text-[#6a9b7a] hover:border-[#00ff41]/40"
}`}
>
{it.label}
</Link>
)),
)}
</div>
</div>
<div className="mx-auto max-w-[1600px] border-t border-[#00ff41]/10 px-4 text-[#5a8f6a]">
<LexiconStrip label="Floor environment · keyword fog" tags={MARKET_ATMOSPHERE_TAGS} className="border-[#00ff41]/15" />
</div>
</header>
<div className="relative z-10 mx-auto flex max-w-[1600px] gap-8 px-4 pb-24 pt-6">
<aside className="hidden w-72 shrink-0 lg:block">
<div className="sticky top-28 space-y-8">
{LAYERS.map((layer) => (
<div key={layer.title}>
<h2 className="border-b border-[#00ff41]/15 pb-2 font-mono text-[9px] font-bold uppercase tracking-[0.28em] text-[#00ff41]/50">
{layer.title}
</h2>
<ul className="mt-3 space-y-1">
{layer.items.map((it) => {
const active = pathname === it.href;
return (
<li key={it.href}>
<Link
href={it.href}
className={`block rounded border px-3 py-2 transition ${
active
? "border-[#00ff41]/55 bg-[#00ff41]/10"
: "border-transparent hover:border-[#00ff41]/25 hover:bg-[#00ff41]/05"
}`}
>
<span className="font-mono text-xs font-bold text-[#b4ffcc]">{it.label}</span>
<p className="mt-0.5 font-mono text-[10px] leading-snug text-[#5a8f6a]">{it.blurb}</p>
</Link>
</li>
);
})}
</ul>
</div>
))}
<div className="rounded border border-dashed border-[#00ff41]/20 p-3 font-mono text-[9px] leading-relaxed text-[#4a6b55]">
Tor entry onions map headers to the same app your cart and session follow signed mirror bundles, not separate shops.
</div>
</div>
</aside>
<div className="min-w-0 flex-1">{children}</div>
</div>
</div>
);
}