@everymatrix/casino-footer-v2 1.44.0 → 1.45.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/CasinoFooterSection-Cm0iOuN6.cjs +1 -0
- package/components/CasinoFooterSection-_OWEjueQ.js +1626 -0
- package/components/CasinoFooterThumbnail-DCq4_Iv-.js +4954 -0
- package/components/CasinoFooterThumbnail-DxH-M43f.cjs +5 -0
- package/components/CasinoFooterV2-D_gx3sdn.js +4077 -0
- package/components/CasinoFooterV2-DxEkjF96.cjs +10 -0
- package/components/PlayerPanicButton-B-aSlMvM.cjs +1 -0
- package/components/PlayerPanicButton-DgFz6RjE.js +242 -0
- package/es2015/casino-footer-v2.cjs +1 -0
- package/es2015/casino-footer-v2.js +16 -0
- package/package.json +18 -32
- package/CHANGELOG.md +0 -9
- package/README.md +0 -30
- package/dist/casino-footer-v2.js +0 -1374
- package/dist/casino-footer-v2.js.map +0 -1
- package/index.html +0 -50
- package/index.js +0 -1
- package/public/favicon.png +0 -0
- package/public/reset.css +0 -48
- package/rollup.config.js +0 -59
- package/src/CasinoFooterV2.svelte +0 -759
- package/src/i18n.js +0 -27
- package/src/index.ts +0 -4
- package/src/translations.js +0 -62
- package/stories/CasinoFooterV2.stories.js +0 -13
- package/tsconfig.json +0 -6
@@ -1,759 +0,0 @@
|
|
1
|
-
<svelte:options tag={null} />
|
2
|
-
|
3
|
-
<script lang="ts">
|
4
|
-
import '@everymatrix/casino-footer-section';
|
5
|
-
import '@everymatrix/player-panic-button';
|
6
|
-
|
7
|
-
import { onMount } from 'svelte';
|
8
|
-
import moment from 'moment';
|
9
|
-
import { checkSession, isMobile, getDevice } from 'rvhelper';
|
10
|
-
import { _, addNewMessages, setLocale, setupI18n } from './i18n';
|
11
|
-
import { TRANSLATIONS } from './translations.js'
|
12
|
-
|
13
|
-
export let endpoint:string = '';
|
14
|
-
export let lang:string = 'en';
|
15
|
-
export let env:string = '';
|
16
|
-
export let clientstyling:string = '';
|
17
|
-
export let clientstylingurl:string = '';
|
18
|
-
export let translationurl:string = '';
|
19
|
-
// Clock exposed attributes - If the clock is enabled, all attributes should be given a value, otherwise they can be ignored safely
|
20
|
-
export let clockenabled:string = ''; // "true" to enable, anything to disable
|
21
|
-
export let clocksecondsenabled:string = ''; // "true" to display seconds in our default format and to refresh the clock every 1000ms
|
22
|
-
export let clockcustomformat:string = ''; // "false" for defaulting to our format
|
23
|
-
export let clocktext:string = 'Time:'; // string preceding clock
|
24
|
-
|
25
|
-
export let languageselectorenabled:string = 'true';
|
26
|
-
export let languageslist:string = 'en, ro';
|
27
|
-
export let languagedisplaytype = 'name';
|
28
|
-
export let session:string = '';
|
29
|
-
export let userid:string = '';
|
30
|
-
export let userendpoint:string = '';
|
31
|
-
export let panicbuttonenabled:string = 'true';
|
32
|
-
export let sessiontimerenabled:string = 'true'; // 'true' to enable, anything to disable
|
33
|
-
export let grouplink:string = 'true';
|
34
|
-
export let baseurl:string = '';
|
35
|
-
|
36
|
-
let userAgent:string = window.navigator.userAgent;
|
37
|
-
let isOnMobile:boolean = isMobile(userAgent);
|
38
|
-
let gameVendorsLinksTitle:string = '';
|
39
|
-
let gameVendorsRepeater:Array<Object> = [];
|
40
|
-
let paymentLinksTitle:string = '';
|
41
|
-
let paymentMethodsRepeater:Array<Object> = [];
|
42
|
-
let sponsorsLinksTitle:string = '';
|
43
|
-
let sponsorsRepeater:Array<Object> = [];
|
44
|
-
let helpLinksTitle:string = '';
|
45
|
-
let helpLinksRepeater:Array<Object> = [];
|
46
|
-
let licensesLinksTitle:string = '';
|
47
|
-
let licensesRepeater:Array<Object> = [];
|
48
|
-
let socialLinksTitle:string = '';
|
49
|
-
let socialLinksRepeater:Array<Object> = [];
|
50
|
-
let copyright:string = '';
|
51
|
-
let licenseDesc:string = '';
|
52
|
-
let hasErrors:boolean = false;
|
53
|
-
let isLoading:boolean = false;
|
54
|
-
let receivedFooterData:any;
|
55
|
-
let headScript:boolean = false;
|
56
|
-
let licenseScriptSrc:string = '';
|
57
|
-
let licenseScript:string = '';
|
58
|
-
let isLoggedIn:boolean = false;
|
59
|
-
let sessionID:string = '';
|
60
|
-
let playerID:string = '';
|
61
|
-
let selectedLanguage:string = 'hr';
|
62
|
-
let languages:Array<object> = [];
|
63
|
-
|
64
|
-
let time:string;
|
65
|
-
let refreshRate:number;
|
66
|
-
|
67
|
-
let languagesArray:Array<string> = [];
|
68
|
-
let languageDrawer:HTMLElement;
|
69
|
-
let languageDisplayName:string = '';
|
70
|
-
let currentLanguageFlag:string = '';
|
71
|
-
let languagePackLoaded:boolean = false;
|
72
|
-
|
73
|
-
let timeString:string = '';
|
74
|
-
let clockInterval:any;
|
75
|
-
let timerInterval:any;
|
76
|
-
|
77
|
-
let customStylingContainer:HTMLElement;
|
78
|
-
let sessionTimerElement:HTMLElement = document.createElement('p');
|
79
|
-
let clockElement:HTMLElement = document.createElement('p');
|
80
|
-
|
81
|
-
setupI18n({ withLocale: 'en', translations: {}});
|
82
|
-
|
83
|
-
const setTranslationUrl = ():void => {
|
84
|
-
let url:string = translationurl;
|
85
|
-
|
86
|
-
fetch(url).then((res:any) => res.json())
|
87
|
-
.then((res) => {
|
88
|
-
Object.keys(res).forEach((item:any):void => {
|
89
|
-
addNewMessages(item, res[item]);
|
90
|
-
});
|
91
|
-
}).catch((err:any) => {
|
92
|
-
console.log(err);
|
93
|
-
});
|
94
|
-
}
|
95
|
-
|
96
|
-
Object.keys(TRANSLATIONS).forEach((item:any) => {
|
97
|
-
addNewMessages(item, TRANSLATIONS[item]);
|
98
|
-
});
|
99
|
-
|
100
|
-
let panicButtonCustomText:string = $_('panicButton');
|
101
|
-
|
102
|
-
const setSession = ():void => {
|
103
|
-
checkSession(userendpoint, session).then((res:any) => {
|
104
|
-
sessionID = res.Guid;
|
105
|
-
playerID = res.UserID;
|
106
|
-
isLoggedIn = true;
|
107
|
-
setSessionTimer(res);
|
108
|
-
}, (err:any) => {
|
109
|
-
isLoggedIn = false;
|
110
|
-
console.error('Error while checking the session - ', err)
|
111
|
-
});
|
112
|
-
}
|
113
|
-
|
114
|
-
const setSessionTimer = (sessionData:any):void => {
|
115
|
-
// using Date instead of moment because they recommend in their docs to stop using it for new projects
|
116
|
-
const loginTime = new Date(sessionData.Login);
|
117
|
-
const timezoneOffsetHours = new Date().getTimezoneOffset() / 60;
|
118
|
-
let currentTime = new Date();
|
119
|
-
let milisecondDifference = currentTime.getTime() - loginTime.getTime();
|
120
|
-
|
121
|
-
let hours = Math.floor(milisecondDifference / 3600000) + timezoneOffsetHours;
|
122
|
-
let minutes = Math.floor(milisecondDifference % 3600000 / 60000);
|
123
|
-
let seconds = Math.floor(milisecondDifference % 60000 / 1000);
|
124
|
-
|
125
|
-
timerInterval = setInterval(() => {
|
126
|
-
hours = Math.floor(milisecondDifference / 3600000) + timezoneOffsetHours;
|
127
|
-
minutes = Math.floor(milisecondDifference % 3600000 / 60000);
|
128
|
-
seconds = Math.floor(milisecondDifference % 60000 / 1000);
|
129
|
-
|
130
|
-
timeString = `${hours > 9 ? hours : '0' + hours}:${minutes > 9 ? minutes : '0' + minutes}:${seconds > 9 ? seconds : '0' + seconds}`;
|
131
|
-
|
132
|
-
sessionTimerElement.innerHTML = ` ${$_('sessionTimer', {values: { timeString }})}`;
|
133
|
-
milisecondDifference += 1000;
|
134
|
-
}, 1000);
|
135
|
-
}
|
136
|
-
|
137
|
-
const refreshClock = ():void => {
|
138
|
-
clockInterval = setInterval(() => {
|
139
|
-
clockDisplay();
|
140
|
-
}, refreshRate);
|
141
|
-
}
|
142
|
-
|
143
|
-
const clockDisplay = ():void => {
|
144
|
-
const format = clockcustomformat != 'false' ? clockcustomformat : `hh:mm${clocksecondsenabled === "true" ? ':ss' : ''} (UTC Z)`;
|
145
|
-
time = moment().format(format);
|
146
|
-
|
147
|
-
clockElement.innerHTML = $_('timeText').length > 0 ? ` ${$_('timeText')} ${time}` : ` ${clocktext} ${time}`
|
148
|
-
}
|
149
|
-
|
150
|
-
const getCmsData = async ():Promise<void> => {
|
151
|
-
let url:URL = new URL(`${endpoint}/${lang}/footer-raw-data`);
|
152
|
-
|
153
|
-
let device = getDevice(userAgent);
|
154
|
-
|
155
|
-
url.searchParams.append('env', env);
|
156
|
-
|
157
|
-
if(device){
|
158
|
-
if(device === 'PC'){
|
159
|
-
url.searchParams.append('device', 'dk')
|
160
|
-
} else if(device === 'iPad' || device === 'iPhone') {
|
161
|
-
url.searchParams.append('device', 'mtWeb'); // replace with ios when we will have a native ios up for this
|
162
|
-
} else {
|
163
|
-
url.searchParams.append('device', 'mtWeb')
|
164
|
-
}
|
165
|
-
}
|
166
|
-
|
167
|
-
if (grouplink == 'true') {
|
168
|
-
url.searchParams.append('helpLinks_groupby', 'helpLinkCategory');
|
169
|
-
}
|
170
|
-
|
171
|
-
hasErrors = false;
|
172
|
-
isLoading = true;
|
173
|
-
try {
|
174
|
-
let response = await fetch(url.href);
|
175
|
-
|
176
|
-
if (response.ok) {
|
177
|
-
let data = await response.json();
|
178
|
-
isLoading = false;
|
179
|
-
receivedFooterData = data;
|
180
|
-
|
181
|
-
helpLinksRepeater = receivedFooterData.helpLinksRepeater;
|
182
|
-
gameVendorsLinksTitle = receivedFooterData.gameVendorsLinksTitle;
|
183
|
-
gameVendorsRepeater = receivedFooterData.gameVendorsRepeater;
|
184
|
-
paymentLinksTitle = receivedFooterData.paymentLinksTitle;
|
185
|
-
paymentMethodsRepeater = receivedFooterData.paymentMethodsRepeater;
|
186
|
-
sponsorsLinksTitle = receivedFooterData.sponsorsLinksTitle;
|
187
|
-
sponsorsRepeater = receivedFooterData.sponsorsRepeater;
|
188
|
-
helpLinksTitle = receivedFooterData.helpLinksTitle;
|
189
|
-
helpLinksRepeater = receivedFooterData.helpLinksRepeater;
|
190
|
-
licensesLinksTitle = receivedFooterData.licensesLinksTitle;
|
191
|
-
licensesRepeater = receivedFooterData.licensesRepeater;
|
192
|
-
socialLinksTitle = receivedFooterData.socialLinksTitle;
|
193
|
-
socialLinksRepeater = receivedFooterData.socialLinksRepeater;
|
194
|
-
copyright = receivedFooterData.copyright;
|
195
|
-
licenseDesc = receivedFooterData.licenseDesc;
|
196
|
-
languages = receivedFooterData.language;
|
197
|
-
|
198
|
-
let {
|
199
|
-
licenseHeadScriptSrc,
|
200
|
-
licenseScriptBody,
|
201
|
-
licenseEvent
|
202
|
-
} = receivedFooterData
|
203
|
-
|
204
|
-
if (languages) {
|
205
|
-
languagePackLoaded = true;
|
206
|
-
updateLanguageDisplayName();
|
207
|
-
}
|
208
|
-
|
209
|
-
if (licenseHeadScriptSrc?.length > 0) {
|
210
|
-
headScript = true;
|
211
|
-
licenseScriptSrc = licenseHeadScriptSrc;
|
212
|
-
}
|
213
|
-
|
214
|
-
if (licenseScriptBody?.length > 0) {
|
215
|
-
licenseScript = licenseScriptBody;
|
216
|
-
}
|
217
|
-
|
218
|
-
window.postMessage({ type: licenseEvent }, window.location.href);
|
219
|
-
window.postMessage({
|
220
|
-
type: 'FooterData',
|
221
|
-
gameVendorsRepeater,
|
222
|
-
paymentMethodsRepeater,
|
223
|
-
sponsorsRepeater,
|
224
|
-
helpLinksRepeater,
|
225
|
-
licensesRepeater,
|
226
|
-
socialLinksRepeater,
|
227
|
-
}, window.location.href);
|
228
|
-
} else {
|
229
|
-
hasErrors = true;
|
230
|
-
isLoading = false;
|
231
|
-
console.error('Error fetching data. Status:', response.status);
|
232
|
-
}
|
233
|
-
} catch (error) {
|
234
|
-
hasErrors = true;
|
235
|
-
isLoading = false;
|
236
|
-
console.error('Error fetching data:', error);
|
237
|
-
}
|
238
|
-
}
|
239
|
-
|
240
|
-
const setContent = (element:HTMLElement, content:any):void => {
|
241
|
-
let htmlContent = document.createElement("div");
|
242
|
-
htmlContent.innerHTML = content;
|
243
|
-
element.append(htmlContent);
|
244
|
-
|
245
|
-
//Add clock
|
246
|
-
if (clockenabled === 'true' && element.classList.contains('DetailedLicenses')) {
|
247
|
-
|
248
|
-
element.children[0].children[0].append(clockElement);
|
249
|
-
}
|
250
|
-
//Add session timer
|
251
|
-
if (sessiontimerenabled == 'true' && element.classList.contains('DetailedLicenses')) {
|
252
|
-
|
253
|
-
element.children[0].children[0].append(sessionTimerElement);
|
254
|
-
}
|
255
|
-
}
|
256
|
-
|
257
|
-
const changeLanguage = ():void => {
|
258
|
-
window.postMessage({type: 'LanguageChanged', selectedLanguage}, window.location.href);
|
259
|
-
};
|
260
|
-
|
261
|
-
const toggleLanguageDrawer = ():void => {
|
262
|
-
languageDrawer.classList.toggle('hidden');
|
263
|
-
}
|
264
|
-
|
265
|
-
const overlayOptionTrigger = (e:any):void => {
|
266
|
-
let option = e.target.closest('.OverlayLanguageOption');
|
267
|
-
|
268
|
-
selectedLanguage = option.getAttribute('data-lang');
|
269
|
-
|
270
|
-
changeLanguage();
|
271
|
-
updateLanguageDisplayName();
|
272
|
-
|
273
|
-
languageDrawer.classList.toggle('hidden');
|
274
|
-
};
|
275
|
-
|
276
|
-
const updateLanguageDisplayName = ():void => {
|
277
|
-
let matchFound = false;
|
278
|
-
|
279
|
-
languages.forEach((l:any, i:number) => {
|
280
|
-
if (l.code == selectedLanguage.toLowerCase()) {
|
281
|
-
let langName:string = '';
|
282
|
-
|
283
|
-
matchFound = true;
|
284
|
-
currentLanguageFlag = l.flag_icon_editable;
|
285
|
-
|
286
|
-
switch (languagedisplaytype) {
|
287
|
-
case 'name':
|
288
|
-
langName = l.name;
|
289
|
-
break;
|
290
|
-
|
291
|
-
case 'translatedName':
|
292
|
-
langName = l.translated_name;
|
293
|
-
break;
|
294
|
-
|
295
|
-
default:
|
296
|
-
langName = l.code;
|
297
|
-
break;
|
298
|
-
}
|
299
|
-
|
300
|
-
languageDisplayName = langName;
|
301
|
-
}
|
302
|
-
});
|
303
|
-
|
304
|
-
if (!matchFound) {
|
305
|
-
languageDisplayName = selectedLanguage;
|
306
|
-
}
|
307
|
-
}
|
308
|
-
|
309
|
-
const setLanguagesArray = ():void => {
|
310
|
-
languagesArray = languageslist.replace(/ /g,'').split(',');
|
311
|
-
languagesArray = languagesArray.map((language:string) => language.toUpperCase());
|
312
|
-
}
|
313
|
-
|
314
|
-
const setClientStyling = ():void => {
|
315
|
-
let sheet = document.createElement('style');
|
316
|
-
sheet.innerHTML = clientstyling;
|
317
|
-
customStylingContainer.appendChild(sheet);
|
318
|
-
}
|
319
|
-
|
320
|
-
const setClientStylingURL = ():void => {
|
321
|
-
let url:URL = new URL(clientstylingurl);
|
322
|
-
let cssFile:HTMLElement = document.createElement('style');
|
323
|
-
|
324
|
-
fetch(url.href)
|
325
|
-
.then((res:any) => res.text())
|
326
|
-
.then((data:any) => {
|
327
|
-
cssFile.innerHTML = data;
|
328
|
-
|
329
|
-
// after the first call is made for the custom styling file, save the css inside clientstyling in order to avoid multiple fetches inside subwidgets
|
330
|
-
clientstyling = clientstyling ? clientstyling + data : data;
|
331
|
-
|
332
|
-
setTimeout(() => { customStylingContainer.appendChild(cssFile) }, 1);
|
333
|
-
});
|
334
|
-
}
|
335
|
-
|
336
|
-
const setActiveLanguage = ():void => {
|
337
|
-
setLocale(lang);
|
338
|
-
panicButtonCustomText = $_('panicButton');
|
339
|
-
}
|
340
|
-
|
341
|
-
onMount(() => {
|
342
|
-
return () => {
|
343
|
-
clearInterval(clockInterval);
|
344
|
-
clearInterval(timerInterval);
|
345
|
-
};
|
346
|
-
});
|
347
|
-
|
348
|
-
$: lang && setActiveLanguage();
|
349
|
-
$: languageslist && setLanguagesArray();
|
350
|
-
$: session && userid && userendpoint && setSession();
|
351
|
-
$: endpoint && lang && env && getCmsData();
|
352
|
-
$: translationurl && setTranslationUrl();
|
353
|
-
$: clockenabled !== 'false' && clocksecondsenabled && clockcustomformat && clockDisplay();
|
354
|
-
$: clockenabled !== 'false' && clocksecondsenabled && (refreshRate = clocksecondsenabled == "true" ? 1000 : 60000) && refreshClock();
|
355
|
-
$: lang && (selectedLanguage = lang) && languages && (languages.length > 0) && updateLanguageDisplayName();
|
356
|
-
$: clientstyling && customStylingContainer && setClientStyling();
|
357
|
-
$: clientstylingurl && customStylingContainer && setClientStylingURL();
|
358
|
-
|
359
|
-
</script>
|
360
|
-
|
361
|
-
<svelte:head>
|
362
|
-
{#if headScript}
|
363
|
-
<script src={licenseScriptSrc}></script>
|
364
|
-
{/if}
|
365
|
-
</svelte:head>
|
366
|
-
|
367
|
-
{#if hasErrors}
|
368
|
-
<p class="SearchLoading">500 Error - Internal Server Error</p>
|
369
|
-
{:else}
|
370
|
-
{#if isLoading}
|
371
|
-
<p class="SearchLoading">Loading ...</p>
|
372
|
-
{:else}
|
373
|
-
|
374
|
-
<div class="Footer" bind:this={customStylingContainer}>
|
375
|
-
<div class="FooterSide {isOnMobile && isLoggedIn && panicbuttonenabled === "true" ? 'FooterSideMobile' : ''}">
|
376
|
-
<!-- start helper section -->
|
377
|
-
{#if helpLinksRepeater}
|
378
|
-
{#each helpLinksRepeater as category}
|
379
|
-
{#if category.key}
|
380
|
-
<p class="FooterTitle">{category.key}</p>
|
381
|
-
{/if}
|
382
|
-
<casino-footer-section
|
383
|
-
helperflag="1"
|
384
|
-
{clientstyling}
|
385
|
-
category={category.key}
|
386
|
-
displaycolumn="true"
|
387
|
-
{baseurl}
|
388
|
-
{lang}
|
389
|
-
footertype="footersecondary">
|
390
|
-
</casino-footer-section>
|
391
|
-
{/each}
|
392
|
-
{/if}
|
393
|
-
</div>
|
394
|
-
|
395
|
-
<div class="FooterGrid">
|
396
|
-
<!-- start vendors section -->
|
397
|
-
{#if gameVendorsRepeater}
|
398
|
-
<div class="GridRow">
|
399
|
-
<div>
|
400
|
-
{#if gameVendorsLinksTitle}
|
401
|
-
<p class="FooterTitle">{gameVendorsLinksTitle}</p>
|
402
|
-
{/if}
|
403
|
-
<casino-footer-section
|
404
|
-
vendorflag="1"
|
405
|
-
{clientstyling}
|
406
|
-
{baseurl}
|
407
|
-
{lang}
|
408
|
-
footertype="footersecondary">
|
409
|
-
</casino-footer-section>
|
410
|
-
</div>
|
411
|
-
</div>
|
412
|
-
{/if}
|
413
|
-
<!-- end vendors section -->
|
414
|
-
<!-- start payments section -->
|
415
|
-
{#if paymentMethodsRepeater}
|
416
|
-
<div class="GridRow">
|
417
|
-
<div>
|
418
|
-
{#if paymentLinksTitle}
|
419
|
-
<p class="FooterTitle">{paymentLinksTitle}</p>
|
420
|
-
{/if}
|
421
|
-
<casino-footer-section
|
422
|
-
paymentflag="1"
|
423
|
-
{clientstyling}
|
424
|
-
{baseurl}
|
425
|
-
{lang}
|
426
|
-
footertype="footersecondary">
|
427
|
-
</casino-footer-section>
|
428
|
-
</div>
|
429
|
-
</div>
|
430
|
-
{/if}
|
431
|
-
<!-- end payments section -->
|
432
|
-
|
433
|
-
<!-- start panic button -->
|
434
|
-
{#if panicbuttonenabled === "true" && isLoggedIn}
|
435
|
-
<player-panic-button
|
436
|
-
customtext={panicButtonCustomText}
|
437
|
-
alternativestyling="true"
|
438
|
-
{lang}
|
439
|
-
{clientstyling}
|
440
|
-
></player-panic-button>
|
441
|
-
{/if}
|
442
|
-
<!-- end panic button -->
|
443
|
-
<!-- start license section -->
|
444
|
-
{#if licensesRepeater}
|
445
|
-
<div class="GridRow">
|
446
|
-
<div class="LicenseLinks">
|
447
|
-
{#if licensesLinksTitle}
|
448
|
-
<p class="FooterTitle">{licensesLinksTitle}</p>
|
449
|
-
{/if}
|
450
|
-
<casino-footer-section
|
451
|
-
licenseFlag="1"
|
452
|
-
{clientstyling}
|
453
|
-
{baseurl}
|
454
|
-
{lang}
|
455
|
-
footertype="footersecondary">
|
456
|
-
</casino-footer-section>
|
457
|
-
</div>
|
458
|
-
<!-- start detailed licenses section -->
|
459
|
-
<div class="LicenseDesc">
|
460
|
-
{#if licenseDesc}
|
461
|
-
<div class="DetailedLicenses" use:setContent={licenseDesc}></div>
|
462
|
-
<div class="DetailedCustomLicenses" use:setContent={licenseScript}></div>
|
463
|
-
{/if}
|
464
|
-
</div>
|
465
|
-
<!-- end detailed licenses section -->
|
466
|
-
</div>
|
467
|
-
{/if}
|
468
|
-
<!-- end license section -->
|
469
|
-
|
470
|
-
<!-- start sponsors section -->
|
471
|
-
{#if sponsorsRepeater}
|
472
|
-
<div class="GridRow">
|
473
|
-
{#if sponsorsRepeater}
|
474
|
-
<div>
|
475
|
-
{#if sponsorsLinksTitle}
|
476
|
-
<p class="FooterTitle">{sponsorsLinksTitle}</p>
|
477
|
-
{/if}
|
478
|
-
<casino-footer-section
|
479
|
-
sponsorflag="1"
|
480
|
-
{clientstyling}
|
481
|
-
{baseurl}
|
482
|
-
{lang}
|
483
|
-
footertype="footersecondary">
|
484
|
-
</casino-footer-section>
|
485
|
-
</div>
|
486
|
-
{/if}
|
487
|
-
</div>
|
488
|
-
{/if}
|
489
|
-
<!-- end sponsors section -->
|
490
|
-
|
491
|
-
<!-- start social section -->
|
492
|
-
{#if socialLinksRepeater}
|
493
|
-
<div class="GridRow">
|
494
|
-
{#if socialLinksTitle}
|
495
|
-
<p class="FooterTitle">{socialLinksTitle}</p>
|
496
|
-
{/if}
|
497
|
-
<casino-footer-section
|
498
|
-
socialflag="1"
|
499
|
-
{clientstyling}
|
500
|
-
{baseurl}
|
501
|
-
{lang}
|
502
|
-
footertype="footersecondary">
|
503
|
-
</casino-footer-section>
|
504
|
-
</div>
|
505
|
-
{/if}
|
506
|
-
<!-- end social section -->
|
507
|
-
|
508
|
-
<!-- start language selector -->
|
509
|
-
{#if (languageselectorenabled==="true" && languagePackLoaded && selectedLanguage)}
|
510
|
-
<div class="GridRow">
|
511
|
-
<div class="LanguageSelectorContainer">
|
512
|
-
<!-- traditional dropdown option for screenreader users. Works the same way as the old language selector. Display: none -->
|
513
|
-
<select bind:value={selectedLanguage} class="Item ItemLanguage" on:change={()=>changeLanguage()}>
|
514
|
-
{#each languagesArray as operatorLanguage}
|
515
|
-
<option value={operatorLanguage} selected>{operatorLanguage}</option>
|
516
|
-
{/each}
|
517
|
-
</select>
|
518
|
-
|
519
|
-
<!-- Custom dropdown in order to be able to display country flags -->
|
520
|
-
<div class="LanguageSelectorOverlay">
|
521
|
-
<div bind:this={languageDrawer} class="LanguageDrawer hidden">
|
522
|
-
<ul id="LanguageList">
|
523
|
-
{#each languages as language}
|
524
|
-
<li class="OverlayLanguageOption" data-lang={language.code} on:click={overlayOptionTrigger}><img class="LanguageFlag" src={language.flag_icon_editable}><a href="javascript:void(0)"><span>{language.name}</span></a></li>
|
525
|
-
{/each}
|
526
|
-
</ul>
|
527
|
-
</div>
|
528
|
-
<button class="DrawerButton" value="{selectedLanguage}" on:click={toggleLanguageDrawer}><img class="LanguageFlag" src={currentLanguageFlag}>{languageDisplayName}
|
529
|
-
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
|
530
|
-
<path opacity="1" d="M0.94 0L4.00067 3.05467L7.06 0L8 0.940667L4.00067 4.94133L0 0.940667L0.94 0Z" fill="var(--emfe-w-footer-typography, var(--emfe-w-color-white, #FFFFFF));"/>
|
531
|
-
</svg>
|
532
|
-
</button>
|
533
|
-
</div>
|
534
|
-
</div>
|
535
|
-
</div>
|
536
|
-
{/if}
|
537
|
-
<!-- end language selector -->
|
538
|
-
|
539
|
-
{#if copyright}
|
540
|
-
<!-- start copyright section -->
|
541
|
-
<div class="CopyrightAreaRights CopyrightArea" use:setContent={copyright}></div>
|
542
|
-
<!-- end copyright section -->
|
543
|
-
{/if}
|
544
|
-
|
545
|
-
</div>
|
546
|
-
</div>
|
547
|
-
{/if}
|
548
|
-
{/if}
|
549
|
-
|
550
|
-
|
551
|
-
<style lang="scss">
|
552
|
-
:host {
|
553
|
-
font-family: system-ui, -apple-system, Roboto, Helvetica;
|
554
|
-
}
|
555
|
-
$color-white : #E8E9EB;
|
556
|
-
|
557
|
-
.SearchLoading {
|
558
|
-
color: var(--emfe-w-color-white, #FFFFFF);
|
559
|
-
text-align: center;
|
560
|
-
}
|
561
|
-
|
562
|
-
.Footer {
|
563
|
-
position: relative;
|
564
|
-
background-color: var(--emfe-w-color-footer-bg, var(--emfe-w-color-background-secondary, #E8E9EB));
|
565
|
-
display: flex;
|
566
|
-
padding: 21px 12px;
|
567
|
-
flex-direction: row;
|
568
|
-
}
|
569
|
-
|
570
|
-
.FooterSideMobile {
|
571
|
-
margin-top: 44px;
|
572
|
-
}
|
573
|
-
|
574
|
-
.FooterSide {
|
575
|
-
justify-content: center;
|
576
|
-
height: 100%;
|
577
|
-
display: flex;
|
578
|
-
flex-direction: column;
|
579
|
-
background-color: var(--emfe-w-color-footer-bg, var(--emfe-w-color-background-secondary, #E8E9EB));
|
580
|
-
.FooterTitle {
|
581
|
-
font-weight: 500;
|
582
|
-
font-size: 12px;
|
583
|
-
color: var(--emfe-w-footer-typography, var(--emfe-w-color-contrast, #111));
|
584
|
-
text-transform: uppercase;
|
585
|
-
margin: 21px 12px;
|
586
|
-
}
|
587
|
-
}
|
588
|
-
.FooterGrid {
|
589
|
-
font-weight: 400;
|
590
|
-
height: 100%;
|
591
|
-
display: flex;
|
592
|
-
max-width: 1200px;
|
593
|
-
margin: auto;
|
594
|
-
background-color: var(--emfe-w-color-footer-bg, var(--emfe-w-color-background-secondary, #E8E9EB));
|
595
|
-
flex-direction: column;
|
596
|
-
align-items: center;
|
597
|
-
justify-content: center;
|
598
|
-
.GridRow {
|
599
|
-
display: flex;
|
600
|
-
flex-flow: row wrap;
|
601
|
-
width: 100%;
|
602
|
-
align-items: flex-start;
|
603
|
-
justify-content: center;
|
604
|
-
align-items: center;
|
605
|
-
padding: 20px 0;
|
606
|
-
text-align: left;
|
607
|
-
max-width: 1100px;
|
608
|
-
p {
|
609
|
-
display: inline;
|
610
|
-
font-family: 'Roboto';
|
611
|
-
font-style: normal;
|
612
|
-
font-weight: 300;
|
613
|
-
font-size: 12px;
|
614
|
-
color: var(--emfe-w-footer-typography, var(--emfe-w-color-contrast, #111));
|
615
|
-
}
|
616
|
-
.LicenseDesc {
|
617
|
-
flex: 1;
|
618
|
-
max-width: 575px;
|
619
|
-
line-height: 1.3;
|
620
|
-
display: flex;
|
621
|
-
flex-direction: column;
|
622
|
-
align-items: flex-start;
|
623
|
-
.DetailedLicenses {
|
624
|
-
font-size: 10px;
|
625
|
-
color: var(--emfe-w-color-gray-150, #828282);
|
626
|
-
}
|
627
|
-
}
|
628
|
-
}
|
629
|
-
.CopyrightAreaRights {
|
630
|
-
margin-top: 10px;
|
631
|
-
}
|
632
|
-
.CopyrightTextArea p, .CopyrightArea p {
|
633
|
-
margin: 0;
|
634
|
-
color: var(--emfe-w-color-gray-150, #828282);
|
635
|
-
font-size: 9px;
|
636
|
-
}
|
637
|
-
}
|
638
|
-
@media only screen and (max-width: 768px) {
|
639
|
-
.Footer {
|
640
|
-
display: flex;
|
641
|
-
flex-direction: column;
|
642
|
-
&Side {
|
643
|
-
position: relative;
|
644
|
-
margin-left: 14px;
|
645
|
-
margin-top: 66px;
|
646
|
-
}
|
647
|
-
&Grid {
|
648
|
-
padding: 0;
|
649
|
-
&:last-child {
|
650
|
-
padding-bottom: 50px;
|
651
|
-
}
|
652
|
-
}
|
653
|
-
}
|
654
|
-
.GridRow {
|
655
|
-
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
656
|
-
gap: 15px;
|
657
|
-
&:last-child {
|
658
|
-
border: none;
|
659
|
-
}
|
660
|
-
}
|
661
|
-
}
|
662
|
-
|
663
|
-
.ItemLanguage {
|
664
|
-
display: none;
|
665
|
-
}
|
666
|
-
|
667
|
-
#LanguageList {
|
668
|
-
padding: 0;
|
669
|
-
margin: 0;
|
670
|
-
}
|
671
|
-
|
672
|
-
.LanguageSelectorContainer {
|
673
|
-
position: relative;
|
674
|
-
}
|
675
|
-
|
676
|
-
.LanguageSelectorOverlay {
|
677
|
-
position: relative;
|
678
|
-
font-size: 12px;
|
679
|
-
}
|
680
|
-
|
681
|
-
.DrawerButton {
|
682
|
-
height: 30px;
|
683
|
-
width: 150px;
|
684
|
-
background: inherit;
|
685
|
-
color: inherit;
|
686
|
-
border: none;
|
687
|
-
padding: 0;
|
688
|
-
font: inherit;
|
689
|
-
cursor: pointer;
|
690
|
-
outline: inherit;
|
691
|
-
color: var(--emfe-w-footer-typography, var(--emfe-w-color-white, #FFFFFF));
|
692
|
-
display: flex;
|
693
|
-
justify-content: space-evenly;
|
694
|
-
align-items: center;
|
695
|
-
border-radius: 0px;
|
696
|
-
border: 0;
|
697
|
-
position: relative;
|
698
|
-
}
|
699
|
-
|
700
|
-
.DrawerButton svg path {
|
701
|
-
fill: var(--emfe-w-footer-typography, var(--emfe-w-color-white, #FFFFFF));
|
702
|
-
}
|
703
|
-
|
704
|
-
.LanguageDrawer {
|
705
|
-
position:absolute;
|
706
|
-
background-color: var(--emfe-w-color-footer-bg, var(--emfe-w-color-background-secondary, #E8E9EB));
|
707
|
-
width: 150px;
|
708
|
-
bottom: 30px;
|
709
|
-
padding: 6px 0;
|
710
|
-
left: 7px;
|
711
|
-
|
712
|
-
&.hidden {
|
713
|
-
display: none;
|
714
|
-
}
|
715
|
-
}
|
716
|
-
|
717
|
-
.LanguageFlag {
|
718
|
-
margin-right: 8px;
|
719
|
-
background: black;
|
720
|
-
border-radius: 50%;
|
721
|
-
width: 16px;
|
722
|
-
height: 16px;
|
723
|
-
}
|
724
|
-
|
725
|
-
.OverlayLanguageOption {
|
726
|
-
justify-content: center;
|
727
|
-
list-style: none;
|
728
|
-
position: relative;
|
729
|
-
height: 35px;
|
730
|
-
padding: 0;
|
731
|
-
justify-content: space-between;
|
732
|
-
display: flex;
|
733
|
-
flex-direction: row;
|
734
|
-
|
735
|
-
img {
|
736
|
-
position: absolute;
|
737
|
-
z-index: 0;
|
738
|
-
cursor: pointer;
|
739
|
-
top: 6px;
|
740
|
-
left: 12px;
|
741
|
-
}
|
742
|
-
|
743
|
-
a {
|
744
|
-
text-decoration: none;
|
745
|
-
color: var(--emfe-w-footer-typography, var(--emfe-w-color-contrast, #111));
|
746
|
-
display: inline-block;
|
747
|
-
|
748
|
-
width: 150px;
|
749
|
-
|
750
|
-
span {
|
751
|
-
width: 100%;
|
752
|
-
display: flex;
|
753
|
-
justify-content: center;
|
754
|
-
margin: 4px 0;
|
755
|
-
}
|
756
|
-
}
|
757
|
-
}
|
758
|
-
|
759
|
-
</style>
|