kaggle-environments 1.23.1__py3-none-any.whl → 1.23.3__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 +499 -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.3.dist-info}/METADATA +1 -1
  19. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.3.dist-info}/RECORD +22 -5
  20. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.3.dist-info}/WHEEL +0 -0
  21. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.3.dist-info}/entry_points.txt +0 -0
  22. {kaggle_environments-1.23.1.dist-info → kaggle_environments-1.23.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,499 @@
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; box-sizing: border-box; position: relative;
49
+ }
50
+ .poker-game-layout {
51
+ width: 1000px;
52
+ height: 700px;
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ position: relative;
57
+ transform-origin: center center;
58
+ }
59
+ .poker-table-container {
60
+ width: 100%;
61
+ height: 400px;
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ }
66
+ .poker-table {
67
+ width: 900px;
68
+ height: 400px;
69
+ background: radial-gradient(43.33% 50% at 50% 50%, #20BD48 0%, #0A4018 99.99%);
70
+ border-radius: 300px;
71
+ position: relative;
72
+ border: 20px solid #5C3A21;
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ margin: 0;
77
+ }
78
+ .players-container {
79
+ position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 10;
80
+ }
81
+ .player-container {
82
+ position: absolute;
83
+ width: 100%;
84
+ pointer-events: none;
85
+ display: flex;
86
+ flex-direction: column;
87
+ }
88
+ .player-container-0 { bottom: 0; flex-direction: column-reverse; }
89
+ .player-container-1 { top: 0; }
90
+ .player-area-wrapper {
91
+ display: flex;
92
+ justify-content: space-between;
93
+ align-items: center;
94
+ }
95
+ .player-card-area {
96
+ margin: 20px 60px; color: white; text-align: center;
97
+ display: flex; flex-direction: column; justify-content: center; align-items: center;
98
+ min-height: 100px; pointer-events: auto;
99
+ }
100
+ .player-info-area {
101
+ color: white;
102
+ min-width: 180px;
103
+ pointer-events: auto;
104
+ display: flex;
105
+ flex-direction: column;
106
+ justify-content: left;
107
+ align-items: left;
108
+ margin-right: 60px;
109
+ }
110
+ .player-container-0 .player-info-area { flex-direction: column-reverse; }
111
+ .player-name {
112
+ font-size: 32px; font-weight: 600;
113
+ white-space: nowrap;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ color: white;
117
+ text-align: left;
118
+ padding: 10px 0;
119
+ margin: 0 60px;
120
+ }
121
+ .player-name.winner { color: #FFEB70; }
122
+ .player-stack { font-size: 32px; font-weight: 600; color: #ffffff; margin: 16px 0; display: flex; justify-content: space-between; align-items: center; }
123
+ .player-cards-container { min-height: 70px; display: flex; justify-content: flex-start; align-items:center; gap: 8px; }
124
+ .card {
125
+ display: flex; flex-direction: column; justify-content: space-between; align-items: center;
126
+ width: 54px; height: 84px; border: 2px solid #202124; border-radius: 8px;
127
+ background-color: white; color: black; font-weight: bold; text-align: center; overflow: hidden; position: relative;
128
+ padding: 6px;
129
+ box-shadow: 0 6px 10px 4px rgba(0, 0, 0, 0.15), 0 2px 3px 0 rgba(0, 0, 0, 0.30);
130
+ }
131
+ .card-rank { font-family: 'Inter' sans-serif; font-size: 40px; line-height: 1; display: block; align-self: flex-start; }
132
+ .card-suit { width: 40px; height: 40px; display: block; margin-bottom: 2px; }
133
+ .card-suit svg { width: 100%; height: 100%; }
134
+ .card-red .card-rank { color: #B3261E; }
135
+ .card-red .card-suit svg { fill: #B3261E; }
136
+ .card-black .card-rank { color: #000000; }
137
+ .card-black .card-suit svg { fill: #000000; }
138
+ .card-blue .card-rank { color: #0B57D0; }
139
+ .card-blue .card-suit svg { fill: #0B57D0; }
140
+ .card-green .card-rank { color: #146C2E; }
141
+ .card-green .card-suit svg { fill: #146C2E; }
142
+ .card-back {
143
+ background-color: #2b6cb0;
144
+ 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)),
145
+ 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));
146
+ background-size: 10px 10px; border: 2px solid #63b3ed;
147
+ }
148
+ .card-back .card-rank, .card-back .card-suit { display: none; }
149
+ .card-empty {
150
+ background-color: rgba(232, 234, 237, 0.1);
151
+ border: 2px solid rgba(154, 160, 166, 0.5);
152
+ box-shadow: none
153
+ }
154
+ .card-empty .card-rank, .card-empty .card-suit { display: none; }
155
+ .community-cards-area { text-align: center; z-index: 10; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
156
+ .community-cards-container { min-height: 75px; display: flex; justify-content: center; align-items:center; margin-bottom: 0.5rem; gap: 8px; }
157
+ .pot-display { font-size: 30px; font-weight: bold; color: #ffffff; margin-bottom: 30px; }
158
+ .bet-display {
159
+ display: inline-block; padding: 10px 20px; border-radius: 12px;
160
+ background-color: #3C4043; color: #ffff;
161
+ font-family: 'Inter' sans-serif; font-size: 1.75rem; font-weigth: 600;
162
+ text-align: center;
163
+ height: 3rem; line-height: 3rem;
164
+ min-width: 200px;
165
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
166
+ }
167
+ .blind-indicator { font-size: 0.7rem; color: #a0aec0; margin-top: 3px; }
168
+ .dealer-button {
169
+ width: 36px; height: 36px; background-color: #f0f0f0; color: #333; border-radius: 50%;
170
+ text-align: center; line-height: 36px; font-weight: bold; font-size: 1.5rem; position: absolute;
171
+ border: 3px solid #1EBEFF; box-shadow: 0 1px 3px rgba(0,0,0,0.3); z-index: 15; pointer-events: auto;
172
+ }
173
+ .dealer-button.dealer-player0 { bottom: 110px; }
174
+ .dealer-button.dealer-player1 { top: 110px; }
175
+ .step-counter {
176
+ position: absolute; top: 12px; right: 12px; z-index: 20;
177
+ background-color: rgba(60, 64, 67, 0.9); color: #ffffff;
178
+ padding: 6px 12px; border-radius: 6px;
179
+ font-size: 14px; font-weight: 600;
180
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
181
+ }
182
+ `;
183
+
184
+ function _injectStyles(passedOptions) {
185
+ if (typeof document === 'undefined' || window.__poker_styles_injected) {
186
+ return;
187
+ }
188
+ const style = document.createElement('style');
189
+ style.textContent = css;
190
+ const parentForStyles =
191
+ passedOptions && passedOptions.parent ? passedOptions.parent.ownerDocument.head : document.head;
192
+ if (parentForStyles && !parentForStyles.querySelector('style[data-poker-renderer-styles]')) {
193
+ style.setAttribute('data-poker-renderer-styles', 'true');
194
+ parentForStyles.appendChild(style);
195
+ }
196
+ window.__poker_styles_injected = true;
197
+ }
198
+
199
+ function createCardElement(cardStr, isHidden = false) {
200
+ const cardDiv = document.createElement('div');
201
+ cardDiv.classList.add('card');
202
+ if (isHidden || !cardStr || cardStr === '?' || cardStr === '??') {
203
+ cardDiv.classList.add('card-back');
204
+ } else {
205
+ const { rank, suit } = acpcCardToDisplay(cardStr);
206
+ const rankSpan = document.createElement('span');
207
+ rankSpan.classList.add('card-rank');
208
+ rankSpan.textContent = rank;
209
+ cardDiv.appendChild(rankSpan);
210
+
211
+ const suitSpan = document.createElement('span');
212
+ suitSpan.classList.add('card-suit');
213
+
214
+ if (suitSVGs[suit]) {
215
+ suitSpan.innerHTML = suitSVGs[suit];
216
+ }
217
+
218
+ cardDiv.appendChild(suitSpan);
219
+
220
+ if (suit === 'hearts') cardDiv.classList.add('card-red');
221
+ else if (suit === 'spades') cardDiv.classList.add('card-black');
222
+ else if (suit === 'diamonds') cardDiv.classList.add('card-blue');
223
+ else if (suit === 'clubs') cardDiv.classList.add('card-green');
224
+ }
225
+ return cardDiv;
226
+ }
227
+
228
+ // --- Board Parsing and Rendering ---
229
+ function _ensurePokerTableElements(parentElement, passedOptions) {
230
+ if (!parentElement) return false;
231
+ parentElement.innerHTML = '';
232
+ parentElement.classList.add('poker-renderer-host');
233
+
234
+ elements.diagnosticHeader = document.createElement('h1');
235
+ elements.diagnosticHeader.id = 'poker-renderer-diagnostic-header';
236
+ elements.diagnosticHeader.textContent = 'Poker Table Initialized (Live Data)';
237
+ elements.diagnosticHeader.style.cssText =
238
+ 'color: lime; background-color: black; padding: 5px; font-size: 12px; position: absolute; top: 0px; left: 0px; z-index: 10001; display: none;'; // Hidden by default
239
+ parentElement.appendChild(elements.diagnosticHeader);
240
+
241
+ elements.gameLayout = document.createElement('div');
242
+ elements.gameLayout.className = 'poker-game-layout';
243
+ parentElement.appendChild(elements.gameLayout);
244
+
245
+ elements.pokerTableContainer = document.createElement('div');
246
+ elements.pokerTableContainer.className = 'poker-table-container';
247
+ elements.gameLayout.appendChild(elements.pokerTableContainer);
248
+
249
+ elements.playersContainer = document.createElement('div');
250
+ elements.playersContainer.className = 'players-container';
251
+ elements.gameLayout.appendChild(elements.playersContainer);
252
+
253
+ elements.pokerTable = document.createElement('div');
254
+ elements.pokerTable.className = 'poker-table';
255
+ elements.pokerTableContainer.appendChild(elements.pokerTable);
256
+
257
+ const communityArea = document.createElement('div');
258
+ communityArea.className = 'community-cards-area';
259
+ elements.pokerTable.appendChild(communityArea);
260
+
261
+ elements.potDisplay = document.createElement('div');
262
+ elements.potDisplay.className = 'pot-display';
263
+ communityArea.appendChild(elements.potDisplay);
264
+
265
+ elements.communityCardsContainer = document.createElement('div');
266
+ elements.communityCardsContainer.className = 'community-cards-container';
267
+ communityArea.appendChild(elements.communityCardsContainer);
268
+
269
+ elements.playerContainers = [];
270
+ elements.playerCardAreas = [];
271
+ elements.playerInfoAreas = [];
272
+ elements.playerNames = [];
273
+
274
+ for (let i = 0; i < 2; i++) {
275
+ // Create player container that groups all player elements
276
+ const playerContainer = document.createElement('div');
277
+ playerContainer.className = `player-container player-container-${i}`;
278
+ elements.playersContainer.appendChild(playerContainer);
279
+ elements.playerContainers.push(playerContainer);
280
+
281
+ // Player name
282
+ const playerName = document.createElement('div');
283
+ playerName.className = `player-name`;
284
+ playerName.textContent = `Player ${i}`;
285
+ playerContainer.appendChild(playerName);
286
+ elements.playerNames.push(playerName);
287
+
288
+ // Create wrapper for card and info areas
289
+ const playerAreaWrapper = document.createElement('div');
290
+ playerAreaWrapper.className = 'player-area-wrapper';
291
+ playerContainer.appendChild(playerAreaWrapper);
292
+
293
+ // Card area (left side)
294
+ const playerCardArea = document.createElement('div');
295
+ playerCardArea.className = `player-card-area`;
296
+ playerCardArea.innerHTML = `
297
+ <div class="player-cards-container"></div>
298
+ `;
299
+ playerAreaWrapper.appendChild(playerCardArea);
300
+ elements.playerCardAreas.push(playerCardArea);
301
+
302
+ // TODO: Render chip stack
303
+ // Info area (right side)
304
+ const playerInfoArea = document.createElement('div');
305
+ playerInfoArea.className = `player-info-area`;
306
+ playerInfoArea.innerHTML = `
307
+ <div class="player-stack">
308
+ <span class="player-stack-value">0</span>
309
+ </div>
310
+ <div class="bet-display" style="display:none;">Bet : 0</div>
311
+ `;
312
+ playerAreaWrapper.appendChild(playerInfoArea);
313
+ elements.playerInfoAreas.push(playerInfoArea);
314
+ }
315
+
316
+ elements.dealerButton = document.createElement('div');
317
+ elements.dealerButton.className = 'dealer-button';
318
+ elements.dealerButton.textContent = 'D';
319
+ elements.dealerButton.style.display = 'none';
320
+ elements.playersContainer.appendChild(elements.dealerButton);
321
+
322
+ elements.stepCounter = document.createElement('div');
323
+ elements.stepCounter.className = 'step-counter';
324
+ elements.stepCounter.textContent = 'Standby';
325
+ elements.gameLayout.appendChild(elements.stepCounter);
326
+ return true;
327
+ }
328
+
329
+ // --- State Parsing ---
330
+ function _parseKagglePokerState(options) {
331
+ const { environment, step } = options;
332
+ const numPlayers = 2;
333
+
334
+ // --- Default State ---
335
+ const defaultStateUiData = {
336
+ players: [],
337
+ communityCards: [],
338
+ pot: 0,
339
+ isTerminal: false,
340
+ };
341
+
342
+ // --- Step Validation ---
343
+ if (!environment || !environment.steps || !environment.steps[step] || !environment.info?.stateHistory) {
344
+ return defaultStateUiData;
345
+ }
346
+
347
+ return getPokerStateForStep(environment, step);
348
+ }
349
+
350
+ function _applyScale(parentElement) {
351
+ if (!parentElement || !elements.gameLayout) return;
352
+
353
+ const parentWidth = parentElement.clientWidth;
354
+ const parentHeight = parentElement.clientHeight;
355
+
356
+ const baseWidth = 1000;
357
+ const baseHeight = 700;
358
+
359
+ const scaleX = parentWidth / baseWidth;
360
+ const scaleY = parentHeight / baseHeight;
361
+ const scale = Math.min(scaleX, scaleY);
362
+
363
+ elements.gameLayout.style.transform = `scale(${scale})`;
364
+ }
365
+
366
+ function _renderPokerTableUI(data, passedOptions) {
367
+ if (!elements.pokerTable || !data) return;
368
+ const { players, communityCards, pot, isTerminal, step } = data;
369
+
370
+ // Update step counter
371
+ if (elements.stepCounter && step !== undefined) {
372
+ elements.stepCounter.textContent = `Step: ${step}`;
373
+ }
374
+
375
+ if (elements.diagnosticHeader && data.rawObservation) {
376
+ // Optional: Show diagnostics for debugging
377
+ // elements.diagnosticHeader.textContent = `[${passedOptions.step}] P_TURN:${data.rawObservation.current_player} POT:${data.pot}`;
378
+ // elements.diagnosticHeader.style.display = 'block';
379
+ }
380
+
381
+ elements.communityCardsContainer.innerHTML = '';
382
+ // Always show 5 slots for the river
383
+ // Display cards left to right, with empty slots at the end
384
+ const numCommunityCards = 5;
385
+ const numCards = communityCards ? communityCards.length : 0;
386
+
387
+ // Since the 4th and 5th street cards are appended to the communityCards array, we need to
388
+ // reverse it so that the added cards are put at the end of the display area on the board.
389
+ if (communityCards) communityCards.reverse();
390
+
391
+ // Add actual cards
392
+ for (let i = 0; i < numCards; i++) {
393
+ elements.communityCardsContainer.appendChild(createCardElement(communityCards[i]));
394
+ }
395
+
396
+ // Fill remaining slots with empty cards
397
+ for (let i = numCards; i < numCommunityCards; i++) {
398
+ const emptyCard = document.createElement('div');
399
+ emptyCard.classList.add('card', 'card-empty');
400
+ elements.communityCardsContainer.appendChild(emptyCard);
401
+ }
402
+
403
+ elements.potDisplay.textContent = `Total Pot : ${pot}`;
404
+
405
+ players.forEach((playerData, index) => {
406
+ const playerNameElement = elements.playerNames[index];
407
+ if (playerNameElement) {
408
+ const playerNameText =
409
+ playerData.isTurn && !isTerminal ? `${playerData.name} responding...` : playerData.name;
410
+ playerNameElement.textContent = playerNameText;
411
+
412
+ // Add winner class if player won
413
+ if (playerData.isWinner) {
414
+ playerNameElement.classList.add('winner');
415
+ } else {
416
+ playerNameElement.classList.remove('winner');
417
+ }
418
+ }
419
+
420
+ // Update card area (left side)
421
+ const playerCardArea = elements.playerCardAreas[index];
422
+ if (playerCardArea) {
423
+ const playerCardsContainer = playerCardArea.querySelector('.player-cards-container');
424
+ playerCardsContainer.innerHTML = '';
425
+
426
+ // In heads-up, we show both hands at the end.
427
+ const showCards = isTerminal || (playerData.cards && !playerData.cards.includes(null));
428
+
429
+ (playerData.cards || [null, null]).forEach((cardStr) => {
430
+ playerCardsContainer.appendChild(createCardElement(cardStr, !showCards && cardStr !== null));
431
+ });
432
+ }
433
+
434
+ // Update info area (right side)
435
+ const playerInfoArea = elements.playerInfoAreas[index];
436
+ if (playerInfoArea) {
437
+ playerInfoArea.querySelector('.player-stack-value').textContent = `${playerData.stack}`;
438
+
439
+ const betDisplay = playerInfoArea.querySelector('.bet-display');
440
+ if (playerData.currentBet > 0) {
441
+ if (data.lastMoves[index]) {
442
+ betDisplay.textContent = data.lastMoves[index];
443
+ } else {
444
+ if (playerData.isDealer) {
445
+ betDisplay.textContent = 'small blind';
446
+ } else {
447
+ betDisplay.textContent = 'big blind';
448
+ }
449
+ }
450
+ betDisplay.style.display = 'block';
451
+ } else {
452
+ betDisplay.style.display = 'none';
453
+ }
454
+ }
455
+ });
456
+
457
+ const dealerPlayerIndex = players.findIndex((p) => p.isDealer);
458
+ if (elements.dealerButton) {
459
+ if (dealerPlayerIndex !== -1) {
460
+ elements.dealerButton.style.display = 'block';
461
+ // Remove previous dealer class
462
+ elements.dealerButton.classList.remove('dealer-player0', 'dealer-player1');
463
+ // Add new dealer class based on player index
464
+ elements.dealerButton.classList.add(`dealer-player${dealerPlayerIndex}`);
465
+ } else {
466
+ elements.dealerButton.style.display = 'none';
467
+ }
468
+ }
469
+ }
470
+
471
+ // --- MAIN EXECUTION LOGIC ---
472
+ const { parent } = options;
473
+ if (!parent) {
474
+ console.error('Renderer: Parent element not provided.');
475
+ return;
476
+ }
477
+
478
+ _injectStyles(options);
479
+
480
+ if (!_ensurePokerTableElements(parent, options)) {
481
+ console.error('Renderer: Failed to ensure poker table elements.');
482
+ parent.innerHTML = '<p style="color:red;">Error: Could not create poker table structure.</p>';
483
+ return;
484
+ }
485
+
486
+ const uiData = _parseKagglePokerState(options);
487
+ _renderPokerTableUI(uiData, options);
488
+
489
+ // Apply initial scale
490
+ _applyScale(parent);
491
+
492
+ // Watch for container size changes and reapply scale
493
+ if (typeof ResizeObserver !== 'undefined') {
494
+ const resizeObserver = new ResizeObserver(() => {
495
+ _applyScale(parent);
496
+ });
497
+ resizeObserver.observe(parent);
498
+ }
499
+ }
@@ -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.3
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=XMyktKkyUTF_UXnMn8LerO_rx3YH6nm0omb7ImuLm4M,21092
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.3.dist-info/entry_points.txt,sha256=h03sq76TdcHvXKcsre1Qm3lIni9dkWehu61xJqI-p8k,69
245
+ kaggle_environments-1.23.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
246
+ kaggle_environments-1.23.3.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
247
+ kaggle_environments-1.23.3.dist-info/METADATA,sha256=ZB40jlDxGCqUGoIwxNg8cRDdu2Ombdus7v9uw7BfV6A,916
248
+ kaggle_environments-1.23.3.dist-info/RECORD,,