This is a documentation for Board Game Arena: play board games online !

BGA Studio Guidelines: Difference between revisions

From Board Game Arena
Jump to navigation Jump to search
No edit summary
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<div style="color:red; font-weight:bold;">
= BGA Studio Guidelines (UX/UI) =
New guidelines(WIP) :
</div>


= '''<span style="color:red;">Deprecated, now check https://bga.li/mRdx please :)</span>''' =
This page covers UX guidelines for games on Board Game Arena. Read the [[Media:Guidelines UX new compressed.pdf|official PDF]] or [https://bga.li/mRdx bga.li/mRdx] first. This page is an unofficial summary.
{{Studio_Framework_Navigation}}


= <s>BGA Studio Guidelines (UX/UI)</s> =
Goal: most games should be instantly playable on any device — desktop at midnight or phone at lunch.


<s>Originally From: https://www.slideshare.net/boardgamearena/bga-studio-guidelines</s>
Use this page to validate UX before switching your game from '''ALPHA → BETA → RELEASE'''.


<s>New Guidelines (Draft):  https://bga.li/Vfd9 but we're still improving it as devs gives us a lot of feedbacks. Don't hesitate to do so to [email protected]</s>
== A — Layouts ==


== <s>Summary</s> ==
=== A.1 Layout arrangement ===
<s>These guidelines are here to help you to make sure that the players, the game publisher and the game author are going to enjoy your adaptation of the game. We created these guidelines based on our personal experience (which includes many mistakes along the way) implementing a lot of games on BGA platform. Don't hesitate to contact us if you feel uncomfortable with one of these guidelines in some particular context with your game: these guidelines are here to help and not to prevent you to do smart things, and have fun while programing your game ;)</s>


<s><br /></s>
Game should fit a square ratio and show everything the active player needs. Use vertical scroll for secondary info (other players' progress, secondary boards).
== <s>Why guidelines?</s> ==
<s>More and more game publishers are choosing Board Game Arena for their game adaptations because the quality of these adaptations is high.
If we want to continue to have nice games in the future, we have to make sure that every game published in the BGA platform is matching the quality standards of BGA.
These guidelines are here to help you to make your game easy to use by BGA players, and to make sure its going to be validated by the game publisher.</s>


<s>Can this guidelines be violated/not followed? Yes, but the more you diverge the more chances this game won't be approved by publisher of BGA. Both BGA team and publisher would have a veto on the posting game to production, so you should think twice about this.</s>
'''✔️ Do'''
* Center the play area on all devices.
* Leave a "no action" margin around the board (deselect, scroll on mobile).
* Use HTML anchors to jump between distant sections.
* Use spacers / transparent whiteblocks to group pieces clearly.
* Keep score, turn order, and objectives '''accessible''' (button/tab/panel), not always visible.
* Tuck rare abilities into tooltips.


== <s>General guidelines</s> ==
'''❌ Don't'''
<s>The 3 main important guidelines</s>
* Do not hide game components behind popups — you should see everything you'd see on a real table.
* <s>If a player knows the real board game, they should be able to play your adaptation with no learning.</s>
* Do not place "always accessible" info permanently on the player panels.
* <s>Fidelity to the original game is an absolute requirement.</s>
* Do not add in-game logos or branding that isn't part of the actual game.
* <s>Don't try to create a video game: make your game interface as close as possible to how the original board game looks like.</s>
* Do not scatter related info (e.g. resources) across three corners.


== <s>Game layout</s>  ==
Note: '''Layout mantra:''' Central = shared actions. Top/Bottom = global info. Panels = private resources.  
<s>[[File:Bgalayout.png|frameless|900x900px]]</s>


=== <s>Game layout elements</s> ===
[[File:Ux-01-layouts.jpg]]


<s>The game develop must obey the basic rules on bga game layout</s>
* <s>BGA header, BGA footer and chat area are reserved for framework use - game developer shall never place any design elements there nor hide or relocate them.</s>
* <s>Studio tools area only appears in studio. Game shall never place any extra dev tools visible to player in production (anywhere), but this area can and used for extra tools when game runs on studio servers. For the sake of game testers its best to avoid placing studio only tools anywhere else (i.e. when bga review game in studio before granting alpha status)</s>
* <s>Game must use game area to place main game elements there</s>
* <s>Game may modify status bar, player panels and gamelog area with some restrictions (but they never can be hidden or relocated by the game)</s>


=== <s>L-1 Layout arrangement</s> ===
=== A.2 Action Bar ===


* <s>Game should work on any aspect ratio, showing all information the active player needs for their current turn (New: 2026.01)</s>
The Action Bar always shows the current state: turn in progress, who we're waiting for, or what the player can do.
* <s>Center the game for all devices, ensuring it fits on large screens (New: 2026.01)</s>
* <s>Leave a "no action" margin zone around the game area (allows users to deselect, scroll on phones) (New: 2026.01)</s>
* <s>No in-game branding: do not include logos or branding components not explicitly part of the game (New: 2026.01)</s>
* <s>Layout mantra: Central = shared actions, Top/Bottom = global info, Panels = private resources (New: 2026.01)</s>
* <s>Stack elements vertically for mobile, avoid endless horizontal scroll (New: 2026.01)</s>
* <s>Always accessible without popups: Score, whose turn, objectives (New: 2026.01)</s>


=== <s>L-2 Don't hide game elements</s> ===
[[File:Ux-03-action-bar-mock.jpg]]


<s>Many board games have a lot of material to display, and computer screens are sometimes too small.
'''✔️ Do'''
But you are lucky: your game will be on a webpage with a scrolling functionality.
* Center '''main awaited actions''' (Play card, End turn, Confirm move).
Basically, you always have some more space available.
* Place secondary/greyed-out actions next to them.
Don't hide game elements behind menus, submenus, dialogs, etc, but display them directly on the main page.</s>
* Put '''cancel / undo / remove''' on the right, visually separated from forward actions.
* Use the Action Bar for: actions targeting another player, Pass/End turn/time-related actions, auction phases, and small resource exchanges without dedicated board space.
* Keep it to '''max 4 buttons + context''' so it doesn't overflow on mobile.


<s>Tips: you can use HTML anchor link to jump between the different elements of the page if the page height is very big.</s>
'''❌ Don't'''
* Do not replace board-component actions with Action Bar buttons — players should act on the board like in real life.
* Do not stick custom buttons next to BGA's built-in buttons (replay controls, etc.).
* Do not let cancel actions visually compete with main actions.
* Do not show "Round in progress" text inside the bar — display it on the table or as flavor text of the current action.


<s>Examples:</s>
''Example: Wingspan shows the current round as flavor text under the action bar.''


<s>In Amyitis, characters cards are elements you don't have to check all the time. Thus, we placed them at the bottom of the page  and you have to scroll to see them.</s>
[[File:Ux-02-action-bar-examples.jpg]]


<s>In Madeira, additional game board are shown at the bottom, but when player needs to use it it moved up.</s>
→ See [[#C.3 Button colors and styling|C.3]] for button colors.


<s>Rule:</s>
=== A.3 Player panels ===
* <s>If real game has visible elements on the table it should be visible on the main screen or player panels on the right</s>


<s>Exceptions:</s>
Player panels let anyone glance at: who's playing, color, score, turn order, and resources gained.
* <s>Showing counts of same elements is sufficient for elements like resources, trackers, vp, etc.</s>
* <s>For decks which can be inspected it permitted to show them on demand</s>
* <s>If some games you can cut off score track and replace with BGA scoring (stars), but keeping it will look nicer (but you have to keep track of score on it as well)</s>
* <s>Its not necessary to show helper cards such as turn overview or scoring overview. It is nice if you can incorporate that as well, but in most cases, '''such elements should not be displayed by default''' (as space should be given in priority to the game itself), and should be made available by '''a gray "Player aid" button (or help icon)''' displaying a popup when clicked, like for example in Marco Polo or Terra Mystica.</s>
* <s>This rule does not apply to additional player controls such as settings and prefrences.</s>


=== <s>L-3 Make it fluid</s> ===
'''✔️ Do'''
* Keep panels compact — a 4-player game on mobile must not occupy more than '''¼ of the screen'''.
* Offer HTML anchor shortcuts to jump to a player's main components.


<s>BGA game interface is "fluid". It means the interface width can vary in order to use extra space on the screen when available.
'''❌ Don't'''
HTML and CSS give us a lot of possibilities to adapt a web content to a given browser width.
* Do not put settings, titles, round numbers, or other redundant info in panels.
You have to use HTML and CSS:</s>
* Do not put always-accessible info (score, objectives) ''only'' on player panels.
* <s>To allow players owning a big screen to enjoy the game comfortably without scrolling the page.</s>
* <s>To allow players with a screen of just 1024px</s>


<s>Tips: for each element of the game, answer this question "how many times during a game do I need to check/use this element?". Less frequently used elements can be placed below.
[[File:Ux-04-player-panel.jpg]]
You can listen on display resize in JS to do more sophisticated layouts.</s>


<s>Examples:</s>
=== A.4 Popups ===


<s>Caylus: when we have a 1024px small width to play the game – even if they have to screen, available buildings are placed scroll on the the right and below the board.
'''✔️ Do'''
On larger screen, these tiles are placed  on the right of the board.  This is a very basic usage of "float:left" CSS property.</s>
* Reserve automatic popups for '''tutorials only'''.
* Make any required popup skippable on click/touch/timer.
* Use the game wiki for rules, hints, scoring tips, helpers.
[[File:Ux-06-wiki.jpg]]


=== <s>L-4 Use whiteblocks</s> ===
'''❌ Don't'''
<s>White blocks are '''div''' HTML element with the '''whiteblock''' class (white and transparent background). This is the recommended way to gather game elements together in your game interface when they are not directly on a board. Whiteblocks helps you to organize the space in order it can be easily understood by players.</s>
* Do not block game flow with popups (forbidden).
* Do not use popups mid-game — only allowed for between-round/stage scoring.


<s>If game contains individual player boards with distinct colors or marking you don't need these boards inside the whiteblock.</s>
Example: area around popup clickable - should be used to close it


''<s>Tips: you can use a '''h3''' title inside the whiteblock to help players to understand what is inside or to who it belongs.</s>''
[[File:Ux-05-popup.jpg]]


<s>In The Year of the Dragon game interface, with whiteblocks and h3 titles /picture/</s>


=== <s>L-5 Use player panels</s> ===
→ See [[#B.1 Tooltips|B.1]] for non-blocking alternatives.


<s>BGA players are used to look at player panels when they need an information about a player.
=== A.5 Clarity & Zoom ===
Using player panels can allow you to save a lot of space on the main game space. In general, the following information is placed in the player panel:</s>
* <s>Players resources (i.e.  small game elements the player is keeping in front of him in the real game).</s>
* <s>Summary information about player (i.e. number of cards in hand, number of cards played...).</s>
* <s>"First player" token.</s>
* <s>Score.</s>


<s>Player panels in Seasons. /picture/ A lot of useful information can fit into these small spaces :)</s>
Use vertical space and good layout instead of zoom controls.


<s>Rule:</s>
'''✔️ Do'''
* <s>You must always use the standard BGA score counter (with the star) to show score. Players are used to check this counter to see who is winning the game.</s>
* Design so the core game is fully playable at '''100% scale'''.
* Trust browser zoom: Ctrl+wheel on desktop, pinch on mobile.


<s>Exception:</s>
'''❌ Don't'''
* <s>In some cases score is not revealed during the game by design, in this case its permitted to show ? or - (minus) in the place of score.</s>
* Do not add zoom buttons unless absolutely necessary (large secondary boards, very text-heavy cards like Ticket to Ride).
* <s>In some cases its permitted to replace star icon with icon representing VP in this game</s>


<s>Player panel limits (New: 2026.01):</s>
'''If you must add zoom buttons:'''
* <s>For a 4-player game on mobile, player panels should not occupy more than 1/4 of the screen</s>
* '''+''' (plus): zoom in
* <s>Panels should NOT contain extra settings, redundant info, or side information</s>
* '''–''' (minus): zoom out
* <s>Panels may offer HTML anchor shortcuts to other components on the main screen</s>
* 🏠 Home: reset to default


=== <s>L-6 Use status bar actions</s> ===
== B — Usability ==


<s>Its a good practice is to use a status bar action buttons. For example if one of the player actions to pick up the cards, there is no really a place to click in game are, so just add button "Pick up cards".
=== B.1 Tooltips ===
Don't try to place some artificial action icon in your game area that will be useless 95% of the time: it takes space and makes the interface more complex to understand.</s>


<s>Status bar actions in Tobago /picture/</s>
Tooltips add insight, not duplication.


<s>Rule:</s>
'''✔️ Do'''
* <s>If there is no game element you can "click" on to perform an action, place action button on the status bar</s>
* Add extra detail beyond what's on screen (translatable text, hints about when to use).
* Use them to zoom into small text/icons on large game boards.
* Close tooltips when the user taps away on mobile.


<s>Exception:</s>
'''❌ Don't'''
* <s>On the other hand some games have "At anytime actions", such as "At any time you can trade 2 seals for one resource of any kind". If you place it on the status bar - it will be always there which will clutter it. It is best to either find a game element you can attach it to or place it on "current" player panel (its a reserved area at the bottom of main player panel).</s>
* Do not show the same info twice the same way.
* <s>You can add button to the status bar even there is active element on the board - that simplifies the user actions</s>
* Do not add a tooltip that's just a zoomed-in copy of an already-visible card — that's a sign your components are mis-sized.
* <s>Avoid too many buttons on the status bar. If you have 10 buttons it is probably pushing it...</s>


<s>Rule:</s>
''Example: Ticket to Ride hover tooltips name cards/decks without distraction.''
* <s>Do not use exotic colors for buttons. Use default colors such as blue, while and red (defined by API)</s>


<s>Action bar limits (New: 2026.01):</s>
[[File:Ux-07-tooltip-1.jpg]]
* <s>Limit action bar to maximum 4 buttons + context to prevent overflow on mobile</s>
* <s>Action bar should NOT replace board component actions - prioritize clicking on game elements</s>
* <s>Main awaited actions should be centered in the action bar</s>
* <s>Cancel/undo/remove actions belong on the right side of the action bar</s>
* <s>Impossible or unauthorized actions (greyed out) can be shown as secondary elements</s>
* <s>"Round in progress" information should be displayed on the table itself, not in action bar</s>


=== <s>L-7 Popups (New: 2026.01)</s> ===
''Example: Altered shows minimal default info, with full detail on hover.''


* <s>Automatic popups are forbidden (reserve for tutorials only)</s>
[[File:Ux-08-tooltip-2.jpg]]
* <s>Any popup blocking the game flow is forbidden</s>
* <s>If popups must be used, they must be skippable (click, touch, or timed)</s>
* <s>Turn confirmation and such should be handled as states</s>
* <s>Extra data be just added at the bottom of the page and you can provide extra navigation. Or if this is data on demand like display the discard content can show on top the board but button to hide</s>


=== <s>L-8 Zoom controls (New: 2026.01)</s> ===
=== B.2 Forbidden actions ===


* <s>Avoid custom zoom buttons - browsers already provide zoom (Ctrl+mousewheel, pinch-to-zoom)</s>
'''✔️ Do'''
* <s>Zoom buttons often indicate a deeper layout problem - design so zoom isn't needed</s>
* Grey out / disable actions that exist but aren't currently available.
* <s>If zoom is necessary (large boards, text-heavy cards): use +/- buttons and a home/reset button</s>
* <s>The default view must be perfectly playable without zoom</s>
* <s>Think of zoom as last resort, not a requirement</s>


== <s>Game usability</s>  ==
'''❌ Don't'''
* Do not show disabled buttons for actions that are never relevant in the current context — just hide them.


=== <s>U-1 Use tooltips</s> ===
=== B.3 Undo, Reset, Restart ===


<s>With BGA Studio its very easy to associate a tooltip on any element of the game. Each time this is possible: add a tooltip to explain to the players:</s>
BGA philosophy: fast, fluid, intuitive. Use these controls sparingly.
* <s>What is this game element?</s>
* <s>What happens if I click on it?</s>
<s>However, tooltips should NOT be used to display dynamic information about the current game to save space on the game interface.
Typically, regular players should be able to play with no tooltips.
However you can display some dynamic stuff if it's available otherwise but just annoying to calculate. For example in Lewis and Clark author asked to put
tooltips of how many river space available ahead of explorer.
If you need to show user why they cannot interact with element show errors instead (when clicking on it).</s>


<s>Tips: you can place any HTML element in tooltips. So you can make them as rich and beautiful as you need :)</s>
'''✔️ Do'''
* Use '''Confirm''' buttons for impactful, irreversible actions (end turn, discard, commit resources).
* Prefer timed confirmation (5–8s) over undo.
* Offer one '''Restart Turn''' for the whole turn when rules allow, not per-micro-action undo.
* Allow "Undo last move" only when a turn has '''more than 2 actions'''.


* <s>Rule: Do not use exact same image of card or token in tooltip, you can make it bigger for readability or remove the image and just leave the text</s>
'''❌ Don't'''
* <s>Rule: Do not use same iconography as in original object - use TEXT describing what icon means (they already see the icon on the board, no need to show the icon again)</s>
* Do not add an Undo button for every action — multiplies validation steps, slows the game.
* Do not layer Undo on top of Reset on top of Confirm — over-validation.
* Do not use Undo to paper over misclicks — fix the layout instead (bigger targets, clearer highlights).


=== <s>U-2 Use left click only</s> ===
== C — Design ==
<s>Rule:</s>
* <s>The whole game should be playable with only simple left button mouse click.</s>
* <s>Exception: Word based games can use keyboard/text input</s>


<s>Rule:</s>
=== C.1 Typography & translations ===
* <s>Context menus should not be used (no exceptons)</s>


<s>Rule:</s>
Clarity beats style.
* <s>Drag-n-drop should be avoided</s>
* <s>Exceptions:</s>
** <s>Permitted if same can be achieved without it (make a click based alternative)</s>
** <s>Permitted for non-essential functionality (like re-arranging cards in hand)</s>


<s>Rule:</s>
'''✔️ Do'''
* <s>Mouse icon must change on clickable elements (''cursor:pointer'' CSS property).</s>
* Use the default BGA font.
* Use clean sans-serif if you must change.
* Maintain good line spacing.
* Make all text translatable via BGA's translation system.
* Support LTR ''and'' RTL languages — test alignment & mirroring.
* Ensure your font supports accents/diacritics (é, ñ, ü).
* Meet '''WCAG AA''' contrast.
* Test on a phone — what's readable on a 27" monitor may not be on mobile.


=== <s>U-3 Make your interface intuitive</s> ===
'''❌ Don't'''
<s>If your testers have different opinions about how to trigger some game action, maybe
* Do not use decorative or themed fonts (hard to read, licensing risk, missing glyphs).
the best is to make several options possible for this game action. In the case there is a complex action to do by the player (i.e. select some cards, then click on an action button), design your error messages in order they can guide the player (i.e. "select some cards first").</s>
* Do not mix multiple fonts for "theme."
* Do not embed text directly into images without alt-text.


<s>Tips: For complex games, it is simple and useful to  highlight the area of the interface where player should focus his attention (using onEnteringState/onLeavingState and CSS class, i.e. 'active_slot').</s>
=== C.2 Highlights & Glowing auras ===


<s>The Boss: when a player clicks on a card with no selected cubes, the interface tells us to select some cube first.</s>
Players should never wonder "what do I click?"


=== <s>U-4 Use the gamelog</s> ===
'''✔️ Do'''
* Highlight valid options so the awaited action is obvious.
* Show consequences visually before the player commits.


<s>Use the game log to output information about the move.
''Example of highlighting valid options on the table.''
Players are not always in front of the game page when their opponents are making their moves.
In addition, the computer manipulates game elements faster than you usually do with the real board game and even regular players can get behind of what happened sometimes.
You should be able to understand the "game story" by reading the game log.</s>


<s>Rule:</s>
[[File:Ux-09-active-element.jpg]]
* <s>Every important move should be reflected in gamelog</s>


<s>Gamelog best practices (New: 2026.01):</s>
=== C.3 Button colors and styling ===
* <s>Show every major action (card plays, moves, resource changes, eliminations)</s>
* <s>Use icons, colors, or formatting so actions can be scanned quickly</s>
* <s>Any graphic components in logs must have alternative text</s>
* <s>Reduce visual noise: group small simultaneous actions into one-liners</s>
* <s>Always specify who acted and what changed (e.g., "Raphaël drew 2 cards" not just "2 cards drawn")</s>
* <s>Automated actions should be clearly displayed in logs too</s>
* <s>For async games, logs are essential - they let returning players catch up instantly</s>


=== <s>U-5 Tell players about automatic actions</s> ===
Button colors are a shared language across BGA. Mandatory for consistency.
<s>Very often, during a game you are in a situation where:</s>
* <s>Only one action is possible for the activeplayer, or</s>
* <s>A series of action has to be done (according to the rules) without any players actions.</s>
<s>In these situation, you must or you may trigger these actions automatically.
In any case, you must make sure that players understand what is happening, otherwise they will probably report a bug.</s>


<s>Stone Age: people are fed  automatically at the end of the turn, but players can always see what happened exactly in the gamelog.</s>
{| class="wikitable"
! Color !! Meaning !! <code>statusBar.addActionButton</code>
|-
| 🔵 '''Blue''' || Advance, confirm, move forward || <code>primary</code>
|-
| 🔴 '''Red''' || Cancel, undo, stop, exit || <code>alert</code>
|-
| ⚪ '''White / Transparent''' || Optional/side actions || <code>secondary</code>
|-
| ⚫ '''Grey''' || Disabled, completed, unavailable || (disabled state of any of the above)
|}


* <s>Use the game log to trace all actions performed automatically.</s>
'''✔️ Do'''
* <s>Use synchronous notifications handlers to slow down the execution of automatic actions, so that players can understand what is happening.</s>
* Display usernames in their assigned player color.
* <s>Use preferences to opt-in or opt-out of auto-actions (some may be very important such as Pass)</s>
* Outline player-color text so it stays visible (e.g. yellow on white).
* Test player colors on both light and dark backgrounds.
* Take any extra colors from '''game components''' (cards, tiles, tokens), not UI buttons.


=== <s>U-6 Confirmations, cancel and undo</s> ===
'''❌ Don't'''
* Do not reassign blue/red/grey for game-specific meaning.
* Do not tint UI buttons to match the game's theme.


==== <s>Avoid move confirmations</s> ====
Note: Think of button colors as '''traffic lights''': blue = go, red = stop, grey = unavailable.
<s>As a rule of thumb, don't require move confirmation. Confirming a move slows down the user interface and thus, the game flow. You can allow a player to confirm a move if this is a very critical step in a game, and if it is possible to trigger an action by accident. If client interactions are very complex and allow cancellation, the final move can be confirmed with a "Done" button.</s>


<s>''Hawaii'': Ending a turn is a critical action that happens only 5 times per player in a game. In this case, it is acceptable (and a good idea) to have a confirmation dialog.</s>
=== C.4 Sizing & responsiveness ===


<s>''Hive'': Each move has to be confirmed with click on the location because it is very easy to click by accident.</s>
'''✔️ Do'''
* Keep the main play area centered on every device.
* Use fluid layouts that expand/contract to fit available space.
* Leave margins around the board (prevents mobile misclicks).
* On desktop/tablet: show the entire board when possible.
* On mobile (vertical): stack secondary elements ''below'' the main action zone.
* Make everything readable and usable at 100% scale.
* Add HTML anchors / jump-links for vertical layouts.


<s>''Russian Railroads'': Each move involves multiple interactions and can contains dozens of subactions. When the player is done "planning" they presses a "Done" button to submit the move to the server.</s>
'''❌ Don't'''
* Do not use fixed-width designs.
* Do not rely on zoom for legibility.
* Do not let layout break when players zoom in/out.
* Do not make any interactive element smaller than '''32×32px''' (see [[#E.3 Tap targets|E.3]]).


<s>''Race for the Galaxy'': There is a card that allows players to draw two cards and discard one card before the Development phase. This requires confirmation when the player selects a development card to discard, as they often means to build that development card instead.</s>
''Reference implementation:'' [https://thoun.github.io/bga-jump-to/demo/index.html bga-jump-to demo]


==== <s>Cancel a move</s> ====
=== C.5 Background & extras ===
<s>Most players want to have moves cancelled or undone. Use the following rules to implement it:</s>
* <s>If any information is revealed which was not known before the action is completed - You CANNOT cancel it.</s>
* <s>If this is the end of active player action, and it is another player's turn - You CANNOT cancel it</s>
** <s>Exception: You can undo action of one player if this is multiactive state and not all players are done</s>
* <s>If during a player's turn multiple actions are required but don't violate the above two rules - You CAN cancel/undo it. i.e. A user picks cubes and drops on a building. Selecting the cubes and building -  are two actions, so user should be able to cancel taking cube.</s>
<s>This can be implemented using client side states, so cancelling is easy by restoring last server state.</s>


==== <s>Undo philosophy (New: 2026.01)</s> ====
The background is the table surface your game sits on.
* <s>Avoid unnecessary undo buttons - they often signal a confusing or error-prone interface</s>
* <s>Undo multiplies validation steps (select, confirm, undo, confirm again) slowing the game</s>
* <s>Prefer timed confirmation buttons (5-8 seconds) over allowing undos at every step</s>
* <s>Prefer a single "Restart Turn" option over multiple undo buttons for each micro-action</s>
* <s>Only propose "Undo" when a player's turn consists of more than 2 actions</s>
* <s>If players regularly misclick, improve the layout or interaction design instead of adding undo</s>
* <s>Undo should be a last-resort safety net, not a primary mechanic</s>


=== <s>U-7 Translatable interface</s> ===
'''✔️ Do'''
<s>With BGA its very easy to translate your game in any language, using BGA collaborative translation system. Check [[Translations]] to learn how to declare your strings so that every message in your code can be managed by the internationalization system.</s>
* Use thematic, modern backgrounds (subtle playmat look).
* Add slight texture or pattern.
* Apply a touch of blur so components remain the visual focus.
* Prioritize contrast against the game's components.


<s>Rule:</s>
'''❌ Don't'''
* <s>All language specific strings must be translatable.</s>
* Do not use pure flat colors.
* Do not use sharp, busy, detailed backgrounds that compete with the game.
* Do not let the background reduce component visibility.


=== <s>U-8 Use interactive elements</s> ===
== D — Feedback ==


<s>Interactive elements are tiles, cubes or board areas user can click on to perform an action. The following guidance apply:</s>
=== D.1 Errors & invalid actions ===
* <s>If user click on interactive element either action happens or user get a error message. Try to process error message of client side and not send to server for simple errors, such as player is not active. Please be very specific why user cannot interact with element, i.e.</s>
** <s>This is not your turn</s>
** <s>You cannot build this building because you don't have enough resources</s>
** <s>To select this card you have to select resource first</s>
<s>If you cannot make errors for all elements at least tooltip should explaining when it interactive vs not</s>


<s>Rule: Every game element should give an explicit error message if clicked at the wrong moment rather than staying silent</s>
Silence is never acceptable. Every failed action must say why.


<s>Rule: When user can click on element during their turn it should be highlighted if possible (or non-active element de-highlighted in some way)</s>
'''✔️ Do'''
* Use a short shake, grey-out, or tooltip on failure.
* Show concise plain-text errors: ''"You don't have enough resources."''
* Pair color with icons or text (don't rely on red alone).


<s>Forbidden actions display (New: 2026.01):</s>
'''❌ Don't'''
* <s>Actions that cannot currently be performed should be shown as greyed out/disabled</s>
* Do not leave the player guessing.
* <s>This lets players see the action exists but understand it's not available now</s>
* Do not use color alone — colorblind users won't see it.
* <s>However: if an action is never relevant in the current context, do not show a disabled button</s>
* <s>Balance: let players know which actions are part of the game without UI clutter</s>


<s>Error feedback best practices (New: 2026.01):</s>
=== D.2 Game Logs ===
* <s>Use visual feedback for failed actions: short shake animation, grey-out effect, or tooltip</s>
* <s>Provide concise plain-text explanations like "You don't have enough resources"</s>
* <s>Use accessible indicators - do not rely on color alone (pair with icons or text)</s>
* <s>Every failed action must give a reason immediately</s>


<s>Hightlighting guidelines:</s>
Logs are the narration of the match. Critical for asynchronous games.
* <s>Apply a class to all active/selectable element, i.e. class can be "selectable", "active_slot", "interactive"</s>
* <s>An CSS element with this class can have special rules, i.e</s>
** <s>outline (use outline, do not use "border" as this changes sizing)</s>
** <s>OR shadow/glow - use box-shadow or filter: drop-shadow for non-standard tokens</s>
** <s>recommended color - white, yellow or blue. Do not use red - this is indication of error rather than prompt for action</s>
** <s>change mouse cursor to action cursor, i.e. cursor: pointer</s>


<s>De-highlighting guidelines:</s>
'''✔️ Do'''
* <s>Only use this strategy when there are less inactive element than active</s>
* Log every major action: card plays, moves, resource changes, eliminations.
* <s>Apply a class to all non-interactive element, such as "non-interactive"</s>
* Always say '''who''' acted and '''what''' changed.
* <s>In css set special rules</s>
* Use icons, colors, formatting for fast scanning.
** <s>opacity:0.7</s>
* Provide alt-text for graphic components inside logs.
** <s>OR filter:contrast(0.6) or grayscale</s>
* Group small simultaneous actions into a one-liner.
* <s>change cursor, i.e. cursor: not-allowed</s>
* Log automated/forced actions too.


<s>Rule: If state prompt replaces the interaction with a game element but elements are also visible in the game area its better to let player use either button or element (i.e. player can press a button OR they can click on element on the board)</s>
'''❌ Don't'''
** <s>Example: In Lewis & Clark game offers gain resources via buttons on state prompt, but user can also click on cubes in supply to do the same action</s>
* Do not write walls of text or use oversized images that break log flow.
* Do not hide ''who'' did the action.


== <s>Feedback</s> ==
''Good:''
* "Marianna placed [red tile] on [central board] (+2 points)."
* "Alex drew 2 [train cards]."


=== <s>F-1 Animate moving elements</s> ===
''Bad:''
<s>If real game have some elements moving during the game it should also animate in your adaptation</s>
* "+2 points"
* <s>User gets a resource - move a resource from main board to user mini board</s>
* "Card drawn"
* <s>User buys a card - move card from main display to user board</s>
* <s>User draw a card which is revealed on the display - move card from deck to display, maybe add flippy animation to turn it face up (that requires 3d transformations - that is bonus)</s>


<s>It is also nice to animation points or coin collection from specific region of the board (even points collection is not normally visible).</s>
=== D.3 Animation ===


<s>Don't need to overdo animation - its not first player shooter</s>
Animations explain '''what moved, where it went, why it matters'''.


<s>Animation timing (New: 2026.01):</s>
'''✔️ Do'''
* <s>Regular animation duration: 0.5 seconds - fast enough to be seen but not blocking flow</s>
* Use animations for: cards entering a hand, tokens moving, score count-up.
* <s>Maximum animation duration: 0.8 seconds - keeps the pace quick, prevents frustration in long games</s>
* Keep regular animations at '''0.5s''', max '''0.8s'''.
* <s>Don't animate trivial or repetitive updates - batch multiple small gains into one clear effect</s>
* Batch repetitive updates (don't show 50 tiny +1 animations).
* <s>Avoid excessive bouncing, glowing, or looping animations that distract from game state</s>
* <s>Use animation as visual explanation: show what moved, where it went, why it matters</s>


=== <s>F-2 Sound effects (New: 2026.01)</s> ===
'''❌ Don't'''
* Do not animate trivial updates one by one.
* Do not use looping, bouncing, or glowing animations as decoration.


* <s>Use volume lower than BGA default - never surprise players with loud audio</s>
→ See [https://en.doc.boardgamearena.com/BgaAnimations BGA animation library].
* <s>Keep sounds short, sharp, and purposeful - no long looping soundtracks during gameplay</s>
* <s>Sound effects must always be paired with a visual cue (animation, highlight, etc.)</s>
* <s>No action should rely solely on audio to be understood</s>
* <s>Sound is a bonus layer of clarity, not a requirement - game must be fully understandable in silence</s>


=== <s>F-3 Slow down the end of game scoring</s> ===
=== D.4 Sound effects ===


<s>This is the climax of the game, building up suspense before revealing the winner... Don't make it too quick! :)</s>
Sound is a bonus, not a requirement.


<s>It's also very helpful if some end of game scoring animations can show where the points are gained, to help players understand (and trust) the scoring.</s>
'''✔️ Do'''
* Keep volume '''below''' the BGA default.
* Keep sounds short, sharp, purposeful.
* Always pair sound with a visual cue.


<s>To achieve this, you can use synchronous notifications for each step of the scoring to slow down the process, and use this.displayScoring ([[Game_interface_logic:_yourgamename.js#Scoring_animated_display]]) to display a nice points animation in the color of the player over the element of the game granting points for this step of the scoring.</s>
'''❌ Don't'''
* Do not add long looping soundtracks.
* Do not let any action be communicated by '''sound only'''.
* Do not surprise players with loud audio.


<s>For a practical example of a game adaptation where scoring has been done with this idea in mind, you can check a game replay of Terra Mystica for the final scoring (this link will fast forward you right there: [https://boardgamearena.com/archive/replay/200901-1002/?table=112192856&player=84819187&comments=426;&goto=341 replay scoring])</s>
== E — Accessibility ==


<s>End game scoring (New: 2026.01):</s>
=== E.1 Design for all ===
* <s>Scale end scoring animation to game length (elaborate for long games, quick for short luck-based games)</s>


== <s>Design</s> ==
'''✔️ Do'''
* Pair colors with icons, textures, or shapes.
* Meet contrast ratio '''4.5:1''' minimum.
* Label every button, icon, and interactive element (screen readers).
* Use bold shapes, clear outlines, strong contrast to differentiate pieces.


=== <s>D-1 Typography and fonts (New: 2026.01)</s> ===
'''❌ Don't'''
* Do not rely on color alone.
* Do not use flashing or rapidly alternating visuals.
* Do not depend on fine details or subtle shading to differentiate components.


* <s>Avoid fancy/decorative fonts - use the default BGA font</s>
=== E.2 Colorblind-safe design ===
* <s>Use clean sans-serif fonts with good line spacing</s>
* <s>Ensure minimum font sizes are readable on small phone screens</s>
* <s>Support screen readers: most interactive elements should have proper text equivalents</s>
* <s>Do not put critical information inside images without alt-text</s>
* <s>All text must be translatable using BGA's translation system - never embed words into graphics</s>
* <s>Support both LTR (left-to-right) and RTL (right-to-left) languages</s>
* <s>Ensure fonts support accents and diacritics (é, ñ, ü, etc.)</s>
* <s>Font colors must meet WCAG AA minimum contrast ratio</s>


=== <s>D-2 Button color standards (New: 2026.01)</s> ===
'''✔️ Do'''
* Add unique shapes/symbols/outlines per pawn or token color.
* Place small icons in card corners (or patterns) so suits are recognizable without hue.
* Meet '''WCAG AA''' for text and icons.
* Outline player-color names so yellow doesn't vanish on white.


<s>Rule: Use standard BGA button colors consistently:</s>
'''❌ Don't'''
* <s>Blue (primary) = Advance the action, confirm, move forward</s>
* Do not assume players perceive color differences.
* <s>Red (alert) = Cancel, undo, stop, or exit</s>
* <s>White/Transparent (secondary) = Optional or side actions not critical to progress</s>
* <s>Grey = Disabled, already completed, or unavailable actions</s>


<s>This color scheme is mandatory for UX consistency across all BGA games.</s>
=== E.3 Tap targets ===


=== <s>D-3 Sizing and responsiveness (New: 2026.01)</s> ===
'''✔️ Do'''
* Minimum '''32×32px''' for any interactive element.
* Aim for '''40–44px''' (greatly reduces mis-taps).
* Leave spacing between buttons, tokens, cards.
* Group many options into expandable menus or secondary panels.
* When space runs out, add scrolling — don't shrink components.


* <s>Main play area must remain centered on all devices</s>
'''❌ Don't'''
* <s>Avoid fixed-width designs - layouts should expand or contract gracefully</s>
* Do not cram small icons into tight clusters.
* <s>Leave margins around the board for comfort and to avoid misclicks on mobile</s>
* Do not shrink components below the minimum to fit.
* <s>Desktop/tablet: prioritize showing the entire board at once</s>
* <s>Mobile (vertical): stack secondary elements below the main action zone</s>
* <s>Prevent layout breakage when players zoom in/out</s>
* <s>No interactive element (button, token, card, tile) should be smaller than 32x32px</s>
* <s>Ideal tap target size: 40-44px for touchscreens</s>


=== <s>D-4 Background design (New: 2026.01)</s> ===
=== E.4 Settings & customization ===


* <s>Use thematic/modern backgrounds (e.g., a subtle playing mat look) instead of the old wooden floor texture</s>
'''✔️ Do'''
* <s>Background must never reduce the visibility of game components - prioritize contrast</s>
* Put all game settings in BGA's '''standard settings menu'''.
* <s>Avoid pure flat colors - use slight textures or patterns</s>
* Reuse existing BGA controls.
* <s>Apply a touch of blur to backgrounds so components remain the visual focus</s>
* Offer per-game options only where relevant: animation speed, tooltip detail, sound on/off.
* <s>Think of the background as the table surface your game lives on - natural, thematic, but not distracting</s>


== <s>Original game representation</s> ==
'''❌ Don't'''
* Do not build custom settings UI (the platform is phasing those out).
* Do not duplicate controls already available globally.


=== <s>R-1 Use the original art</s>===
== F — Technical ==
<s>The less you are modifying the original art of the game, the better.
Its important for publishers that a board game adaptation looks like the real board game. Sometimes it can be useful to modify some elements of the game to save some space on the screen – but try to avoid it.
Tips: if you have not enough space on the screen, reduce the size of the game elements.
Try to make sure they are recognizable for players who played regularly, and add a tooltip to help beginners to figure out what they are.
Gosu : the original cards are used,  with tooltips.</s>


=== <s>R-2 Be careful about player assistance</s> ===
=== F.1 Endgame & Replays ===
<s>As a rule of thumb, in order to respect the original board games, you should not introduce any player assistance feature.
An assistance must not be introduced if it directly helps the player to figure out if his move is good or bad.
An assistance may be introduced if it can help the player to figure out what moves are available.</s>


<s>Gygès: the assistance shows you available moves, but is not alerting you about stupid moves (like the upper left one).</s>
'''✔️ Do'''
* Make replays flow without interruption.
* Keep animations skippable and playable at minimum speed.
* Keep logs and highlights in sync with each replayed action.
* Match the scoring pay-off to game length — long games deserve a longer reveal.
* Use synchronous notifications per scoring step and <code>this.displayScoring</code> for points animations.


<s>Note: You can however do a single choice move for a player, i.e passing on a turn if there is nothing a user can do; It's quite annoying to wait on a player to pass, while it's the only action that they can do anyways.</s>
'''❌ Don't'''
* Do not put blocking popups in replays.
* Do not drop the final score instantly at the end of a long game.


=== <s>R-3 Available information</s> ===
=== F.2 Refresh & Continuity ===
<s>Every information visible by players in the real game should be accessible in the adaptation. Pay attention to some information like the number of cards in the opponents hand, or the number of remaining cards in the deck.
If it is explicitly forbidden to count cards in the discard pile, this information is not available.</s>


== <s>Accessibility</s> ==
A refresh should feel invisible.


=== <s>A-1 Design for all (New: 2026.01)</s> ===
'''✔️ Do'''
* Restore the exact game state after refresh (no missing/corrupted info).
* Restore temporary UI: whose turn it is, pending actions, selected components.
* Treat the server as the source of truth for all critical state.
* Expect disconnect/reconnect as normal — BGA may do it at any time.


* <s>Don't rely on color alone - pair colors with icons, textures, or shapes for players with color vision deficiencies</s>
'''❌ Don't'''
* <s>Use proper contrast - minimum ratio of 4.5:1 for text readability</s>
* Do not store critical state in client-only memory.
* <s>Keep animations safe - avoid flashing or rapidly alternating visuals</s>
* Do not rely on session continuity hacks.
* <s>Label everything - buttons, icons, and interactive elements should include clear text labels or tooltips for screen readers</s>
* <s>Make differences obvious - use bold shapes, clear outlines, and strong contrast rather than subtle shading or color variations</s>


=== <s>A-2 Colorblind-safe design (New: 2026.01)</s> ===
=== F.3 Error handling ===


* <s>Add unique shapes, symbols, or outlines to each player color on pawns/tokens</s>
'''✔️ Do'''
* <s>Place small icons in card corners or add patterns so cards can be recognized without relying on hue</s>
* Handle disconnects and dropped actions without breaking flow.
* <s>All text and icons must meet WCAG AA contrast levels</s>
* Show players short, friendly messages explaining what went wrong.
* <s>Use outlines, borders, or contrasting strokes for player colors</s>
* Log precise error details to the developer console.
* <s>Test player colors against both light and dark backgrounds (avoid yellow text on white)</s>
* Isolate the error to the affected action.


=== <s>A-3 Tap targets for mobile (New: 2026.01)</s> ===
'''❌ Don't'''
* Do not crash the game on invalid input.
* Do not expose raw server logs or stack traces to players.
* Do not block the whole table because of one failed request.


* <s>Minimum interactive element size: 32×32px</s>
== Pre-release Checklist ==
* <s>Ideal size: 40-44px (greatly reduces mis-taps on touchscreens)</s>
* <s>Leave enough spacing between buttons/tokens/cards to prevent accidental hits</s>
* <s>Avoid cramming small icons together - group many options into expandable menus or secondary panels</s>
* <s>When space runs out, allow scrolling areas instead of shrinking components until unusable</s>


=== <s>A-4 Settings and customization (New: 2026.01)</s> ===
''Version 1.0.0 — May 22, 2026''


* <s>All game settings must be placed in the standard BGA settings menu (not custom menus)</s>
{| class="wikitable"
* <s>Provide per-game options only where relevant:</s>
! # !! Check
** <s>Animation speed (activated/none)</s>
|-
** <s>Tooltip detail (compact/full)</s>
| 1 || Layout centers and scales on all devices.
** <s>Sound effects (on/off)</s>
|-
* <s>Reuse existing BGA controls - never duplicate custom UI for settings</s>
| 2 || Action Bar ≤ 4 buttons, never replaces components.
|-
| 3 || Tooltips: clear, translatable, useful.
|-
| 4 || Buttons follow BGA standards (blue = forward, red = cancel).
|-
| 5 || No blocking popups mid-game.
|-
| 6 || Animations: quick, smooth, informative.
|-
| 7 || All tap/click targets ≥ 32px.
|-
| 8 || Colorblind-safe icons in place.
|-
| 9 || Endgame shows breakdown + replay option.
|-
| 10 || Game state restores cleanly after refresh.
|}


== Game technical quality ==
== Closing thoughts ==


=== T-1 Don't use exotic stuff ===
* '''Alpha:''' gather usability feedback.
BGA Studio provides a set of useful tools to build board games adaptations (i.e. card management, confirmation dialog, tooltips,…).
* '''Beta:''' listen to the crowd — confusion spots = redesign spots.
Use them, and don't use exotic libraries, plugins or tricks.
* '''Iterate:''' small UX tweaks = big retention gains.
Why? Because BGA Framework will evolve in the future to provide new features to players, and it could make your game incompatible with the new version.
* '''Watch metrics:''' if players stall at a phase, that's your design flag.
On the contrary, if you are using standard Haggis using BGA standard card stuff, you will enjoy these enhancements without any effort.
If you feel that you really need some exotic thing: don't hesitate to ask us.


=== T-2 Make sure you can use what you use ===
Play other BGA games with similar mechanics — get inspired, challenge your assumptions, and treat UX as a key part of design, not an afterthought.


In particular, do not build your game on top of a technical library without checking that licensing allows you (and BGA) to use it.
If you use a library, make sure first that its license is really open (MIT style). Otherwise, we may have to ask you to rework your code to use another library.
In general, please consider that it's always better to minimize dependencies, so if you can avoid using external libraries, all the better.
=== T-3 Write in (simple) English ===
Some other person may have to look at your code, such as:
* We (the BGA team), who are here to help you if you need us.
* Some other BGA developer wanting to help you.
For all these reasons, your code must be written in English (variables, methods, comments...).
If English is not your mother tongue don't be afraid: the whole idea here is to be understood, not to write an essay :)
=== T-4 Page refresh ===
A page refresh (F5) must allow players to reset the game interface to a stable state at any moment of the game.
BGA Studio framework allows you to do this with the « getAllDatas » PHP method and the « setup » Javascript method.
Note: this « refresh » feature is also quite useful during the development process:)
Refresh continuity (New: 2026.01):
* After refresh, the game must return to the exact same state with no missing or corrupted information
* Restore temporary UI indicators (whose turn it is, pending actions, selected components)
* Server is the source of truth - never rely on client-only memory for critical state
* Do not depend on "session continuity hacks" - BGA servers may disconnect/reconnect players at any time
* A refresh should feel invisible to the player
=== T-5 Private information ===
A private game element must be visible only to the player owning it. It must not be visible by his opponents, by any means.
In particular:
* getAllDatas PHP method must not return any element that are hidden from current player, even if the Javascript « setup » method ignores them.
* you must not send via the « notify->all » function some information that is hidden from one player (use « notify->player » instead).
Hearts: each player is alerted about his new cards using notify->player, and cards from the other players remains secret
=== T-6 Game progression ===
Game progression should be as accurate as possible.
Of course, its not always easy (or even possible) to compute game progression, but a vague approximation is better than nothing.
Stone Age: there are 2 different end game conditions (building cards and civilization  cards).
Both are taken into account to  increase the accuracy of the game  progression.
=== T-7 Game statistics ===
Using BGA Studio you can define a set of statistics for your game. Statistics will be displayed at the end of the game, and help players to figure out why they win/lose a game,
and what they should improve. Try to choose interesting statistics that distinguish the different strategies for your game, in order it can help players to understand their game.
Seasons : statistics
=== T-8 Error handling (New: 2026.01) ===
* Handle disconnects smoothly - anticipate delays and dropped actions without breaking game flow
* Invalid inputs must never crash the game or leave it in a corrupted state
* For developers: provide precise error details in the console
* For players: display short, friendly messages explaining what went wrong and what to do next
* Never expose raw server logs or technical stack traces to end users
* Isolate errors to the affected action - never block the entire table because of one failed request
=== T-9 Endgame and replays (New: 2026.01) ===
* Endgame logs must clearly summarize all major actions that led to the outcome
* Replay mode must feel as clear as the live session
* No blocking popups during replays - they should flow smoothly
* Animations must be compatible with replays - playable at minimum speed and skippable
* Logs and highlights must stay in sync with each replayed action
=== T-10 Namespace recommendations ===
Your game is not working in complete isolation, it's included in a page with a lot of elements around (header, footer, logs, chat, player panels, rankings...)
So you should pay attention to naming your DOM elements, CSS classes and PHP constants / classes in a way specific to your game in order to avoid namespace collisions (for example you use a selector for a "selected" class in your .js, and there is also an element of the framework outside of your game with a selected class).
It's recommended to have:
* a wrapper div around your game zone with an id specific to your game ('yourgamename_playzone' for example) and to use it in any xpath selector of your .js
* a prefix for example a trigram for your game that you append to all the css classes of your game ('yrg_selected' for example).
* a prefix or a namespace for your PHP constants or classes.
Even if everything is working fine today, otherwise your game may break in the future when the framework is updated.
You should not use any global variables (window scope) in your Javascript files. If you need something to be accessible globally, then you should use <code>window.gameui</code>. You could even make a <code>window.gameui.globals = {}</code> object to contain any global variables.




= BGA Studio Guidelines (Source Code) =
= BGA Studio Guidelines (Source Code) =
Make your code as easy to read and understand as possible : clearly named functions and variables, comments when necessary, ...
Make your code as easy to read and understand as possible: clearly named functions and variables, comments when necessary, ...


Everything should be in english in your code.
Everything should be in english in your code.
Line 600: Line 499:


==== State functions ====
==== State functions ====
States functions should be prefixed “st”
States functions should be prefixed "st"


Args functions should be prefixed “arg”
Args functions should be prefixed "arg"


Action functions should be prefixed “act”
Action functions should be prefixed "act"


=== Namespacing ===
=== Namespacing ===
Line 614: Line 513:
<?php
<?php
declare(strict_types=1);
declare(strict_types=1);
namespace Bga\Games\<mygame\PowerCard;
namespace Bga\Games\<mygame>\PowerCard;
class PowerCardManager {
class PowerCardManager {
</pre>
</pre>
Line 628: Line 527:
<pre>
<pre>
$args = $this->argPlayCards();
$args = $this->argPlayCards();
if (!in_array($cardId, $args[‘selectableCardsIds’]) { throw new \BgaUserException(...); }
if (!in_array($cardId, $args['selectableCardsIds'])) { throw new \BgaUserException(...); }
</pre>  
</pre>  



Latest revision as of 03:15, 23 May 2026

BGA Studio Guidelines (UX/UI)

This page covers UX guidelines for games on Board Game Arena. Read the official PDF or bga.li/mRdx first. This page is an unofficial summary.

Goal: most games should be instantly playable on any device — desktop at midnight or phone at lunch.

Use this page to validate UX before switching your game from ALPHA → BETA → RELEASE.

A — Layouts

A.1 Layout arrangement

Game should fit a square ratio and show everything the active player needs. Use vertical scroll for secondary info (other players' progress, secondary boards).

✔️ Do

  • Center the play area on all devices.
  • Leave a "no action" margin around the board (deselect, scroll on mobile).
  • Use HTML anchors to jump between distant sections.
  • Use spacers / transparent whiteblocks to group pieces clearly.
  • Keep score, turn order, and objectives accessible (button/tab/panel), not always visible.
  • Tuck rare abilities into tooltips.

❌ Don't

  • Do not hide game components behind popups — you should see everything you'd see on a real table.
  • Do not place "always accessible" info permanently on the player panels.
  • Do not add in-game logos or branding that isn't part of the actual game.
  • Do not scatter related info (e.g. resources) across three corners.

Note: Layout mantra: Central = shared actions. Top/Bottom = global info. Panels = private resources.

Ux-01-layouts.jpg


A.2 Action Bar

The Action Bar always shows the current state: turn in progress, who we're waiting for, or what the player can do.

Ux-03-action-bar-mock.jpg

✔️ Do

  • Center main awaited actions (Play card, End turn, Confirm move).
  • Place secondary/greyed-out actions next to them.
  • Put cancel / undo / remove on the right, visually separated from forward actions.
  • Use the Action Bar for: actions targeting another player, Pass/End turn/time-related actions, auction phases, and small resource exchanges without dedicated board space.
  • Keep it to max 4 buttons + context so it doesn't overflow on mobile.

❌ Don't

  • Do not replace board-component actions with Action Bar buttons — players should act on the board like in real life.
  • Do not stick custom buttons next to BGA's built-in buttons (replay controls, etc.).
  • Do not let cancel actions visually compete with main actions.
  • Do not show "Round in progress" text inside the bar — display it on the table or as flavor text of the current action.

Example: Wingspan shows the current round as flavor text under the action bar.

Ux-02-action-bar-examples.jpg

→ See C.3 for button colors.

A.3 Player panels

Player panels let anyone glance at: who's playing, color, score, turn order, and resources gained.

✔️ Do

  • Keep panels compact — a 4-player game on mobile must not occupy more than ¼ of the screen.
  • Offer HTML anchor shortcuts to jump to a player's main components.

❌ Don't

  • Do not put settings, titles, round numbers, or other redundant info in panels.
  • Do not put always-accessible info (score, objectives) only on player panels.

Ux-04-player-panel.jpg

A.4 Popups

✔️ Do

  • Reserve automatic popups for tutorials only.
  • Make any required popup skippable on click/touch/timer.
  • Use the game wiki for rules, hints, scoring tips, helpers.

Ux-06-wiki.jpg

❌ Don't

  • Do not block game flow with popups (forbidden).
  • Do not use popups mid-game — only allowed for between-round/stage scoring.

Example: area around popup clickable - should be used to close it

Ux-05-popup.jpg


→ See B.1 for non-blocking alternatives.

A.5 Clarity & Zoom

Use vertical space and good layout instead of zoom controls.

✔️ Do

  • Design so the core game is fully playable at 100% scale.
  • Trust browser zoom: Ctrl+wheel on desktop, pinch on mobile.

❌ Don't

  • Do not add zoom buttons unless absolutely necessary (large secondary boards, very text-heavy cards like Ticket to Ride).

If you must add zoom buttons:

  • + (plus): zoom in
  • – (minus): zoom out
  • 🏠 Home: reset to default

B — Usability

B.1 Tooltips

Tooltips add insight, not duplication.

✔️ Do

  • Add extra detail beyond what's on screen (translatable text, hints about when to use).
  • Use them to zoom into small text/icons on large game boards.
  • Close tooltips when the user taps away on mobile.

❌ Don't

  • Do not show the same info twice the same way.
  • Do not add a tooltip that's just a zoomed-in copy of an already-visible card — that's a sign your components are mis-sized.

Example: Ticket to Ride hover tooltips name cards/decks without distraction.

Ux-07-tooltip-1.jpg

Example: Altered shows minimal default info, with full detail on hover.

Ux-08-tooltip-2.jpg

B.2 Forbidden actions

✔️ Do

  • Grey out / disable actions that exist but aren't currently available.

❌ Don't

  • Do not show disabled buttons for actions that are never relevant in the current context — just hide them.

B.3 Undo, Reset, Restart

BGA philosophy: fast, fluid, intuitive. Use these controls sparingly.

✔️ Do

  • Use Confirm buttons for impactful, irreversible actions (end turn, discard, commit resources).
  • Prefer timed confirmation (5–8s) over undo.
  • Offer one Restart Turn for the whole turn when rules allow, not per-micro-action undo.
  • Allow "Undo last move" only when a turn has more than 2 actions.

❌ Don't

  • Do not add an Undo button for every action — multiplies validation steps, slows the game.
  • Do not layer Undo on top of Reset on top of Confirm — over-validation.
  • Do not use Undo to paper over misclicks — fix the layout instead (bigger targets, clearer highlights).

C — Design

C.1 Typography & translations

Clarity beats style.

✔️ Do

  • Use the default BGA font.
  • Use clean sans-serif if you must change.
  • Maintain good line spacing.
  • Make all text translatable via BGA's translation system.
  • Support LTR and RTL languages — test alignment & mirroring.
  • Ensure your font supports accents/diacritics (é, ñ, ü).
  • Meet WCAG AA contrast.
  • Test on a phone — what's readable on a 27" monitor may not be on mobile.

❌ Don't

  • Do not use decorative or themed fonts (hard to read, licensing risk, missing glyphs).
  • Do not mix multiple fonts for "theme."
  • Do not embed text directly into images without alt-text.

C.2 Highlights & Glowing auras

Players should never wonder "what do I click?"

✔️ Do

  • Highlight valid options so the awaited action is obvious.
  • Show consequences visually before the player commits.

Example of highlighting valid options on the table.

Ux-09-active-element.jpg

C.3 Button colors and styling

Button colors are a shared language across BGA. Mandatory for consistency.

Color Meaning statusBar.addActionButton
🔵 Blue Advance, confirm, move forward primary
🔴 Red Cancel, undo, stop, exit alert
⚪ White / Transparent Optional/side actions secondary
⚫ Grey Disabled, completed, unavailable (disabled state of any of the above)

✔️ Do

  • Display usernames in their assigned player color.
  • Outline player-color text so it stays visible (e.g. yellow on white).
  • Test player colors on both light and dark backgrounds.
  • Take any extra colors from game components (cards, tiles, tokens), not UI buttons.

❌ Don't

  • Do not reassign blue/red/grey for game-specific meaning.
  • Do not tint UI buttons to match the game's theme.

Note: Think of button colors as traffic lights: blue = go, red = stop, grey = unavailable.

C.4 Sizing & responsiveness

✔️ Do

  • Keep the main play area centered on every device.
  • Use fluid layouts that expand/contract to fit available space.
  • Leave margins around the board (prevents mobile misclicks).
  • On desktop/tablet: show the entire board when possible.
  • On mobile (vertical): stack secondary elements below the main action zone.
  • Make everything readable and usable at 100% scale.
  • Add HTML anchors / jump-links for vertical layouts.

❌ Don't

  • Do not use fixed-width designs.
  • Do not rely on zoom for legibility.
  • Do not let layout break when players zoom in/out.
  • Do not make any interactive element smaller than 32×32px (see E.3).

Reference implementation: bga-jump-to demo

C.5 Background & extras

The background is the table surface your game sits on.

✔️ Do

  • Use thematic, modern backgrounds (subtle playmat look).
  • Add slight texture or pattern.
  • Apply a touch of blur so components remain the visual focus.
  • Prioritize contrast against the game's components.

❌ Don't

  • Do not use pure flat colors.
  • Do not use sharp, busy, detailed backgrounds that compete with the game.
  • Do not let the background reduce component visibility.

D — Feedback

D.1 Errors & invalid actions

Silence is never acceptable. Every failed action must say why.

✔️ Do

  • Use a short shake, grey-out, or tooltip on failure.
  • Show concise plain-text errors: "You don't have enough resources."
  • Pair color with icons or text (don't rely on red alone).

❌ Don't

  • Do not leave the player guessing.
  • Do not use color alone — colorblind users won't see it.

D.2 Game Logs

Logs are the narration of the match. Critical for asynchronous games.

✔️ Do

  • Log every major action: card plays, moves, resource changes, eliminations.
  • Always say who acted and what changed.
  • Use icons, colors, formatting for fast scanning.
  • Provide alt-text for graphic components inside logs.
  • Group small simultaneous actions into a one-liner.
  • Log automated/forced actions too.

❌ Don't

  • Do not write walls of text or use oversized images that break log flow.
  • Do not hide who did the action.

Good:

  • "Marianna placed [red tile] on [central board] (+2 points)."
  • "Alex drew 2 [train cards]."

Bad:

  • "+2 points"
  • "Card drawn"

D.3 Animation

Animations explain what moved, where it went, why it matters.

✔️ Do

  • Use animations for: cards entering a hand, tokens moving, score count-up.
  • Keep regular animations at 0.5s, max 0.8s.
  • Batch repetitive updates (don't show 50 tiny +1 animations).

❌ Don't

  • Do not animate trivial updates one by one.
  • Do not use looping, bouncing, or glowing animations as decoration.

→ See BGA animation library.

D.4 Sound effects

Sound is a bonus, not a requirement.

✔️ Do

  • Keep volume below the BGA default.
  • Keep sounds short, sharp, purposeful.
  • Always pair sound with a visual cue.

❌ Don't

  • Do not add long looping soundtracks.
  • Do not let any action be communicated by sound only.
  • Do not surprise players with loud audio.

E — Accessibility

E.1 Design for all

✔️ Do

  • Pair colors with icons, textures, or shapes.
  • Meet contrast ratio 4.5:1 minimum.
  • Label every button, icon, and interactive element (screen readers).
  • Use bold shapes, clear outlines, strong contrast to differentiate pieces.

❌ Don't

  • Do not rely on color alone.
  • Do not use flashing or rapidly alternating visuals.
  • Do not depend on fine details or subtle shading to differentiate components.

E.2 Colorblind-safe design

✔️ Do

  • Add unique shapes/symbols/outlines per pawn or token color.
  • Place small icons in card corners (or patterns) so suits are recognizable without hue.
  • Meet WCAG AA for text and icons.
  • Outline player-color names so yellow doesn't vanish on white.

❌ Don't

  • Do not assume players perceive color differences.

E.3 Tap targets

✔️ Do

  • Minimum 32×32px for any interactive element.
  • Aim for 40–44px (greatly reduces mis-taps).
  • Leave spacing between buttons, tokens, cards.
  • Group many options into expandable menus or secondary panels.
  • When space runs out, add scrolling — don't shrink components.

❌ Don't

  • Do not cram small icons into tight clusters.
  • Do not shrink components below the minimum to fit.

E.4 Settings & customization

✔️ Do

  • Put all game settings in BGA's standard settings menu.
  • Reuse existing BGA controls.
  • Offer per-game options only where relevant: animation speed, tooltip detail, sound on/off.

❌ Don't

  • Do not build custom settings UI (the platform is phasing those out).
  • Do not duplicate controls already available globally.

F — Technical

F.1 Endgame & Replays

✔️ Do

  • Make replays flow without interruption.
  • Keep animations skippable and playable at minimum speed.
  • Keep logs and highlights in sync with each replayed action.
  • Match the scoring pay-off to game length — long games deserve a longer reveal.
  • Use synchronous notifications per scoring step and this.displayScoring for points animations.

❌ Don't

  • Do not put blocking popups in replays.
  • Do not drop the final score instantly at the end of a long game.

F.2 Refresh & Continuity

A refresh should feel invisible.

✔️ Do

  • Restore the exact game state after refresh (no missing/corrupted info).
  • Restore temporary UI: whose turn it is, pending actions, selected components.
  • Treat the server as the source of truth for all critical state.
  • Expect disconnect/reconnect as normal — BGA may do it at any time.

❌ Don't

  • Do not store critical state in client-only memory.
  • Do not rely on session continuity hacks.

F.3 Error handling

✔️ Do

  • Handle disconnects and dropped actions without breaking flow.
  • Show players short, friendly messages explaining what went wrong.
  • Log precise error details to the developer console.
  • Isolate the error to the affected action.

❌ Don't

  • Do not crash the game on invalid input.
  • Do not expose raw server logs or stack traces to players.
  • Do not block the whole table because of one failed request.

Pre-release Checklist

Version 1.0.0 — May 22, 2026

# Check
1 Layout centers and scales on all devices.
2 Action Bar ≤ 4 buttons, never replaces components.
3 Tooltips: clear, translatable, useful.
4 Buttons follow BGA standards (blue = forward, red = cancel).
5 No blocking popups mid-game.
6 Animations: quick, smooth, informative.
7 All tap/click targets ≥ 32px.
8 Colorblind-safe icons in place.
9 Endgame shows breakdown + replay option.
10 Game state restores cleanly after refresh.

Closing thoughts

  • Alpha: gather usability feedback.
  • Beta: listen to the crowd — confusion spots = redesign spots.
  • Iterate: small UX tweaks = big retention gains.
  • Watch metrics: if players stall at a phase, that's your design flag.

Play other BGA games with similar mechanics — get inspired, challenge your assumptions, and treat UX as a key part of design, not an afterthought.


BGA Studio Guidelines (Source Code)

Make your code as easy to read and understand as possible: clearly named functions and variables, comments when necessary, ...

Everything should be in english in your code.

In case you drop the support for a project, another developer should be able to follow up on your code and understand it easily.

Front (JS) code

Generated code

Generated code (SCSS, Typescript) is tolerated, as long as you provide both source files and built files, ideally with build tools. The build file should not be minimized, as someone taking over your project might not know the source language, and will the work on the built file ignoring the source file. Build tools are useful if he wants to continue the project with your source files.

JS and CSS files remains the used file in the end, BGA does not handle natively other languages.

Templates

Use of .tpl file and view.php is deprecated and forbidden for new projects.


Back (PHP) code

Game name and option names should be Capitalized.

Framework functions

Undocumented functions

Do not use undocumented functions. They may change or be deleted without warning, and your game will not work anymore. Any change on documented function will be avoided as much as possible, and will be notified.

Function override

Do not override framework functions. Use a wrapper instead.

Bad :

public function getPlayerNameById($player_id) { // same name as the framework function = override
  if ($player_id == 0) {
    return 'Automata';
  } else {
    return parent::getPlayerNameById($player_id);
  } 
}

Better :

public function myGameGetPlayerNameById($player_id) { // // different name = wrapper
  if ($player_id == 0) {
    return 'Automata';
  } else {
    return $this->getPlayerNameById($player_id);
  } 
}

State functions

States functions should be prefixed "st"

Args functions should be prefixed "arg"

Action functions should be prefixed "act"

Namespacing

The classes should be namespaced following the PSR-4 norm. That means you won't need to require the classes, as BGA will be able to autoload them.

So a class named PowerCardManager on a PowerCard folder should have the filename <mygame>/PowerCard/PowerCardManager.php and start like this :

<?php
declare(strict_types=1);
namespace Bga\Games\<mygame>\PowerCard;
class PowerCardManager {

Other

.action.php shouldn’t be used anymore, auto-wiring should be used instead.


The actions function must check any input. To avoid code duplication, they can use the arg function.

Example :  

$args = $this->argPlayCards();
if (!in_array($cardId, $args['selectableCardsIds'])) { throw new \BgaUserException(...); }


Don’t use `@` to ignore the errors of a function call.