@everymatrix/casino-footer-v2 1.0.16 → 1.0.70

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,752 +0,0 @@
1
- <svelte:options tag={null} />
2
-
3
- <script lang="ts">
4
- import '@everymatrix/casino-footer-section';
5
- import '@everymatrix/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 { CasinoFooterTranslations } 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(CasinoFooterTranslations).forEach((item:any) => {
97
- addNewMessages(item, CasinoFooterTranslations[item]);
98
- });
99
-
100
- let panicButtonCustomText:string = $_('casinoFooter.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 = ` ${$_('casinoFooter.sessionTimer')} ${timeString}`;
133
-
134
- milisecondDifference += 1000;
135
- }, 1000);
136
- }
137
-
138
- const refreshClock = ():void => {
139
- clockInterval = setInterval(() => {
140
- clockDisplay();
141
- }, refreshRate);
142
- }
143
-
144
- const clockDisplay = ():void => {
145
- const format = clockcustomformat != 'false' ? clockcustomformat : `hh:mm${clocksecondsenabled === "true" ? ':ss' : ''} (UTC Z)`;
146
- time = moment().format(format);
147
-
148
- clockElement.innerHTML = ` ${clocktext} ${time}`
149
- }
150
-
151
- const getCmsData = ():void => {
152
- let url:URL = new URL(`${endpoint}/${lang}/footer-raw-data`);
153
-
154
- url.searchParams.append('env', env);
155
-
156
- let device = getDevice(userAgent)
157
-
158
- if(device){
159
- if(device === 'PC'){
160
- url.searchParams.append('device', 'dk')
161
- } else if(device === 'iPad' || device === 'iPhone') {
162
- url.searchParams.append('device', 'ios')
163
- } else {
164
- url.searchParams.append('device', 'mtWeb')
165
- }
166
- }
167
-
168
- if (grouplink == 'true') {
169
- url.searchParams.append('helpLinks_groupby', 'helpLinkCategory');
170
- }
171
-
172
- isLoading = true;
173
-
174
- fetch(url.href)
175
- .then((res:any) => res.json())
176
- .then((data:any) => {
177
- isLoading = false;
178
- receivedFooterData = data;
179
- let licenseHeadScriptSrc,
180
- licenseScriptBody,
181
- licenseEvent;
182
- ({
183
- gameVendorsLinksTitle,
184
- gameVendorsRepeater,
185
- paymentLinksTitle,
186
- paymentMethodsRepeater,
187
- sponsorsLinksTitle,
188
- sponsorsRepeater,
189
- helpLinksTitle,
190
- helpLinksRepeater,
191
- licensesLinksTitle,
192
- licensesRepeater,
193
- socialLinksTitle,
194
- socialLinksRepeater,
195
- copyright,
196
- licenseDesc,
197
- licenseHeadScriptSrc,
198
- licenseScriptBody,
199
- licenseEvent,
200
- language : languages
201
- } = receivedFooterData);
202
-
203
- if (languages) {
204
- languagePackLoaded = true;
205
- updateLanguageDisplayName();
206
- }
207
-
208
- if (licenseHeadScriptSrc?.length > 0) {
209
- headScript = true;
210
- licenseScriptSrc = licenseHeadScriptSrc;
211
- }
212
-
213
- if (licenseScriptBody?.length > 0) {
214
- licenseScript = licenseScriptBody;
215
- }
216
-
217
- window.postMessage({ type: licenseEvent }, window.location.href);
218
-
219
- window.postMessage({
220
- type: 'FooterData',
221
- gameVendorsRepeater,
222
- paymentMethodsRepeater,
223
- sponsorsRepeater,
224
- helpLinksRepeater,
225
- licensesRepeater,
226
- socialLinksRepeater
227
- }, window.location.href);
228
- }).catch((err:any) => {
229
- hasErrors = true;
230
- isLoading = false;
231
-
232
- console.error(err);
233
- });
234
- }
235
-
236
- const setContent = (element:HTMLElement, content:any):void => {
237
- let htmlContent = document.createElement("div");
238
- htmlContent.innerHTML = content;
239
- element.append(htmlContent);
240
-
241
- //Add clock
242
- if (clockenabled === 'true' && element.classList.contains('DetailedLicenses')) {
243
-
244
- element.children[0].children[0].append(clockElement);
245
- }
246
- //Add session timer
247
- if (sessiontimerenabled == 'true' && element.classList.contains('DetailedLicenses')) {
248
-
249
- element.children[0].children[0].append(sessionTimerElement);
250
- }
251
- }
252
-
253
- const setClientStyling = ():void => {
254
- let sheet = document.createElement('style');
255
- sheet.innerHTML = clientstyling;
256
- if (customStylingContainer) {
257
- customStylingContainer.appendChild(sheet);
258
- }
259
- }
260
-
261
- const setClientStylingURL = ():void => {
262
- let url:URL = new URL(clientstylingurl);
263
- let cssFile:HTMLElement = document.createElement('style');
264
-
265
- fetch(url.href)
266
- .then((res:any) => res.text())
267
- .then((data:any) => {
268
- cssFile.innerHTML = data
269
-
270
- if (customStylingContainer) {
271
- setTimeout(() => { customStylingContainer.appendChild(cssFile) }, 1);
272
- }
273
- });
274
- }
275
-
276
- const changeLanguage = ():void => {
277
- window.postMessage({type: 'LanguageChanged', selectedLanguage}, window.location.href);
278
- };
279
-
280
- const toggleLanguageDrawer = ():void => {
281
- languageDrawer.classList.toggle('hidden');
282
- }
283
-
284
- const overlayOptionTrigger = (e:any):void => {
285
- let option = e.target.closest('.OverlayLanguageOption');
286
-
287
- selectedLanguage = option.getAttribute('data-lang');
288
-
289
- changeLanguage();
290
- updateLanguageDisplayName();
291
-
292
- languageDrawer.classList.toggle('hidden');
293
- };
294
-
295
- const updateLanguageDisplayName = ():void => {
296
- let matchFound = false;
297
-
298
- languages.forEach((l:any, i:number) => {
299
- if (l.code == selectedLanguage.toLowerCase()) {
300
- let langName:string = '';
301
-
302
- matchFound = true;
303
- currentLanguageFlag = l.flag_icon_editable;
304
-
305
- switch (languagedisplaytype) {
306
- case 'name':
307
- langName = l.name;
308
- break;
309
-
310
- case 'translatedName':
311
- langName = l.translated_name;
312
- break;
313
-
314
- default:
315
- langName = l.code;
316
- break;
317
- }
318
-
319
- languageDisplayName = langName;
320
- }
321
- });
322
-
323
- if (!matchFound) {
324
- languageDisplayName = selectedLanguage;
325
- }
326
- }
327
-
328
- const setLanguagesArray = ():void => {
329
- languagesArray = languageslist.replace(/ /g,'').split(',');
330
- languagesArray = languagesArray.map((language:string) => language.toUpperCase());
331
- }
332
-
333
- onMount(() => {
334
- return () => {
335
- clearInterval(clockInterval);
336
- clearInterval(timerInterval)
337
- };
338
- });
339
-
340
- $: lang && setLocale(lang);
341
- $: languageslist && setLanguagesArray();
342
- $: session && userid && userendpoint && setSession();
343
- $: endpoint && lang && env && getCmsData();
344
- $: translationUrl && setTranslationUrl();
345
- $: clockenabled !== 'false' && clocksecondsenabled && clockcustomformat && clockDisplay();
346
- $: clockenabled !== 'false' && clocksecondsenabled && (refreshRate = clocksecondsenabled == "true" ? 1000 : 60000) && refreshClock();
347
- $: lang && (selectedLanguage = lang) && languages && (languages.length > 0) && updateLanguageDisplayName();
348
- $: clientstyling && customStylingContainer && setClientStyling();
349
- $: clientstylingurl && customStylingContainer && setClientStylingURL();
350
-
351
- </script>
352
-
353
- <svelte:head>
354
- {#if headScript}
355
- <script src={licenseScriptSrc}></script>
356
- {/if}
357
- <link href='https://fonts.googleapis.com/css?family=Roboto Condensed' rel='stylesheet' type='text/css'>
358
- </svelte:head>
359
-
360
- {#if hasErrors}
361
- <p class="SearchLoading">500 Error - Internal Server Error</p>
362
- {:else}
363
- {#if isLoading}
364
- <p class="SearchLoading">Loading ...</p>
365
- {:else}
366
-
367
- <div class="Footer" bind:this={customStylingContainer}>
368
- <div class="FooterSide {isOnMobile && isLoggedIn ? 'FooterSideMobile' : ''}">
369
- <!-- start helper section -->
370
- {#if helpLinksRepeater}
371
- {#each helpLinksRepeater as category}
372
- {#if category.key}
373
- <p class="FooterTitle">{category.key}</p>
374
- {/if}
375
- <casino-footer-section
376
- helperflag="1"
377
- {clientstyling}
378
- {clientstylingurl}
379
- category={category.key}
380
- displaycolumn="true"
381
- {baseurl}
382
- {lang}
383
- footertype="footersecondary">
384
- </casino-footer-section>
385
- {/each}
386
- {/if}
387
- </div>
388
-
389
- <div class="FooterGrid">
390
- <!-- start vendors section -->
391
- {#if gameVendorsRepeater}
392
- <div class="GridRow">
393
- <div>
394
- {#if gameVendorsLinksTitle}
395
- <p class="FooterTitle">{gameVendorsLinksTitle}</p>
396
- {/if}
397
- <casino-footer-section
398
- vendorflag="1"
399
- {clientstyling}
400
- {clientstylingurl}
401
- {baseurl}
402
- {lang}
403
- footertype="footersecondary">
404
- </casino-footer-section>
405
- </div>
406
- </div>
407
- {/if}
408
- <!-- end vendors section -->
409
- <!-- start payments section -->
410
- {#if paymentMethodsRepeater}
411
- <div class="GridRow">
412
- <div>
413
- {#if paymentLinksTitle}
414
- <p class="FooterTitle">{paymentLinksTitle}</p>
415
- {/if}
416
- <casino-footer-section
417
- paymentflag="1"
418
- {clientstyling}
419
- {clientstylingurl}
420
- {baseurl}
421
- {lang}
422
- footertype="footersecondary">
423
- </casino-footer-section>
424
- </div>
425
- </div>
426
- {/if}
427
- <!-- end payments section -->
428
-
429
- <!-- start panic button -->
430
- {#if panicbuttonenabled === "true" && isLoggedIn}
431
- <panic-button
432
- customtext = {panicButtonCustomText}
433
- alternativestyling="true"
434
- {lang}
435
- {clientstyling}
436
- {clientstylingurl}
437
- ></panic-button>
438
- {/if}
439
- <!-- end panic button -->
440
- <!-- start license section -->
441
- {#if licensesRepeater}
442
- <div class="GridRow">
443
- <div class="LicenseLinks">
444
- {#if licensesLinksTitle}
445
- <p class="FooterTitle">{licensesLinksTitle}</p>
446
- {/if}
447
- <casino-footer-section
448
- licenseFlag="1"
449
- {clientstyling}
450
- {clientstylingurl}
451
- {baseurl}
452
- {lang}
453
- footertype="footersecondary">
454
- </casino-footer-section>
455
- </div>
456
- <!-- start detailed licenses section -->
457
- <div class="LicenseDesc">
458
- {#if licenseDesc}
459
- <div class="DetailedLicenses" use:setContent={licenseDesc}></div>
460
- <div class="DetailedCustomLicenses" use:setContent={licenseScript}></div>
461
- {/if}
462
- </div>
463
- <!-- end detailed licenses section -->
464
- </div>
465
- {/if}
466
- <!-- end license section -->
467
-
468
- <!-- start sponsors section -->
469
- {#if sponsorsRepeater}
470
- <div class="GridRow">
471
- {#if sponsorsRepeater}
472
- <div>
473
- {#if sponsorsLinksTitle}
474
- <p class="FooterTitle">{sponsorsLinksTitle}</p>
475
- {/if}
476
- <casino-footer-section
477
- sponsorflag="1"
478
- {clientstyling}
479
- {clientstylingurl}
480
- {baseurl}
481
- {lang}
482
- footertype="footersecondary">
483
- </casino-footer-section>
484
- </div>
485
- {/if}
486
- </div>
487
- {/if}
488
- <!-- end sponsors section -->
489
-
490
- <!-- start social section -->
491
- {#if socialLinksRepeater}
492
- <div class="GridRow">
493
- {#if socialLinksTitle}
494
- <p class="FooterTitle">{socialLinksTitle}</p>
495
- {/if}
496
- <casino-footer-section
497
- socialflag="1"
498
- {clientstyling}
499
- {clientstylingurl}
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="0.4" d="M0.94 0L4.00067 3.05467L7.06 0L8 0.940667L4.00067 4.94133L0 0.940667L0.94 0Z" fill="black"/>
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
- background-color: $color-white;
564
- display: flex;
565
- padding: 21px 12px;
566
- flex-direction: row;
567
- }
568
-
569
- .FooterSideMobile {
570
- margin-top: 66px;
571
- }
572
-
573
- .FooterSide {
574
- justify-content: center;
575
- height: 100%;
576
- display: flex;
577
- flex-direction: column;
578
- background-color: $color-white;
579
- .FooterTitle {
580
- font-family: 'Roboto Condensed';
581
- font-weight: 500;
582
- font-size: 12px;
583
- color: #111;
584
- text-transform: uppercase;
585
- margin: 21px 12px;
586
- }
587
- }
588
- .FooterGrid {
589
- font-weight: 400;
590
- height: 100%;
591
- display: flex;
592
- padding: 100px 0;
593
- max-width: 1200px;
594
- margin: auto;
595
- background-color: $color-white;
596
- flex-direction: column;
597
- align-items: center;
598
- justify-content: center;
599
- .GridRow {
600
- display: flex;
601
- flex-flow: row wrap;
602
- width: 100%;
603
- align-items: flex-start;
604
- justify-content: center;
605
- align-items: center;
606
- padding: 20px 0;
607
- text-align: left;
608
- max-width: 1100px;
609
- p {
610
- display: inline;
611
- font-family: 'Roboto';
612
- font-style: normal;
613
- font-weight: 300;
614
- font-size: 12px;
615
- color: #111;
616
- }
617
- .LicenseDesc {
618
- flex: 1;
619
- max-width: 575px;
620
- line-height: 1.3;
621
- display: flex;
622
- flex-direction: column;
623
- align-items: flex-start;
624
- .DetailedLicenses {
625
- font-size: 10px;
626
- color: var(--emfe-w-color-gray-150, #828282);
627
- }
628
- }
629
- }
630
- .CopyrightAreaRights {
631
- margin-top: 10px;
632
- }
633
- .CopyrightTextArea p, .CopyrightArea p {
634
- margin: 0;
635
- color: var(--emfe-w-color-gray-150, #828282);
636
- font-size: 9px;
637
- }
638
- }
639
- @media only screen and (max-width: 768px) {
640
- .Footer {
641
- display: flex;
642
- flex-direction: column;
643
- &Side {
644
- position: relative;
645
- margin-left: 14px;
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
- .LanguageSelectorOverlay {
673
- position: relative;
674
- font-size: 12px;
675
- }
676
-
677
- .DrawerButton {
678
- height: 30px;
679
- width: 150px;
680
- background: inherit;
681
- color: inherit;
682
- border: none;
683
- padding: 0;
684
- font: inherit;
685
- cursor: pointer;
686
- outline: inherit;
687
-
688
- display: flex;
689
- justify-content: space-evenly;
690
- align-items: center;
691
-
692
- border-radius: 0px;
693
- border: 0;
694
- position: relative;
695
- }
696
-
697
- .LanguageDrawer {
698
- position:absolute;
699
- background: $color-white;
700
- width: 150px;
701
- bottom: 30px;
702
- padding: 6px 0;
703
- left: 3.9px;
704
-
705
- &.hidden {
706
- display: none;
707
- }
708
- }
709
-
710
- .LanguageFlag {
711
- margin-right: 8px;
712
- background: black;
713
- border-radius: 50%;
714
- width: 16px;
715
- height: 16px;
716
- }
717
-
718
- .OverlayLanguageOption {
719
- justify-content: center;
720
- list-style: none;
721
- position: relative;
722
- height: 35px;
723
- padding: 0;
724
- justify-content: space-between;
725
- display: flex;
726
- flex-direction: row;
727
-
728
- img {
729
- position: absolute;
730
- z-index: 0;
731
- cursor: pointer;
732
- top: 6px;
733
- left: 12px;
734
- }
735
-
736
- a {
737
- text-decoration: none;
738
- color: black;
739
- display: inline-block;
740
-
741
- width: 150px;
742
-
743
- span {
744
- width: 100%;
745
- display: flex;
746
- justify-content: center;
747
- margin: 4px 0;
748
- }
749
- }
750
- }
751
-
752
- </style>