Montserrat transport-colored title; --hop-accent / --hop-accent-soft / --hop-accent-faint CSS vars derived from msg.transport matching the chat pill colors exactly (meshtastic #3eb489, meshcore #fb923c, reticulum #60a5fa, lora #f59e0b, fips #a78bfa, tor #818cf8, fallback orange).
Endpoint medallions: 72px (56px mobile), island glyph on an accent-tinted disc with glow, ringed by 14 EQ segments using the ScreensaverRing rotate+translateY+scaleY-pulse technique.
Track: accent gradient line, relay markers positioned fractionally along it — mini 3-bar EQ clusters for radio hops (min(hops, 6)), 🧅×3 for Tor, none for FIPS/unknown (unknown dims the line). Animated white/accent glowing packet travels sender→recipient on a 2.2s loop.
@media (max-width: 560px): chain flips to column, track becomes a vertical line, packet animates top→bottom (hopviz-packet-y), same DOM.
@media (prefers-reduced-motion: reduce): all loops and entrance animations disabled, packet hidden.
Mesh.vue: inline 50-line Teleport block replaced by <HopVizModal>; label helpers passed as computed props; hopVizHops() removed (moved into component).
mesh-styles.css: all .mesh-hopviz-* rules and their keyframes/reduced-motion block deleted; .mesh-chat-transport-clickable, .mesh-transport-modal-* (shared with send-transport + image-quality modals), and .mesh-chat-more-btn untouched (12 shared-class occurrences verified intact).
Commits
Task
Commit
Description
1–3
ac09fc5d
feat(mesh): redesign hop-route visualization — branded, animated, vertical on mobile
Verification
npx vue-tsc --noEmit → exit 0.
npm run build → success; bundle guard (CLAUDE.md silent-no-op rule): hopviz-packet and hopviz-medallion found in web/dist/neode-ui/assets/Mesh-D2ImmPoh.js + Mesh-Dy7zKwro.css; old mesh-hopviz-chain string absent from both source and bundle.
Submodule guard run before commit (no indeedhub paths staged); no file deletions in the commit.
Deviations from Plan
1. [Rule 3 - Blocking] web/dist/neode-ui not staged/committed
Found during: Task 3
Issue: Plan said to stage web/dist/neode-ui, but web/ is gitignored (.gitignore:74) and untracked — build output is intentionally excluded from the repo (release tarballs are built from it at ship time).
Fix: Committed the three source files only; fresh build exists on disk in web/dist/neode-ui/ and was grep-verified.
2. Push deferred to orchestrator — plan Task 3 said git push gitea-ai main, but the executor constraints state the orchestrator handles pushing; not pushed here.
Known Stubs
None — no placeholder text, hardcoded-empty data paths, or unwired components introduced.
Human Verification Pending
On the dev preview (npm run dev or :8100), open a mesh chat and click a message's transport pill: desktop shows the wide medallion+packet layout; shrinking below 560px flips it vertical. Confirm brand feel (glass, accent glow, EQ motif).