1. 19 Oct, 2026 40 commits
    • Mahmoud Aglan's avatar
      wip(chess): premoves, unfinished and untested · a3a24229
      Mahmoud Aglan authored
      Partial work from the chess agent, stopped by the owner before it was
      tested. Parked here so main stays deployable; not for merging as is.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      a3a24229
    • Mahmoud Aglan's avatar
      feat(ludo): bot games pay; one roll key; start key always on screen · f56437fc
      Mahmoud Aglan authored
      A bot game gets its own ludo_matches row (action start, mode bot), and
      complete pays its creator once through complete_match with the bot seats
      as null: nothing under 90 s, nothing for a walked-away game, 403 for
      anyone else. The result card shows the real coins and XP.
      
      From the design review: the die is the roll key (#roll-btn), an idle full
      face on a lip in the roller's colour, instead of a die beside a button
      with a red pip in a glowing ring; plates use the shared avatar (purple
      rounded square for people, ink with the robot for bots); the room's start
      key is pinned above the dock with compact seat cards, checked uncovered at
      360x640, 390x844 and 430x932. tests/play/ludo.mjs 83/84 then 37/37 for
      the local games after fixing the opening roll in the one lucky check.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      f56437fc
    • Mahmoud Aglan's avatar
      docs(design): DESIGN.md for Night Arcade; flat faces, no gloss rims · 41dbece4
      Mahmoud Aglan authored
      DESIGN.md (and .impeccable/design.json) replace the June v3 spec with the
      shipped Night Arcade system, derived from tokens.css and core.css: the
      stage, ink tiles, white cards, keys on a lip, colour rationing, the board
      palettes, Rubik with the pinned display face, motion and feel, RTL, and
      the theming contract.
      
      The documenter's audit found the code breaking its own rules: a white rim
      on top of every key and the play key read as gloss (removed), the green
      and orange faces had a lighter top that dropped white text under 3:1
      (both are one flat colour now, orange deepened to 3.4:1), and small green
      keys carried 13-14px text at 3.1:1 (they use a deeper green, 5:1). The
      CTA glint stays, recorded as motion.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      41dbece4
    • Mahmoud Aglan's avatar
      fix(backgammon): the table takes the whole screen; one avatar system · 3be7e45a
      Mahmoud Aglan authored
      The backgammon game never entered game mode, so the HUD and the dock
      stayed over the board (screenshots only hid it when an earlier game had
      left game mode on). It now enters on mount and exits on unmount like the
      other games. Avatars follow one rule across games: a person is a purple
      rounded square on a lip, a bot an ink rounded square with the robot
      (chess's player tile was blue, backgammon's were circles).
      backgammon.mjs --only result,layout: 27/27.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      3be7e45a
    • Mahmoud Aglan's avatar
      fix(design): finish-review fixes for Night Arcade · bf86ce99
      Mahmoud Aglan authored
      From the finish review:
      - Contrast: white on the green face was 2.0:1; the green (and orange)
        button faces are deepened so white text clears 3:1. Green stickers on
        a green key render white instead of vanishing. The shop's common and
        legendary headers print in ink, on tokens.
      - HUD: the purses keep their plus keys on phones; the avatar with its
        level badge stands for the player and the name moves to the profile.
      - Domino: the table was purple-tinted (purple flooded the screen); it is
        plain ink, purple stays on the tile backs.
      - Home: the game cards overlap less so every name shows; the duplicate
        leaderboard entries (a side key and a chip, besides the dock tab) give
        way to a shop key; a live tournament is an ink tile with a red live
        bead, not a red slab.
      - Leaderboard rows stay inside the gutter; the player's own row is lit.
      - index.php FORM records that this world had no concept roll or comp.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      bf86ce99
    • Mahmoud Aglan's avatar
      fix(api): an RPC that returns a number no longer crashes the request · 790663e2
      Mahmoud Aglan authored
      award_coins answers the new balance; json_decode gave an int and
      SupabaseClient::request(), typed to return an array, threw a TypeError.
      Every achievement that paid coins answered 500 after the coins were
      already granted (seen in production on achievements.php). Scalars now
      come back as ['result' => value]; error bodies that are not objects no
      longer index into a scalar.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      790663e2
    • Mahmoud Aglan's avatar
      chore(design): remove the walnut texture and its leftovers · fee8349c
      Mahmoud Aglan authored
      Nothing paints wood any more; the texture, its credit and the legacy
      --wood-* tokens go.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      fee8349c
    • Mahmoud Aglan's avatar
      fix(backgammon): forced moves, variant rules, online sync, bot payouts · a855527a
      Mahmoud Aglan authored
      Rules: move generation is rewritten so both dice must be played when they
      can be, otherwise the larger. 31 used a long-backgammon setup and allowed
      pins; it now starts like mahbousa, a single checker closes a point and the
      winner scores the loser's remaining checkers (lengths 1/11/21/31).
      Mahbousa could freeze forever when both starting stacks were pinned; the
      plakoto mother rule now settles it. Turning the cube off lasted one game,
      taking the bot's double froze the game, and a player on black saw the
      board upside down with a swapped score.
      
      Online: a poll could wipe unsent moves, the cube never synced, 'opponent'
      was sent as the winner id, and a refreshed tab rejoined as white. Online
      is now a numbered move log plus a snapshot; the other side replays the log
      with animation and checks it matches. Timers stop when the scene closes.
      
      Bot games get a server match row (action start) and complete pays the
      creator once; a row under 90 s old closes with no payout.
      
      Look: flat teal board, red and white points, checkers on a lip, flat dice
      and cube. backgammon-rules 659/659 (brute-force cross-check); browser
      suite 122 + online 39/39 + layout 20/20, zero console errors.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      a855527a
    • Mahmoud Aglan's avatar
      fix(leaderboard): test accounts never rank; shoot.mjs cleans up late rows · 8a0227c2
      Mahmoud Aglan authored
      Accounts named ZZZ-... are test accounts (every script in tests/ and
      tools/ tags them so); the leaderboard skips them in every game instead of
      showing eight ZZZ-CYCLE rows at the top. shoot.mjs waits for requests the
      closing page had in flight and repeats its cleanup until the profile is
      gone: a bot match created at the last moment had kept one alive.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      8a0227c2
    • Mahmoud Aglan's avatar
      chore(puzzles): back up three puzzles corrected in production · 003f4625
      Mahmoud Aglan authored
      p004 (tagged mate) let the defender take the rook; the black rook is gone
      so Ra8 is mate. p009 was tagged promotion with a rook move; it is a back-
      rank mate. p019 (tagged mate) left the queen hanging; it is now Qh8 mate
      with the king guarding. Rows before the change are in this file; all three
      answers were checked as mate with chess.js.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      003f4625
    • Mahmoud Aglan's avatar
      fix(hud): the purse counts up to the balance after achievement coins · 6f4dbe11
      Mahmoud Aglan authored
      Achievement coins were paid by the check after the HUD had already pulled
      the player, so the purse showed the old balance until the next refresh.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      6f4dbe11
    • Mahmoud Aglan's avatar
      fix(admin): a branding save no longer pins every default over tokens.css · 5c00e8d4
      Mahmoud Aglan authored
      The form posted every field, pre-filled with the Cafe Deck defaults, and
      the save stored each one in platform_theme, where stored values beat
      tokens.css: one save would have turned the app indigo again. It now sends
      only the fields that changed, and its defaults are the Night Arcade
      values. Pawn uploads go to the ludo_token_* slots the board now reads.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      5c00e8d4
    • Mahmoud Aglan's avatar
      feat(chess): flat drawn pieces everywhere; white pieces get a readable edge · 32bfa830
      Mahmoud Aglan authored
      The uploaded piece images were heavily outlined old-style art; they are
      backed up to docs/branding-backup-2026-10-19-chess-pieces.json and cleared
      in platform_assets, so every board draws the flat Night Arcade pieces.
      White pieces get a thin mid-grey edge and a silver lip to read on the
      light squares. tools/shoot.mjs --drop-assets previews the built-in art.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      32bfa830
    • Mahmoud Aglan's avatar
      fix(ludo): online boards stay in sync; rules, bots, rewards; flat board · 4ce3d90f
      Mahmoud Aglan authored
      Online: at speed a client's writes trail its own board, and a stale-row
      check read that lag as a stale row, reset the client and let it play again
      from the older board: two writers with one sequence number. The check now
      fires only with nothing in flight, every write is dropped while a resync
      is pending, and a resync takes the row's sequence. The quiet-player notice
      shows for each new silence, not once per match.
      
      Rules: in 3-4 player games the first finisher kept a turn nobody could
      take and the game stalled; three sixes is enforced and no longer carries
      into the next turn. Seats come from the match, not the room. Exactly one
      client settles a match, with real ids. Bots score their moves by
      difficulty. A leaver is announced and in a duel the one who stays wins.
      Names in the roll button are escaped.
      
      Look: flat quadrants on white, pawns on a lip, a flat tumbling die.
      tests/play/ludo.mjs 73/73 (local 4, duel, online), ludo-rules 60/60.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      4ce3d90f
    • Mahmoud Aglan's avatar
      fix(chess): live games, clocks, refresh, puzzles; Night Arcade board · 95acecec
      Mahmoud Aglan authored
      Live games lost their move history (each opponent move arrived as a bare
      FEN), so threefold repetition never triggered and the PGN broke; moves now
      replay from the server's list. The mating move was sent after the game
      closed and never reached the opponent. A refreshed tab overwrote the
      server's move list with a short one; it now rebuilds from the server.
      The opponent got the increment twice, Black's clock started before the
      first move, and a flag is now confirmed with the server. Refreshing a bot
      game lost it; the bot accepted half of all draw offers at random and froze
      on an illegal reply. Promotion has a cancellable picker. The result card
      no longer invents rating changes for bot games, rematch after a live game
      searches at the same clock, and back to table no longer stacks a home.
      Analysis kept the evaluation sign and orientation for Black; review runs
      one engine call per position and caches. Puzzles accept an alternative
      mate and offer retry / show answer.
      
      Board: flat lavender in an ink frame, pieces on a lip, tokens only.
      tests/play/chess.mjs: 183/183 (bot, online with two accounts, puzzles,
      three phone sizes), zero console errors.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      95acecec
    • Mahmoud Aglan's avatar
      feat(game): in-game shell and domino in Night Arcade; invite fixes · e4ccd12e
      Mahmoud Aglan authored
      Shell (match UI, player plates, dialogs, reactions, queue, VS, challenge):
      flat Night Arcade surfaces, turn timers on the plates, banners for your
      turn / time low / waiting, a claimable disconnect ring, and a cancel that
      waits for an in-flight join so it never leaves a ghost queue row.
      tests/play/shell.mjs: 144/147 (the 3 were the invite bugs below).
      
      Domino: flat white tiles on a lip, a purple-tinted table, playable tiles
      lifted, the hand fanned with translate. tests/play/domino.mjs: 785/785
      against the bot, scripted positions and online.
      
      friends.php: a ludo invite wrote a column ludo_matches does not have (400)
      and opened a four-seat table; domino and ludo invites stored players as a
      JSON string, so check-invites never showed them to the friend.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      e4ccd12e
    • Mahmoud Aglan's avatar
      fix(reactions): backgammon players can send reactions in online games · b789888e
      Mahmoud Aglan authored
      isMatchParticipant() knew only ludo and domino matches, so every reaction
      poll in an online backgammon game answered 403 and nothing reached the
      opponent. Backgammon seats come from players or the colour columns.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      b789888e
    • Mahmoud Aglan's avatar
      fix(hud): fits 360px phones; FIDE title strings · 0fa3571d
      Mahmoud Aglan authored
      On narrow phones the purse keeps its tap but drops its plus key and the
      name tightens, so the bell no longer falls off the screen edge. The eight
      FIDE title labels on the profile editor were missing.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      0fa3571d
    • Mahmoud Aglan's avatar
      feat(design): Night Arcade, a modern minimal game UI replaces Royal Cafe · a20507ed
      Mahmoud Aglan authored
      The owner rejected the walnut and leather look as dated. The new world:
      a quiet violet-black ink stage with a faint star lattice; flat ink tiles
      for lists (each row its own tile); white game cards on a lip; flat colour
      buttons on a solid lip the finger pushes down; a floating HUD and a
      floating dock with the green play key standing out of it; Rubik, self-
      hosted, with the display face pinned to ExtraBold. Stickers are rebuilt
      flat on a lip, the game art is redrawn flat, each game owns one hue.
      
      Home, HUD, rewards, auth, shop, settings, profile and the leaderboard are
      converted; game screens follow.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      a20507ed
    • Mahmoud Aglan's avatar
      fix(matchmaking): chess and domino players who queue together are matched · c227bce1
      Mahmoud Aglan authored
      Chess: a status poll that landed between the claim and the match id write
      deleted the claim, so the waiting player searched forever while the other
      sat alone. A claim in progress is now left alone for 3 minutes, dequeue
      reports it, a failed match insert releases it, and a waiting player's
      status poll claims an older waiting row. Domino gets the same status-side
      match. Raced 4/4 (chess) and 3/3 (domino) with simultaneous queue calls.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      c227bce1
    • Mahmoud Aglan's avatar
      fix(auth): the crown no longer clips on tall forms; game checkbox · 42dd98c4
      Mahmoud Aglan authored
      justify-content centred the register form past the top of the screen;
      auto margins centre it without overflowing. The age checkbox is a carved
      slot that pops a green tick, and checkboxes squash and click like buttons.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      42dd98c4
    • Mahmoud Aglan's avatar
      feat(challenges): sticker tiles, chunky gold bars, English titles · 1b5018a6
      Mahmoud Aglan authored
      Each challenge shows its game's sticker (ludo_played, chess_played...) and
      a ready one glows gold until collected. The all-done panel was never shown;
      it now appears once every challenge is claimed. The API's fallback icons
      and the stored templates use sticker names instead of emoji.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      1b5018a6
    • Mahmoud Aglan's avatar
      fix(ludo): two players who search at the same moment are matched · 3df90193
      Mahmoud Aglan authored
      Both missed each other in the queue call and both inserted; status never
      tried to match, so they waited for the 60 s timeout. A waiting player's
      status poll now claims fresh rows queued before its own, after locking its
      own row, so two pollers can never claim each other. ludo_queue stores the
      requested table size for that path.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      3df90193
    • Mahmoud Aglan's avatar
      fix(friends): the host can cancel a challenge it sent · 425202c0
      Mahmoud Aglan authored
      decline-invite only accepted the invited player, so a host backing out of the
      lobby got 403 and the friend could still accept into an empty game for two
      minutes. The host now cancels (result 'cancelled'); the target still declines.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      425202c0
    • Mahmoud Aglan's avatar
      67e39c8d
    • Mahmoud Aglan's avatar
      fix(tools): shoot.mjs deletes the matches and rows its account creates · 5ed5daf6
      Mahmoud Aglan authored
      Bot game scenes create domino/ludo/backgammon match rows and, now that payouts
      work, economy and rating rows; removeAccount left them behind. Twelve orphaned
      domino matches from earlier runs were deleted from production.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      5ed5daf6
    • Mahmoud Aglan's avatar
      feat(game): vibration switch in settings · 00e13552
      Mahmoud Aglan authored
      Haptics (feel.haptic) are off when the player turns vibration off; the
      setting persists with the rest of the player's preferences.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      00e13552
    • Mahmoud Aglan's avatar
      chore(design): detector exceptions for game motion; XP bar animates transform · 8822f88d
      Mahmoud Aglan authored
      bounce-easing is the owner's direction (El3ab is a game: pops and overshoot);
      side-tab flags the 3D bevel under buttons and cards. The XP bar used to
      transition width (layout thrash); it now scales.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      8822f88d
    • Mahmoud Aglan's avatar
    • Mahmoud Aglan's avatar
    • Mahmoud Aglan's avatar
      feat(game): announce new achievements the moment a game ends · 3e2a893c
      Mahmoud Aglan authored
      Achievements were only checked when the achievements screen was opened, so a
      new one was never celebrated. After every game the HUD now refreshes the player
      from the server (the purse counts up, a level-up fires if earned), runs the
      achievement check and drops a gold banner for each new one with its coin
      reward, the reward jingle and a haptic.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      3e2a893c
    • Mahmoud Aglan's avatar
      feat(game): a full-screen level-up celebration · 28883801
      Mahmoud Aglan authored
      When the server raises your level, the table dims and the crown slams in on
      spinning rays with the new level in a gold star, confetti, the level-up jingle
      and a heavy haptic. shoot.mjs --eval runs a snippet before the shot.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      28883801
    • Mahmoud Aglan's avatar
      fix(game): toasts sent over the bus were dropped; friend rows get game buttons · 8cb1f74b
      Mahmoud Aglan authored
      Nothing listened for bus.emit('toast'), so sync errors, login-required notes
      and group messages silently vanished. engine.js now shows them with a new
      ui.toast (parchment note with a sticker and a sound). Friend rows: Challenge is
      a green game button, chat a sticker button. shoot.mjs --with-friend makes a
      befriended second throwaway account.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      8cb1f74b
    • Mahmoud Aglan's avatar
      feat(game): a real loading screen; tournament tiebreak names · 6abd77c5
      Mahmoud Aglan authored
      - The splash is a game loading screen: the crown dealt onto spinning light
        rays, the wordmark, a chunky gold loading bar and a rotating tip.
      - index.php shows the crown and a loading bar before any script runs, so a slow
        phone never sees a blank page.
      - Tiebreak names (Buchholz, Sonneborn-Berger, ...) were raw keys on the
        tournament page.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      6abd77c5
    • Mahmoud Aglan's avatar
      fix(online): matchmaking for ludo, domino and backgammon actually matches · 1b6fe1dc
      Mahmoud Aglan authored
      Found by the gameplay pass, verified against production with throwaway
      accounts (31/31 checks):
      
      - ludo: the queue filtered and ordered on created_at, a column ludo_queue does
        not have, so no two players were ever matched; five stale rows from July to
        September were also deleted.
      - domino and ludo status/get decoded jsonb columns that already arrive as
        arrays: a PHP 8 TypeError, so the waiting player never learned of the match
        and every live poll failed.
      - all three: the zero-UUID claim placeholder was reported as a found match and
        its row deleted; failed inserts were reported as success; domino hands were
        renumbered by array_merge; complete passed p_winners as a string (the RPC
        refused it) and could pay twice. Complete now pays once, to seated players.
      - engine.js loads each game module independently, so one module failing to
        load can no longer stop the whole app from booting.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      1b6fe1dc
    • Mahmoud Aglan's avatar
      feat(game): rewards, shop, profile and settings feel like a game; coin payouts fixed · 6746a37a
      Mahmoud Aglan authored
      - Daily reward is a moment: a treasure chest on spinning light rays that
        wiggles when ready, a gold "open" button, the chest bursts with the reward
        jingle and coins fly to the purse; the week is a grid of reward cards with
        the chest on day seven.
      - Shop: loot cards framed and ribboned by rarity (grey, green, blue, purple,
        gold), drawn previews per item type (mini boards in their colours, piece
        sets, framed avatars, effects), coin and gem price tags; Arabic item names
        (api/shop.php now sends name_ar).
      - Achievements as sticker badges, grey with a lock until earned, gold when
        done; chunky gold progress bars. Leaderboard podium medals with ribbons.
        Settings: sticker tiles, a green game switch, the delete button is red, and
        a credits sheet for the CC BY artists. Profile: framed avatar, crown level,
        sticker stats and game marks; the Challenge button pushed a scene that does
        not exist and did nothing.
      - Signed out there is no HUD or tab bar; login sits in a framed tray with a
        big gold "play as guest" button.
      - HUD/tab crown uses the optimised crown.webp; wood and crown are preloaded.
      - Server: no game had paid coins or XP since 2026-06-18 because award_coins
        wrote a transaction type the table's check constraint rejects; fixed in the
        database (migrations/2026-10-19-award-coins-type.sql). Online backgammon had
        no tables at all; created (migrations/2026-10-19-backgammon-online.sql), and
        the backgammon friend invite now writes the same shape as matchmaking.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      6746a37a
    • Mahmoud Aglan's avatar
      feat(design): Royal Cafe, El3ab becomes a mobile game · bfb16a6e
      Mahmoud Aglan authored
      The owner's direction: El3ab is a game, not an app; the indigo pass read as a
      "big blue blob". The world moves onto a warm walnut cafe table under a lamp.
      
      - New game UI kit (tokens.css, core.css): leather trays for lists, ivory card
        stock in gold frames, chunky glossy 3D buttons (green play, blue, gold, red,
        purple, wood) that push down, ribbon screen titles, round back buttons, gold
        tab chips. Lalezar for display type, Baloo Bhaijaan 2 for reading.
      - Game HUD: avatar frame with level badge and XP bar (500 XP a level, as the
        server computes it), coin and gem purses with green plus buttons (reward,
        shop), wooden bell. Tab bar: sticker icons that lift when active, a big round
        play button with the crown standing out of the bar.
      - 60 glossy sticker icons baked from game-icons.net (CC BY 3.0, credited in
        public/assets/game/CREDITS.md) by tools/build-gicons.mjs; gicon()/crown()
        in icons.js; legacy emoji keys and icon slots now render stickers.
      - Illustrated SVG scene per game (core/game-art.js), used on the home hand and
        each game room.
      - Home is a game lobby: side buttons (reward chest that wiggles when ready,
        achievements, leaderboard, challenge) around the crown, the hand of game
        cards, a huge green Play online button, a live-tournament banner.
      - Rooms use shared game-mode buttons and a framed art hero (ui.js).
      - Sound: recorded card-table sounds (Kenney, CC0) through Web Audio with
        variants and pitch drift; synth fallback. Global press feel (feel.js),
        card-move scene transitions, counting purse, ringing bell.
      - Fix: the shop module was never loaded, so the shop could not open.
      - Restyled screens from the parallel pass (play flow, chess and puzzles, rank
        and tournaments, social, profile, shop, rewards, auth) and ~200 recovered or
        missing Arabic/English strings; t() now warns once per missing key.
      
      Ludo, backgammon and domino game screens and the shared in-game panels ship
      separately, after their gameplay pass.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      bfb16a6e
    • Mahmoud Aglan's avatar
      feat(design): play flow and game rooms in The Cafe Deck · c284b158
      Mahmoud Aglan authored
      - Chess bots are court cards: the bot's initial printed large in red or black
        ink by strength, name plate, a one-line personality, the rating band as the
        corner index; the strongest carries a crown.
      - Time controls are printed cards grouped by bullet, blitz, rapid, classical.
      - Matchmaking shows a face-down deck riffling while the clock counts.
      - Challenge-a-friend rows, a card-stock options sheet; the pre-game lobby shows
        you and your opponent as two player cards, the opponent face down until they
        accept. The lobby's clock chip now shows the real control; every classical
        control used to read 30 minutes.
      - Ludo, domino and backgammon rooms: chip groups printed on card stock when
        chosen, ludo seats in each player's ink, one red start button. Domino bot
        setup is one screen (level and target, then start) instead of two steps.
      - PRODUCT.md: El3ab is a game, not an app; binding for every screen.
      Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
      c284b158
    • Mahmoud Aglan's avatar
    • Mahmoud Aglan's avatar