@everymatrix/casino-game-thumbnail 0.0.367 → 0.0.369

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.
@@ -1,1377 +1,1377 @@
1
- <svelte:options tag={null} />
2
-
3
- <script lang="ts">
4
- import moment from 'moment';
5
- import { onMount, tick } from "svelte";
6
- import { isMobile, getDevice } from 'rvhelper';
7
- import { _, addNewMessages } from './i18n';
8
- import { GameThumbnailTranslations } from './translations';
9
- import { currenciesSymbols } from './currency-symbols';
10
-
11
- export let session:string = '';
12
- export let userid:string = '';
13
- export let lang:string = '';
14
- export let clientstyling:string = ''
15
- export let clientstylingurl:string = '';
16
-
17
- export let favorites:string = '';
18
- export let gamethumbnail:string = '';
19
- export let gamename:string = '';
20
- export let gamevendor:string = '';
21
- export let gameid:string = '';
22
- export let gameisnew:string = '';
23
- export let gamepopularity:string = '';
24
- export let gamefunmode:boolean = false;
25
- export let searchitem:boolean = false;
26
- export let gamefavorite:boolean = false;
27
- export let gamecellsize = '';
28
- export let showfavoredcategory:boolean = false;
29
- export let showgamename:boolean = false;
30
- export let currency:string = '';
31
- export let gamepagemodalurl:string = 'false';
32
-
33
- export let endpoint:string = '';
34
-
35
- export let livelobbyendpoint:string = '';
36
- export let connectlive:string = '';
37
- export let visibilityconnect:string = '';
38
-
39
- let isLoggedIn:boolean = false;
40
- let sessionID:string;
41
- let playerID:string;
42
-
43
- let fav:boolean = false;
44
- let hover:Boolean = false;
45
- let loaded:boolean = false
46
- let image:any;
47
- let userAgent:any = window.navigator.userAgent;
48
- let customStylingContainer:HTMLElement;
49
-
50
- let livegamedata:any;
51
- let liveLobbyConnection:EventSource;
52
- let displaytype:string;
53
- let starttime:any;
54
- let timeformat = 'HH:mm';
55
- let isopen:Boolean;
56
- let betlimit:any = {};
57
- let openhours:any;
58
- let seats:any = [];
59
- let currencySymbol:any='EUR';
60
- let min:any;
61
- let max:any;
62
- let totalseats:any;
63
- let currentoccupiedseats:any;
64
- let currentroulettenumbers:any;
65
- let currentdoubleballroulettenumbers:any;
66
- let vendorcategory:any;
67
- let isdouble:any;
68
- let roulleteresults:any;
69
- let roulettecontainerclassname:any;
70
- let colorsourcearray:any;
71
- let istablefull:boolean;
72
- let oldistablefull:boolean;
73
- let extraclassname:string='';
74
- let roulletteref:any;
75
- let dealername:string;
76
- let numberofplayers:number;
77
-
78
-
79
- const BLACKJACK = 'blackjack';
80
- const ROULETTE = 'roulette';
81
- const DOUBLE_ROULETTE = 'doubleballroulette';
82
- const DEFAULT_BLACKJACK_TOTAL_SEATS = 7;
83
- const blackjackcategory = [BLACKJACK];
84
- const roulettecategory = [ROULETTE, DOUBLE_ROULETTE];
85
- const DEFAULT_AMOUNT_SEPARATOR = ',';
86
- const numberofdisplayedresults = 5;
87
- export const MONEY_WHEEL_COLOR_MAP = {
88
- '01': 'Yellow',
89
- '02': 'Blue',
90
- 10: 'Green',
91
- 40: 'Red',
92
- '05': 'Purple',
93
- 20: 'Orange',
94
- X7: 'Gold',
95
- X2: 'Gold',
96
- };
97
- export const ROULETTE_COLOR_MAP = {
98
- 1: 'Red',
99
- 3: 'Red',
100
- 5: 'Red',
101
- 7: 'Red',
102
- 9: 'Red',
103
- 12: 'Red',
104
- 14: 'Red',
105
- 16: 'Red',
106
- 18: 'Red',
107
- 19: 'Red',
108
- 21: 'Red',
109
- 23: 'Red',
110
- 25: 'Red',
111
- 27: 'Red',
112
- 30: 'Red',
113
- 32: 'Red',
114
- 34: 'Red',
115
- 36: 'Red',
116
- 2: 'Black',
117
- 4: 'Black',
118
- 6: 'Black',
119
- 8: 'Black',
120
- 10: 'Black',
121
- 11: 'Black',
122
- 13: 'Black',
123
- 15: 'Black',
124
- 17: 'Black',
125
- 20: 'Black',
126
- 22: 'Black',
127
- 24: 'Black',
128
- 26: 'Black',
129
- 28: 'Black',
130
- 29: 'Black',
131
- 31: 'Black',
132
- 33: 'Black',
133
- 35: 'Black',
134
- 0: 'Green',
135
- '00': 'Green',
136
- };
137
-
138
- Object.keys(GameThumbnailTranslations).forEach((item:any):void => {
139
- addNewMessages(item, GameThumbnailTranslations[item]);
140
- });
141
-
142
- const enter = () => {
143
- hover = true;
144
- }
145
- const leave = () => {
146
- hover = false;
147
- }
148
-
149
- const messageHandler = (e:any):void => {
150
- if (e.data.type === `AddFavoriteThumbnail_${gameid}` && !showfavoredcategory) {
151
- gamefavorite = true;
152
- }
153
-
154
- if (e.data.type === `RemoveFavoriteThumbnail_${gameid}` && !showfavoredcategory) {
155
- gamefavorite = false;
156
- }
157
-
158
- if (e.data.type === 'UserSessionID') {
159
- isLoggedIn = true;
160
- sessionID = e.data.session;
161
- playerID = e.data.userID;
162
- }
163
-
164
- if(e.data.type === 'CategoryUpdate') {
165
- livegamedata = null;
166
- }
167
- }
168
-
169
- const toggleGameFrame = (gameId:any):void => {
170
- if (searchitem) {
171
- window.postMessage({ type: 'SearchedItemClicked', gameId }, window.location.href);
172
- }
173
- if (!isMobile(userAgent)) {
174
- window.postMessage({ type: 'OpenGameFrame', gameId, gamefunmode, gamepagemodalurl, isMobile: isMobile(userAgent) }, window.location.href)
175
- } else {
176
- window.postMessage({ type: 'ShowGameModal', gameId, isMobile: isMobile(userAgent) }, window.location.href);
177
- }
178
- };
179
-
180
-
181
- const toggleFavoriteGame = (id:any):void => {
182
- let triggerFactor = "thumbnail";
183
-
184
- if (gamefavorite) {
185
- window.postMessage({ type: 'SetUnfavoredGame', id, triggerFactor }, window.location.href);
186
- } else {
187
- window.postMessage({ type: 'SetFavoredGame', id, triggerFactor }, window.location.href);
188
- }
189
- }
190
-
191
- const gameTouch = ():void => {
192
- window.postMessage({ type: 'GameHovered' }, window.location.href);
193
- }
194
-
195
- const gameTouchEnd = ():void => {
196
- window.postMessage({ type: 'GameBlur' }, window.location.href);
197
- }
198
-
199
- const gameHover = ():void => {
200
- window.postMessage({ type: 'GameHovered' }, window.location.href);
201
- }
202
-
203
- const gameBlur = ():void => {
204
- window.postMessage({ type: 'GameBlur' }, window.location.href);
205
- }
206
-
207
- const setActiveLanguage = ():void => {
208
- // Not needed yet
209
- // setLocale(lang);
210
- }
211
-
212
- const setSession = ():void => {
213
- isLoggedIn = true;
214
- sessionID = session;
215
- playerID = userid;
216
- }
217
-
218
- const setOnLoad = ():void => {
219
- if (image) {
220
- image.onload = () => {
221
- loaded = true;
222
- }
223
- }
224
- }
225
-
226
- const getLiveLobbyURL = (vendorName, id) => {
227
- return `${endpoint}/encoder/lobby/updates/${vendorName}/${id}`;
228
- }
229
- const connectGameToLiveLobby = () => {
230
- if (livelobbyendpoint && EventSource && !liveLobbyConnection) {
231
- if (gamevendor && gameid) {
232
- liveLobbyConnection = new EventSource(getLiveLobbyURL(gamevendor, gameid)),
233
- liveLobbyConnection.addEventListener('message', liveLobbyMessageHandler);
234
- }
235
- }
236
- }
237
- const disconnectGameFromLiveLobby = () => {
238
- if (liveLobbyConnection) {
239
- liveLobbyConnection.close();
240
- liveLobbyConnection = undefined;
241
- }
242
- }
243
-
244
- const setClientStyling = ():void => {
245
- let sheet = document.createElement('style');
246
-
247
- sheet.innerHTML = clientstyling;
248
-
249
- setTimeout(() => { customStylingContainer.appendChild(sheet);});
250
- }
251
-
252
- const setFavorites = ():void => {
253
- if (favorites == 'true') {
254
- fav = true;
255
- }
256
- }
257
-
258
- const setClientStylingURL = ():void => {
259
- let url:URL = new URL(clientstylingurl);
260
-
261
- let cssFile:HTMLElement = document.createElement('style');
262
-
263
- fetch(url.href)
264
- .then((res:any) => res.text())
265
- .then((data:any) => {
266
- cssFile.innerHTML = data
267
-
268
- setTimeout(() => { customStylingContainer.appendChild(cssFile); });
269
- });
270
- }
271
-
272
- const liveLobbyMessageHandler = async (event) => {
273
- const { type, data: rawData } = event;
274
- let data;
275
- switch (type) {
276
- case 'message': {
277
- if (rawData) {
278
- try {
279
- data = JSON.parse(rawData);
280
- } catch (err) {
281
- // eslint-disable-next-line no-console
282
- console.error('MESSAGE PARSING ERROR: ', err);
283
- }
284
- }
285
- if (data) {
286
- const {
287
- InternalTableId,
288
- MessageType,
289
- // TakenSeats,
290
- Results,
291
- // Roads, // for baccarat
292
- Seats,
293
- Open,
294
- } = data;
295
- if (InternalTableId) {
296
- switch (MessageType) {
297
- case 'SeatsUpdated': {
298
- if (Seats && Array.isArray(Seats)) {
299
- currentoccupiedseats = Seats;
300
- livegamedata.currentOccupiedSeats = Seats;
301
- await tick();
302
- }
303
- break;
304
- }
305
- case 'RouletteResultsUpdated': {
306
- if (Results && Array.isArray(Results)) {
307
- currentroulettenumbers = Results;
308
- livegamedata.currentRouletteNumbers = Results;
309
- await tick();
310
- }
311
- break;
312
- }
313
- case 'DoubleBallRouletteResultsUpdated': {
314
- if (Results && Array.isArray(Results)) {
315
- currentdoubleballroulettenumbers = Results;
316
- livegamedata.currentDoubleBallRouletteNumbers = Results;
317
- await tick();
318
- }
319
- break;
320
- }
321
- case 'TableOpened': {
322
- isopen = Open;
323
- livegamedata.isOpen = Open;
324
- await tick();
325
- break;
326
- }
327
- case 'TableClosed': {
328
- isopen = Open;
329
- livegamedata.isOpen = Open;
330
- await tick();
331
- break;
332
- }
333
- default: {
334
- // default case
335
- }
336
- }
337
- }
338
- }
339
- }
340
- default: {
341
- // default case
342
- }
343
- }
344
- }
345
-
346
- const setLiveLobbyData = () => {
347
- let url:any = new URL(`${livelobbyendpoint.split('?')[0]}`);
348
- url.searchParams.append("platform", getDevice(userAgent));
349
- url.searchParams.append('language', lang);
350
- fetch(url)
351
- .then((res:any) => res.json())
352
- .then((data:any) => {
353
- const { details } = data[0];
354
- livegamedata = details;
355
- });
356
- }
357
- const numberWithSeparators = (value, sep = DEFAULT_AMOUNT_SEPARATOR) => {
358
- if (value !== undefined && value !== null) {
359
- return `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, sep);
360
- }
361
- return '';
362
- }
363
- const contains = (array, value) => {
364
- return array.some(item => item === value);
365
- }
366
- const getGameComponent = (livegamedata) => {
367
- let GameComponent = null;
368
- if (livegamedata) {
369
- const { vendorCategory } = livegamedata;
370
- if (vendorCategory) {
371
- const gameTypeToLower = vendorCategory.toLowerCase();
372
- if (contains(blackjackcategory, gameTypeToLower)) {
373
- GameComponent = BLACKJACK;
374
- } else if (contains(roulettecategory, gameTypeToLower)) {
375
- GameComponent = ROULETTE;
376
- }
377
- // else if (contains(baccaratCategory, gameTypeToLower)) {
378
- // GameComponent = 'baccarat';
379
- // } else if (contains(otherLiveGamesCategory, gameTypeToLower)) {
380
- // GameComponent = 'poker';
381
- // }
382
- }
383
- }
384
- return GameComponent;
385
- };
386
- const renderBetLimits = (min, max, currencySymbol) => {
387
- let rightSideContent;
388
- let leftSideContent;
389
- if (min !== undefined && min !== null && max !== undefined && max !== null) {
390
- leftSideContent = `
391
- <span>
392
- ${currencySymbol}
393
- </span>
394
- ${
395
- numberWithSeparators(min)
396
- }-${
397
- numberWithSeparators(max)
398
- }`;
399
- }
400
- if (numberofplayers) {
401
- rightSideContent = `
402
- <svg fill="white" width="13" height="13" viewBox="0 0 13 14" xmlns="http://www.w3.org/2000/svg"><path d="M4 8.2a4.6 4.6 0 0 0 5 0c2.7.8 4 2.6 4 4.8H0c0-2.2 1.3-4 4-4.8zM6.6 8c2 0 3.8-1.7 3.8-4 0-2.1-1.7-4-3.8-4a3.9 3.9 0 0 0-3.8 4c0 2.2 1.7 4 3.8 4z"/></svg>
403
- <span class="NrOfPlayers">${numberofplayers}</span>`;
404
- }
405
- if (!rightSideContent && !leftSideContent) {
406
- return '';
407
- }
408
- return `
409
- <p class="LiveLimits">
410
- <span class="BetLimitLeft">
411
- ${leftSideContent || ''}
412
- </span>
413
- <span class="BetLimitRight">
414
- ${rightSideContent || ''}
415
- </span>
416
- </p>`;
417
- }
418
- const renderDealerName = (dealername) => {
419
- if (!dealername) {
420
- return '';
421
- }
422
- return `
423
- <p class="LiveLimits">
424
- <span class="DealerName">${$_('gameThumbnail.dealer')}: ${dealername}</span>
425
- </p>
426
- `;
427
- }
428
- const createDisplayData = (livegamedata) => {
429
- totalseats = livegamedata.totalSeats || DEFAULT_BLACKJACK_TOTAL_SEATS;
430
- currentoccupiedseats = livegamedata.currentOccupiedSeats || [];
431
- const seats = [];
432
- for (let i = 1; i <= totalseats; i++) {
433
- seats.push(i);
434
- }
435
- return { seats };
436
- }
437
- const renderSpan = (selectedClass, key, value, colorClass = '') => {
438
- const rouletteItemClassname = `${selectedClass} ${colorClass}`;
439
- const firstMatch = key.toString().match(/first0|second0|0/g);
440
- if (key === 0 || (firstMatch && firstMatch.length !== 0)) {
441
- return `
442
- <span
443
- id=${key}
444
- class="${rouletteItemClassname}"
445
- >
446
- ${value}
447
- </span>
448
- `;
449
- }
450
- return `
451
- <span id=${key} class="${rouletteItemClassname}">
452
- ${value}
453
- </span>
454
- `;
455
- }
456
-
457
- const attachAnimations = () => {
458
- const animatedClassName = 'FirstElementAnimated';
459
- const firstElem = roulletteref.getElementsByClassName('First')[0];
460
- if (firstElem) {
461
- firstElem.classList.add(animatedClassName);
462
- setTimeout(() => {
463
- firstElem.classList.remove(animatedClassName);
464
- }, 2000);
465
- }
466
- }
467
- const updateComponent = () => {
468
- if (livegamedata) {
469
- isopen = livegamedata.isOpen;
470
- betlimit = livegamedata.betLimit || {};
471
- openhours = livegamedata.openHours;
472
- seats = createDisplayData(livegamedata).seats;
473
- if (openhours && openhours.value) {
474
- const { value: { startTime: starttimeRaw /* , timeFormat: timeFormatRaw */, originalTimeFormat } } = openhours;
475
- starttime = starttimeRaw;
476
- timeformat = originalTimeFormat || timeformat;
477
- }
478
- if (isopen) {
479
- displaytype = getGameComponent(livegamedata);
480
- }
481
- currencySymbol = currenciesSymbols[currency];
482
- min = (betlimit.min || {})[currency];
483
- max = (betlimit.max || {})[currency];
484
- currentroulettenumbers = livegamedata.currentRouletteNumbers;
485
- currentdoubleballroulettenumbers = livegamedata.currentDoubleBallRouletteNumbers;
486
- vendorcategory = livegamedata.vendorCategory;
487
- isdouble = vendorcategory.toLowerCase() === DOUBLE_ROULETTE;
488
- roulleteresults = (isdouble ? currentdoubleballroulettenumbers : currentroulettenumbers) || [];
489
- roulettecontainerclassname = 'GameProp LiveProps RoulleteProps';
490
- roulettecontainerclassname += isdouble ? ' Double' : '';
491
- colorsourcearray = contains(roulettecategory, vendorcategory.toLowerCase()) ? ROULETTE_COLOR_MAP : MONEY_WHEEL_COLOR_MAP;
492
- oldistablefull = istablefull;
493
- istablefull = Array.isArray(currentoccupiedseats) && currentoccupiedseats.length === totalseats;
494
- if (livegamedata.dealer) {
495
- dealername = livegamedata.dealer.DealerName;
496
- }
497
- numberofplayers = livegamedata.numberOfPlayers;
498
- extraclassname = 'ListGame';
499
- if(livegamedata.isOpen && livegamedata.currentRouletteNumbers) {
500
- extraclassname += ' GameBackdrop';
501
- }
502
- if (isopen && istablefull && min && max && livegamedata.currentOccupiedSeats) {
503
- extraclassname += ' GameContainerDimmed';
504
- } else {
505
- if (isopen === false && starttime) {
506
- extraclassname += ' GameContainerFullyDimmed';
507
- }
508
- }
509
- if (customStylingContainer) {
510
- if (!oldistablefull && istablefull) {
511
- extraclassname += ' PulsatingRedShadow';
512
- extraclassname = extraclassname.replace(' PulsatingGreenShadow', '');
513
- } else if (oldistablefull && !istablefull) {
514
- extraclassname += ' PulsatingGreenShadow';
515
- extraclassname = extraclassname.replace(' PulsatingRedShadow', '');
516
- }
517
- }
518
- }
519
- }
520
- const toggleConnect = ():void => {
521
- if (connectlive === 'disconnect') {
522
- disconnectGameFromLiveLobby();
523
- } else if (connectlive === 'connect') {
524
- connectGameToLiveLobby();
525
- }
526
- }
527
- const toggleVisibilityConnect = ():void => {
528
- if (visibilityconnect === 'disconnect') {
529
- disconnectGameFromLiveLobby();
530
- } else if (visibilityconnect === 'connect' && connectlive === 'connect') {
531
- connectGameToLiveLobby();
532
- }
533
- }
534
-
535
- onMount(() => {
536
- window.addEventListener('message', messageHandler, false);
537
-
538
- return () => {
539
- window.removeEventListener('message', messageHandler);
540
- if (liveLobbyConnection) {
541
- liveLobbyConnection.removeEventListener('message', liveLobbyMessageHandler);
542
- }
543
- }
544
- });
545
-
546
- $: connectlive && toggleConnect();
547
- $: visibilityconnect && toggleVisibilityConnect();
548
- $: lang && setActiveLanguage();
549
- $: session && userid && endpoint && setSession();
550
- $: gamethumbnail && setOnLoad();
551
- $: clientstyling && setClientStyling();
552
- $: favorites && setFavorites();
553
- $: gamecellsize && clientstylingurl && setClientStylingURL();
554
- $: endpoint && livelobbyendpoint && setLiveLobbyData();
555
- $: livegamedata && updateComponent();
556
- $: roulletteref && roulleteresults && attachAnimations();
557
- </script>
558
-
559
- <div class={`GameContainer ${extraclassname}`} part={`GameContainer ${extraclassname}`} bind:this={customStylingContainer}>
560
- <div class="GameInnerContainer { (livegamedata && !isopen && openhours.value) || (livegamedata && istablefull) ? 'GameInnerContainerUnavailable' : ''}" part="GameInnerContainer { (livegamedata && !isopen) || (livegamedata && istablefull) ? 'GameInnerContainerUnavailable' : ''}" on:mouseenter={gameHover} on:mouseleave={gameBlur} on:touchstart={gameTouch} on:touchend={gameTouchEnd}>
561
- <img src={gamethumbnail} class={`GameBg GameBg-${gamecellsize} ${hover ? 'GameContainerHovered' : ''} ${loaded ? 'Loaded' : ''}`} part="GameBg {hover ? 'GameContainerHovered' : ''} {loaded ? 'Loaded' : ''}" alt="" bind:this={image} loading="lazy" />
562
- <div class="GameInfoWrapper" part="GameInfoWrapper">
563
- <div class="GameInfo {hover ? 'GameHovered' : ''}" part="GameInfo {hover ? 'GameHovered' : ''}">
564
- {#if fav}
565
- {#if !isMobile(userAgent) && !gamefavorite && isLoggedIn}
566
- <div class="FavIconContainer" part="FavIconContainer" on:click="{() => toggleFavoriteGame(gameid)}">
567
- <svg version="1.1" class="UnfavoredIcon" part="UnfavoredIcon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="20px" y="20px"
568
- viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path style="fill: white" d="M511.266,197.256c-1.764-5.431-6.458-9.388-12.108-10.209l-158.722-23.065L269.452,20.155
569
- c-2.527-5.12-7.741-8.361-13.451-8.361c-5.709,0-10.924,3.242-13.451,8.361l-70.988,143.828L12.843,187.047
570
- c-5.65,0.821-10.344,4.779-12.108,10.209c-1.765,5.43-0.293,11.391,3.795,15.376l114.848,111.955L92.27,482.67
571
- c-0.965,5.627,1.349,11.315,5.968,14.67c4.618,3.355,10.74,3.798,15.797,1.142L256,423.846l141.961,74.637
572
- c2.195,1.154,4.591,1.723,6.979,1.723c3.11,0,6.206-0.966,8.818-2.865c4.619-3.356,6.933-9.043,5.968-14.671L392.61,324.587
573
- l114.86-111.954C511.559,208.647,513.031,202.686,511.266,197.256z M366.023,308.608c-3.536,3.446-5.15,8.412-4.314,13.278
574
- l23.311,135.898l-122.038-64.162c-4.37-2.297-9.591-2.297-13.961,0l-122.045,64.163l23.304-135.9
575
- c0.834-4.866-0.779-9.83-4.313-13.276l-98.731-96.244l136.445-19.829c4.886-0.71,9.108-3.778,11.294-8.205L256,60.685
576
- l61.023,123.645c2.186,4.427,6.408,7.496,11.294,8.206l136.447,19.828L366.023,308.608z"/></svg>
577
- </div>
578
- {/if}
579
- {/if}
580
- <p class="GameInfoName" part="GameInfoName" title="{gamename}">{gamename}</p>
581
- <button class="GameInfoBtn" part="GameInfoBtn" on:click="{() => toggleGameFrame(gameid)}">{$_('gameThumbnail.playNow')}</button>
582
- </div>
583
- <span class="GameInfoVendor" part="GameInfoVendor">
584
- { gamevendor ? gamevendor : '-'}
585
- </span>
586
- </div>
587
- {#if !isMobile(userAgent) && gamefavorite && isLoggedIn && favorites}
588
- <div class="FavIconContainer" part="FavIconContainer" on:click="{() => toggleFavoriteGame(gameid)}">
589
- <svg version="1.1" class="FavoredIcon" part="FavoredIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.481 19.481" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 19.481 19.481">
590
- <path style="fill: white" d="m10.201,.758l2.478,5.865 6.344,.545c0.44,0.038 0.619,0.587 0.285,0.876l-4.812,4.169 1.442,6.202c0.1,0.431-0.367,0.77-0.745,0.541l-5.452-3.288-5.452,3.288c-0.379,0.228-0.845-0.111-0.745-0.541l1.442-6.202-4.813-4.17c-0.334-0.289-0.156-0.838 0.285-0.876l6.344-.545 2.478-5.864c0.172-0.408 0.749-0.408 0.921,0z"/>
591
- </svg>
592
- </div>
593
- {:else if isMobile(userAgent) && gamefavorite && isLoggedIn && favorites}
594
- <div class="FavIconContainer" part="FavIconContainer">
595
- <svg version="1.1" class="FavoredIcon" part="FavoredIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.481 19.481" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 19.481 19.481">
596
- <path style="fill: white" d="m10.201,.758l2.478,5.865 6.344,.545c0.44,0.038 0.619,0.587 0.285,0.876l-4.812,4.169 1.442,6.202c0.1,0.431-0.367,0.77-0.745,0.541l-5.452-3.288-5.452,3.288c-0.379,0.228-0.845-0.111-0.745-0.541l1.442-6.202-4.813-4.17c-0.334-0.289-0.156-0.838 0.285-0.876l6.344-.545 2.478-5.864c0.172-0.408 0.749-0.408 0.921,0z"/>
597
- </svg>
598
- </div>
599
- {/if}
600
- <div class="GameExtraInfo" part="GameExtraInfo">
601
- {#if gameisnew}
602
- <span class="GameExtraInfoLabel NewGameTag" part="GameExtraInfoLabel NewGameTag">{$_('gameThumbnail.new')}</span>
603
- {/if}
604
- {#if (parseInt(gamepopularity) > 0)}
605
- <span class="GameExtraInfoLabel PopularGameTag" part="GameExtraInfoLabel PopularGameTag">{$_('gameThumbnail.hot')}</span>
606
- {/if}
607
- {#if livegamedata}
608
- {#if !isopen && starttime && timeformat}
609
- <div class="GameProp LiveProps" part="GameProp LiveProps">
610
- <div class="ClosedGame" part="ClosedGame">
611
- {$_('gameThumbnail.opens')}
612
- <span>
613
- {moment.utc(starttime).local().format(timeformat)}
614
- </span>
615
- </div>
616
- {@html renderDealerName(dealername)}
617
- {@html renderBetLimits(min, max, currencySymbol)}
618
- </div>
619
- {/if}
620
- {#if isopen && displaytype && displaytype === BLACKJACK}
621
- <div class="GameProp LiveProps BlackjackDisplay" part="GameProp LiveProps BlackjackDisplay">
622
- <div class="LiveIcons" part="LiveIcons">
623
- {#if istablefull}
624
- <span class="FullTable" part="FullTable">
625
- {$_('gameThumbnail.full')}
626
- </span>
627
- {:else}
628
- {#each seats as seatData}
629
- <span class={contains(currentoccupiedseats, seatData.toString()) ? 'ClosedSeat' : 'OpenSeat'} part={contains(currentoccupiedseats, seatData.toString()) ? 'ClosedSeat' : 'OpenSeat'}>
630
- <svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14">
631
- <path d="M11.58 6c-1.17 0-2.13.95-2.13 2.12v.4a8.82 8.82 0 00-2.92-.4c-1.54 0-2.45.22-2.92.4v-.4A2.136 2.136 0 001.48 6a1.33 1.33 0 00-.5 2.55c.14.07.24.21.24.37l.26 1.06c0 .96.73 1.75 1.65 1.85a.65.65 0 00.28 1.23.65.65 0 00.3-1.22h5.64a.65.65 0 00.3 1.22.65.65 0 00.28-1.23c.93-.1 1.65-.9 1.65-1.85l.27-1.06c0-.16.1-.3.24-.37A1.33 1.33 0 0011.58 6z"/>
632
- <path d="M4.34 7.5c.55-.1 1.27-.17 2.2-.17.91 0 1.63.07 2.18.17.21-.96.9-1.74 1.8-2.1V4a3.99 3.99 0 00-7.97 0v1.4c.9.36 1.58 1.14 1.79 2.1z"/>
633
- </svg>
634
- </span>
635
- {/each}
636
- {/if}
637
- </div>
638
- {@html renderDealerName(dealername)}
639
- {@html renderBetLimits(min, max, currencySymbol)}
640
- </div>
641
- {:else if isopen && displaytype && displaytype === ROULETTE}
642
- <div class="{roulettecontainerclassname}" part="{roulettecontainerclassname}">
643
- <div class="LiveIcons" part="LiveIcons" bind:this={roulletteref}>
644
- {#each new Array(numberofdisplayedresults) as garbage, i}
645
- {#if roulleteresults && roulleteresults[i]}
646
- {#if isdouble}
647
- <div class="Double" part="Double">
648
- {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, `first${i}${roulleteresults[i][0]}`, roulleteresults[i][0], colorsourcearray[roulleteresults[i][0]])}
649
- {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, `second${i}${roulleteresults[i][1]}`, roulleteresults[i][1], colorsourcearray[roulleteresults[i][1]])}
650
- </div>
651
- {:else}
652
- {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, i, roulleteresults[i], colorsourcearray[roulleteresults[i]])}
653
- {/if}
654
- {/if}
655
- {/each}
656
- </div>
657
- {@html renderDealerName(dealername)}
658
- {@html renderBetLimits(min, max, currencySymbol)}
659
- </div>
660
- {/if}
661
- {/if}
662
- </div>
663
- </div>
664
- {#if showgamename}
665
- <p class="GameNameBelow" part="GameNameBelow" title="{gamename}">{gamename}</p>
666
- {/if}
667
- </div>
668
-
669
-
670
- <style lang="scss">
671
-
672
- :host {
673
- font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
674
- }
675
-
676
- *, *::before, *::after {
677
- margin: 0;
678
- padding: 0;
679
- box-sizing: border-box;
680
- }
681
-
682
- .GameContainer {
683
- width: 100%;
684
- height: 100%;
685
- position: relative;
686
- }
687
-
688
- .GameInnerContainer {
689
- position: relative;
690
- width: 100%;
691
- height: 100%;
692
- overflow: hidden;
693
- border-radius: 5px;
694
- .GameBg {
695
- width: 100%;
696
- height: 100%;
697
- object-fit: unset;
698
- transition: all 150ms ease-in-out;
699
- &.GameBg-1x2,
700
- &.GameBg-2x1,
701
- &.GameBg-2x2 { object-fit: cover; }
702
- }
703
-
704
- .GameInfoWrapper {
705
- display: none;
706
- position: absolute;
707
- width: 100%;
708
- height: 100%;
709
- top: 0;
710
- right: 0;
711
- bottom: 0;
712
- left: 0;
713
- background: rgba(0, 0, 0, .65);
714
- z-index: 15;
715
-
716
- .GameInfo {
717
- display: flex;
718
- width: 100%;
719
- height: 100%;
720
- flex-direction: column;
721
- align-items: center;
722
- justify-content: center;
723
-
724
- &Name {
725
- color: white;
726
- margin-bottom: 10px;
727
- text-align: center;
728
- font-size: 14px;
729
- }
730
-
731
- &Btn {
732
- appearance: none;
733
- padding: 6px;
734
- background: var(--emfe-w-color-primary, #D0046C);
735
- color: var(--emfe-w-color-primary-50, #FBECF4);
736
- font-size: 16px;
737
- border: 2px solid var(--emfe-w-color-primary-600, #99034F);
738
- border-radius: 5px;
739
- cursor: pointer;
740
- transition: border 150ms ease-in-out;
741
-
742
- &:hover {
743
- border: 2px solid var(--emfe-w-color-primary-100, #F1BED9);
744
- }
745
- }
746
- }
747
-
748
- .GameInfoVendor {
749
- display: block;
750
- position: absolute;
751
- bottom: 8px;
752
- right: 8px;
753
- color: white;
754
- font-size: 12px;
755
- font-weight: normal;
756
- }
757
- }
758
-
759
- &:hover {
760
- cursor: pointer;
761
-
762
- .GameInfoWrapper{
763
- display: block;
764
- }
765
-
766
- .GameBg {
767
- filter: blur(5px) grayscale(1);
768
- }
769
- }
770
-
771
- .GameExtraInfo {
772
- display: block;
773
- position: absolute;
774
- width: 100%;
775
- height: 100%;
776
- top: 8px;
777
- left: 8px;
778
- z-index: 0;
779
- &Label {
780
- font-size: 11px;
781
- padding: 3px;
782
- background-color: var(--emfe-w-color-primary, #D0046C);
783
- color: var(--emfe-w-color-primary-50, #FBECF4);
784
- font-weight: bold;
785
- text-transform: uppercase;
786
- border-radius: 5px;
787
- }
788
- }
789
- }
790
-
791
- .GameNameBelow {
792
- color: var(--emfe-w-color-white, #FFFFFF);
793
- position: relative;
794
- bottom: -5px;
795
- text-align: center;
796
- white-space: nowrap;
797
- overflow: hidden;
798
- text-overflow: ellipsis;
799
- }
800
- .FavoredIcon, .UnfavoredIcon {
801
- width: 20px;
802
- height: 20px;
803
- }
804
- .FavIconContainer {
805
- position: absolute;
806
- top: 10px;
807
- right: 10px;
808
- cursor: pointer;
809
- z-index: 15;
810
- }
811
-
812
- // LIVE LOBBY DATA STYLING
813
- .GamesWrapper .ListGame:hover .GamePlayNowText {
814
- @media (min-width: 1100px) {
815
- z-index: 4;
816
- }
817
- }
818
- // dim the game that doesn't have open seats or table is full
819
- .ListGame:hover, .ListGame:active {
820
- .OpenSeat, .ClosedSeat, .LiveLimits, .LatestResult, .FullTable {
821
- opacity: .2;
822
- }
823
- }
824
- // fix for displaying live game thumbnails that don't have details without backdrop
825
- .ListGame.GameBackdrop {
826
- .GameInnerContainer {
827
- &::after {
828
- content: '';
829
- position: absolute;
830
- top: 0;
831
- right: 0;
832
- bottom: 0;
833
- left: 0;
834
- background: linear-gradient(0deg, rgba(0,0,0,1) 15%, rgba(0,0,0,0) 100%);
835
- }
836
- }
837
- }
838
-
839
- .ListGame .GameInnerContainer {
840
- z-index: 0;
841
-
842
- .GameBg {
843
- z-index: 5;
844
- }
845
-
846
- .GameExtraInfo {
847
- z-index: 10;
848
- }
849
- &::after {
850
- content: '';
851
- position: absolute;
852
- top: 0;
853
- right: 0;
854
- bottom: 0;
855
- left: 0;
856
- }
857
-
858
- &.GameInnerContainerUnavailable {
859
- &::after {
860
- content: '';
861
- position: absolute;
862
- top: 0;
863
- right: 0;
864
- bottom: 0;
865
- left: 0;
866
- background: rgba(0,0,0,0.9);
867
- }
868
- }
869
-
870
- .ListGame.GameContainerDimmed:before {
871
- display: block;
872
- content: ' ';
873
- width: 100%;
874
- height: 100%;
875
- position: absolute;
876
- top: 0;
877
- right: 0;
878
- bottom: 0;
879
- left: 0;
880
- z-index: 5;
881
- background: rgba(0,0,0, .4);
882
- color: var(--emfe-w-color-white, #FFFFFF);
883
- fill: var(--emfe-w-color-white, #FFFFFF);
884
- opacity: 1;
885
- border-radius: 4px;
886
- }
887
-
888
- .ListGame.GameContainerFullyDimmed:before {
889
- display: block;
890
- content: ' ';
891
- width: 100%;
892
- height: 100%;
893
- position: absolute;
894
- top: 0;
895
- right: 0;
896
- bottom: 0;
897
- left: 0;
898
- z-index: 5;
899
- background: rgba(0,0,0, .8);
900
- color: var(--emfe-w-color-white, #FFFFFF);
901
- fill: var(--emfe-w-color-white, #FFFFFF);
902
- opacity: 1;
903
- border-radius: 4px;
904
- }
905
-
906
- .LiveProps {
907
- display: flex;
908
- flex-direction: column;
909
- position: absolute;
910
- bottom: 8px;
911
- left: -8px;
912
- right: 0;
913
- width: 100%;
914
- padding: 0;
915
- background: linear-gradient(to top, rgba(0,0,0,.1) 0%, rgba(0,0,0,.2) 60%, rgba(0,0,0,.3) 80%, rgba(0,0,0,.99) 100%);
916
- color: var(--emfe-w-color-white, #FFFFFF);
917
- opacity: 1;
918
- font-size: 14px;
919
- }
920
-
921
- .ListGame:hover .LiveProps,
922
- .ListGameLink:hover .LiveProps {
923
- opacity: 0;
924
- }
925
- //--------------------------------------LIVE LOBBY ANIMATIONS------------------------------------------
926
- // Pulsating animations
927
- @keyframes red-pulse {
928
- 0% {
929
- box-shadow: 0 0 2px 0 rgba(red, 0.75);
930
- }
931
-
932
- 15% {
933
- box-shadow: 0 0 10px 2px rgba(red, 0.75);
934
- }
935
-
936
- 30% {
937
- box-shadow: 0 0 2px 0 rgba(red, 0.75);
938
- }
939
-
940
- 50% {
941
- box-shadow: 0 0 10px 2px rgba(red, 0.75);
942
- }
943
-
944
- 65% {
945
- box-shadow: 0 0 2px 0 rgba(red, 0.75);
946
- }
947
-
948
- 80% {
949
- box-shadow: 0 0 10px 2px rgba(red, 0.75);
950
- }
951
-
952
- 100% {
953
- box-shadow: 0 0 0 0 rgba(red, 0.75);
954
- }
955
- }
956
-
957
- @keyframes green-pulse {
958
- 0% {
959
- box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
960
- }
961
-
962
- 15% {
963
- box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
964
- }
965
-
966
- 30% {
967
- box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
968
- }
969
-
970
- 50% {
971
- box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
972
- }
973
-
974
- 65% {
975
- box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
976
- }
977
-
978
- 80% {
979
- box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
980
- }
981
-
982
- 100% {
983
- box-shadow: 0 0 0 0 rgba(#56A80A, 0.75);
984
- }
985
- }
986
- // Flip animation
987
- @keyframes flip-open {
988
- 0% {
989
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
990
- transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
991
- -webkit-transition-timing-function: ease-in;
992
- transition-timing-function: ease-in;
993
- opacity: 0;
994
- }
995
- 40% {
996
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
997
- transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
998
- -webkit-transition-timing-function: ease-in;
999
- transition-timing-function: ease-in;
1000
- }
1001
- 60% {
1002
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1003
- transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1004
- opacity: 1;
1005
- }
1006
- 80% {
1007
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1008
- transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1009
- }
1010
- 100% {
1011
- -webkit-transform: perspective(400px);
1012
- transform: perspective(400px);
1013
- }
1014
- }
1015
-
1016
- .silde-in-from-left {
1017
- -webkit-animation-name: silde-in-from-left;
1018
- animation-name: silde-in-from-left;
1019
- -webkit-animation-duration: 1s;
1020
- animation-duration: 1s;
1021
- -webkit-animation-fill-mode: both;
1022
- animation-fill-mode: both;
1023
- }
1024
- @-webkit-keyframes silde-in-from-left {
1025
- 0% {
1026
- -webkit-transform: translateX(-100%);
1027
- transform: translateX(-100%);
1028
- visibility: visible;
1029
- }
1030
- 100% {
1031
- -webkit-transform: translateX(0);
1032
- transform: translateX(0);
1033
- }
1034
- }
1035
- @keyframes silde-in-from-left {
1036
- 0% {
1037
- -webkit-transform: translateX(-100%);
1038
- transform: translateX(-100%);
1039
- visibility: visible;
1040
- }
1041
- 100% {
1042
- -webkit-transform: translateX(0);
1043
- transform: translateX(0);
1044
- }
1045
- }
1046
-
1047
- @keyframes flip-closed-seat {
1048
- 0% {
1049
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1050
- transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1051
- -webkit-transition-timing-function: ease-in;
1052
- transition-timing-function: ease-in;
1053
- opacity: 0;
1054
- }
1055
- 40% {
1056
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1057
- transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1058
- -webkit-transition-timing-function: ease-in;
1059
- transition-timing-function: ease-in;
1060
- }
1061
- 60% {
1062
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1063
- transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1064
- opacity: 1;
1065
- }
1066
- 80% {
1067
- -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1068
- transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1069
- }
1070
- 100% {
1071
- -webkit-transform: perspective(400px);
1072
- transform: perspective(400px);
1073
- }
1074
- }
1075
-
1076
- // .Page-LiveCasino .GamesListContainer,
1077
- // .Page-LiveCasino-Child .GamesListContainer,
1078
- // .Page-LiveCasino .OperatorSticky .GamesListContainer,
1079
- // .Page-LiveCasino .CasinoGames .GamesListContainer,
1080
- // .Page-Live-casinoSource .GamesListContainer,
1081
- // .Page-Live-casinoSource .GamesListContainer,
1082
- // .Page-Live-casinoSource .OperatorSticky .GamesListContainer,
1083
- // .Page-Live-casinoSource .CasinoGames .GamesListContainer {
1084
- // overflow: visible;
1085
- // }
1086
-
1087
- .ListGame.PulsatingGreenShadow, .ListGame.PulsatingRedShadow {
1088
- overflow: auto;
1089
- }
1090
-
1091
- .ListGame.PulsatingGreenShadow {
1092
- animation: green-pulse 2s linear;
1093
- }
1094
-
1095
- .ListGame.PulsatingRedShadow {
1096
- animation: red-pulse 2s linear;
1097
- }
1098
-
1099
- .LiveIcons {
1100
- position: relative;
1101
- display: flex;
1102
- padding: 0 16px;
1103
- // flex-wrap: wrap;
1104
- box-sizing: border-box;
1105
- flex-direction: row;
1106
- align-items: center;
1107
- justify-content: flex-start;
1108
- min-height: auto;
1109
- margin-bottom: 5px;
1110
- @media (min-width: 1100px) {
1111
- min-height: auto;
1112
- }
1113
-
1114
- &:first-child {
1115
- margin-left: 0;
1116
- }
1117
-
1118
- &:last-child {
1119
- margin-right: 0;
1120
- }
1121
-
1122
- &.Black, &.Red, &.Green {
1123
- color: var(--emfe-w-color-white, #FFFFFF);
1124
- border: 1px solid var(--emfe-w-color-white, #FFFFFF);
1125
- }
1126
-
1127
- .LatestResult {
1128
- min-width: 12px;
1129
- padding: 2px;
1130
- margin: 0 1px;
1131
- margin-right: 6px;
1132
- font-size: 14px;
1133
- text-align: center;
1134
- @media (min-width: 1100px) {
1135
- min-width: 12px;
1136
- font-size: 14px;
1137
- margin: 0 2px;
1138
- margin-right: 5px;
1139
- padding: 2px;
1140
- }
1141
-
1142
- &.FirstElementAnimated {
1143
- animation: flip-open 2s both;
1144
- -webkit-animation: flip-open 2s both;
1145
- -webkit-backface-visibility: visible;
1146
- backface-visibility: visible;
1147
- }
1148
-
1149
- &.First {
1150
- min-width: 24px;
1151
- &.Black, &.Red, &.Green {
1152
- color: var(--emfe-w-color-white, #FFFFFF);
1153
- border: 1px solid var(--emfe-w-color-white, #FFFFFF);
1154
- }
1155
- &.Black {
1156
- background: var(--emfe-w-color-black, #000000)
1157
- }
1158
- &.Red {
1159
- background: red;
1160
- }
1161
- &.Green {
1162
- background: #56A80A;
1163
- }
1164
- padding: 4px;
1165
- @media (min-width: 1100px) {
1166
- padding: 4px;
1167
- }
1168
- }
1169
- }
1170
-
1171
- .Double {
1172
- display: flex;
1173
- flex-direction: column;
1174
-
1175
- .LatestResult {
1176
- &:first-child {
1177
- margin-bottom: 10px;
1178
- }
1179
- }
1180
-
1181
- &:first-child {
1182
- .LatestResult {
1183
- margin-left: 0;
1184
- margin-bottom: 0;
1185
- }
1186
- }
1187
-
1188
- &:last-child {
1189
- .LatestResult {
1190
- margin-right: 0;
1191
- }
1192
- }
1193
- }
1194
-
1195
- .Black, .Red, .Green {
1196
- background-color: transparent;
1197
- }
1198
-
1199
- .Black {
1200
- color: var(--emfe-w-color-white, #FFFFFF);
1201
- }
1202
-
1203
- .Red {
1204
- color: red;
1205
- }
1206
-
1207
- .Green {
1208
- color: #56A80A;
1209
- }
1210
- }
1211
-
1212
- .Blue {
1213
- color: #4d90a7;
1214
- }
1215
-
1216
- .Red {
1217
- background-color: red;
1218
- }
1219
-
1220
- .Black {
1221
- background-color: var(--emfe-w-color-black, #000000);
1222
- }
1223
-
1224
- .Green {
1225
- background-color: #56A80A;
1226
- }
1227
-
1228
- .White {
1229
- background-color: var(--emfe-w-color-white, #FFFFFF);
1230
- }
1231
-
1232
- .Yellow {
1233
- background-color: #eeca3d;
1234
- }
1235
-
1236
- .Gold {
1237
- background-color: darken(#eeca3d, 30%);
1238
- }
1239
-
1240
- .Orange {
1241
- background-color: darken(#eeca3d, 40%);
1242
- }
1243
-
1244
- .Purple {
1245
- background-color: darken(#f0f, 40%);
1246
- }
1247
-
1248
- .Tie {
1249
- background-color: var(--emfe-w-color-white, #FFFFFF);
1250
- background-image: linear-gradient(135deg, var(--emfe-w-color-white, #FFFFFF) 25%, transparent 25%, transparent 50%, #212121 50%, var(--emfe-w-color-white, #FFFFFF) 75%, transparent 75%, var(--emfe-w-color-white, #FFFFFF));
1251
- }
1252
- .OpenSeat, .ClosedSeat {
1253
- display: inline-block;
1254
- width: 16px;
1255
- height: 16px;
1256
- margin-right: 4px;
1257
- @media (min-width: 768px) {
1258
- width: 16px;
1259
- height: 16px;
1260
- }
1261
- @media (min-width: 1100px) {
1262
- width: 16px;
1263
- height: 16px;
1264
- }
1265
- svg {
1266
- width: 100%;
1267
- height: 100%;
1268
- }
1269
- }
1270
- .OpenSeat {
1271
- animation: flip-closed-seat 2s both;
1272
- -webkit-animation: flip-closed-seat 2s both;
1273
- -webkit-backface-visibility: visible;
1274
- backface-visibility: visible;
1275
- }
1276
- .ClosedSeat {
1277
- animation: flip-open 2s both;
1278
- -webkit-animation: flip-open 2s both;
1279
- -webkit-backface-visibility: visible;
1280
- backface-visibility: visible;
1281
- }
1282
- .OpenSeat svg {
1283
- fill: transparent;
1284
- stroke: var(--emfe-w-color-white, #FFFFFF);
1285
- }
1286
- .ClosedSeat svg {
1287
- fill: var(--emfe-w-color-white, #FFFFFF);
1288
- }
1289
- .FullTable {
1290
- display: flex;
1291
- position: relative;
1292
- z-index: 10;
1293
- height: 20px;
1294
- padding: 1px 4px 1px 0;
1295
- align-items: center;
1296
- border-radius: 3px;
1297
- font-size: 12px;
1298
- white-space: normal;
1299
- text-transform: uppercase;
1300
- -webkit-animation-name: silde-in-from-left;
1301
- animation-name: silde-in-from-left;
1302
- -webkit-animation-duration: 1s;
1303
- animation-duration: 1s;
1304
- -webkit-animation-fill-mode: both;
1305
- animation-fill-mode: both;
1306
- svg {
1307
- width: 100%;
1308
- height: 100%;
1309
- fill: var(--emfe-w-color-white, #FFFFFF);
1310
- }
1311
- &.ClosedSeat {
1312
- margin-right: -3px;
1313
- }
1314
- }
1315
- .PlayersDisplay {
1316
- display: flex;
1317
- flex-direction: row;
1318
- flex-wrap: wrap;
1319
- align-items: center;
1320
- padding: 2px 10px;
1321
- background: linear-gradient(to bottom, rgba(33, 33, 33, .9) 0%, rgba(33, 33, 33, .1) 100%);
1322
- color: var(--emfe-w-color-white, #FFFFFF);
1323
- @media (min-width: 1100px) {
1324
- padding: 2px 16px;
1325
- }
1326
- .PlayersIcon {
1327
- width: 14px;
1328
- height: 14px;
1329
- margin-right: 4px;
1330
- //@media (min-width: 1100px) {
1331
- // width: 1.7rem;
1332
- // height: 1.7rem;
1333
- //}
1334
- svg {
1335
- fill: var(--emfe-w-color-white, #FFFFFF);
1336
- width: 100%;
1337
- height: 100%;
1338
- }
1339
- }
1340
- }
1341
- .ClosedGame {
1342
- opacity: 1;
1343
- z-index: 10;
1344
- padding: 8px 10px;
1345
- color: var(--emfe-w-color-white, #FFFFFF);
1346
- font-size: 18px;
1347
- @media (min-width: 1100px) {
1348
- padding: 8px 16px;
1349
- }
1350
- span {
1351
- font-size: 18px;
1352
- }
1353
- }
1354
- .LiveLimits {
1355
- opacity: 1;
1356
- display: flex;
1357
- flex-direction: row;
1358
- justify-content: space-between;
1359
- padding: 2px 20px 5px 20px;
1360
- background: var(--emfe-w-color-black, #000000);
1361
- color: var(--emfe-w-color-white, #FFFFFF);
1362
- font-weight: normal;
1363
- font-size: 12px;
1364
- @media (min-width: 1100px) {
1365
- padding: 2px 18px 5px 18px;
1366
- }
1367
- span {
1368
- font-size: 12px;
1369
- }
1370
- }
1371
- .Players {
1372
- display: inline-block;
1373
- width: 19px;
1374
- height: 19px;
1375
- }
1376
- }
1377
- </style>
1
+ <svelte:options tag={null} />
2
+
3
+ <script lang="ts">
4
+ import moment from 'moment';
5
+ import { onMount, tick } from "svelte";
6
+ import { isMobile, getDevice } from 'rvhelper';
7
+ import { _, addNewMessages } from './i18n';
8
+ import { GameThumbnailTranslations } from './translations';
9
+ import { currenciesSymbols } from './currency-symbols';
10
+
11
+ export let session:string = '';
12
+ export let userid:string = '';
13
+ export let lang:string = '';
14
+ export let clientstyling:string = ''
15
+ export let clientstylingurl:string = '';
16
+
17
+ export let favorites:string = '';
18
+ export let gamethumbnail:string = '';
19
+ export let gamename:string = '';
20
+ export let gamevendor:string = '';
21
+ export let gameid:string = '';
22
+ export let gameisnew:string = '';
23
+ export let gamepopularity:string = '';
24
+ export let gamefunmode:boolean = false;
25
+ export let searchitem:boolean = false;
26
+ export let gamefavorite:boolean = false;
27
+ export let gamecellsize = '';
28
+ export let showfavoredcategory:boolean = false;
29
+ export let showgamename:boolean = false;
30
+ export let currency:string = '';
31
+ export let gamepagemodalurl:string = 'false';
32
+
33
+ export let endpoint:string = '';
34
+
35
+ export let livelobbyendpoint:string = '';
36
+ export let connectlive:string = '';
37
+ export let visibilityconnect:string = '';
38
+
39
+ let isLoggedIn:boolean = false;
40
+ let sessionID:string;
41
+ let playerID:string;
42
+
43
+ let fav:boolean = false;
44
+ let hover:Boolean = false;
45
+ let loaded:boolean = false
46
+ let image:any;
47
+ let userAgent:any = window.navigator.userAgent;
48
+ let customStylingContainer:HTMLElement;
49
+
50
+ let livegamedata:any;
51
+ let liveLobbyConnection:EventSource;
52
+ let displaytype:string;
53
+ let starttime:any;
54
+ let timeformat = 'HH:mm';
55
+ let isopen:Boolean;
56
+ let betlimit:any = {};
57
+ let openhours:any;
58
+ let seats:any = [];
59
+ let currencySymbol:any='EUR';
60
+ let min:any;
61
+ let max:any;
62
+ let totalseats:any;
63
+ let currentoccupiedseats:any;
64
+ let currentroulettenumbers:any;
65
+ let currentdoubleballroulettenumbers:any;
66
+ let vendorcategory:any;
67
+ let isdouble:any;
68
+ let roulleteresults:any;
69
+ let roulettecontainerclassname:any;
70
+ let colorsourcearray:any;
71
+ let istablefull:boolean;
72
+ let oldistablefull:boolean;
73
+ let extraclassname:string='';
74
+ let roulletteref:any;
75
+ let dealername:string;
76
+ let numberofplayers:number;
77
+
78
+
79
+ const BLACKJACK = 'blackjack';
80
+ const ROULETTE = 'roulette';
81
+ const DOUBLE_ROULETTE = 'doubleballroulette';
82
+ const DEFAULT_BLACKJACK_TOTAL_SEATS = 7;
83
+ const blackjackcategory = [BLACKJACK];
84
+ const roulettecategory = [ROULETTE, DOUBLE_ROULETTE];
85
+ const DEFAULT_AMOUNT_SEPARATOR = ',';
86
+ const numberofdisplayedresults = 5;
87
+ export const MONEY_WHEEL_COLOR_MAP = {
88
+ '01': 'Yellow',
89
+ '02': 'Blue',
90
+ 10: 'Green',
91
+ 40: 'Red',
92
+ '05': 'Purple',
93
+ 20: 'Orange',
94
+ X7: 'Gold',
95
+ X2: 'Gold',
96
+ };
97
+ export const ROULETTE_COLOR_MAP = {
98
+ 1: 'Red',
99
+ 3: 'Red',
100
+ 5: 'Red',
101
+ 7: 'Red',
102
+ 9: 'Red',
103
+ 12: 'Red',
104
+ 14: 'Red',
105
+ 16: 'Red',
106
+ 18: 'Red',
107
+ 19: 'Red',
108
+ 21: 'Red',
109
+ 23: 'Red',
110
+ 25: 'Red',
111
+ 27: 'Red',
112
+ 30: 'Red',
113
+ 32: 'Red',
114
+ 34: 'Red',
115
+ 36: 'Red',
116
+ 2: 'Black',
117
+ 4: 'Black',
118
+ 6: 'Black',
119
+ 8: 'Black',
120
+ 10: 'Black',
121
+ 11: 'Black',
122
+ 13: 'Black',
123
+ 15: 'Black',
124
+ 17: 'Black',
125
+ 20: 'Black',
126
+ 22: 'Black',
127
+ 24: 'Black',
128
+ 26: 'Black',
129
+ 28: 'Black',
130
+ 29: 'Black',
131
+ 31: 'Black',
132
+ 33: 'Black',
133
+ 35: 'Black',
134
+ 0: 'Green',
135
+ '00': 'Green',
136
+ };
137
+
138
+ Object.keys(GameThumbnailTranslations).forEach((item:any):void => {
139
+ addNewMessages(item, GameThumbnailTranslations[item]);
140
+ });
141
+
142
+ const enter = () => {
143
+ hover = true;
144
+ }
145
+ const leave = () => {
146
+ hover = false;
147
+ }
148
+
149
+ const messageHandler = (e:any):void => {
150
+ if (e.data.type === `AddFavoriteThumbnail_${gameid}` && !showfavoredcategory) {
151
+ gamefavorite = true;
152
+ }
153
+
154
+ if (e.data.type === `RemoveFavoriteThumbnail_${gameid}` && !showfavoredcategory) {
155
+ gamefavorite = false;
156
+ }
157
+
158
+ if (e.data.type === 'UserSessionID') {
159
+ isLoggedIn = true;
160
+ sessionID = e.data.session;
161
+ playerID = e.data.userID;
162
+ }
163
+
164
+ if(e.data.type === 'CategoryUpdate') {
165
+ livegamedata = null;
166
+ }
167
+ }
168
+
169
+ const toggleGameFrame = (gameId:any):void => {
170
+ if (searchitem) {
171
+ window.postMessage({ type: 'SearchedItemClicked', gameId }, window.location.href);
172
+ }
173
+ if (!isMobile(userAgent)) {
174
+ window.postMessage({ type: 'OpenGameFrame', gameId, gamefunmode, gamepagemodalurl, isMobile: isMobile(userAgent) }, window.location.href)
175
+ } else {
176
+ window.postMessage({ type: 'ShowGameModal', gameId, isMobile: isMobile(userAgent) }, window.location.href);
177
+ }
178
+ };
179
+
180
+
181
+ const toggleFavoriteGame = (id:any):void => {
182
+ let triggerFactor = "thumbnail";
183
+
184
+ if (gamefavorite) {
185
+ window.postMessage({ type: 'SetUnfavoredGame', id, triggerFactor }, window.location.href);
186
+ } else {
187
+ window.postMessage({ type: 'SetFavoredGame', id, triggerFactor }, window.location.href);
188
+ }
189
+ }
190
+
191
+ const gameTouch = ():void => {
192
+ window.postMessage({ type: 'GameHovered' }, window.location.href);
193
+ }
194
+
195
+ const gameTouchEnd = ():void => {
196
+ window.postMessage({ type: 'GameBlur' }, window.location.href);
197
+ }
198
+
199
+ const gameHover = ():void => {
200
+ window.postMessage({ type: 'GameHovered' }, window.location.href);
201
+ }
202
+
203
+ const gameBlur = ():void => {
204
+ window.postMessage({ type: 'GameBlur' }, window.location.href);
205
+ }
206
+
207
+ const setActiveLanguage = ():void => {
208
+ // Not needed yet
209
+ // setLocale(lang);
210
+ }
211
+
212
+ const setSession = ():void => {
213
+ isLoggedIn = true;
214
+ sessionID = session;
215
+ playerID = userid;
216
+ }
217
+
218
+ const setOnLoad = ():void => {
219
+ if (image) {
220
+ image.onload = () => {
221
+ loaded = true;
222
+ }
223
+ }
224
+ }
225
+
226
+ const getLiveLobbyURL = (vendorName, id) => {
227
+ return `${endpoint}/encoder/lobby/updates/${vendorName}/${id}`;
228
+ }
229
+ const connectGameToLiveLobby = () => {
230
+ if (livelobbyendpoint && EventSource && !liveLobbyConnection) {
231
+ if (gamevendor && gameid) {
232
+ liveLobbyConnection = new EventSource(getLiveLobbyURL(gamevendor, gameid)),
233
+ liveLobbyConnection.addEventListener('message', liveLobbyMessageHandler);
234
+ }
235
+ }
236
+ }
237
+ const disconnectGameFromLiveLobby = () => {
238
+ if (liveLobbyConnection) {
239
+ liveLobbyConnection.close();
240
+ liveLobbyConnection = undefined;
241
+ }
242
+ }
243
+
244
+ const setClientStyling = ():void => {
245
+ let sheet = document.createElement('style');
246
+
247
+ sheet.innerHTML = clientstyling;
248
+
249
+ setTimeout(() => { customStylingContainer.appendChild(sheet);});
250
+ }
251
+
252
+ const setFavorites = ():void => {
253
+ if (favorites == 'true') {
254
+ fav = true;
255
+ }
256
+ }
257
+
258
+ const setClientStylingURL = ():void => {
259
+ let url:URL = new URL(clientstylingurl);
260
+
261
+ let cssFile:HTMLElement = document.createElement('style');
262
+
263
+ fetch(url.href)
264
+ .then((res:any) => res.text())
265
+ .then((data:any) => {
266
+ cssFile.innerHTML = data
267
+
268
+ setTimeout(() => { customStylingContainer.appendChild(cssFile); });
269
+ });
270
+ }
271
+
272
+ const liveLobbyMessageHandler = async (event) => {
273
+ const { type, data: rawData } = event;
274
+ let data;
275
+ switch (type) {
276
+ case 'message': {
277
+ if (rawData) {
278
+ try {
279
+ data = JSON.parse(rawData);
280
+ } catch (err) {
281
+ // eslint-disable-next-line no-console
282
+ console.error('MESSAGE PARSING ERROR: ', err);
283
+ }
284
+ }
285
+ if (data) {
286
+ const {
287
+ InternalTableId,
288
+ MessageType,
289
+ // TakenSeats,
290
+ Results,
291
+ // Roads, // for baccarat
292
+ Seats,
293
+ Open,
294
+ } = data;
295
+ if (InternalTableId) {
296
+ switch (MessageType) {
297
+ case 'SeatsUpdated': {
298
+ if (Seats && Array.isArray(Seats)) {
299
+ currentoccupiedseats = Seats;
300
+ livegamedata.currentOccupiedSeats = Seats;
301
+ await tick();
302
+ }
303
+ break;
304
+ }
305
+ case 'RouletteResultsUpdated': {
306
+ if (Results && Array.isArray(Results)) {
307
+ currentroulettenumbers = Results;
308
+ livegamedata.currentRouletteNumbers = Results;
309
+ await tick();
310
+ }
311
+ break;
312
+ }
313
+ case 'DoubleBallRouletteResultsUpdated': {
314
+ if (Results && Array.isArray(Results)) {
315
+ currentdoubleballroulettenumbers = Results;
316
+ livegamedata.currentDoubleBallRouletteNumbers = Results;
317
+ await tick();
318
+ }
319
+ break;
320
+ }
321
+ case 'TableOpened': {
322
+ isopen = Open;
323
+ livegamedata.isOpen = Open;
324
+ await tick();
325
+ break;
326
+ }
327
+ case 'TableClosed': {
328
+ isopen = Open;
329
+ livegamedata.isOpen = Open;
330
+ await tick();
331
+ break;
332
+ }
333
+ default: {
334
+ // default case
335
+ }
336
+ }
337
+ }
338
+ }
339
+ }
340
+ default: {
341
+ // default case
342
+ }
343
+ }
344
+ }
345
+
346
+ const setLiveLobbyData = () => {
347
+ let url:any = new URL(`${livelobbyendpoint.split('?')[0]}`);
348
+ url.searchParams.append("platform", getDevice(userAgent));
349
+ url.searchParams.append('language', lang);
350
+ fetch(url)
351
+ .then((res:any) => res.json())
352
+ .then((data:any) => {
353
+ const { details } = data[0];
354
+ livegamedata = details;
355
+ });
356
+ }
357
+ const numberWithSeparators = (value, sep = DEFAULT_AMOUNT_SEPARATOR) => {
358
+ if (value !== undefined && value !== null) {
359
+ return `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, sep);
360
+ }
361
+ return '';
362
+ }
363
+ const contains = (array, value) => {
364
+ return array.some(item => item === value);
365
+ }
366
+ const getGameComponent = (livegamedata) => {
367
+ let GameComponent = null;
368
+ if (livegamedata) {
369
+ const { vendorCategory } = livegamedata;
370
+ if (vendorCategory) {
371
+ const gameTypeToLower = vendorCategory.toLowerCase();
372
+ if (contains(blackjackcategory, gameTypeToLower)) {
373
+ GameComponent = BLACKJACK;
374
+ } else if (contains(roulettecategory, gameTypeToLower)) {
375
+ GameComponent = ROULETTE;
376
+ }
377
+ // else if (contains(baccaratCategory, gameTypeToLower)) {
378
+ // GameComponent = 'baccarat';
379
+ // } else if (contains(otherLiveGamesCategory, gameTypeToLower)) {
380
+ // GameComponent = 'poker';
381
+ // }
382
+ }
383
+ }
384
+ return GameComponent;
385
+ };
386
+ const renderBetLimits = (min, max, currencySymbol) => {
387
+ let rightSideContent;
388
+ let leftSideContent;
389
+ if (min !== undefined && min !== null && max !== undefined && max !== null) {
390
+ leftSideContent = `
391
+ <span>
392
+ ${currencySymbol}
393
+ </span>
394
+ ${
395
+ numberWithSeparators(min)
396
+ }-${
397
+ numberWithSeparators(max)
398
+ }`;
399
+ }
400
+ if (numberofplayers) {
401
+ rightSideContent = `
402
+ <svg fill="white" width="13" height="13" viewBox="0 0 13 14" xmlns="http://www.w3.org/2000/svg"><path d="M4 8.2a4.6 4.6 0 0 0 5 0c2.7.8 4 2.6 4 4.8H0c0-2.2 1.3-4 4-4.8zM6.6 8c2 0 3.8-1.7 3.8-4 0-2.1-1.7-4-3.8-4a3.9 3.9 0 0 0-3.8 4c0 2.2 1.7 4 3.8 4z"/></svg>
403
+ <span class="NrOfPlayers">${numberofplayers}</span>`;
404
+ }
405
+ if (!rightSideContent && !leftSideContent) {
406
+ return '';
407
+ }
408
+ return `
409
+ <p class="LiveLimits">
410
+ <span class="BetLimitLeft">
411
+ ${leftSideContent || ''}
412
+ </span>
413
+ <span class="BetLimitRight">
414
+ ${rightSideContent || ''}
415
+ </span>
416
+ </p>`;
417
+ }
418
+ const renderDealerName = (dealername) => {
419
+ if (!dealername) {
420
+ return '';
421
+ }
422
+ return `
423
+ <p class="LiveLimits">
424
+ <span class="DealerName">${$_('gameThumbnail.dealer')}: ${dealername}</span>
425
+ </p>
426
+ `;
427
+ }
428
+ const createDisplayData = (livegamedata) => {
429
+ totalseats = livegamedata.totalSeats || DEFAULT_BLACKJACK_TOTAL_SEATS;
430
+ currentoccupiedseats = livegamedata.currentOccupiedSeats || [];
431
+ const seats = [];
432
+ for (let i = 1; i <= totalseats; i++) {
433
+ seats.push(i);
434
+ }
435
+ return { seats };
436
+ }
437
+ const renderSpan = (selectedClass, key, value, colorClass = '') => {
438
+ const rouletteItemClassname = `${selectedClass} ${colorClass}`;
439
+ const firstMatch = key.toString().match(/first0|second0|0/g);
440
+ if (key === 0 || (firstMatch && firstMatch.length !== 0)) {
441
+ return `
442
+ <span
443
+ id=${key}
444
+ class="${rouletteItemClassname}"
445
+ >
446
+ ${value}
447
+ </span>
448
+ `;
449
+ }
450
+ return `
451
+ <span id=${key} class="${rouletteItemClassname}">
452
+ ${value}
453
+ </span>
454
+ `;
455
+ }
456
+
457
+ const attachAnimations = () => {
458
+ const animatedClassName = 'FirstElementAnimated';
459
+ const firstElem = roulletteref.getElementsByClassName('First')[0];
460
+ if (firstElem) {
461
+ firstElem.classList.add(animatedClassName);
462
+ setTimeout(() => {
463
+ firstElem.classList.remove(animatedClassName);
464
+ }, 2000);
465
+ }
466
+ }
467
+ const updateComponent = () => {
468
+ if (livegamedata) {
469
+ isopen = livegamedata.isOpen;
470
+ betlimit = livegamedata.betLimit || {};
471
+ openhours = livegamedata.openHours;
472
+ seats = createDisplayData(livegamedata).seats;
473
+ if (openhours && openhours.value) {
474
+ const { value: { startTime: starttimeRaw /* , timeFormat: timeFormatRaw */, originalTimeFormat } } = openhours;
475
+ starttime = starttimeRaw;
476
+ timeformat = originalTimeFormat || timeformat;
477
+ }
478
+ if (isopen) {
479
+ displaytype = getGameComponent(livegamedata);
480
+ }
481
+ currencySymbol = currenciesSymbols[currency];
482
+ min = (betlimit.min || {})[currency];
483
+ max = (betlimit.max || {})[currency];
484
+ currentroulettenumbers = livegamedata.currentRouletteNumbers;
485
+ currentdoubleballroulettenumbers = livegamedata.currentDoubleBallRouletteNumbers;
486
+ vendorcategory = livegamedata.vendorCategory;
487
+ isdouble = vendorcategory.toLowerCase() === DOUBLE_ROULETTE;
488
+ roulleteresults = (isdouble ? currentdoubleballroulettenumbers : currentroulettenumbers) || [];
489
+ roulettecontainerclassname = 'GameProp LiveProps RoulleteProps';
490
+ roulettecontainerclassname += isdouble ? ' Double' : '';
491
+ colorsourcearray = contains(roulettecategory, vendorcategory.toLowerCase()) ? ROULETTE_COLOR_MAP : MONEY_WHEEL_COLOR_MAP;
492
+ oldistablefull = istablefull;
493
+ istablefull = Array.isArray(currentoccupiedseats) && currentoccupiedseats.length === totalseats;
494
+ if (livegamedata.dealer) {
495
+ dealername = livegamedata.dealer.DealerName;
496
+ }
497
+ numberofplayers = livegamedata.numberOfPlayers;
498
+ extraclassname = 'ListGame';
499
+ if(livegamedata.isOpen && livegamedata.currentRouletteNumbers) {
500
+ extraclassname += ' GameBackdrop';
501
+ }
502
+ if (isopen && istablefull && min && max && livegamedata.currentOccupiedSeats) {
503
+ extraclassname += ' GameContainerDimmed';
504
+ } else {
505
+ if (isopen === false && starttime) {
506
+ extraclassname += ' GameContainerFullyDimmed';
507
+ }
508
+ }
509
+ if (customStylingContainer) {
510
+ if (!oldistablefull && istablefull) {
511
+ extraclassname += ' PulsatingRedShadow';
512
+ extraclassname = extraclassname.replace(' PulsatingGreenShadow', '');
513
+ } else if (oldistablefull && !istablefull) {
514
+ extraclassname += ' PulsatingGreenShadow';
515
+ extraclassname = extraclassname.replace(' PulsatingRedShadow', '');
516
+ }
517
+ }
518
+ }
519
+ }
520
+ const toggleConnect = ():void => {
521
+ if (connectlive === 'disconnect') {
522
+ disconnectGameFromLiveLobby();
523
+ } else if (connectlive === 'connect') {
524
+ connectGameToLiveLobby();
525
+ }
526
+ }
527
+ const toggleVisibilityConnect = ():void => {
528
+ if (visibilityconnect === 'disconnect') {
529
+ disconnectGameFromLiveLobby();
530
+ } else if (visibilityconnect === 'connect' && connectlive === 'connect') {
531
+ connectGameToLiveLobby();
532
+ }
533
+ }
534
+
535
+ onMount(() => {
536
+ window.addEventListener('message', messageHandler, false);
537
+
538
+ return () => {
539
+ window.removeEventListener('message', messageHandler);
540
+ if (liveLobbyConnection) {
541
+ liveLobbyConnection.removeEventListener('message', liveLobbyMessageHandler);
542
+ }
543
+ }
544
+ });
545
+
546
+ $: connectlive && toggleConnect();
547
+ $: visibilityconnect && toggleVisibilityConnect();
548
+ $: lang && setActiveLanguage();
549
+ $: session && userid && endpoint && setSession();
550
+ $: gamethumbnail && setOnLoad();
551
+ $: clientstyling && setClientStyling();
552
+ $: favorites && setFavorites();
553
+ $: gamecellsize && clientstylingurl && setClientStylingURL();
554
+ $: endpoint && livelobbyendpoint && setLiveLobbyData();
555
+ $: livegamedata && updateComponent();
556
+ $: roulletteref && roulleteresults && attachAnimations();
557
+ </script>
558
+
559
+ <div class={`GameContainer ${extraclassname}`} part={`GameContainer ${extraclassname}`} bind:this={customStylingContainer}>
560
+ <div class="GameInnerContainer { (livegamedata && !isopen && openhours.value) || (livegamedata && istablefull) ? 'GameInnerContainerUnavailable' : ''}" part="GameInnerContainer { (livegamedata && !isopen) || (livegamedata && istablefull) ? 'GameInnerContainerUnavailable' : ''}" on:mouseenter={gameHover} on:mouseleave={gameBlur} on:touchstart={gameTouch} on:touchend={gameTouchEnd}>
561
+ <img src={gamethumbnail} class={`GameBg GameBg-${gamecellsize} ${hover ? 'GameContainerHovered' : ''} ${loaded ? 'Loaded' : ''}`} part="GameBg {hover ? 'GameContainerHovered' : ''} {loaded ? 'Loaded' : ''}" alt="" bind:this={image} loading="lazy" />
562
+ <div class="GameInfoWrapper" part="GameInfoWrapper">
563
+ <div class="GameInfo {hover ? 'GameHovered' : ''}" part="GameInfo {hover ? 'GameHovered' : ''}">
564
+ {#if fav}
565
+ {#if !isMobile(userAgent) && !gamefavorite && isLoggedIn}
566
+ <div class="FavIconContainer" part="FavIconContainer" on:click="{() => toggleFavoriteGame(gameid)}">
567
+ <svg version="1.1" class="UnfavoredIcon" part="UnfavoredIcon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="20px" y="20px"
568
+ viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path style="fill: white" d="M511.266,197.256c-1.764-5.431-6.458-9.388-12.108-10.209l-158.722-23.065L269.452,20.155
569
+ c-2.527-5.12-7.741-8.361-13.451-8.361c-5.709,0-10.924,3.242-13.451,8.361l-70.988,143.828L12.843,187.047
570
+ c-5.65,0.821-10.344,4.779-12.108,10.209c-1.765,5.43-0.293,11.391,3.795,15.376l114.848,111.955L92.27,482.67
571
+ c-0.965,5.627,1.349,11.315,5.968,14.67c4.618,3.355,10.74,3.798,15.797,1.142L256,423.846l141.961,74.637
572
+ c2.195,1.154,4.591,1.723,6.979,1.723c3.11,0,6.206-0.966,8.818-2.865c4.619-3.356,6.933-9.043,5.968-14.671L392.61,324.587
573
+ l114.86-111.954C511.559,208.647,513.031,202.686,511.266,197.256z M366.023,308.608c-3.536,3.446-5.15,8.412-4.314,13.278
574
+ l23.311,135.898l-122.038-64.162c-4.37-2.297-9.591-2.297-13.961,0l-122.045,64.163l23.304-135.9
575
+ c0.834-4.866-0.779-9.83-4.313-13.276l-98.731-96.244l136.445-19.829c4.886-0.71,9.108-3.778,11.294-8.205L256,60.685
576
+ l61.023,123.645c2.186,4.427,6.408,7.496,11.294,8.206l136.447,19.828L366.023,308.608z"/></svg>
577
+ </div>
578
+ {/if}
579
+ {/if}
580
+ <p class="GameInfoName" part="GameInfoName" title="{gamename}">{gamename}</p>
581
+ <button class="GameInfoBtn" part="GameInfoBtn" on:click="{() => toggleGameFrame(gameid)}">{$_('gameThumbnail.playNow')}</button>
582
+ </div>
583
+ <span class="GameInfoVendor" part="GameInfoVendor">
584
+ { gamevendor ? gamevendor : '-'}
585
+ </span>
586
+ </div>
587
+ {#if !isMobile(userAgent) && gamefavorite && isLoggedIn && favorites}
588
+ <div class="FavIconContainer" part="FavIconContainer" on:click="{() => toggleFavoriteGame(gameid)}">
589
+ <svg version="1.1" class="FavoredIcon" part="FavoredIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.481 19.481" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 19.481 19.481">
590
+ <path style="fill: white" d="m10.201,.758l2.478,5.865 6.344,.545c0.44,0.038 0.619,0.587 0.285,0.876l-4.812,4.169 1.442,6.202c0.1,0.431-0.367,0.77-0.745,0.541l-5.452-3.288-5.452,3.288c-0.379,0.228-0.845-0.111-0.745-0.541l1.442-6.202-4.813-4.17c-0.334-0.289-0.156-0.838 0.285-0.876l6.344-.545 2.478-5.864c0.172-0.408 0.749-0.408 0.921,0z"/>
591
+ </svg>
592
+ </div>
593
+ {:else if isMobile(userAgent) && gamefavorite && isLoggedIn && favorites}
594
+ <div class="FavIconContainer" part="FavIconContainer">
595
+ <svg version="1.1" class="FavoredIcon" part="FavoredIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.481 19.481" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 19.481 19.481">
596
+ <path style="fill: white" d="m10.201,.758l2.478,5.865 6.344,.545c0.44,0.038 0.619,0.587 0.285,0.876l-4.812,4.169 1.442,6.202c0.1,0.431-0.367,0.77-0.745,0.541l-5.452-3.288-5.452,3.288c-0.379,0.228-0.845-0.111-0.745-0.541l1.442-6.202-4.813-4.17c-0.334-0.289-0.156-0.838 0.285-0.876l6.344-.545 2.478-5.864c0.172-0.408 0.749-0.408 0.921,0z"/>
597
+ </svg>
598
+ </div>
599
+ {/if}
600
+ <div class="GameExtraInfo" part="GameExtraInfo">
601
+ {#if gameisnew}
602
+ <span class="GameExtraInfoLabel NewGameTag" part="GameExtraInfoLabel NewGameTag">{$_('gameThumbnail.new')}</span>
603
+ {/if}
604
+ {#if (parseInt(gamepopularity) > 0)}
605
+ <span class="GameExtraInfoLabel PopularGameTag" part="GameExtraInfoLabel PopularGameTag">{$_('gameThumbnail.hot')}</span>
606
+ {/if}
607
+ {#if livegamedata}
608
+ {#if !isopen && starttime && timeformat}
609
+ <div class="GameProp LiveProps" part="GameProp LiveProps">
610
+ <div class="ClosedGame" part="ClosedGame">
611
+ {$_('gameThumbnail.opens')}
612
+ <span>
613
+ {moment.utc(starttime).local().format(timeformat)}
614
+ </span>
615
+ </div>
616
+ {@html renderDealerName(dealername)}
617
+ {@html renderBetLimits(min, max, currencySymbol)}
618
+ </div>
619
+ {/if}
620
+ {#if isopen && displaytype && displaytype === BLACKJACK}
621
+ <div class="GameProp LiveProps BlackjackDisplay" part="GameProp LiveProps BlackjackDisplay">
622
+ <div class="LiveIcons" part="LiveIcons">
623
+ {#if istablefull}
624
+ <span class="FullTable" part="FullTable">
625
+ {$_('gameThumbnail.full')}
626
+ </span>
627
+ {:else}
628
+ {#each seats as seatData}
629
+ <span class={contains(currentoccupiedseats, seatData.toString()) ? 'ClosedSeat' : 'OpenSeat'} part={contains(currentoccupiedseats, seatData.toString()) ? 'ClosedSeat' : 'OpenSeat'}>
630
+ <svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14">
631
+ <path d="M11.58 6c-1.17 0-2.13.95-2.13 2.12v.4a8.82 8.82 0 00-2.92-.4c-1.54 0-2.45.22-2.92.4v-.4A2.136 2.136 0 001.48 6a1.33 1.33 0 00-.5 2.55c.14.07.24.21.24.37l.26 1.06c0 .96.73 1.75 1.65 1.85a.65.65 0 00.28 1.23.65.65 0 00.3-1.22h5.64a.65.65 0 00.3 1.22.65.65 0 00.28-1.23c.93-.1 1.65-.9 1.65-1.85l.27-1.06c0-.16.1-.3.24-.37A1.33 1.33 0 0011.58 6z"/>
632
+ <path d="M4.34 7.5c.55-.1 1.27-.17 2.2-.17.91 0 1.63.07 2.18.17.21-.96.9-1.74 1.8-2.1V4a3.99 3.99 0 00-7.97 0v1.4c.9.36 1.58 1.14 1.79 2.1z"/>
633
+ </svg>
634
+ </span>
635
+ {/each}
636
+ {/if}
637
+ </div>
638
+ {@html renderDealerName(dealername)}
639
+ {@html renderBetLimits(min, max, currencySymbol)}
640
+ </div>
641
+ {:else if isopen && displaytype && displaytype === ROULETTE}
642
+ <div class="{roulettecontainerclassname}" part="{roulettecontainerclassname}">
643
+ <div class="LiveIcons" part="LiveIcons" bind:this={roulletteref}>
644
+ {#each new Array(numberofdisplayedresults) as garbage, i}
645
+ {#if roulleteresults && roulleteresults[i]}
646
+ {#if isdouble}
647
+ <div class="Double" part="Double">
648
+ {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, `first${i}${roulleteresults[i][0]}`, roulleteresults[i][0], colorsourcearray[roulleteresults[i][0]])}
649
+ {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, `second${i}${roulleteresults[i][1]}`, roulleteresults[i][1], colorsourcearray[roulleteresults[i][1]])}
650
+ </div>
651
+ {:else}
652
+ {@html renderSpan(`LatestResult ${i === 0 ? 'First' : ''}`, i, roulleteresults[i], colorsourcearray[roulleteresults[i]])}
653
+ {/if}
654
+ {/if}
655
+ {/each}
656
+ </div>
657
+ {@html renderDealerName(dealername)}
658
+ {@html renderBetLimits(min, max, currencySymbol)}
659
+ </div>
660
+ {/if}
661
+ {/if}
662
+ </div>
663
+ </div>
664
+ {#if showgamename}
665
+ <p class="GameNameBelow" part="GameNameBelow" title="{gamename}">{gamename}</p>
666
+ {/if}
667
+ </div>
668
+
669
+
670
+ <style lang="scss">
671
+
672
+ :host {
673
+ font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
674
+ }
675
+
676
+ *, *::before, *::after {
677
+ margin: 0;
678
+ padding: 0;
679
+ box-sizing: border-box;
680
+ }
681
+
682
+ .GameContainer {
683
+ width: 100%;
684
+ height: 100%;
685
+ position: relative;
686
+ }
687
+
688
+ .GameInnerContainer {
689
+ position: relative;
690
+ width: 100%;
691
+ height: 100%;
692
+ overflow: hidden;
693
+ border-radius: 5px;
694
+ .GameBg {
695
+ width: 100%;
696
+ height: 100%;
697
+ object-fit: unset;
698
+ transition: all 150ms ease-in-out;
699
+ &.GameBg-1x2,
700
+ &.GameBg-2x1,
701
+ &.GameBg-2x2 { object-fit: cover; }
702
+ }
703
+
704
+ .GameInfoWrapper {
705
+ display: none;
706
+ position: absolute;
707
+ width: 100%;
708
+ height: 100%;
709
+ top: 0;
710
+ right: 0;
711
+ bottom: 0;
712
+ left: 0;
713
+ background: rgba(0, 0, 0, .65);
714
+ z-index: 15;
715
+
716
+ .GameInfo {
717
+ display: flex;
718
+ width: 100%;
719
+ height: 100%;
720
+ flex-direction: column;
721
+ align-items: center;
722
+ justify-content: center;
723
+
724
+ &Name {
725
+ color: white;
726
+ margin-bottom: 10px;
727
+ text-align: center;
728
+ font-size: 14px;
729
+ }
730
+
731
+ &Btn {
732
+ appearance: none;
733
+ padding: 6px;
734
+ background: var(--emfe-w-color-primary, #D0046C);
735
+ color: var(--emfe-w-color-primary-50, #FBECF4);
736
+ font-size: 16px;
737
+ border: 2px solid var(--emfe-w-color-primary-600, #99034F);
738
+ border-radius: 5px;
739
+ cursor: pointer;
740
+ transition: border 150ms ease-in-out;
741
+
742
+ &:hover {
743
+ border: 2px solid var(--emfe-w-color-primary-100, #F1BED9);
744
+ }
745
+ }
746
+ }
747
+
748
+ .GameInfoVendor {
749
+ display: block;
750
+ position: absolute;
751
+ bottom: 8px;
752
+ right: 8px;
753
+ color: white;
754
+ font-size: 12px;
755
+ font-weight: normal;
756
+ }
757
+ }
758
+
759
+ &:hover {
760
+ cursor: pointer;
761
+
762
+ .GameInfoWrapper{
763
+ display: block;
764
+ }
765
+
766
+ .GameBg {
767
+ filter: blur(5px) grayscale(1);
768
+ }
769
+ }
770
+
771
+ .GameExtraInfo {
772
+ display: block;
773
+ position: absolute;
774
+ width: 100%;
775
+ height: 100%;
776
+ top: 8px;
777
+ left: 8px;
778
+ z-index: 0;
779
+ &Label {
780
+ font-size: 11px;
781
+ padding: 3px;
782
+ background-color: var(--emfe-w-color-primary, #D0046C);
783
+ color: var(--emfe-w-color-primary-50, #FBECF4);
784
+ font-weight: bold;
785
+ text-transform: uppercase;
786
+ border-radius: 5px;
787
+ }
788
+ }
789
+ }
790
+
791
+ .GameNameBelow {
792
+ color: var(--emfe-w-color-white, #FFFFFF);
793
+ position: relative;
794
+ bottom: -5px;
795
+ text-align: center;
796
+ white-space: nowrap;
797
+ overflow: hidden;
798
+ text-overflow: ellipsis;
799
+ }
800
+ .FavoredIcon, .UnfavoredIcon {
801
+ width: 20px;
802
+ height: 20px;
803
+ }
804
+ .FavIconContainer {
805
+ position: absolute;
806
+ top: 10px;
807
+ right: 10px;
808
+ cursor: pointer;
809
+ z-index: 15;
810
+ }
811
+
812
+ // LIVE LOBBY DATA STYLING
813
+ .GamesWrapper .ListGame:hover .GamePlayNowText {
814
+ @media (min-width: 1100px) {
815
+ z-index: 4;
816
+ }
817
+ }
818
+ // dim the game that doesn't have open seats or table is full
819
+ .ListGame:hover, .ListGame:active {
820
+ .OpenSeat, .ClosedSeat, .LiveLimits, .LatestResult, .FullTable {
821
+ opacity: .2;
822
+ }
823
+ }
824
+ // fix for displaying live game thumbnails that don't have details without backdrop
825
+ .ListGame.GameBackdrop {
826
+ .GameInnerContainer {
827
+ &::after {
828
+ content: '';
829
+ position: absolute;
830
+ top: 0;
831
+ right: 0;
832
+ bottom: 0;
833
+ left: 0;
834
+ background: linear-gradient(0deg, rgba(0,0,0,1) 15%, rgba(0,0,0,0) 100%);
835
+ }
836
+ }
837
+ }
838
+
839
+ .ListGame .GameInnerContainer {
840
+ z-index: 0;
841
+
842
+ .GameBg {
843
+ z-index: 5;
844
+ }
845
+
846
+ .GameExtraInfo {
847
+ z-index: 10;
848
+ }
849
+ &::after {
850
+ content: '';
851
+ position: absolute;
852
+ top: 0;
853
+ right: 0;
854
+ bottom: 0;
855
+ left: 0;
856
+ }
857
+
858
+ &.GameInnerContainerUnavailable {
859
+ &::after {
860
+ content: '';
861
+ position: absolute;
862
+ top: 0;
863
+ right: 0;
864
+ bottom: 0;
865
+ left: 0;
866
+ background: rgba(0,0,0,0.9);
867
+ }
868
+ }
869
+
870
+ .ListGame.GameContainerDimmed:before {
871
+ display: block;
872
+ content: ' ';
873
+ width: 100%;
874
+ height: 100%;
875
+ position: absolute;
876
+ top: 0;
877
+ right: 0;
878
+ bottom: 0;
879
+ left: 0;
880
+ z-index: 5;
881
+ background: rgba(0,0,0, .4);
882
+ color: var(--emfe-w-color-white, #FFFFFF);
883
+ fill: var(--emfe-w-color-white, #FFFFFF);
884
+ opacity: 1;
885
+ border-radius: 4px;
886
+ }
887
+
888
+ .ListGame.GameContainerFullyDimmed:before {
889
+ display: block;
890
+ content: ' ';
891
+ width: 100%;
892
+ height: 100%;
893
+ position: absolute;
894
+ top: 0;
895
+ right: 0;
896
+ bottom: 0;
897
+ left: 0;
898
+ z-index: 5;
899
+ background: rgba(0,0,0, .8);
900
+ color: var(--emfe-w-color-white, #FFFFFF);
901
+ fill: var(--emfe-w-color-white, #FFFFFF);
902
+ opacity: 1;
903
+ border-radius: 4px;
904
+ }
905
+
906
+ .LiveProps {
907
+ display: flex;
908
+ flex-direction: column;
909
+ position: absolute;
910
+ bottom: 8px;
911
+ left: -8px;
912
+ right: 0;
913
+ width: 100%;
914
+ padding: 0;
915
+ background: linear-gradient(to top, rgba(0,0,0,.1) 0%, rgba(0,0,0,.2) 60%, rgba(0,0,0,.3) 80%, rgba(0,0,0,.99) 100%);
916
+ color: var(--emfe-w-color-white, #FFFFFF);
917
+ opacity: 1;
918
+ font-size: 14px;
919
+ }
920
+
921
+ .ListGame:hover .LiveProps,
922
+ .ListGameLink:hover .LiveProps {
923
+ opacity: 0;
924
+ }
925
+ //--------------------------------------LIVE LOBBY ANIMATIONS------------------------------------------
926
+ // Pulsating animations
927
+ @keyframes red-pulse {
928
+ 0% {
929
+ box-shadow: 0 0 2px 0 rgba(red, 0.75);
930
+ }
931
+
932
+ 15% {
933
+ box-shadow: 0 0 10px 2px rgba(red, 0.75);
934
+ }
935
+
936
+ 30% {
937
+ box-shadow: 0 0 2px 0 rgba(red, 0.75);
938
+ }
939
+
940
+ 50% {
941
+ box-shadow: 0 0 10px 2px rgba(red, 0.75);
942
+ }
943
+
944
+ 65% {
945
+ box-shadow: 0 0 2px 0 rgba(red, 0.75);
946
+ }
947
+
948
+ 80% {
949
+ box-shadow: 0 0 10px 2px rgba(red, 0.75);
950
+ }
951
+
952
+ 100% {
953
+ box-shadow: 0 0 0 0 rgba(red, 0.75);
954
+ }
955
+ }
956
+
957
+ @keyframes green-pulse {
958
+ 0% {
959
+ box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
960
+ }
961
+
962
+ 15% {
963
+ box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
964
+ }
965
+
966
+ 30% {
967
+ box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
968
+ }
969
+
970
+ 50% {
971
+ box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
972
+ }
973
+
974
+ 65% {
975
+ box-shadow: 0 0 2px 0 rgba(#56A80A, 0.75);
976
+ }
977
+
978
+ 80% {
979
+ box-shadow: 0 0 10px 2px rgba(#56A80A, 0.75);
980
+ }
981
+
982
+ 100% {
983
+ box-shadow: 0 0 0 0 rgba(#56A80A, 0.75);
984
+ }
985
+ }
986
+ // Flip animation
987
+ @keyframes flip-open {
988
+ 0% {
989
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
990
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
991
+ -webkit-transition-timing-function: ease-in;
992
+ transition-timing-function: ease-in;
993
+ opacity: 0;
994
+ }
995
+ 40% {
996
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
997
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
998
+ -webkit-transition-timing-function: ease-in;
999
+ transition-timing-function: ease-in;
1000
+ }
1001
+ 60% {
1002
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1003
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1004
+ opacity: 1;
1005
+ }
1006
+ 80% {
1007
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1008
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1009
+ }
1010
+ 100% {
1011
+ -webkit-transform: perspective(400px);
1012
+ transform: perspective(400px);
1013
+ }
1014
+ }
1015
+
1016
+ .silde-in-from-left {
1017
+ -webkit-animation-name: silde-in-from-left;
1018
+ animation-name: silde-in-from-left;
1019
+ -webkit-animation-duration: 1s;
1020
+ animation-duration: 1s;
1021
+ -webkit-animation-fill-mode: both;
1022
+ animation-fill-mode: both;
1023
+ }
1024
+ @-webkit-keyframes silde-in-from-left {
1025
+ 0% {
1026
+ -webkit-transform: translateX(-100%);
1027
+ transform: translateX(-100%);
1028
+ visibility: visible;
1029
+ }
1030
+ 100% {
1031
+ -webkit-transform: translateX(0);
1032
+ transform: translateX(0);
1033
+ }
1034
+ }
1035
+ @keyframes silde-in-from-left {
1036
+ 0% {
1037
+ -webkit-transform: translateX(-100%);
1038
+ transform: translateX(-100%);
1039
+ visibility: visible;
1040
+ }
1041
+ 100% {
1042
+ -webkit-transform: translateX(0);
1043
+ transform: translateX(0);
1044
+ }
1045
+ }
1046
+
1047
+ @keyframes flip-closed-seat {
1048
+ 0% {
1049
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1050
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1051
+ -webkit-transition-timing-function: ease-in;
1052
+ transition-timing-function: ease-in;
1053
+ opacity: 0;
1054
+ }
1055
+ 40% {
1056
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1057
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1058
+ -webkit-transition-timing-function: ease-in;
1059
+ transition-timing-function: ease-in;
1060
+ }
1061
+ 60% {
1062
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1063
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1064
+ opacity: 1;
1065
+ }
1066
+ 80% {
1067
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1068
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1069
+ }
1070
+ 100% {
1071
+ -webkit-transform: perspective(400px);
1072
+ transform: perspective(400px);
1073
+ }
1074
+ }
1075
+
1076
+ // .Page-LiveCasino .GamesListContainer,
1077
+ // .Page-LiveCasino-Child .GamesListContainer,
1078
+ // .Page-LiveCasino .OperatorSticky .GamesListContainer,
1079
+ // .Page-LiveCasino .CasinoGames .GamesListContainer,
1080
+ // .Page-Live-casinoSource .GamesListContainer,
1081
+ // .Page-Live-casinoSource .GamesListContainer,
1082
+ // .Page-Live-casinoSource .OperatorSticky .GamesListContainer,
1083
+ // .Page-Live-casinoSource .CasinoGames .GamesListContainer {
1084
+ // overflow: visible;
1085
+ // }
1086
+
1087
+ .ListGame.PulsatingGreenShadow, .ListGame.PulsatingRedShadow {
1088
+ overflow: auto;
1089
+ }
1090
+
1091
+ .ListGame.PulsatingGreenShadow {
1092
+ animation: green-pulse 2s linear;
1093
+ }
1094
+
1095
+ .ListGame.PulsatingRedShadow {
1096
+ animation: red-pulse 2s linear;
1097
+ }
1098
+
1099
+ .LiveIcons {
1100
+ position: relative;
1101
+ display: flex;
1102
+ padding: 0 16px;
1103
+ // flex-wrap: wrap;
1104
+ box-sizing: border-box;
1105
+ flex-direction: row;
1106
+ align-items: center;
1107
+ justify-content: flex-start;
1108
+ min-height: auto;
1109
+ margin-bottom: 5px;
1110
+ @media (min-width: 1100px) {
1111
+ min-height: auto;
1112
+ }
1113
+
1114
+ &:first-child {
1115
+ margin-left: 0;
1116
+ }
1117
+
1118
+ &:last-child {
1119
+ margin-right: 0;
1120
+ }
1121
+
1122
+ &.Black, &.Red, &.Green {
1123
+ color: var(--emfe-w-color-white, #FFFFFF);
1124
+ border: 1px solid var(--emfe-w-color-white, #FFFFFF);
1125
+ }
1126
+
1127
+ .LatestResult {
1128
+ min-width: 12px;
1129
+ padding: 2px;
1130
+ margin: 0 1px;
1131
+ margin-right: 6px;
1132
+ font-size: 14px;
1133
+ text-align: center;
1134
+ @media (min-width: 1100px) {
1135
+ min-width: 12px;
1136
+ font-size: 14px;
1137
+ margin: 0 2px;
1138
+ margin-right: 5px;
1139
+ padding: 2px;
1140
+ }
1141
+
1142
+ &.FirstElementAnimated {
1143
+ animation: flip-open 2s both;
1144
+ -webkit-animation: flip-open 2s both;
1145
+ -webkit-backface-visibility: visible;
1146
+ backface-visibility: visible;
1147
+ }
1148
+
1149
+ &.First {
1150
+ min-width: 24px;
1151
+ &.Black, &.Red, &.Green {
1152
+ color: var(--emfe-w-color-white, #FFFFFF);
1153
+ border: 1px solid var(--emfe-w-color-white, #FFFFFF);
1154
+ }
1155
+ &.Black {
1156
+ background: var(--emfe-w-color-black, #000000)
1157
+ }
1158
+ &.Red {
1159
+ background: red;
1160
+ }
1161
+ &.Green {
1162
+ background: #56A80A;
1163
+ }
1164
+ padding: 4px;
1165
+ @media (min-width: 1100px) {
1166
+ padding: 4px;
1167
+ }
1168
+ }
1169
+ }
1170
+
1171
+ .Double {
1172
+ display: flex;
1173
+ flex-direction: column;
1174
+
1175
+ .LatestResult {
1176
+ &:first-child {
1177
+ margin-bottom: 10px;
1178
+ }
1179
+ }
1180
+
1181
+ &:first-child {
1182
+ .LatestResult {
1183
+ margin-left: 0;
1184
+ margin-bottom: 0;
1185
+ }
1186
+ }
1187
+
1188
+ &:last-child {
1189
+ .LatestResult {
1190
+ margin-right: 0;
1191
+ }
1192
+ }
1193
+ }
1194
+
1195
+ .Black, .Red, .Green {
1196
+ background-color: transparent;
1197
+ }
1198
+
1199
+ .Black {
1200
+ color: var(--emfe-w-color-white, #FFFFFF);
1201
+ }
1202
+
1203
+ .Red {
1204
+ color: red;
1205
+ }
1206
+
1207
+ .Green {
1208
+ color: #56A80A;
1209
+ }
1210
+ }
1211
+
1212
+ .Blue {
1213
+ color: #4d90a7;
1214
+ }
1215
+
1216
+ .Red {
1217
+ background-color: red;
1218
+ }
1219
+
1220
+ .Black {
1221
+ background-color: var(--emfe-w-color-black, #000000);
1222
+ }
1223
+
1224
+ .Green {
1225
+ background-color: #56A80A;
1226
+ }
1227
+
1228
+ .White {
1229
+ background-color: var(--emfe-w-color-white, #FFFFFF);
1230
+ }
1231
+
1232
+ .Yellow {
1233
+ background-color: #eeca3d;
1234
+ }
1235
+
1236
+ .Gold {
1237
+ background-color: darken(#eeca3d, 30%);
1238
+ }
1239
+
1240
+ .Orange {
1241
+ background-color: darken(#eeca3d, 40%);
1242
+ }
1243
+
1244
+ .Purple {
1245
+ background-color: darken(#f0f, 40%);
1246
+ }
1247
+
1248
+ .Tie {
1249
+ background-color: var(--emfe-w-color-white, #FFFFFF);
1250
+ background-image: linear-gradient(135deg, var(--emfe-w-color-white, #FFFFFF) 25%, transparent 25%, transparent 50%, #212121 50%, var(--emfe-w-color-white, #FFFFFF) 75%, transparent 75%, var(--emfe-w-color-white, #FFFFFF));
1251
+ }
1252
+ .OpenSeat, .ClosedSeat {
1253
+ display: inline-block;
1254
+ width: 16px;
1255
+ height: 16px;
1256
+ margin-right: 4px;
1257
+ @media (min-width: 768px) {
1258
+ width: 16px;
1259
+ height: 16px;
1260
+ }
1261
+ @media (min-width: 1100px) {
1262
+ width: 16px;
1263
+ height: 16px;
1264
+ }
1265
+ svg {
1266
+ width: 100%;
1267
+ height: 100%;
1268
+ }
1269
+ }
1270
+ .OpenSeat {
1271
+ animation: flip-closed-seat 2s both;
1272
+ -webkit-animation: flip-closed-seat 2s both;
1273
+ -webkit-backface-visibility: visible;
1274
+ backface-visibility: visible;
1275
+ }
1276
+ .ClosedSeat {
1277
+ animation: flip-open 2s both;
1278
+ -webkit-animation: flip-open 2s both;
1279
+ -webkit-backface-visibility: visible;
1280
+ backface-visibility: visible;
1281
+ }
1282
+ .OpenSeat svg {
1283
+ fill: transparent;
1284
+ stroke: var(--emfe-w-color-white, #FFFFFF);
1285
+ }
1286
+ .ClosedSeat svg {
1287
+ fill: var(--emfe-w-color-white, #FFFFFF);
1288
+ }
1289
+ .FullTable {
1290
+ display: flex;
1291
+ position: relative;
1292
+ z-index: 10;
1293
+ height: 20px;
1294
+ padding: 1px 4px 1px 0;
1295
+ align-items: center;
1296
+ border-radius: 3px;
1297
+ font-size: 12px;
1298
+ white-space: normal;
1299
+ text-transform: uppercase;
1300
+ -webkit-animation-name: silde-in-from-left;
1301
+ animation-name: silde-in-from-left;
1302
+ -webkit-animation-duration: 1s;
1303
+ animation-duration: 1s;
1304
+ -webkit-animation-fill-mode: both;
1305
+ animation-fill-mode: both;
1306
+ svg {
1307
+ width: 100%;
1308
+ height: 100%;
1309
+ fill: var(--emfe-w-color-white, #FFFFFF);
1310
+ }
1311
+ &.ClosedSeat {
1312
+ margin-right: -3px;
1313
+ }
1314
+ }
1315
+ .PlayersDisplay {
1316
+ display: flex;
1317
+ flex-direction: row;
1318
+ flex-wrap: wrap;
1319
+ align-items: center;
1320
+ padding: 2px 10px;
1321
+ background: linear-gradient(to bottom, rgba(33, 33, 33, .9) 0%, rgba(33, 33, 33, .1) 100%);
1322
+ color: var(--emfe-w-color-white, #FFFFFF);
1323
+ @media (min-width: 1100px) {
1324
+ padding: 2px 16px;
1325
+ }
1326
+ .PlayersIcon {
1327
+ width: 14px;
1328
+ height: 14px;
1329
+ margin-right: 4px;
1330
+ //@media (min-width: 1100px) {
1331
+ // width: 1.7rem;
1332
+ // height: 1.7rem;
1333
+ //}
1334
+ svg {
1335
+ fill: var(--emfe-w-color-white, #FFFFFF);
1336
+ width: 100%;
1337
+ height: 100%;
1338
+ }
1339
+ }
1340
+ }
1341
+ .ClosedGame {
1342
+ opacity: 1;
1343
+ z-index: 10;
1344
+ padding: 8px 10px;
1345
+ color: var(--emfe-w-color-white, #FFFFFF);
1346
+ font-size: 18px;
1347
+ @media (min-width: 1100px) {
1348
+ padding: 8px 16px;
1349
+ }
1350
+ span {
1351
+ font-size: 18px;
1352
+ }
1353
+ }
1354
+ .LiveLimits {
1355
+ opacity: 1;
1356
+ display: flex;
1357
+ flex-direction: row;
1358
+ justify-content: space-between;
1359
+ padding: 2px 20px 5px 20px;
1360
+ background: var(--emfe-w-color-black, #000000);
1361
+ color: var(--emfe-w-color-white, #FFFFFF);
1362
+ font-weight: normal;
1363
+ font-size: 12px;
1364
+ @media (min-width: 1100px) {
1365
+ padding: 2px 18px 5px 18px;
1366
+ }
1367
+ span {
1368
+ font-size: 12px;
1369
+ }
1370
+ }
1371
+ .Players {
1372
+ display: inline-block;
1373
+ width: 19px;
1374
+ height: 19px;
1375
+ }
1376
+ }
1377
+ </style>