Poker Training Simulator - Plugin for ClickOut Media
πŸ•ΉοΈ

Poker Training Simulator - Plugin for ClickOut Media

image

The context

ClickOut Media operates a network of poker affiliate sites generating revenue through organic traffic routed to real-money poker room sign-ups. The Poker Training Simulator was conceived as an embeddable mini-game plugin β€” deployable across any ClickOut poker property β€” designed to generate engagement, increase dwell time, and create a recurring reason for users to return between sessions.
The project did not start as a clean brief. A PM came to me with a version already in development β€” built by developers without a designer, without domain knowledge, and without any competitive benchmarking. The ask was: "can you adjust the screens a bit to fit 9 players?"
What I found was not a layout that needed adjusting. It was a product with structural architecture failures, broken game logic, non-standard interaction patterns, and a visual system that bore no resemblance to any real poker product on the market. A partial fix would have compounded the existing problems. A full architectural rebuild was required.
β›³

Objectives

Rescue and rebuild a poker simulator plugin from architectural failure β€” correcting game logic errors, redesigning the full layout system for 3–9 player scalability, establishing a coherent brand identity, and delivering a production-ready design system that development could implement without ambiguity.

πŸ“¬

The missions

  • Diagnose the full scope of structural, interaction, and game logic failures in the existing build
  • Reframe the brief: from "adjust screens" to "rebuild the architecture"
  • Design a scalable responsive layout system supporting 3, 6, 8, and 9 player configurations
  • Rebuild the full component library from scratch: cards, player modules, betting controls, modals
  • Correct all game mechanics logic errors and enforce poker rule compliance across all interaction states
  • Design the desktop version from scratch (no existing reference)
  • Solve the vertical raise slider conflict with page scroll in an embedded web context
⏱️

Duration

Ongoing

πŸ§‘β€πŸ”§

Role

Senior Product Designer β€” sole designer on the project

πŸ§‘β€πŸ’»

Project Team

1 PM (Tatsiana), Dev team, 1 Senior Product Designer

β€£

Mission 1: Diagnosis β€” reframing the brief

πŸ“’

Context

The PM's initial request was narrow: make room for more players. The implicit assumption was that the existing layout was structurally sound and only needed visual adjustments. A quick audit of the production build revealed this assumption was wrong at every level β€” not just layout, but interaction logic, game mechanics, visual hierarchy, and brand identity.

This was not a design polish problem. It was a product that had been built entirely outside the domain of poker, by a team with no exposure to real poker applications, and with no benchmarking against any existing product in the category.

🎯

My approach

  • Conducted a full audit of the existing build: layout architecture, component structure, interaction states, game logic
  • Documented every failure category: structural (layout collapse at 6+ players), ergonomic (betting controls below fold), visual (no brand coherence, no poker metaphors), and logical (impossible game states shipped to production)
  • Communicated the full scope of the problem to the PM with precise technical framing β€” not as a criticism but as a prerequisite to scoping the real work
  • Established a new baseline: "this cannot be extended without a full architectural rework"
β€£

1. Layout architecture failure

πŸ“” Context

The production build consumed over 80% of vertical viewport space with 5 players. Player seat positions were hardcoded, not adaptive. Adding seats was physically impossible without redesigning the entire spatial system.

🚨 Problem

  • Viewport saturation at 5 players: board, pot, and player cards left no room for additional seats
  • Player distribution logic was static β€” no proportional scaling as player count increased
  • Betting controls partially below the fold on standard mobile viewports, requiring scroll during active gameplay
  • No safe area compliance on modern device form factors

πŸ’Š Solution

  • Defined a responsive layout grid with explicit anchor zones: table zone, hero zone, action zone, board zone
  • Seat positions designed as adaptive β€” repositioning and resizing proportionally from 3 to 9 players
  • Action zone (fold/call/raise + bet slider) locked permanently above the fold on iPhone 6 (375Γ—667), iPhone 13 (375Γ—812), and iPhone 16 (393Γ—852) β€” the three constraint baselines that cover the full iOS market range
  • All zones validated in worst-case simultaneous-load conditions: every player active, bets visible, board full, modal open
  • Built a Mobile Integration Stress Test frame: the widget embedded inside the actual Odds Data mobile page template (header, navigation, live score widgets sidebar, related widgets, footer) β€” proving the plugin works in its real deployment context, not just in isolation
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: side-by-side OLD build (dev version, 5 players max) vs. NEW redesigned version (9 players). Shows the scope of the architectural failure at a glance. Source: Scenarios page, Pre-Flop OLD vs NEW frames.
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Mobile Integration Stress Test showing the poker widget embedded inside the Odds Data mobile page template with header, nav, content, footer. Source: Image 2 (Integration & Stress Test mobile frame).
β€£

2. Game logic errors in production

πŸ“” Context

This was the most critical finding. A simulator that teaches incorrect poker rules is not a neutral product β€” it actively damages user trust and brand credibility. Several interaction states shipped in the existing build represented impossible or illegal game situations.

🚨 Problem

  • Players shown as able to "Check" when a live bet was already in play β€” an illegal action in poker
  • Raise logic inconsistent: minimum raise amounts not enforced, re-raise sizing not respected
  • Acting order did not follow standard poker seat conventions
  • Fold/Call/Raise button states active in contradictory combinations
  • No distinction between blind posting states and active betting states

πŸ’Š Solution

  • Mapped every game state against Texas Hold'em rules: pre-flop, flop, turn, river, showdown
  • Defined explicit action availability rules per state: which buttons are active, which are disabled, and why
  • Flagged all production errors formally to the PM with documentation β€” each error described as a user-facing credibility risk, not just a design issue
  • Designed interaction states that enforce correct poker logic: Check only available when no live bet exists, Raise sizing respects minimum raise rules, acting order follows seat position conventions
  • Built a complete scenario strip (Pre-flop β†’ Flop β†’ Turn β†’ River β†’ Result) to validate that every component has a defined placement rule at every game stage
β€£

3. Competitive benchmarking β€” building domain authority

πŸ“” Context

The dev team had built the original product without looking at a single real poker application. No benchmarking, no competitive analysis, no reference to industry conventions. Every design decision had been made in a vacuum. Before proposing solutions, I needed to establish what "correct" looked like β€” not from personal opinion, but from documented evidence across the market leaders.

🚨 Problem

  • Zero competitive references in the existing project β€” no awareness of industry conventions
  • PM and dev team had no framework for evaluating whether a design decision was standard or arbitrary
  • Without benchmarking evidence, every design recommendation would be perceived as subjective preference rather than domain-informed necessity

πŸ’Š Solution

  • Conducted a structured competitive audit across 4 market leaders, on both mobile and desktop: GG Poker, PokerStars, 888 Poker, and Unibet Poker β€” capturing multiple game states from each product
  • Mobile audit (16+ screens captured): documented seat positioning logic across 6, 8, and 9 player configurations; action button placement patterns (bottom-anchored across all competitors); raise slider orientation (vertical in all native apps β€” confirming the horizontal pivot was a novel solution specific to the embedded web context); card sizing and legibility at compressed scales; hero position conventions; pot display patterns
  • Desktop audit (10+ screens captured): documented how each competitor leverages landscape orientation; seat distribution around elliptical tables; action zone positioning; typography scaling from mobile to desktop; player module sizing differences
  • Key findings extracted per competitor: GG Poker β€” most aggressive use of avatar/animation, largest action buttons, clearest pot display hierarchy; PokerStars β€” cleanest information architecture, most consistent seat scaling across player counts, strongest card legibility at small sizes; 888 Poker β€” distinctive visual identity (checkered blue theme), most explicit bet labelling with chip amounts in front of each player; Unibet Poker β€” most minimalist table design, clearest fold/call/raise colour coding (red/yellow/green), best use of space in multi-table desktop view
  • Compiled both audits as dedicated Figma reference pages (Mobile Ref / Desktop Ref) β€” available as persistent artifacts for the PM and dev team to reference during implementation, not just design phase
  • Every subsequent design decision in Missions 2–5 was backed by at least one benchmark reference β€” seat positioning validated against PokerStars and GG Poker conventions, pot display logic cross-referenced with 888 Poker's explicit chip-in-front-of-player pattern, action button sizing and colour coding informed by Unibet's red/yellow/green system
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Mobile Ref + Desktop Ref Figma pages showing the 4 competitors side by side (GG Poker, PokerStars, 888 Poker, Unibet). Proves the audit was systematic, not casual. Source: Mobile_Ref.pdf / Desktop_Ref.pdf or screenshot of Figma reference pages.
πŸ“Š

Measurable Results

  • Full audit documented: structural, ergonomic, visual, and game logic failure categories
  • Brief successfully reframed from "adjust screens" to "full architectural rebuild" β€” PM aligned on scope
  • All production game logic errors identified, documented, and flagged before the redesign began
    • Constraint baselines established: iPhone 6 (375Γ—667), iPhone 13 (375Γ—812), and iPhone 16 (393Γ—852) as the three viewports that define the system's outer limits
  • Competitive benchmark completed: 4 market leaders (GG Poker, PokerStars, 888 Poker, Unibet Poker) audited across 26+ screens on both mobile and desktop β€” compiled as persistent Figma reference pages for the full team
  • Every design decision from Missions 2–5 backed by documented competitive evidence β€” zero subjective recommendations
β€£

Mission 2: Rebuild β€” scalable layout system

πŸ“’

Context

With the PM aligned on scope, the rebuild began from zero. The starting point was not the existing design β€” it was the constraints: how do you fit 9 players, a full board, a pot, betting controls, and a raise slider onto a 375px wide screen, inside a scrollable web article, without breaking a single interaction? This is a harder problem than it looks. Real poker apps sidestep most of these constraints because they are native apps with full screen ownership. This plugin had none of those advantages.

🎯

My approach

  • Designed mobile-first, treating the 375Γ—667 (iPhone 6) viewport as the hardest constraint, then validating at iPhone 13 (375Γ—812) and iPhone 16 (393Γ—852)
  • Built all seat configurations (3, 6, 8, 9 players) as explicit frames β€” not assumptions
  • Validated every configuration in worst-case density: all players active simultaneously, all bets visible
  • Built the full component library in parallel with the layout system β€” not after
  • Designed the desktop version from scratch, taking full advantage of available screen real estate the dev team's attempt had failed to use
  • Delivered a Responsive Playground frame: a resizable container where developers can drag the viewport boundary in any direction to inspect how every element responds to constraint changes and layout rules β€” eliminating the need for developers to guess responsive behaviour from static mockups
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Responsive mobile behavior frame showing iPhone 6 / iPhone 13 / iPhone 16 side by side at worst-case density. Proves the layout holds across all 3 breakpoints. Source: Image 1 top section (Responsive mobile behavior).
β€£

1. Seat scaling system β€” 3 to 9 players

πŸ“” Context

Poker table layouts follow established industry conventions for seat positioning β€” conventions that exist because they reflect how real poker tables work and how players mentally model the game. Deviating from these conventions creates cognitive friction. The existing build had no awareness of these conventions.

🚨 Problem

  • No seat positioning logic: seats were placed arbitrarily with no reference to industry standards
  • No scaling system: each player count would have required a completely manual redesign
  • Hero position ("You") was centered, creating visual conflict with the betting controls on the right side of the screen

πŸ’Š Solution

  • Benchmarked seat positioning against GG Poker, PokerStars, 888poker, Unibet, and BetRivers β€” extracting the common conventions for 3, 6, 8, and 9 player configurations
  • Hero intentionally positioned left of center: respects thumb reach zones, separates player cards from the raise slider and action buttons, reduces mis-tap risk during fast decisions
  • All seat positions defined as anchored, adaptive zones β€” repositioning proportionally as player count increases
  • Built dedicated frames for each configuration showing zero overlap, zero clipping at maximum density
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Mobile/Template Master Game showing 3, 6, 8, 9 seat configurations stacked vertically. Shows the scaling system at a glance. Source: Image 6 from mobile Figma overview (Mobile/Template Master Game section).
β€£

2. Component library rebuild

πŸ“” Context

The existing build had no coherent component system. Elements were one-off, inconsistently sized, and used visual metaphors that bore no relationship to real poker products β€” betting tokens looked like generic UI chips, cards collapsed visually at small sizes, player states had no clear hierarchy.

🚨 Problem

  • Cards illegible at small viewport sizes: suit symbols too similar (clubs/spades confusion), rank hierarchy unclear
  • Betting tokens using generic UI metaphors instead of poker-standard chip representations
  • Player module states undefined: no visual distinction between active, folded, acting, and waiting states
  • Yellow table borders created visual noise that competed with the core gameplay zone
  • No modal system for hand results and next-hand transitions

πŸ’Š Solution

  • Redesigned card system: higher-contrast suit symbols, clearer rank/suit hierarchy, legible at compressed board scale (8–9 player worst-case)
  • Betting tokens redesigned to match standard poker chip metaphors used across the industry
  • Player modules built with all states defined: default, active (acting), folded, all-in, winner
  • Yellow borders removed: visual hierarchy rebuilt around the green felt zone as the primary focal anchor
  • Full modal system designed: hand result overlay, next hand transition, pot distribution display
  • All components placed in a single Figma section with explicit usage rules and dependency documentation for engineering
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Components section overview from Figma showing Cards (full 52-card deck grid), Player modules, Bet Button states, Cursor system, Table component. Proves design system depth. Source: Image 6 right side (Components section).
β€£

3. Raise slider β€” solving the scroll conflict

πŸ“” Context

This was one of the most technically specific problems in the project, and it only becomes visible when you understand the deployment context. Native poker apps use vertical raise sliders β€” moving finger upward increases the raise amount. This is the industry standard. But this plugin is embedded inside a web article. Vertical swipe gestures on a scrollable page trigger page scroll, not slider movement. The standard pattern breaks completely in this context.

🚨 Problem

  • Vertical raise slider conflicts with native browser scroll behavior on mobile
  • User attempting to raise triggers page scroll instead β€” a critical interaction failure during gameplay
  • No existing poker product had solved this in an embedded web context: all competitive references were native apps with full scroll ownership

πŸ’Š Solution

  • Pivoted the raise slider from vertical to horizontal orientation
  • Horizontal swipe does not conflict with vertical page scroll β€” the browser correctly interprets the gesture direction
  • Validated the pattern against thumb ergonomics: left-to-right raise input maps naturally to "more" directional logic
  • Documented the rationale explicitly in Figma annotations for the dev team β€” preventing regression to vertical orientation during implementation
β€£

4. Desktop version β€” integration context and cross-platform validation

πŸ“” Context

The desktop version could not be designed as a scaled-up mobile layout. The plugin embeds inside Odds Data article pages β€” a two-column layout with a sidebar (live score widgets, related widgets). The simulator occupies the main content column at a default width of 1900px. The dev team's previous attempt had simply stretched the mobile layout horizontally, wasting screen real estate and breaking spatial relationships between players.

🚨 Problem

  • Existing desktop build was a stretched mobile layout β€” no adaptation to the wider viewport or the page context it lived in
  • Seat distribution designed for portrait orientation did not translate to landscape β€” player positions overlapped or floated in empty space
  • No integration stress test: the widget had never been validated inside the actual Odds Data page template with its navigation, sidebar, and footer
  • Hand Results modal designed for mobile only β€” no consideration for how a 9-player result table would render on desktop without scrolling

πŸ’Š Solution

  • Designed the desktop version from scratch using the Odds Data page template as the real integration context β€” not in isolation. Built an explicit Old vs. New comparison frame at 1900w showing the widget embedded in its actual deployment environment with navigation, sidebar, and footer visible
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Desktop Old vs. New comparison at 1900w inside Odds Data page template. Shows the widget in its real deployment context with nav, sidebar, footer. Source: Image 1 from desktop Figma screenshots (Integration & Stress Test, Old vs New).
  • Built a Desktop Template Master Game frame validating all 4 seat configurations (3, 6, 8, 9 players) at desktop scale β€” each annotated as a layout stress test for the dev team: "This screen is a layout stress test demonstrating table configurations for 3, 6, 8, and 9 players. Its purpose is to validate seat distribution, spacing, and overall layout consistency across all supported player counts."
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Desktop Template Master Game showing 3/6/8/9 seat configurations with the "Development" annotation callout visible. Source: Image 4 from earlier desktop Figma screenshots (Desktop/Template Master Game).
  • Designed a complete desktop scenario strip: Pre-Flop (4 states), Flop (2 states), Turn (1 state), River (1 state), Hand Result (4 states) β€” mirroring the mobile game state architecture 1:1, ensuring cross-platform behavioural parity
  • Solved the Hand Results modal responsive layout: up to 7 players renders as a single-column player list; 8+ players switches to a two-column layout β€” preventing modal overflow and keeping all content visible on screen without scrolling. Row states defined for desktop: default (neutral), user (highlighted), winner (gold) β€” with hover state that previews player details, and click that selects and expands
  • Desktop action zone repositioned: bet slider and action buttons moved to the right side of the hero zone, taking advantage of horizontal space. Cursor buttons (+/βˆ’) retain hover states specific to desktop (not present on mobile)
πŸ“Š

Measurable Results

  • Full responsive layout system delivered: 3, 6, 8, and 9 player configurations, all validated at worst-case density β€” on both mobile (3 breakpoints: iPhone 6, 13, 16) and desktop (1900w)
  • Responsive Playground delivered: resizable Figma frame where developers can drag viewport boundaries in any direction to inspect constraint behaviour β€” eliminating guesswork during responsive implementation
  • Mobile Integration Stress Test delivered: widget embedded inside the full Odds Data mobile page template (header, nav, sidebar, footer) β€” proving the plugin works in its real deployment context
  • Complete component library rebuilt from scratch: cards, player modules, betting controls, tokens, modals β€” all states defined
  • Desktop version designed from zero inside the real Odds Data page template β€” Old vs. New integration comparison delivered at 1900w, proving the widget works in its actual deployment context
  • Desktop Template Master validated: 4 seat configurations (3/6/8/9) stress-tested with annotated dev documentation
  • Desktop scenario strip delivered: 12 game state frames mirroring mobile 1:1 β€” ensuring cross-platform behavioural parity
  • Hand Results modal responsive breakpoint defined: single-column ≀7 players, two-column 8+ players β€” zero overflow, zero scrolling required
  • Raise slider conflict resolved: horizontal orientation eliminates scroll collision in embedded web context
  • Zero overlap, zero clipping validated across all configurations and component states on both platforms
β€£

Mission 3: Stakeholder management β€” leading without authority

πŸ“’

Context

The PM had no poker domain expertise and no design background. She was managing a dev team that had already shipped a product. Telling her the product needed to be rebuilt from scratch was not a message the team was expecting or initially willing to hear. Managing this situation required precise communication β€” translating every design and logic decision into business and product risk language, not design language.

🎯

My approach

  • Never framed feedback as "this looks wrong" β€” always framed it as "this creates a specific user-facing risk or a credibility problem"
  • Proactively communicated progress, scope changes, and rationale in writing β€” creating a paper trail that protected both the PM and the project
  • When the PM misread worst-case stress-test frames as realistic gameplay screens, clarified the distinction immediately and in precise terms: these frames prove structural robustness, not simulate a real hand
  • Defended every design decision with domain evidence: industry benchmarks, real production references (BetRivers, PokerStars, GG Poker), ergonomic rationale
  • Offered a live walkthrough to align on the system logic β€” keeping the PM as a partner rather than an obstacle
β€£

1. Reframing scope β€” from cosmetic to architectural

πŸ“” Context

The PM's initial brief was explicitly "adjust the screens a bit." Accepting this framing would have meant delivering a cosmetic fix on a structurally broken product β€” which would have shipped, failed, and reflected on everyone involved.

🚨 Problem

  • PM expected minor visual adjustments, not a full rebuild
  • Dev team had already invested time in the existing build β€” a full rework carried internal political risk
  • No shared vocabulary between PM, dev team, and designer around what "done" looked like

πŸ’Š Solution

  • Documented the architectural impossibility of a partial fix with technical specificity: "the board, pot, and player cards already consume over 80% of vertical space β€” there is no room for additional seats without a fundamental UI architecture rework"
  • Shared a WIP Figma link within days of receiving the brief β€” showing directional progress before asking for scope approval
  • Framed the rebuild not as extra work but as the only path to a product that could actually be shipped and maintained: "a partial fix would only create more inconsistencies"
β€£

2. Managing the worst-case frame misreading

πŸ“” Context

Worst-case frames β€” showing all 9 players active simultaneously with full bets visible β€” were designed as stress tests to prove structural robustness. The PM reviewed them as realistic gameplay screens and raised feedback about bet sizing, open frequencies, and chip display β€” none of which are layout issues.

🚨 Problem

  • PM feedback targeting game simulation behavior, not layout validation
  • Risk of derailing the design process with out-of-scope concerns
  • Potential loss of confidence in the design if the purpose of each frame type was not clarified

πŸ’Š Solution

  • Clarified the distinction in writing with precision: "these are not gameplay simulations β€” they are worst-case UI layout validations. The goal is to prove that the layout does not break under maximum load."
  • Separated the two workstreams explicitly: stress-test frames (structural validation) vs. interactive prototypes (realistic gameplay demonstration)
  • Delivered both: worst-case frames proving robustness, interactive prototypes demonstrating realistic flow β€” each serving its purpose without conflating the two
πŸ“Š

Measurable Results

  • Scope successfully reframed from cosmetic adjustment to full architectural rebuild β€” without losing PM alignment
  • All design decisions documented in writing with domain-level rationale β€” zero ambiguity for dev handoff
  • Worst-case validation and interactive prototype workstreams separated β€” PM aligned on the purpose of each
  • Hero position, card sizing, raise slider orientation, and component states all defended and accepted with industry evidence
β€£

Mission 4: Interaction design β€” micro-UX system & component architecture

πŸ“’

Context

Once the layout architecture was validated and stakeholder alignment secured, the work moved into the interaction layer. This is where the design system's depth became visible β€” not as a collection of static screens, but as a fully specified, state-aware component library capable of driving a real-time game without ambiguity. Every component required multiple states, every interaction required a precise behavioural spec, and every animation had to operate within the constraints of a scrollable embedded web context.

🎯

My approach

  • Designed the raise slider interaction as a custom horizontal cursor system, replacing the industry-standard vertical slider entirely β€” the only viable solution for an embedded web context
  • Built a real-time bet amount display (MiniCardData) using a drum-roll scroll animation β€” amount updates continuously as the slider moves, at 5 percentage increments (0 / 25 / 50 / 75 / 100%)
  • Specified the Bet β†’ Raise label switch logic: primary action label updates dynamically based on slider position relative to minimum bet threshold
  • Designed the full card reveal sequence for Flop, Turn, and River β€” each stage as a separate frame with progressive card visibility (hidden="true" vs visible) to drive Figma prototype transitions
  • Built a complete Design System component library covering every element of the game surface
β€£

1. Horizontal raise slider β€” CursorIncremental system

πŸ“” Context

The raise slider is the most technically specific interaction in the product. Native poker apps use vertical sliders. This plugin is embedded in a scrollable web page β€” vertical swipe conflicts with browser scroll. The interaction had to be completely rearchitected for the deployment context.

🚨 Problem

  • Vertical raise slider = page scroll triggered instead of raise amount change
  • No existing poker product had solved this in an embedded web context
  • The slider had to remain intuitive and ergonomically usable with one thumb on mobile

πŸ’Š Solution

  • Horizontal slider with two explicit cursor buttons: + (right) and βˆ’ (left)
  • MiniCardData widget above the slider: displays current raise amount in real time with a drum-roll animation (numbers scroll vertically inside a clipped container β€” $120 β†’ $130 β†’ ... β†’ $220)
  • Percentage indicator (0% β†’ 100%) displayed simultaneously below the amount
  • 5 discrete states documented as Figma symbols: Percentage=0, 25, 50, 75, 100 β€” each with precise fill and cursor positioning
  • Slider fill turns yellow (brand color #FFD700) at 100% β€” visual confirmation of all-in
  • All states annotated in Figma dev mode: cursor position, fill behavior, amount display rules
πŸ”΄ VISUAL ASSET NEEDED β€” GIF: Cursor Bet Interaction prototype recording. Shows +/βˆ’ stepping, yellow progress bar fill, drum-roll amount update, and Betβ†’Raise label switch in action. This is the single most impressive micro-interaction β€” high-impact GIF. Source: Record "Cursor Bet Interaction – Prototype" in Figma.
β€£

2. Bet β†’ Raise dynamic label system

πŸ“” Context

The primary action button label is not static β€” it changes based on the game state and the slider position. This is a core poker rule that the original build had implemented incorrectly.

🚨 Problem

  • Original build showed "Bet" and "Raise" labels inconsistently with no game-state logic
  • No distinction between betting into an empty pot vs. raising a live bet

πŸ’Š Solution

  • Primary button shows BET when no live bet exists and slider is at minimum (new street, no prior action)
  • Primary button switches to RAISE once the slider exceeds the minimum legal raise threshold
  • Button displays both the action label (top, small) and the current amount (bottom, bold italic) β€” two-line format for at-a-glance decision-making
  • All four action states fully specified as Figma symbols: Against Bet / Against No Bet / No Raise Available / Partial Raise (ALL-IN)
  • Dev mode annotation on the BetButton component: "The primary action switches from Bet to Raise once the slider exceeds the minimum bet. The Bet/Raise value follows the raising amount."
β€£

3. Card reveal sequence β€” Flop, Turn, River

πŸ“” Context

The board card reveal is the central visual moment of each hand. Each new street (Flop = 3 cards, Turn = 4th card, River = 5th card) reveals an additional card. This needed to be prototypeable in Figma with precise frame-by-frame control.

🚨 Problem

  • Cards needed to appear progressively, not all at once
  • The 5th board card position needed to remain spatially consistent across all stages
  • "Proto Card Asset" variant needed to differentiate the newly revealed card from existing ones to enable per-card animation triggers in Figma prototyping

πŸ’Š Solution

  • 6 prototype frames built for the Turn and River sequence, showing the exact visibility state of each card slot
  • Cards use hidden="true" attribute until their street arrives β€” then swap to visible Proto Card Asset instance
  • The Component 2 instance marks the newly revealed card (distinct from Card Asset = existing visible card) β€” enables Figma's Smart Animate to apply entry transition to that card only
  • Board Card component built in 2 sizes: S (183Γ—47px, 5-card horizontal strip) and M (243Γ—63px)
  • Validated the full board progression across extracted game states: Pre-Flop (0 visible / 5 hidden), Flop (3 visible / 2 hidden), Turn (4 visible / 1 hidden), River (5 visible / 0 hidden) β€” each card slot maintains its exact spatial position (0px, 37px, 74px, 111px, 148px offset) regardless of visibility state, ensuring zero layout shift during reveal transitions
πŸ”΄ VISUAL ASSET NEEDED β€” GIF: Cards Appearance Turn and River prototype recording. Shows Flopβ†’Turnβ†’River card reveal animation β€” clicking Check triggers next card appearance via Smart Animate. Demonstrates the zero-layout-shift board progression. Source: Record "Cards Appearance Turn and River – Proto" in Figma.
β€£

5. Interactive prototypes β€” playable deliverables, not static specs

πŸ“” Context

Static mockups and annotated specs reduce ambiguity, but they cannot communicate timing, sequence, and interaction feel. For a real-time game product, the dev team and the PM needed to experience the flow β€” not just read about it. I delivered three separate interactive prototypes, each scoped to demonstrate a specific interaction layer.

🚨 Problem

  • Static frames cannot convey the sequential logic of a poker hand: deal β†’ bet β†’ reveal β†’ result
  • The PM had no poker domain knowledge β€” she needed to play through a hand to understand the interaction model
  • Dev team needed to see animation timing, transition sequences, and state changes in motion β€” not as written specs
  • Risk of the dev team implementing transitions incorrectly without a playable reference

πŸ’Š Solution

  • GameSimulation Prototype (20+ frames): a full single-hand simulation playable in Figma, covering the complete hand lifecycle from Pre-Flop deal through betting flow, card reveals, pot aggregation, player action states (fold, check, call, raise), conditional display of active CTAs, and visual feedback for each stage transition. Annotated with an Interaction note: "This prototype simulates a single hand from Pre-Flop to Hand End, focusing on betting flow and state transitions. It demonstrates card placement and pot aggregation, player action states, with a full fold, check, and opponent visibility when folded or active, conditional display of player active CTAs, and visual feedback for stage transitions"
  • Cursor Bet Interaction Prototype: isolated demonstration of the horizontal raise slider. Shows the +/βˆ’ cursor stepping behaviour, real-time amount update on the MiniCardData widget, yellow progress bar fill, percentage indicator transition, and the Bet β†’ Raise label switch when the slider exceeds the minimum bet threshold
  • Cards Appearance Turn and River Prototype: isolated demonstration of the Turn and River card reveal animations. Clicking Check triggers the card appearance sequence β€” Flop β†’ Turn reveal β†’ River reveal β€” with each new card entering via Smart Animate transition while existing cards remain static
  • Each prototype scoped to one interaction layer β€” preventing confusion between game flow, slider mechanics, and card animation. Dev team could reference each prototype independently during implementation of each feature
πŸ”΄ VISUAL ASSET NEEDED β€” GIF: GameSimulation Prototype recording (full hand). Shows the complete Pre-Flopβ†’Flopβ†’Hand End flow β€” betting, folding, pot aggregation, card reveals, result modal. This is the hero GIF of the entire case study β€” proves the system works as a coherent experience, not just isolated components. Source: Record "GameSimulation Prototype" in Figma (play through 1 full hand).
β€£

4. Design System component inventory β€” full specification

πŸ“” Context

The complete component library was built from scratch and organized as a single Components section in Figma, covering every element of the game surface at every state.

πŸ’Š Component inventory

Cards β€” 52-card deck Γ— 4 suits (β™₯ β™  ♦ ♣) Γ— 5 sizes (XS / S / M / L + Back) β€” 208+ symbols. Suits color-coded: β™₯ ♦ red, β™  ♣ black. Each size optimized for its context: XS for opponent hole cards, M for the board, L for hero hand.

Player modules β€” 3 states: Default (waiting), Action (currently acting, yellow highlight), Folded (desaturated). Each state drives nameplate and card container appearance simultaneously.

Betting zone β€” Token, BigGroupToken (stack of 3 chips), BetLabel (left/right orientation variants), Pot display (chips visible or hidden), Dealer Button (gold glow shadow).

Action Buttons β€” 4 complete states as full-width mobile frames: Against Bet (FOLD / CALL $x / RAISE $x), Against No Bet (FOLD / CHECK / BET $x), No Raise Available (FOLD / CALL β€” raise slider hidden), Partial Raise (FOLD / CALL $x / ALL-IN $x).

Cursor system β€” Button Cursor (+ and βˆ’, Mobile and Desktop variants with Hover states), MiniCardData (real-time amount display), CursorIncremental (5 fill states).

Hero Hand β€” 3 states: Default, Action, Folded. Nameplate in 2 sizes (S for opponents, M for hero) with 2 types (name+stack, messaging).

Stage indicator β€” 4 states: Pre-Flop, Flop, Turn, River. Yellow Archivo Black typography, white "Stage" subtext, slight rotation for visual character.

Hand Results modal β€” full result overlay with Cell component (win / lost / default Γ— Mobile/Desktop Γ— Default / Hover / Selected / Hover Selected states), Result label (Win/Lost), and primary CTA button. Responsive layout rule: single-column player list for up to 7 players, automatic switch to two-column layout at 8+ players β€” preventing modal overflow on both mobile and desktop. On desktop, row hover previews player details; click selects and expands the row.

πŸ”΄ VISUAL ASSET NEEDED β€” GIF: Hand Results modal row interaction. Show tapping Player 2 (expand), then Player 4 (winner highlight with gold row + cards). Demonstrates expand/collapse, row states, winner highlight. Source: Record Hand Result prototype interaction (tap Player 2 then Player 4 as mentioned in the Figma annotation).
πŸ“Š

Measurable Results

  • Complete Design System delivered: 208+ card symbols, 4 player states, 4 action button states, 5 slider states, 4 stage indicators, full Hand Results modal β€” zero undocumented states
  • Raise slider interaction solved: horizontal CursorIncremental with drum-roll amount display β€” resolves the embedded scroll conflict while maintaining one-thumb mobile usability
  • Bet β†’ Raise label logic fully specified and annotated in dev mode β€” zero implementation ambiguity
  • Card reveal sequence prototypeable in Figma via hidden/visible + Proto Card Asset pattern β€” enables per-card Smart Animate entry transitions
  • 3 interactive prototypes delivered: GameSimulation (20+ frames, full hand lifecycle), Cursor Bet Interaction (slider mechanics isolation), Cards Appearance Turn/River (card reveal animation isolation) β€” each scoped to one interaction layer for targeted dev reference
  • Dedicated Action Bet Button Spec page (998Γ—1624): formal developer reference documenting all 4 action states (Against Bet, Against No Bet, No Raise, Partial Raise) with annotated slider logic, button rules, and edge-case conditions β€” a standalone handoff artifact
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Action Bet Button Spec page (998Γ—1624) showing all 4 states (Against Bet, Against No Bet, No Raise, Partial Raise) with dev annotations. Proves the spec is a formal handoff artifact, not just a mockup. Source: Image 5 (Action Bet Button Spec frame).
  • Figma file organized into 7 distinct sections: Prototype (playable demos), Responsive (3 breakpoints + Playground), Scenarios (OLD vs NEW per street with state annotations), Action Bet Button Spec (formal dev reference), Mobile/Template Master Game (3/6/8/9 seat configurations), Components (full design system), Proto Components (prototype-specific variants) β€” dev team navigates by section, not by searching through unstructured frames
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Full Figma file bird's-eye view showing all 7 sections (Prototype, Responsive, Scenarios, Action Spec, Mobile/Template Master, Components, Proto Components). Proves the file is an organized handoff system. Source: Image 9 (full mobile Figma page overview).
  • All components named, organized, and cross-referenced between the Components section and the Template Master frames β€” dev team can implement without designer intervention on each sprint
β€£

Mission 5: Game state architecture β€” enforcing poker logic at the system level

πŸ“’

Context

A poker training simulator that ships incorrect game states is worse than no product at all β€” it teaches wrong behaviour and destroys credibility with the target audience (players who know the rules). The original build had no formal state architecture: button availability, pot display, and card progression were handled ad hoc by developers with no poker domain knowledge. I designed a complete game state system covering every street (Pre-Flop β†’ Flop β†’ Turn β†’ River β†’ Hand Result), every action availability rule, and every pot display logic β€” validated frame by frame in Figma against Texas Hold'em rules.

🎯

My approach

  • Mapped the full hand lifecycle as a state machine: 5 stages Γ— 2 betting contexts (facing bet / facing no bet) = 10+ distinct UI states, each requiring a unique combination of action buttons, pot display, and player module states
  • Designed each state as an explicit Figma frame with annotated rules β€” not as abstract documentation but as pixel-precise, implementable specifications
  • Validated pot display logic across all streets to ensure visual consistency and rule compliance
  • Built the action availability matrix as a developer-facing reference: which buttons appear, which are disabled, and why β€” driven by game state, not by arbitrary UI decisions
  • Cross-referenced every frame against real-money poker products (BetRivers, PokerStars, GG Poker) to ensure domain-standard behaviour
β€£

1. Pot display logic β€” resolved vs. active bets

πŸ“” Context

Pot display in poker is not a single number β€” it represents different things depending on the betting phase. The original build displayed a single pot number with no distinction between resolved and unresolved bets, creating visual confusion about the actual pot size.

🚨 Problem

  • No visual distinction between money already committed to the pot and active bets still in play
  • Players could not tell whether the pot number included the current bet they were facing
  • Pot amount display inconsistent between streets β€” sometimes including active bets, sometimes not

πŸ’Š Solution

  • Designed a dual-layer pot display system validated across all 5 streets:
  • Central pot chips (visual token stack) = resolved bets only β€” money from completed betting rounds that has been collected into the center
  • Pot label (text: "POT $x") = resolved pot + all active unresolved bets on the current street β€” the total amount the winner would take
  • Active bet chips = displayed in front of each betting player, physically separated from the central pot β€” showing exactly who has bet and how much
  • This three-element system was validated frame by frame: Pre-Flop ($0 resolved / $3 active blinds / label $3), Flop no-bet ($4 resolved / $0 active / label $4), Flop facing-bet ($4 resolved / $34Γ—n active / label $76), Turn no-bet ($110 resolved / $0 active / label $110), River facing-bet ($110 resolved / $47 active / label $157)
  • Each transition point (street change) triggers a merge animation: active bet chips move to center, pot label recalculates, new street begins at $0 active
β€£

2. Action availability matrix β€” state-driven button logic

πŸ“” Context

Which buttons appear on screen at any given moment is not a design choice β€” it is a game rule. Check is only legal when no bet exists. Call requires matching an existing bet. Raise must respect minimum sizing rules. The original build had these wrong. I designed an explicit state matrix that engineering could implement as a lookup table.

🚨 Problem

  • Check button available when a live bet existed β€” an illegal action
  • Raise amounts not respecting minimum raise rules
  • No formal logic connecting game state to button availability β€” developers were guessing

πŸ’Š Solution

  • Designed two primary action panel configurations, each as a complete Figma frame:
  • Facing No Bet (new street, or all players checked): FOLD | CHECK | BET $x β€” slider starts at minimum bet, label shows "BET"
  • Facing a Bet (opponent has bet or raised): FOLD | CALL $x | RAISE $x β€” slider starts at minimum legal raise (2Γ— current bet), label shows "RAISE"
  • Two edge-case configurations also specified: No Raise Available (FOLD | CALL β€” slider hidden, player can only match or fold), Partial Raise / ALL-IN (FOLD | CALL $x | ALL-IN $x β€” when stack is insufficient for minimum raise)
  • Each configuration annotated with the exact game condition that triggers it β€” dev team implements a state lookup, not a series of if/else assumptions
  • Validated across all extracted game states: Pre-Flop initial (facing blind = Facing Bet), Pre-Flop after raise (Facing Bet, higher amount), Flop after check (Facing No Bet), Flop after bet (Facing Bet), Turn no bet (Facing No Bet), River after bet (Facing Bet)
β€£

3. Street-by-street state validation β€” full hand lifecycle

πŸ“” Context

Each street introduces new board cards and resets the betting round. The visual state of the table must update coherently: new cards appear, active bets merge into the pot, action resets to the first active player. I designed and validated 12 distinct game state frames covering the complete hand lifecycle.

🚨 Problem

  • No formal documentation of what the UI should look like at each stage of a hand
  • Developers implementing visual transitions without understanding the underlying game state changes
  • Risk of inconsistent behaviour between streets (e.g., pot not resetting correctly after a betting round)

πŸ’Š Solution

  • Pre-Flop (6 frames): State 0 β€” Table Initialized (pure setup state: cards dealt, no blinds posted yet, no betting interaction, no player is "in turn", no chips on table, pot value hidden β€” a distinct UI state that developers must handle separately from active gameplay), State 1 β€” All Bets Placed / Pre-Pot Merge (all active players have matched the current bet, individual chips remain in front of each player, pot label reflects sum of all bets but chips are not yet merged β€” table is visually in a "resolved but not progressed" state, signalling the betting round is complete before the merge animation fires), initial state (blinds posted, hero cards dealt), facing a raise, after a call, action skipped due to fold
  • Flop (2 frames): After check (no active bet β€” 3 community cards revealed, all pre-flop bets merged into resolved pot, first opponent has checked, action passed to user), facing a bet (active chips in front of bettor, pot label includes unresolved amount β€” annotated: "The central pot shows the resolved bet only. Active bet chips remain in front of the betting player. The pot must not include the current opponent bet")
  • Turn (1 frame): Facing no bet β€” 4th card dealt, flop bets merged, pot contains all resolved bets, no active bet on this street, user is first to act
  • River (1 frame): Facing a bet (after check) β€” 5th card dealt, hero checked then Player 2 bet $47, Player 3 folded, active bet not merged into pot, hero is current acting player with Call $47 / Raise $94 / Fold available
  • Hand Result (4 frames): Win during Pre-Flop (everybody fold β€” hero wins without showdown), Loss with hole cards only (Player 2 won using only hole cards, no board cards required), Loss at showdown with 9 players (full two-column layout, row states: tap to expand/collapse, winner row expanded by default), Win at showdown with board cards summary
  • Each frame annotated with: board state, pot calculation breakdown, active player indicator, available actions, and the specific poker rule that governs the transition from the previous state
  • OLD vs. NEW comparison included for every street: Pre-Flop, Flop, Turn, River, and Hand Result β€” side-by-side frames showing the original dev build (OLD) next to the redesigned version (NEW), making the scope and impact of the rebuild immediately visible to stakeholders
πŸ”΄ VISUAL ASSET NEEDED β€” Screenshot: Scenarios page overview showing OLD vs NEW side-by-side for all streets (Pre-Flop, Flop, Turn, River, Hand Result) with dev annotations visible. Proves the scope of the rebuild and the quality of state documentation. Source: Image 7 (Scenarios section with annotations).
  • Board card progression validated: Pre-Flop (0 cards) β†’ Flop (3 cards) β†’ Turn (+1 = 4 cards) β†’ River (+1 = 5 cards) β€” each card slot maintains its spatial position across all frames, only visibility changes
πŸ“Š

Measurable Results

  • Complete game state architecture delivered: 14 validated frames covering State 0 (table init), State 1 (pre-pot merge), Pre-Flop, Flop, Turn, River, and Hand Result β€” zero undefined states at handoff
  • Two intermediate states (State 0 + State 1) formally specified β€” states that developers would typically hardcode incorrectly or skip entirely, now explicitly documented with rules, constraints, and purpose
  • OLD vs. NEW comparison delivered for every street β€” making the full scope of the rebuild immediately visible and reviewable by any stakeholder without requiring a walkthrough
  • Pot display logic formalized as a three-layer system (resolved chips / pot label / active bet chips) β€” validated across all 5 streets with precise dollar amounts at each transition
  • Action availability matrix designed as a state lookup table: 4 button configurations mapped to exact game conditions β€” eliminates developer interpretation errors
  • Every game state frame annotated with the governing poker rule β€” dev team can implement without poker domain knowledge, using the specs as a rule engine
  • Cross-validated against BetRivers Poker, PokerStars, and GG Poker production behaviour β€” zero deviation from industry-standard game logic

Key Results

πŸš€

This project was not a design assignment. It was a product rescue operation under structural, logical, and organizational constraints simultaneously. The ability to diagnose architectural failure, reframe scope without losing stakeholder trust, leverage domain expertise from a prior real-money poker context (BetRivers), and deliver a zero-overlap production-ready system β€” across mobile and desktop, for 3 to 9 players, inside an embedded web context with specific scroll constraints β€” is exactly the kind of senior-level intervention that prevents bad products from shipping.

πŸ“ˆ

Success metrics to control post-launch

  • Session depth on simulator: target 3+ hands per visit as engagement baseline
  • Return visit rate: simulator as a recurring engagement hook driving repeat traffic to affiliate pages
  • Affiliate CTA CTR from post-game result screen
  • Layout stability across device range: zero reported layout breakage post-launch
  • Dev implementation fidelity vs. Figma specs: component deviation rate

Win

  • Scope reframe: turned a cosmetic brief into a full architectural rebuild β€” and got PM alignment
    • Domain expertise leverage: BetRivers Poker experience directly applied to identify errors no generalist designer would have caught β€” reinforced by a structured competitive audit of 4 market leaders (GG Poker, PokerStars, 888 Poker, Unibet) across 26+ screens, compiled as persistent Figma reference pages
  • System thinking: 3-to-9 player scaling, worst-case validation, component library, game logic compliance β€” all delivered as one coherent system
  • Embedded context constraint: horizontal raise slider with CursorIncremental system β€” a novel solution to a scroll conflict problem that only exists in this specific deployment context; no existing poker product reference was available
    • Micro-UX depth: drum-roll MiniCardData animation, Betβ†’Raise dynamic label, Proto Card Asset reveal pattern β€” each interaction specified to implementation-ready precision, then demonstrated through 3 scoped interactive prototypes (GameSimulation 20+ frames, Cursor Bet, Card Appearance)
  • Design System scale: 208+ card symbols, 4 player states, 4 action button states, 5 slider states, full Hand Results modal β€” zero undocumented states at handoff
  • Design Ops maturity: Figma file structured into 7 navigable sections (Prototype, Responsive, Scenarios, Action Spec, Template Master, Components, Proto Components) with a dedicated Action Bet Button Spec page, Responsive Playground for dev testing, and OLD vs. NEW comparisons for every street β€” the file itself is a handoff system, not just a collection of screens
  • Stakeholder communication: every decision documented, framed in risk language, and defended with industry evidence
    • Game state architecture: complete hand lifecycle mapped as a state machine β€” 12 validated frames, pot logic formalized as a three-layer system, action availability designed as a state lookup table β€” zero undefined states at handoff, zero poker rule violations in the final design
  • Cross-platform parity: desktop version designed from scratch inside the real Odds Data integration context β€” Template Master stress-tested at 3/6/8/9 seats, full scenario strip mirroring mobile 1:1, Hand Results modal responsive breakpoint (single-column ≀7, two-column 8+) β€” all validated before handoff

Frustration

  • Working without a design brief, design review process, or peer designer β€” all quality control was self-managed
  • PM feedback loops slower due to domain knowledge gap β€” required significant education investment alongside delivery
  • No post-launch metrics available yet to validate engagement assumptions
    • Desktop version designed with limited technical constraint specs from the dev team β€” integration validated visually in the Odds Data page context, but some runtime implementation unknowns remain until development begins