Files
lanspread/design
ddidderr 29eacabcc0 fix(call-to-play): key actors by stable peer identity
Participant maps and creator authorization previously used display names, so
two peers left at the default Commander name collapsed into one participant
and could exercise each other's creator controls through the normal client.

Carry a stable actor_id separately from actor_name. The peer overwrites actor_id
on every local publish, and live event envelopes are accepted only when the
known peer, source, and event actor match. The frontend keys participants and
authorization by actor_id while retaining actor_name for display. This follows
the trusted-LAN model and is not cryptographic authentication against a hostile
peer.

Test Plan:
- `just fmt` -- passed
- `just clippy` -- passed
- `just test` -- passed
- `just frontend-test` -- passed, 21 tests
- `just build` -- passed
- `just peer-cli-tests S48` -- passed
- `git diff --cached --check` -- passed
2026-07-21 22:40:59 +02:00
..
2026-06-21 21:15:09 +02:00

SoftLAN Launcher — Design Handoff

This folder is the complete, current state of design for the SoftLAN Launcher. Everything an implementor needs to build the product is in here — and nothing that isn't. (The exploration mockups, logo concept boards, and variant studies live back in the project workspace; they're history, not handoff.)

Target codebase: Tauri + React desktop app. The references here are HTML/React prototypes that communicate the intended look, layout, and behavior — recreate them inside the codebase using its own patterns. They are not meant to be shipped as-is.


What's inside

design_handoff_softlan_launcher/
├── README.md            ← you are here — start here
│
├── launcher/            ← THE APP
│   ├── SPEC.md              full spec: every screen, component, token, interaction
│   └── design_reference/    the working prototype the spec describes
│       ├── SoftLAN Launcher.html   open this to see all screens/variants
│       ├── styles.css
│       ├── data.jsx                mock catalog + LAN peer roster + format helpers
│       ├── components.jsx          Icon set, cards, modals, Settings dialog
│       ├── ctp-chat.jsx            Call-to-Play chat panel + shared helpers
│       ├── calltoplay.jsx          Call-to-Play: quick bars, overlay, create form
│       └── launcher.jsx            composes chrome + grid + modals + Call to Play
│
└── logo/                ← THE BRAND MARK
    ├── INTEGRATION.md       how to ship the logo (component + assets + lockup)
    ├── pixel-live.jsx       the live animated "S" + Wordmark + Lockup components
    ├── demo.html            open to see the mark animate + the lockup
    └── assets/
        ├── softlan-mark.svg          static S (currentColor)
        ├── softlan-mark-blue.svg     static S (fixed blue)
        ├── softlan-tile.svg          app-icon tile (gradient + white S)
        ├── softlan-lockup.svg        full lockup (icon + wordmark), on dark
        ├── softlan-lockup-ink.svg    full lockup, on light
        └── favicon.svg               = tile, drop-in favicon

Two pieces, one product

launcher/ logo/
What The full launcher UI redesign The brand mark + wordmark lockup
Read first launcher/SPEC.md logo/INTEGRATION.md
Preview open launcher/design_reference/SoftLAN Launcher.html open logo/demo.html
Fidelity High — final colors/type/spacing/interactions Final — recolors live via the accent token

The two share one design language. The accent color is a single token (--accent, default #3b82f6) that drives the launcher's primary actions and the logo — wire it once and both follow. The brand mark in the launcher's top bar (launcher/SPEC.md → "Top bar → Brand") is the logo component from logo/pixel-live.jsx at size={28}; the static 28px "S" in the mock is a placeholder for it.


  1. This file — the map.
  2. launcher/SPEC.md — the bulk of the work. Screens, components, data shapes, design tokens, interactions, and what's out of scope. Start at "Screens / views" and keep the "Design tokens" section open alongside.
  3. logo/INTEGRATION.md — drop the live mark and the wordmark lockup into the chrome. Short; mostly a component API + static-asset reference.
  4. Open both preview files in a browser to see the real thing in motion.

Status

  • Launcher: high-fidelity, decisions locked. Variant A is the chosen chrome. Includes Call to Play (rally the LAN around a game + time — live or scheduled, with RSVP, check-in window, and per-call chat). Open questions (empty/error states, logs viewer, keyboard grid nav, German strings, "server running" state, real-time transport for Call to Play) are listed at the end of SPEC.md.
  • Logo: final. Live component + static assets + horizontal lockup (dark and light) all included.

Do not ship the Babel-in-browser setup, the design-canvas wrappers, or the Tweaks panel from the prototypes — they're presentation scaffolding. The Tweaks panel is superseded by the in-app Settings dialog (spec'd in SPEC.md).