BetaHub · Proof Components
Floating Flow · Style B

Proof Presentation Component Book

The system for showing BetaHub's product as believable, frameless app fragments floating on the dark page. Every AI capability is told the same way: the inputs, the AI moment, the win — and nothing else. This book defines the tokens, type, components, rules, and motion so each new proof looks like it belongs to the same product.

00 — Before you build

The Convincing Minimum

Decide what earns belief before writing markup. A fragment shows the least evidence that convinces its audience the feature works — and nothing past it. Extra detail doesn't add credibility; it adds noise and invites doubt. This is the first rule because it decides the content the rest of the book only styles.

The method

  1. State the one claim in a single sentence. "AI auto-merges duplicate bug reports."
  2. Simulate ≥2 distinct personas from .audience.yml — run the landing-page-audience-simulator agent in parallel. Pick the personas the feature is for; they expect different proof.
  3. Ask each for four lists: Believe (must-see) · Filler (cut) · Doubt (distrust) · Missing (≤2 additions, no bloat).
  4. Synthesize: keep Believe ∩ credible, cut everything in Filler, and add a Missing item only if it kills a shared Doubt.

Convincing minimum = the highest-signal set, not the smallest. Skip the live run for trivial tweaks and reason from the documented personas; run it for real when a fragment is new or you're unsure what to cut.

Worked example · Merge fragment · Community Manager + Studio Lead

Keep — the proof
  • Two differently-worded titles (semantic match, not keyword)
  • 92% match confidence
  • "reports → 1 thread" outcome
  • Player handles (real submissions)
Cut — bloat & doubt
  • Heat scores (undefined jargon)
  • "Severity raised to High" (a second claim)
  • "1 bug" badge (redundant w/ 1 thread)
  • Timestamps (noise)
Add — kills a shared doubt
  • Volume cue ("+10 more") → it scales past a toy pair
  • Review / undo → no silent wrong-merge
Net: three cut, two added — fewer elements, higher signal. The Merge pattern in §06 is built to obey this exact result.
01 — Rules

Five principles

If a fragment breaks one of these, it stops looking like the product and starts looking like a diagram.

One focus, fewer parts

Each fragment carries a single idea. Show only the elements that prove it — drop chrome, filler rows, and decoration. Calm beats busy.

Always end on a win

The flow climbs to one resolved outcome — a merged bug, a critical flag, a completed report. The green (or red) feature card is the payoff; there is exactly one per fragment.

Real app, real data

Palette and labels come from the actual dashboard (betahub-tickets). Bug titles, heat scores, and names read like a real game's queue — never lorem.

Float, don't frame

No window chrome. Cards float on the section with soft shadow and air around them. The dark page is the canvas; the flow connects the cards, not a border.

Motion reveals the logic

On scroll, parts rise in order and the win settles last — the animation re-stages the cause→effect. Under 500ms, staggered, and fully skipped for reduced-motion.

02 — Tokens

Color

Surfaces and text come from the real app. Accents are semantic: cyan = AI, green = win/positive, red = critical, amber = heat/warning, blue = links & players.

Surfaces & text

Page
#0B1727
Card
#1b2842 → #16213a
Text strong
#eaf0fa
Text dim
#94a6c8

Semantic accents

AI / cyan
#74ffe2
Win / green
#2bc784
Critical / red
#e6557a
Heat / amber
#f5934e
Rule: a fragment uses one outcome color. Green for a positive resolution, red for a "fix this first" flag — never both competing in the same fragment. Cyan is reserved for the AI's own marks (pills, sparkle).
03 — Tokens

Typography

Three families, each with one job. Poppins gives outcomes weight; Open Sans carries UI text; JetBrains Mono marks machine values (IDs, scores).

Poppins 700 · 15px
result & hero titles
Combat input lag
Open Sans 600 · 13px
report titles
Too much input lag in melee combat
Open Sans 400 · 11.5px
meta / sub
Aria_K · 4h ago · severity raised to High
Open Sans 700 · 10.5px · .05em
connector / kicker labels
Merged by AI
JetBrains Mono · IDs & scores
#1051 · 92
04 — Components

Atoms

The smallest shared pieces. Every fragment is built from these — they never change shape between capabilities.

92% match
AI pill.pf-aipill
8792
Heat pill+ hot.pf-heat
AIVXAR
Avatarsbot / player.pf-av
Heat barcrit / warm / cool.pf-hbar
Merged by AI
Connectorinputs → win.pf-connector
crash_2026-06-18.log
Attachment.pf-attach
+10 more reports matched
Volume cueproves scale, not a toy pair.pf-more
Review
Review / undohuman-gate cue for AI actions.pf-review
Area Merchant UIType CrashPlatform PS5
Tag chipscategory-colored, editable.pf-tag
on PS5 after it crashes
Source tokenhighlighted word a tag derives from.pf-tok
via Discord · #bug-reports
Source cuewhere a report came from.pf-source
Crossplay Setup · your docs
Doc citationanswer sourced from your docs.pf-cite
Lumen BOT 3:14 AM
Bot identitysender + BOT tag + time.pf-bottag
help no staff online
Channel headerchat-fragment stand-in for the breadcrumb.pf-channel
Your rule · no log → ask for log + repro on
Rule stripthe trigger you configured.pf-rule
05 — Components

Cards

The building blocks of a flow. Inputs are neutral cards; the win is a feature card (green) or critical flag (red). Chat uses bubbles.

1
#1042Combat feels unresponsive after dodging
AR Aria_K · 4h ago 87
Report carda single incoming bug — the neutral input.pf-card.pf-report
Combat input lag
2 reports · 1 thread · severity raised to High
1 bug
Result cardthe positive win — one per fragment.pf-result
Top priority · fix first
Merchant menu crash on console
94HEAT
Critical / hero cardthe "fix first" flag — red win variant.pf-hero
AI
Could you attach the crash log and the exact steps?
VX
Sure — log attached.
crash.log
Chat bubblesbot ↔ player conversation.pf-msg / .pf-bubble
06 — Composition

Patterns

Atoms + cards composed into full proofs. These are the canonical layouts — copy them when building a capability. Scroll to trigger, or replay.

Bugs/New 92% match
1
#1042Combat feels unresponsive after dodging
AR Aria_K
2
#1051Too much input lag in melee combat
VX Vex
+10 more reports matched
Merged by AI
Combat input lag
12 reports · 1 thread
Review
Pattern · Merge flowobeys §00 · heat/severity/badge cut · volume + review added
Bugs/Prioritized Re-ranked 3 min ago
31 duplicates · 240 upvotes · active 2h ago
Merchant menu crash on console
94HEAT
2Combat input lag71
3Quest marker missing in Chapter 448
Pattern · Priority flowobeys §00 · score decomposed (the why) · freshness stamp · triple label cut
bug-reports
Your rule · crash report with no log → ask for log + repro on
L
Lumen BOT
Thanks for the report! Could you attach the crash log and the steps to reproduce?
VX
Vex
Sure — happened right after the parry.
crash log
Completed automatically
Crash log Repro steps
If a player goes quiet, it reminds them — then flags it for you.
Pattern · Conversation flowobeys §00 · breadcrumb→channel · rule shown · checklist proves auto-detect · fallback added
Bugs/Incoming Auto-tagged
via Discord · #bug-reports
Game crashes when I open the merchant menu — was on PS5, right after the patch.
Tagged by AI
Area Merchant UI Type Crash Platform PS5
Filed & searchable
Tagged from the player's own words · override anytime
Pattern · Auto-tag flowobeys §00 · severity/handle/"0 clicks" cut · source + editable tags · words→chips traceable by color
help 3:14 AM · no staff online
MK
mika
How do I enable crossplay?
L
Lumen BOT
Settings → Multiplayer → Crossplay — toggle it on and restart. Crossplay Setup · your docs
Answered from your docs
Runs unattended · escalates to you when the docs can't answer
Pattern · Support flowobeys §00 · "24/7" badge + "4s" cut · breadcrumb→channel · doc citation + escalation added
07 — Motion

Animation

One scroll-triggered sequence per fragment, re-staging the cause→effect. Parts .pf-rise in source order; the connector .pf-pops; the outcome .pf-win settles last with a single glow.

Timing

--d-reveal 440ms
--d-pop 380ms
--stagger 90ms

Easing

--ease-out for rises & fades
--ease-back for the pop & win settle (slight overshoot)

Trigger

IntersectionObserver at ~35% visibility adds .is-in once. Never loops on its own — only the manual Replay re-runs it.

Reduced motion

prefers-reduced-motion shows the final state instantly — no transforms, no glow. Always test both.

Rule: motion clarifies, it doesn't decorate. If removing the animation hurts comprehension, the static layout is wrong — fix the layout, not the motion.