Goal: one brand source. Components and tokens live HERE; the sites stop carrying diverging copies. (FrenProfile/TagClaim/RegistrationPage already differ between org and frens.earth by hundreds of bytes — that rot is what this repo ends.)
Push this folder as PacsArcade/arcade-ui. No registry needed:
npm i github:PacsArcade/arcade-uinpm i github:PacsArcade/arcade-ui, and innext.config.ts:transpilePackages: ["@pacsarcade/arcade-ui"].globals.css: delete the@themeblock, glow utilities, blink/pulse/ matrix keyframes, easy-mode rules — replace with@import "@pacsarcade/arcade-ui/tailwind";right after@import "tailwindcss";. KEEP app-specific pieces local: crt-letter-on, flicker-once, danger-pulse, nsec-blur/reveal, screen-shake, and the legacy@layer basestyles. ⚠ REQUIRED — add the@sourceline or the header breaks (Tailwind v4 never scans node_modules, so utilities used only by packaged components don't generate: the coin renders at natural gif size and nav gaps vanish — found the hard way on pacsarcade.org, 2026-07-07):(Path is relative to your globals.css.)@source "../../node_modules/@pacsarcade/arcade-ui/react";
- Delete
src/components/SiteHeader.tsx,BlockClock.tsx,EasyModeToggle.tsx,CRTOverlay.tsx,src/lib/easy-mode.ts. Re-import from@pacsarcade/arcade-ui(named exports; SiteHeader takes optionallinks/wordmark/coinSrcprops — org's defaults match). Note: the packaged SiteHeader/BlockClock are the PATCHED versions (marquee + ticker, coin menu right at 28px, HUD-white block) — applying this migration ships the header fix. - Add
ez-reflowto the HOW-THE-ARCADE-WORKS grid (one-line page.tsx edit; see handoff/patches/PATCHES.md). - Icons:
icons/icon.svg→src/app/icon.svg,icons/apple-icon.png→src/app/apple-icon.png, deletesrc/app/favicon.ico+ the create-next-app svgs inpublic/, add og-image metadata (see handoff/icons/ICONS.md). README.mdis still stock create-next-app — replace with a Pac's Arcade one while you're in there.
Same steps 1–3 and 5 (its own og-image). It has no SiteHeader today — when
one lands, take it from the package with
links={[...]} wordmark="FRENS.EARTH". Phase 2: reconcile FrenProfile /
TagClaim / RegistrationPage against org's copies and move the merged
versions here.
- Vendor the package (no build step): copy
css/,fonts/,icons/in, or add the repo as a git submodule. - Replace the token/
:rootsection ofstyles.csswith<link rel="stylesheet" href="arcade-ui/css/index.css">and migrate page styles topa-*classes over time. - Favicon links per
handoff/icons/ICONS.md.
The node console (services/mud/admin.html) stays self-contained (an
operator's node must not depend on npm) — but it MUST follow this repo's
tokens verbatim. Spec: handoff/poke-node-console/DESIGN-DOC.md. When the
webclient/admin pages get a build step someday, they consume css/index.css
directly.
The operator console is a MODULE, not any one site's furniture (Pac,
2026-07-11 — frens.earth docs/operator-console.md is the spec; this
package is its "extract to a package" ledger item). Adopting it:
- Write the manifest APP-SIDE, e.g.
src/lib/console.ts: oneConsoleSite(identity from your env/verse config —home,domain, thedeckhub route) and oneConsoleRoom[](your real rooms only). - Mount
ConsoleDeckon the hub route andConsoleNavon every room page, passingsite,rooms, and the page's owncurrentPath. - Keep your gate where it is: auth/whoami never enters the package. The
deck and rail render only behind the site's own gate (frens.earth:
OperatorGate + operator-auth; pacsarcade-org: console-auth +
/api/console/login).
Adoption order: pacsarcade-org's /console first (round 1, ships with
0.4.0). frens.earth migrates round 2 — its AdminNav + /a deck page
(the source this was extracted from) drop in favor of the packaged
ConsoleNav/ConsoleDeck, its lib/console.ts manifest gains the
deck: "/a" field, and OperatorGate stays app-side, unchanged.
-
0.1.0 — published campaign components (ArcadeButton … TrustBadge) + pa-* CSS.
-
0.2.0 — adds header suite (SiteHeader/BlockClock/EasyModeToggle/ CRTOverlay + easy-mode store), Tailwind theme layer, verse presets, easy-mode CSS, fonts, pixel-₿ icon set.
-
0.3.0 (this) — header v4:
SiteHeadergrowsidentityAsTrigger(the identity chip becomes the menu trigger — pass NO interactive elements inidentitySlotwhen on) andmenuFooterSlot(app-owned bottom row of the menu panel, replaces the built-in EASY ON THE EYES row; not auto-close wrapped). Both optional — omitting them renders v3 exactly, so existing consumers are unaffected. NewPixelAvatar(ghost = vacant player, player = seeded pac-head body). BREAKING-ish:.ez-reflowno longer forcesalign-items: start— grid children stretch to even heights; a grid that truly wants top-aligned cards addsitems-startitself. -
0.4.0 (this) — the console module:
ConsoleSite/ConsoleRoommanifest types +ConsoleNav(bridge rail: ⌂ site exit, ⚓ DECK, room links, current room lit fromcurrentPath) +ConsoleDeck(hub grid of room cards, app extras as children). Entirely props-driven; gating stays app-side. Purely additive — existing consumers are unaffected.
Rule going forward: brand changes land HERE first, sites pull the bump. GG's.