jungle-tic is a small, local, two-player tic tac toe game delivered as a playful jungle toy-box. The product intent is a bright, immediate, toy-like object that a person picks up and fiddles with for two minutes — not a productivity tool, not an account-based service, and not a networked game. A single device is passed between two players who take turns placing marks on a 3×3 grid until the game resolves to a win, a loss, or a draw.
The audience is anyone with a spare minute, on phone or laptop. The experience is deliberately local and ephemeral: two players share one board on one screen, and the whole product is the board, the pieces, the turn indicator, the outcome, and the ability to start another match.
jungle-tic is a client-side game with two first-party pages:
The only accepted human actor is the Player. Both players in a match are instances of that same role sharing one device; there is no separate opponent persona, no account, no login, and no server-side matchmaking. The board, the turn state, the score counts, and the outcome are all local to the session.
Delivery. jungle-tic is delivered as a first-party custom web UI. Both pages are application-owned and anonymously reachable — the Planning Scope assigns access_requirement: none to Landing and Game, and nothing in the accepted requirements asks a player to identify themselves, sign in, or resume a match later. A match is a short, local, in-the-moment activity between two people holding the same device, so there is no durable actor-specific state that must be privately owned or resumed, and therefore no identity establishment or verification step is introduced.
Current boundary. Current scope is exactly: a Landing entry surface, and a Game surface that runs a complete local two-player tic tac toe match — turn alternation on a 3×3 grid, resolution to win/loss/draw, and the ability to reset or start another match.
Future boundary. Nothing beyond the current scope is committed. Online or networked play, computer opponents, accounts, persistent history, and leaderboards are not part of this product and are not planned here.
Exclusions. No blue, indigo, or violet primaries or accents. No centred headline-plus-subtext-plus-button hero with a gradient blob. No flat text X and O glyphs. No grids of identical hover-lift cards. No Inter, Roboto, Arial, Helvetica, system-ui, or Poppins for headings or body text. No photorealistic jungle photography or stock imagery. No editorial serif headlines or Swiss-grid tabular layouts. No long easing curves or slow cinematic transitions. The generic indigo/blue-on-white SaaS template is forbidden for this project.
clamp(44px, 9vw, 128px), tight letter-spacing, running edge-to-edge across the top of the viewport.cubic-bezier(0.34,1.56,0.64,1) over 260ms.clamp(28px, 5vw, 56px).FR-1 — Start a match from the landing page. explicit
As a Player, I should be able to start a match from the landing page so that I can begin playing immediately.
FR-2 — Place a mark on an empty tile. explicit
As a Player, I should be able to place my mark on an empty tile on my turn so that the match progresses.
FR-3 — Alternate turns between the two marks. explicit
As a Player, I should see whose turn it is so that the two players can alternate correctly on one device.
FR-4 — Resolve the match to a win. explicit
As a Player, I should see the match resolve when three of my marks line up so that I know I have won.
clamp(28px, 5vw, 56px), and that mark's score count increments.FR-5 — Resolve the match to a draw. explicit
As a Player, I should see the match resolve to a draw when the board fills with no line so that the match ends fairly.
FR-6 — Reset and start another match. explicit
As a Player, I should be able to start a new match so that we can play again without leaving the page.
FR-7 — Track session score. required_inference
As a Player, I should see how many matches each mark has won so that repeated matches on one device have a running result.
FR-8 — Reach the game without an account. explicit
As a Player, I should be able to play without signing in so that a two-minute game starts instantly.
Product context. The Player is one of the two people sharing a single device for a short, local match of tic tac toe. They arrive with a spare minute — on a phone passed between two people, or on a laptop with someone sitting alongside. They are not signing up for anything, not building a profile, and not returning to a saved game; the whole value is the two minutes in front of them.
Primary goal. Get into a match immediately, take turns on a clear 3×3 board, and see the result — win, loss, or draw — without any setup friction.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which empty tile to claim on their turn; whether to start another match after the current one resolves. The Player makes no configuration decisions — there is nothing to set up, name, or choose before playing.
Interactions with other accepted participants. The Player's counterpart is the second Player sharing the same device. The two are the same role, distinguished only by their mark: X moves first, O moves second, and the HUD capsule strip tells them whose turn it is so the device can be passed correctly. Neither player has a separate account, a separate view, or a separate destination.
Observable success. The board shows their mark in the tile they chose, the turn indicator flips to the other mark, and at the end of the match the winning line or the draw banner tells them exactly how it finished.
What makes this role distinct. The Player is simultaneously the initiator and the recipient of every state change in the product: they cause each placement and they are the one who must read the resulting turn, outcome, and score. There is no administrator, no spectator, and no operator behind them — the entire product is the surface they touch.
clamp(28px, 5vw, 56px).prefers-reduced-motion active. The Landing page renders the same clearing with the idle board tilt removed and the board held in a static pose; the wordmark, label card, and CTA remain whole and fully visible.The muse is Bruno Simon, and the headline idea is "Playable jungle toy-box": the page is a toy you play with, not a dashboard you read. The register is playful, immediate, and toy-like — a bright plastic object on a table.
Colour tokens (light mode).
| Role | Hex | Use |
|---|---|---|
| Background | #EAF6E4 | Pale leaf-mist ground — sunlight through canopy |
| Surface | #FFFFFF | The nine board tiles and the label card |
| Text | #1F3D2B | Deep jungle-ink for all readable text |
| Primary | #2E8B57 | Vine/canopy green — board bezel frame and the X pieces |
| Accent | #FF7A3D | Coral-orange — the CTA, the O pieces, and the winning-line stroke only |
| Muted | #8BAF93 | HUD labels, rules, and secondary copy |
One hot signal on a green field. No blue anywhere. No gradients on text surfaces.
Typography.
clamp(44px, 9vw, 128px) for the hero wordmark; clamp(28px, 5vw, 56px) for the outcome banner; 17px body at 1.6 line-height.Shape language. Chunky rounded blocks and capsules. Board tiles at 20px radius. Buttons as full pills. Cards at 28px radius with a soft 0 8px 0 rgba(31,61,43,0.12) offset shadow so they read as physical toy pieces. The board frame is a thick 12px rounded-square green bezel, like a plastic tray. Piece marks are drawn as low-poly extruded shapes with a visible bevel — never flat glyphs.
Spacing rhythm. Generous, toy-like breathing room around the board as the dominant object; a slim HUD strip above and a single pill below, with no sidebars and no card grids.
Imagery style. Low-poly 3D jungle props rendered in CSS 3D or a small Three.js scene: a flat-shaded canopy leaf cluster, three rounded rocks, two vine arcs, and a small toucan perched on the board frame. Pieces are low-poly X and O blocks in green and coral. No photography, no stock people, no flat clip art, no gradient blobs.
The clearing and the tray. The first screen is a sunlit low-poly clearing, not a SaaS hero. The wordmark JUNGLE-TIC is set in Fredoka SemiBold at clamp(44px, 9vw, 128px) with tight letter-spacing, spanning the viewport width edge-to-edge across the top — the type is the sign. Beneath it, the dominant element is a 3D 3×3 board: a thick rounded green bezel (#2E8B57) holding nine white tiles, floating right-of-centre at roughly 46vw and idling with a slow 6s tilt that the cursor nudges. A small low-poly toucan perches on its top-left corner. To the left, a white capsule card at 28px radius carries "Two players. One board. Pass the phone." in 20px Nunito, with the coral CTA pill "Start a match" pinned beneath it.
The composition is an asymmetric toy still-life with the board as the object: no centred headline, no subtext stack, no blue button, no gradient blob. The board is the product, and the page presents it as something you pick up.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: dimensional_css
Landing Hero Motion Brief.
cubic-bezier(0.34,1.56,0.64,1) over 260ms. The winning line draws as a coral stroke left-to-right in 400ms. The landing board idles with a very slow 6s floating tilt that the cursor nudges.NFR-1 — Readable text and controls stay whole. explicit
At 375px, 768px, and 1280px, headlines, the wordmark, labels, numbers, card text, and controls stay entirely inside the viewport and their container, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit. No other element covers any part of them. Where the creative direction asks readable text or a control to be cropped, clipped, covered, or run off an edge, it is kept whole and the gesture is carried with imagery or decoration instead.
NFR-2 — Imagery and decoration may bleed; readable content may not. explicit
A photograph, artwork, shape, texture, or animation may be cropped, bled off an edge, rotated, overlapped, or cut exactly as the direction asks, as long as it covers no readable text or control.
NFR-3 — Reduced-motion support. explicit
With prefers-reduced-motion, the product provides a usable static arrangement: the idle tilt is removed, pieces fade in over 150ms, and the winning line appears instantly. All readable text and controls remain whole and fully visible.
NFR-4 — No blue. explicit
No blue, indigo, or violet primaries or accents anywhere in the product. The palette is a green ground with one coral signal only.
NFR-5 — Local, single-device play. explicit
The match runs locally on one device shared by two players. There is no networked play, no matchmaking, and no server-side match state.
NFR-6 — Immediate availability. required_inference
The Game page presents a playable board with no loading state, because the match state is local and available immediately. Rationale: the accepted lifecycle begins with starting a match and placing a mark; any intervening wait would be an invented step.
NFR-7 — Responsive board sizing. explicit
The Game page centres the board at a 44vw max-width on desktop; at 375px the HUD stacks above the board and the board fills the width minus 24px gutters. No sidebars and no card grids.
[Default — not specified by user]0 8px 0 rgba(31,61,43,0.12) offset shadow. [Default — not specified by user][Default — not specified by user][Default — not specified by user][Default — not specified by user]Assumptions.
[Assumption — grounded in the accepted "Pass the phone." premise][Assumption — the accepted requirements specify alternating marks on a 3×3 grid without naming a first mover][Assumption — no persistence is accepted][Assumption — the accepted lifecycle places starting a match on the entry surface and the match itself on the Game surface]Constraints.
explicitexplicitexplicitexplicitexplicitexplicitexplicitexplicitexplicitexplicit
Two players — one board
Two players. One board. Pass the phone.

Two players — one board
Two players. One board. Pass the phone.
No comments yet. Be the first!