kaggle-environments 1.23.1__py3-none-any.whl → 1.23.2__py3-none-any.whl

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.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

Files changed (22) hide show
  1. kaggle_environments/envs/connectx/visualizer/default/index.html +13 -0
  2. kaggle_environments/envs/connectx/visualizer/default/package.json +22 -0
  3. kaggle_environments/envs/connectx/visualizer/default/replays/test-replay.json +1129 -0
  4. kaggle_environments/envs/connectx/visualizer/default/src/main.ts +11 -0
  5. kaggle_environments/envs/connectx/visualizer/default/src/renderer.ts +381 -0
  6. kaggle_environments/envs/connectx/visualizer/default/src/style.css +38 -0
  7. kaggle_environments/envs/connectx/visualizer/default/tsconfig.json +4 -0
  8. kaggle_environments/envs/connectx/visualizer/default/vite.config.ts +7 -0
  9. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/index.html +13 -0
  10. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/package.json +22 -0
  11. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/replays/test-replay.json +1 -0
  12. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/components/getRepeatedPokerStateForStep.js +267 -0
  13. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/components/utils.js +19 -0
  14. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/main.ts +37 -0
  15. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/repeated_poker_renderer.js +493 -0
  16. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/tsconfig.json +7 -0
  17. kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/vite.config.ts +6 -0
  18. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.2.dist-info}/METADATA +1 -1
  19. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.2.dist-info}/RECORD +22 -5
  20. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.2.dist-info}/WHEEL +0 -0
  21. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.2.dist-info}/entry_points.txt +0 -0
  22. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,493 @@
1
+ import { getPokerStateForStep } from "./components/getRepeatedPokerStateForStep";
2
+ import { acpcCardToDisplay, suitSVGs } from "./components/utils";
3
+
4
+ export function renderer(options) {
5
+ const elements = {
6
+ gameLayout: null,
7
+ pokerTableContainer: null,
8
+ pokerTable: null,
9
+ communityCardsContainer: null,
10
+ potDisplay: null,
11
+ playersContainer: null,
12
+ playerCardAreas: [],
13
+ playerInfoAreas: [],
14
+ dealerButton: null,
15
+ diagnosticHeader: null,
16
+ stepCounter: null
17
+ };
18
+
19
+ const css = `
20
+ @font-face {
21
+ font-family: 'Zeitung Pro';
22
+ src:
23
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
24
+ format("woff2"),
25
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
26
+ format("woff"),
27
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
28
+ format("opentype");
29
+ font-weight: normal;
30
+ font-style: normal;
31
+ }
32
+ @font-face {
33
+ font-family: 'Zeitung Pro';
34
+ src:
35
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
36
+ format("woff2"),
37
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
38
+ format("woff"),
39
+ url("https://use.typekit.net/af/37ff2c/00000000000000003b9b2a25/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")
40
+ format("opentype");
41
+ font-weight: bold;
42
+ font-style: normal;
43
+ }
44
+
45
+ .poker-renderer-host {
46
+ width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;
47
+ font-family: 'Zeitung Pro', sans-serif; background-color: #1C1D20; color: #fff;
48
+ overflow: hidden; padding: 1rem; box-sizing: border-box; position: relative;
49
+ }
50
+ .poker-game-layout { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; position: relative; max-width: 750px; max-height: 750px; }
51
+ .poker-table-container { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; max-width: 750px; max-height: 275px; }
52
+ .poker-table {
53
+ width: clamp(400px, 85vw, 750px); height: clamp(220px, 48vw, 275px);
54
+ background-color: #197631; border-radius: 24px; position: relative;
55
+ display: flex; align-items: center; justify-content: center;
56
+ margin: 0 60px;
57
+ }
58
+ .players-container {
59
+ position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 10;
60
+ }
61
+ .player-container {
62
+ position: absolute;
63
+ width: 100%;
64
+ pointer-events: none;
65
+ display: flex;
66
+ flex-direction: column;
67
+ }
68
+ .player-container-0 { bottom: 0; flex-direction: column-reverse; }
69
+ .player-container-1 { top: 0; }
70
+ .player-area-wrapper {
71
+ display: flex;
72
+ justify-content: space-between;
73
+ align-items: center;
74
+ }
75
+ .player-card-area {
76
+ margin: 20px 60px; color: white; text-align: center;
77
+ display: flex; flex-direction: column; justify-content: center; align-items: center;
78
+ min-height: 100px; pointer-events: auto;
79
+ }
80
+ .player-info-area {
81
+ color: white;
82
+ min-width: 180px;
83
+ pointer-events: auto;
84
+ display: flex;
85
+ flex-direction: column;
86
+ justify-content: left;
87
+ align-items: left;
88
+ margin-right: 60px;
89
+ }
90
+ .player-container-0 .player-info-area { flex-direction: column-reverse; }
91
+ .player-name {
92
+ font-size: 32px; font-weight: 600;
93
+ white-space: nowrap;
94
+ overflow: hidden;
95
+ text-overflow: ellipsis;
96
+ color: white;
97
+ text-align: left;
98
+ padding: 10px 0;
99
+ margin: 0 60px;
100
+ }
101
+ .player-name.winner { color: #FFEB70; }
102
+ .player-stack { font-size: 32px; font-weight: 600; color: #ffffff; margin: 16px 0; display: flex; justify-content: space-between; align-items: center; }
103
+ .player-cards-container { min-height: 70px; display: flex; justify-content: flex-start; align-items:center; gap: 12px; }
104
+ .card {
105
+ display: flex; flex-direction: column; justify-content: space-between; align-items: center;
106
+ width: 80px; height: 112px; border: 2px solid #202124; border-radius: 8px;
107
+ background-color: white; color: black; font-weight: bold; text-align: center; overflow: hidden; position: relative;
108
+ padding: 6px;
109
+ }
110
+ .card-rank { font-family: 'Inter' sans-serif; font-size: 50px; line-height: 1; display: block; align-self: flex-start; }
111
+ .card-suit { width: 50px; height: 50px; display: block; margin-bottom: 2px; }
112
+ .card-suit svg { width: 100%; height: 100%; }
113
+ .card-red .card-rank { color: #B3261E; }
114
+ .card-red .card-suit svg { fill: #B3261E; }
115
+ .card-black .card-rank { color: #000000; }
116
+ .card-black .card-suit svg { fill: #000000; }
117
+ .card-blue .card-rank { color: #0B57D0; }
118
+ .card-blue .card-suit svg { fill: #0B57D0; }
119
+ .card-green .card-rank { color: #146C2E; }
120
+ .card-green .card-suit svg { fill: #146C2E; }
121
+ .card-back {
122
+ background-color: #2b6cb0;
123
+ background-image: linear-gradient(45deg, rgba(255,255,255,0.1) 25%, transparent 25%, transparent 75%, rgba(255,255,255,0.1) 75%, rgba(255,255,255,0.1)),
124
+ linear-gradient(-45deg, rgba(255,255,255,0.1) 25%, transparent 25%, transparent 75%, rgba(255,255,255,0.1) 75%, rgba(255,255,255,0.1));
125
+ background-size: 10px 10px; border: 2px solid #63b3ed;
126
+ }
127
+ .card-back .card-rank, .card-back .card-suit { display: none; }
128
+ .card-empty {
129
+ background-color: rgba(255, 255, 255, 0.1);
130
+ border: 2px solid rgba(32, 33, 36, 0.5);
131
+ background-image: none;
132
+ }
133
+ .card-empty .card-rank, .card-empty .card-suit { display: none; }
134
+ .community-cards-area { text-align: center; z-index: 10; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
135
+ .community-cards-container { min-height: 75px; display: flex; justify-content: center; align-items:center; margin-bottom: 0.5rem; gap: 12px; }
136
+ .pot-display { font-size: 40px; font-weight: bold; color: #ffffff; margin-bottom: 30px; }
137
+ .bet-display {
138
+ display: inline-block; padding: 10px 20px; border-radius: 12px;
139
+ background-color: #3C4043; color: #ffff;
140
+ font-family: 'Inter' sans-serif; font-size: 1.75rem; font-weigth: 600;
141
+ text-align: center;
142
+ height: 3rem; line-height: 3rem;
143
+ min-width: 200px;
144
+ }
145
+ .blind-indicator { font-size: 0.7rem; color: #a0aec0; margin-top: 3px; }
146
+ .dealer-button {
147
+ width: 36px; height: 36px; background-color: #f0f0f0; color: #333; border-radius: 50%;
148
+ text-align: center; line-height: 36px; font-weight: bold; font-size: 1.5rem; position: absolute;
149
+ border: 3px solid #1EBEFF; box-shadow: 0 1px 3px rgba(0,0,0,0.3); z-index: 15; pointer-events: auto;
150
+ }
151
+ .dealer-button.dealer-player0 { bottom: 110px; }
152
+ .dealer-button.dealer-player1 { top: 110px; }
153
+ .step-counter {
154
+ position: absolute; top: 12px; right: 12px; z-index: 20;
155
+ background-color: rgba(60, 64, 67, 0.9); color: #ffffff;
156
+ padding: 6px 12px; border-radius: 6px;
157
+ font-size: 14px; font-weight: 600;
158
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
159
+ }
160
+
161
+ @media (max-width: 768px) {
162
+ .bet-display { font-size: 1.5rem; height: 2.2rem; line-height: 2.2rem; min-width: 0;}
163
+ .card { width: 60px; height: 85px; } .card-rank { font-size: 35px; } .card-suit { width: 35px; height: 35px; }
164
+ .community-cards-container { gap: 6px; }
165
+ .player-card-area { min-height: 120px; }
166
+ .player-cards-container { gap: 6px; }
167
+ .player-info-area { min-width: 160px; }
168
+ .poker-game-layout { max-height: 700px; }
169
+ .pot-display { font-size: 35px; margin-bottom: 20px; }
170
+ }
171
+ @media (max-width: 600px) {
172
+ .bet-display { font-size: 20px; height: 40px; line-height: 40px; }
173
+ .card { width: 50px; height: 70px; padding: 2px; } .card-rank { font-size: 32px; } .card-suit { width: 32px; height: 32px; }
174
+ .community-cards-container { gap: 2px; }
175
+ .dealer-button { font-size: 20px; height: 24px; line-height: 24px; width: 24px; }
176
+ .dealer-button.dealer-player0 { bottom: 95px; }
177
+ .dealer-button.dealer-player1 { top: 95px; }
178
+ .player-card-area { min-height: 110px; margin: 0 0 0 40px;}
179
+ .player-cards-container { gap: 2px; }
180
+ .player-info-area { margin-right: 20px; }
181
+ .player-name { font-size: 30px; margin: 0 20px; }
182
+ .player-stack { font-size: 30px; }
183
+ .poker-game-layout { max-height: 600px; }
184
+ .poker-table { width: clamp(300px, 90vw, 600px); height: clamp(160px, 50vw, 200px); margin: 20px; }
185
+ .pot-display { font-size: 30px; margin-bottom: 20px; }
186
+ }
187
+ @media (max-width: 400px) {
188
+ .bet-display { font-size: 15px; height: 30px; line-height: 30px; }
189
+ .card { width: 40px; height: 56px; margin: 0 2px; padding: 2px; } .card-rank { font-size: 25px; } .card-suit { width: 25px; height: 25px; }
190
+ .community-cards-container { gap: 2px; }
191
+ .dealer-button { font-size: 15px; height: 20px; line-height: 20px; width: 20px; }
192
+ .dealer-button.dealer-player0 { bottom: 85px; }
193
+ .dealer-button.dealer-player1 { top: 85px; }
194
+ .player-card-area { margin: 0 0 0 30px;}
195
+ .player-cards-container { gap: 2px; }
196
+ .player-info-area { min-width: 100px; margin-right: 0; }
197
+ .player-name { font-size: 25px; }
198
+ .player-stack { font-size: 15px; }
199
+ .poker-game-layout { max-height: 500px; }
200
+ .poker-table { width: clamp(280px, 95vw, 380px); height: clamp(150px, 55vw, 150px); margin: 0;}
201
+ .pot-display { font-size: 25px; margin-bottom: 15px; }
202
+ }
203
+ `;
204
+
205
+ function _injectStyles(passedOptions) {
206
+ if (typeof document === 'undefined' || window.__poker_styles_injected) {
207
+ return;
208
+ }
209
+ const style = document.createElement('style');
210
+ style.textContent = css;
211
+ const parentForStyles =
212
+ passedOptions && passedOptions.parent ? passedOptions.parent.ownerDocument.head : document.head;
213
+ if (parentForStyles && !parentForStyles.querySelector('style[data-poker-renderer-styles]')) {
214
+ style.setAttribute('data-poker-renderer-styles', 'true');
215
+ parentForStyles.appendChild(style);
216
+ }
217
+ window.__poker_styles_injected = true;
218
+ }
219
+
220
+ function createCardElement(cardStr, isHidden = false) {
221
+ const cardDiv = document.createElement('div');
222
+ cardDiv.classList.add('card');
223
+ if (isHidden || !cardStr || cardStr === '?' || cardStr === '??') {
224
+ cardDiv.classList.add('card-back');
225
+ } else {
226
+ const { rank, suit } = acpcCardToDisplay(cardStr);
227
+ const rankSpan = document.createElement('span');
228
+ rankSpan.classList.add('card-rank');
229
+ rankSpan.textContent = rank;
230
+ cardDiv.appendChild(rankSpan);
231
+
232
+ const suitSpan = document.createElement('span');
233
+ suitSpan.classList.add('card-suit');
234
+
235
+ if (suitSVGs[suit]) {
236
+ suitSpan.innerHTML = suitSVGs[suit];
237
+ }
238
+
239
+ cardDiv.appendChild(suitSpan);
240
+
241
+ if (suit === 'hearts') cardDiv.classList.add('card-red');
242
+ else if (suit === 'spades') cardDiv.classList.add('card-black');
243
+ else if (suit === 'diamonds') cardDiv.classList.add('card-blue');
244
+ else if (suit === 'clubs') cardDiv.classList.add('card-green');
245
+ }
246
+ return cardDiv;
247
+ }
248
+
249
+ // --- Board Parsing and Rendering ---
250
+ function _ensurePokerTableElements(parentElement, passedOptions) {
251
+ if (!parentElement) return false;
252
+ parentElement.innerHTML = '';
253
+ parentElement.classList.add('poker-renderer-host');
254
+
255
+ elements.diagnosticHeader = document.createElement('h1');
256
+ elements.diagnosticHeader.id = 'poker-renderer-diagnostic-header';
257
+ elements.diagnosticHeader.textContent = 'Poker Table Initialized (Live Data)';
258
+ elements.diagnosticHeader.style.cssText =
259
+ 'color: lime; background-color: black; padding: 5px; font-size: 12px; position: absolute; top: 0px; left: 0px; z-index: 10001; display: none;'; // Hidden by default
260
+ parentElement.appendChild(elements.diagnosticHeader);
261
+
262
+ elements.gameLayout = document.createElement('div');
263
+ elements.gameLayout.className = 'poker-game-layout';
264
+ parentElement.appendChild(elements.gameLayout);
265
+
266
+ elements.pokerTableContainer = document.createElement('div');
267
+ elements.pokerTableContainer.className = 'poker-table-container';
268
+ elements.gameLayout.appendChild(elements.pokerTableContainer);
269
+
270
+ elements.playersContainer = document.createElement('div');
271
+ elements.playersContainer.className = 'players-container';
272
+ elements.gameLayout.appendChild(elements.playersContainer);
273
+
274
+ elements.pokerTable = document.createElement('div');
275
+ elements.pokerTable.className = 'poker-table';
276
+ elements.pokerTableContainer.appendChild(elements.pokerTable);
277
+
278
+ const communityArea = document.createElement('div');
279
+ communityArea.className = 'community-cards-area';
280
+ elements.pokerTable.appendChild(communityArea);
281
+
282
+ elements.potDisplay = document.createElement('div');
283
+ elements.potDisplay.className = 'pot-display';
284
+ communityArea.appendChild(elements.potDisplay);
285
+
286
+ elements.communityCardsContainer = document.createElement('div');
287
+ elements.communityCardsContainer.className = 'community-cards-container';
288
+ communityArea.appendChild(elements.communityCardsContainer);
289
+
290
+ elements.playerContainers = [];
291
+ elements.playerCardAreas = [];
292
+ elements.playerInfoAreas = [];
293
+ elements.playerNames = [];
294
+
295
+ for (let i = 0; i < 2; i++) {
296
+ // Create player container that groups all player elements
297
+ const playerContainer = document.createElement('div');
298
+ playerContainer.className = `player-container player-container-${i}`;
299
+ elements.playersContainer.appendChild(playerContainer);
300
+ elements.playerContainers.push(playerContainer);
301
+
302
+ // Player name
303
+ const playerName = document.createElement('div');
304
+ playerName.className = `player-name`;
305
+ playerName.textContent = `Player ${i}`;
306
+ playerContainer.appendChild(playerName);
307
+ elements.playerNames.push(playerName);
308
+
309
+ // Create wrapper for card and info areas
310
+ const playerAreaWrapper = document.createElement('div');
311
+ playerAreaWrapper.className = 'player-area-wrapper';
312
+ playerContainer.appendChild(playerAreaWrapper);
313
+
314
+ // Card area (left side)
315
+ const playerCardArea = document.createElement('div');
316
+ playerCardArea.className = `player-card-area`;
317
+ playerCardArea.innerHTML = `
318
+ <div class="player-cards-container"></div>
319
+ `;
320
+ playerAreaWrapper.appendChild(playerCardArea);
321
+ elements.playerCardAreas.push(playerCardArea);
322
+
323
+ // TODO: Render chip stack
324
+ // Info area (right side)
325
+ const playerInfoArea = document.createElement('div');
326
+ playerInfoArea.className = `player-info-area`;
327
+ playerInfoArea.innerHTML = `
328
+ <div class="player-stack">
329
+ <span class="player-stack-value">0</span>
330
+ </div>
331
+ <div class="bet-display" style="display:none;">Bet : 0</div>
332
+ `;
333
+ playerAreaWrapper.appendChild(playerInfoArea);
334
+ elements.playerInfoAreas.push(playerInfoArea);
335
+ }
336
+
337
+ elements.dealerButton = document.createElement('div');
338
+ elements.dealerButton.className = 'dealer-button';
339
+ elements.dealerButton.textContent = 'D';
340
+ elements.dealerButton.style.display = 'none';
341
+ elements.playersContainer.appendChild(elements.dealerButton);
342
+
343
+ elements.stepCounter = document.createElement('div');
344
+ elements.stepCounter.className = 'step-counter';
345
+ elements.stepCounter.textContent = 'Standby';
346
+ elements.gameLayout.appendChild(elements.stepCounter);
347
+ return true;
348
+ }
349
+
350
+ // --- State Parsing ---
351
+ function _parseKagglePokerState(options) {
352
+ const { environment, step } = options;
353
+ const numPlayers = 2;
354
+
355
+ // --- Default State ---
356
+ const defaultStateUiData = {
357
+ players: [],
358
+ communityCards: [],
359
+ pot: 0,
360
+ isTerminal: false,
361
+ };
362
+
363
+ // --- Step Validation ---
364
+ if (!environment || !environment.steps || !environment.steps[step] || !environment.info?.stateHistory) {
365
+ return defaultStateUiData;
366
+ }
367
+
368
+ return getPokerStateForStep(environment, step);
369
+ }
370
+
371
+ function _renderPokerTableUI(data, passedOptions) {
372
+ if (!elements.pokerTable || !data) return;
373
+ const { players, communityCards, pot, isTerminal, step } = data;
374
+
375
+ // Update step counter
376
+ if (elements.stepCounter && step !== undefined) {
377
+ elements.stepCounter.textContent = `Step: ${step}`;
378
+ }
379
+
380
+ if (elements.diagnosticHeader && data.rawObservation) {
381
+ // Optional: Show diagnostics for debugging
382
+ // elements.diagnosticHeader.textContent = `[${passedOptions.step}] P_TURN:${data.rawObservation.current_player} POT:${data.pot}`;
383
+ // elements.diagnosticHeader.style.display = 'block';
384
+ }
385
+
386
+ elements.communityCardsContainer.innerHTML = '';
387
+ // Always show 5 slots for the river
388
+ // Display cards left to right, with empty slots at the end
389
+ const numCommunityCards = 5;
390
+ const numCards = communityCards ? communityCards.length : 0;
391
+
392
+ // Since the 4th and 5th street cards are appended to the communityCards array, we need to
393
+ // reverse it so that the added cards are put at the end of the display area on the board.
394
+ if (communityCards) communityCards.reverse();
395
+
396
+ // Add actual cards
397
+ for (let i = 0; i < numCards; i++) {
398
+ elements.communityCardsContainer.appendChild(createCardElement(communityCards[i]));
399
+ }
400
+
401
+ // Fill remaining slots with empty cards
402
+ for (let i = numCards; i < numCommunityCards; i++) {
403
+ const emptyCard = document.createElement('div');
404
+ emptyCard.classList.add('card', 'card-empty');
405
+ elements.communityCardsContainer.appendChild(emptyCard);
406
+ }
407
+
408
+ elements.potDisplay.textContent = `Pot : ${pot}`;
409
+
410
+ players.forEach((playerData, index) => {
411
+ const playerNameElement = elements.playerNames[index];
412
+ if (playerNameElement) {
413
+ const playerNameText =
414
+ playerData.isTurn && !isTerminal ? `${playerData.name} responding...` : playerData.name;
415
+ playerNameElement.textContent = playerNameText;
416
+
417
+ // Add winner class if player won
418
+ if (playerData.isWinner) {
419
+ playerNameElement.classList.add('winner');
420
+ } else {
421
+ playerNameElement.classList.remove('winner');
422
+ }
423
+ }
424
+
425
+ // Update card area (left side)
426
+ const playerCardArea = elements.playerCardAreas[index];
427
+ if (playerCardArea) {
428
+ const playerCardsContainer = playerCardArea.querySelector('.player-cards-container');
429
+ playerCardsContainer.innerHTML = '';
430
+
431
+ // In heads-up, we show both hands at the end.
432
+ const showCards = isTerminal || (playerData.cards && !playerData.cards.includes(null));
433
+
434
+ (playerData.cards || [null, null]).forEach((cardStr) => {
435
+ playerCardsContainer.appendChild(createCardElement(cardStr, !showCards && cardStr !== null));
436
+ });
437
+ }
438
+
439
+ // Update info area (right side)
440
+ const playerInfoArea = elements.playerInfoAreas[index];
441
+ if (playerInfoArea) {
442
+ playerInfoArea.querySelector('.player-stack-value').textContent = `${playerData.stack}`;
443
+
444
+ const betDisplay = playerInfoArea.querySelector('.bet-display');
445
+ if (playerData.currentBet > 0) {
446
+ if (data.lastMoves[index]) {
447
+ betDisplay.textContent = data.lastMoves[index];
448
+ } else {
449
+ if (playerData.isDealer) {
450
+ betDisplay.textContent = 'small blind';
451
+ } else {
452
+ betDisplay.textContent = 'big blind';
453
+ }
454
+ }
455
+ betDisplay.style.display = 'block';
456
+ } else {
457
+ betDisplay.style.display = 'none';
458
+ }
459
+ }
460
+ });
461
+
462
+ const dealerPlayerIndex = players.findIndex((p) => p.isDealer);
463
+ if (elements.dealerButton) {
464
+ if (dealerPlayerIndex !== -1) {
465
+ elements.dealerButton.style.display = 'block';
466
+ // Remove previous dealer class
467
+ elements.dealerButton.classList.remove('dealer-player0', 'dealer-player1');
468
+ // Add new dealer class based on player index
469
+ elements.dealerButton.classList.add(`dealer-player${dealerPlayerIndex}`);
470
+ } else {
471
+ elements.dealerButton.style.display = 'none';
472
+ }
473
+ }
474
+ }
475
+
476
+ // --- MAIN EXECUTION LOGIC ---
477
+ const { parent } = options;
478
+ if (!parent) {
479
+ console.error('Renderer: Parent element not provided.');
480
+ return;
481
+ }
482
+
483
+ _injectStyles(options);
484
+
485
+ if (!_ensurePokerTableElements(parent, options)) {
486
+ console.error('Renderer: Failed to ensure poker table elements.');
487
+ parent.innerHTML = '<p style="color:red;">Error: Could not create poker table structure.</p>';
488
+ return;
489
+ }
490
+
491
+ const uiData = _parseKagglePokerState(options);
492
+ _renderPokerTableUI(uiData, options);
493
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../../../../../../web/tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "allowJs": true
5
+ },
6
+ "include": ["src"]
7
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig, mergeConfig } from 'vite';
2
+ import baseConfig from '../../../../../../../web/vite.config.base';
3
+
4
+ // https://vitejs.dev/config/
5
+ export default mergeConfig(baseConfig, defineConfig({
6
+ }));
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaggle-environments
3
- Version: 1.23.1
3
+ Version: 1.23.2
4
4
  Summary: Kaggle Environments
5
5
  Author-email: Kaggle <support@kaggle.com>
6
6
  Requires-Python: >=3.10
@@ -22,6 +22,14 @@ kaggle_environments/envs/connectx/connectx.js,sha256=2j4PigyyZYNH5tzKflmj__8-kT9
22
22
  kaggle_environments/envs/connectx/connectx.json,sha256=Tt-vH-em-RKK5scAcjJ82zOvGov42OW6u9IJCPkS9Fo,1783
23
23
  kaggle_environments/envs/connectx/connectx.py,sha256=B-JekMMjcrxoH-KDpKRdR5r_lJQx9ztY3BtZzHSI-E8,6568
24
24
  kaggle_environments/envs/connectx/test_connectx.py,sha256=nwLlxBBfSiI4hbPNSnXdNFshYUUga9S1A0WcwUZtYis,7917
25
+ kaggle_environments/envs/connectx/visualizer/default/index.html,sha256=fKJFgc4cypXsTHORfoLGBo3r0eWXuAJW4RzuNK7K3FI,366
26
+ kaggle_environments/envs/connectx/visualizer/default/package.json,sha256=0f33_CaoXHQwXH1IQmtJqxT0Mph7xuc22gntRt8OPXw,525
27
+ kaggle_environments/envs/connectx/visualizer/default/tsconfig.json,sha256=KHFag3D0wpwBvrrByRP-NBiwDF_cNlZNTSxk1CHj6wg,79
28
+ kaggle_environments/envs/connectx/visualizer/default/vite.config.ts,sha256=fMEARePfUzkFQIcd09CL3Bv0zZjpMo436nnIO-9kgHM,226
29
+ kaggle_environments/envs/connectx/visualizer/default/replays/test-replay.json,sha256=gqJh7aEt_P5o84nczpJslMpDzlomPyNJPkL1nA6cggU,28445
30
+ kaggle_environments/envs/connectx/visualizer/default/src/main.ts,sha256=5BrqDaDA6N2ATsBZa3YTvjmtOiGDO5E1kP2FmL9qG1c,308
31
+ kaggle_environments/envs/connectx/visualizer/default/src/renderer.ts,sha256=gZujGgk4XuPegxDpAMkImFwHyiADGiMant6aWACC6ic,11922
32
+ kaggle_environments/envs/connectx/visualizer/default/src/style.css,sha256=TRHt7Gndn0GRHtK8ZYXjyfm5QbzF2ANotwdX5540OQY,565
25
33
  kaggle_environments/envs/football/football.ipynb,sha256=zp9zu5VPVamT-t9j2lyA8plkliQHGI8b7rbIbqGaBn4,2254
26
34
  kaggle_environments/envs/football/football.json,sha256=kAGwqJHptNMsZ_CSsS_fmsAmafIVcDXzh0DLYEzlUP4,3139
27
35
  kaggle_environments/envs/football/football.py,sha256=KTOtU89mSAByJ0FfBTf2WMJFbqstL3mR7A350qnwvRY,9224
@@ -181,6 +189,15 @@ kaggle_environments/envs/open_spiel_env/games/go/__init__.py,sha256=47DEQpj8HBSa
181
189
  kaggle_environments/envs/open_spiel_env/games/go/go.js,sha256=SWUPrnQCMBlDjUiKTgVn9LeTUM85YbR10JRrq3ddw14,23751
182
190
  kaggle_environments/envs/open_spiel_env/games/go/go_proxy.py,sha256=_b-PTFlN7FUtjSx26ciR6Os4rTop8A6vemF86HMYMO8,3407
183
191
  kaggle_environments/envs/open_spiel_env/games/repeated_poker/repeated_poker.js,sha256=zNM_NpmPR453aufRKpfsuvpCFYw30C7fgULV6LUf3S4,35306
192
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/index.html,sha256=9BsANJfu4GHJhJbtwPGGyF8vjLpYryYvj5NtghwSRzU,372
193
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/package.json,sha256=wB7388yBrChi5rrP2bIUguAgYL_YJ-a9LqZD5lu4Pcs,536
194
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/tsconfig.json,sha256=3X9dsQOgFw_cZ_uXByZIsGrQ5jhFfAZZL7QC6ApJWak,133
195
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/vite.config.ts,sha256=KhIjUn0WWhaoQzQ5YKuWjNndimRF0kFlYDgEnZ0cg7U,208
196
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/replays/test-replay.json,sha256=jf4ilR6SmOYPNohkIGJvmKP5Gju5FY6sfSStX1qtFZg,28919900
197
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/main.ts,sha256=5NZlic4P9aSdMJpWxckaDrObEx2OJj8FNG49g-Z9_ow,1095
198
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/repeated_poker_renderer.js,sha256=4WV-DkxkwJ7F5RLutDpBQEpBUoA3_pW9Aqfw5_IenXA,22483
199
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/components/getRepeatedPokerStateForStep.js,sha256=qzUIlL33-YDpeINi-pCUVLrG1IbVRZuR9h_FVQW3mQ8,9086
200
+ kaggle_environments/envs/open_spiel_env/games/repeated_poker/visualizer/default/src/components/utils.js,sha256=pXDAu4V2OppRCvMdJKQ56q1uFTJReMPIvBL6gwxIJoI,5734
184
201
  kaggle_environments/envs/open_spiel_env/games/tic_tac_toe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
202
  kaggle_environments/envs/open_spiel_env/games/tic_tac_toe/tic_tac_toe.js,sha256=OD7FbhhOqmL8OC7UqPt0S9znwcUY4YTuhRCdsBd3ALE,17339
186
203
  kaggle_environments/envs/open_spiel_env/games/tic_tac_toe/tic_tac_toe_proxy.py,sha256=r1A2Yl0vapJRrTEnvwfP9-P-uz_xtyWdWKXGsRXdR4o,2937
@@ -224,8 +241,8 @@ kaggle_environments/envs/werewolf/game/protocols/chat.py,sha256=wFewQogic1CHr4AW
224
241
  kaggle_environments/envs/werewolf/game/protocols/factory.py,sha256=hg9Xj5Z-8USmqhouVzo8b7Ktl91xzFsE5_8naD6yErY,2316
225
242
  kaggle_environments/envs/werewolf/game/protocols/vote.py,sha256=hKw64ubLMCIAIG5IcmNeV9MPTWWmWpkkCAyia_5kXn0,20716
226
243
  kaggle_environments/static/player.html,sha256=Icl5yYscPe4BRoWt0HLOSRJWnznQq2MdTHHCaC2OrQQ,27753
227
- kaggle_environments-1.23.1.dist-info/entry_points.txt,sha256=h03sq76TdcHvXKcsre1Qm3lIni9dkWehu61xJqI-p8k,69
228
- kaggle_environments-1.23.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
229
- kaggle_environments-1.23.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
230
- kaggle_environments-1.23.1.dist-info/METADATA,sha256=0E-JHPMNzvR_40UBtPzZeTO0_DYqOdC5-a4A1I4R-ek,916
231
- kaggle_environments-1.23.1.dist-info/RECORD,,
244
+ kaggle_environments-1.23.2.dist-info/entry_points.txt,sha256=h03sq76TdcHvXKcsre1Qm3lIni9dkWehu61xJqI-p8k,69
245
+ kaggle_environments-1.23.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
246
+ kaggle_environments-1.23.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
247
+ kaggle_environments-1.23.2.dist-info/METADATA,sha256=gUSJ4sbn187BOtv7Via8k0AA_4kbC4rPZkRxjN00l1Q,916
248
+ kaggle_environments-1.23.2.dist-info/RECORD,,