@everymatrix/casino-games-category-section 1.44.0 → 1.45.0

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,1428 +0,0 @@
1
- <svelte:options tag={null} />
2
-
3
- <script lang="ts">
4
- import { onMount } from "svelte";
5
- import { platformFavorite, getDevice, isMobile } from 'rvhelper';
6
- import { _, addNewMessages, setLocale } from './i18n';
7
- import type { CategoryData } from './CasinoGamesCategorySection.type';
8
- import { TRANSLATIONS } from './translations';
9
- import moment from 'moment';
10
-
11
- import '@everymatrix/casino-game-thumbnail';
12
- import '@everymatrix/casino-filter';
13
- import '@everymatrix/casino-sort';
14
-
15
- const MASONRY_CLASS_PREFIX = 'game-tile-';
16
-
17
- export let endpoint:string = '';
18
- export let datasource:string = '';
19
- export let lang:string = ''; // Language
20
- export let session:string = ''; // Value for sessionID
21
- export let userid:string = ''; // Value for UserID;
22
- export let favorites:string = '';
23
- export let clientstyling:string = '';
24
- export let clientstylingurl:string = '';
25
- export let translationurl:string = '';
26
- export let currency:string = '';
27
-
28
- export let categoryid:string = '';
29
- export let showgamename:string = '';
30
- export let livecasino:string = 'false';
31
- export let gamepagemodalurl:string = 'true';
32
- export let integratedgameframedesktop:string = 'false';
33
- export let integratedgameframemobile:string = 'false';
34
- export let casinomygames:string = 'false';
35
- export let addfilterselector:string = 'false';
36
- export let addsortingselector:string = 'false';
37
- export let filterbylogo:string = '';
38
- export let casinogamesgridslider:string = 'false';
39
- export let fetchviaevent:string = 'false';
40
- export let showallpage:string = 'casino';
41
- export let actionevent:string = 'CategoryChange';
42
- export let displayedgamecount:string = '10';
43
- export let showallbuttongamescount: string = '10';
44
-
45
- //Revert manually
46
- // let livelobbyendpoint = `${endpoint}/lobby/tables`;
47
-
48
- // CasinoPage loading state
49
- let isLoading:boolean = true;
50
- let hasErrors:boolean = false;
51
- let sessionID:string;
52
- let playerID:string;
53
-
54
- let lobbyView:boolean = true;
55
-
56
-
57
- let userAgent = window.navigator.userAgent;
58
-
59
- let operatorSpecifications:Object;
60
- let categoryData:CategoryData;
61
- let shownCategoryData = [];
62
- let showLoadCategory:boolean = true;
63
- let offset:number = 0;
64
- let limit:number = 40;
65
- let searched:boolean = false;
66
- let recentSearched:boolean = false;
67
- let scrollTop:boolean = false;
68
- let searchItem:boolean = false;
69
- let presentFilters:boolean = false;
70
- let showItems:boolean = true;
71
-
72
- /* Start Lazy Loading */
73
- let nativeLoading:boolean = true;
74
- let intersecting:boolean = false;
75
- let isLazyLoading:boolean = false;
76
- let container:any;
77
- let maxTotal:number;
78
- let categoryName:HTMLElement;
79
- let showFavGamesCategory:boolean = false;
80
- let customStylingContainer:HTMLElement;
81
- let validObservers:boolean = false;
82
-
83
- let thumbnailContainer:Array<HTMLElement> = new Array(10000);
84
- let intersectingIndexes:Object = {};
85
- let visibilityconnect:string = '';
86
- let sortedBy:string = '';
87
- let hidden;
88
- let visibilityChange;
89
- let dataloaded;
90
-
91
- let favoriteGames:Array<Object>;
92
- let listOfGamesIDs:Array<string> = [];
93
-
94
- let abortController = new AbortController();
95
-
96
- let favoriteGamesData:any = {
97
- items: [],
98
- count: 0,
99
- name: ''
100
- };
101
- /* End Lazy Loading */
102
-
103
- const setTranslationUrl = ():void => {
104
- let url:string = translationurl;
105
-
106
- fetch(url).then((res:any) => res.json())
107
- .then((res) => {
108
- Object.keys(res).forEach((item:any):void => {
109
- addNewMessages(item, res[item]);
110
- });
111
- }).catch((err:any) => {
112
- console.log(err);
113
- });
114
- }
115
-
116
- Object.keys(TRANSLATIONS).forEach((item) => {
117
- addNewMessages(item, TRANSLATIONS[item]);
118
- });
119
-
120
- if (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support
121
- hidden = 'hidden';
122
- visibilityChange = 'visibilitychange';
123
- } else if (typeof document.msHidden !== 'undefined') {
124
- hidden = 'msHidden';
125
- visibilityChange = 'msvisibilitychange';
126
- } else if (typeof document.webkitHidden !== 'undefined') {
127
- hidden = 'webkitHidden';
128
- visibilityChange = 'webkitvisibilitychange';
129
- }
130
-
131
- // IntersectionObserver used for loading more games
132
- let observer = new IntersectionObserver((entries) => {
133
- entries.forEach(async (entry) => {
134
- let gameid = entry.target.gameid; // eslint-disable-line
135
- let index = entry.target.elems_index; // eslint-disable-line
136
-
137
- if (entry.isIntersecting) {
138
- if (index * 1.2 > limit ) {
139
- loadMoreGames(categoryid);
140
- }
141
- intersectingIndexes[gameid] = 1;
142
- } else {
143
- intersectingIndexes[gameid] = 0;
144
- }
145
- });
146
- });
147
-
148
- // Start favored games section
149
- const getFavoritesGames = (sessionID:string, playerID:string) => {
150
- let url = `${endpoint}/v1/player/${playerID}/favorites/`;
151
- isLoading = true;
152
- let options = {
153
- method: "GET",
154
- headers: {
155
- 'X-SessionID': sessionID,
156
- }
157
- };
158
-
159
- return new Promise((resolve, reject) => {
160
- fetch(url, options)
161
- .then((res:any) => res.json())
162
- .then((updatedArray:any) => {
163
- isLoading = false;
164
- favoriteGames = [];
165
- if (updatedArray) {
166
- updatedArray.items.forEach((item: any) => {
167
- if (item.gameModel) {
168
- favoriteGames.push(item);
169
- if (!listOfGamesIDs.includes(item.id)) {
170
- listOfGamesIDs.push(item.id);
171
- }
172
- }
173
- });
174
- window.postMessage({ type: 'UpdateFavoritesCount', favoriteGames});
175
- } else {
176
- favoriteGames = [];
177
- }
178
-
179
- if(categoryid === 'FAVORITES') showFavoriteSection(favoriteGames);
180
-
181
- shownCategoryData.forEach((item) => {
182
- item.isFavorite = checkFavorite(item.id);
183
- });
184
-
185
- let aux:any = shownCategoryData;
186
- shownCategoryData = undefined;
187
- shownCategoryData = aux;
188
-
189
- resolve(favoriteGames);
190
-
191
- }).catch((err:any) => {
192
- console.error(err);
193
- reject(err);
194
- });
195
- });
196
- }
197
-
198
- // @TODO categoryId type
199
- const getData = (categoryid:any, offset:number, limit:number) => {
200
- if (abortController) {
201
- abortController.abort();
202
- }
203
-
204
- abortController = new AbortController();
205
- const signal = abortController.signal;
206
-
207
- isLoading = true;
208
- let categoryidparsed = '';
209
- let url:any = '';
210
- let vendorFilters = JSON.parse(localStorage.getItem('vendorFiltersByCategory'));
211
- let vendorSort = JSON.parse(localStorage.getItem('vendorSortingBy'));
212
-
213
- if((categoryid.match(/\$/g) || []).length > 1) {
214
- categoryidparsed = categoryid.split('$').slice(0, 2).join('$');
215
- url = new URL(`${endpoint}/v1/casino/groups/${datasource}/${categoryidparsed}/subGroups`);
216
- } else {
217
- url = new URL(`${endpoint}/v1/casino/groups/${datasource}/${categoryid}`);
218
- }
219
-
220
- return new Promise((resolve, reject) => {
221
- url.searchParams.delete("pagination");
222
- url.searchParams.append("expand", "games(vendor)");
223
- url.searchParams.append("fields", "id,name,games");
224
- url.searchParams.append("platform", getDevice(userAgent));
225
- url.searchParams.append("pagination", `games(offset=${offset},limit=${limit})`);
226
- url.searchParams.append('language', lang);
227
-
228
- // if vendor filters are active, get filtered games
229
- window.postMessage({ type: 'CategoryVendors', categoryid }, window.location.href);
230
-
231
- if (vendorFilters) {
232
- if (vendorFilters[categoryid]) {
233
- if (vendorFilters[categoryid].length && lobbyView === false && showFavGamesCategory === false) {
234
- let queryParamVendorId:string = '';
235
-
236
- presentFilters = true;
237
- vendorFilters[categoryid].forEach(vendorId => {
238
- queryParamVendorId = queryParamVendorId + (queryParamVendorId ? `,games(vendor(id=${vendorId}))` : `games(vendor(id=${vendorId}))`);
239
- });
240
-
241
- url.searchParams.append('filter', `${queryParamVendorId}`);
242
- } else {
243
- presentFilters = false;
244
- }
245
- }
246
- }
247
-
248
- if(vendorSort){
249
- if (vendorSort[categoryid]) {
250
- if (vendorSort[categoryid] && vendorSort[categoryid]!= 'All') {
251
- if(vendorSort[categoryid] == 'isNew' || vendorSort[categoryid] == 'advancedTags(name(hot))'){
252
- url.searchParams.append('sortedField', `games(${vendorSort[categoryid]})`);
253
- url.searchParams.append('orderBy', `DES`);
254
- } else {
255
- url.searchParams.append('sortedField', `games(${vendorSort[categoryid]})`);
256
- }
257
- }
258
- } else {
259
- if (sortedBy && sortedBy!= 'All') {
260
- if(sortedBy == 'advancedTags(name(hot))' || sortedBy == 'isNew'){
261
- url.searchParams.append('sortedField', `games(${sortedBy})`);
262
- url.searchParams.append('orderBy', `DES`);
263
- } else {
264
- url.searchParams.append('sortedField', `games(${sortedBy})`);
265
- }
266
- }
267
- }
268
- }
269
-
270
- fetch(url, { signal })
271
- .then((res:any) => res.json())
272
- .then((categoryData:any) => {
273
- if (!signal.aborted) {
274
- isLoading = false;
275
- if((categoryid.match(/\$/g) || []).length > 1) {
276
- categoryData = categoryData.items.filter(subcategory => {
277
- if(subcategory.id == categoryid) return subcategory;
278
- })[0];
279
- }
280
-
281
- dataloaded = true;
282
- hasErrors = false;
283
- maxTotal = categoryData.games.total;
284
-
285
- isLazyLoading = true;
286
- resolve(categoryData);
287
- }
288
- })
289
- .catch((err) => {
290
- if (err.name !== 'AbortError') {
291
- hasErrors = true;
292
- console.error(err);
293
- reject(err);
294
- }
295
- });
296
- });
297
- }
298
-
299
- //Standalone fetching games using categoryid when fetchviaevent is false
300
- const fetchGamesByCategory = (categoryid, displayedgamecount, showallbuttongamescount) => {
301
- if(categoryid !== ''){
302
- searched = false;
303
- lobbyView = true;
304
- addfilterselector = 'false';
305
- addsortingselector = 'false';
306
- searchItem = false;
307
- validObservers = false;
308
-
309
- showLoadCategory = (+displayedgamecount > +showallbuttongamescount);
310
-
311
- getData(categoryid, 0, +displayedgamecount).then((res:any) => {
312
- categoryData = res;
313
- shownCategoryData = categoryData.games.items;
314
- if (shownCategoryData) {
315
- shownCategoryData.forEach((item:any) => {
316
- item.isFavorite = checkFavorite(item.id);
317
- });
318
- }
319
- });
320
- }
321
- }
322
-
323
- const messageHandler = (e:any) => {
324
- if (e.data) {
325
- switch(e.data.type) {
326
- case 'MostPlayedData':
327
- if(categoryid == 'MOSTPLAYED') {
328
- searched = false;
329
- lobbyView = false;
330
- showLoadCategory = false;
331
- shownCategoryData = e.data.mostPlayedGames;
332
- categoryData = {
333
- id: 'MOSTPLAYED',
334
- name: 'Most Played Games',
335
- games: {
336
- count: e.data.mostPlayedGames.length,
337
- total: e.data.mostPlayedGames.length,
338
- items: e.data.mostPlayedGames
339
- }
340
- };
341
- }
342
- isLoading = false;
343
- break;
344
-
345
- case 'LastPlayedData':
346
- if (categoryid == 'LASTPLAYED') {
347
- searched = false;
348
- lobbyView = false;
349
- showLoadCategory = false;
350
- shownCategoryData = e.data.lastPlayedGames;
351
- categoryData = {
352
- id: 'LASTPLAYED',
353
- name: 'Last Played Games',
354
- games: {
355
- count: e.data.lastPlayedGames.length,
356
- total: e.data.lastPlayedGames.length,
357
- items: e.data.lastPlayedGames
358
- }
359
- };
360
- }
361
- isLoading = false;
362
- break;
363
-
364
- case 'CustomOperatorData':
365
- operatorSpecifications = e.data.operatordetail;
366
- break;
367
-
368
- case "RecentSearchData":
369
- searched = true;
370
- recentSearched = true;
371
- if (e.data.searchData.length > 0) {
372
- shownCategoryData = e.data.searchData;
373
- showItems = true;
374
- if (shownCategoryData) {
375
- shownCategoryData.forEach((item:any) => {
376
- item.isFavorite = checkFavorite(item.id);
377
- });
378
- }
379
- } else {
380
- shownCategoryData = [];
381
- showItems = false;
382
- }
383
- break;
384
-
385
- case 'OutOfRecentSearches':
386
- searched = false;
387
- recentSearched = false;
388
- break;
389
-
390
- case "SearchData":
391
- searched = true;
392
- recentSearched = false;
393
- shownCategoryData = e.data.searchData.items || [];
394
- searchItem = true;
395
- if (e.data.receivedFavoriteResults) {
396
- favoriteGames = e.data.receivedFavoriteResults.items;
397
- }
398
- if (shownCategoryData) {
399
- shownCategoryData.forEach((item:any) => {
400
- item.isFavorite = checkFavorite(item.id);
401
- });
402
- }
403
- break;
404
-
405
- case `CategoryData_${categoryid}`:
406
- searched = false;
407
- lobbyView = true;
408
- addfilterselector = 'false';
409
- addsortingselector = 'false';
410
- searchItem = false;
411
- validObservers = false;
412
- if (e.data.receivedFavoriteResults) {
413
- favoriteGames = e.data.receivedFavoriteResults.items;
414
- }
415
- getData(e.data.categoryId, 0, e.data.visiblegames).then((res:any) => {
416
- categoryData = res;
417
- shownCategoryData = categoryData.games.items;
418
- maxTotal <= e.data.visiblegames ? showLoadCategory = false : showLoadCategory = true;
419
-
420
- if (shownCategoryData) {
421
- shownCategoryData.forEach((item:any) => {
422
- item.isFavorite = checkFavorite(item.id);
423
- });
424
- }
425
- });
426
- break;
427
-
428
- case 'CategoryChange':
429
- limit = 20;
430
- break;
431
-
432
- case 'ApplySorter':
433
- categoryid = e.data.itemId;
434
- sortedBy = e.data.sortBy;
435
-
436
- getData(categoryid, 0, limit).then((res:any) => {
437
- categoryData = res;
438
- shownCategoryData = categoryData.games.items;
439
- showLoadCategory = false;
440
- });
441
- break;
442
-
443
- case 'CategoryUpdate':
444
- categoryUpdateHandler(e.data.itemId);
445
- break;
446
-
447
- case `SetUnfavoredGame${categoryid}`:
448
- removeFavoredGame(`${endpoint}/v1/player/${userid}/favorites`, session, e.data.id);
449
- break;
450
-
451
- case `SetFavoredGame${categoryid}`:
452
- addFavoredGame(`${endpoint}/v1/player/${userid}/favorites`, session, e.data.id);
453
- break;
454
-
455
- case 'UserSessionID':
456
- sessionID = e.data.session;
457
- playerID = e.data.userID;
458
- if (favorites == 'true') {
459
- if (playerID && playerID.length && sessionID && sessionID.length > 0) {
460
- getFavoritesGames(sessionID, playerID);
461
- }
462
- }
463
- break;
464
-
465
- case 'UpdateFavoredList':
466
- if(categoryid === 'FAVORITES') updateFavoredList(e.data.url, e.data.sessionID)
467
- break;
468
-
469
- default:
470
- // do nothing
471
- break;
472
- }
473
- }
474
- }
475
-
476
- const categoryUpdateHandler = (itemId:string):void => {
477
- searched = false;
478
- lobbyView = false;
479
- searchItem = false;
480
- validObservers = true;
481
- isLazyLoading = false;
482
- categoryid = itemId;
483
- if (categoryid !== 'MOSTPLAYED') {
484
- showLoadCategory = false;
485
- }
486
- if(casinomygames !== 'true') {
487
- getData(categoryid, 0, limit).then((res:any) => {
488
- categoryData = res;
489
- categoryData.games.items.forEach((item:any) => {
490
- item.isFavorite = checkFavorite(item.id);
491
- });
492
- shownCategoryData = categoryData.games.items;
493
- showLoadCategory = false;
494
- // @TODO: replace this quick fix - when there are only a few category games, the view scrolls to the footer
495
- if(shownCategoryData.length < 10 && e.data.origin ==! 'filters') {
496
- scrollTop = true;
497
- setTimeout(() => {
498
- window.postMessage({ type: 'WidgetTopReference', scrollTop }, window.location.href);
499
- }, 500);
500
- }
501
- });
502
- }
503
- }
504
-
505
- const addFavoriteState = () => {
506
- if(categoryData) {
507
- shownCategoryData = categoryData.games.items;
508
- shownCategoryData.forEach((item:any) => {
509
- item.isFavorite = checkFavorite(item.id);
510
- });
511
- }
512
- }
513
-
514
- //Adding fav. statement to variables
515
- const checkFavorite = (gameId: string) => favoriteGames?.some(obj => obj.id === gameId) ?? false;
516
-
517
- let addFavoredGame = async (url, sessionID, gameID) => {
518
- // Wait for the updateFavoredList to complete
519
- await updateFavoredList(url, sessionID);
520
-
521
- if (!listOfGamesIDs.includes(gameID)) {
522
- listOfGamesIDs.push(gameID);
523
- }
524
-
525
- let data = {
526
- items: listOfGamesIDs
527
- };
528
-
529
- let options = {
530
- method: "POST",
531
- headers: {
532
- 'X-SessionID': sessionID,
533
- 'Content-Type': 'application/json',
534
- 'Accept': 'application/json',
535
- },
536
- body: JSON.stringify(data)
537
- };
538
-
539
- fetch(url, options)
540
- .then((res) => res.json())
541
- .then(() => {
542
- window.postMessage({ type: `AddFavoriteThumbnail_${gameID}` }, window.location.href);
543
- })
544
- .catch((err) => {
545
- console.error('Err', err);
546
- });
547
- }
548
-
549
- const removeFavoredGame = (url:string, sessionID:string, gameID:string) => {
550
- let options = {
551
- method: "DELETE",
552
- headers: {
553
- 'X-SessionID': sessionID,
554
- }
555
- };
556
-
557
- fetch(`${url}/${gameID}`, options)
558
- .then((res:any) => res.json())
559
- .then(() => {
560
- window.postMessage({ type: `RemoveFavoriteThumbnail_${gameID}` }, window.location.href);
561
- updateFavoredList(url, sessionID);
562
- });
563
-
564
- if (listOfGamesIDs.includes(gameID)) {
565
- listOfGamesIDs = listOfGamesIDs.filter(x => {
566
- return x != gameID;
567
- });
568
- }
569
- }
570
-
571
- //Fetch fav list and pass to be updated
572
- const updateFavoredList = async (url, sessionID) => {
573
- let options = {
574
- method: "GET",
575
- headers: {
576
- 'X-SessionID': sessionID,
577
- }
578
- };
579
-
580
- return fetch(url, options)
581
- .then((res:any) => res.json())
582
- .then((updatedArray:any) => {
583
- favoriteGames = updatedArray.items;
584
- if (!fetchviaevent) {
585
- favoriteGames.forEach((item: any) => {
586
- item.isFavorite = checkFavorite(item.id);
587
- });
588
- } else {
589
- favoriteGames.forEach((item: any) => {
590
- if (!listOfGamesIDs.includes(item.id)) {
591
- listOfGamesIDs.push(item.id);
592
- }
593
- })
594
- addFavoriteState();
595
- }
596
-
597
- if (categoryid === 'FAVORITES') { window.postMessage({ type: 'UpdateFavoritesCount', favoriteGames }); showFavoriteSection(favoriteGames); }
598
-
599
- }).catch((err:any) => {
600
- console.error(err);
601
- });
602
- }
603
-
604
- const showFavoriteSection = (receivedFavoriteResults) => {
605
- if (!receivedFavoriteResults) return;
606
- let favGameArray;
607
- favGameArray = receivedFavoriteResults?.items || receivedFavoriteResults || [];
608
- if (favGameArray.length > 0) {
609
- favGameArray.forEach((item: any) => {
610
- if (item.gameModel) {
611
- item.gameModel.isFavorite = true;
612
- }
613
- });
614
- }
615
- favoriteGamesData.items = platformFavorite(favGameArray, favoriteGamesData.items);
616
- favoriteGamesData.name = "Favorites";
617
- isLoading = false;
618
- }
619
-
620
- // @TODO categoryId type fix
621
- const loadMoreGames = (categoryId:any) => {
622
- limit += 1;
623
- isLazyLoading = true;
624
-
625
- if (limit <= maxTotal) {
626
- getData(categoryId, offset, limit).then((res:any) => {
627
- categoryData = res;
628
- // @TODO categoryData type fix
629
- /**
630
- * This check is needed to prevent requests with less items
631
- * that started before but ended after the last request to add items to list
632
- * This could also use abort controller instead but refactoring is needed
633
- */
634
- if(categoryData.games.items.length > shownCategoryData.length){
635
- shownCategoryData = categoryData.games.items;
636
- shownCategoryData.forEach((item:any) => {
637
- item.isFavorite = checkFavorite(item.id);
638
- });
639
- }
640
- isLazyLoading = false;
641
- });
642
- }
643
- }
644
-
645
- const addGameTag = (tags:any[]):string => {
646
- if (tags?.length === 0) return '';
647
-
648
- let tagName:string = '';
649
- let differenceOfTime = 999999999999;
650
- let firstToExpire:number;
651
-
652
- const currentDate = new Date(Date.now());
653
-
654
- tags.forEach((tag, index)=> {
655
- const startDateOfTag = new Date(tag.schedules[0].startTime);
656
- const endDateOfTag = new Date(tag.schedules[0].endTime);
657
-
658
- if (moment(endDateOfTag).diff(currentDate) < differenceOfTime) {
659
- differenceOfTime = moment(endDateOfTag).diff(currentDate)
660
- firstToExpire = index;
661
- }
662
-
663
- if (moment(currentDate).isAfter(startDateOfTag) && moment(currentDate).isBefore(endDateOfTag)) {
664
- tagName = tags[firstToExpire].name;
665
- }
666
- });
667
- return tagName;
668
- }
669
-
670
- // @TODO categoryId type fix
671
- const showCategory = (categoryId:any) => {
672
- window.postMessage({ type: `${actionevent}`, itemId: categoryId, showallpage}, window.location.href);
673
- }
674
-
675
- const initialSetup = () => {
676
- // showFavGamesCategory vs categoryData
677
- // favoriteGamesData vs shownCategoryData
678
- switch(categoryid) {
679
- case 'FAVORITES':
680
- if (userid && session) showFavGamesCategory = true;
681
- break;
682
- case 'MOSTPLAYED':
683
- if(casinomygames === 'false' && userid && session) {
684
- showFavGamesCategory = false;
685
- }
686
- break;
687
- case 'LASTPLAYED':
688
- if(casinomygames === 'false' && userid && session) {
689
- showFavGamesCategory = false;
690
- }
691
- break;
692
- default:
693
- categoryUpdateHandler(categoryid);
694
- break;
695
- }
696
- }
697
-
698
- const handleVisibilityChange = () => {
699
- if (!document[hidden]) {
700
- visibilityconnect = 'connect';
701
- } else {
702
- visibilityconnect = 'disconnect';
703
- }
704
- }
705
-
706
- const setupObserver = () => {
707
- if (validObservers) {
708
- thumbnailContainer.forEach((item, index) => {
709
- if (item) {
710
- // Hack to make sure that I can identify the thumbnail index
711
- item.elems_index = index;
712
- observer.observe(item);
713
- }
714
- });
715
- }
716
- }
717
-
718
- const setActiveLanguage = ():void => {
719
- setLocale(lang);
720
- }
721
-
722
- const setClientStyling = ():void => {
723
- let sheet = document.createElement('style');
724
- sheet.innerHTML = clientstyling;
725
- customStylingContainer.appendChild(sheet);
726
- }
727
-
728
- const setClientStylingURL = ():void => {
729
- let url:URL = new URL(clientstylingurl);
730
- let cssFile:HTMLElement = document.createElement('style');
731
-
732
- fetch(url.href)
733
- .then((res:any) => res.text())
734
- .then((data:any) => {
735
- cssFile.innerHTML = data
736
-
737
- setTimeout(() => { customStylingContainer.appendChild(cssFile) }, 1);
738
- });
739
- }
740
-
741
- onMount(() => {
742
- window.addEventListener('visibilitychange', (e) => handleVisibilityChange())
743
- window.addEventListener('message', messageHandler, false);
744
-
745
-
746
- return () => {
747
- window.removeEventListener('message', messageHandler);
748
- window.removeEventListener('visibilitychange', messageHandler);
749
- }
750
- });
751
-
752
- $: lang && setActiveLanguage();
753
- //Widget is working as standalone when fetchviaevent isn't set
754
- $: (fetchviaevent === 'false' || fetchviaevent === '') && endpoint && lang && categoryid && datasource && displayedgamecount && showallbuttongamescount && fetchGamesByCategory(categoryid, displayedgamecount, showallbuttongamescount);
755
- //Call the fav. list fetch when widget is standalone
756
- $: favorites === 'true' && endpoint && session && userid && getFavoritesGames(session, userid);
757
- $: dataloaded && thumbnailContainer && setupObserver();
758
- $: lang && categoryid && initialSetup();
759
- $: translationurl && setTranslationUrl();
760
- $: clientstyling && customStylingContainer && setClientStyling();
761
- $: clientstylingurl && customStylingContainer && setClientStylingURL();
762
- </script>
763
-
764
- <div class="CasinoGamesCategorySectionContainer" bind:this={customStylingContainer}>
765
- {#if hasErrors}
766
- <!-- @TODO diversify error handling -->
767
- {#if presentFilters}
768
- <p class="SearchLoading">404 Error - No result found.</p>
769
- {:else}
770
- <p class="SearchLoading">500 Error - Internal Server Error.</p>
771
- {/if}
772
- {:else}
773
- {#if searched}
774
- <div class="CasinoGamesContainer">
775
- <div class="CasinoGamesHeader Searched {isMobile(userAgent) ? 'CasinoGamesHeaderMobile' : ''}">
776
- {#if recentSearched}
777
- <h3 class="StatusText">
778
- {$_('recentSearchedItems')}
779
- </h3>
780
- {:else}
781
- {#if !shownCategoryData.length}
782
- <h3 class="StatusText">
783
- {$_('noResults')}
784
- </h3>
785
- {:else}
786
- <h3 class="StatusText">
787
- {$_('searchedItems')}
788
- </h3>
789
- {/if}
790
- {/if}
791
- </div>
792
- {#if shownCategoryData}
793
-
794
- {#if !showItems}
795
- <p class="NoSearchResults NoRecentSearches NoRecentSearchesCenter {isMobile(userAgent) ? 'NoRecentSearchesMobile' : ''}">{$_('noRecentSearch')}</p>
796
- {/if}
797
- <ul class="CasinoGamesGrid SearchedGamesGrid GamesListIncreasedGap">
798
- {#each shownCategoryData as gameprops, index}
799
- <casino-game-thumbnail
800
- class="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
801
- part="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
802
- session={session}
803
- userid={userid}
804
- lang={lang}
805
- searchitem={searchItem}
806
- favorites={favorites}
807
- categoryid={categoryid}
808
- gamethumbnail={gameprops.thumbnail}
809
- gamename={gameprops.name}
810
- gamevendor={gameprops.vendor.displayName}
811
- gameLaunchUrl={gameprops.launchUrl}
812
- gameisnew={gameprops.isNew}
813
- gametag={gameprops.advancedTags?.length > 0 && addGameTag(gameprops.advancedTags)}
814
- gamecellsize={gameprops.cellSize}
815
- gameid={gameprops.id}
816
- gamefunmode={gameprops.hasFunMode}
817
- {showgamename}
818
- {translationurl}
819
- gamefavorite={gameprops.isFavorite}
820
- {currency}
821
- livelobbyendpoint={gameprops.details ? gameprops.href : ''}
822
- {clientstyling}
823
- {clientstylingurl}
824
- {endpoint}
825
- {livecasino}
826
- {gamepagemodalurl}
827
- {integratedgameframedesktop}
828
- {integratedgameframemobile}
829
- ></casino-game-thumbnail>
830
- {/each}
831
- </ul>
832
- {:else}
833
- <p class="SearchWaiting">Waiting</p>
834
- {/if}
835
- </div>
836
- {:else}
837
- <div>
838
- {#if categoryData}
839
- <div class="CasinoGamesContainer">
840
- {#if casinomygames !== 'true'}
841
- <div class="CasinoGamesHeader">
842
- <h3 class="CategoryName" bind:this={categoryName}>
843
- {categoryData.name}
844
- </h3>
845
- {#if showLoadCategory}
846
- <!-- svelte-ignore a11y-missing-attribute -->
847
- <a class="CategoryNameLink" on:click="{e => showCategory(categoryData.id, categoryData)}">
848
- <span class="CategoryLoadMore">
849
- {$_('viewAll')} ({categoryData.games.total})
850
- </span>
851
- </a>
852
- {:else}
853
- <div class="{(addfilterselector == 'true' && addsortingselector == 'true') ? 'CategoryFilterContainer' : ''}">
854
- {#if addfilterselector == "true"}
855
- <casino-filter
856
- {clientstylingurl}
857
- {clientstyling}
858
- {endpoint}
859
- {datasource}
860
- {lang}
861
- {categoryid}
862
- {addfilterselector}
863
- {addsortingselector}
864
- {filterbylogo}>
865
- </casino-filter>
866
- {/if}
867
- {#if addsortingselector == "true"}
868
- <casino-sort
869
- {clientstylingurl}
870
- {clientstyling}
871
- {lang}
872
- {categoryid}
873
- {addsortingselector}>
874
- </casino-sort>
875
- {/if}
876
- </div>
877
- {/if}
878
- </div>
879
- {/if}
880
- {#if isLoading && !isLazyLoading}
881
- <div class="lds-dual-ring" part="lds-dual-ring"></div>
882
- {:else}
883
- {#if shownCategoryData.length !== 0 }
884
- <ul class="{(favoriteGamesData.items.length === 0 && showFavGamesCategory) ? '' : 'CasinoGamesGrid'} {(lobbyView && casinogamesgridslider == 'true') ? 'CasinoGamesGridSlider CustomScroll' : '' } GamesListIncreasedGap" bind:this={container}>
885
- {#each shownCategoryData as gameprops, index}
886
- {#if intersecting || nativeLoading}
887
- <casino-game-thumbnail
888
- session={session}
889
- userid={userid}
890
- lang={lang}
891
- class="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
892
- part="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
893
- favorites={favorites}
894
- categoryid={categoryid}
895
- gamethumbnail={gameprops.thumbnail}
896
- gamename={gameprops.name}
897
- gamevendor={gameprops.vendor.displayName}
898
- gameLaunchUrl={gameprops.launchUrl}
899
- gameisnew={gameprops.isNew}
900
- gametag={gameprops.advancedTags?.length > 0 && addGameTag(gameprops.advancedTags)}
901
- gamecellsize={gameprops.cellSize}
902
- gameid={gameprops.id}
903
- gamefunmode={gameprops.hasFunMode}
904
- gamefavorite={gameprops.isFavorite}
905
- {translationurl}
906
- {showgamename}
907
- bind:this={thumbnailContainer[index]}
908
- connectlive={intersectingIndexes[gameprops.id] == 1 ? 'connect' : 'disconnect'}
909
- visibilityconnect={visibilityconnect}
910
- {currency}
911
- livelobbyendpoint={gameprops.details ? gameprops.href : ''}
912
- {clientstyling}
913
- {clientstylingurl}
914
- {endpoint}
915
- {livecasino}
916
- {gamepagemodalurl}
917
- {integratedgameframedesktop}
918
- {integratedgameframemobile}
919
- {casinogamesgridslider}
920
- ></casino-game-thumbnail>
921
- {/if}
922
- {/each}
923
- </ul>
924
- {:else}
925
- <p class="NoSearchResults">{$_('noResults')}</p>
926
- {/if}
927
- {/if}
928
- </div>
929
- {:else if showFavGamesCategory}
930
- <div class="CasinoGamesContainer">
931
- {#if casinomygames !== 'true'}
932
- <div class="CasinoGamesHeader">
933
- <h3 class="CategoryName" bind:this={categoryName}>
934
- {$_('favorites')}
935
- <span class="CategoryFavName">({favoriteGamesData.items.length})</span>
936
- </h3>
937
- </div>
938
- {/if}
939
-
940
- <ul class="{(favoriteGamesData.items.length != 0) ? 'CasinoGamesGrid' : ''} 'GamesListIncreasedGap'}" bind:this={container}>
941
- {#if isLoading && !isLazyLoading}
942
- <div class="lds-dual-ring"></div>
943
- {:else}
944
- {#if favoriteGamesData}
945
- {#each favoriteGamesData.items as gameprops, index}
946
- {#if gameprops.gameModel}
947
- {#if gameprops.gameModel.isFavorite}
948
- {#if intersecting || nativeLoading}
949
- {#if isMobile(userAgent)}
950
- {#if (gameprops.gameModel.platform.includes("iPad") || gameprops.gameModel.platform.includes("iPhone") || gameprops.gameModel.platform.includes("Android"))}
951
- <casino-game-thumbnail
952
- class="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
953
- part="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
954
- session={session}
955
- userid={userid}
956
- lang={lang}
957
- favorites={favorites}
958
- categoryid={categoryid}
959
- gamethumbnail={gameprops.gameModel.thumbnail}
960
- gamename={gameprops.gameModel.name}
961
- gamevendor={gameprops.gameModel.vendor.displayName}
962
- gameLaunchUrl={gameprops.launchUrl}
963
- gameisnew={gameprops.gameModel.isNew}
964
- gametag={gameprops.gameModel.advancedTags?.length > 0 && addGameTag(gameprops.gameModel.advancedTags)}
965
- gamecellsize={gameprops.cellSize}
966
- gameid={gameprops.gameModel.id}
967
- gamefunmode={gameprops.gameModel.hasFunMode}
968
- {showgamename}
969
- gamefavorite={gameprops.gameModel.isFavorite}
970
- showfavoredcategory={showFavGamesCategory}
971
- connectlive={intersectingIndexes[gameprops.id] == 1 ? 'connect' : 'disconnect'}
972
- visibilityconnect={visibilityconnect}
973
- {translationurl}
974
- {currency}
975
- livelobbyendpoint={gameprops.gameModel.details ? gameprops.gameModel.launchUrl : ''}
976
- {clientstyling}
977
- {clientstylingurl}
978
- {endpoint}
979
- {livecasino}
980
- {gamepagemodalurl}
981
- {integratedgameframedesktop}
982
- {integratedgameframemobile}
983
- ></casino-game-thumbnail>
984
- {/if}
985
- {:else if gameprops.gameModel.platform.includes("PC")}
986
- <casino-game-thumbnail
987
- class="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
988
- part="{MASONRY_CLASS_PREFIX}{gameprops.cellSize ? gameprops.cellSize : '1x1'}"
989
- session={session}
990
- userid={userid}
991
- lang={lang}
992
- {translationurl}
993
- favorites={favorites}
994
- categoryid={categoryid}
995
- gamethumbnail={gameprops.gameModel.thumbnail}
996
- gamename={gameprops.gameModel.name}
997
- gamevendor={gameprops.gameModel.vendor.displayName}
998
- gameLaunchUrl={gameprops.launchUrl}
999
- gameisnew={gameprops.gameModel.isNew}
1000
- gametag={gameprops.gameModel.advancedTags?.length > 0 && addGameTag(gameprops.gameModel.advancedTags)}
1001
- gamecellsize={gameprops.cellSize}
1002
- gameid={gameprops.gameModel.id}
1003
- gamefunmode={gameprops.gameModel.hasFunMode}
1004
- {showgamename}
1005
- gamefavorite={gameprops.gameModel.isFavorite}
1006
- showfavoredcategory={showFavGamesCategory}
1007
- connectlive={intersectingIndexes[gameprops.id] == 1 ? 'connect' : 'disconnect'}
1008
- visibilityconnect={visibilityconnect}
1009
- {currency}
1010
- livelobbyendpoint={gameprops.gameModel.details ? gameprops.gameModel.launchUrl : ''}
1011
- {clientstyling}
1012
- {clientstylingurl}
1013
- {endpoint}
1014
- {livecasino}
1015
- {gamepagemodalurl}
1016
- {integratedgameframedesktop}
1017
- {integratedgameframemobile}
1018
- ></casino-game-thumbnail>
1019
- {/if}
1020
- {/if}
1021
- {/if}
1022
- {/if}
1023
- {:else}
1024
- <p class="NoFavoriteGames {isMobile(userAgent) ? 'NoFavoriteGamesMobile' : ''}">
1025
- <svg width="198" height="148" viewBox="0 0 198 148" fill="none" xmlns="http://www.w3.org/2000/svg">
1026
- <rect x="1" y="18.053" width="90.263" height="90.263" rx="12" stroke="var(--emfe-w-color-gray-150, #828282)" stroke-width="1.5"/>
1027
- <rect x="106.737" y="56.737" width="90.263" height="90.263" rx="12" stroke="var(--emfe-w-color-gray-150, #828282)" stroke-width="1.5"/>
1028
- <circle cx="70.5" cy="32.237" r="31.487" stroke="var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C))" stroke-width="1.5" stroke-dasharray="5 0"/>
1029
- <path d="M153.909 81.631a.747.747 0 0 0-.166-1.046l-5.466-3.954a.751.751 0 0 0-.882 1.214l4.859 3.514-3.529 4.858a.75.75 0 1 0 1.215.878l3.969-5.464zm-.725-1.18c-.501.081-.999.159-1.493.233l.223 1.482c.498-.075 1-.153 1.506-.234l-.236-1.48zm-4.457.654c-1.006.133-1.996.253-2.97.36l.162 1.49c.985-.109 1.986-.23 3.002-.364l-.194-1.486zm-5.944.65c-1.01.085-2.002.155-2.978.209l.081 1.496c.991-.054 1.997-.125 3.021-.212l-.124-1.493zm-5.955.326c-1.009.022-2 .026-2.974.01l-.026 1.5c.994.015 2.003.011 3.031-.012l-.031-1.498zm-5.953-.099a61.03 61.03 0 0 1-2.961-.245l-.164 1.49c.995.107 2.006.19 3.035.251l.09-1.496zm-5.898-.641a49.97 49.97 0 0 1-2.907-.56l-.332 1.462c.983.22 1.98.412 2.995.577l.244-1.48zm-5.773-1.298a44.435 44.435 0 0 1-2.807-.92l-.518 1.407c.953.348 1.92.665 2.901.951l.424-1.438zm-5.546-2.027A44.285 44.285 0 0 1 111 76.73l-.702 1.326a45.9 45.9 0 0 0 2.748 1.331l.612-1.37zm-5.23-2.75a49.031 49.031 0 0 1-2.472-1.616l-.861 1.229a50.27 50.27 0 0 0 2.548 1.666l.785-1.278zm-4.851-3.378c-.767-.601-1.529-1.231-2.289-1.891l-.987 1.131c.778.676 1.56 1.322 2.348 1.94l.928-1.18zm-4.486-3.889a74.64 74.64 0 0 1-2.11-2.088l-1.078 1.044a76.17 76.17 0 0 0 2.152 2.13L99.091 68zm-4.143-4.259a97.17 97.17 0 0 1-1.965-2.239l-1.145.972a98.31 98.31 0 0 0 1.996 2.274l1.114-1.007zm-3.867-4.536a127.63 127.63 0 0 1-1.845-2.346l-1.192.914c.624.812 1.246 1.603 1.867 2.373l1.17-.94zm-3.64-4.733c-.58-.788-1.163-1.596-1.749-2.423l-1.225.867c.59.834 1.179 1.649 1.764 2.445l1.21-.89z" fill="var(--emfe-w-color-gray-150, #828282)"/>
1030
- <path d="M78 43h11v13H78V43z" stroke="var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C))"/>
1031
- <path d="m180 65 2.021 6.219h6.539l-5.291 3.843 2.021 6.22-5.29-3.844-5.29 3.843 2.021-6.219-5.291-3.843h6.539L180 65z" fill="var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C))" stroke="var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C))" stroke-linecap="round" stroke-linejoin="round"/>
1032
- <path d="m74 27 2.02 6.219h6.54l-5.29 3.843 2.02 6.22L74 39.437l-5.29 3.843 2.02-6.219-5.29-3.843h6.54L74 27z" stroke="var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C))" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1033
- </svg>
1034
- <span class="NoFavoriteText NoFavoriteTextHighlight">{$_('noFavoritesTitle')}</span>
1035
- {#if isMobile(userAgent)}
1036
- <span class="NoFavoriteText">{$_('noFavoritesMobile')}</span>
1037
- {:else}
1038
- <span class="NoFavoriteText">{$_('noFavorites')}</span>
1039
- {/if}
1040
- </p>
1041
- {/each}
1042
- {:else}
1043
- <p>{$_('waiting')}</p>
1044
- {/if}
1045
- {/if}
1046
- </ul>
1047
- </div>
1048
- {/if}
1049
- </div>
1050
- {/if}
1051
- {/if}
1052
- </div>
1053
-
1054
-
1055
- <style lang="scss">
1056
- $grid-gap: 16px;
1057
- $grid-cell-size: 192px;
1058
- $grid-cell-size-small: 110px;
1059
- $grid-cell-size-medium: 122px;
1060
-
1061
- $grid-gap-scroll: 16px;
1062
- $grid-cell-size-scroll: 182px;
1063
- $grid-cell-size-medium-scroll: 105px;
1064
- $grid-cell-size-small-scroll: 100px;
1065
-
1066
- *, *::before, *::after {
1067
- margin: 0;
1068
- padding: 0;
1069
- box-sizing: border-box;
1070
- }
1071
-
1072
- .CasinoGamesCategorySectionContainer {
1073
- container-type: inline-size;
1074
- }
1075
-
1076
- .CustomScroll:-webkit-scrollbar-track
1077
- {
1078
- -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
1079
- border-radius: 5px;
1080
- background-color: transparent;
1081
- }
1082
-
1083
- .CustomScroll::-webkit-scrollbar
1084
- {
1085
- height: 5px;
1086
- background-color: transparent;
1087
- }
1088
-
1089
- .CustomScroll::-webkit-scrollbar-thumb
1090
- {
1091
- border-radius: 5px;
1092
- height: 5px;
1093
- -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
1094
- background-color: rgba(255,255,255,.3);
1095
- }
1096
-
1097
- .CategoryName,
1098
- .StatusText {
1099
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-contrast, #FFFFFF));
1100
- font-size: 22px;
1101
- font-weight: 500;
1102
- }
1103
-
1104
- .CategoryLoadMore {
1105
- font-size: 14px;
1106
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-contrast, #FFFFFF));
1107
- }
1108
-
1109
- .NoSearchResults {
1110
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-white, #FFFFFF));
1111
- text-align: center;
1112
- width: 100%;
1113
- padding-left: 5px;
1114
- font-size: 16px;
1115
- }
1116
-
1117
- .NoRecentSearches {
1118
- padding-bottom: 30px;
1119
- }
1120
-
1121
- .NoRecentSearchesCenter {
1122
- text-align: center;
1123
- }
1124
-
1125
- .NoFavoriteGames {
1126
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-white, #FFFFFF));
1127
- font-size: 16px;
1128
- display: flex;
1129
- flex-direction: column;
1130
- align-items: center;
1131
- justify-content: center;
1132
- padding: 0 20px;
1133
- height: 20vh;
1134
- .UnfavoredIcon {
1135
- width: 50px;
1136
- height: 50px;
1137
- }
1138
- .NoFavoriteText {
1139
- text-align: center;
1140
- }
1141
- .NoFavoriteTextHighlight {
1142
- font-weight: 600;
1143
- font-size: 18px;
1144
- padding: 15px 0;
1145
- }
1146
- }
1147
-
1148
- .NoFavoriteGamesMobile {
1149
- height: 50vh;
1150
- }
1151
-
1152
- .SearchWaiting {
1153
- grid-column: 1/-1;
1154
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-white, #FFFFFF));
1155
- font-size: 13px;
1156
- text-align: center;
1157
- }
1158
-
1159
- .CasinoGamesHeader {
1160
- width: 100%;
1161
- display: flex;
1162
- align-items: center;
1163
- justify-content: space-between;
1164
- padding: 8px 0 0;
1165
- margin-bottom: 16px;
1166
- .CategoryNameLink {
1167
- display: block;
1168
- cursor: pointer;
1169
- }
1170
-
1171
- .CategoryLoadMore {
1172
- font-weight: normal;
1173
- }
1174
-
1175
- &.Searched {
1176
- justify-content: center;
1177
- }
1178
- }
1179
-
1180
- .CasinoGamesContainer {
1181
- width: 100%;
1182
- margin-top: 24px;
1183
- padding-bottom: 16px;
1184
- }
1185
-
1186
- .CasinoGamesGrid {
1187
- display: grid;
1188
- gap: $grid-gap;
1189
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size, 46%), 1fr));
1190
- grid-template-rows: repeat(auto-fill, $grid-cell-size);
1191
- grid-auto-rows: $grid-cell-size;
1192
- grid-auto-columns: $grid-cell-size;
1193
- grid-auto-flow: row dense;
1194
-
1195
- .game-tile-2x1 {
1196
- grid-row: span 2;
1197
-
1198
- @container (max-width: 375px) {
1199
- grid-row: span 1;
1200
- }
1201
- }
1202
-
1203
- .game-tile-2x2 {
1204
- grid-row: span 2;
1205
- grid-column: span 2;
1206
-
1207
- @container (max-width: 375px) {
1208
- grid-row: span 1;
1209
- grid-column: span 1;
1210
- }
1211
- }
1212
-
1213
- .game-tile-1x2 {
1214
- grid-column: span 2;
1215
-
1216
- @container (max-width: 375px) {
1217
- grid-column: span 1;
1218
- }
1219
- }
1220
-
1221
- &.GamesListIncreasedGap {
1222
- gap: $grid-gap + 12;
1223
- }
1224
- }
1225
-
1226
- .CasinoGamesGridSlider {
1227
- display: grid;
1228
- gap: $grid-gap;
1229
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-scroll, 46%), 2fr));
1230
- grid-template-rows: repeat(auto-fill, $grid-cell-size-scroll);
1231
- grid-auto-rows: $grid-cell-size-scroll;
1232
- grid-auto-columns: $grid-cell-size-scroll;
1233
- grid-auto-flow: column;
1234
- overflow-x: auto;
1235
- overflow-y: hidden;
1236
- padding-bottom: 5px;
1237
- overscroll-behavior-x: none;
1238
-
1239
- .game-tile-2x1 {
1240
- grid-row: span 2;
1241
-
1242
- @container (max-width: 375px) {
1243
- grid-row: span 1;
1244
- }
1245
- }
1246
-
1247
- .game-tile-2x2 {
1248
- grid-row: span 2;
1249
- grid-column: span 2;
1250
-
1251
- @container (max-width: 375px) {
1252
- grid-row: span 2;
1253
- grid-column: span 2;
1254
- }
1255
- }
1256
-
1257
- .game-tile-1x2 {
1258
- grid-column: span 2;
1259
-
1260
- @container (max-width: 375px) {
1261
- grid-column: span 1;
1262
- }
1263
- }
1264
-
1265
- &.GamesListIncreasedGap {
1266
- gap: $grid-gap + 12;
1267
- }
1268
- }
1269
-
1270
- .CategoryFilterContainer {
1271
- display: grid;
1272
- grid-template-columns: 1fr 1fr;
1273
- gap: 20px;
1274
- }
1275
-
1276
-
1277
- @container (max-width: 768px) {
1278
- .CasinoGamesHeader {
1279
- align-items: unset;
1280
- flex-direction: row;
1281
- flex-wrap: wrap;
1282
- }
1283
-
1284
- .CategoryName {
1285
- margin-bottom: 20px;
1286
- }
1287
-
1288
- .CategoryFilterContainer {
1289
- width: 100%;
1290
- }
1291
- }
1292
-
1293
- @container (min-width: 1100px) {
1294
- .CasinoGamesGrid {
1295
- grid-template-rows: repeat(auto-fill, 142px);
1296
- grid-auto-rows: 142px;
1297
- }
1298
- }
1299
-
1300
- .SearchLoading {
1301
- display: block;
1302
- padding: 50px;
1303
- color: var(--emfe-w-casino-typography, var(--emfe-w-color-white, #FFFFFF));
1304
- }
1305
-
1306
- .lds-dual-ring {
1307
- display: block;
1308
- width: 80px;
1309
- height: 80px;
1310
- margin: 0 auto
1311
- }
1312
- .lds-dual-ring:after {
1313
- content: " ";
1314
- display: block;
1315
- width: 64px;
1316
- height: 64px;
1317
- margin: 8px;
1318
- border-radius: 50%;
1319
- border: 6px solid var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C));
1320
- border-color: var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C)) transparent var(--emfe-w-casino-color-primary, var(--emfe-w-color-primary, #D0046C));
1321
- animation: lds-dual-ring 1.2s linear infinite;
1322
- }
1323
- @keyframes lds-dual-ring {
1324
- 0% {
1325
- transform: rotate(0deg);
1326
- }
1327
- 100% {
1328
- transform: rotate(360deg);
1329
- }
1330
- }
1331
-
1332
- @container (max-width: 385px) {
1333
-
1334
- .CasinoGamesGrid {
1335
- display: grid;
1336
- gap: $grid-gap;
1337
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-small, 46%), 1fr));
1338
- grid-template-rows: repeat(auto-fill, $grid-cell-size-small);
1339
- grid-auto-rows: $grid-cell-size-small;
1340
- grid-auto-columns: $grid-cell-size-small;
1341
-
1342
- &.GamesListIncreasedGap {
1343
- gap: $grid-gap;
1344
- }
1345
- }
1346
-
1347
- .CasinoGamesGridSlider {
1348
- display: grid;
1349
- gap: $grid-gap-scroll !important;
1350
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-small-scroll, 46%), 2fr));
1351
- grid-template-rows: repeat(auto-fill, $grid-cell-size-small-scroll);
1352
- grid-auto-rows: $grid-cell-size-small-scroll;
1353
- grid-auto-columns: $grid-cell-size-small-scroll;
1354
- grid-auto-flow: column;
1355
- overflow-x: auto;
1356
- overflow-y: hidden;
1357
- padding-bottom: 5px;
1358
-
1359
- & .GameInnerContainer .GameInfoWrapper .GameInfoName {
1360
- font-size: 10px !important;
1361
- }
1362
- & .GameInnerContainer .GameInfoWrapper .GameInfoVendor {
1363
- font-size: 10px !important;
1364
- }
1365
- }
1366
- }
1367
-
1368
- @container (max-width: 410px) {
1369
-
1370
- .CasinoGamesGridSlider {
1371
- display: grid;
1372
- gap: $grid-gap-scroll;
1373
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-small-scroll, 46%), 2fr));
1374
- grid-template-rows: repeat(auto-fill, $grid-cell-size-small-scroll);
1375
- grid-auto-rows: $grid-cell-size-small-scroll;
1376
- grid-auto-columns: $grid-cell-size-small-scroll;
1377
- grid-auto-flow: column;
1378
- overflow-x: auto;
1379
- overflow-y: hidden;
1380
- padding-bottom: 5px;
1381
-
1382
- & .GameInnerContainer .GameInfoWrapper .GameInfoName {
1383
- font-size: 10px !important;
1384
- }
1385
-
1386
- & .GameInnerContainer .GameInfoWrapper .GameInfoVendor {
1387
- font-size: 10px !important;
1388
- }
1389
- }
1390
- }
1391
-
1392
- @container (max-width: 480px) {
1393
-
1394
- .CasinoGamesGrid {
1395
- display: grid;
1396
- gap: $grid-gap;
1397
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-medium, 46%), 1fr));
1398
- grid-template-rows: repeat(auto-fill, $grid-cell-size-medium);
1399
- grid-auto-rows: $grid-cell-size-medium;
1400
- grid-auto-columns: $grid-cell-size-medium;
1401
-
1402
- &.GamesListIncreasedGap {
1403
- gap: $grid-gap;
1404
- }
1405
- }
1406
-
1407
- .CasinoGamesGridSlider {
1408
- display: grid;
1409
- gap: $grid-gap-scroll !important;
1410
- grid-template-columns: repeat(auto-fill, minmax(min($grid-cell-size-medium-scroll, 46%), 2fr));
1411
- grid-template-rows: repeat(auto-fill, $grid-cell-size-medium-scroll);
1412
- grid-auto-rows: $grid-cell-size-medium-scroll;
1413
- grid-auto-columns: $grid-cell-size-medium-scroll;
1414
- grid-auto-flow: column;
1415
- overflow-x: auto;
1416
- overflow-y: hidden;
1417
- padding-bottom: 5px;
1418
-
1419
- & .GameInnerContainer .GameInfoWrapper .GameInfoName {
1420
- font-size: 10px !important;
1421
- }
1422
- & .GameInnerContainer .GameInfoWrapper .GameInfoVendor {
1423
- font-size: 10px !important;
1424
- }
1425
- }
1426
- }
1427
-
1428
- </style>