You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 25fbb03
Browse filesBrowse the repository at this point in the historyBrowse files
turn CyberCity into OpenWorld: fast travel between regions, low-poly bright world
The 3D area is now OpenWorld at /openworld, and it's navigated by warping rather
than only by panning a single city.
Fast travel. Every district on the master town plan becomes a named region with a
one-line pitch and a door into the 2D PortOS page it visualizes — Memory Quarter →
/brain/inbox, Sprint Yard → /devtools/jira, Data Harbor → /data. M (or the HUD
button) opens a searchable panel beside a plate of the world; picking a region
flies the orbital camera, and warps the player rig too when you're on foot.
Geography is read from cityPlan's PARCELS rather than re-declared, so moving a
district moves its warp marker with it. The destination lives in the URL
(/openworld/region/:regionId), which makes a warp shareable, bookmarkable, and
reachable from ⌘K and voice — navManifest.test.js scrapes the registry and fails
if a region's path, label, or aliases drift from its nav command.
World style. A new `worldStyle` setting picks the art direction from a data table
(WORLD_STYLE_DEFS): 'vibes', the default, is a bright low-poly world — teal-to-warm
sky, meadow ground, flat-shaded matte facades, warm sun — and 'cyber' restores the
original neon night exactly. Most of the look rides on each style's time-of-day
presets, since every surface that already lerped night→day follows daylightFactor
for free; the neon-only layers (galaxy spheremap, starfield, data rain, embers,
volumetric cones, neon signage, CRT overlay) don't mount at all under 'vibes'
rather than being faded per frame. Keeping 'cyber' selectable keeps that whole
layer exercised by the suite instead of bit-rotting behind an unused default.
Because 'vibes' is daytime at both times of day, the per-building window texture
would have been rasterized for every app and bound to nothing — it's now gated on
the same condition the material uses.
/city and everything under it redirects, so bookmarks, pinned sidebar rows, stored
⌘K history, and peers' deep links keep working. The nav command ids stay
`nav.cybercity` (opaque, persisted in palette history) and the ~150 city* module
names stay put; that sweep is #4571. Remaining staged work: #4572 (low-poly
geometry), #4573 (in-world warp pads), #4574 (touch-sized fast-travel map).
Copy file name to clipboardExpand all lines: client/src/CLAUDE.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,8 @@ These apply to React/Vite client code. Universal constraints (functional program
10
10
-**Above the fold** - keep actionable content and info above the fold and design pages for maximum information and access without scrolling
11
11
-**No hardcoded localhost** - use `window.location.hostname` for URLs; app accessed via Tailscale remotely
12
12
-**Chrome floating over media uses `.port-media-overlay`** - a label, status bar, badge, or control panel sitting on top of an image, a video, or a 3D canvas takes its surface and ink from the theme (`.port-media-overlay`, or `.port-media-overlay-strong` for a small label directly on photography; `.port-media-overlay-item` for its buttons, `.port-media-overlay-divider` for its separators — all defined in `index.css`, which carries the mechanism and the rule for picking between this, `.always-dark`, and the City HUD remap). **Don't write `bg-black/NN` + `text-white`/`text-gray-N00` for this** — day mode remaps the text to the theme's dark ink while the black scrim stays black, so the label renders dark-on-black. Older overlays outside the 3D/Three.js pages still carry that idiom (migration tracked in #3796), so match the new convention rather than the nearest neighbor.
13
-
-**Alphabetical navigation** - sidebar nav items in `Layout.jsx` are alphabetically ordered after the Dashboard+CyberCity top section and separator; children within collapsible sections are also alphabetical
13
+
-**Alphabetical navigation** - sidebar nav items in `Layout.jsx` are alphabetically ordered after the Dashboard+OpenWorld top section and separator; children within collapsible sections are also alphabetical
14
+
-**OpenWorld's `city*` prefix is legacy, not a naming convention to follow.** The 3D world was renamed CyberCity → OpenWorld at the route/label level; the ~150 `city*` files (`components/city/`, `utils/city*.js`, `hooks/useCity*.js`) and the `.cybercity-themed` CSS scope did NOT move, and the `nav.cybercity` command ids are deliberately frozen (they're opaque and persisted in ⌘K history). **Name new files in that tree `openWorld*` / `OpenWorld*`** — matching the nearest neighbor would half-rename the directory by accretion, which is worse than either end state. The mechanical sweep is tracked in #4571.
14
15
-**Reactive UI updates** - after mutations (delete, create, update), update local state directly instead of refetching the entire list from the server. Use `setState(prev => prev.filter(...))` or similar patterns for immediate feedback
0 commit comments