@hadoku/watchparty-ui 0.45.1 → 0.45.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AdminPanel-BLS2jVbU.js → AdminPanel-BGVD6Qlb.js} +4 -4
- package/dist/chunks/{AdminPanel-BLS2jVbU.js.map → AdminPanel-BGVD6Qlb.js.map} +1 -1
- package/dist/chunks/{GameModule-Cc9rFmYY.js → GameModule-Dx3GHtRk.js} +4 -4
- package/dist/chunks/{GameModule-Cc9rFmYY.js.map → GameModule-Dx3GHtRk.js.map} +1 -1
- package/dist/chunks/{MapEditor-BYytZ19I.js → MapEditor-yvJbXXgw.js} +2 -2
- package/dist/chunks/{MapEditor-BYytZ19I.js.map → MapEditor-yvJbXXgw.js.map} +1 -1
- package/dist/chunks/{MediaDrawer-CHn7DAlP.js → MediaDrawer-DLFj0-te.js} +4 -4
- package/dist/chunks/{MediaDrawer-CHn7DAlP.js.map → MediaDrawer-DLFj0-te.js.map} +1 -1
- package/dist/chunks/{PlaylistPanel-CuWYKMjh.js → PlaylistPanel-B0SWGlFy.js} +3 -3
- package/dist/chunks/{PlaylistPanel-CuWYKMjh.js.map → PlaylistPanel-B0SWGlFy.js.map} +1 -1
- package/dist/chunks/{Room-DWs1NSwe.js → Room-BVyJK3zM.js} +1448 -1429
- package/dist/chunks/Room-BVyJK3zM.js.map +1 -0
- package/dist/chunks/{index-B9K6iuIS.js → index-DOLbMWw6.js} +3 -3
- package/dist/chunks/{index-B9K6iuIS.js.map → index-DOLbMWw6.js.map} +1 -1
- package/dist/chunks/{submissionsApi-95aogA8-.js → submissionsApi-CXZf_xlm.js} +2 -2
- package/dist/chunks/{submissionsApi-95aogA8-.js.map → submissionsApi-CXZf_xlm.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/watchparty-ui.css +1 -1
- package/package.json +2 -2
- package/dist/chunks/Room-DWs1NSwe.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameModule-Cc9rFmYY.js","sources":["../../src/assets/games/panel-frame.png","../../src/lib/gameMatchState.ts","../../src/assets/games/bomberman/volume-icon.png","../../src/assets/games/bomberman/close-icon.png","../../src/assets/games/bomberman/lobby-icon.png","../../src/assets/games/bomberman/leaderboard-icon.png","../../src/assets/games/bomberman/explosion-arm.png","../../src/assets/games/bomberman/explosion-end.png","../../src/lib/leaderboardStats.ts","../../src/components/LeaderboardModal.tsx","../../src/components/GameModule.tsx"],"sourcesContent":["export default \"data:image/png;base64,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\"","/**\n * What a host snapshot means for match state.\n *\n * Extracted from GameModule.tsx's `game_state` handler (2026-08-17). The rule\n * is small but it is the settled form of two production bugs, and it lived\n * inside a 274-line socket effect inside a 1352-line component where nothing\n * could reach it:\n *\n * - **Stale-snapshot rejection.** `ph` frames from a just-ended prior round\n * arrive ~50-300ms after the client enters 'playing'. Acting on them kicks\n * matchPhase back to 'ended' and the auto-loop fires another restart 5s\n * later — the 2026-05-30 double-restart bug. Anything inside\n * `STALE_SNAPSHOT_WINDOW_MS` of entering 'playing' is ignored.\n * - **`se` must come from THIS payload.** sessionOver used to arrive on a\n * separate `game_result` bridge message, which could race the snapshot: if\n * matchPhase flipped to 'ended' first, the auto-loop scheduled its restart\n * with a stale `sessionOver=false` (\"game still restarts at 100\"). Reading\n * both out of one payload removes the race by construction — so a future\n * refactor must not split them back apart.\n */\n\n/** Generous enough for prod RTT plus event-loop backlog, short enough not to\n * swallow a legitimate sub-second match. */\nexport const STALE_SNAPSHOT_WINDOW_MS = 700;\n\n/** `ph` sentinel: the match is still running. */\nexport const PH_RUNNING = -1;\n/** `ph` sentinel: the match ended in a draw. */\nexport const PH_DRAW = -2;\n\nexport interface MatchStateUpdate {\n /** Move matchPhase 'playing' -> 'ended'. */\n endMatch: boolean;\n /** Set sessionOver to this, when the payload carried `se`. */\n sessionOver?: boolean;\n /** The snapshot named a result but arrived inside the staleness window. */\n rejectedStale: boolean;\n /** For logging: 'draw' or `win-<pid>`. Only set when endMatch is true. */\n outcome?: string;\n}\n\nconst IGNORE: MatchStateUpdate = { endMatch: false, rejectedStale: false };\n\n/**\n * @param ph snapshot `d.ph` — winner pid, or PH_RUNNING/PH_DRAW\n * @param se snapshot `d.se` — 1 when the session is over\n * @param sincePlayingMs ms since the client entered 'playing'\n */\nexport function resolveMatchState(\n ph: unknown,\n se: unknown,\n sincePlayingMs: number,\n): MatchStateUpdate {\n // No result in this frame — nothing to decide.\n if (typeof ph !== 'number' || ph === PH_RUNNING) return IGNORE;\n\n if (sincePlayingMs < STALE_SNAPSHOT_WINDOW_MS) {\n return { endMatch: false, rejectedStale: true };\n }\n\n return {\n endMatch: true,\n rejectedStale: false,\n outcome: ph === PH_DRAW ? 'draw' : `win-${ph}`,\n ...(typeof se === 'number' ? { sessionOver: se === 1 } : {}),\n };\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAQyVJREFUeNrsfQmcHVWZ73eql3TSnXR39q2Tzp4gJAFHAREJg+IybKOoMDoSEHVmUNA34+j7zSJv9MlznIVRQFRUmDe+cRsFnEXGAZOgIzshC9mTTkKS3vdOr/ecd75T51R959Sp2/feXsGuUHT3vXXvrXvqX9/y/zYmhICpbWqbqC2YWoKpbQqAU9sUAKe2qW0ituKpJfBvG887t0r+2DxKb7dz1+497VOrmtzYb5oTIoGFoDLgwp+1egf9WOUYn0IHAtIAU+4IzDqzS6DWTQHwtQG0Wg0o3LdosG16lZz+dg1MBOi217IEfc0AUAJuiwbalnGSZOO9HSeA3CYBuXMKgBOvShFs18n9st9A8wlV+cMakA+/WiXkqwqAGnRbNeiWT5nw1vaS3B/UYKybAuDo2nIIuE+OJ+imT58BK5YtSy4YY7ktbPwC2LPv5fFetkc0EB+cAuDIbDqUdjeNKrDKpsNyCax58+bDwvnzoGz6dAm0GgWZRUuXSuCVERAxG1IsCa4kHpl5yrPaDDrbO6ClpUX9uW//fvXz8LFj0NPVDXv37R0LNX03SsbJKhUnHQAl8LZq4I3Yrlu3eg2sqK2F5cuXw5w5s2H16tXqcWGBhFnSjbEcwKf/lzP4nAfs97a3/v5+OHP6FLy8bz/UNzTAkSNHoO7E8dFY2ofkfudkA+KkAaCWeA8WqmZnV1XD+vXr4XVyr6lZCgsXL4nUJUtRo1SdMhconteq4+njHjHHsqnrPIBogXKgD06/IkEpJeZLu3aPVFJOKiBOOAC1Y3F3IRJviQTZW950CaxbvxYWLVocXlCmVSOQnw4ImA98HgAy9/dRAF+uoFOHpVwaITi8vHcvPP3sc7Br9y5oamkuFIifnGjvecIAqENdd8r9jrxAJ4F26SWXwKaNm6CqugoCRtUjs4ARgcABm/t4UspFyjQJoBSpybxCzjmfNPCxPBfPuWT19adhx45fws+feBzO9p7N10ZEaXj3bxQAJfiu0+o2J7K4TDoOl1x8Mbz18i1QKVUtsxwA255jaWrU+d0n9ViKeraOY5jB4Qe2DXrHLsyiivMFXPJpEf328p498Mi//ptU03l53hh52ToRanlcAZiv1KuurIJrrroKNm3aCGXTypIgsgDoAY7zGMtRMhYCPvtz8wOeeTjnSyGygTBU0Z0dnfAvP/4xPLF926SWhuMGQG3rodQbNh5bJYF39TvfCW94wxugqKgofDAIM8cS+WMBi1Rb6CMEftsrq7Ri9mMeT9g4ICyLdPOB36t6WX7CMHGJhB949AXqnwi96scff1xKxX+F3tzU8yNaGra/ZgCYq8pFVfuuK6+Et7zlLRHNUWwAqK6UQ30QwLHIBvR4rAnv0wOqFPDhQwIcu5AlocVYkrLxgS+hofNUyfR6CQJGC4j0GP1rR0cH/FhKxF/s2J7Lx7ykQbjzVQ9Azet9Z7jj3vLmS+Gdb78SplNVK38WWQDUXB29cFoVM/CpY/xf4AVhwLLYcYHjsTrqNRkNyQ5ES5K6ErAAUSgIAKuqZ0Ol1BgVs2ZGa3X27Fnok3tbWxt0dXRYAK0/cwbuve9rcOKVk7mo5C1jDcIxBaAE393D2Xuobj94ww2watUqB1jhhVOLmuZABLFUpNKJUSA6FIoXxK4tx7KALwEWP/gYS+pbCj5WgPSjQJwmtcWS5cthxowZWQ/NZDLQWF8PTQ0NkOGZ6PXbtm2H7/3wB1It9w73aTePZUhvzAAowYcnnTWM9vrzL4D3XHetUr3gI4uVBCwmWPNIwcghYX6Cmbn2me28gAMaQ+UklDZznI2A+R2QlGhIghQvEHihhA5gw7nnQWC0Qw4bAvHYkSNSIrZH0rP+9Bm47/77c5GGYwbCMQFgLuC78fr3Sifjt1KJMLxggVxoFhSZax2rXJe7CwICTJYw8in4KGUDHonlBSC1E7XUpS9PAJDZcs+y+9I84TwYmCU1y6B6zpyCrk1LUxOcqDsW24/y+j/40EOw7ckdEwLCUQegBB9mrfx9qqMhbbzbPvYxWLJ4EdVpXmoikOBDALrkbhB4VHIKDRMk4r0UGElplclwZehzLn/KHY8ZktJDSPWFDk8UoHAjKgSkKJmMPVZUXKyOKS0tSYVcwFIcEmH/gv8vLimB9a87d0TXCEF4/OhR67Fnn30W7v36/eMOwlEF4HAOx8L5C+CWD31I3b22rW5H+hmRbOgFC0iSzswT8WC+UBnz22NCgmooM6QAlxkakoDLyF04oDLAciUnS0o3n50aOUDhM0VFgQJmsQRlcUmxMi/sm4ANS/7NnjsPFi9dOuJrdUqq3fpTpy2v+uiRw/C3d/8D9Pb1jptjMmoA1DzftjSqBcF32x98LLT3WCLXxE8cawD6wmup0Q3np9CvGRwchIGBAeASbAPy91DqaIAEMewDxvwxYY8zE0nBIDYKAgv4zAssevMgIEukVCspLZXALPJCkF6h+QsWwvxFi0blmu1+4QXol2tCtzOnT8MX7rprOBBuHq2oSTBK4MMIx8PDgW8aUiy4nEiU6p3+bnaud7xQXHB9TMyDqZ1wXMI8Ti5XRkq3nrNnoaO9HZoaG6C9rQ36zvZIEPZrbk8fy0R4SpqokIpXfbb5G6LPwsdtHo5ZxqjQ70tIEsH1+XJzlvJw+rhQ6r2vrw+6OjvlObZDd89ZCYrByN7lsakGo20uzVu40LyxPicOCxcugD/77GdV3mTKVqmvNUwaAEKWNCq0+f5I2nzTSqcl2dO0e12IaNVZHpH6zFAGeuUFbG1pgdbmFpXkOeDc4QoxwiHTrM9n6dZ/JACFTcLQ9xKUnAmfC1/C1B5CkEVmREBMCmVvSuncq26cDjgrv4uQJkLgOFGjtVXPnm2TRPr8F0pgDgPCTZpim3gAaqfjWt9zCLo/uPVWKfmmRRLHhIjMtxX0ulGxFj0n4qNEfHQoDUJJghesva0VmluaoKu7Gwalmg1fxfWxNqaMJBFRyEpEb02lsPlJUCUfY2oHIpXM69WxjNnfCUwCrHBQrd+D0esfP49OEIbROqVk7OjoVJI7JJl7Rw2A08rKILna4bZAgvAPP3JrtpffoSNcEwdAXa9xZ9rzN1z/HliUo73C8qAm8BnktXok2JobG6Gzq1PZdWnSMpVyy5K5nOAUGcv6fkqauUkPZHdISeckTCDRzc4Ody6/q5KKHR3y+9Z7pPqI3IDUhdogve0P3vh7WTWfNr8mTAI+mGb3XfzGi2DD+g2RnadFBGhDSpoceqc2nSMjFBVCpYz8h2q2U9p1Lc3N0N3dE0odEUtPQcRdpB4F+UwRy1Wj6kUszkK1n8gTZImTs8CFUo9IbodiBOZeW1uoGm8w8b7MitwwZaehvXjkwMHRJ4RTbt63XHopnL9xczZ78MEJAaAWv5f5nY75cM1V74rUm3EquFKaEKk3Ck4KwBgkEKnQIalWlUPR1KTCR7Gq5IlAfPR5+jkuiCpnPvPPzSkRFk7M+bDoXSLlrpwWAxaC9ciR4fp3TswLpp0f5nyWhU3HG6cuVnNTAzQ1NI4YdD093crxoGaEcK4PnsHNWz8Ec6pnp73NtbqcYvwAqMWu1wgtLSmF30exLWDYRMpEmMnsxB5EIxwlXrMCXh95XthOgBCOcwDW+ySusOOIULUpKFiMVPTxIiIyDB0Y+bSciH86xzGwn2KuI2ScMWG+K4ND+16WnnPXiADYbIHYWX+I1xQdyY98+JbhNOG4SsDUGt1LLn6T9K6qPVeaSD1Hulhqmkiwrq4uaJTAwzRzc2caCcpFrE5BSyIj6RSlAMSpICQ3VcFU7saSzaGFDD0j31NRQ1QyG1PBSEkBzvcAh0Jy7wVC/ZCzMFRQ+JPr5225iyT6C888DcePHSvoAp7t6ZFStN6+/637hX4iQO2KlXDlW9+W9nbLdRBi7IloLf3qfLbfrJmz4DN//D8SFkUiEsFoGCoZQkPvr0N6f1xKvxIdwooTEDS5S4x05jHc3ffEzxHaUWCMEskkuhJ5pjHBbCIajBYVWWWZdjQkJtEZ0PQwO3bN7DXy1bG4CoLz2DYmXjwip1R6s8slQJbUDB8hQeftzKlTUC93eu1nzpoJi5bWQGVVVaSeTx0/AS1Y8KTB2dfXC3/1+S9Aa3tbGkFdm28ia3GB0s/reLz/3e/2sveGXmMeFRUpN70YCLweeXcq0ASBXiRGDHoR1/Wai2CiHkI42crhawMWOxoiZqEJIe1qzJhOMX8LI0bRdhNh9CTk80QUbRGER2QWAZPMQo2PDlW4AaH9HWLxJJhNUdGv2C8dk4P79sLRg/thZmUVlFdUwNx586GoOM6WwRxBNGVwFw4XW7N8GSxcYoO3vLwC1p5zjnT0umHvSy8pYh/ptHf/7nXwwHe+k+aQfDIbKzJiCZhN+i2vqYGP3HyLE4f1eFrMDUmFDyAB29bWLp2NQSLlAvmlS61YMQ11UYIWExSoRKLx46KAWS4psxIJ7GQCZknIIH7PKLzmk34sei/6OPPEjK1EVeZm8Dg3lnszU1vTOA2UN40Yg3iNK2ZWQGlpqRNBig+oqCiHczZmr5LA5IUDL78c3jLSrrj7K1+BA4cPeaWglIB50TL52oDXpUm/t265vGBjGDmu5uYWGFTgc+58Qk+k8VWo0oTjz+TLgbFcXu9JVBFi+CgF8we+o11YESKR8IKZc1Kur+DykUAId3RUkC/1HyNg9py5w67SnHnzlIqO3N6rr06lZfK1BfMFoFe8LpO2Q21tbUiLaMNZuffc5fvCFCftLajHWltb1Z5RKU/kOHI8vl9Gx4Q5oQeiu1ofE761zfGFfKJQu0X7aJqGO/FaQaI1gnPbISHfhQImlD6GZCLUCo24EE+EETfMin9zs/N4t2il0MEC631jmsesO4C9oxOHsXBuMQ3he0wvL8/pwi9CFa0/r7Z2BaxdvSYvjIwYgJrrWe6XfvnTQLhQjQ2NKnabbeNC5BIaGTZm7DPuh5OULNVI9GVcU8vOlzhgS6ZIZScpvwQr5dUCOvkB3PCid7FDHrWtpSW80SH/pIa58+dbX+Paq6/K5hFvGQsJ6BWt8+bMUQ2AgMZrhSfSS4TSwOAANEjwqfQoKu1oRoySAMKSQpzH1IqSFDReTCQmtXUsKQa2pIlJcC1JtISLM3Q4sb1sKQYWXQOW/cXJZ1kREkp981BD0POh3z9BVjqfxcnnWOvOqSTV31M/j2vaLrUNOi0hFy6UU5LrVjFzZrjGcuWx4RP248kHKwUDUDsf3hT7N110sRXQFxEXJ+xF00uJzkZjY7PKz7NDaGAnBlhcaKzyYshxi2S2JA4Jy8VcI3eyHojUEbbkoDyfSJMX9LpH6tEmrY0A5cJwiWCxj5T8ZWZP+xCwQ5KxBBeW5+xjcaJrom+Kro5O6OvtVefT3NhQsO1+7TXXpD11U64x4lxpmOvSoh7nrF8PMVMSRyeES2vIgzBLpampOea0EpQJzRwx9huqjKKIfrHYCDD0RfxaxizmJzpGWLYZoWaA0kMskY1VXFQMpdPK4LD0+p579hkF5JUrVsL5F7w+oVytzxTxZzIrVuxSQCzh6bp9iYQvhU0I+3E7QGSZLrEtGt9YXSqBY0h5wccOHYIVa9bkF7SSZ/m6DRtUgnGfP3n1ulwiJCMC4Hp50sgNRRKKkS/s5LChxMM4bmTP6ItCF5s5f4UA5NpmCqzPsV4pjI0nrAsZE822fRSYY3n4vubUBYtFYXFxCcybP0+VLz7xxONwuqEhOqdnXtgJ//Loo6qI/k1vuoRQjozwliIulo8kFNM3awjQgNy0wor72lebOQCN7Ej9Hdw0My+VYz0XqmZM0MVaFwQrOiMLFy/OCoL+vv745pGvL5XXfvPGjfDUM08XDMBheUAtStv8xPN7YIOUgCTS5THUmVa7jRbhytzqMW9JZcivYSEOSqKoN4unRDOKQji8nRVpiSoqA+I8BCQ6Eb5y5qxZ0uieB//7C5+HfQcPxZVyzDYL8MfalSvg1ltvtaMeqYVSzKMq9TlSsOgnkYgvKSmGZ555VmV1Iym8dGkNrFq9GipnzbTOw+YNiVmiH7fyGoWxDcOjUcIjzTJ77lxYtWatWm93O1F3HI4fPUwcpFD179u3D772zW+kwad6uMhILhLQ69Fgsum6dWsjUFFtwIiezEgJ1iClB6oum/UXrvIjV5eF3J5xPqTnxrFEExhwE91wpQURNEZdB8Zu0pnHRlJGMQgWeuPqF20VzJk/V1W13X777dDa3qEA6taJqOiHvp4Hjx6DXzzxC7j88sujcyDGguVJMxVFSVp5GUcITC+bBuXS4H/g/vvhqeeeV06ba8+tX7Mabnz/DcoxiEoKBDhOUkxQ20CkUlFY2UXtrW2wYNEiuQ7zYaZ8736pXk+dfAVeOXHCk6gAsGGEari4UPW7Vre7zRp3lOBramgKbb4RZJNzVdFfYtlZIs32ykoIs4QtQ+O4uPCHDh+Bb3/7AWiT4AujK0GiCg8/I6ygC4P1j2/fBhddfHHYXzphg9IPJDamoB0dYgqnurpacZ6f+tSnoEWCgYHdcInpdz4oz/OLX/oSXPSGN8DV2hkwN74YjmISyYS0fg3CWZWzJOBOyv0EcSyzvpnUkufBM9I+LgSAQaESEAEYkrI8Jp4juiTcW5pb1N3LhbDENhCqxUfyqn+apsC/sXTS1OlGx5DfrQRXQmkY75M51EaUR6jPFaXVkmU1EnyH4Stf/Qdok15iUBQoFejb46L5UH0OSmP+yR3bY5Uo4uyYkGrhlOKO/WtBiW8Bc+fMkQCohLu+8IUQfCzUBEyHIAPzt74xhoYysOO/fw333nuvascmCJHtrpHlqYNTcqAzfdAzRjWvrqlD3sfUGFeCxeRb4t/nb9qYF3ZyBqBOufeSzytXrqTSnlSWhf86tKsPJFohIjpCWFECEPTCQBzxINwbVwQq2HwcAMmmJpSL7fNGiQjhgtJ4qVBAQvDt27dfgu8rqkrNAA1LJovU70XKbgxtRwPEEASgQfHirl0wTapOTjOwCT1i15/Y/Cju2FxoulR53/2nf4Ijx09EMWnlRunPCe3QIDIL1A0gz+X4K6fgS3/zZTh48KBF38RrzfU68wTNZZ2b/IeFXL36urmpi8mbKNw2rFuXLTS3eSQS0ItgbJNrCo04DTXpEFtfb58EYLsNNKCp7yTT2JEYBiRAgBJKwUyczi9ibi06jseZ1eAQw06OaySp8EIuWbZMgu+ABb6iohB06mIHgSV5Au1Zh1JQJ0HIf61t7VBRMdMKAUaS3SopDf3jqDoBSSYJdKxQwyd//l8/j6MjxPkJO0XESRdGCgba6RmU0hCzVB5//L9sYjzJ1JCMZ+cYLfGwo9agrjuJyHXd2MiKQPKYa121YmVBUrAgAC6rWebEFElypjxRzF4GSkC7sVtwohBACdZksigeh7UgkfTTEYpItdEwVJQxQmPHPP5MHR/FC7ikpgb2798PX73HlnyBvrCBAVwQRJJH/a4dIgNEg5D9Bw7o782TMTVu33hULc6UahePqTt6FLowFc3p6hDnGZqMmyC6AYwUDPTPx554ArZtewJMXTJwHptJlkqlawJRVZ5Z+fb2Nrkmg14q3hSX0m3d2rXjB8BaqbIiNSLsoFFzU0soxUgeHTVkBTiSSSSiePHf3NYEaPNYHpywSVbhZh+DK/nCoD0CbGnNcjggAfOVe75qgw/VLQEiiy4ukT5aItLuB7hjzl0kHDi3i9qJxHfF8ozysMXasbrjWR0ognWSfBubA3hORfLnY4//ArZt3w7Jj6Pq315vwycKLdnwGmINDneKxlikgcCKe69auWp0Aaj5P6/9t1h6i9SOMmeOiaTKpffYOm4hUpxeTgqGjGNAjHaI7lyukiKNXRNJmkgiEkSTGC5YGTChMb90+TIJvn3w1XvvUardBh+LpVxk6zHrgtOftMnR7p0vQmnZNMfZcWK8Vi6VUDxfUVCUc5aEfS6kwJ2AEL/jY//1OOxQHa+IDSzAchZppWBsf/PonIekcxXGipM9gu0YuBRKy5dlswNrC5GAXuNx7uw5YfTDQ5W0tbbaYaFcUk7ySIhVnatIajqALz/Pn40S2loMapYvV6ryq/fdR2y+ogh8AXEyzEWNvd/AIpptScTgrLz58L0o18aEIOsg7Eo7+R+CzzxWW7vMzv5xVR9LVhzTz3dB+LPHJQh37EgUciXWyo3jkeexPAIdE/pC7km+xGMXYauPPLBUEADnzZ3jZK1oyqWlVV1QU7wTu/9E5XL7romKi7ggKiCmL2hJZ9RLBdWwsAuUIrXhy07R74MXaOmyUO3eI8GXoeCjIKM0C5FyAPQix04Azayub2yEkuKSyJniTpJCaMzzyNHi5JzxAcyzm1VRbhX5CccZS6az2kBMqONfPCFVe12i/45iJSA+v2i9uU2R4fXEbhMDOgzn5jiavEncli5eMvYArKqanWDSsW0Eql/hOiaC0ibCqhO2a4Jj7o8ayFSNG+cDU/ZjWoHcCGCnUQnSZAgvSs3yWjhw8ADc+zUDvqKIXmHU+YgkH1FvVqcru0MXba+G0gJbr1npWkC/D6VDMmpHb5MC622//daoIRMnwPXl69jRvTRJGMAPfvQjZZ9GEphza/0TlBenajq8GzqlZ6xyCYWdYGLVlqS3jdtSCABrszsgsQRuldLP9nppGpWIY4/CzqXjwlZH1EGx6Yx42fF9MLkymX0lrGwrc44ILAQfcmT3fe1+RaIqfq9I0y2GcHa9XUYkYKR2yU/TJzDi6hi0tLWFAKR8hSBGvrAjFbhjkoYKNWqS9/033ghLpSrLUHtYcCKZyI1N8sicTtfEPADoluD73g+/b8WMaeqciHPFPBZSeL54np3y+4lEwmz8fovT27AUZAN6ux5UVc6yJA+2iujr74uD3eYOBzspk4FNuVAdI0irDOEQniDsdmb4LAIQqMSM2n3YkgMLmmpql8MLLzwP9339ftWkOyKZqbdLqQzHuLdKPVkMPEY8YkESCxCAdqo/aXAkuBVREBpcPd1d1s30l5+7E+ZWV8fmjJbqJrnURyabRArfeeO5HjtxEv771/9t39CRE+cm0Lot80IVi9cZu++b70FLD1AHLVgwPzVLOi8AZksmnDWr0rqD21rbLKKV0zvDS0LbdIy6ONyxcyIKxiMlVXIC16nlNMJgS0p0lJZLm+pn//7v8K0HH1IODPV2IxuOBQmPlmVpG+w2qBbCniny66eeJrRSrHZVytOMcjh1+gw88sgjan/44YfhicefgLq6E5ZnWllZCffeex9cetGF0qYsJrZiEoQRFcJMqJlFA3sibx1CVbxtx5PQe7aXRJQcmjI6XyCmkh0UwAADrqWdHBE+X1o6DcpKp6WxKpvzSUbwHoxejiBplL1a+pnsSkaTQ03gnZLQtIicXFWjStwSDOYrq9BR/sH+ASgiw6W5/jhcyOqqSkXu/v3f/S0cOHIkUrlMSb6AELk60yVgpDySpSQuCGLy6+TXRIveMB0GwY1q1RyPLYlbpfr667/5Mpyqr0/Ur2z71S/h9Zs2wh2f+mPr8ds+cQf8jnQgvvzlv5bqvV1Ni2KMK7kR9ykM9EKRdm/C9pzxe6LExQ5ijzz6CLzvve+LJBinhCnNoKGkvgZl+Cvyg21qPglt8mQEBHZDO3a8zqs881HB/oNJVoaK92apJ2Cevny50DBMQDKWK5KZvSEvmLHoDgTakiWLVTLBF7/4RTh45GgEPqV2o1hu7GjQUV80q9v1GsEiLGj0mcJJwNHDB6GkpDSERhCG+tqlAf/5L3weTtc3xFEWsqNn/9RzL8DHP34bHDt2zIqWYO3FPffcC+esXRN7ppxbPKxw018YlYKUPwxg/+Ej0NnV5fVnvOCz0rzCH33SI+43Zpew4yQziFDIRagF+Ry8FL0cLZIxAwTtv0S2BIbNKHXC7ZCcoV24h2KJaRnwtu0VRE3g32FRU2iYz5gxXSVq/uQnP4Gv3nMPdMhFNt3qI3uvKIiJZu0lMrDbeeSWN+aq6/giq2iIzkLBUkZUS38nJTGmv9NEVRNbNg4OArFV3tB3/q874cknn3RKkgT8xec+p0GYsYqvoqIjk+8o7LxMBsyJojD4/g9/oDNZ/DebiWSBU9RlbFJ05LCdsAqPagfLqOnF6VRM1UhS8hOp3diRlHJCyUEsNhkd1WEYNU27QMk/yitmwunTpxSokxOJ0iaf40iEYlXXUHe8G+79+tcjMtikS8UxU83z0Rgu+EoicyHGnTR5uzpApaqX644EP/ze96BZqt9Ac4ZAslzi2hBjf4RJBffd/zU4ffKE8ohpNsFf/OVfwuf/6q9UlrYIQkNZlRQ4rUbcc7NpGgFnGsLs6vIZ5RadFlEwZCkiO5Pb8XZ0BLHBEbYByXHLywb08jbz583XEYmMahUrrBR721YKnyIqignSRSDcSqaVyDtmMTz77DPwq58+qpqKWw1+aMa0Owga3ClaoUTB1P0YeHH+nh1Kg0Safd4bucrUdkTSFzveV2GTH7kIONGcOa09mN3dnNSthOslbx945N/+XdmRN3zgA5aK/LM//4uwVODQIQhEoKRVENhSWOQQxvvZY4/Bu6/7XSsuzLnjXOguY8xKcjW2IygQl02frm54Q9esXLEiLwmYV2eEMkzB0jHfcKALEJ6Pe2ta3WwXoz4XLloovdRa+Mfv/hP85y9+ISVXn0WNqN+1CsXxBThTA3cEmJqzUVwcP4a/m7+LtdrV4TUXfLFYYL5w8bC7xY9RCUFT6uVFMSvQ19+foErseSc0pEfy/DCe+8QT8KsnfxlFiswJfPz225WjFSU8ZDW2bf7SmA/7Dx22kzS4XVNiqBfm5BWCNpFAl0pgd//Yg+d538d5OSEYOMcPMqx6IigNiRZ5MZNvmnir1g7LYYm0J7/7/74LJ0+dcri4IgK+ILLhDKhMkmj0nPU8jevG7xlTLeDYeyPZGFHftiStrK621JpfGvmSCyAmvQOmkgH+r7xBD0tpR29rpMJuufnDCjQZTlqggJ8fTPTS0X8/9dSv44J/6nzxGNCc5PzRjCVDkWGb5AF1k4VPVCJPnAevnAZAb7ukRQsWqFCYMrR9Vfw0S8VNOddfEGsO5s2fD889+6z0Uo9E6iiIcu0YyUIJLOfBxGppuryJZhQFTsYy4fgClj4SrCAb2Gk4GXuQDDpVSnt8c1bOmhU3voSYlBbe+H9ykGKXXOvvPPSgGiBDbdDNmzfBmy98oxMvB6shpo09O30M12TXnj2KrHe7UkSdFGhIkIcdESKSXZO1TGW/d0Sx/VkzZ46KBEzdVJvcYRwUi30mXQqK5JfGsaz497PPP0fy2eIkgKKUOgwl5TSPl8jb07+zImLzBQR4zOftjoIMZIlpriqhlGZ1r8WCb5KQ6tJJ4JDosXoOIrV5/ORJePGFF6BDOX48klI3fuCDUCG9f+FGXZxUKXrrUb8OucUOnekiHFVuUSx0WJBRcTyuskMuWLX7AAH5tp0J8r37z6qkA1vNcifLhfZHoSp6ljTM0WvFc29sbs6SZEmBScJgEVADUpxjh8kiI59EBmy7bWS7y0/SRAHjgaJUNn+/+73vgzmokoH2v/FXmvlHy4b7Yz//T1XYr0Y0aLsTtclvX7YlIb2spCvKRjA7jwa3Qwf2W7UynCTPcpPpQiIlcTFTWE4qDDmtpWC2CjpfhC1IKURKbBUzwjShs2rAsaf/c6RiuN3ijHhOyjPUiahtisQmfBowb7JlwOzaB0YSAwJIvo4OsGajPFnIk+yYzFIRZuImj0yRm7feokJqcXEW3W3vgTFIOii65mTnzp1qwCCNM7/nfe9VKWDCqQVOc9zBymME2LtvP5QSNRwmAGfsWK82Imh7OAFxHB6PwkygQT1MZ8G8eTlTMUGumQuzpC3T092T7iFyAa43IqwgN7Z9LSeXjKWQpVQqBimPx4Z6nBSQxumN9p52gUmNbV+vpR3OPe9c+PM/+3NlQ3PCGIAAq9egbYMleG94WtrNmHGOJDBd+3PXr4sBBL7sa5EMgeoPOHXmtCpABytb2s52yTiZPFw4wkV/Xldnt3q+LH3E18hUcFj9nn5x4kXnTjaLbvdfNs3KIYv5OPBncVBPMXDT0GHSbJbpK89rx47t0CpNDLo2GFK7667/A2/bcllUv5uJCoZo00uWSqdgKA9Tq5qwzQl578uvuAI8vSfT+UuihjFC0yptS66lMSfDC0F36GfgRkScRqL6uZ6zPaoNSz6GYF4A7O8fGIYnEwngWbXAVpq+a6M4Y1CZPTMoX75uzHenzZpbZIUjxML6Wltdf/Cmm+Cad73LLsonuZS2W8wsjxiXZNfOF1USKxaim/feuHEjVJTPsM9IWCxgsl83uYlbVUZTfBOYcGpGOxuubU9LMsNMndi+7urqGhsnBBcMvR0xzD+zBtQxcVga7UAxK5JAG3bTgZRsMok6V5iIOGMnhkq4DsWlpXDyWF08d5esA9ptF2w8zyoZiGmrRCtLYs0y2HfwgArxqVAoxPHZNRiB4K4z4hZEeawTue3ZvUtqpzIrzm5QbEwGcJqIxmqYA5BmSD2KBeCjD8BBbJCTg2igSY60f7KvJDEirRnJT4VoGNCoea6jvgNtumn/rmDIwwgCNl0/eugwNNTX27epfMHWm9ExKSK0SXab06zYqTMNMKuqUkUgMioxVyeK1CyNO72C3RQ0GhDG7IwXEVFrveFgcJOgwHU9MeckbZ9bNcXgqmV9PJ7T4MDgGNEwee6WFExYBsLvWOaTEzBhRh8AWPS6CxabM2tuaoQjBw/G2SMYMZAgev3mzXbiJ/gaUCVb7B+TkjXMy+uI3m/1mnXZx4VZXjaz8mobm5vUsJuMWywGIdXCXRrLXFvzFTltBZLfpcuPiM7RQKITwq0u8kIkK7tY0iZhk1z1phMctsmSUXsILmzuWH/qFSuE+fZ3vNNas+hCCqcLrDO7BkNfXM9JNu93nlTpFlkMwhkOLmi338hmMK0JUa2HtErGiu+DiYKQlCtaPAbc7juYpanxaBDR+e+uFLQC+WncmhgL+mSUdxoVADc8J6xqQAPG1rYOaaR3Rzdh7YpaKDfOg6dthz1cJv6s3bt2wYwZM5R9KZy8S8pIWCB0eEt6jTBBtaSkJCKYTQN0oIQ02JRaVOGo+UGrDHUsQ3H5RE0S/0TSCrZbaQhvQsPk84CTE8btLvoxD2oNVpQSo0nag1GVnNxnVlREdhs40+Q9Q1yj/BQENfKy9KnFCxY4bTjImlq9r+337uru0VI7LfojoucjKceF0z5F5NaIoGAACihYSqhezFYc1FEVZGlYoZ813tIP7OLx5I3FibqKC5Mwhy4sKw2PWzh/XrLrPfgziyjkp0sJmN1xAXCzJpIcdwx4M84LzPxO6k3rnoPqcZMapj1wsGpCcqnByC0h1e+A5O0YiKhu1m3VFrUUp9EAEQ/rc1vZTi4nJMkvuR0ZjOQLm7HbNxh6nRVa8mEnVmZ4tUAkw4fCucBkHblOjcOkUOsaGWpBrzFzJ7qL2B40qbAlpaVWaDC6RhYlY96CR44JpPRqHHUA5j+B2rJ9SRXXJPdwRwujZOANc1YRZ7eV6xFZmLDK9SCKCDApq05bj5hIBeYMwvQQCF1d3cNnKaVGEh0TSdgq1Q67+ZycuBQ3H9FRnN+NXyByWExAx3M8SF2rVenPol51k5mFsdRjJNtiCR8RuMASznJJpO4AmlpabNtMML8tTUwX7M+T0euZidQjpoJ1q9Q0KoUYsbKoBuKkLcdiE6N2AUj+5HRqFAElA5FoPjomKnhEksuahxuLdjtVX0QzNFhYqz5G2SyjAUAPcWylWfkzU0w0o1ina/3sP/5DkbaYdmZmh4Q3qztywXYK5i1YGNEkmFAKSpW3pUwM5VbxF/eklSXsfKfMIErXF3YbZQZgCRFTKwJjJgFHIpXo6FXmmCMkrMNEEAefmJi8ItCVhNQfjhquc8r+quMwV3CGtP9Qouz45ZOJMsJ4xAO1kcFqvLThnA3QhelsPHQecNv/8j4y1tWeJWANUBRJyVpaUqJrvLlVY0wLkURiXBpYYyGEKMy8ygOADMQI8WBOMpM6fI1ZIxfMKINX48adYTBmq1TteAF+9atfwukz9dGAHMu7psQxAOmuBVAhbceqyipoqm+AIl2jg0ft3bsHhIcTT5p/bscxgIVSBQPEjY/oC90hjVTd0jnHFIBirCTgSL0HvCgBHU0v7LYOQs/eEIF2oAO798qkEoF2GzBrDIVIyYvCgimM2aK6/Ocf/CDKx4guaOT92xc/moks12epHqfVPzCgJJc59gy2/KC0kFbpjNn0F50Oan6fXlZmo5X2AEzcDMlhNVYqP/CxkYBiFNwCE1tkeuV5NCUyDF1hcZF6TA8vMj/j2uDJAUTa1iwxvVzEPaKtrBB5Ny2vqYH2jk646667VNZIXCrpMXMEaUdKkiBwKAy2SsPU/Nmq+i48rO7ESVVJmE1l2I0v45tm+YqVKqXeN0XJpve4o3rjiEnkjIj8nNXivNAzYh1Mwexky2CFv+ogzkNjPAhir9A03xHCW9g2/sBMhrZo7iM26Ok3bUuw0EoCY9myGtj78suqLUaP7oRPnYNwuqa+mLRvH8lEwbT+t7/jHWrCPEpEzIrBxx95+CcJZ5tpKShEkru0HSiAiy66EI5jg3QP9WKzFHbwIKKY3FFhY0fDjNwusq6hiOtZVShKgo/xIGzhwXnUSsK0fIqbb7HEtHDmJLSOrQSk3iDEHVr1XrNsWVjso8syl0rJ981vfB1e3L3bGq6YkHwinvhJwQdaQ5y7fr16T0zJLyouCaMh8t/zL74I9qhZc24M3CwdOkwbdyNFz/acjRJL7fdIhhmtHtPC/sx8qbriCVNjYI+KCtQiYyUch4wuOBJaVTOrFQeLhwW6ZCOLx6MyNnZgtOw9EB4bSagOUlXy4q5YuQIe+MY34IVdu6xqN0o52TyisC46TVq96upr1HOYdTxnzmz12Injx1Wvl7DvjZFOiVGOdsZ1NCVH3ixLFutmAz1RZwMq6XjCuxW6DZ6vzFTk7Sv4AFjnO7DX1H2O0rZg/jxoxOHVKgM3VL8B43roNIu7QTIXgI6rx+LeM6ZHYchP6deavn6jCsRkRonbU7m0tARWrFgBdcfq4FfPPBN3xnI1CvNFFGIHwaTuny9tP+wo0drSotKxqufMVcf+8Ec/jEFNgSyYI13B6qdtpODmzReoyVZDJLk1kvLCloKxo+Hvum+I7WYzLcHZdu3es21YAMqD6jaed27ixaoNr1aLI6VhcFtZuxLqGxrV74EI/8exCk4w3fbWbuhjFpl51CztzGW/Ltn3bzSAaPXAtozbmFtbvrxW/fz5fz4WOlqUD4TQ+QJmmjixJNVBGAJMlfq9D/6+8oJx4nxlVRVMKy2F3bt2w4FDh6P5x2ZULZ3KaZk7pvup9qhLpRq/8MIL1SxitwejkcQ8MZHdBl/c1SN87wzPzwvOKx3LvUvy3Tra4rnXl265XNWzhj0F42mYPNozOqEzo8Y/ZHRb3gzXe2YobO4tdzyv8Dmu/s6Q98mQqZhWk+8R7Fb9BmkgrjqELligkgNKdSOnuhMndDoUSxa3k2whIHPbaG0G/v7ua65Rthq2ruvu6oTFSxarF/7oX35EtIWtGVxKKC4DjTNdVtYuV++jCpyAk/qOuB8gTZiN65F5bLcLEYFPqNj04NgBcECnERW6YyqSMT9wsN+1114bpfpwDTYFoGiXIBuif2dUN1GzD8rnh+hz+m8DYNXMkYddnISwR5cWGte2x4GJBFFleiVzq3ZEJD47bvhIdrIW5vd1a9bAW6+8Uj1/5MgRmDtvngL3t7/1gLL9GPjIenc0rb+u48I3Xhg6Ne1t1ohbDnFKvpkDk2gkymmjUdAjXBEj+QEwzQnpQNI+8bX0wgRBYWoMhxguWloT/b1J2h+4SNisG/sX064H0UKy3AZQm/6A+FjozJhegMKacKmOFLQJECvA/ktSGhRYqluUIElnAhzHyZ0TL5LOjdznzJ4Nn/70p8MLotO2sKvY3t171CR1xtxySx09AmdULa2Q011sMaJy4UUXQatU6UODGSeObI+A8HnGlCvkImY5enRyq2c7ng8Ad4KnnVZ7Z6eyR0pYYc5zr/S0sJywsipuEbJx0/lQu2oNPP/0r+HQoUOK4S+E40Ppim1DTGNKITT4AqY4xgBMiw+war9ZAV2zEgVE5Cd2h0KTANUlZqbMmzsXTp0+Le3b2CaN6czk6CwjoebMngP/8zOfVb9jO+QTdcdh/TkbYM+e3fD1bz5g27jWjSSi/q1WeQC3h1S/5c2XqN9bpMNA7Tyaim9nugD4+3XHAQqsnDzbdzZt2epGhYZBFr6kuHD25tjhw3Dupk1QrMJI4TarogIuv+JtaqcOhpGElsB1ABmQx3/66MOqfQUCIOyYxRUQg0DNSwqlkGlshJJCJ6Hk1R6a3O0Rn0akBvJ+URdRaQK84+3vhBdeeil+a40+AXYMmFI4s6sl+D77WZg9u1odcfLESUXnnJZA/vZDD6lyz7DZJrO864SEjRszRgVEykSQ1+/Nb75UtdrrwO77bo0OOpvGwfB4uybJIs7QCs0GTLTlmTF0QkCHmIZIeWG+O6qnfXv2ZDdWhaU4wi5MJCZqTWCKPDEBV19zHfzppz8DNUuWKPuR2o64MGrn+iexCTlpeTZsNr4189g8zi06RhUe6ffG2O/m886L8gN9tl5GX0A8Zv3adfDlL31JNXLC586cPiPtvrlQh+Ma/vZvVAZ0PE09xe4jnWgFT07svEAKAExoaG1u0fP9IB7HwLleU2FNIrXbcYQNmPBGH5BSD38qR1Db6ylbez4A3OZVob3hPNzBoUEYSU0FquKXnn8emhubSBWWs3MRF8GQtmEcTFuweKGBVHJVSBX4h7d9Ai65+GLVU9ACIfGOqfNDR5Zmc07cLgN2+7nwuy2R4Edbl1a4feQjH4X10pmIAGGdRwhC1Co3XH89/Mmf/En03dpaWqC8ohyefurX8LVvfkOu+1CCe3dvBnuGHo8Hdmvwl8+YAR+6aas6/JVTp0LwC+20CZGYpm7WVTmJcg2xlwzGoVF6ZnQXLXx/1Ix4Ht1nU23AnSNWweHAaKG8Tc5LSM/l/De8Y44cPCBtm2PKs6uYVZkupsntTm1C8+nYEjcalqMfu+rqa2Ht2vXw/R9+P2wpTFLKme7qbTrom6EzQTRQLEuSgGXQ01FW4e9YLokOA7a6MLUauN3+idvhmaefhm07dsCxE7E5VFFeAeeecw5ce+11KlULp1KyoiJ1k+I6f+8fvwcvSY1hGniaMF4824TZySLCn8RqgPgu9KglmFqam8OJBB6Oz3i9plNC5D2naCv8NzA4UFDVRnE+4hIXJKJkJOKn6WTIkWzYU+4MFmyrou0sG/OT0LhhTHRZ7YoQiBFoAdasWwt33PEp+Np996hhMWqpArQGdcuyyI4Kwo4ahlITfnvQSmkSdpWcudALFi5SkyWPHj0KGySw6PaGN74R3njhhdm/pjZ4d0u78cc//ak1OYA2GRLU8HOI7Cju7jSPX7hgIVx2+W+rdThx8mTIsw5xfTx3vpffrkx68qCkoukr3d2TnwQM8jm4R/WG1lMeh4Y8HZ7GcKefxW3Dsld+6QN790Kd9KLjxIdwjbDu9k8/8z9h9cqV1lTKjEV6x8MD02pjk63JYlXFiepetGixsm+x49TB/fuTNiQXqTtKeuQQ/+3RR+Ef//mfw5StBBPA3Mid1WswksycDrPhSsV/4MYPqA5nJ+pOqIQG7NaAqhR3szZ0BjTnIm6kyUWiB2SEBSlEjNlAhdRIbMDh41A4TduhTMY+D8/pS+dMdGxsqIfdLzwPPZ2dsd2owXvzLbfCSglCNCPQWEaCm+sIS0hac92vz7bRYpI4dlTMhTHqyXiXOC5CXYSh0DZqkkb+wQP71TxlOhnKaxdL+xrP5eCBA/D49m0kfu3mWREKJ9GdwXaquPldPnv5ZZfB4sWLlKp85ZVXINGyzCXo3V7T7sgNveY4sitD5g/39ORHwwS5Bo1xwxYOdNmGMmGYbLy7UyUcAgJQ7GGNXnaTdHCiRjr6fG/58Edg9aqVcThPR0sy3A4F0rFjcX1HcrSYKxVnV1UrUHbr4d34Ho2NzfD88y9A3bFj4UwNCEsScMcbuFGe5y6pbtGkQefq0X/9qQKJ3TOHtKzzdpdIj7Tg42tXrYK3XfkOpRVOSfCpXEWefA0QhyXRZdWTeIGvV44RcRTTJCDmGIwKD4hSQ2Xe6g0XcUZZ2bhLQuqQ0FFhuCEFc1Q6OBmpWhboIcpCP48g/NYD34DDR46A1Y2BhVxhoIlBddEFsxqdCyATxgm3ZjoflHpsYqHnG5+SHifunrQKmDt3jgpN4nvjpKUEwWKqCplTLA50FJpdumluJIwhf/Rjf6iO65YC5PQrp7znmC2LSqTwgf2oesloL9WQM48oyHAqeLvvwbO9Z8HtejWQZwB69FWy8KrkuiOH4djhQ9oejBfvlls/KiXhqlAdoxpGDksnMkS0DJGKRloKi7bh1gA/VS4pgdSmZ+h556hYXB2P9oVSNeJ7PPfcM9CfupZJz1Y4w7xj+y0G38el962YC/m+mCQba2230aTTbt5ZS2r2qIJ4ZTsOWeDMpNt/dYUkpHqNxv6BQSh3XHJUGWZ+x8RsTEvBZL5gw5l6BbSVa9dFyZR44NZbPgIPfusbcEh6q6ZQKhq6puPHShKSUjPhSEEXENOiLqPCG7rznznAjPIKWw0y5mnVC457LhIhMU4cNixY+qPbPqFoHgTlUXkj9ukZLyJdxnmbNPo8Yezo4BYodaR0ZkhzaoeTgDv9APQ7Hv0ShBNXxesW0NhUQktTExyVdz9VWbhv/fBHQ+/Y9YbJT0E9QeJwCEJgGzsMx9l2tnd4KpXSNyTOaUNInX/v0D3cI40ce1VJ6HCvlrboh37/pmhq0Wlp9zVLhyjZ+tdtNefYlZ71FFrguM6KEkQD/XlLwGwArEtzRHwBDgxv9eu7YuJ2TnrY2d4yRieO7N+nzjPD9egBeeG23nyrBOEq7Q1zK2KS8dE1po2tgNjb1EBcsXqtujgRjZFJUj1e6kov4+YLfivuPEoiMy41ZEJ44e8Zkr6Fs1iqleRbLSU+fsfGxkY4rjqqcmcXjiMS01CcJ1WvuUlQ7aqoB7edFZHdAx49CTiQhXrJ6OTQCd3IiCm3Fx6y/8cOHSBeW+hDbL3l1tA7zmSspFjBY0nDScNuOzkzzlqeKR0J2rU0IV18XKDDu61dvcYaxyU8qh4cIBo7dFlNDdx22+3h3A/kbbu74DhxttI1h0/aiYRgFKpRfX9qVKSndxQBKN3mFBXcn5V6QSM6MwHUTBpxzUkYCvfmZikJ0RgXMVmLkuJDW2+FVVISDnnixpxKDpcn1I9hd4EwI6Q/xYD37WFXecqxveNdv2OPO+PcOtfkDRIC9Q0XXAB/9PHbpUqvUO+D0Zh9u3eH0ipFfQ8n7QShoRDkvQp83Nt4NMt4huMSS+2FZsO85E9K6M0qgfoGBvJq1T/W0tClElpbmqCpoT5x3E2ojletjlWx2UmGtbK1hG2T4cW56KKLdWgxn+ItoTzwHnLxFi9ZAm+74orYvnP2jJHGqtwgjD3f8P4b4D3vvSECS1dHJxx8ea/2Sj1jdYUvgyZhBlpdbsOaoIw3N1dJv76+vKVfLgD0vrhL3bVZ8l2UJBxIzL2YsN1jc9UdPQyNZ04njvvQ1g/DJRe9ySP93NBZTMksmLcANm5+PbRhcifJzOFiuKkq4b8z0kngGRHtl1/xdrjmqqtV+IwnIjPxPL7zXvc6uOOTfwyb5GcbYDXWn4GXd78UhkppBSaAR3K5vTZJ6w6SU4i2vcrzc4MnZG27u1Ml4LZCkhHoi29KALC7GxamD6TThLVQIhunrE+Wzi6uXDp+7IjKCFmyrNYisq9851UwrWya6l41SEoFfBwk0h3vuf79CpBtOJ7LmhqevaGTecsWaRYsqllmZc9cdMml8LqNm+HJbU/AoSOHw3JMeS6YUIBZ1pddfgUsXrwkytHE7dTxOjhz+hTA8GRLKrnvs/mHTI6fEKnkdGcBFEzIeGUfr4nTDV/0PXf+eRtzy3gNAijDCMEkbHNlzqh6zjxYuWZdIt3ryKGD8OhPfwKt7W2e9CyAmeXlcP3174NVa9YrYnbPi89lS8jMuk2fXg7rX3eu6niQ74YRn8MH9kk7rDM3syQNkA4WkHJT9rznGPoY3sT75Fql+BKsYABqEKIBmUjWW7tyZdRmdlgQskBJwsm6Ieiw0HvlqrVOzXtooeze9SJsf3I7NDQ0qL9nV8+GDes3wCWXbok8zjMnpPQ5cyov4Ltb2Yz8QdgmpSeaE7kAP59KQOVsDmXSw3Zka25phZOnvd99uwTglpGoYKOGr02ESTq7pAGcGwAx6xY7K2CsdOKiJdkvDKpBTE9avW6DBIBeFq1Ozzl3E5y7cXPKazl0S/Vz6vQrOQKNpapCTKTYvfNFqF25GmZVVWcHiFzPk3VHoaO9zSvPRA4SMG0t0H7PZHh2aUm2lpROCHJ7eLi1zwWAD/sAiFVo+Wxcp29NkzYTTWaYTFt3dyfs37tLAmANlGvJFp0/6T1Ly1IRfIf3701eWJYGNJFVCmJu3SH5ftOnz4DZc+epMJ0BI/J6vXLd29tbFfDE8HdWfnYxMhjocHA+LOii85V26dm+3oIckHwkYPJulR+KBmpJSUlekgYdEzTci4uLJyUIMS/v4P49sGTpMpgzf2Fkx9qEe3hp2lqa4ISUQj71x4bxPoa7uDh7t+dET142XS6OV7rTmFEcbr5F+x2dndn4v50jBqDuFYN84CZfWA6Lp/PdVO4bNtguKYXJ2IccAXXi+DEVOZkjPc6KWVUq0SCUUAPQ3dEm7cF6PcA7vwvPcpRMI/Hu891Uw8sCM5paSbuVfNVvrhLQSMEEAJvwAlVXF3aRh4agl2ekNCxVmTSTceuRKhn3bM5Lvn732CVs5PfOpuJtQAUNCvPcUV1nUb8PjiYA8c3uSBjC0lg1XF9BS8ZDmwPVcWlJCbzaNp+qyg5KMWnONSyxHCx89gvEM04KVb/KvMnlIP1m3rBcc/pJ5LxhAgN6yYVyaJMNlMmkURi/MXZZyhiMM4g3PTqEIwEfOiqd6fHfu3N9n3w8AZSCf5+wAaQ3hi3JioqCEV845J6wpQZKQ/Zqnc/glXuTY96JSqUaGp3s9ebWlmwVcA/m+j5BngD080AqDX10RqGiFERpOBhNlJzaRgw8vaahyh2Na8RVxV/K9lC27JeCAajf9CGvLSBPJlSfo6dLsNMShnjC5MfJPDx48u7KtOntU5nKvin2he7YgjeT7rjcnc/NkS8Zdyd4khPwZFAVz509Z9RVF961KA3RUcFxB8FrSDWPkRGqJN5YaRAUCA1NjWlPb8/V+ShEBZvazkd8z9U3NqqTGyvDHt+7T6uRSZFrOMk2dC5wbZCVGKl3m207VV8/nIDKayskHIEfcm3aya2oqRnThVYllHJHJwVjtsVFRfCbKhMFxGUQFHBjtR4tUst193Rns/225fueebuuWsR6bUE8uWYdoxzrnWupiMY1UgqDmQyMM+MxYfuQDpsZx4KPQ+Jvb38fNDQ2pcGioxDpV6gENFLwOvCkaWGrifKy6eOafmX6/6EBgIkOGLstDorgtWIuhuMP4hYiMM7sAH7uqTP1WR2PtNYbw22sUFth43nnIgg/53tuugQgDuab6BCb6ReNe9GrCJCmtYaZHDDRdBTm+mUhnV+S4Ntc8DUayZeTIER1vMn3HBZF1+jRopNnCxtSYoKsAeZEE95WlZ3+HWDy8J+n6xugraM9m+rdkq/nOxoq2GxbIUxUSKhivGNOS6dk0YKFk8psx1SqjDPTNtCt843EpulXI02gpR67+T2jQcb55CbazzTUS/B1ZDvkkyMB34gloJaCCMLvpD1fXVk5yUA4sm04QL5WKKIcwIde79YR66TRsC8kCB8ED0FNQbhg3vxJmY4/tSVvoNMNDVKDZS1wGpHdN+oA1CBEVXxZ2vPTp5XB0sWLoLi4ZOoqT9IN639fOXMmbDieBXza7msfjc8cTZF0HaSkbOGGPNLR4yeyNbGe2iZww4SSoyeOjyv4RlUCailYBSnZ05aHXFEBC+cvmFLJk2DDNiuNzc1KQAyzjTr4Rh2A+YAQebl5c+ZAVWXlFAomYMPwHWa1tHd25HI4dsu9brTBNyYAzNUxMRvWhGBhE0rFqW0cgJcZgpbWtlyBN2re7rgDUIPwk+DJok4DYuWsmdJjrnpNZUNPlg1nvHRIz7Yr93puRCjyfA+O5XmxsQ7z6P4yWKK3PNfX4HCZypmz1Fyzqa3wbWBgUIEOk0TyLLtElbu10PjupAIgsQvvBE9l3XB24owZ09VwZYwvT9Zi9smyYYcuzJBBx6Irf9AZqXenBN7d43XObDwD3Voa4pe7rJDXl00rg/Lp06F0WilMK53mncvxm+VIDKq63rO9fWpYd9/wnmxWW0+r3Pbx/A5sIjItJBC3aIl42UjfC9U0grG4pBjK8Gdx0WuO7EbJpnIeJeBwenpvnwRbX3+29Kh8gXfneKjbSQPAsQBi0qkpUX1rsMuoAWTZtFJV9onbZAFqH2lt2zfQH3XWxxJVrD4boVTLpmofnkjgTQoAEiDWoviHMLtmwojBsXZ6xhBQuW4vaRPo4fFWtZMagA4YMaRn9imWenRA96AGXd1kOzk2mYu/NRi36H3TFJZyVq/btIrdNhlB96oBoAPGKg3EzfrnZVNYiyTcTr1vG2mC6BQA87cdN+u9Vu+XvYaB1q6lG0q1ukLKIKcAOL4eNmhwVunft5BDNk8SG9MACwyw9O8GXDsni8MwBcDxA+1Ybe2vNhU5BcCp7TW9TWWETm1TAJzapgA4tU1tE7L9fwEGAGI1hAl+gs1zAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAAAAAAAAQCEeRdzAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAE7SURBVHic7ZuxDcJAFEP/DBSZgAVYAGgYgSpL0KSCMZgDiQkYgiIDBFFSUdF8ziGKlCKiO0f5tvQKqGzrUpAzZpIkSZIkSUnN2opElagTPjPqLlsxFr6cgMlclJHDD0tofseebYZFgQLwXPhja/7am38O5n6aJ8iGjMjaFVChgPq545vLytEcmZHd0Aa+oJsigOyGI8E2wgLZbc7P/D+Q3dgm2KiA/sN54X5bud838wYZkXVQwGXJN5YbZG4LQBtsMyxSdgtx7MdI2Y1ugowKYBtgowL8ffXIqAC2ATYqgG2AjQpgG2CjAtgG2KgAtgE2+i3ANsBGBbANsNE7Qb0VDn8voJsh/v3cNO4Gg6J9QPiFSLsRmoCZ7By7jVC/Egs2lOpXYtoJRl+Kht8KBx1MD8Pr/wKSJEmSFFJfdobRUx2lMHUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAAAAAAAAQCEeRdzAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAHxSURBVHic7Zu9SsRAEIDXSrARkXCFb3DgC4h4aCOCloKt2MkJgs0V+gC+gBCsrkzplT6DnUJKCwXFQxu10GbcgQtE2TXZkL3sZGbga3Obj9nZn8wpJSEhISEhIcE2HtYUEOBTk2oSzYlmVbPASYCNsaav6XAVkGek6XIWkJE4ZQScKgiegYLvYwUfBwpedxU8beoX7RWK2GuPAAvv+xMZdglDzWxrBWR8HSl43rJKwNVjvtUC8hnxuG6UMLZKaHrQPrBMi9Q4HZoerC9ets01gY2AfyT8Xh3gtgfBcrMCcL0MMFwCOJ+rczp0aAgwEUcAZzNOEgyFMaErIMsMh4zA1cGQBV26AjIuFktLMOwTRvQFOEjAzZKxFjT+AnVQcjoYCmK/HQKwJpQojIZaMG6HACSOSmXB31OkPmNeQTC8XQLcHwLcbVSTUGEahCUgT7rjpRbgfQINAYhrJuCOsUAAXqrQEYDTwUUAbpsLBODNEh0BWBNcV4OiOjCgJADxUAjpCGCfAexrAOtVgOU+oJGdYJUfCpE4qngWaHrgdcD+NMj6PoD1jRDbO0HWt8JxxOi7wFS+DFV4KBXKfRsMYKBTfHkeX4fZ9gew7RBh2yPEp0vMZ59gwUMo4tYpGsCA64JlrzCbbnF//xeQkJCQkJDgGz+iEXGyPHkPEAAAAABJRU5ErkJggg==\"","/**\n * Leaderboard/match-history data model and the derivations over it.\n *\n * Extracted from LeaderboardModal.tsx (2026-08-17). These are pure and were\n * previously unreachable by any test because they lived inside a modal\n * component — which matters here more than usual, because both encode\n * non-obvious rules that read like bugs to anyone who has not seen the\n * comments:\n *\n * - `bestMultiTier` deliberately IGNORES the `best_multi_kill` aggregate\n * column, because that column is round-level and `writeMatch` attributes it\n * to every participant of the round. It derives the tier from the per-player\n * per-tier counters instead. A well-meaning \"simplification\" back to the\n * aggregate column would silently over-credit every player in a match.\n * - `groupBySession` DROPS sessions with no `session_over` round, per operator\n * spec: a game that never concluded should not claim stats.\n */\n\nexport interface AggregateRow {\n owner5?: string;\n display_name?: string | null;\n elo?: number;\n last_sprite?: string | null;\n matches_played?: number;\n matches_won?: number;\n sessions_won?: number;\n draws?: number;\n deaths?: number;\n kills?: number;\n self_kills?: number;\n first_bloods?: number;\n soul_pickups?: number;\n powerups_collected?: number;\n bombs_placed?: number;\n blocks_destroyed?: number;\n kicks?: number;\n kills_by_kick?: number;\n kills_by_chain?: number;\n trapkills?: number;\n double_kills?: number;\n triple_kills?: number;\n quad_kills?: number;\n penta_kills?: number;\n hexa_kills?: number;\n hepta_kills?: number;\n octa_kills?: number;\n nona_kills?: number;\n deca_kills?: number;\n best_multi_kill?: number;\n best_chain_kill?: number;\n total_round_score?: number;\n last_match_ts?: number;\n}\n\nexport interface LeaderboardResponse {\n version: number;\n period: string;\n dim: string;\n limit: number;\n rows: AggregateRow[];\n cached?: boolean;\n}\n\nexport interface MeResponse {\n version: number;\n aggregate: AggregateRow | null;\n}\n\nexport interface MatchListItem {\n match_id: number;\n game_id: string;\n session_id: string;\n round_no: number;\n draw: boolean;\n session_over: boolean;\n player_count: number;\n max_multi_kill: number;\n max_chain_kill: number;\n ts: number;\n winner_owner5: string | null;\n i_won: boolean;\n my_player_id: number;\n my_sprite: string | null;\n my_survived: boolean;\n my_round_score: number;\n my_kills: number;\n my_self_kills: number;\n my_first_bloods: number;\n}\n\nexport interface MatchListResponse {\n matches: MatchListItem[];\n}\n\nexport interface MatchDetailPlayer {\n player_id: number;\n owner5: string | null;\n display_name: string | null;\n sprite: string | null;\n survived: boolean;\n round_score: number;\n session_score: number;\n kills: number;\n self_kills: number;\n first_bloods: number;\n soul_pickups: number;\n powerups_collected: number;\n bombs_placed: number;\n blocks_destroyed: number;\n kicks: number;\n kills_by_kick: number;\n kills_by_chain: number;\n trapkills: number;\n double_kills: number;\n triple_kills: number;\n quad_kills: number;\n penta_kills: number;\n hexa_kills: number;\n hepta_kills: number;\n octa_kills: number;\n nona_kills: number;\n deca_kills: number;\n /** End-of-round upgrade snapshot. null on pre-v4 rows. */\n bomb_max: number | null;\n blast_len: number | null;\n is_bot: boolean;\n is_me: boolean;\n}\n\nexport interface MatchDetailResponse {\n match: {\n match_id: number;\n game_id: string;\n session_id: string;\n round_no: number;\n draw: boolean;\n session_over: boolean;\n player_count: number;\n max_multi_kill: number;\n max_chain_kill: number;\n ts: number;\n winner_owner5: string | null;\n };\n players: MatchDetailPlayer[];\n}\n\n\n/** Per-player \"best multi-kill achieved\" — derived from the per-tier\n * counts (double..deca are per-player and correct), NOT from the\n * best_multi_kill aggregate column (which is round-level and incorrectly\n * attributed to every participant by writeMatch). If a friend has any\n * deca-kill the best is 10; nona → 9; …; double → 2; else 0. */\nexport function bestMultiTier(r: AggregateRow): number {\n if ((r.deca_kills ?? 0) > 0) return 10;\n if ((r.nona_kills ?? 0) > 0) return 9;\n if ((r.octa_kills ?? 0) > 0) return 8;\n if ((r.hepta_kills ?? 0) > 0) return 7;\n if ((r.hexa_kills ?? 0) > 0) return 6;\n if ((r.penta_kills ?? 0) > 0) return 5;\n if ((r.quad_kills ?? 0) > 0) return 4;\n if ((r.triple_kills ?? 0) > 0) return 3;\n if ((r.double_kills ?? 0) > 0) return 2;\n return 0;\n}\n\n\n/** A \"game\" = all rounds sharing a session_id. The /matches endpoint\n * returns rounds; we group client-side. Each group is rendered as one\n * card summarizing the game; clicking expands to the final round's\n * per-player scoreboard. */\nexport interface GameGroup {\n session_id: string;\n rounds: MatchListItem[];\n final: MatchListItem;\n ended: boolean;\n i_won_game: boolean;\n my_final_score: number;\n my_total_kills: number;\n my_total_first_bloods: number;\n}\n\nexport function groupBySession(matches: MatchListItem[]): GameGroup[] {\n const bySession = new Map<string, MatchListItem[]>();\n for (const m of matches) {\n const list = bySession.get(m.session_id) ?? [];\n list.push(m);\n bySession.set(m.session_id, list);\n }\n const groups: GameGroup[] = [];\n for (const [sid, rounds] of bySession) {\n // Sort rounds ascending by round_no — final round = highest round_no.\n rounds.sort((a, b) => a.round_no - b.round_no);\n const ended = rounds.some(r => r.session_over);\n // In-progress games (no round flagged session_over) are intentionally\n // dropped from the history per operator spec: a game that didn't reach\n // a conclusion shouldn't claim stats. Re-played sessions that DID end\n // remain; truncated/abandoned sessions are silently culled.\n if (!ended) continue;\n const final = rounds[rounds.length - 1];\n const endingRound = rounds.find(r => r.session_over) ?? final;\n groups.push({\n session_id: sid,\n rounds,\n final,\n ended,\n i_won_game: endingRound.i_won,\n my_final_score: rounds.reduce((s, r) => s + (r.my_round_score ?? 0), 0),\n my_total_kills: rounds.reduce((s, r) => s + (r.my_kills ?? 0), 0),\n my_total_first_bloods: rounds.reduce((s, r) => s + (r.my_first_bloods ?? 0), 0),\n });\n }\n // Newest game first by timestamp of its latest round.\n groups.sort((a, b) => b.final.ts - a.final.ts);\n return groups;\n}\n\n","/**\n * Leaderboard modal — shown from the bomberman lobby.\n *\n * Three tabs: Personal | Lifetime | Matches.\n * Personal — `/watchparty/stats/api/me`; the caller's own aggregate row\n * with avatar, ELO, and a stat grid. 401 = signed out.\n * Lifetime — `/watchparty/stats/api/leaderboard?dim=elo&limit=20`; top\n * players as a sortable-ish data table with character avatars,\n * ELO, and richer per-player columns.\n * Matches — `/watchparty/stats/api/matches?limit=20`; the caller's\n * recent matches. Clicking a row expands it inline with the\n * full per-player breakdown for that match.\n *\n * Portaled to <body> so the GameModule wrapper's pointer-events tree and\n * stacking context don't swallow clicks.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { colorForSprite, isCharacterId, spriteUrlFor } from '../lib/characters';\nimport { StarIcon } from './controls/Icons';\nimport { debug, warn } from '../lib/debug';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n}\n\ntype Tab = 'personal' | 'lifetime' | 'games';\n\nimport {\n type AggregateRow, type LeaderboardResponse, type MeResponse,\n type MatchListResponse, \n type MatchDetailResponse, type GameGroup,\n bestMultiTier, groupBySession,\n} from '../lib/leaderboardStats';\n\nconst STATS_API = '/watchparty/stats/api';\n\nasync function fetchJson<T>(url: string): Promise<T | null> {\n try {\n const res = await fetch(url, { credentials: 'include' });\n if (!res.ok) {\n warn('stats', 'leaderboard fetch non-ok', { url, status: res.status });\n return null;\n }\n return (await res.json()) as T;\n } catch (err) {\n warn('stats', 'leaderboard fetch threw', { url, err: String(err) });\n return null;\n }\n}\n\n/** Sprite-aware avatar tile. Falls back to a colored block bearing the\n * friend's initial when the sprite is missing or unknown. Sized to match\n * the between-round Bevy scoreboard avatar at the default density. */\nfunction AvatarTile({\n sprite,\n fallbackInitial,\n size = 36,\n}: {\n sprite: string | null | undefined;\n fallbackInitial: string;\n size?: number;\n}) {\n const tint = colorForSprite(sprite);\n return (\n <div\n className=\"flex items-center justify-center flex-shrink-0 rounded overflow-hidden\"\n style={{\n width: size,\n height: size,\n background: `linear-gradient(180deg, ${tint}33 0%, ${tint}11 100%)`,\n border: `1px solid ${tint}88`,\n }}\n >\n {isCharacterId(sprite) ? (\n <img\n src={spriteUrlFor(sprite)}\n alt=\"\"\n className=\"w-full h-full object-contain select-none pointer-events-none\"\n draggable={false}\n />\n ) : (\n <span\n className=\"text-sm font-bold uppercase\"\n style={{ color: tint, textShadow: '0 1px 0 rgba(0,0,0,0.6)' }}\n >\n {fallbackInitial || '?'}\n </span>\n )}\n </div>\n );\n}\n\nexport default function LeaderboardModal({ open, onClose }: Props) {\n const [tab, setTab] = useState<Tab>('lifetime');\n const [personal, setPersonal] = useState<MeResponse | null>(null);\n const [lifetime, setLifetime] = useState<LeaderboardResponse | null>(null);\n const [matches, setMatches] = useState<MatchListResponse | null>(null);\n const [loading, setLoading] = useState(false);\n\n // Each open, and each tab switch while open, starts a fetch: mark it loading\n // in the same render rather than one effect later.\n const fetchKey = open ? tab : null;\n const [startedKey, setStartedKey] = useState<Tab | null>(null);\n if (fetchKey !== startedKey) {\n setStartedKey(fetchKey);\n if (fetchKey) setLoading(true);\n }\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n // fetchJson resolves null on every failure, so this never rejects.\n void (async () => {\n if (tab === 'personal') {\n const r = await fetchJson<MeResponse>(`${STATS_API}/me`);\n if (!cancelled) setPersonal(r);\n } else if (tab === 'lifetime') {\n const r = await fetchJson<LeaderboardResponse>(\n `${STATS_API}/leaderboard?dim=elo&limit=20`,\n );\n if (!cancelled) setLifetime(r);\n } else {\n // Games tab fetches at /matches's max (50 rounds) and groups by\n // session_id client-side. ~5-10 rounds per game means we'll get\n // 5-10 games' worth of recent history.\n const r = await fetchJson<MatchListResponse>(`${STATS_API}/matches?limit=50`);\n if (!cancelled) setMatches(r);\n }\n if (!cancelled) {\n setLoading(false);\n debug('stats', 'modal.fetched', { tab });\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [open, tab]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n onClose();\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n // No backdrop-filter: blur(...) recomposites the entire backplane on\n // every paint, which made every mouse-move inside the modal feel\n // laggy — the backplane was being re-blurred on each frame. A plain\n // bg-black/85 backdrop reads as \"the room is muted\" without the cost.\n // items-start + pt-[6vh] anchors the panel to a fixed Y near the top\n // of the screen so its TOP edge doesn't move when tab content changes\n // height; only the bottom edge grows downward until max-h is reached.\n // Vertical centering had been making the whole window jump around on\n // every tab switch.\n className=\"fixed inset-0 bg-black/85 flex items-start justify-center z-[10000] pointer-events-auto pt-[6vh] px-4\"\n onClick={onClose}\n role=\"presentation\"\n >\n <div\n className=\"relative w-full max-w-3xl max-h-[85vh] overflow-hidden flex flex-col\"\n onClick={e => e.stopPropagation()}\n style={{\n background: 'linear-gradient(180deg, #1a1d24 0%, #0f1116 100%)',\n border: '2px solid #4b5159',\n borderRadius: 10,\n boxShadow: '0 8px 32px rgba(0,0,0,0.7), inset 0 1px 0 rgba(255,255,255,0.05)',\n }}\n >\n <header\n className=\"px-5 py-3 flex items-center gap-3 border-b\"\n style={{\n borderColor: '#2a2d33',\n background: 'linear-gradient(180deg, #232730 0%, #1a1d24 100%)',\n }}\n >\n <h2\n className=\"text-base font-black uppercase tracking-widest\"\n style={{ color: '#f0d058', textShadow: '0 1px 0 rgba(0,0,0,0.6)' }}\n >\n Bomberman leaderboard\n </h2>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-xl leading-none w-8 h-8 flex items-center justify-center rounded hover:bg-white/15 active:bg-white/25\"\n style={{\n color: '#cbd0d8',\n background: '#1a1d24',\n border: '1px solid #4b5159',\n }}\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <nav\n className=\"px-5 py-2 border-b flex gap-1\"\n style={{ borderColor: '#2a2d33', background: '#171a20' }}\n >\n <TabButton active={tab === 'personal'} onClick={() => setTab('personal')}>\n Personal\n </TabButton>\n <TabButton active={tab === 'lifetime'} onClick={() => setTab('lifetime')}>\n Lifetime\n </TabButton>\n <TabButton active={tab === 'games'} onClick={() => setTab('games')}>\n Games\n </TabButton>\n </nav>\n\n <div className=\"flex-1 overflow-y-auto p-5\">\n {loading && (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Loading...\n </p>\n )}\n {!loading && tab === 'personal' && <PersonalView data={personal} />}\n {!loading && tab === 'lifetime' && <LifetimeView data={lifetime} />}\n {!loading && tab === 'games' && <GamesView data={matches} />}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction TabButton({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"px-3 py-1.5 rounded text-xs font-bold uppercase tracking-wider\"\n style={\n active\n ? {\n color: '#f0d058',\n background: '#272b35',\n border: '1px solid #4b5159',\n textShadow: '0 1px 0 rgba(0,0,0,0.6)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.05)',\n }\n : {\n color: '#cbd0d8',\n background: '#141821',\n border: '1px solid #2a2d33',\n }\n }\n onMouseEnter={e => {\n if (!active) {\n (e.currentTarget as HTMLButtonElement).style.background = '#1f232b';\n (e.currentTarget as HTMLButtonElement).style.color = '#f5f5f5';\n }\n }}\n onMouseLeave={e => {\n if (!active) {\n (e.currentTarget as HTMLButtonElement).style.background = '#141821';\n (e.currentTarget as HTMLButtonElement).style.color = '#cbd0d8';\n }\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction PersonalView({ data }: { data: MeResponse | null }) {\n if (!data) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Couldn’t load your stats. Make sure you’re signed in via{' '}\n <code style={{ color: '#cbd0d8' }}>hadoku.me/auth</code>.\n </p>\n );\n }\n const agg = data.aggregate;\n if (!agg) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No matches recorded yet — play a bomberman round to start tracking.\n </p>\n );\n }\n const name = agg.display_name ?? '(unnamed)';\n return (\n <div className=\"space-y-4\">\n <header className=\"flex items-center gap-3\">\n <AvatarTile\n sprite={agg.last_sprite}\n fallbackInitial={name.slice(0, 1)}\n size={56}\n />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-lg font-bold truncate\" style={{ color: '#f5f5f5' }}>\n {name}\n </h3>\n <p className=\"text-xs\" style={{ color: '#9ca3af' }}>\n ELO <span style={{ color: '#f0d058', fontWeight: 700 }}>{agg.elo ?? 1500}</span>\n {' · '}id <code>{agg.owner5}…</code>\n </p>\n </div>\n </header>\n <StatGrid agg={agg} />\n </div>\n );\n}\n\nconst LIFETIME_COLUMNS: Array<{\n label: string;\n value: (r: AggregateRow) => number;\n format?: (v: number) => string;\n accent?: boolean;\n}> = [\n { label: 'ELO', value: r => r.elo ?? 1500, accent: true },\n { label: 'Rounds', value: r => r.matches_played ?? 0 },\n { label: 'Wins', value: r => r.matches_won ?? 0 },\n { label: 'Kills', value: r => r.kills ?? 0 },\n { label: 'Suicides', value: r => r.self_kills ?? 0 },\n { label: '1st-blood', value: r => r.first_bloods ?? 0 },\n // Best-multi: derived per-player from the correct per-tier counts.\n // The aggregate best_multi_kill column is round-level and tagged to\n // every participant, so we ignore it.\n { label: 'Multikills', value: bestMultiTier, format: v => (v >= 2 ? `×${v}` : '—') },\n { label: 'Trap', value: r => r.trapkills ?? 0 },\n { label: 'Chain', value: r => r.kills_by_chain ?? 0 },\n { label: 'Kick', value: r => r.kills_by_kick ?? 0 },\n];\n\nfunction LifetimeView({ data }: { data: LeaderboardResponse | null }) {\n if (!data || !data.rows.length) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No matches recorded yet on this server.\n </p>\n );\n }\n return (\n <div>\n <header className=\"mb-3 text-xs uppercase tracking-wider\" style={{ color: '#9ca3af' }}>\n Ranked by ELO\n </header>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\" style={{ borderCollapse: 'separate', borderSpacing: 0 }}>\n <thead>\n <tr style={{ color: '#9ca3af' }}>\n <th\n className=\"text-left text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n #\n </th>\n <th\n className=\"text-left text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n Player\n </th>\n {LIFETIME_COLUMNS.map(c => (\n <th\n key={c.label}\n className=\"text-right text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.rows.map((r, i) => (\n <LifetimeRow key={`${r.owner5}-${i}`} row={r} rank={i + 1} />\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction LifetimeRow({ row, rank }: { row: AggregateRow; rank: number }) {\n const name = row.display_name ?? '(unnamed)';\n const tint = colorForSprite(row.last_sprite);\n const isLeader = rank === 1;\n return (\n <tr\n style={{\n background: isLeader\n ? 'linear-gradient(90deg, rgba(240,208,88,0.08) 0%, rgba(0,0,0,0.0) 100%)'\n : 'transparent',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLTableRowElement).style.background =\n 'linear-gradient(90deg, rgba(255,255,255,0.06) 0%, rgba(0,0,0,0.0) 100%)';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLTableRowElement).style.background = isLeader\n ? 'linear-gradient(90deg, rgba(240,208,88,0.08) 0%, rgba(0,0,0,0.0) 100%)'\n : 'transparent';\n }}\n >\n <td\n className=\"px-2 py-2 font-black text-sm align-middle\"\n style={{\n color: isLeader ? '#f0d058' : '#9ca3af',\n borderLeft: `3px solid ${tint}`,\n borderBottom: '1px solid #2a2d33',\n }}\n >\n {isLeader ? <StarIcon className=\"w-4 h-4 inline-block\" /> : rank}\n </td>\n <td\n className=\"px-2 py-2 align-middle\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n <div className=\"flex items-center gap-2\">\n <AvatarTile sprite={row.last_sprite} fallbackInitial={name.slice(0, 1)} size={28} />\n <span\n className=\"text-sm font-bold truncate\"\n style={{\n color: isLeader ? '#f0d058' : '#f5f5f5',\n textShadow: isLeader ? '0 0 8px rgba(240,208,88,0.4)' : 'none',\n maxWidth: 140,\n }}\n title={name}\n >\n {name}\n </span>\n </div>\n </td>\n {LIFETIME_COLUMNS.map(c => {\n const raw = c.value(row);\n const text = c.format ? c.format(raw) : String(raw);\n return (\n <td\n key={c.label}\n className=\"px-2 py-2 text-right tabular-nums align-middle\"\n style={{\n color: isLeader && c.accent ? '#f0d058' : '#f5f5f5',\n fontWeight: c.accent ? 700 : 400,\n borderBottom: '1px solid #2a2d33',\n }}\n >\n {text}\n </td>\n );\n })}\n </tr>\n );\n}\n\nfunction StatGrid({ agg }: { agg: AggregateRow }) {\n // Best-multi derived from per-tier counts — the aggregate\n // best_multi_kill column is round-level and wrongly attributed to\n // every participant by writeMatch. Same shape of bug exists for\n // best_chain_kill, but there are no per-tier chain counts to derive\n // from, so we just don't show that stat until Bevy tracks it\n // per-killer.\n const bestMulti = bestMultiTier(agg);\n const stats = useMemo(\n () => [\n { label: 'ELO', value: agg.elo ?? 1500, accent: true },\n { label: 'Round score', value: agg.total_round_score ?? 0 },\n { label: 'Rounds won', value: agg.matches_won ?? 0 },\n { label: 'Rounds played', value: agg.matches_played ?? 0 },\n { label: 'Games won', value: agg.sessions_won ?? 0 },\n { label: 'Kills', value: agg.kills ?? 0 },\n { label: 'First-bloods', value: agg.first_bloods ?? 0 },\n { label: 'Suicides', value: agg.self_kills ?? 0 },\n { label: 'Best multi', value: bestMulti },\n { label: 'Trap-kills', value: agg.trapkills ?? 0 },\n { label: 'Chain-kills', value: agg.kills_by_chain ?? 0 },\n { label: 'Kick-kills', value: agg.kills_by_kick ?? 0 },\n { label: 'Soul pickups', value: agg.soul_pickups ?? 0 },\n { label: 'Powerups', value: agg.powerups_collected ?? 0 },\n { label: 'Blocks destroyed', value: agg.blocks_destroyed ?? 0 },\n { label: 'Bombs placed', value: agg.bombs_placed ?? 0 },\n { label: 'Kicks', value: agg.kicks ?? 0 },\n { label: 'Deaths', value: agg.deaths ?? 0 },\n ],\n [agg, bestMulti],\n );\n return (\n <div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2\">\n {stats.map(s => (\n <StatTile key={s.label} label={s.label} value={s.value} accent={s.accent} />\n ))}\n </div>\n <h4\n className=\"mt-5 mb-2 text-xs font-bold uppercase tracking-wider\"\n style={{ color: '#9ca3af' }}\n >\n Multi-kill breakdown\n </h4>\n <div className=\"grid grid-cols-3 md:grid-cols-5 gap-2\">\n {(\n [\n ['Double', agg.double_kills],\n ['Triple', agg.triple_kills],\n ['Quad', agg.quad_kills],\n ['Penta', agg.penta_kills],\n ['Hexa', agg.hexa_kills],\n ['Hepta', agg.hepta_kills],\n ['Octa', agg.octa_kills],\n ['Nona', agg.nona_kills],\n ['Deca+', agg.deca_kills],\n ] as const\n ).map(([label, value]) => (\n <StatTile key={label} label={label} value={value ?? 0} compact />\n ))}\n </div>\n </div>\n );\n}\n\nfunction StatTile({\n label,\n value,\n accent,\n compact,\n}: {\n label: string;\n value: number;\n accent?: boolean;\n compact?: boolean;\n}) {\n return (\n <div\n className={`rounded ${compact ? 'px-2 py-1' : 'px-3 py-2'}`}\n style={{\n background: 'linear-gradient(180deg, #1f232b 0%, #171a20 100%)',\n border: accent ? '1px solid #f0d05866' : '1px solid #2a2d33',\n textAlign: compact ? 'center' : 'left',\n }}\n >\n <div\n className={`uppercase tracking-wider ${compact ? 'text-[0.6rem]' : 'text-[0.65rem]'}`}\n style={{ color: '#9ca3af' }}\n >\n {label}\n </div>\n <div\n className={`font-black ${compact ? 'text-sm' : 'text-lg'}`}\n style={{ color: accent ? '#f0d058' : '#f5f5f5' }}\n >\n {value}\n </div>\n </div>\n );\n}\n\nfunction GamesView({ data }: { data: MatchListResponse | null }) {\n const [expandedSid, setExpandedSid] = useState<string | null>(null);\n\n const games = useMemo(\n () => (data ? groupBySession(data.matches) : []),\n [data],\n );\n\n if (!data) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Couldn’t load game history. Make sure you’re signed in via{' '}\n <code style={{ color: '#cbd0d8' }}>hadoku.me/auth</code>.\n </p>\n );\n }\n if (!games.length) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No games yet — play a bomberman round to start your history.\n </p>\n );\n }\n\n return (\n <div>\n <header className=\"mb-3 text-xs uppercase tracking-wider\" style={{ color: '#9ca3af' }}>\n Your last {games.length} games\n </header>\n <div className=\"space-y-2\">\n {games.map(g => (\n <GameCard\n key={g.session_id}\n game={g}\n expanded={expandedSid === g.session_id}\n onToggle={() =>\n setExpandedSid(expandedSid === g.session_id ? null : g.session_id)\n }\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction GameCard({\n game,\n expanded,\n onToggle,\n}: {\n game: GameGroup;\n expanded: boolean;\n onToggle: () => void;\n}) {\n // Per-card round navigation: the expanded detail shows ONE round at a\n // time, with ◄/► arrows to step through the game's rounds. Defaults to\n // the final round (the deciding one). Reset to final when the card\n // closes so reopening lands back on the deciding round.\n const [roundIdx, setRoundIdx] = useState<number>(game.rounds.length - 1);\n if (!expanded && roundIdx !== game.rounds.length - 1) setRoundIdx(game.rounds.length - 1);\n const currentRound = game.rounds[roundIdx];\n\n // Detail fetch lives inside the card so each card manages its own\n // loading state — switching rounds in card A doesn't touch card B.\n const [detail, setDetail] = useState<MatchDetailResponse | null>(null);\n const [detailLoading, setDetailLoading] = useState(false);\n const detailRound = expanded ? currentRound ?? null : null;\n // `undefined` until the first render, so a card mounted expanded starts loading.\n const [startedRound, setStartedRound] = useState<typeof detailRound | undefined>(undefined);\n if (detailRound !== startedRound) {\n setStartedRound(detailRound);\n if (detailRound) setDetailLoading(true);\n else setDetail(null);\n }\n useEffect(() => {\n if (!detailRound) return;\n let cancelled = false;\n // fetchJson resolves null on every failure, so this never rejects.\n void (async () => {\n const r = await fetchJson<MatchDetailResponse>(\n `${STATS_API}/matches/${detailRound.match_id}`,\n );\n if (cancelled) return;\n setDetail(r);\n setDetailLoading(false);\n })();\n return () => {\n cancelled = true;\n };\n }, [detailRound]);\n\n const tint = colorForSprite(game.final.my_sprite);\n const outcome = game.i_won_game ? 'WIN' : 'LOSS';\n const outcomeColor = game.i_won_game ? '#7ee787' : '#f87171';\n const date = new Date(game.final.ts * 1000);\n const dateLabel = date.toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n const roundCount = game.rounds.length;\n return (\n <div\n className=\"rounded overflow-hidden\"\n style={{\n background: 'linear-gradient(180deg, #1f232b 0%, #171a20 100%)',\n border: '1px solid #2a2d33',\n }}\n >\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"w-full text-left px-3 py-2 flex items-center gap-3 cursor-pointer\"\n style={{ borderLeft: `3px solid ${tint}` }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'rgba(255,255,255,0.04)';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n }}\n >\n <AvatarTile sprite={game.final.my_sprite} fallbackInitial=\"?\" size={32} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span\n className=\"text-xs font-black uppercase tracking-wider\"\n style={{ color: outcomeColor }}\n >\n {outcome}\n </span>\n <span className=\"text-xs\" style={{ color: '#9ca3af' }}>\n {dateLabel}\n </span>\n </div>\n <div\n className=\"text-[0.65rem] uppercase tracking-wider mt-0.5\"\n style={{ color: '#9ca3af' }}\n >\n {roundCount} round{roundCount === 1 ? '' : 's'} ·{' '}\n {game.final.player_count}p · {game.my_total_kills}K · +\n {game.my_final_score} pts\n {game.my_total_first_bloods > 0\n ? ` · ${game.my_total_first_bloods}× 1st blood`\n : ''}\n </div>\n </div>\n <span\n className=\"text-xs\"\n style={{\n color: '#9ca3af',\n transform: expanded ? 'rotate(180deg)' : 'none',\n transition: 'transform 150ms',\n }}\n >\n ▾\n </span>\n </button>\n {expanded && (\n <div style={{ borderTop: '1px solid #2a2d33' }}>\n <div\n className=\"px-3 pt-2 pb-1 flex items-center gap-2 text-[0.6rem] uppercase tracking-wider\"\n style={{ color: '#9ca3af' }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setRoundIdx(i => Math.max(0, i - 1));\n }}\n disabled={roundIdx === 0}\n aria-label=\"Previous round\"\n className=\"w-6 h-6 flex items-center justify-center rounded hover:bg-white/10 active:bg-white/20 disabled:opacity-30 disabled:hover:bg-transparent\"\n style={{ color: '#cbd0d8' }}\n >\n ◄\n </button>\n <span>\n Round {currentRound ? currentRound.round_no + 1 : 1} of{' '}\n {game.rounds.length}\n {currentRound?.session_over ? ' · final' : ''}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setRoundIdx(i => Math.min(game.rounds.length - 1, i + 1));\n }}\n disabled={roundIdx === game.rounds.length - 1}\n aria-label=\"Next round\"\n className=\"w-6 h-6 flex items-center justify-center rounded hover:bg-white/10 active:bg-white/20 disabled:opacity-30 disabled:hover:bg-transparent\"\n style={{ color: '#cbd0d8' }}\n >\n ►\n </button>\n </div>\n {detailLoading && (\n <p className=\"text-xs px-3 py-2\" style={{ color: '#9ca3af' }}>\n Loading...\n </p>\n )}\n {!detailLoading && detail && <MatchDetailTable detail={detail} />}\n {!detailLoading && !detail && (\n <p className=\"text-xs px-3 py-2\" style={{ color: '#9ca3af' }}>\n Couldn’t load this round.\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction MatchDetailTable({ detail }: { detail: MatchDetailResponse }) {\n const sortedPlayers = useMemo(\n () => [...detail.players].sort((a, b) => b.round_score - a.round_score),\n [detail.players],\n );\n return (\n <div className=\"px-3 pt-2 pb-3\">\n <table className=\"w-full text-xs\" style={{ borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ color: '#9ca3af' }}>\n <th className=\"text-left py-1 pr-2 text-[0.6rem] uppercase tracking-wider\">Player</th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Round score earned this match\"\n >\n Score\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Game score after this round\"\n >\n Game\n </th>\n <th className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\">K</th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Suicides\"\n >\n S\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"First-bloods\"\n >\n 1st\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Max concurrent bombs at end of round\"\n >\n Max\n </th>\n <th\n className=\"text-right py-1 pl-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Blast radius at end of round (tiles, one direction)\"\n >\n Pow\n </th>\n </tr>\n </thead>\n <tbody>\n {sortedPlayers.map(p => {\n const name = p.display_name ?? (p.is_bot ? `Bot ${p.player_id + 1}` : '(unnamed)');\n const tint = colorForSprite(p.sprite);\n return (\n <tr\n key={p.player_id}\n style={{\n borderTop: '1px solid #2a2d33',\n background: p.is_me ? 'rgba(240,208,88,0.06)' : 'transparent',\n }}\n >\n <td className=\"py-1 pr-2\">\n <div className=\"flex items-center gap-2\">\n <AvatarTile sprite={p.sprite} fallbackInitial={name.slice(0, 1)} size={20} />\n <span style={{ color: p.is_me ? '#f0d058' : '#f5f5f5' }}>\n {name}\n {p.is_bot && (\n <span className=\"ml-1 text-[0.55rem]\" style={{ color: tint }}>\n BOT\n </span>\n )}\n </span>\n </div>\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.round_score}\n </td>\n <td\n className=\"text-right py-1 px-1 tabular-nums\"\n style={{ color: '#f0d058', fontWeight: 700 }}\n >\n {p.session_score}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.kills}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.self_kills}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.first_bloods}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.bomb_max ?? '—'}\n </td>\n <td className=\"text-right py-1 pl-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.blast_len ?? '—'}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { GAME_EVENTS, CORE_EVENTS, MAX_GAME_PLAYERS, botSpritePicker } from '@watchparty/shared';\nimport { getSocket, emitGameSync, emitGameSelect, emitGameStart, emitGameCountdown, emitGameSetBots, emitGameSessionReset } from '../lib/socket';\nimport { useAppStore } from '../lib/store';\nimport { getRuntimeServerOrigin } from '../lib/config';\nimport { debug, warn } from '../lib/debug';\nimport { colorForSprite, spriteUrlFor } from '../lib/characters';\nimport panelFrameUrl from '../assets/games/panel-frame.png';\nimport bombermanCoverUrl from '../assets/games/bomberman/cover.webp';\nimport { resolveMatchState } from '../lib/gameMatchState';\nimport type {\n GameActivePayload, GameStartPayload, GameStatePayload, GameInputPayload,\n GameCountdownPayload, ChatBroadcastPayload, PresencePayload,\n} from '../lib/wireEvents';\nimport volumeIconUrl from '../assets/games/bomberman/volume-icon.png';\nimport closeIconUrl from '../assets/games/bomberman/close-icon.png';\nimport lobbyIconUrl from '../assets/games/bomberman/lobby-icon.png';\nimport leaderboardIconUrl from '../assets/games/bomberman/leaderboard-icon.png';\nimport explosionArmUrl from '../assets/games/bomberman/explosion-arm.png';\nimport explosionEndUrl from '../assets/games/bomberman/explosion-end.png';\nimport LeaderboardModal from './LeaderboardModal';\nimport { Icon } from '@wolffm/themes'\nimport { readStored, writeStored } from '../lib/browserStorage';\n\n/** Physical-keycap chip for the on-cover controls hint. Round-7 restored\n * the squared gradient bg the operator preferred (the round-6 transparent\n * + text-stroke pass rendered weirdly on SPACE). Dark text on a light\n * top-bottom gradient + 1px dark border + inset shadows for the\n * pressed-edge bevel. No WebkitTextStroke (it was the SPACE artifact). */\nfunction Keycap({ label, wide = false }: { label: string; wide?: boolean }) {\n return (\n <span\n className=\"inline-flex items-center justify-center font-bold uppercase tracking-wide\"\n style={{\n minWidth: wide ? 100 : 28,\n height: 28,\n padding: wide ? '0 14px' : 0,\n fontSize: wide ? 12 : 14,\n background: 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)',\n color: '#111',\n borderRadius: 6,\n border: '1px solid #5b6473',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontFamily: '\"Courier New\", ui-monospace, monospace',\n lineHeight: 1,\n // The parent legend container sets text-shadow for white labels;\n // CSS inherits it onto every descendant. Without an explicit reset\n // the dark Keycap glyphs ('W'/'A'/'S'/'D') get a 2px black halo on\n // top of the dark fill — they read as overlapping/doubled letters.\n textShadow: 'none',\n }}\n >\n {label}\n </span>\n );\n}\n\n// Inline white-with-black-outline text style applied to each legend label\n// (Movement / Bomb / \"or\"). Defined as a per-label style instead of being\n// inherited from a parent container — CSS text-shadow inherits to ALL\n// descendants and was contaminating the Keycap glyphs (dark-on-light) with\n// a 2px black halo, making them look doubled. Per-label scoping keeps the\n// outline confined to where it's needed.\nconst legendLabelStyle: React.CSSProperties = {\n color: '#fff',\n textShadow:\n '-2px -2px 0 #000, 2px -2px 0 #000, -2px 2px 0 #000, 2px 2px 0 #000, 0 0 4px rgba(0,0,0,0.8)',\n};\n\nconst VOLUME_STORAGE_KEY = 'watchparty_game_volume';\nconst DEFAULT_VOLUME = 0.3;\nconst COUNTDOWN_SECS = 3;\n// How long the game-over splash holds before the leader auto-starts the\n// next countdown. Long enough that players see the winner / \"DRAW\" overlay.\nconst POST_MATCH_HOLD_MS = 5000;\n\n/** Convert a linear slider value (0..1) to an audio gain. Human hearing\n * is logarithmic, so a linear `.volume = 0.5` sounds way louder than\n * \"half\" — operators consistently report the slider at 50% being too\n * loud. A quadratic curve is the standard cheap approximation: 0.5 → 0.25\n * gain feels like roughly half-volume in practice, 0.1 → 0.01 is the\n * near-silent end. Applied to both the per-client beeps AND the value\n * forwarded to Bevy via the bridge, so the slider feels consistent\n * whether you're hearing local UI sound effects or in-game music. */\nfunction audioGainFromSlider(v: number): number {\n return v * v;\n}\n\nfunction loadStoredVolume(): number {\n const raw = readStored(VOLUME_STORAGE_KEY);\n if (raw === null) return DEFAULT_VOLUME;\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return DEFAULT_VOLUME;\n return Math.min(1, Math.max(0, n));\n}\n\n// Self-contained waiting-room game, embedded in an isolated iframe.\n//\n// The game is a separate Bevy/WASM bundle, NOT part of this React app's\n// chunk graph. It loads only when a user opens it, and unmounting this\n// component removes the iframe — which tears down the entire WASM heap,\n// WebGPU device, and game loop in one shot (the reason for the iframe).\n//\n// Dev: points at the `trunk serve` dev server (hot-reloads on Rust edits).\n// Prod: the static bundle served same-origin under /game/.\n// Dev: the trunk dev server. Prod: the watchparty server origin + /game/\n// (cross-origin iframe, same model as dev — the bundle ships with the server).\n// VITE_GAME_URL overrides both.\nfunction resolveGameUrl(): string {\n // `?net=1` puts the Bevy app in Mode::Waiting — it skips build_level()\n // on setup so there's no placeholder fake-game world rendered behind\n // the cover/countdown. The world gets built fresh when game.start\n // arrives. Also lets manage_music pick lobby music for the pre-match\n // state (Mode=Local builds an instant hot-seat and plays game music).\n const override = import.meta.env.VITE_GAME_URL as string | undefined;\n const base = override ?? (import.meta.env.DEV ? 'http://localhost:9090/' : `${getRuntimeServerOrigin()}/game/`);\n const sep = base.includes('?') ? '&' : '?';\n // Cache-buster: append the UI package version so a redeploy reloads\n // the iframe with the latest game/index.html instead of relying on\n // browser revalidation of `cache-control: max-age=0`. The wasm/js\n // assets are already content-hashed by trunk, so the only thing that\n // could go stale is index.html itself — this query param fixes that.\n const version =\n typeof __APP_VERSION__ === 'string' && __APP_VERSION__ ? __APP_VERSION__ : 'dev';\n return `${base}${sep}net=1&v=${encodeURIComponent(version)}`;\n}\n\n/** Whether this client leads the room right now, read from the store rather than a render. */\nfunction isLeaderNow(): boolean {\n const { snapshot, me } = useAppStore.getState();\n return !!snapshot.leaderId && snapshot.leaderId === me.clientId;\n}\n\n// The bridge: the cross-origin game iframe can't touch this app's Socket.io\n// connection, so we relay between them with postMessage. The game posts `up`\n// messages (input / state / start_request); we forward them over the existing\n// authenticated, room-scoped socket. Socket game events come back as `down`\n// messages into the iframe. The server stays a generic relay (ws/game.ts);\n// game semantics live entirely in the Bevy app.\nexport default function GameModule() {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n // Cache the latest game_active payload so it can be re-posted to Bevy\n // when the iframe finally signals it's ready (see onActive comment).\n const lastActivePayloadRef = useRef<GameActivePayload | null>(null);\n const leaderId = useAppStore((s) => s.snapshot.leaderId);\n const myClientId = useAppStore((s) => s.me.clientId);\n const isLeader = !!leaderId && leaderId === myClientId;\n // Live room roster — used for the participants strip on the cover/countdown\n // screen so the lobby shows who's in the game before the match starts.\n // We use the current presence roster (not the locked game_active.players)\n // so a viewer who joined mid-cover appears immediately without waiting for\n // the leader to re-emit countdown_request.\n const roster = useAppStore((s) => s.roster);\n const participants = useMemo(() => Object.values(roster), [roster]);\n // Session-wide victory tally driven by inbound game_active payloads.\n // We crown the unique top scorer — ties don't get a crown so we never\n // imply false hierarchy (the operator's \"current top player\" framing\n // requires unambiguity).\n const gameSessionWins = useAppStore((s) => s.gameSessionWins);\n // Lobby AI bot count — leader-tunable via the +/− chips on the cover\n // screen. The store value mirrors the server-authoritative count\n // (server clamps to MAX_GAME_PLAYERS - humans and rebroadcasts).\n // Declared BEFORE botChips/canAddBot/canRemoveBot so those don't TDZ\n // against the `const` initializer (caught in prod: 'h' before init).\n const gameBotCount = useAppStore((s) => s.gameBotCount);\n // Bot chips for the strip — the server's own picker, so the chip art is the\n // sprite the AI bot actually spawns with.\n const botChips = useMemo(() => {\n const next = botSpritePicker(participants.flatMap((p) => (p.sprite ? [p.sprite] : [])));\n return Array.from({ length: Math.max(0, gameBotCount) }, (_, i) => (\n { clientId: `ai:${i}`, sprite: next(), name: `Bot ${i + 1}` }\n ));\n }, [gameBotCount, participants]);\n const humanCount = participants.length;\n const canAddBot = gameBotCount + humanCount < MAX_GAME_PLAYERS;\n const canRemoveBot = gameBotCount > 0;\n // Panel size scales with total players. Bevy picks a wider map for higher\n // player counts (p02=11×9 → p10=21×19), so a fixed 820² panel makes cells\n // half-size on p10. Linear ramp from 820px (2 players) → 1240px (10) keeps\n // cells roughly visible; min(96vmin, …) clamps to viewport so small screens\n // never overflow. Total = humans + bots is what server's buildPlayerRoster\n // hands to Bevy, so this matches the map Bevy will actually build.\n const totalPlayers = Math.max(2, Math.min(MAX_GAME_PLAYERS, humanCount + gameBotCount));\n const panelMaxPx = Math.round(820 + (totalPlayers - 2) * 52.5);\n const panelSizeStyle = useMemo<React.CSSProperties>(() => ({\n width: `min(96vmin, ${panelMaxPx}px)`,\n height: `min(96vmin, ${panelMaxPx}px)`,\n }), [panelMaxPx]);\n const crownClientId = useMemo(() => {\n let topId: string | null = null;\n let topCount = 0;\n let tied = false;\n for (const [cid, count] of Object.entries(gameSessionWins)) {\n if (count <= 0) continue;\n if (count > topCount) {\n topId = cid;\n topCount = count;\n tied = false;\n } else if (count === topCount) {\n tied = true;\n }\n }\n return tied ? null : topId;\n }, [gameSessionWins]);\n const gameUrl = useMemo(() => resolveGameUrl(), []);\n // Per-client volume (0..=1). Persists in localStorage so it carries\n // across reloads. Forwarded to the iframe via `volume` bridge messages\n // — Bevy applies it as GlobalVolume so it scales BOTH sfx + music.\n const [volume, setVolume] = useState<number>(loadStoredVolume);\n // Match lifecycle:\n // 'pre-start': first-load only; cover (title art) + Start button.\n // 'countdown': leader clicked Start/Play Again; cover fades but the\n // game hasn't begun yet — show a 3..2..1..GO over the\n // canvas so players prepare. Server game_start fires at\n // the end of countdown.\n // 'playing': game_start broadcast received; cover fully hidden.\n // 'ended': last received snapshot had ph != -1. We INTENTIONALLY\n // do NOT bring the cover back here — the Bevy game-over\n // splash stays visible on the frozen canvas. After\n // POST_MATCH_HOLD_MS the leader auto-transitions back to\n // 'countdown' for the next match (no Play Again button —\n // rematches are continuous until someone closes the game).\n const [matchPhase, setMatchPhase] = useState<'pre-start' | 'countdown' | 'playing' | 'ended'>('pre-start');\n const [countdown, setCountdown] = useState<number>(COUNTDOWN_SECS);\n // Set true when Bevy reports the just-finished round pushed someone over\n // SESSION_THRESHOLD. Gates the auto-loop: at session-end the scoreboard\n // sits until the leader presses R (new session) or ESC (back to lobby),\n // matching the operator's spec (\"looping continues until first to 100,\n // then stops\"). Reset on every game_start so a new session starts fresh.\n const [sessionOver, setSessionOver] = useState<boolean>(false);\n const [volumeOpen, setVolumeOpen] = useState<boolean>(false);\n // Track whether the Bevy iframe has finished bootstrap (`bridge.up.ready`).\n // Before that fires the board canvas is blank; if the cover fade ran early\n // the operator would see a flash of empty black during the countdown.\n // We hold the Start button disabled until iframeReady is true so the\n // fade only happens once there's a board behind the cover.\n const [iframeReady, setIframeReady] = useState<boolean>(false);\n // Bevy world-build state. THREE discrete values, no arbitrary timeout:\n // 'loading' — iframe mounted, Bevy hasn't emitted `world_built` yet.\n // 'ready' — Bevy fired world_built. Start button enabled, music can run.\n // 'error' — 30s elapsed without a world_built. Bevy probably crashed/\n // hung. Show retry UI instead of pretending readiness.\n // Replaces the prior 3s/12s arbitrary-timeout fallbacks that lied:\n // they flipped worldReady=true while Bevy was still booting, leading\n // to countdown-over-blank-canvas + no-music regressions (chaos-mega\n // 2026-05-27 showed Bevy taking 25s in software rendering). Discrete\n // triggers only — `world_built` IS the signal.\n const [worldStatus, setWorldStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const worldReady = worldStatus === 'ready';\n const gameOrigin = useMemo(() => {\n try {\n return new URL(gameUrl, window.location.href).origin;\n } catch {\n return '*';\n }\n }, [gameUrl]);\n\n function handleStartClick() {\n // Broadcast countdown_request → server fans out to every client.\n // Viewers receive game_countdown and enter the same phase + tick the\n // same digit, so the whole room sees the synced 3-2-1-GO. The local\n // setState below is a no-op for the leader (we'll re-flip on receipt\n // of our own broadcast), but the immediate setState keeps the leader\n // UI snappy on click without waiting for the round-trip.\n emitGameCountdown();\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n }\n\n // Drive the countdown visual. Tick once per second; on 0, the leader fires\n // the start_request and every client gets a game_start back (→ 'playing').\n useEffect(() => {\n if (matchPhase !== 'countdown') return;\n if (countdown <= 0) {\n if (isLeader) emitGameStart('bomberman');\n return;\n }\n const id = setTimeout(() => setCountdown((n) => n - 1), 1000);\n return () => clearTimeout(id);\n }, [matchPhase, countdown, isLeader]);\n\n // Countdown audio — synthesized beeps via WebAudio, one per visible\n // digit tick, so the sound stays perfectly in sync with the on-screen\n // number. Earlier attempts used the bundled 2-second countdown.ogg\n // played once per phase entry; that always desynced with the 3-second\n // visual ticks and the operator heard double-beeps. Now: 880Hz short\n // tick for each \"3\"/\"2\"/\"1\" + 660Hz longer tone for \"GO!\". Beep\n // volume follows the user's per-client slider (with the same\n // perceptual curve as music).\n const countdownAudioCtxRef = useRef<AudioContext | null>(null);\n useEffect(() => {\n if (matchPhase !== 'countdown') return;\n if (volume <= 0) return;\n try {\n if (!countdownAudioCtxRef.current) {\n const Ctor = window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n countdownAudioCtxRef.current = new Ctor();\n }\n const ctx = countdownAudioCtxRef.current;\n const isGo = countdown <= 0;\n const freq = isGo ? 660 : 880;\n const durSec = isGo ? 0.35 : 0.15;\n const peakGain = audioGainFromSlider(volume) * 0.35;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = freq;\n const t0 = ctx.currentTime;\n gain.gain.setValueAtTime(0, t0);\n gain.gain.linearRampToValueAtTime(peakGain, t0 + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, t0 + durSec);\n osc.connect(gain).connect(ctx.destination);\n osc.start(t0);\n osc.stop(t0 + durSec + 0.01);\n } catch { /* ignore — beep is non-essential UX polish */ }\n }, [matchPhase, countdown, volume]);\n\n // Forward parent-page user gestures to Bevy so the iframe's AudioContext\n // can resume without requiring an additional click inside the canvas.\n // The iframe is mounted with allow=\"autoplay\", which propagates the\n // parent's user-activation state — Bevy's manage_music is gated on its\n // own AudioUnlocked resource which the new 'unlock_audio' bridge message\n // flips. We listen for the FIRST pointerdown/keydown anywhere on the\n // page, post it through to the iframe, then unsubscribe (audio gate is\n // sticky so further gestures are no-ops).\n useEffect(() => {\n let sent = false;\n const sendUnlock = () => {\n if (sent) return;\n sent = true;\n const win = iframeRef.current?.contentWindow;\n if (win) {\n win.postMessage(\n { __wpgame: 'down', type: 'unlock_audio' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }\n window.removeEventListener('pointerdown', sendUnlock, true);\n window.removeEventListener('keydown', sendUnlock, true);\n };\n window.addEventListener('pointerdown', sendUnlock, true);\n window.addEventListener('keydown', sendUnlock, true);\n return () => {\n window.removeEventListener('pointerdown', sendUnlock, true);\n window.removeEventListener('keydown', sendUnlock, true);\n };\n }, [gameOrigin]);\n\n // Per-friend-key leaderboard modal open state. Triggered by the\n // top-row leaderboard button — visible to every roster slot, not\n // just the leader. Stays open across phase transitions: the user\n // dismisses it with the X, the backdrop, or ESC when they're ready.\n const [leaderboardOpen, setLeaderboardOpen] = useState(false);\n\n // Ref mirror of sessionOver so the setTimeout callback below can re-check\n // its latest value at fire time. Without this, the auto-loop could\n // capture a stale `false` if game_result (which sets sessionOver=true)\n // arrives AFTER matchPhase flipped to 'ended' but BEFORE this effect\n // re-runs — a tiny but real window in production.\n const sessionOverRef = useRef(false);\n useEffect(() => { sessionOverRef.current = sessionOver; }, [sessionOver]);\n\n // Stamped each time matchPhase becomes 'playing'. The onState handler\n // uses it to reject ph != -1 snapshots that arrive in the first ~700ms\n // (stale ph=winner frames from the prior round in-flight when restart\n // fired). See the onStart handler below for the bug history.\n const playingSinceRef = useRef<number>(0);\n\n // Auto-loop into a new countdown after a match ends. The leader holds the\n // frozen game-over splash for POST_MATCH_HOLD_MS, then broadcasts the\n // next countdown — viewers receive game_countdown and follow along.\n useEffect(() => {\n if (matchPhase !== 'ended' || !isLeader) return;\n // Session-over: skip the auto-loop entirely. Leader must press R\n // (new session) or ESC (back to lobby) to continue.\n if (sessionOver) return;\n const id = setTimeout(() => {\n // Re-check via ref in case game_result raced and flipped\n // sessionOver=true in between effect schedule and timer fire.\n if (sessionOverRef.current) {\n debug('game', 'auto-loop suppressed at fire time (sessionOver became true)');\n return;\n }\n emitGameCountdown();\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n }, POST_MATCH_HOLD_MS);\n return () => clearTimeout(id);\n }, [matchPhase, isLeader, sessionOver]);\n\n // Request server replay of (active, lastGameStart) so late mounters spectate\n // an in-flight match instead of waiting for the next start.\n useEffect(() => { emitGameSync(); }, []);\n\n // ERROR escalation. Bevy is supposed to emit `world_built` after\n // build_level + 5 paint frames. If 30s elapses without one, something\n // is genuinely broken (panic / hung asset load / bridge severed).\n // Flip to 'error' so the user sees a retry UI instead of an infinite\n // \"Loading...\" spinner. Real-browser cold-start with GPU should be\n // 1-3s; software-rendered Chrome was 25s in chaos-mega 2026-05-27;\n // 30s is a generous outer bound. No mid-window \"treat as ready\" lie.\n useEffect(() => {\n if (worldStatus !== 'loading') return;\n const id = setTimeout(() => {\n warn('game', 'world_built never arrived (30s) — escalating to error');\n setWorldStatus('error');\n }, 30000);\n return () => clearTimeout(id);\n }, [worldStatus]);\n\n // Replay the cached game_active preview to Bevy the moment the iframe\n // signals ready. The original 'preview' postMessage from onActive may\n // have raced ahead of the iframe's HTML loading + message listener\n // attachment — without this replay, Bevy never receives the preview,\n // never builds, and never sends world_built.\n useEffect(() => {\n if (!iframeReady) return;\n const p = lastActivePayloadRef.current;\n if (!p) return;\n debug('game', 'replaying game_active preview after iframeReady');\n iframeRef.current?.contentWindow?.postMessage(\n { __wpgame: 'down', type: 'preview', payload: p },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }, [iframeReady, gameOrigin]);\n\n // Push the current volume into the iframe on every change AND on mount.\n // We post on a short delay first so the Bevy bridge has a chance to come\n // up (`ready` is what tells us it's listening, but we also want the\n // initial value applied even if the iframe is already mounted from a\n // previous render). Re-sends are cheap and idempotent.\n useEffect(() => {\n writeStored(VOLUME_STORAGE_KEY, String(volume));\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n const targetOrigin = gameOrigin === 'null' ? '*' : gameOrigin;\n const sliderGain = audioGainFromSlider(volume);\n const post = (v: number) => win.postMessage({ __wpgame: 'down', type: 'volume', value: v }, targetOrigin);\n if (matchPhase === 'countdown') {\n // Ramp Bevy volume from the slider value → 0 over 1.5s so the lobby\n // music fades out instead of cutting abruptly. The React-side WebAudio\n // countdown beeps live in this window so they're unaffected. On\n // 'playing' (game music spawns at the same moment) this effect\n // re-runs and restores the slider value.\n const FADE_MS = 1500;\n const STEPS = 30;\n const timers: number[] = [];\n for (let i = 1; i <= STEPS; i++) {\n timers.push(window.setTimeout(() => {\n const t = i / STEPS;\n post(sliderGain * (1 - t));\n }, (FADE_MS / STEPS) * i));\n }\n return () => timers.forEach(clearTimeout);\n }\n // pre-start / playing / ended: send the user's perceptual-gain value\n // (NOT the raw slider) so in-game music scales the same way the local\n // UI beeps do.\n post(sliderGain);\n }, [volume, matchPhase, gameOrigin]);\n\n useEffect(() => {\n const socket = getSocket();\n const postDown = (msg: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n { __wpgame: 'down', ...msg },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n\n // iframe -> socket bridge. Every `up` message is logged through the\n // standard `debug('game', ...)` channel so the chaos test reports +\n // server `client_log` aggregator see the full bridge trace (matches the\n // shape of buffer/socket/seek-coord logs from elsewhere in the UI).\n // Input/state rates are high (60Hz from Bevy under play); log just the\n // shape, not every payload, to avoid drowning the log pipeline.\n let upInputs = 0, upStates = 0;\n const onMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || d.__wpgame !== 'up') return;\n switch (d.type) {\n case 'ready':\n debug('game', 'bridge.up.ready');\n setIframeReady(true);\n postDown({ type: 'init', selfClientId: useAppStore.getState().me.clientId });\n postDown({ type: 'volume', value: audioGainFromSlider(loadStoredVolume()) });\n break;\n case 'world_built':\n // Bevy finished build_level — assets + board + spawn-point\n // sprites are all valid. Enables the Start button so the leader\n // can't click into a black-canvas countdown. warn-level so the\n // arrival latency lands in server.jsonl for real-browser\n // telemetry (compare to the 30s error escalation).\n warn('game', 'bridge.up.world_built');\n setWorldStatus('ready');\n break;\n case 'focuschat':\n // User pressed Enter while the canvas had focus — pop focus to\n // the chat input box. ChatInput listens for this custom event.\n debug('game', 'bridge.up.focuschat');\n window.dispatchEvent(new CustomEvent('watchparty:focus-chat-input'));\n break;\n case 'diag':\n // Generic host-side diagnostic event (e.g. gamemaster loop\n // override). warn-level so it ships to the server session log\n // — debug() only goes to console in production and we need\n // the evidence trail for jitter post-mortems.\n warn('game', `host.diag.${d.event ?? 'unknown'}`, d);\n break;\n case 'start_request':\n debug('game', 'bridge.up.start_request', { gameId: d.gameId });\n socket.emit(GAME_EVENTS.START_REQUEST, { gameId: d.gameId });\n break;\n case 'game_result':\n // Bevy emits this from the host once Phase flips to Over —\n // carries per-player kill counts + winner/draw + roster + the\n // session_over flag (true when any player crossed\n // SESSION_THRESHOLD this round). Forward to the server for\n // server.jsonl persistence; set sessionOver locally to suppress\n // the post-match auto-countdown when this was the last round.\n debug('game', 'bridge.up.game_result', { winnerPlayerId: d.winnerPlayerId, draw: d.draw, players: d.players?.length, sessionOver: d.sessionOver });\n if (typeof d.sessionOver === 'boolean') setSessionOver(d.sessionOver);\n // d.players already carries the rich per-pid counters from Bevy\n // (kills, selfKills, firstBloods, soulPickups, powerupsCollected,\n // bombsPlaced, blocksDestroyed, kicks, killsByKick, killsByChain,\n // trapkills, multiKills, roundScore, sessionScore). Forward\n // verbatim; the server Zod schema declares all the new fields\n // optional so older builds remain compatible.\n socket.emit(GAME_EVENTS.RESULT, {\n winnerPlayerId: d.winnerPlayerId ?? null,\n draw: !!d.draw,\n players: d.players ?? [],\n sessionOver: !!d.sessionOver,\n roundNo: d.roundNo ?? 0,\n sessionScores: d.sessionScores ?? {},\n maxMultiKill: d.maxMultiKill ?? 0,\n maxChainKill: d.maxChainKill ?? 0,\n });\n break;\n case 'lobby_request':\n // Leader pressed ESC on the session-over scoreboard — return to\n // the bomberman pre-match lobby. The activeGameId and bot count\n // stay so the lobby still renders with its roster; the server\n // clears per-session counters + regenerates the preview so every\n // Bevy rebuilds the lobby world. \"Stop game\" in the media drawer's\n // Play tab is the separate close-entirely path.\n debug('game', 'bridge.up.lobby_request');\n // Read at event time: this listener outlives leadership changes.\n if (isLeaderNow()) {\n emitGameSessionReset();\n }\n break;\n case 'restart_request':\n // Leader pressed 'R' on the game canvas during the post-match\n // splash. Skip the auto-restart's 5s POST_MATCH_HOLD_MS by\n // firing countdown_request immediately — server validates\n // leader-only and broadcasts COUNTDOWN. Auto-restart's\n // matchPhase==='ended' setTimeout is cancelled automatically\n // when the onCountdown handler flips matchPhase to 'countdown'\n // (effect cleanup).\n debug('game', 'bridge.up.restart_request');\n socket.emit(GAME_EVENTS.COUNTDOWN_REQUEST);\n break;\n case 'input':\n // 60Hz from Bevy at peak — sample 1-in-30 so logs are ~2/sec.\n if (++upInputs % 30 === 0) debug('game', 'bridge.up.input.sampled', { total: upInputs });\n socket.emit(GAME_EVENTS.INPUT, { d: d.d });\n break;\n case 'state':\n if (++upStates % 30 === 0) debug('game', 'bridge.up.state.sampled', { total: upStates, ph: d.d?.ph });\n socket.emit(GAME_EVENTS.STATE, { d: d.d });\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n // socket -> iframe\n const onStart = (payload: GameStartPayload) => {\n debug('game', 'socket.game_start', { hostClientId: payload?.hostClientId, seed: payload?.seed });\n postDown({ type: 'start', payload });\n // Stamp the moment matchPhase becomes 'playing'. The onState guard\n // below uses this to reject ph != -1 snapshots that arrive in the\n // first ~700ms — they're stale ph=winner frames from the prior round\n // that were broadcast by the host before its Phase flipped, then\n // round-tripped through the server while we transitioned. Without\n // this guard they kick matchPhase back to 'ended' and the auto-loop\n // fires another restart 5s later (2026-05-30 double-restart bug).\n playingSinceRef.current = Date.now();\n setMatchPhase('playing');\n };\n let downStates = 0;\n const onState = (payload: GameStatePayload) => {\n postDown({ type: 'state', d: payload?.d });\n const ph = payload?.d?.ph;\n const se = payload?.d?.se;\n // Sample down-state too so we have a server-relay tick rate in the log.\n if (++downStates % 30 === 0) debug('game', 'socket.game_state.sampled', { total: downStates, ph });\n // Rule (incl. the stale-snapshot window and why `se` is read from this\n // same payload) lives in lib/gameMatchState.ts, with tests.\n const update = resolveMatchState(ph, se, Date.now() - playingSinceRef.current);\n if (update.rejectedStale) {\n debug('game', 'match.ended-rejected-stale', { sincePlaying: Date.now() - playingSinceRef.current, ph });\n return;\n }\n if (!update.endMatch) return;\n debug('game', 'match.ended', { phase: update.outcome });\n if (update.sessionOver !== undefined) setSessionOver(update.sessionOver);\n setMatchPhase((cur) => (cur === 'playing' ? 'ended' : cur));\n };\n let downInputs = 0;\n const onInput = (payload: GameInputPayload) => {\n if (++downInputs % 30 === 0) debug('game', 'socket.game_input.sampled', { total: downInputs, fromClientId: payload?.fromClientId });\n postDown({ type: 'input', fromClientId: payload?.fromClientId, d: payload?.d });\n };\n // Forward game_active to Bevy as a 'preview' bridge message so it can\n // build the actual game world (right player count + spawn-point\n // sprites) while the cover/countdown is up. Without this, Bevy stays\n // in Mode::Waiting with no level until game_start, and the operator\n // sees a black canvas during countdown then a sudden world-pop on GO\n // (visible flicker as the world regenerates).\n //\n // RACE: game_active can arrive from the server BEFORE the iframe's\n // HTML has finished loading and attached its 'message' listener.\n // Cross-origin iframes (parent on hadoku.me, iframe on\n // watchparty.hadoku.me through Cloudflare) hit this race in prod\n // every time — the 'preview' postMessage is delivered but the\n // iframe never sees it. Cache the payload so the iframeReady-bridge\n // effect can replay it as soon as Bevy reports it's listening.\n const onActive = (payload: GameActivePayload) => {\n if (!payload?.gameId || !payload?.seed) return;\n debug('game', 'socket.game_active.preview', { gameId: payload.gameId, players: payload.players?.length });\n lastActivePayloadRef.current = payload;\n postDown({ type: 'preview', payload });\n // session_reset (Bevy's ESC-to-lobby) broadcasts a fresh game_active\n // with a new seed. From 'ended' we drop back to 'pre-start' so the\n // React Start button reappears and the leaderboard auto-closes. Safe\n // to fire from 'ended' only — mid-match game_set_bots also rebroadcasts\n // game_active with a new seed, but matchPhase is 'playing' there so\n // this branch is skipped.\n setMatchPhase((cur) => (cur === 'ended' ? 'pre-start' : cur));\n setSessionOver(false);\n };\n // Server-broadcast countdown — every client in the room flips to\n // 'countdown' together so viewers see the same 3-2-1-GO digits the\n // leader sees (was leader-only before, viewers jumped straight from\n // cover → playing). The leader also receives their own broadcast\n // back, so the local setState in handleStartClick is redundant but\n // harmless (eventual consistency).\n const onCountdown = (_payload: GameCountdownPayload) => {\n debug('game', 'socket.game_countdown');\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n // A new countdown means a new round (or new session). Clear the\n // session-over latch so the auto-loop re-engages on the next round\n // end. (Bevy resets its own Session resource when 'start' arrives\n // after session_over.)\n setSessionOver(false);\n };\n // Forward room chat → Bevy speech-bubble overlay above each player\n // (hud.rs render_overlays + ChatBubbles). Bevy maps the inbound\n // clientId → playerId via its slot table; a sender who isn't in\n // the current match is silently dropped.\n const onChatBroadcast = (m: ChatBroadcastPayload) => {\n const cid = m?.client_id;\n const text = m?.text;\n if (!cid || typeof text !== 'string' || !text) return;\n postDown({ type: 'chat', clientId: cid, text });\n };\n // Forward presence (roster/identity) → Bevy. When a player picks a new\n // character mid-game, Bevy swaps that player's sprite live without\n // waiting for the next match to start. Per-user fan-out keeps the\n // bridge contract identical regardless of why presence changed\n // (new player, identity update, disconnect).\n const onPresence = (data: PresencePayload) => {\n const users = data?.users;\n if (!Array.isArray(users)) return;\n for (const u of users) {\n if (!u?.client_id) continue;\n postDown({\n type: 'identity',\n clientId: u.client_id,\n name: u.name ?? '',\n sprite: u.sprite_id ?? u.sprite ?? null,\n });\n }\n };\n socket.on(GAME_EVENTS.COUNTDOWN, onCountdown);\n socket.on(GAME_EVENTS.ACTIVE, onActive);\n socket.on(GAME_EVENTS.START, onStart);\n socket.on(GAME_EVENTS.STATE, onState);\n socket.on(GAME_EVENTS.INPUT, onInput);\n socket.on(CORE_EVENTS.CHAT_BROADCAST, onChatBroadcast);\n socket.on('presence', onPresence);\n\n return () => {\n window.removeEventListener('message', onMessage);\n socket.off(GAME_EVENTS.COUNTDOWN, onCountdown);\n socket.off(GAME_EVENTS.ACTIVE, onActive);\n socket.off(GAME_EVENTS.START, onStart);\n socket.off(GAME_EVENTS.STATE, onState);\n socket.off(GAME_EVENTS.INPUT, onInput);\n socket.off(CORE_EVENTS.CHAT_BROADCAST, onChatBroadcast);\n socket.off('presence', onPresence);\n };\n }, [gameOrigin]);\n\n // Refocus the iframe canvas after any click outside the chat input or\n // character modal. Without this the game silently loses keyboard control\n // when the user clicks the starfield, the volume slider, or anywhere\n // else on the page — they'd have to click back inside the canvas to get\n // WASD working again. We use a bubble-phase listener so button onClick\n // handlers run first; the postMessage to Bevy ('focusgame') triggers\n // canvas.focus() on the Bevy side.\n //\n // FOCUS-TRAP GUARD: gate every focus push on `document.hasFocus()` AND\n // `!document.hidden`. A user click can still arrive in the watchparty\n // document via bubbling from a same-origin click that synced into a\n // backgrounded tab; if that fires `canvas.focus()` while another tab/\n // window has the user's actual attention, the browser may yank focus\n // back to watchparty (the 2026-05-25 viewer report \"couldn't interact with\n // any other websites until closing watchparty\" report). The guard is\n // belt-and-suspenders — if the tab isn't actively focused we simply\n // skip the refocus.\n useEffect(() => {\n if (!iframeReady) return;\n const onDocClick = (e: MouseEvent) => {\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const t = e.target as Element | null;\n if (!t) return;\n // Don't steal focus from text inputs (chat, search, identity name).\n if (t.closest('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n document.addEventListener('click', onDocClick);\n return () => document.removeEventListener('click', onDocClick);\n }, [iframeReady, gameOrigin]);\n\n // Auto-focus the game canvas when the match transitions to 'playing'. The\n // leader's Start click landed on the React button (not the iframe), so\n // without this push the player has to click the canvas to get WASD/arrows\n // working — the bug operators kept hitting. Same FOCUS-TRAP GUARD as\n // onDocClick (skip when tab is hidden / not focused), and bail if a text\n // input has focus (someone typing chat at countdown-end shouldn't lose it).\n useEffect(() => {\n if (!iframeReady) return;\n if (matchPhase !== 'playing') return;\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const active = document.activeElement;\n if (active?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }, [iframeReady, matchPhase, gameOrigin]);\n\n // When a text input (chat, etc.) loses focus, route focus back to the\n // game. Operator rule: \"the game always has focus unless chat is open.\"\n // Triggers on chat's onKeyDown(Enter) → input.blur() and on chat-input\n // → outside-click flows. Skipped when focus is moving to another text\n // input (Tab between inputs stays in inputs).\n useEffect(() => {\n if (!iframeReady) return;\n const onFocusOut = (e: FocusEvent) => {\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const src = e.target as Element | null;\n if (!src?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const next = e.relatedTarget as Element | null;\n if (next?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n document.addEventListener('focusout', onFocusOut);\n return () => document.removeEventListener('focusout', onFocusOut);\n }, [iframeReady, gameOrigin]);\n\n return (\n // Wrapper: full-room overlay but pointer-events-none so the starfield\n // behind it shows around the frame; the framed panel re-enables clicks.\n <div className=\"absolute inset-0 z-30 flex items-center justify-center pointer-events-none\">\n <div\n className=\"relative pointer-events-auto bg-black\"\n style={panelSizeStyle}\n >\n {/* The iframe fills the whole square (the frame overlays on top of it\n via the <img> below). Iframes carry an HTML default of 300×150 that\n CSS top/right/bottom/left + auto sizing does NOT override, so we\n use explicit width/height 100% on a positioned ancestor. */}\n <iframe\n ref={iframeRef}\n src={gameUrl}\n title=\"Waiting room game\"\n className=\"absolute inset-0 block w-full h-full border-0\"\n allow=\"autoplay; fullscreen; gamepad\"\n />\n {/* Title art — visible during 'pre-start' (initial cover) AND during\n 'countdown' (covers up the rebuilt world while the 3-2-1-GO\n ticks). The transition-opacity duration-1000 drives a fade in\n on 'ended' → 'countdown' (restart) and a fade out on\n 'countdown' → 'playing' (game starts). Without this restart\n looked like an instant cut to the new game with the countdown\n overlaying it — the operator's \"game is restarted instantly\n and players are given control and THEN the countdown starts\"\n report. Hidden during 'ended' so the Bevy game-over splash on\n the frozen canvas remains visible until R-press / auto-restart.\n Padded inset keeps the artwork inside the panel-frame. Image\n is 1024² (upscaled from 384² with lanczos). */}\n <img\n src={bombermanCoverUrl}\n alt=\"\"\n aria-hidden\n data-testid=\"bomberman-cover\"\n // `animate-cover-in` (keyframe in styles.css) drives a fresh\n // 0→1 fade-in on every mount — including when the leader's\n // back-to-lobby fully remounts GameModule. The transition-\n // opacity below handles the Start-click fade-out and any\n // mid-session phase changes. The two don't conflict because\n // the animation only fires on mount.\n className={`absolute pointer-events-none select-none object-contain transition-opacity duration-1000 animate-cover-in ${\n matchPhase === 'pre-start' || !worldReady ? 'opacity-100' : 'opacity-0'\n }`}\n style={{ top: '5.5%', left: '5.5%', right: '5.5%', bottom: '5.5%', width: '89%', height: '89%' }}\n draggable={false}\n />\n {/* Participants strip — visible during 'pre-start' AND 'countdown'.\n Shows who's currently in the room with their picked character.\n Pulled from live presence roster, not the locked game_active\n payload, so late joiners appear immediately. Positioned top-\n center so it sits above the Start button without colliding with\n the title art's main composition. */}\n {(matchPhase === 'pre-start' || matchPhase === 'countdown') && (participants.length > 0 || botChips.length > 0) && (\n <div\n className=\"absolute z-10 pointer-events-none select-none flex flex-col items-center gap-1\"\n style={{ top: '12%', left: '50%', transform: 'translateX(-50%)' }}\n >\n <span className=\"text-[10px] font-black uppercase tracking-wider\" style={legendLabelStyle}>\n Players\n </span>\n <div className=\"flex items-start gap-3 flex-wrap justify-center\" style={{ maxWidth: '70%' }}>\n {participants.map((u) => {\n const color = colorForSprite(u.sprite);\n const wins = gameSessionWins[u.clientId] ?? 0;\n const hasCrown = u.clientId === crownClientId;\n return (\n <div key={u.clientId} className=\"relative flex flex-col items-center gap-0.5\" style={{ minWidth: 40 }}>\n {/* Crown overlay — drawn ABOVE the avatar for the unique\n top scorer. Pure-CSS emoji-style sits OK on top of\n cover art without a sprite asset. */}\n {hasCrown && (\n <span\n aria-label=\"top player crown\"\n className=\"absolute pointer-events-none select-none\"\n style={{\n top: -18,\n left: '50%',\n transform: 'translateX(-50%) rotate(-8deg)',\n fontSize: 22,\n filter: 'drop-shadow(0 2px 3px rgba(0,0,0,0.7))',\n textShadow: '0 0 6px rgba(255,215,0,0.6)',\n lineHeight: 1,\n }}\n >\n <Icon name=\"crown\" />\n </span>\n )}\n {u.sprite ? (\n <img\n src={spriteUrlFor(u.sprite)}\n alt={u.sprite}\n crossOrigin=\"anonymous\"\n className=\"w-9 h-9 rounded-full object-cover\"\n style={{\n border: `2px solid ${color}`,\n boxShadow: `0 0 6px ${color}aa, 0 2px 4px rgba(0,0,0,0.6)`,\n background: 'rgba(0,0,0,0.4)',\n }}\n draggable={false}\n />\n ) : (\n <span\n className=\"w-9 h-9 rounded-full\"\n style={{ background: color, boxShadow: '0 2px 4px rgba(0,0,0,0.6)' }}\n />\n )}\n <span className=\"text-[11px] font-bold max-w-[60px] truncate\" style={legendLabelStyle}>\n {u.name || 'Anon'}\n </span>\n {wins > 0 && (\n <span\n className=\"text-[10px] font-black\"\n style={{ ...legendLabelStyle, color: '#fde047' /* yellow-300 */ }}\n >\n {wins} W\n </span>\n )}\n </div>\n );\n })}\n {/* Bot chips — visually distinct from humans via dashed border\n + \"BOT\" tag underneath. Sprite picks come from botChips\n memo above, which mirrors server buildPlayerRoster. */}\n {botChips.map((b) => {\n const color = colorForSprite(b.sprite);\n return (\n <div key={b.clientId} className=\"relative flex flex-col items-center gap-0.5\" style={{ minWidth: 40 }}>\n <img\n src={spriteUrlFor(b.sprite)}\n alt={b.sprite}\n crossOrigin=\"anonymous\"\n className=\"w-9 h-9 rounded-full object-cover\"\n style={{\n border: `2px dashed ${color}`,\n boxShadow: `0 0 6px ${color}66, 0 2px 4px rgba(0,0,0,0.6)`,\n background: 'rgba(0,0,0,0.4)',\n opacity: 0.85,\n }}\n draggable={false}\n />\n <span className=\"text-[11px] font-bold max-w-[60px] truncate\" style={legendLabelStyle}>\n {b.name}\n </span>\n <span\n className=\"text-[9px] font-black uppercase tracking-wider\"\n style={{ ...legendLabelStyle, color: '#94a3b8' /* slate-400 */ }}\n >\n Bot\n </span>\n </div>\n );\n })}\n </div>\n {/* Leader-only bot +/− controls. Visible only during pre-start\n (locked once countdown begins so the roster matches what\n Bevy built the world for). Disabled when at the cap (0 or\n MAX_GAME_PLAYERS - humans). */}\n {isLeader && matchPhase === 'pre-start' && (\n <div\n className=\"pointer-events-auto flex items-center gap-2 mt-1\"\n data-testid=\"bomberman-bot-controls\"\n >\n <button\n type=\"button\"\n onClick={() => emitGameSetBots(Math.max(0, gameBotCount - 1))}\n disabled={!canRemoveBot}\n aria-label=\"Remove a bot\"\n className=\"font-black\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 6,\n border: '1px solid #5b6473',\n background: canRemoveBot\n ? 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)'\n : 'linear-gradient(180deg, #6b7280 0%, #4b5563 100%)',\n color: canRemoveBot ? '#111' : '#9ca3af',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontSize: 16,\n lineHeight: 1,\n cursor: canRemoveBot ? 'pointer' : 'not-allowed',\n textShadow: 'none',\n }}\n >\n −\n </button>\n <span\n className=\"text-[10px] font-black uppercase tracking-wider\"\n style={legendLabelStyle}\n >\n {gameBotCount} Bot{gameBotCount === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n onClick={() => emitGameSetBots(gameBotCount + 1)}\n disabled={!canAddBot}\n aria-label=\"Add a bot\"\n className=\"font-black\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 6,\n border: '1px solid #5b6473',\n background: canAddBot\n ? 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)'\n : 'linear-gradient(180deg, #6b7280 0%, #4b5563 100%)',\n color: canAddBot ? '#111' : '#9ca3af',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontSize: 16,\n lineHeight: 1,\n cursor: canAddBot ? 'pointer' : 'not-allowed',\n textShadow: 'none',\n }}\n >\n +\n </button>\n </div>\n )}\n </div>\n )}\n {/* Controls hint — visible only on the title cover (pre-start).\n Operator asked for Movement and Bomb on the SAME ROW (was\n stacked vertically before). Two clusters sit side-by-side in\n the bottom-right; each cluster has its own label above its\n keys. White-outlined keycaps stand out on any cover-art\n background; no theme tokens used (game UI stays consistent\n across light/dark theme). */}\n {matchPhase === 'pre-start' && (\n <div\n className=\"absolute z-20 pointer-events-none select-none flex items-end gap-6\"\n style={{ right: '8%', bottom: '8%' }}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <span className=\"text-xs font-black uppercase tracking-wider\" style={legendLabelStyle}>Movement</span>\n <div className=\"flex items-start gap-2\">\n <div className=\"grid grid-cols-3 gap-0.5\">\n <div />\n <Keycap label=\"W\" />\n <div />\n <Keycap label=\"A\" />\n <Keycap label=\"S\" />\n <Keycap label=\"D\" />\n </div>\n <span className=\"self-center text-xs font-black opacity-90\" style={legendLabelStyle}>or</span>\n <div className=\"grid grid-cols-3 gap-0.5\">\n <div />\n <Keycap label=\"↑\" />\n <div />\n <Keycap label=\"←\" />\n <Keycap label=\"↓\" />\n <Keycap label=\"→\" />\n </div>\n </div>\n </div>\n <div className=\"flex flex-col items-center gap-1\">\n <span className=\"text-xs font-black uppercase tracking-wider\" style={legendLabelStyle}>Bomb</span>\n <Keycap label=\"SPACE\" wide />\n </div>\n </div>\n )}\n {/* Frame overlay — drawn ABOVE the iframe so the decorative corners\n sit on top of the canvas instead of being covered by it. */}\n <img\n src={panelFrameUrl}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 w-full h-full pointer-events-none select-none\"\n draggable={false}\n />\n {/* Top-right control cluster — Audio (everyone) + Lobby (leader)\n + Close (leader). Single horizontal row anchored at top:4%\n with `gap-4` between buttons so the three bezels breathe (the\n previous gap-2 made them look squished against each other). */}\n <div\n className=\"absolute z-10 flex items-center gap-4\"\n style={{ top: '4%', right: '8%' }}\n >\n {/* Audio sub-cluster — leftmost. The slider expands leftward from\n the volume button on hover (origin-right), so the bar visually\n grows out toward the cluster's left edge. Leaderboard lives\n OUTSIDE this onMouseEnter wrapper, to the RIGHT of the volume\n button, so hovering it does NOT pop the volume slider. */}\n <div\n className=\"flex items-center gap-2\"\n onMouseEnter={() => setVolumeOpen(true)}\n onMouseLeave={() => setVolumeOpen(false)}\n title={`Game volume: ${Math.round(volume * 100)}%`}\n >\n {/* Explosion-chunk bar — invisible until hover; flex row of 10 cells */}\n <div\n role=\"slider\"\n aria-label=\"Game volume\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(volume * 100)}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n setVolume(Math.max(0, Math.round(volume * 10 - 1) / 10));\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n setVolume(Math.min(1, Math.round(volume * 10 + 1) / 10));\n }\n }}\n onFocus={() => setVolumeOpen(true)}\n onBlur={() => setVolumeOpen(false)}\n className={`flex items-center bg-black/40 backdrop-blur px-1.5 py-1 rounded transition-all duration-200 origin-right ${\n volumeOpen ? 'opacity-100 scale-x-100' : 'opacity-0 scale-x-0 pointer-events-none'\n }`}\n >\n {Array.from({ length: 10 }, (_, i) => {\n const filled = (i + 1) <= Math.round(volume * 10);\n const isLast = i === 9;\n return (\n <button\n key={i}\n type=\"button\"\n aria-label={`Set volume to ${(i + 1) * 10}%`}\n onClick={() => setVolume((i + 1) / 10)}\n className=\"flex-shrink-0 cursor-pointer hover:scale-110 transition-transform\"\n style={{ width: 14, height: 22, padding: 0, background: 'none', border: 'none' }}\n >\n <img\n src={isLast ? explosionEndUrl : explosionArmUrl}\n alt=\"\"\n draggable={false}\n className=\"w-full h-full pointer-events-none select-none\"\n style={{\n opacity: filled ? 1 : 0.25,\n filter: filled\n ? 'drop-shadow(0 0 3px rgba(255,140,0,0.7))'\n : 'grayscale(1)',\n }}\n />\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={() => setVolume(volume === 0 ? DEFAULT_VOLUME : 0)}\n aria-label={volume === 0 ? 'Unmute game' : 'Mute game'}\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform rounded-full\"\n style={{\n // Backdrop ring + drop-shadow so the gray-on-gray bezel is\n // visible against the (also dark) game canvas. Operator\n // reported the prior naked-icon version was hard to see.\n background: 'radial-gradient(circle, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 70%)',\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={volumeIconUrl}\n alt=\"\"\n className={`w-full h-full select-none pointer-events-none transition-opacity ${\n volume === 0 ? 'opacity-50 grayscale' : 'opacity-100'\n }`}\n draggable={false}\n />\n </button>\n </div>\n {/* Leaderboard — sits to the RIGHT of the audio cluster so\n hovering it stays outside the volume hover region. Visible\n to everyone (anyone can browse the rankings). */}\n <button\n type=\"button\"\n onClick={() => setLeaderboardOpen(true)}\n aria-label=\"Open leaderboard\"\n title=\"Leaderboard\"\n data-testid=\"bomberman-leaderboard-btn\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={leaderboardIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n {/* Back to Lobby — leader only. Re-mounts the game module across\n all clients (emit null then re-select bomberman) so everyone\n lands back on the title cover with a fresh server roster. */}\n {isLeader && (\n <button\n type=\"button\"\n onClick={() => { emitGameSelect(null); setTimeout(() => emitGameSelect('bomberman'), 100); }}\n aria-label=\"Back to lobby\"\n title=\"Back to lobby\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={lobbyIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n )}\n {/* Close — leader only. Unmounts the game module everywhere; room\n returns to its idle media-less state. */}\n {isLeader && (\n <button\n type=\"button\"\n onClick={() => emitGameSelect(null)}\n aria-label=\"Stop game\"\n title=\"Stop game\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={closeIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n )}\n </div>\n {/* Countdown overlay — sits centered over the live game canvas\n during 'countdown'. The cover fades on Start click (so the board\n is visible underneath); the digit pops in on each tick + beeps.\n Leader's onClick already initiated the countdown locally; the\n effect on countdown===0 calls emitGameStart, and the resulting\n server broadcast flips everyone to 'playing'. */}\n {matchPhase === 'countdown' && (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center pointer-events-none select-none\">\n <div\n key={countdown}\n className=\"text-[10rem] font-black animate-[ping_0.5s_ease-out]\"\n style={{\n fontFamily: 'system-ui, sans-serif',\n // White fill + black outline — readable on any board state\n // behind it. The prior black-on-white inversion washed out\n // on light themes.\n color: '#fff',\n WebkitTextStroke: '6px #000',\n textShadow:\n '-3px -3px 0 #000, 3px -3px 0 #000, -3px 3px 0 #000, 3px 3px 0 #000, 0 8px 32px rgba(0,0,0,0.7)',\n }}\n >\n {countdown > 0 ? countdown : 'GO!'}\n </div>\n </div>\n )}\n {/* Leader-only Start button — only shown on the initial title screen\n ('pre-start'). After a match ends the leader auto-loops into the\n next countdown (POST_MATCH_HOLD_MS later), so no Play Again\n button is needed. Hardcoded black text with white outline (NOT\n theme tokens) so it stays readable on light AND dark themes\n regardless of bg-primary contrast. */}\n {/* Loading indicator while Bevy is still building the world. Visible\n during 'pre-start' AND 'countdown' (in case a restart catches\n Bevy in another rebuild — rare but possible). Replaces what\n was an invisible-disabled-Start-button state; user now sees\n explicit \"Loading game…\" feedback. */}\n {worldStatus === 'loading' && (matchPhase === 'pre-start' || matchPhase === 'countdown') && (\n <div\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-3 rounded bg-black/60 backdrop-blur text-text-secondary text-sm pointer-events-none flex items-center gap-2\"\n >\n <span className=\"inline-block w-4 h-4 border-2 border-white/40 border-t-white rounded-full animate-spin\" />\n Loading game…\n </div>\n )}\n {/* Error state. world_built didn't arrive within 30s — Bevy is hung\n or crashed. Show retry (refresh) instead of pretending readiness. */}\n {worldStatus === 'error' && (matchPhase === 'pre-start' || matchPhase === 'countdown') && (\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-4 rounded bg-black/80 backdrop-blur text-text text-sm flex flex-col items-center gap-3 pointer-events-auto\">\n <span className=\"bg-danger-bg text-on-danger-bg px-2 py-0.5 rounded font-semibold\">Game failed to load</span>\n <span className=\"text-text-secondary text-xs\">Bevy didn't report ready within 30s.</span>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-3 py-1 rounded bg-bg-card hover:bg-bg-alt text-xs cursor-pointer\"\n >\n Refresh\n </button>\n </div>\n )}\n {isLeader && matchPhase === 'pre-start' && worldStatus === 'ready' && (\n <button\n type=\"button\"\n onClick={handleStartClick}\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-10 py-4 rounded-xl text-3xl font-black tracking-wide hover:brightness-110 transition-all cursor-pointer\"\n style={{\n // Plain white text on a red gradient. NO text-stroke — earlier\n // attempts stacked a 2px black stroke + multi-direction black\n // text-shadow on top of the white fill, which on small/medium\n // glyphs made the text read as nearly all-black (the operator\n // saw \"black text on red, unreadable\"). A single soft shadow\n // for legibility + a 2px white inner ring on the button gives\n // a clean call-to-action look that's theme-independent.\n background: 'linear-gradient(180deg, #ef4444 0%, #b91c1c 100%)',\n color: '#fff',\n textShadow: '0 2px 4px rgba(0,0,0,0.6)',\n boxShadow:\n 'inset 0 0 0 2px rgba(255,255,255,0.6), 0 4px 12px rgba(0,0,0,0.4)',\n }}\n >\n Start Game\n </button>\n )}\n {/* Non-leader hint while waiting for the host's first Start. Only\n shown once Bevy is ready — otherwise the Loading/Error indicators\n occupy that slot. */}\n {!isLeader && matchPhase === 'pre-start' && worldStatus === 'ready' && (\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-3 rounded bg-black/60 backdrop-blur text-text-secondary text-sm pointer-events-none\">\n Waiting for the host to start the game…\n </div>\n )}\n </div>\n <LeaderboardModal\n open={leaderboardOpen}\n onClose={() => setLeaderboardOpen(false)}\n />\n </div>\n );\n}\n"],"names":["panelFrameUrl","STALE_SNAPSHOT_WINDOW_MS","PH_RUNNING","PH_DRAW","IGNORE","resolveMatchState","ph","se","sincePlayingMs","volumeIconUrl","closeIconUrl","lobbyIconUrl","leaderboardIconUrl","explosionArmUrl","explosionEndUrl","bestMultiTier","r","groupBySession","matches","bySession","m","list","groups","sid","rounds","a","b","ended","final","endingRound","s","STATS_API","fetchJson","url","res","warn","err","AvatarTile","sprite","fallbackInitial","size","tint","colorForSprite","jsx","isCharacterId","spriteUrlFor","LeaderboardModal","open","onClose","tab","setTab","useState","personal","setPersonal","lifetime","setLifetime","setMatches","loading","setLoading","fetchKey","startedKey","setStartedKey","useEffect","cancelled","debug","onKey","e","createPortal","jsxs","TabButton","PersonalView","LifetimeView","GamesView","active","onClick","children","data","agg","name","StatGrid","LIFETIME_COLUMNS","v","c","i","LifetimeRow","row","rank","isLeader","StarIcon","raw","text","bestMulti","stats","useMemo","StatTile","label","value","accent","compact","expandedSid","setExpandedSid","games","g","GameCard","game","expanded","onToggle","roundIdx","setRoundIdx","currentRound","detail","setDetail","detailLoading","setDetailLoading","detailRound","startedRound","setStartedRound","outcome","outcomeColor","dateLabel","roundCount","MatchDetailTable","sortedPlayers","p","Keycap","wide","legendLabelStyle","VOLUME_STORAGE_KEY","DEFAULT_VOLUME","COUNTDOWN_SECS","POST_MATCH_HOLD_MS","audioGainFromSlider","loadStoredVolume","readStored","resolveGameUrl","base","getRuntimeServerOrigin","sep","isLeaderNow","snapshot","me","useAppStore","GameModule","iframeRef","useRef","lastActivePayloadRef","leaderId","myClientId","roster","participants","gameSessionWins","gameBotCount","botChips","next","botSpritePicker","_","humanCount","canAddBot","MAX_GAME_PLAYERS","canRemoveBot","totalPlayers","panelMaxPx","panelSizeStyle","crownClientId","topId","topCount","tied","cid","count","gameUrl","volume","setVolume","matchPhase","setMatchPhase","countdown","setCountdown","sessionOver","setSessionOver","volumeOpen","setVolumeOpen","iframeReady","setIframeReady","worldStatus","setWorldStatus","worldReady","gameOrigin","handleStartClick","emitGameCountdown","id","n","countdownAudioCtxRef","Ctor","ctx","isGo","freq","durSec","peakGain","osc","gain","t0","sent","sendUnlock","win","leaderboardOpen","setLeaderboardOpen","sessionOverRef","playingSinceRef","emitGameSync","writeStored","targetOrigin","sliderGain","post","timers","t","socket","getSocket","postDown","msg","upInputs","upStates","onMessage","GAME_EVENTS","emitGameSessionReset","onStart","payload","downStates","onState","update","cur","downInputs","onInput","onActive","onCountdown","_payload","onChatBroadcast","onPresence","users","u","CORE_EVENTS","onDocClick","onFocusOut","bombermanCoverUrl","color","wins","hasCrown","Icon","emitGameSetBots","filled","isLast","emitGameSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GameModule-Dx3GHtRk.js","sources":["../../src/assets/games/panel-frame.png","../../src/lib/gameMatchState.ts","../../src/assets/games/bomberman/volume-icon.png","../../src/assets/games/bomberman/close-icon.png","../../src/assets/games/bomberman/lobby-icon.png","../../src/assets/games/bomberman/leaderboard-icon.png","../../src/assets/games/bomberman/explosion-arm.png","../../src/assets/games/bomberman/explosion-end.png","../../src/lib/leaderboardStats.ts","../../src/components/LeaderboardModal.tsx","../../src/components/GameModule.tsx"],"sourcesContent":["export default \"data:image/png;base64,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\"","/**\n * What a host snapshot means for match state.\n *\n * Extracted from GameModule.tsx's `game_state` handler (2026-08-17). The rule\n * is small but it is the settled form of two production bugs, and it lived\n * inside a 274-line socket effect inside a 1352-line component where nothing\n * could reach it:\n *\n * - **Stale-snapshot rejection.** `ph` frames from a just-ended prior round\n * arrive ~50-300ms after the client enters 'playing'. Acting on them kicks\n * matchPhase back to 'ended' and the auto-loop fires another restart 5s\n * later — the 2026-05-30 double-restart bug. Anything inside\n * `STALE_SNAPSHOT_WINDOW_MS` of entering 'playing' is ignored.\n * - **`se` must come from THIS payload.** sessionOver used to arrive on a\n * separate `game_result` bridge message, which could race the snapshot: if\n * matchPhase flipped to 'ended' first, the auto-loop scheduled its restart\n * with a stale `sessionOver=false` (\"game still restarts at 100\"). Reading\n * both out of one payload removes the race by construction — so a future\n * refactor must not split them back apart.\n */\n\n/** Generous enough for prod RTT plus event-loop backlog, short enough not to\n * swallow a legitimate sub-second match. */\nexport const STALE_SNAPSHOT_WINDOW_MS = 700;\n\n/** `ph` sentinel: the match is still running. */\nexport const PH_RUNNING = -1;\n/** `ph` sentinel: the match ended in a draw. */\nexport const PH_DRAW = -2;\n\nexport interface MatchStateUpdate {\n /** Move matchPhase 'playing' -> 'ended'. */\n endMatch: boolean;\n /** Set sessionOver to this, when the payload carried `se`. */\n sessionOver?: boolean;\n /** The snapshot named a result but arrived inside the staleness window. */\n rejectedStale: boolean;\n /** For logging: 'draw' or `win-<pid>`. Only set when endMatch is true. */\n outcome?: string;\n}\n\nconst IGNORE: MatchStateUpdate = { endMatch: false, rejectedStale: false };\n\n/**\n * @param ph snapshot `d.ph` — winner pid, or PH_RUNNING/PH_DRAW\n * @param se snapshot `d.se` — 1 when the session is over\n * @param sincePlayingMs ms since the client entered 'playing'\n */\nexport function resolveMatchState(\n ph: unknown,\n se: unknown,\n sincePlayingMs: number,\n): MatchStateUpdate {\n // No result in this frame — nothing to decide.\n if (typeof ph !== 'number' || ph === PH_RUNNING) return IGNORE;\n\n if (sincePlayingMs < STALE_SNAPSHOT_WINDOW_MS) {\n return { endMatch: false, rejectedStale: true };\n }\n\n return {\n endMatch: true,\n rejectedStale: false,\n outcome: ph === PH_DRAW ? 'draw' : `win-${ph}`,\n ...(typeof se === 'number' ? { sessionOver: se === 1 } : {}),\n };\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAAAAAAAAQCEeRdzAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAE7SURBVHic7ZuxDcJAFEP/DBSZgAVYAGgYgSpL0KSCMZgDiQkYgiIDBFFSUdF8ziGKlCKiO0f5tvQKqGzrUpAzZpIkSZIkSUnN2opElagTPjPqLlsxFr6cgMlclJHDD0tofseebYZFgQLwXPhja/7am38O5n6aJ8iGjMjaFVChgPq545vLytEcmZHd0Aa+oJsigOyGI8E2wgLZbc7P/D+Q3dgm2KiA/sN54X5bud838wYZkXVQwGXJN5YbZG4LQBtsMyxSdgtx7MdI2Y1ugowKYBtgowL8ffXIqAC2ATYqgG2AjQpgG2CjAtgG2KgAtgE2+i3ANsBGBbANsNE7Qb0VDn8voJsh/v3cNO4Gg6J9QPiFSLsRmoCZ7By7jVC/Egs2lOpXYtoJRl+Kht8KBx1MD8Pr/wKSJEmSFFJfdobRUx2lMHUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAAAAAAAAQCEeRdzAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAHxSURBVHic7Zu9SsRAEIDXSrARkXCFb3DgC4h4aCOCloKt2MkJgs0V+gC+gBCsrkzplT6DnUJKCwXFQxu10GbcgQtE2TXZkL3sZGbga3Obj9nZn8wpJSEhISEhIcE2HtYUEOBTk2oSzYlmVbPASYCNsaav6XAVkGek6XIWkJE4ZQScKgiegYLvYwUfBwpedxU8beoX7RWK2GuPAAvv+xMZdglDzWxrBWR8HSl43rJKwNVjvtUC8hnxuG6UMLZKaHrQPrBMi9Q4HZoerC9ets01gY2AfyT8Xh3gtgfBcrMCcL0MMFwCOJ+rczp0aAgwEUcAZzNOEgyFMaErIMsMh4zA1cGQBV26AjIuFktLMOwTRvQFOEjAzZKxFjT+AnVQcjoYCmK/HQKwJpQojIZaMG6HACSOSmXB31OkPmNeQTC8XQLcHwLcbVSTUGEahCUgT7rjpRbgfQINAYhrJuCOsUAAXqrQEYDTwUUAbpsLBODNEh0BWBNcV4OiOjCgJADxUAjpCGCfAexrAOtVgOU+oJGdYJUfCpE4qngWaHrgdcD+NMj6PoD1jRDbO0HWt8JxxOi7wFS+DFV4KBXKfRsMYKBTfHkeX4fZ9gew7RBh2yPEp0vMZ59gwUMo4tYpGsCA64JlrzCbbnF//xeQkJCQkJDgGz+iEXGyPHkPEAAAAABJRU5ErkJggg==\"","/**\n * Leaderboard/match-history data model and the derivations over it.\n *\n * Extracted from LeaderboardModal.tsx (2026-08-17). These are pure and were\n * previously unreachable by any test because they lived inside a modal\n * component — which matters here more than usual, because both encode\n * non-obvious rules that read like bugs to anyone who has not seen the\n * comments:\n *\n * - `bestMultiTier` deliberately IGNORES the `best_multi_kill` aggregate\n * column, because that column is round-level and `writeMatch` attributes it\n * to every participant of the round. It derives the tier from the per-player\n * per-tier counters instead. A well-meaning \"simplification\" back to the\n * aggregate column would silently over-credit every player in a match.\n * - `groupBySession` DROPS sessions with no `session_over` round, per operator\n * spec: a game that never concluded should not claim stats.\n */\n\nexport interface AggregateRow {\n owner5?: string;\n display_name?: string | null;\n elo?: number;\n last_sprite?: string | null;\n matches_played?: number;\n matches_won?: number;\n sessions_won?: number;\n draws?: number;\n deaths?: number;\n kills?: number;\n self_kills?: number;\n first_bloods?: number;\n soul_pickups?: number;\n powerups_collected?: number;\n bombs_placed?: number;\n blocks_destroyed?: number;\n kicks?: number;\n kills_by_kick?: number;\n kills_by_chain?: number;\n trapkills?: number;\n double_kills?: number;\n triple_kills?: number;\n quad_kills?: number;\n penta_kills?: number;\n hexa_kills?: number;\n hepta_kills?: number;\n octa_kills?: number;\n nona_kills?: number;\n deca_kills?: number;\n best_multi_kill?: number;\n best_chain_kill?: number;\n total_round_score?: number;\n last_match_ts?: number;\n}\n\nexport interface LeaderboardResponse {\n version: number;\n period: string;\n dim: string;\n limit: number;\n rows: AggregateRow[];\n cached?: boolean;\n}\n\nexport interface MeResponse {\n version: number;\n aggregate: AggregateRow | null;\n}\n\nexport interface MatchListItem {\n match_id: number;\n game_id: string;\n session_id: string;\n round_no: number;\n draw: boolean;\n session_over: boolean;\n player_count: number;\n max_multi_kill: number;\n max_chain_kill: number;\n ts: number;\n winner_owner5: string | null;\n i_won: boolean;\n my_player_id: number;\n my_sprite: string | null;\n my_survived: boolean;\n my_round_score: number;\n my_kills: number;\n my_self_kills: number;\n my_first_bloods: number;\n}\n\nexport interface MatchListResponse {\n matches: MatchListItem[];\n}\n\nexport interface MatchDetailPlayer {\n player_id: number;\n owner5: string | null;\n display_name: string | null;\n sprite: string | null;\n survived: boolean;\n round_score: number;\n session_score: number;\n kills: number;\n self_kills: number;\n first_bloods: number;\n soul_pickups: number;\n powerups_collected: number;\n bombs_placed: number;\n blocks_destroyed: number;\n kicks: number;\n kills_by_kick: number;\n kills_by_chain: number;\n trapkills: number;\n double_kills: number;\n triple_kills: number;\n quad_kills: number;\n penta_kills: number;\n hexa_kills: number;\n hepta_kills: number;\n octa_kills: number;\n nona_kills: number;\n deca_kills: number;\n /** End-of-round upgrade snapshot. null on pre-v4 rows. */\n bomb_max: number | null;\n blast_len: number | null;\n is_bot: boolean;\n is_me: boolean;\n}\n\nexport interface MatchDetailResponse {\n match: {\n match_id: number;\n game_id: string;\n session_id: string;\n round_no: number;\n draw: boolean;\n session_over: boolean;\n player_count: number;\n max_multi_kill: number;\n max_chain_kill: number;\n ts: number;\n winner_owner5: string | null;\n };\n players: MatchDetailPlayer[];\n}\n\n\n/** Per-player \"best multi-kill achieved\" — derived from the per-tier\n * counts (double..deca are per-player and correct), NOT from the\n * best_multi_kill aggregate column (which is round-level and incorrectly\n * attributed to every participant by writeMatch). If a friend has any\n * deca-kill the best is 10; nona → 9; …; double → 2; else 0. */\nexport function bestMultiTier(r: AggregateRow): number {\n if ((r.deca_kills ?? 0) > 0) return 10;\n if ((r.nona_kills ?? 0) > 0) return 9;\n if ((r.octa_kills ?? 0) > 0) return 8;\n if ((r.hepta_kills ?? 0) > 0) return 7;\n if ((r.hexa_kills ?? 0) > 0) return 6;\n if ((r.penta_kills ?? 0) > 0) return 5;\n if ((r.quad_kills ?? 0) > 0) return 4;\n if ((r.triple_kills ?? 0) > 0) return 3;\n if ((r.double_kills ?? 0) > 0) return 2;\n return 0;\n}\n\n\n/** A \"game\" = all rounds sharing a session_id. The /matches endpoint\n * returns rounds; we group client-side. Each group is rendered as one\n * card summarizing the game; clicking expands to the final round's\n * per-player scoreboard. */\nexport interface GameGroup {\n session_id: string;\n rounds: MatchListItem[];\n final: MatchListItem;\n ended: boolean;\n i_won_game: boolean;\n my_final_score: number;\n my_total_kills: number;\n my_total_first_bloods: number;\n}\n\nexport function groupBySession(matches: MatchListItem[]): GameGroup[] {\n const bySession = new Map<string, MatchListItem[]>();\n for (const m of matches) {\n const list = bySession.get(m.session_id) ?? [];\n list.push(m);\n bySession.set(m.session_id, list);\n }\n const groups: GameGroup[] = [];\n for (const [sid, rounds] of bySession) {\n // Sort rounds ascending by round_no — final round = highest round_no.\n rounds.sort((a, b) => a.round_no - b.round_no);\n const ended = rounds.some(r => r.session_over);\n // In-progress games (no round flagged session_over) are intentionally\n // dropped from the history per operator spec: a game that didn't reach\n // a conclusion shouldn't claim stats. Re-played sessions that DID end\n // remain; truncated/abandoned sessions are silently culled.\n if (!ended) continue;\n const final = rounds[rounds.length - 1];\n const endingRound = rounds.find(r => r.session_over) ?? final;\n groups.push({\n session_id: sid,\n rounds,\n final,\n ended,\n i_won_game: endingRound.i_won,\n my_final_score: rounds.reduce((s, r) => s + (r.my_round_score ?? 0), 0),\n my_total_kills: rounds.reduce((s, r) => s + (r.my_kills ?? 0), 0),\n my_total_first_bloods: rounds.reduce((s, r) => s + (r.my_first_bloods ?? 0), 0),\n });\n }\n // Newest game first by timestamp of its latest round.\n groups.sort((a, b) => b.final.ts - a.final.ts);\n return groups;\n}\n\n","/**\n * Leaderboard modal — shown from the bomberman lobby.\n *\n * Three tabs: Personal | Lifetime | Matches.\n * Personal — `/watchparty/stats/api/me`; the caller's own aggregate row\n * with avatar, ELO, and a stat grid. 401 = signed out.\n * Lifetime — `/watchparty/stats/api/leaderboard?dim=elo&limit=20`; top\n * players as a sortable-ish data table with character avatars,\n * ELO, and richer per-player columns.\n * Matches — `/watchparty/stats/api/matches?limit=20`; the caller's\n * recent matches. Clicking a row expands it inline with the\n * full per-player breakdown for that match.\n *\n * Portaled to <body> so the GameModule wrapper's pointer-events tree and\n * stacking context don't swallow clicks.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { colorForSprite, isCharacterId, spriteUrlFor } from '../lib/characters';\nimport { StarIcon } from './controls/Icons';\nimport { debug, warn } from '../lib/debug';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n}\n\ntype Tab = 'personal' | 'lifetime' | 'games';\n\nimport {\n type AggregateRow, type LeaderboardResponse, type MeResponse,\n type MatchListResponse, \n type MatchDetailResponse, type GameGroup,\n bestMultiTier, groupBySession,\n} from '../lib/leaderboardStats';\n\nconst STATS_API = '/watchparty/stats/api';\n\nasync function fetchJson<T>(url: string): Promise<T | null> {\n try {\n const res = await fetch(url, { credentials: 'include' });\n if (!res.ok) {\n warn('stats', 'leaderboard fetch non-ok', { url, status: res.status });\n return null;\n }\n return (await res.json()) as T;\n } catch (err) {\n warn('stats', 'leaderboard fetch threw', { url, err: String(err) });\n return null;\n }\n}\n\n/** Sprite-aware avatar tile. Falls back to a colored block bearing the\n * friend's initial when the sprite is missing or unknown. Sized to match\n * the between-round Bevy scoreboard avatar at the default density. */\nfunction AvatarTile({\n sprite,\n fallbackInitial,\n size = 36,\n}: {\n sprite: string | null | undefined;\n fallbackInitial: string;\n size?: number;\n}) {\n const tint = colorForSprite(sprite);\n return (\n <div\n className=\"flex items-center justify-center flex-shrink-0 rounded overflow-hidden\"\n style={{\n width: size,\n height: size,\n background: `linear-gradient(180deg, ${tint}33 0%, ${tint}11 100%)`,\n border: `1px solid ${tint}88`,\n }}\n >\n {isCharacterId(sprite) ? (\n <img\n src={spriteUrlFor(sprite)}\n alt=\"\"\n className=\"w-full h-full object-contain select-none pointer-events-none\"\n draggable={false}\n />\n ) : (\n <span\n className=\"text-sm font-bold uppercase\"\n style={{ color: tint, textShadow: '0 1px 0 rgba(0,0,0,0.6)' }}\n >\n {fallbackInitial || '?'}\n </span>\n )}\n </div>\n );\n}\n\nexport default function LeaderboardModal({ open, onClose }: Props) {\n const [tab, setTab] = useState<Tab>('lifetime');\n const [personal, setPersonal] = useState<MeResponse | null>(null);\n const [lifetime, setLifetime] = useState<LeaderboardResponse | null>(null);\n const [matches, setMatches] = useState<MatchListResponse | null>(null);\n const [loading, setLoading] = useState(false);\n\n // Each open, and each tab switch while open, starts a fetch: mark it loading\n // in the same render rather than one effect later.\n const fetchKey = open ? tab : null;\n const [startedKey, setStartedKey] = useState<Tab | null>(null);\n if (fetchKey !== startedKey) {\n setStartedKey(fetchKey);\n if (fetchKey) setLoading(true);\n }\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n // fetchJson resolves null on every failure, so this never rejects.\n void (async () => {\n if (tab === 'personal') {\n const r = await fetchJson<MeResponse>(`${STATS_API}/me`);\n if (!cancelled) setPersonal(r);\n } else if (tab === 'lifetime') {\n const r = await fetchJson<LeaderboardResponse>(\n `${STATS_API}/leaderboard?dim=elo&limit=20`,\n );\n if (!cancelled) setLifetime(r);\n } else {\n // Games tab fetches at /matches's max (50 rounds) and groups by\n // session_id client-side. ~5-10 rounds per game means we'll get\n // 5-10 games' worth of recent history.\n const r = await fetchJson<MatchListResponse>(`${STATS_API}/matches?limit=50`);\n if (!cancelled) setMatches(r);\n }\n if (!cancelled) {\n setLoading(false);\n debug('stats', 'modal.fetched', { tab });\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [open, tab]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n onClose();\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n // No backdrop-filter: blur(...) recomposites the entire backplane on\n // every paint, which made every mouse-move inside the modal feel\n // laggy — the backplane was being re-blurred on each frame. A plain\n // bg-black/85 backdrop reads as \"the room is muted\" without the cost.\n // items-start + pt-[6vh] anchors the panel to a fixed Y near the top\n // of the screen so its TOP edge doesn't move when tab content changes\n // height; only the bottom edge grows downward until max-h is reached.\n // Vertical centering had been making the whole window jump around on\n // every tab switch.\n className=\"fixed inset-0 bg-black/85 flex items-start justify-center z-[10000] pointer-events-auto pt-[6vh] px-4\"\n onClick={onClose}\n role=\"presentation\"\n >\n <div\n className=\"relative w-full max-w-3xl max-h-[85vh] overflow-hidden flex flex-col\"\n onClick={e => e.stopPropagation()}\n style={{\n background: 'linear-gradient(180deg, #1a1d24 0%, #0f1116 100%)',\n border: '2px solid #4b5159',\n borderRadius: 10,\n boxShadow: '0 8px 32px rgba(0,0,0,0.7), inset 0 1px 0 rgba(255,255,255,0.05)',\n }}\n >\n <header\n className=\"px-5 py-3 flex items-center gap-3 border-b\"\n style={{\n borderColor: '#2a2d33',\n background: 'linear-gradient(180deg, #232730 0%, #1a1d24 100%)',\n }}\n >\n <h2\n className=\"text-base font-black uppercase tracking-widest\"\n style={{ color: '#f0d058', textShadow: '0 1px 0 rgba(0,0,0,0.6)' }}\n >\n Bomberman leaderboard\n </h2>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-xl leading-none w-8 h-8 flex items-center justify-center rounded hover:bg-white/15 active:bg-white/25\"\n style={{\n color: '#cbd0d8',\n background: '#1a1d24',\n border: '1px solid #4b5159',\n }}\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <nav\n className=\"px-5 py-2 border-b flex gap-1\"\n style={{ borderColor: '#2a2d33', background: '#171a20' }}\n >\n <TabButton active={tab === 'personal'} onClick={() => setTab('personal')}>\n Personal\n </TabButton>\n <TabButton active={tab === 'lifetime'} onClick={() => setTab('lifetime')}>\n Lifetime\n </TabButton>\n <TabButton active={tab === 'games'} onClick={() => setTab('games')}>\n Games\n </TabButton>\n </nav>\n\n <div className=\"flex-1 overflow-y-auto p-5\">\n {loading && (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Loading...\n </p>\n )}\n {!loading && tab === 'personal' && <PersonalView data={personal} />}\n {!loading && tab === 'lifetime' && <LifetimeView data={lifetime} />}\n {!loading && tab === 'games' && <GamesView data={matches} />}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction TabButton({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"px-3 py-1.5 rounded text-xs font-bold uppercase tracking-wider\"\n style={\n active\n ? {\n color: '#f0d058',\n background: '#272b35',\n border: '1px solid #4b5159',\n textShadow: '0 1px 0 rgba(0,0,0,0.6)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.05)',\n }\n : {\n color: '#cbd0d8',\n background: '#141821',\n border: '1px solid #2a2d33',\n }\n }\n onMouseEnter={e => {\n if (!active) {\n (e.currentTarget as HTMLButtonElement).style.background = '#1f232b';\n (e.currentTarget as HTMLButtonElement).style.color = '#f5f5f5';\n }\n }}\n onMouseLeave={e => {\n if (!active) {\n (e.currentTarget as HTMLButtonElement).style.background = '#141821';\n (e.currentTarget as HTMLButtonElement).style.color = '#cbd0d8';\n }\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction PersonalView({ data }: { data: MeResponse | null }) {\n if (!data) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Couldn’t load your stats. Make sure you’re signed in via{' '}\n <code style={{ color: '#cbd0d8' }}>hadoku.me/auth</code>.\n </p>\n );\n }\n const agg = data.aggregate;\n if (!agg) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No matches recorded yet — play a bomberman round to start tracking.\n </p>\n );\n }\n const name = agg.display_name ?? '(unnamed)';\n return (\n <div className=\"space-y-4\">\n <header className=\"flex items-center gap-3\">\n <AvatarTile\n sprite={agg.last_sprite}\n fallbackInitial={name.slice(0, 1)}\n size={56}\n />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-lg font-bold truncate\" style={{ color: '#f5f5f5' }}>\n {name}\n </h3>\n <p className=\"text-xs\" style={{ color: '#9ca3af' }}>\n ELO <span style={{ color: '#f0d058', fontWeight: 700 }}>{agg.elo ?? 1500}</span>\n {' · '}id <code>{agg.owner5}…</code>\n </p>\n </div>\n </header>\n <StatGrid agg={agg} />\n </div>\n );\n}\n\nconst LIFETIME_COLUMNS: Array<{\n label: string;\n value: (r: AggregateRow) => number;\n format?: (v: number) => string;\n accent?: boolean;\n}> = [\n { label: 'ELO', value: r => r.elo ?? 1500, accent: true },\n { label: 'Rounds', value: r => r.matches_played ?? 0 },\n { label: 'Wins', value: r => r.matches_won ?? 0 },\n { label: 'Kills', value: r => r.kills ?? 0 },\n { label: 'Suicides', value: r => r.self_kills ?? 0 },\n { label: '1st-blood', value: r => r.first_bloods ?? 0 },\n // Best-multi: derived per-player from the correct per-tier counts.\n // The aggregate best_multi_kill column is round-level and tagged to\n // every participant, so we ignore it.\n { label: 'Multikills', value: bestMultiTier, format: v => (v >= 2 ? `×${v}` : '—') },\n { label: 'Trap', value: r => r.trapkills ?? 0 },\n { label: 'Chain', value: r => r.kills_by_chain ?? 0 },\n { label: 'Kick', value: r => r.kills_by_kick ?? 0 },\n];\n\nfunction LifetimeView({ data }: { data: LeaderboardResponse | null }) {\n if (!data || !data.rows.length) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No matches recorded yet on this server.\n </p>\n );\n }\n return (\n <div>\n <header className=\"mb-3 text-xs uppercase tracking-wider\" style={{ color: '#9ca3af' }}>\n Ranked by ELO\n </header>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\" style={{ borderCollapse: 'separate', borderSpacing: 0 }}>\n <thead>\n <tr style={{ color: '#9ca3af' }}>\n <th\n className=\"text-left text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n #\n </th>\n <th\n className=\"text-left text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n Player\n </th>\n {LIFETIME_COLUMNS.map(c => (\n <th\n key={c.label}\n className=\"text-right text-[0.65rem] uppercase tracking-wider px-2 py-2\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.rows.map((r, i) => (\n <LifetimeRow key={`${r.owner5}-${i}`} row={r} rank={i + 1} />\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction LifetimeRow({ row, rank }: { row: AggregateRow; rank: number }) {\n const name = row.display_name ?? '(unnamed)';\n const tint = colorForSprite(row.last_sprite);\n const isLeader = rank === 1;\n return (\n <tr\n style={{\n background: isLeader\n ? 'linear-gradient(90deg, rgba(240,208,88,0.08) 0%, rgba(0,0,0,0.0) 100%)'\n : 'transparent',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLTableRowElement).style.background =\n 'linear-gradient(90deg, rgba(255,255,255,0.06) 0%, rgba(0,0,0,0.0) 100%)';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLTableRowElement).style.background = isLeader\n ? 'linear-gradient(90deg, rgba(240,208,88,0.08) 0%, rgba(0,0,0,0.0) 100%)'\n : 'transparent';\n }}\n >\n <td\n className=\"px-2 py-2 font-black text-sm align-middle\"\n style={{\n color: isLeader ? '#f0d058' : '#9ca3af',\n borderLeft: `3px solid ${tint}`,\n borderBottom: '1px solid #2a2d33',\n }}\n >\n {isLeader ? <StarIcon className=\"w-4 h-4 inline-block\" /> : rank}\n </td>\n <td\n className=\"px-2 py-2 align-middle\"\n style={{ borderBottom: '1px solid #2a2d33' }}\n >\n <div className=\"flex items-center gap-2\">\n <AvatarTile sprite={row.last_sprite} fallbackInitial={name.slice(0, 1)} size={28} />\n <span\n className=\"text-sm font-bold truncate\"\n style={{\n color: isLeader ? '#f0d058' : '#f5f5f5',\n textShadow: isLeader ? '0 0 8px rgba(240,208,88,0.4)' : 'none',\n maxWidth: 140,\n }}\n title={name}\n >\n {name}\n </span>\n </div>\n </td>\n {LIFETIME_COLUMNS.map(c => {\n const raw = c.value(row);\n const text = c.format ? c.format(raw) : String(raw);\n return (\n <td\n key={c.label}\n className=\"px-2 py-2 text-right tabular-nums align-middle\"\n style={{\n color: isLeader && c.accent ? '#f0d058' : '#f5f5f5',\n fontWeight: c.accent ? 700 : 400,\n borderBottom: '1px solid #2a2d33',\n }}\n >\n {text}\n </td>\n );\n })}\n </tr>\n );\n}\n\nfunction StatGrid({ agg }: { agg: AggregateRow }) {\n // Best-multi derived from per-tier counts — the aggregate\n // best_multi_kill column is round-level and wrongly attributed to\n // every participant by writeMatch. Same shape of bug exists for\n // best_chain_kill, but there are no per-tier chain counts to derive\n // from, so we just don't show that stat until Bevy tracks it\n // per-killer.\n const bestMulti = bestMultiTier(agg);\n const stats = useMemo(\n () => [\n { label: 'ELO', value: agg.elo ?? 1500, accent: true },\n { label: 'Round score', value: agg.total_round_score ?? 0 },\n { label: 'Rounds won', value: agg.matches_won ?? 0 },\n { label: 'Rounds played', value: agg.matches_played ?? 0 },\n { label: 'Games won', value: agg.sessions_won ?? 0 },\n { label: 'Kills', value: agg.kills ?? 0 },\n { label: 'First-bloods', value: agg.first_bloods ?? 0 },\n { label: 'Suicides', value: agg.self_kills ?? 0 },\n { label: 'Best multi', value: bestMulti },\n { label: 'Trap-kills', value: agg.trapkills ?? 0 },\n { label: 'Chain-kills', value: agg.kills_by_chain ?? 0 },\n { label: 'Kick-kills', value: agg.kills_by_kick ?? 0 },\n { label: 'Soul pickups', value: agg.soul_pickups ?? 0 },\n { label: 'Powerups', value: agg.powerups_collected ?? 0 },\n { label: 'Blocks destroyed', value: agg.blocks_destroyed ?? 0 },\n { label: 'Bombs placed', value: agg.bombs_placed ?? 0 },\n { label: 'Kicks', value: agg.kicks ?? 0 },\n { label: 'Deaths', value: agg.deaths ?? 0 },\n ],\n [agg, bestMulti],\n );\n return (\n <div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2\">\n {stats.map(s => (\n <StatTile key={s.label} label={s.label} value={s.value} accent={s.accent} />\n ))}\n </div>\n <h4\n className=\"mt-5 mb-2 text-xs font-bold uppercase tracking-wider\"\n style={{ color: '#9ca3af' }}\n >\n Multi-kill breakdown\n </h4>\n <div className=\"grid grid-cols-3 md:grid-cols-5 gap-2\">\n {(\n [\n ['Double', agg.double_kills],\n ['Triple', agg.triple_kills],\n ['Quad', agg.quad_kills],\n ['Penta', agg.penta_kills],\n ['Hexa', agg.hexa_kills],\n ['Hepta', agg.hepta_kills],\n ['Octa', agg.octa_kills],\n ['Nona', agg.nona_kills],\n ['Deca+', agg.deca_kills],\n ] as const\n ).map(([label, value]) => (\n <StatTile key={label} label={label} value={value ?? 0} compact />\n ))}\n </div>\n </div>\n );\n}\n\nfunction StatTile({\n label,\n value,\n accent,\n compact,\n}: {\n label: string;\n value: number;\n accent?: boolean;\n compact?: boolean;\n}) {\n return (\n <div\n className={`rounded ${compact ? 'px-2 py-1' : 'px-3 py-2'}`}\n style={{\n background: 'linear-gradient(180deg, #1f232b 0%, #171a20 100%)',\n border: accent ? '1px solid #f0d05866' : '1px solid #2a2d33',\n textAlign: compact ? 'center' : 'left',\n }}\n >\n <div\n className={`uppercase tracking-wider ${compact ? 'text-[0.6rem]' : 'text-[0.65rem]'}`}\n style={{ color: '#9ca3af' }}\n >\n {label}\n </div>\n <div\n className={`font-black ${compact ? 'text-sm' : 'text-lg'}`}\n style={{ color: accent ? '#f0d058' : '#f5f5f5' }}\n >\n {value}\n </div>\n </div>\n );\n}\n\nfunction GamesView({ data }: { data: MatchListResponse | null }) {\n const [expandedSid, setExpandedSid] = useState<string | null>(null);\n\n const games = useMemo(\n () => (data ? groupBySession(data.matches) : []),\n [data],\n );\n\n if (!data) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n Couldn’t load game history. Make sure you’re signed in via{' '}\n <code style={{ color: '#cbd0d8' }}>hadoku.me/auth</code>.\n </p>\n );\n }\n if (!games.length) {\n return (\n <p className=\"text-sm\" style={{ color: '#9ca3af' }}>\n No games yet — play a bomberman round to start your history.\n </p>\n );\n }\n\n return (\n <div>\n <header className=\"mb-3 text-xs uppercase tracking-wider\" style={{ color: '#9ca3af' }}>\n Your last {games.length} games\n </header>\n <div className=\"space-y-2\">\n {games.map(g => (\n <GameCard\n key={g.session_id}\n game={g}\n expanded={expandedSid === g.session_id}\n onToggle={() =>\n setExpandedSid(expandedSid === g.session_id ? null : g.session_id)\n }\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction GameCard({\n game,\n expanded,\n onToggle,\n}: {\n game: GameGroup;\n expanded: boolean;\n onToggle: () => void;\n}) {\n // Per-card round navigation: the expanded detail shows ONE round at a\n // time, with ◄/► arrows to step through the game's rounds. Defaults to\n // the final round (the deciding one). Reset to final when the card\n // closes so reopening lands back on the deciding round.\n const [roundIdx, setRoundIdx] = useState<number>(game.rounds.length - 1);\n if (!expanded && roundIdx !== game.rounds.length - 1) setRoundIdx(game.rounds.length - 1);\n const currentRound = game.rounds[roundIdx];\n\n // Detail fetch lives inside the card so each card manages its own\n // loading state — switching rounds in card A doesn't touch card B.\n const [detail, setDetail] = useState<MatchDetailResponse | null>(null);\n const [detailLoading, setDetailLoading] = useState(false);\n const detailRound = expanded ? currentRound ?? null : null;\n // `undefined` until the first render, so a card mounted expanded starts loading.\n const [startedRound, setStartedRound] = useState<typeof detailRound | undefined>(undefined);\n if (detailRound !== startedRound) {\n setStartedRound(detailRound);\n if (detailRound) setDetailLoading(true);\n else setDetail(null);\n }\n useEffect(() => {\n if (!detailRound) return;\n let cancelled = false;\n // fetchJson resolves null on every failure, so this never rejects.\n void (async () => {\n const r = await fetchJson<MatchDetailResponse>(\n `${STATS_API}/matches/${detailRound.match_id}`,\n );\n if (cancelled) return;\n setDetail(r);\n setDetailLoading(false);\n })();\n return () => {\n cancelled = true;\n };\n }, [detailRound]);\n\n const tint = colorForSprite(game.final.my_sprite);\n const outcome = game.i_won_game ? 'WIN' : 'LOSS';\n const outcomeColor = game.i_won_game ? '#7ee787' : '#f87171';\n const date = new Date(game.final.ts * 1000);\n const dateLabel = date.toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n const roundCount = game.rounds.length;\n return (\n <div\n className=\"rounded overflow-hidden\"\n style={{\n background: 'linear-gradient(180deg, #1f232b 0%, #171a20 100%)',\n border: '1px solid #2a2d33',\n }}\n >\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"w-full text-left px-3 py-2 flex items-center gap-3 cursor-pointer\"\n style={{ borderLeft: `3px solid ${tint}` }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'rgba(255,255,255,0.04)';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n }}\n >\n <AvatarTile sprite={game.final.my_sprite} fallbackInitial=\"?\" size={32} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span\n className=\"text-xs font-black uppercase tracking-wider\"\n style={{ color: outcomeColor }}\n >\n {outcome}\n </span>\n <span className=\"text-xs\" style={{ color: '#9ca3af' }}>\n {dateLabel}\n </span>\n </div>\n <div\n className=\"text-[0.65rem] uppercase tracking-wider mt-0.5\"\n style={{ color: '#9ca3af' }}\n >\n {roundCount} round{roundCount === 1 ? '' : 's'} ·{' '}\n {game.final.player_count}p · {game.my_total_kills}K · +\n {game.my_final_score} pts\n {game.my_total_first_bloods > 0\n ? ` · ${game.my_total_first_bloods}× 1st blood`\n : ''}\n </div>\n </div>\n <span\n className=\"text-xs\"\n style={{\n color: '#9ca3af',\n transform: expanded ? 'rotate(180deg)' : 'none',\n transition: 'transform 150ms',\n }}\n >\n ▾\n </span>\n </button>\n {expanded && (\n <div style={{ borderTop: '1px solid #2a2d33' }}>\n <div\n className=\"px-3 pt-2 pb-1 flex items-center gap-2 text-[0.6rem] uppercase tracking-wider\"\n style={{ color: '#9ca3af' }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setRoundIdx(i => Math.max(0, i - 1));\n }}\n disabled={roundIdx === 0}\n aria-label=\"Previous round\"\n className=\"w-6 h-6 flex items-center justify-center rounded hover:bg-white/10 active:bg-white/20 disabled:opacity-30 disabled:hover:bg-transparent\"\n style={{ color: '#cbd0d8' }}\n >\n ◄\n </button>\n <span>\n Round {currentRound ? currentRound.round_no + 1 : 1} of{' '}\n {game.rounds.length}\n {currentRound?.session_over ? ' · final' : ''}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setRoundIdx(i => Math.min(game.rounds.length - 1, i + 1));\n }}\n disabled={roundIdx === game.rounds.length - 1}\n aria-label=\"Next round\"\n className=\"w-6 h-6 flex items-center justify-center rounded hover:bg-white/10 active:bg-white/20 disabled:opacity-30 disabled:hover:bg-transparent\"\n style={{ color: '#cbd0d8' }}\n >\n ►\n </button>\n </div>\n {detailLoading && (\n <p className=\"text-xs px-3 py-2\" style={{ color: '#9ca3af' }}>\n Loading...\n </p>\n )}\n {!detailLoading && detail && <MatchDetailTable detail={detail} />}\n {!detailLoading && !detail && (\n <p className=\"text-xs px-3 py-2\" style={{ color: '#9ca3af' }}>\n Couldn’t load this round.\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction MatchDetailTable({ detail }: { detail: MatchDetailResponse }) {\n const sortedPlayers = useMemo(\n () => [...detail.players].sort((a, b) => b.round_score - a.round_score),\n [detail.players],\n );\n return (\n <div className=\"px-3 pt-2 pb-3\">\n <table className=\"w-full text-xs\" style={{ borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ color: '#9ca3af' }}>\n <th className=\"text-left py-1 pr-2 text-[0.6rem] uppercase tracking-wider\">Player</th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Round score earned this match\"\n >\n Score\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Game score after this round\"\n >\n Game\n </th>\n <th className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\">K</th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Suicides\"\n >\n S\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"First-bloods\"\n >\n 1st\n </th>\n <th\n className=\"text-right py-1 px-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Max concurrent bombs at end of round\"\n >\n Max\n </th>\n <th\n className=\"text-right py-1 pl-1 text-[0.6rem] uppercase tracking-wider\"\n title=\"Blast radius at end of round (tiles, one direction)\"\n >\n Pow\n </th>\n </tr>\n </thead>\n <tbody>\n {sortedPlayers.map(p => {\n const name = p.display_name ?? (p.is_bot ? `Bot ${p.player_id + 1}` : '(unnamed)');\n const tint = colorForSprite(p.sprite);\n return (\n <tr\n key={p.player_id}\n style={{\n borderTop: '1px solid #2a2d33',\n background: p.is_me ? 'rgba(240,208,88,0.06)' : 'transparent',\n }}\n >\n <td className=\"py-1 pr-2\">\n <div className=\"flex items-center gap-2\">\n <AvatarTile sprite={p.sprite} fallbackInitial={name.slice(0, 1)} size={20} />\n <span style={{ color: p.is_me ? '#f0d058' : '#f5f5f5' }}>\n {name}\n {p.is_bot && (\n <span className=\"ml-1 text-[0.55rem]\" style={{ color: tint }}>\n BOT\n </span>\n )}\n </span>\n </div>\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.round_score}\n </td>\n <td\n className=\"text-right py-1 px-1 tabular-nums\"\n style={{ color: '#f0d058', fontWeight: 700 }}\n >\n {p.session_score}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.kills}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.self_kills}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.first_bloods}\n </td>\n <td className=\"text-right py-1 px-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.bomb_max ?? '—'}\n </td>\n <td className=\"text-right py-1 pl-1 tabular-nums\" style={{ color: '#f5f5f5' }}>\n {p.blast_len ?? '—'}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { GAME_EVENTS, CORE_EVENTS, MAX_GAME_PLAYERS, botSpritePicker } from '@watchparty/shared';\nimport { getSocket, emitGameSync, emitGameSelect, emitGameStart, emitGameCountdown, emitGameSetBots, emitGameSessionReset } from '../lib/socket';\nimport { useAppStore } from '../lib/store';\nimport { getRuntimeServerOrigin } from '../lib/config';\nimport { debug, warn } from '../lib/debug';\nimport { colorForSprite, spriteUrlFor } from '../lib/characters';\nimport panelFrameUrl from '../assets/games/panel-frame.png';\nimport bombermanCoverUrl from '../assets/games/bomberman/cover.webp';\nimport { resolveMatchState } from '../lib/gameMatchState';\nimport type {\n GameActivePayload, GameStartPayload, GameStatePayload, GameInputPayload,\n GameCountdownPayload, ChatBroadcastPayload, PresencePayload,\n} from '../lib/wireEvents';\nimport volumeIconUrl from '../assets/games/bomberman/volume-icon.png';\nimport closeIconUrl from '../assets/games/bomberman/close-icon.png';\nimport lobbyIconUrl from '../assets/games/bomberman/lobby-icon.png';\nimport leaderboardIconUrl from '../assets/games/bomberman/leaderboard-icon.png';\nimport explosionArmUrl from '../assets/games/bomberman/explosion-arm.png';\nimport explosionEndUrl from '../assets/games/bomberman/explosion-end.png';\nimport LeaderboardModal from './LeaderboardModal';\nimport { Icon } from '@wolffm/themes'\nimport { readStored, writeStored } from '../lib/browserStorage';\n\n/** Physical-keycap chip for the on-cover controls hint. Round-7 restored\n * the squared gradient bg the operator preferred (the round-6 transparent\n * + text-stroke pass rendered weirdly on SPACE). Dark text on a light\n * top-bottom gradient + 1px dark border + inset shadows for the\n * pressed-edge bevel. No WebkitTextStroke (it was the SPACE artifact). */\nfunction Keycap({ label, wide = false }: { label: string; wide?: boolean }) {\n return (\n <span\n className=\"inline-flex items-center justify-center font-bold uppercase tracking-wide\"\n style={{\n minWidth: wide ? 100 : 28,\n height: 28,\n padding: wide ? '0 14px' : 0,\n fontSize: wide ? 12 : 14,\n background: 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)',\n color: '#111',\n borderRadius: 6,\n border: '1px solid #5b6473',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontFamily: '\"Courier New\", ui-monospace, monospace',\n lineHeight: 1,\n // The parent legend container sets text-shadow for white labels;\n // CSS inherits it onto every descendant. Without an explicit reset\n // the dark Keycap glyphs ('W'/'A'/'S'/'D') get a 2px black halo on\n // top of the dark fill — they read as overlapping/doubled letters.\n textShadow: 'none',\n }}\n >\n {label}\n </span>\n );\n}\n\n// Inline white-with-black-outline text style applied to each legend label\n// (Movement / Bomb / \"or\"). Defined as a per-label style instead of being\n// inherited from a parent container — CSS text-shadow inherits to ALL\n// descendants and was contaminating the Keycap glyphs (dark-on-light) with\n// a 2px black halo, making them look doubled. Per-label scoping keeps the\n// outline confined to where it's needed.\nconst legendLabelStyle: React.CSSProperties = {\n color: '#fff',\n textShadow:\n '-2px -2px 0 #000, 2px -2px 0 #000, -2px 2px 0 #000, 2px 2px 0 #000, 0 0 4px rgba(0,0,0,0.8)',\n};\n\nconst VOLUME_STORAGE_KEY = 'watchparty_game_volume';\nconst DEFAULT_VOLUME = 0.3;\nconst COUNTDOWN_SECS = 3;\n// How long the game-over splash holds before the leader auto-starts the\n// next countdown. Long enough that players see the winner / \"DRAW\" overlay.\nconst POST_MATCH_HOLD_MS = 5000;\n\n/** Convert a linear slider value (0..1) to an audio gain. Human hearing\n * is logarithmic, so a linear `.volume = 0.5` sounds way louder than\n * \"half\" — operators consistently report the slider at 50% being too\n * loud. A quadratic curve is the standard cheap approximation: 0.5 → 0.25\n * gain feels like roughly half-volume in practice, 0.1 → 0.01 is the\n * near-silent end. Applied to both the per-client beeps AND the value\n * forwarded to Bevy via the bridge, so the slider feels consistent\n * whether you're hearing local UI sound effects or in-game music. */\nfunction audioGainFromSlider(v: number): number {\n return v * v;\n}\n\nfunction loadStoredVolume(): number {\n const raw = readStored(VOLUME_STORAGE_KEY);\n if (raw === null) return DEFAULT_VOLUME;\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return DEFAULT_VOLUME;\n return Math.min(1, Math.max(0, n));\n}\n\n// Self-contained waiting-room game, embedded in an isolated iframe.\n//\n// The game is a separate Bevy/WASM bundle, NOT part of this React app's\n// chunk graph. It loads only when a user opens it, and unmounting this\n// component removes the iframe — which tears down the entire WASM heap,\n// WebGPU device, and game loop in one shot (the reason for the iframe).\n//\n// Dev: points at the `trunk serve` dev server (hot-reloads on Rust edits).\n// Prod: the static bundle served same-origin under /game/.\n// Dev: the trunk dev server. Prod: the watchparty server origin + /game/\n// (cross-origin iframe, same model as dev — the bundle ships with the server).\n// VITE_GAME_URL overrides both.\nfunction resolveGameUrl(): string {\n // `?net=1` puts the Bevy app in Mode::Waiting — it skips build_level()\n // on setup so there's no placeholder fake-game world rendered behind\n // the cover/countdown. The world gets built fresh when game.start\n // arrives. Also lets manage_music pick lobby music for the pre-match\n // state (Mode=Local builds an instant hot-seat and plays game music).\n const override = import.meta.env.VITE_GAME_URL as string | undefined;\n const base = override ?? (import.meta.env.DEV ? 'http://localhost:9090/' : `${getRuntimeServerOrigin()}/game/`);\n const sep = base.includes('?') ? '&' : '?';\n // Cache-buster: append the UI package version so a redeploy reloads\n // the iframe with the latest game/index.html instead of relying on\n // browser revalidation of `cache-control: max-age=0`. The wasm/js\n // assets are already content-hashed by trunk, so the only thing that\n // could go stale is index.html itself — this query param fixes that.\n const version =\n typeof __APP_VERSION__ === 'string' && __APP_VERSION__ ? __APP_VERSION__ : 'dev';\n return `${base}${sep}net=1&v=${encodeURIComponent(version)}`;\n}\n\n/** Whether this client leads the room right now, read from the store rather than a render. */\nfunction isLeaderNow(): boolean {\n const { snapshot, me } = useAppStore.getState();\n return !!snapshot.leaderId && snapshot.leaderId === me.clientId;\n}\n\n// The bridge: the cross-origin game iframe can't touch this app's Socket.io\n// connection, so we relay between them with postMessage. The game posts `up`\n// messages (input / state / start_request); we forward them over the existing\n// authenticated, room-scoped socket. Socket game events come back as `down`\n// messages into the iframe. The server stays a generic relay (ws/game.ts);\n// game semantics live entirely in the Bevy app.\nexport default function GameModule() {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n // Cache the latest game_active payload so it can be re-posted to Bevy\n // when the iframe finally signals it's ready (see onActive comment).\n const lastActivePayloadRef = useRef<GameActivePayload | null>(null);\n const leaderId = useAppStore((s) => s.snapshot.leaderId);\n const myClientId = useAppStore((s) => s.me.clientId);\n const isLeader = !!leaderId && leaderId === myClientId;\n // Live room roster — used for the participants strip on the cover/countdown\n // screen so the lobby shows who's in the game before the match starts.\n // We use the current presence roster (not the locked game_active.players)\n // so a viewer who joined mid-cover appears immediately without waiting for\n // the leader to re-emit countdown_request.\n const roster = useAppStore((s) => s.roster);\n const participants = useMemo(() => Object.values(roster), [roster]);\n // Session-wide victory tally driven by inbound game_active payloads.\n // We crown the unique top scorer — ties don't get a crown so we never\n // imply false hierarchy (the operator's \"current top player\" framing\n // requires unambiguity).\n const gameSessionWins = useAppStore((s) => s.gameSessionWins);\n // Lobby AI bot count — leader-tunable via the +/− chips on the cover\n // screen. The store value mirrors the server-authoritative count\n // (server clamps to MAX_GAME_PLAYERS - humans and rebroadcasts).\n // Declared BEFORE botChips/canAddBot/canRemoveBot so those don't TDZ\n // against the `const` initializer (caught in prod: 'h' before init).\n const gameBotCount = useAppStore((s) => s.gameBotCount);\n // Bot chips for the strip — the server's own picker, so the chip art is the\n // sprite the AI bot actually spawns with.\n const botChips = useMemo(() => {\n const next = botSpritePicker(participants.flatMap((p) => (p.sprite ? [p.sprite] : [])));\n return Array.from({ length: Math.max(0, gameBotCount) }, (_, i) => (\n { clientId: `ai:${i}`, sprite: next(), name: `Bot ${i + 1}` }\n ));\n }, [gameBotCount, participants]);\n const humanCount = participants.length;\n const canAddBot = gameBotCount + humanCount < MAX_GAME_PLAYERS;\n const canRemoveBot = gameBotCount > 0;\n // Panel size scales with total players. Bevy picks a wider map for higher\n // player counts (p02=11×9 → p10=21×19), so a fixed 820² panel makes cells\n // half-size on p10. Linear ramp from 820px (2 players) → 1240px (10) keeps\n // cells roughly visible; min(96vmin, …) clamps to viewport so small screens\n // never overflow. Total = humans + bots is what server's buildPlayerRoster\n // hands to Bevy, so this matches the map Bevy will actually build.\n const totalPlayers = Math.max(2, Math.min(MAX_GAME_PLAYERS, humanCount + gameBotCount));\n const panelMaxPx = Math.round(820 + (totalPlayers - 2) * 52.5);\n const panelSizeStyle = useMemo<React.CSSProperties>(() => ({\n width: `min(96vmin, ${panelMaxPx}px)`,\n height: `min(96vmin, ${panelMaxPx}px)`,\n }), [panelMaxPx]);\n const crownClientId = useMemo(() => {\n let topId: string | null = null;\n let topCount = 0;\n let tied = false;\n for (const [cid, count] of Object.entries(gameSessionWins)) {\n if (count <= 0) continue;\n if (count > topCount) {\n topId = cid;\n topCount = count;\n tied = false;\n } else if (count === topCount) {\n tied = true;\n }\n }\n return tied ? null : topId;\n }, [gameSessionWins]);\n const gameUrl = useMemo(() => resolveGameUrl(), []);\n // Per-client volume (0..=1). Persists in localStorage so it carries\n // across reloads. Forwarded to the iframe via `volume` bridge messages\n // — Bevy applies it as GlobalVolume so it scales BOTH sfx + music.\n const [volume, setVolume] = useState<number>(loadStoredVolume);\n // Match lifecycle:\n // 'pre-start': first-load only; cover (title art) + Start button.\n // 'countdown': leader clicked Start/Play Again; cover fades but the\n // game hasn't begun yet — show a 3..2..1..GO over the\n // canvas so players prepare. Server game_start fires at\n // the end of countdown.\n // 'playing': game_start broadcast received; cover fully hidden.\n // 'ended': last received snapshot had ph != -1. We INTENTIONALLY\n // do NOT bring the cover back here — the Bevy game-over\n // splash stays visible on the frozen canvas. After\n // POST_MATCH_HOLD_MS the leader auto-transitions back to\n // 'countdown' for the next match (no Play Again button —\n // rematches are continuous until someone closes the game).\n const [matchPhase, setMatchPhase] = useState<'pre-start' | 'countdown' | 'playing' | 'ended'>('pre-start');\n const [countdown, setCountdown] = useState<number>(COUNTDOWN_SECS);\n // Set true when Bevy reports the just-finished round pushed someone over\n // SESSION_THRESHOLD. Gates the auto-loop: at session-end the scoreboard\n // sits until the leader presses R (new session) or ESC (back to lobby),\n // matching the operator's spec (\"looping continues until first to 100,\n // then stops\"). Reset on every game_start so a new session starts fresh.\n const [sessionOver, setSessionOver] = useState<boolean>(false);\n const [volumeOpen, setVolumeOpen] = useState<boolean>(false);\n // Track whether the Bevy iframe has finished bootstrap (`bridge.up.ready`).\n // Before that fires the board canvas is blank; if the cover fade ran early\n // the operator would see a flash of empty black during the countdown.\n // We hold the Start button disabled until iframeReady is true so the\n // fade only happens once there's a board behind the cover.\n const [iframeReady, setIframeReady] = useState<boolean>(false);\n // Bevy world-build state. THREE discrete values, no arbitrary timeout:\n // 'loading' — iframe mounted, Bevy hasn't emitted `world_built` yet.\n // 'ready' — Bevy fired world_built. Start button enabled, music can run.\n // 'error' — 30s elapsed without a world_built. Bevy probably crashed/\n // hung. Show retry UI instead of pretending readiness.\n // Replaces the prior 3s/12s arbitrary-timeout fallbacks that lied:\n // they flipped worldReady=true while Bevy was still booting, leading\n // to countdown-over-blank-canvas + no-music regressions (chaos-mega\n // 2026-05-27 showed Bevy taking 25s in software rendering). Discrete\n // triggers only — `world_built` IS the signal.\n const [worldStatus, setWorldStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const worldReady = worldStatus === 'ready';\n const gameOrigin = useMemo(() => {\n try {\n return new URL(gameUrl, window.location.href).origin;\n } catch {\n return '*';\n }\n }, [gameUrl]);\n\n function handleStartClick() {\n // Broadcast countdown_request → server fans out to every client.\n // Viewers receive game_countdown and enter the same phase + tick the\n // same digit, so the whole room sees the synced 3-2-1-GO. The local\n // setState below is a no-op for the leader (we'll re-flip on receipt\n // of our own broadcast), but the immediate setState keeps the leader\n // UI snappy on click without waiting for the round-trip.\n emitGameCountdown();\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n }\n\n // Drive the countdown visual. Tick once per second; on 0, the leader fires\n // the start_request and every client gets a game_start back (→ 'playing').\n useEffect(() => {\n if (matchPhase !== 'countdown') return;\n if (countdown <= 0) {\n if (isLeader) emitGameStart('bomberman');\n return;\n }\n const id = setTimeout(() => setCountdown((n) => n - 1), 1000);\n return () => clearTimeout(id);\n }, [matchPhase, countdown, isLeader]);\n\n // Countdown audio — synthesized beeps via WebAudio, one per visible\n // digit tick, so the sound stays perfectly in sync with the on-screen\n // number. Earlier attempts used the bundled 2-second countdown.ogg\n // played once per phase entry; that always desynced with the 3-second\n // visual ticks and the operator heard double-beeps. Now: 880Hz short\n // tick for each \"3\"/\"2\"/\"1\" + 660Hz longer tone for \"GO!\". Beep\n // volume follows the user's per-client slider (with the same\n // perceptual curve as music).\n const countdownAudioCtxRef = useRef<AudioContext | null>(null);\n useEffect(() => {\n if (matchPhase !== 'countdown') return;\n if (volume <= 0) return;\n try {\n if (!countdownAudioCtxRef.current) {\n const Ctor = window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n countdownAudioCtxRef.current = new Ctor();\n }\n const ctx = countdownAudioCtxRef.current;\n const isGo = countdown <= 0;\n const freq = isGo ? 660 : 880;\n const durSec = isGo ? 0.35 : 0.15;\n const peakGain = audioGainFromSlider(volume) * 0.35;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = freq;\n const t0 = ctx.currentTime;\n gain.gain.setValueAtTime(0, t0);\n gain.gain.linearRampToValueAtTime(peakGain, t0 + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, t0 + durSec);\n osc.connect(gain).connect(ctx.destination);\n osc.start(t0);\n osc.stop(t0 + durSec + 0.01);\n } catch { /* ignore — beep is non-essential UX polish */ }\n }, [matchPhase, countdown, volume]);\n\n // Forward parent-page user gestures to Bevy so the iframe's AudioContext\n // can resume without requiring an additional click inside the canvas.\n // The iframe is mounted with allow=\"autoplay\", which propagates the\n // parent's user-activation state — Bevy's manage_music is gated on its\n // own AudioUnlocked resource which the new 'unlock_audio' bridge message\n // flips. We listen for the FIRST pointerdown/keydown anywhere on the\n // page, post it through to the iframe, then unsubscribe (audio gate is\n // sticky so further gestures are no-ops).\n useEffect(() => {\n let sent = false;\n const sendUnlock = () => {\n if (sent) return;\n sent = true;\n const win = iframeRef.current?.contentWindow;\n if (win) {\n win.postMessage(\n { __wpgame: 'down', type: 'unlock_audio' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }\n window.removeEventListener('pointerdown', sendUnlock, true);\n window.removeEventListener('keydown', sendUnlock, true);\n };\n window.addEventListener('pointerdown', sendUnlock, true);\n window.addEventListener('keydown', sendUnlock, true);\n return () => {\n window.removeEventListener('pointerdown', sendUnlock, true);\n window.removeEventListener('keydown', sendUnlock, true);\n };\n }, [gameOrigin]);\n\n // Per-friend-key leaderboard modal open state. Triggered by the\n // top-row leaderboard button — visible to every roster slot, not\n // just the leader. Stays open across phase transitions: the user\n // dismisses it with the X, the backdrop, or ESC when they're ready.\n const [leaderboardOpen, setLeaderboardOpen] = useState(false);\n\n // Ref mirror of sessionOver so the setTimeout callback below can re-check\n // its latest value at fire time. Without this, the auto-loop could\n // capture a stale `false` if game_result (which sets sessionOver=true)\n // arrives AFTER matchPhase flipped to 'ended' but BEFORE this effect\n // re-runs — a tiny but real window in production.\n const sessionOverRef = useRef(false);\n useEffect(() => { sessionOverRef.current = sessionOver; }, [sessionOver]);\n\n // Stamped each time matchPhase becomes 'playing'. The onState handler\n // uses it to reject ph != -1 snapshots that arrive in the first ~700ms\n // (stale ph=winner frames from the prior round in-flight when restart\n // fired). See the onStart handler below for the bug history.\n const playingSinceRef = useRef<number>(0);\n\n // Auto-loop into a new countdown after a match ends. The leader holds the\n // frozen game-over splash for POST_MATCH_HOLD_MS, then broadcasts the\n // next countdown — viewers receive game_countdown and follow along.\n useEffect(() => {\n if (matchPhase !== 'ended' || !isLeader) return;\n // Session-over: skip the auto-loop entirely. Leader must press R\n // (new session) or ESC (back to lobby) to continue.\n if (sessionOver) return;\n const id = setTimeout(() => {\n // Re-check via ref in case game_result raced and flipped\n // sessionOver=true in between effect schedule and timer fire.\n if (sessionOverRef.current) {\n debug('game', 'auto-loop suppressed at fire time (sessionOver became true)');\n return;\n }\n emitGameCountdown();\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n }, POST_MATCH_HOLD_MS);\n return () => clearTimeout(id);\n }, [matchPhase, isLeader, sessionOver]);\n\n // Request server replay of (active, lastGameStart) so late mounters spectate\n // an in-flight match instead of waiting for the next start.\n useEffect(() => { emitGameSync(); }, []);\n\n // ERROR escalation. Bevy is supposed to emit `world_built` after\n // build_level + 5 paint frames. If 30s elapses without one, something\n // is genuinely broken (panic / hung asset load / bridge severed).\n // Flip to 'error' so the user sees a retry UI instead of an infinite\n // \"Loading...\" spinner. Real-browser cold-start with GPU should be\n // 1-3s; software-rendered Chrome was 25s in chaos-mega 2026-05-27;\n // 30s is a generous outer bound. No mid-window \"treat as ready\" lie.\n useEffect(() => {\n if (worldStatus !== 'loading') return;\n const id = setTimeout(() => {\n warn('game', 'world_built never arrived (30s) — escalating to error');\n setWorldStatus('error');\n }, 30000);\n return () => clearTimeout(id);\n }, [worldStatus]);\n\n // Replay the cached game_active preview to Bevy the moment the iframe\n // signals ready. The original 'preview' postMessage from onActive may\n // have raced ahead of the iframe's HTML loading + message listener\n // attachment — without this replay, Bevy never receives the preview,\n // never builds, and never sends world_built.\n useEffect(() => {\n if (!iframeReady) return;\n const p = lastActivePayloadRef.current;\n if (!p) return;\n debug('game', 'replaying game_active preview after iframeReady');\n iframeRef.current?.contentWindow?.postMessage(\n { __wpgame: 'down', type: 'preview', payload: p },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }, [iframeReady, gameOrigin]);\n\n // Push the current volume into the iframe on every change AND on mount.\n // We post on a short delay first so the Bevy bridge has a chance to come\n // up (`ready` is what tells us it's listening, but we also want the\n // initial value applied even if the iframe is already mounted from a\n // previous render). Re-sends are cheap and idempotent.\n useEffect(() => {\n writeStored(VOLUME_STORAGE_KEY, String(volume));\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n const targetOrigin = gameOrigin === 'null' ? '*' : gameOrigin;\n const sliderGain = audioGainFromSlider(volume);\n const post = (v: number) => win.postMessage({ __wpgame: 'down', type: 'volume', value: v }, targetOrigin);\n if (matchPhase === 'countdown') {\n // Ramp Bevy volume from the slider value → 0 over 1.5s so the lobby\n // music fades out instead of cutting abruptly. The React-side WebAudio\n // countdown beeps live in this window so they're unaffected. On\n // 'playing' (game music spawns at the same moment) this effect\n // re-runs and restores the slider value.\n const FADE_MS = 1500;\n const STEPS = 30;\n const timers: number[] = [];\n for (let i = 1; i <= STEPS; i++) {\n timers.push(window.setTimeout(() => {\n const t = i / STEPS;\n post(sliderGain * (1 - t));\n }, (FADE_MS / STEPS) * i));\n }\n return () => timers.forEach(clearTimeout);\n }\n // pre-start / playing / ended: send the user's perceptual-gain value\n // (NOT the raw slider) so in-game music scales the same way the local\n // UI beeps do.\n post(sliderGain);\n }, [volume, matchPhase, gameOrigin]);\n\n useEffect(() => {\n const socket = getSocket();\n const postDown = (msg: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n { __wpgame: 'down', ...msg },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n\n // iframe -> socket bridge. Every `up` message is logged through the\n // standard `debug('game', ...)` channel so the chaos test reports +\n // server `client_log` aggregator see the full bridge trace (matches the\n // shape of buffer/socket/seek-coord logs from elsewhere in the UI).\n // Input/state rates are high (60Hz from Bevy under play); log just the\n // shape, not every payload, to avoid drowning the log pipeline.\n let upInputs = 0, upStates = 0;\n const onMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || d.__wpgame !== 'up') return;\n switch (d.type) {\n case 'ready':\n debug('game', 'bridge.up.ready');\n setIframeReady(true);\n postDown({ type: 'init', selfClientId: useAppStore.getState().me.clientId });\n postDown({ type: 'volume', value: audioGainFromSlider(loadStoredVolume()) });\n break;\n case 'world_built':\n // Bevy finished build_level — assets + board + spawn-point\n // sprites are all valid. Enables the Start button so the leader\n // can't click into a black-canvas countdown. warn-level so the\n // arrival latency lands in server.jsonl for real-browser\n // telemetry (compare to the 30s error escalation).\n warn('game', 'bridge.up.world_built');\n setWorldStatus('ready');\n break;\n case 'focuschat':\n // User pressed Enter while the canvas had focus — pop focus to\n // the chat input box. ChatInput listens for this custom event.\n debug('game', 'bridge.up.focuschat');\n window.dispatchEvent(new CustomEvent('watchparty:focus-chat-input'));\n break;\n case 'diag':\n // Generic host-side diagnostic event (e.g. gamemaster loop\n // override). warn-level so it ships to the server session log\n // — debug() only goes to console in production and we need\n // the evidence trail for jitter post-mortems.\n warn('game', `host.diag.${d.event ?? 'unknown'}`, d);\n break;\n case 'start_request':\n debug('game', 'bridge.up.start_request', { gameId: d.gameId });\n socket.emit(GAME_EVENTS.START_REQUEST, { gameId: d.gameId });\n break;\n case 'game_result':\n // Bevy emits this from the host once Phase flips to Over —\n // carries per-player kill counts + winner/draw + roster + the\n // session_over flag (true when any player crossed\n // SESSION_THRESHOLD this round). Forward to the server for\n // server.jsonl persistence; set sessionOver locally to suppress\n // the post-match auto-countdown when this was the last round.\n debug('game', 'bridge.up.game_result', { winnerPlayerId: d.winnerPlayerId, draw: d.draw, players: d.players?.length, sessionOver: d.sessionOver });\n if (typeof d.sessionOver === 'boolean') setSessionOver(d.sessionOver);\n // d.players already carries the rich per-pid counters from Bevy\n // (kills, selfKills, firstBloods, soulPickups, powerupsCollected,\n // bombsPlaced, blocksDestroyed, kicks, killsByKick, killsByChain,\n // trapkills, multiKills, roundScore, sessionScore). Forward\n // verbatim; the server Zod schema declares all the new fields\n // optional so older builds remain compatible.\n socket.emit(GAME_EVENTS.RESULT, {\n winnerPlayerId: d.winnerPlayerId ?? null,\n draw: !!d.draw,\n players: d.players ?? [],\n sessionOver: !!d.sessionOver,\n roundNo: d.roundNo ?? 0,\n sessionScores: d.sessionScores ?? {},\n maxMultiKill: d.maxMultiKill ?? 0,\n maxChainKill: d.maxChainKill ?? 0,\n });\n break;\n case 'lobby_request':\n // Leader pressed ESC on the session-over scoreboard — return to\n // the bomberman pre-match lobby. The activeGameId and bot count\n // stay so the lobby still renders with its roster; the server\n // clears per-session counters + regenerates the preview so every\n // Bevy rebuilds the lobby world. \"Stop game\" in the media drawer's\n // Play tab is the separate close-entirely path.\n debug('game', 'bridge.up.lobby_request');\n // Read at event time: this listener outlives leadership changes.\n if (isLeaderNow()) {\n emitGameSessionReset();\n }\n break;\n case 'restart_request':\n // Leader pressed 'R' on the game canvas during the post-match\n // splash. Skip the auto-restart's 5s POST_MATCH_HOLD_MS by\n // firing countdown_request immediately — server validates\n // leader-only and broadcasts COUNTDOWN. Auto-restart's\n // matchPhase==='ended' setTimeout is cancelled automatically\n // when the onCountdown handler flips matchPhase to 'countdown'\n // (effect cleanup).\n debug('game', 'bridge.up.restart_request');\n socket.emit(GAME_EVENTS.COUNTDOWN_REQUEST);\n break;\n case 'input':\n // 60Hz from Bevy at peak — sample 1-in-30 so logs are ~2/sec.\n if (++upInputs % 30 === 0) debug('game', 'bridge.up.input.sampled', { total: upInputs });\n socket.emit(GAME_EVENTS.INPUT, { d: d.d });\n break;\n case 'state':\n if (++upStates % 30 === 0) debug('game', 'bridge.up.state.sampled', { total: upStates, ph: d.d?.ph });\n socket.emit(GAME_EVENTS.STATE, { d: d.d });\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n // socket -> iframe\n const onStart = (payload: GameStartPayload) => {\n debug('game', 'socket.game_start', { hostClientId: payload?.hostClientId, seed: payload?.seed });\n postDown({ type: 'start', payload });\n // Stamp the moment matchPhase becomes 'playing'. The onState guard\n // below uses this to reject ph != -1 snapshots that arrive in the\n // first ~700ms — they're stale ph=winner frames from the prior round\n // that were broadcast by the host before its Phase flipped, then\n // round-tripped through the server while we transitioned. Without\n // this guard they kick matchPhase back to 'ended' and the auto-loop\n // fires another restart 5s later (2026-05-30 double-restart bug).\n playingSinceRef.current = Date.now();\n setMatchPhase('playing');\n };\n let downStates = 0;\n const onState = (payload: GameStatePayload) => {\n postDown({ type: 'state', d: payload?.d });\n const ph = payload?.d?.ph;\n const se = payload?.d?.se;\n // Sample down-state too so we have a server-relay tick rate in the log.\n if (++downStates % 30 === 0) debug('game', 'socket.game_state.sampled', { total: downStates, ph });\n // Rule (incl. the stale-snapshot window and why `se` is read from this\n // same payload) lives in lib/gameMatchState.ts, with tests.\n const update = resolveMatchState(ph, se, Date.now() - playingSinceRef.current);\n if (update.rejectedStale) {\n debug('game', 'match.ended-rejected-stale', { sincePlaying: Date.now() - playingSinceRef.current, ph });\n return;\n }\n if (!update.endMatch) return;\n debug('game', 'match.ended', { phase: update.outcome });\n if (update.sessionOver !== undefined) setSessionOver(update.sessionOver);\n setMatchPhase((cur) => (cur === 'playing' ? 'ended' : cur));\n };\n let downInputs = 0;\n const onInput = (payload: GameInputPayload) => {\n if (++downInputs % 30 === 0) debug('game', 'socket.game_input.sampled', { total: downInputs, fromClientId: payload?.fromClientId });\n postDown({ type: 'input', fromClientId: payload?.fromClientId, d: payload?.d });\n };\n // Forward game_active to Bevy as a 'preview' bridge message so it can\n // build the actual game world (right player count + spawn-point\n // sprites) while the cover/countdown is up. Without this, Bevy stays\n // in Mode::Waiting with no level until game_start, and the operator\n // sees a black canvas during countdown then a sudden world-pop on GO\n // (visible flicker as the world regenerates).\n //\n // RACE: game_active can arrive from the server BEFORE the iframe's\n // HTML has finished loading and attached its 'message' listener.\n // Cross-origin iframes (parent on hadoku.me, iframe on\n // watchparty.hadoku.me through Cloudflare) hit this race in prod\n // every time — the 'preview' postMessage is delivered but the\n // iframe never sees it. Cache the payload so the iframeReady-bridge\n // effect can replay it as soon as Bevy reports it's listening.\n const onActive = (payload: GameActivePayload) => {\n if (!payload?.gameId || !payload?.seed) return;\n debug('game', 'socket.game_active.preview', { gameId: payload.gameId, players: payload.players?.length });\n lastActivePayloadRef.current = payload;\n postDown({ type: 'preview', payload });\n // session_reset (Bevy's ESC-to-lobby) broadcasts a fresh game_active\n // with a new seed. From 'ended' we drop back to 'pre-start' so the\n // React Start button reappears and the leaderboard auto-closes. Safe\n // to fire from 'ended' only — mid-match game_set_bots also rebroadcasts\n // game_active with a new seed, but matchPhase is 'playing' there so\n // this branch is skipped.\n setMatchPhase((cur) => (cur === 'ended' ? 'pre-start' : cur));\n setSessionOver(false);\n };\n // Server-broadcast countdown — every client in the room flips to\n // 'countdown' together so viewers see the same 3-2-1-GO digits the\n // leader sees (was leader-only before, viewers jumped straight from\n // cover → playing). The leader also receives their own broadcast\n // back, so the local setState in handleStartClick is redundant but\n // harmless (eventual consistency).\n const onCountdown = (_payload: GameCountdownPayload) => {\n debug('game', 'socket.game_countdown');\n setCountdown(COUNTDOWN_SECS);\n setMatchPhase('countdown');\n // A new countdown means a new round (or new session). Clear the\n // session-over latch so the auto-loop re-engages on the next round\n // end. (Bevy resets its own Session resource when 'start' arrives\n // after session_over.)\n setSessionOver(false);\n };\n // Forward room chat → Bevy speech-bubble overlay above each player\n // (hud.rs render_overlays + ChatBubbles). Bevy maps the inbound\n // clientId → playerId via its slot table; a sender who isn't in\n // the current match is silently dropped.\n const onChatBroadcast = (m: ChatBroadcastPayload) => {\n const cid = m?.client_id;\n const text = m?.text;\n if (!cid || typeof text !== 'string' || !text) return;\n postDown({ type: 'chat', clientId: cid, text });\n };\n // Forward presence (roster/identity) → Bevy. When a player picks a new\n // character mid-game, Bevy swaps that player's sprite live without\n // waiting for the next match to start. Per-user fan-out keeps the\n // bridge contract identical regardless of why presence changed\n // (new player, identity update, disconnect).\n const onPresence = (data: PresencePayload) => {\n const users = data?.users;\n if (!Array.isArray(users)) return;\n for (const u of users) {\n if (!u?.client_id) continue;\n postDown({\n type: 'identity',\n clientId: u.client_id,\n name: u.name ?? '',\n sprite: u.sprite_id ?? u.sprite ?? null,\n });\n }\n };\n socket.on(GAME_EVENTS.COUNTDOWN, onCountdown);\n socket.on(GAME_EVENTS.ACTIVE, onActive);\n socket.on(GAME_EVENTS.START, onStart);\n socket.on(GAME_EVENTS.STATE, onState);\n socket.on(GAME_EVENTS.INPUT, onInput);\n socket.on(CORE_EVENTS.CHAT_BROADCAST, onChatBroadcast);\n socket.on('presence', onPresence);\n\n return () => {\n window.removeEventListener('message', onMessage);\n socket.off(GAME_EVENTS.COUNTDOWN, onCountdown);\n socket.off(GAME_EVENTS.ACTIVE, onActive);\n socket.off(GAME_EVENTS.START, onStart);\n socket.off(GAME_EVENTS.STATE, onState);\n socket.off(GAME_EVENTS.INPUT, onInput);\n socket.off(CORE_EVENTS.CHAT_BROADCAST, onChatBroadcast);\n socket.off('presence', onPresence);\n };\n }, [gameOrigin]);\n\n // Refocus the iframe canvas after any click outside the chat input or\n // character modal. Without this the game silently loses keyboard control\n // when the user clicks the starfield, the volume slider, or anywhere\n // else on the page — they'd have to click back inside the canvas to get\n // WASD working again. We use a bubble-phase listener so button onClick\n // handlers run first; the postMessage to Bevy ('focusgame') triggers\n // canvas.focus() on the Bevy side.\n //\n // FOCUS-TRAP GUARD: gate every focus push on `document.hasFocus()` AND\n // `!document.hidden`. A user click can still arrive in the watchparty\n // document via bubbling from a same-origin click that synced into a\n // backgrounded tab; if that fires `canvas.focus()` while another tab/\n // window has the user's actual attention, the browser may yank focus\n // back to watchparty (the 2026-05-25 viewer report \"couldn't interact with\n // any other websites until closing watchparty\" report). The guard is\n // belt-and-suspenders — if the tab isn't actively focused we simply\n // skip the refocus.\n useEffect(() => {\n if (!iframeReady) return;\n const onDocClick = (e: MouseEvent) => {\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const t = e.target as Element | null;\n if (!t) return;\n // Don't steal focus from text inputs (chat, search, identity name).\n if (t.closest('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n document.addEventListener('click', onDocClick);\n return () => document.removeEventListener('click', onDocClick);\n }, [iframeReady, gameOrigin]);\n\n // Auto-focus the game canvas when the match transitions to 'playing'. The\n // leader's Start click landed on the React button (not the iframe), so\n // without this push the player has to click the canvas to get WASD/arrows\n // working — the bug operators kept hitting. Same FOCUS-TRAP GUARD as\n // onDocClick (skip when tab is hidden / not focused), and bail if a text\n // input has focus (someone typing chat at countdown-end shouldn't lose it).\n useEffect(() => {\n if (!iframeReady) return;\n if (matchPhase !== 'playing') return;\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const active = document.activeElement;\n if (active?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n }, [iframeReady, matchPhase, gameOrigin]);\n\n // When a text input (chat, etc.) loses focus, route focus back to the\n // game. Operator rule: \"the game always has focus unless chat is open.\"\n // Triggers on chat's onKeyDown(Enter) → input.blur() and on chat-input\n // → outside-click flows. Skipped when focus is moving to another text\n // input (Tab between inputs stays in inputs).\n useEffect(() => {\n if (!iframeReady) return;\n const onFocusOut = (e: FocusEvent) => {\n if (typeof document === 'undefined') return;\n if (document.hidden || !document.hasFocus()) return;\n const src = e.target as Element | null;\n if (!src?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const next = e.relatedTarget as Element | null;\n if (next?.matches('input, textarea, [contenteditable=\"true\"]')) return;\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { __wpgame: 'down', type: 'focusgame' },\n gameOrigin === 'null' ? '*' : gameOrigin,\n );\n };\n document.addEventListener('focusout', onFocusOut);\n return () => document.removeEventListener('focusout', onFocusOut);\n }, [iframeReady, gameOrigin]);\n\n return (\n // Wrapper: full-room overlay but pointer-events-none so the starfield\n // behind it shows around the frame; the framed panel re-enables clicks.\n <div className=\"absolute inset-0 z-30 flex items-center justify-center pointer-events-none\">\n <div\n className=\"relative pointer-events-auto bg-black\"\n style={panelSizeStyle}\n >\n {/* The iframe fills the whole square (the frame overlays on top of it\n via the <img> below). Iframes carry an HTML default of 300×150 that\n CSS top/right/bottom/left + auto sizing does NOT override, so we\n use explicit width/height 100% on a positioned ancestor. */}\n <iframe\n ref={iframeRef}\n src={gameUrl}\n title=\"Waiting room game\"\n className=\"absolute inset-0 block w-full h-full border-0\"\n allow=\"autoplay; fullscreen; gamepad\"\n />\n {/* Title art — visible during 'pre-start' (initial cover) AND during\n 'countdown' (covers up the rebuilt world while the 3-2-1-GO\n ticks). The transition-opacity duration-1000 drives a fade in\n on 'ended' → 'countdown' (restart) and a fade out on\n 'countdown' → 'playing' (game starts). Without this restart\n looked like an instant cut to the new game with the countdown\n overlaying it — the operator's \"game is restarted instantly\n and players are given control and THEN the countdown starts\"\n report. Hidden during 'ended' so the Bevy game-over splash on\n the frozen canvas remains visible until R-press / auto-restart.\n Padded inset keeps the artwork inside the panel-frame. Image\n is 1024² (upscaled from 384² with lanczos). */}\n <img\n src={bombermanCoverUrl}\n alt=\"\"\n aria-hidden\n data-testid=\"bomberman-cover\"\n // `animate-cover-in` (keyframe in styles.css) drives a fresh\n // 0→1 fade-in on every mount — including when the leader's\n // back-to-lobby fully remounts GameModule. The transition-\n // opacity below handles the Start-click fade-out and any\n // mid-session phase changes. The two don't conflict because\n // the animation only fires on mount.\n className={`absolute pointer-events-none select-none object-contain transition-opacity duration-1000 animate-cover-in ${\n matchPhase === 'pre-start' || !worldReady ? 'opacity-100' : 'opacity-0'\n }`}\n style={{ top: '5.5%', left: '5.5%', right: '5.5%', bottom: '5.5%', width: '89%', height: '89%' }}\n draggable={false}\n />\n {/* Participants strip — visible during 'pre-start' AND 'countdown'.\n Shows who's currently in the room with their picked character.\n Pulled from live presence roster, not the locked game_active\n payload, so late joiners appear immediately. Positioned top-\n center so it sits above the Start button without colliding with\n the title art's main composition. */}\n {(matchPhase === 'pre-start' || matchPhase === 'countdown') && (participants.length > 0 || botChips.length > 0) && (\n <div\n className=\"absolute z-10 pointer-events-none select-none flex flex-col items-center gap-1\"\n style={{ top: '12%', left: '50%', transform: 'translateX(-50%)' }}\n >\n <span className=\"text-[10px] font-black uppercase tracking-wider\" style={legendLabelStyle}>\n Players\n </span>\n <div className=\"flex items-start gap-3 flex-wrap justify-center\" style={{ maxWidth: '70%' }}>\n {participants.map((u) => {\n const color = colorForSprite(u.sprite);\n const wins = gameSessionWins[u.clientId] ?? 0;\n const hasCrown = u.clientId === crownClientId;\n return (\n <div key={u.clientId} className=\"relative flex flex-col items-center gap-0.5\" style={{ minWidth: 40 }}>\n {/* Crown overlay — drawn ABOVE the avatar for the unique\n top scorer. Pure-CSS emoji-style sits OK on top of\n cover art without a sprite asset. */}\n {hasCrown && (\n <span\n aria-label=\"top player crown\"\n className=\"absolute pointer-events-none select-none\"\n style={{\n top: -18,\n left: '50%',\n transform: 'translateX(-50%) rotate(-8deg)',\n fontSize: 22,\n filter: 'drop-shadow(0 2px 3px rgba(0,0,0,0.7))',\n textShadow: '0 0 6px rgba(255,215,0,0.6)',\n lineHeight: 1,\n }}\n >\n <Icon name=\"crown\" />\n </span>\n )}\n {u.sprite ? (\n <img\n src={spriteUrlFor(u.sprite)}\n alt={u.sprite}\n crossOrigin=\"anonymous\"\n className=\"w-9 h-9 rounded-full object-cover\"\n style={{\n border: `2px solid ${color}`,\n boxShadow: `0 0 6px ${color}aa, 0 2px 4px rgba(0,0,0,0.6)`,\n background: 'rgba(0,0,0,0.4)',\n }}\n draggable={false}\n />\n ) : (\n <span\n className=\"w-9 h-9 rounded-full\"\n style={{ background: color, boxShadow: '0 2px 4px rgba(0,0,0,0.6)' }}\n />\n )}\n <span className=\"text-[11px] font-bold max-w-[60px] truncate\" style={legendLabelStyle}>\n {u.name || 'Anon'}\n </span>\n {wins > 0 && (\n <span\n className=\"text-[10px] font-black\"\n style={{ ...legendLabelStyle, color: '#fde047' /* yellow-300 */ }}\n >\n {wins} W\n </span>\n )}\n </div>\n );\n })}\n {/* Bot chips — visually distinct from humans via dashed border\n + \"BOT\" tag underneath. Sprite picks come from botChips\n memo above, which mirrors server buildPlayerRoster. */}\n {botChips.map((b) => {\n const color = colorForSprite(b.sprite);\n return (\n <div key={b.clientId} className=\"relative flex flex-col items-center gap-0.5\" style={{ minWidth: 40 }}>\n <img\n src={spriteUrlFor(b.sprite)}\n alt={b.sprite}\n crossOrigin=\"anonymous\"\n className=\"w-9 h-9 rounded-full object-cover\"\n style={{\n border: `2px dashed ${color}`,\n boxShadow: `0 0 6px ${color}66, 0 2px 4px rgba(0,0,0,0.6)`,\n background: 'rgba(0,0,0,0.4)',\n opacity: 0.85,\n }}\n draggable={false}\n />\n <span className=\"text-[11px] font-bold max-w-[60px] truncate\" style={legendLabelStyle}>\n {b.name}\n </span>\n <span\n className=\"text-[9px] font-black uppercase tracking-wider\"\n style={{ ...legendLabelStyle, color: '#94a3b8' /* slate-400 */ }}\n >\n Bot\n </span>\n </div>\n );\n })}\n </div>\n {/* Leader-only bot +/− controls. Visible only during pre-start\n (locked once countdown begins so the roster matches what\n Bevy built the world for). Disabled when at the cap (0 or\n MAX_GAME_PLAYERS - humans). */}\n {isLeader && matchPhase === 'pre-start' && (\n <div\n className=\"pointer-events-auto flex items-center gap-2 mt-1\"\n data-testid=\"bomberman-bot-controls\"\n >\n <button\n type=\"button\"\n onClick={() => emitGameSetBots(Math.max(0, gameBotCount - 1))}\n disabled={!canRemoveBot}\n aria-label=\"Remove a bot\"\n className=\"font-black\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 6,\n border: '1px solid #5b6473',\n background: canRemoveBot\n ? 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)'\n : 'linear-gradient(180deg, #6b7280 0%, #4b5563 100%)',\n color: canRemoveBot ? '#111' : '#9ca3af',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontSize: 16,\n lineHeight: 1,\n cursor: canRemoveBot ? 'pointer' : 'not-allowed',\n textShadow: 'none',\n }}\n >\n −\n </button>\n <span\n className=\"text-[10px] font-black uppercase tracking-wider\"\n style={legendLabelStyle}\n >\n {gameBotCount} Bot{gameBotCount === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n onClick={() => emitGameSetBots(gameBotCount + 1)}\n disabled={!canAddBot}\n aria-label=\"Add a bot\"\n className=\"font-black\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 6,\n border: '1px solid #5b6473',\n background: canAddBot\n ? 'linear-gradient(180deg, #fafafa 0%, #d1d5db 100%)'\n : 'linear-gradient(180deg, #6b7280 0%, #4b5563 100%)',\n color: canAddBot ? '#111' : '#9ca3af',\n boxShadow:\n 'inset 0 -2px 0 #6b7280, inset 0 1px 0 #ffffff, 0 2px 4px rgba(0,0,0,0.45)',\n fontSize: 16,\n lineHeight: 1,\n cursor: canAddBot ? 'pointer' : 'not-allowed',\n textShadow: 'none',\n }}\n >\n +\n </button>\n </div>\n )}\n </div>\n )}\n {/* Controls hint — visible only on the title cover (pre-start).\n Operator asked for Movement and Bomb on the SAME ROW (was\n stacked vertically before). Two clusters sit side-by-side in\n the bottom-right; each cluster has its own label above its\n keys. White-outlined keycaps stand out on any cover-art\n background; no theme tokens used (game UI stays consistent\n across light/dark theme). */}\n {matchPhase === 'pre-start' && (\n <div\n className=\"absolute z-20 pointer-events-none select-none flex items-end gap-6\"\n style={{ right: '8%', bottom: '8%' }}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <span className=\"text-xs font-black uppercase tracking-wider\" style={legendLabelStyle}>Movement</span>\n <div className=\"flex items-start gap-2\">\n <div className=\"grid grid-cols-3 gap-0.5\">\n <div />\n <Keycap label=\"W\" />\n <div />\n <Keycap label=\"A\" />\n <Keycap label=\"S\" />\n <Keycap label=\"D\" />\n </div>\n <span className=\"self-center text-xs font-black opacity-90\" style={legendLabelStyle}>or</span>\n <div className=\"grid grid-cols-3 gap-0.5\">\n <div />\n <Keycap label=\"↑\" />\n <div />\n <Keycap label=\"←\" />\n <Keycap label=\"↓\" />\n <Keycap label=\"→\" />\n </div>\n </div>\n </div>\n <div className=\"flex flex-col items-center gap-1\">\n <span className=\"text-xs font-black uppercase tracking-wider\" style={legendLabelStyle}>Bomb</span>\n <Keycap label=\"SPACE\" wide />\n </div>\n </div>\n )}\n {/* Frame overlay — drawn ABOVE the iframe so the decorative corners\n sit on top of the canvas instead of being covered by it. */}\n <img\n src={panelFrameUrl}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 w-full h-full pointer-events-none select-none\"\n draggable={false}\n />\n {/* Top-right control cluster — Audio (everyone) + Lobby (leader)\n + Close (leader). Single horizontal row anchored at top:4%\n with `gap-4` between buttons so the three bezels breathe (the\n previous gap-2 made them look squished against each other). */}\n <div\n className=\"absolute z-10 flex items-center gap-4\"\n style={{ top: '4%', right: '8%' }}\n >\n {/* Audio sub-cluster — leftmost. The slider expands leftward from\n the volume button on hover (origin-right), so the bar visually\n grows out toward the cluster's left edge. Leaderboard lives\n OUTSIDE this onMouseEnter wrapper, to the RIGHT of the volume\n button, so hovering it does NOT pop the volume slider. */}\n <div\n className=\"flex items-center gap-2\"\n onMouseEnter={() => setVolumeOpen(true)}\n onMouseLeave={() => setVolumeOpen(false)}\n title={`Game volume: ${Math.round(volume * 100)}%`}\n >\n {/* Explosion-chunk bar — invisible until hover; flex row of 10 cells */}\n <div\n role=\"slider\"\n aria-label=\"Game volume\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(volume * 100)}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n setVolume(Math.max(0, Math.round(volume * 10 - 1) / 10));\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n setVolume(Math.min(1, Math.round(volume * 10 + 1) / 10));\n }\n }}\n onFocus={() => setVolumeOpen(true)}\n onBlur={() => setVolumeOpen(false)}\n className={`flex items-center bg-black/40 backdrop-blur px-1.5 py-1 rounded transition-all duration-200 origin-right ${\n volumeOpen ? 'opacity-100 scale-x-100' : 'opacity-0 scale-x-0 pointer-events-none'\n }`}\n >\n {Array.from({ length: 10 }, (_, i) => {\n const filled = (i + 1) <= Math.round(volume * 10);\n const isLast = i === 9;\n return (\n <button\n key={i}\n type=\"button\"\n aria-label={`Set volume to ${(i + 1) * 10}%`}\n onClick={() => setVolume((i + 1) / 10)}\n className=\"flex-shrink-0 cursor-pointer hover:scale-110 transition-transform\"\n style={{ width: 14, height: 22, padding: 0, background: 'none', border: 'none' }}\n >\n <img\n src={isLast ? explosionEndUrl : explosionArmUrl}\n alt=\"\"\n draggable={false}\n className=\"w-full h-full pointer-events-none select-none\"\n style={{\n opacity: filled ? 1 : 0.25,\n filter: filled\n ? 'drop-shadow(0 0 3px rgba(255,140,0,0.7))'\n : 'grayscale(1)',\n }}\n />\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={() => setVolume(volume === 0 ? DEFAULT_VOLUME : 0)}\n aria-label={volume === 0 ? 'Unmute game' : 'Mute game'}\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform rounded-full\"\n style={{\n // Backdrop ring + drop-shadow so the gray-on-gray bezel is\n // visible against the (also dark) game canvas. Operator\n // reported the prior naked-icon version was hard to see.\n background: 'radial-gradient(circle, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 70%)',\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={volumeIconUrl}\n alt=\"\"\n className={`w-full h-full select-none pointer-events-none transition-opacity ${\n volume === 0 ? 'opacity-50 grayscale' : 'opacity-100'\n }`}\n draggable={false}\n />\n </button>\n </div>\n {/* Leaderboard — sits to the RIGHT of the audio cluster so\n hovering it stays outside the volume hover region. Visible\n to everyone (anyone can browse the rankings). */}\n <button\n type=\"button\"\n onClick={() => setLeaderboardOpen(true)}\n aria-label=\"Open leaderboard\"\n title=\"Leaderboard\"\n data-testid=\"bomberman-leaderboard-btn\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={leaderboardIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n {/* Back to Lobby — leader only. Re-mounts the game module across\n all clients (emit null then re-select bomberman) so everyone\n lands back on the title cover with a fresh server roster. */}\n {isLeader && (\n <button\n type=\"button\"\n onClick={() => { emitGameSelect(null); setTimeout(() => emitGameSelect('bomberman'), 100); }}\n aria-label=\"Back to lobby\"\n title=\"Back to lobby\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={lobbyIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n )}\n {/* Close — leader only. Unmounts the game module everywhere; room\n returns to its idle media-less state. */}\n {isLeader && (\n <button\n type=\"button\"\n onClick={() => emitGameSelect(null)}\n aria-label=\"Stop game\"\n title=\"Stop game\"\n className=\"w-14 h-14 flex-shrink-0 flex items-center justify-center cursor-pointer hover:scale-110 transition-transform\"\n style={{\n filter: 'drop-shadow(0 2px 6px rgba(0,0,0,0.6))',\n }}\n >\n <img\n src={closeIconUrl}\n alt=\"\"\n className=\"w-full h-full select-none pointer-events-none\"\n draggable={false}\n />\n </button>\n )}\n </div>\n {/* Countdown overlay — sits centered over the live game canvas\n during 'countdown'. The cover fades on Start click (so the board\n is visible underneath); the digit pops in on each tick + beeps.\n Leader's onClick already initiated the countdown locally; the\n effect on countdown===0 calls emitGameStart, and the resulting\n server broadcast flips everyone to 'playing'. */}\n {matchPhase === 'countdown' && (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center pointer-events-none select-none\">\n <div\n key={countdown}\n className=\"text-[10rem] font-black animate-[ping_0.5s_ease-out]\"\n style={{\n fontFamily: 'system-ui, sans-serif',\n // White fill + black outline — readable on any board state\n // behind it. The prior black-on-white inversion washed out\n // on light themes.\n color: '#fff',\n WebkitTextStroke: '6px #000',\n textShadow:\n '-3px -3px 0 #000, 3px -3px 0 #000, -3px 3px 0 #000, 3px 3px 0 #000, 0 8px 32px rgba(0,0,0,0.7)',\n }}\n >\n {countdown > 0 ? countdown : 'GO!'}\n </div>\n </div>\n )}\n {/* Leader-only Start button — only shown on the initial title screen\n ('pre-start'). After a match ends the leader auto-loops into the\n next countdown (POST_MATCH_HOLD_MS later), so no Play Again\n button is needed. Hardcoded black text with white outline (NOT\n theme tokens) so it stays readable on light AND dark themes\n regardless of bg-primary contrast. */}\n {/* Loading indicator while Bevy is still building the world. Visible\n during 'pre-start' AND 'countdown' (in case a restart catches\n Bevy in another rebuild — rare but possible). Replaces what\n was an invisible-disabled-Start-button state; user now sees\n explicit \"Loading game…\" feedback. */}\n {worldStatus === 'loading' && (matchPhase === 'pre-start' || matchPhase === 'countdown') && (\n <div\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-3 rounded bg-black/60 backdrop-blur text-text-secondary text-sm pointer-events-none flex items-center gap-2\"\n >\n <span className=\"inline-block w-4 h-4 border-2 border-white/40 border-t-white rounded-full animate-spin\" />\n Loading game…\n </div>\n )}\n {/* Error state. world_built didn't arrive within 30s — Bevy is hung\n or crashed. Show retry (refresh) instead of pretending readiness. */}\n {worldStatus === 'error' && (matchPhase === 'pre-start' || matchPhase === 'countdown') && (\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-4 rounded bg-black/80 backdrop-blur text-text text-sm flex flex-col items-center gap-3 pointer-events-auto\">\n <span className=\"bg-danger-bg text-on-danger-bg px-2 py-0.5 rounded font-semibold\">Game failed to load</span>\n <span className=\"text-text-secondary text-xs\">Bevy didn't report ready within 30s.</span>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-3 py-1 rounded bg-bg-card hover:bg-bg-alt text-xs cursor-pointer\"\n >\n Refresh\n </button>\n </div>\n )}\n {isLeader && matchPhase === 'pre-start' && worldStatus === 'ready' && (\n <button\n type=\"button\"\n onClick={handleStartClick}\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-10 py-4 rounded-xl text-3xl font-black tracking-wide hover:brightness-110 transition-all cursor-pointer\"\n style={{\n // Plain white text on a red gradient. NO text-stroke — earlier\n // attempts stacked a 2px black stroke + multi-direction black\n // text-shadow on top of the white fill, which on small/medium\n // glyphs made the text read as nearly all-black (the operator\n // saw \"black text on red, unreadable\"). A single soft shadow\n // for legibility + a 2px white inner ring on the button gives\n // a clean call-to-action look that's theme-independent.\n background: 'linear-gradient(180deg, #ef4444 0%, #b91c1c 100%)',\n color: '#fff',\n textShadow: '0 2px 4px rgba(0,0,0,0.6)',\n boxShadow:\n 'inset 0 0 0 2px rgba(255,255,255,0.6), 0 4px 12px rgba(0,0,0,0.4)',\n }}\n >\n Start Game\n </button>\n )}\n {/* Non-leader hint while waiting for the host's first Start. Only\n shown once Bevy is ready — otherwise the Loading/Error indicators\n occupy that slot. */}\n {!isLeader && matchPhase === 'pre-start' && worldStatus === 'ready' && (\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20 px-6 py-3 rounded bg-black/60 backdrop-blur text-text-secondary text-sm pointer-events-none\">\n Waiting for the host to start the game…\n </div>\n )}\n </div>\n <LeaderboardModal\n open={leaderboardOpen}\n onClose={() => setLeaderboardOpen(false)}\n />\n </div>\n );\n}\n"],"names":["panelFrameUrl","STALE_SNAPSHOT_WINDOW_MS","PH_RUNNING","PH_DRAW","IGNORE","resolveMatchState","ph","se","sincePlayingMs","volumeIconUrl","closeIconUrl","lobbyIconUrl","leaderboardIconUrl","explosionArmUrl","explosionEndUrl","bestMultiTier","r","groupBySession","matches","bySession","m","list","groups","sid","rounds","a","b","ended","final","endingRound","s","STATS_API","fetchJson","url","res","warn","err","AvatarTile","sprite","fallbackInitial","size","tint","colorForSprite","jsx","isCharacterId","spriteUrlFor","LeaderboardModal","open","onClose","tab","setTab","useState","personal","setPersonal","lifetime","setLifetime","setMatches","loading","setLoading","fetchKey","startedKey","setStartedKey","useEffect","cancelled","debug","onKey","e","createPortal","jsxs","TabButton","PersonalView","LifetimeView","GamesView","active","onClick","children","data","agg","name","StatGrid","LIFETIME_COLUMNS","v","c","i","LifetimeRow","row","rank","isLeader","StarIcon","raw","text","bestMulti","stats","useMemo","StatTile","label","value","accent","compact","expandedSid","setExpandedSid","games","g","GameCard","game","expanded","onToggle","roundIdx","setRoundIdx","currentRound","detail","setDetail","detailLoading","setDetailLoading","detailRound","startedRound","setStartedRound","outcome","outcomeColor","dateLabel","roundCount","MatchDetailTable","sortedPlayers","p","Keycap","wide","legendLabelStyle","VOLUME_STORAGE_KEY","DEFAULT_VOLUME","COUNTDOWN_SECS","POST_MATCH_HOLD_MS","audioGainFromSlider","loadStoredVolume","readStored","resolveGameUrl","base","getRuntimeServerOrigin","sep","isLeaderNow","snapshot","me","useAppStore","GameModule","iframeRef","useRef","lastActivePayloadRef","leaderId","myClientId","roster","participants","gameSessionWins","gameBotCount","botChips","next","botSpritePicker","_","humanCount","canAddBot","MAX_GAME_PLAYERS","canRemoveBot","totalPlayers","panelMaxPx","panelSizeStyle","crownClientId","topId","topCount","tied","cid","count","gameUrl","volume","setVolume","matchPhase","setMatchPhase","countdown","setCountdown","sessionOver","setSessionOver","volumeOpen","setVolumeOpen","iframeReady","setIframeReady","worldStatus","setWorldStatus","worldReady","gameOrigin","handleStartClick","emitGameCountdown","id","n","countdownAudioCtxRef","Ctor","ctx","isGo","freq","durSec","peakGain","osc","gain","t0","sent","sendUnlock","win","leaderboardOpen","setLeaderboardOpen","sessionOverRef","playingSinceRef","emitGameSync","writeStored","targetOrigin","sliderGain","post","timers","t","socket","getSocket","postDown","msg","upInputs","upStates","onMessage","GAME_EVENTS","emitGameSessionReset","onStart","payload","downStates","onState","update","cur","downInputs","onInput","onActive","onCountdown","_payload","onChatBroadcast","onPresence","users","u","CORE_EVENTS","onDocClick","onFocusOut","bombermanCoverUrl","color","wins","hasCrown","Icon","emitGameSetBots","filled","isLast","emitGameSelect"],"mappings":"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"}
|