Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/repositories.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ The canonical index of Space Console repositories. Every repo lives in the
| [game-launcher-web](https://github.com/space-console/game-launcher-web) | The **TV / screen** — AirConsole-style party-game launcher (10-foot UI). | <https://space-console.github.io/game-launcher-web/> | [docs](services/game-launcher-web/index.md) |
| [game-controller](https://github.com/space-console/game-controller) | The **phone / controller** — joins a launcher by room code and sends input. | <https://space-console.github.io/game-controller/> | [docs](services/game-controller/index.md) |
| [games](https://github.com/space-console/games) | The **game collection** — 30 playable games + a hub menu, driven by the shared intent vocabulary. The launcher catalog links to these. | <https://space-console.github.io/games/> | [docs](services/games/index.md) |
| [landing](https://github.com/space-console/landing) | The **marketing site** — explains the product to a first-time visitor: TV as console, phone as controller, nothing to install. Ships no product code. | <https://space-console.github.io/landing/> — also served at the deployed site root, <https://space-console.onrender.com/> | [docs](services/landing/index.md) |
| [tetris](https://github.com/space-console/tetris) | The first playable **game** — runs on the launcher, driven by the shared intent vocabulary. Also bundled in the `games` collection. | <https://space-console.github.io/tetris/> | [docs](services/tetris/index.md) |
| [web-api](https://github.com/space-console/web-api) | The **signaling service** — a thin WebRTC room relay (SDP/ICE) that pairs a phone and TV by room code. The only non-static piece; not on Pages. | _(self-hosted — not a Pages site)_ | [docs](services/web-api/index.md) |
| [wiki](https://github.com/space-console/wiki) | This org-wide documentation hub (DocFX). | <https://space-console.github.io/wiki/> | You're reading it. |
Expand All @@ -27,6 +28,7 @@ red = failing, yellow = a run is in progress). Click a badge for the run logs.
| game-launcher-web | [![game-launcher-web Pages](https://github.com/space-console/game-launcher-web/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/game-launcher-web/actions/workflows/pages.yml) |
| game-controller | [![game-controller Pages](https://github.com/space-console/game-controller/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/game-controller/actions/workflows/pages.yml) |
| games | [![games Pages](https://github.com/space-console/games/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/games/actions/workflows/pages.yml) |
| landing | [![landing Pages](https://github.com/space-console/landing/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/landing/actions/workflows/pages.yml) |
| tetris | [![tetris Pages](https://github.com/space-console/tetris/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/tetris/actions/workflows/pages.yml) |
| wiki | [![wiki Pages](https://github.com/space-console/wiki/actions/workflows/pages.yml/badge.svg?branch=main)](https://github.com/space-console/wiki/actions/workflows/pages.yml) |

Expand Down
77 changes: 77 additions & 0 deletions docs/services/landing/architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Architecture — landing

A single static page (`index.html`) with one stylesheet and one ES module in
`assets/`. No framework, no bundler, no runtime dependencies — Google Fonts is
the only external request.

```
index.html
assets/css/site.css one sheet, tokens at the top
assets/js/site.js reveals, the controller morph, the diagram loop
assets/img/ product screenshots (real captures)
assets/thumbs/ one poster per game (33)
assets/icons/icon.svg the product mark
```

## Sections

| # | Section | What it has to land |
| --- | --- | --- |
| 1 | Hero | the TV and the phone both visible in the first screen, connected by the live link |
| 2 | Proof strip | 33 games · 6 categories · 0 downloads · 4 players · 1 scan |
| 3 | How it works | open it on the TV → scan the code → play |
| 4 | The controller reshapes itself | the pad is different for every game |
| 5 | The library | 33 games is a lot; the page should feel abundant |
| 6 | Under the hood | the signaling service introduces the peers, then steps out |
| 7 | Built for a room | roster & seats, rejoin, 2-player, scores, 10-foot UI |
| 8 | Closing CTA | one button |

## Art direction

"Deep Space Broadcast" — near-black field, enormous display type, asymmetric
composition, blue→violet light pooling behind key elements the way a screen
lights a wall. Cyan is reserved for what matters: the room code, the live link,
focus rings. Palette and mark are inherited from the console itself, so the page
feels like the product.

The **signature idea is that the peer-to-peer link is alive on the page** — an
animated connection travelling phone → TV that recurs in the hero, the
how-it-works rail, the controller showpiece, and pays off in the under-the-hood
diagram. It exists to make one claim legible at a glance: *your press goes
straight to the screen.*

## The interactive pieces (`site.js`)

| Piece | Behaviour |
| --- | --- |
| Scroll reveals | one `IntersectionObserver`, unobserved after firing — never a scroll handler doing layout reads |
| Controller morph | five chips swap the hand-built CSS phone between the menu d-pad, pinball's held flippers, Minesweeper's Reveal/Flag, Blackjack's four buttons, and a landscape analog driving pad for RC Rush; a mono readout shows what that game *declared*. Auto-cycles on first view, hands over permanently on first interaction |
| Hood diagram | a two-phase loop: dashed handshake arcs through the signaling box, then the direct DataChannel snaps in and the box dims to idle |
| Beam packets | SMIL along a path; the SVG clock is paused off-screen |

Everything animates on `transform` / `opacity` only.

## Accessibility and motion

`prefers-reduced-motion: reduce` parks every animation on a **truthful final
state** rather than simply freezing it: the diagram settles on the direct-link
phase with signaling idle, marquees become plain scrollable rails, packets are
hidden outright so no dot is stranded mid-path, and the showpiece rests on the
menu pad with its readout populated.

The chips are real `<button>`s with `aria-pressed` and a live-region caption;
every interactive element keeps a visible focus ring. Body text measures 7–8:1
contrast, mono micro-labels 11–13:1.

## Imagery

Every screenshot is a capture of the running console, including a launcher shot
with three controllers genuinely joined and an in-game HUD showing the rejoin QR
with every seat. See [Getting started](getting-started.md) for how to recapture.

## Deploy

The Pages pipeline is the org standard (`main` → site root, feature branches →
`/preview/<slug>-<hash>/`). In production the site is served by **web-api**,
which clones `landing#gh-pages` into its static tree and redirects the bare
domain to `/landing/` — see [web-api](../web-api/index.md).
68 changes: 68 additions & 0 deletions docs/services/landing/getting-started.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Getting started — landing

## Prerequisites

- Node.js >= 18 (dev server only — no build/bundle step).

## Run locally

```sh
git clone git@github_xhevops:space-console/landing.git
cd landing
npm install # installs the dev server only
npm run dev # live-server on http://localhost:5175 (auto-reload)
```

It runs on **:5175** so it can sit alongside the launcher (`:5173`) and the
controller (`:5174`) during local testing.

## Useful commands

| Command | Description |
| --- | --- |
| `npm run dev` | Live-reloading dev server on :5175. |
| `npm start` | Plain static serve on :5175 (no reload). |
| `npm run lint` | ESLint over `assets/js` and `scripts`. |
| `npm run build` | **CI-only** cache-bust stamp → `_dist/`. |

Unlike the app repos, the stamp versions the **stylesheet** as well as the
scripts. A landing page is mostly CSS, and a stale cached sheet is the most
visible way for a redeploy to look broken.

## Recapturing the screenshots

Everything in `assets/img/` and `assets/thumbs/` is a real capture of the
running console — no mockups, no retouching. When the console's UI changes
materially, **recapture rather than edit**, so the page can't promise something
the product doesn't do.

Serve the whole workspace on one origin, then drive it with a headless browser:

```sh
cd web-api && npm run serve:app # STATIC_DIR=.. PORT=8000
```

Two details make the captures production-accurate rather than dev-looking:

1. **Launch the browser with a host-resolver rule** so the launcher's own
`location.host` readout renders the real hostname:

```
--host-resolver-rules=MAP space-console.onrender.com:80 127.0.0.1:8000
```

then browse `http://space-console.onrender.com/game-launcher-web/`. Nothing
is edited afterwards — the page really did render that.

2. **Join real controllers.** Open extra browser contexts on
`/game-controller/`, fill `#nameInput` and `#codeInput` with the code read
from the TV's `#roomCode`, and click `.join__btn`. Genuine seats then appear
in the roster and in the in-game HUD — that HUD shot is the page's proof for
*scan to rejoin mid-game*.

Game tiles are `[data-game-id="<id>"]`; `Escape` returns to the menu.

> The room code is regenerated every session, so after recapturing, **re-sync
> the code baked into the page copy** to whatever the new screenshots show. It
> appears in the hero pad, the join chip, the showpiece pad, the finale cells,
> the image alt text, and the pseudo-QR seed in `assets/js/site.js`.
26 changes: 26 additions & 0 deletions docs/services/landing/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: landing
---

# landing

The **marketing site** of Space Console: the page that explains the product to
someone who has never seen it — your TV is the console, every phone is a
controller, and there is nothing to install.

It is a sales page, not part of the console. It ships no product code; it links
out to the running [game-launcher-web](../game-launcher-web/index.md) and to the
repos.

Like the app repos it's a **zero-build, zero-backend static site** — one
`index.html`, one stylesheet, one ES module, no bundler. Open `index.html` and
it runs.

- [Getting started](getting-started.md) — run it locally, and recapture its
screenshots.
- [Architecture](architecture.md) — the sections, the interactive pieces, and
where the imagery comes from.

Production: <https://space-console.onrender.com/> (the bare domain redirects
here; the page itself is served from `/landing/`).
Pages mirror: <https://space-console.github.io/landing/>
6 changes: 6 additions & 0 deletions docs/services/landing/toc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
- name: Overview
href: index.md
- name: Getting Started
href: getting-started.md
- name: Architecture
href: architecture.md
2 changes: 2 additions & 0 deletions docs/services/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
href: game-controller/
- name: games
href: games/
- name: landing
href: landing/
- name: tetris
href: tetris/
- name: web-api
Expand Down
Loading