@mundogamernetwork/shared-ui 1.1.17 → 1.1.18

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.
@@ -0,0 +1,258 @@
1
+ <script setup lang="ts">
2
+ const colorMode = useColorMode();
3
+ const store = useAppInstallBannerStore();
4
+ const locale = useNuxtApp().$i18n.locale;
5
+
6
+ onMounted(async () => {
7
+ await store.fetchBanner();
8
+ });
9
+
10
+ const banner = computed(() => store.banner);
11
+ const isVisible = computed(() => store.isVisible);
12
+
13
+ const logoUrl = computed(() => {
14
+ if (!banner.value) return null;
15
+ return colorMode.preference === "light"
16
+ ? banner.value.logo_light_url
17
+ : (banner.value.logo_dark_url ?? banner.value.logo_light_url);
18
+ });
19
+
20
+ const qrCodeUrl = computed(() => {
21
+ if (!banner.value) return null;
22
+ return colorMode.preference === "light"
23
+ ? (banner.value.qr_code_url ?? banner.value.qr_code_url_dark)
24
+ : (banner.value.qr_code_url_dark ?? banner.value.qr_code_url);
25
+ });
26
+
27
+ const hasLogo = computed(() => !!logoUrl.value);
28
+ const hasQrCode = computed(() => !!qrCodeUrl.value);
29
+
30
+ function handleClose() {
31
+ store.dismiss();
32
+ }
33
+ </script>
34
+
35
+ <template>
36
+ <div v-if="isVisible && banner" class="mg-app-install-banner">
37
+ <div class="mg-app-install-banner__container" :class="colorMode.preference">
38
+ <div v-if="hasLogo" class="mg-app-install-banner__logo" :class="colorMode.preference">
39
+ <img :src="logoUrl!" :alt="$t('more.app.modal_popup.title')" />
40
+ </div>
41
+
42
+ <div class="mg-app-install-banner__content">
43
+ <p class="mg-app-install-banner__title">{{ $t("more.app.modal_popup.title") }}</p>
44
+ <p class="mg-app-install-banner__text">{{ $t("more.app.modal_popup.text") }}</p>
45
+ <div class="mg-app-install-banner__actions">
46
+ <nuxt-link :href="`/${locale}/app`" class="mg-app-install-banner__link">
47
+ <span class="mg-app-install-banner__link-big">{{ $t("more.app.modal_popup.action") }}</span>
48
+ <span class="mg-app-install-banner__link-small">{{ $t("more.app.modal_popup.action") }}</span>
49
+ </nuxt-link>
50
+
51
+ <!-- Apple App Store icon -->
52
+ <a v-if="banner.ios_url" :href="banner.ios_url" target="_blank" rel="noopener" aria-label="App Store">
53
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="15" viewBox="0 0 14 15" fill="none">
54
+ <g clip-path="url(#mg-app-banner-apple)">
55
+ <path d="M9.78425 0.507006C9.7545 0.473756 8.68262 0.520131 7.74987 1.53251C6.81712 2.54401 6.96062 3.70426 6.98162 3.73401C7.00262 3.76376 8.31162 3.81013 9.14725 2.63326C9.98287 1.45638 9.814 0.541131 9.78425 0.507006ZM12.684 10.7734C12.642 10.6894 10.6496 9.69363 10.8351 7.77913C11.0206 5.86376 12.3007 5.33876 12.3209 5.28188C12.341 5.22501 11.7985 4.59063 11.2236 4.26951C10.8015 4.0431 10.3344 3.91339 9.856 3.88976C9.7615 3.88713 9.43337 3.80663 8.75875 3.99126C8.31425 4.11288 7.31237 4.50663 7.03675 4.52238C6.76025 4.53813 5.93775 4.06563 5.05312 3.94051C4.487 3.83113 3.88675 4.05513 3.45712 4.22751C3.02837 4.39901 2.21287 4.88726 1.64237 6.18488C1.07187 7.48163 1.37025 9.53613 1.58375 10.1749C1.79725 10.8128 2.13062 11.8584 2.69762 12.6214C3.20162 13.4824 3.87012 14.08 4.14925 14.283C4.42837 14.486 5.21587 14.6208 5.76187 14.3416C6.20112 14.0721 6.99387 13.9173 7.30712 13.9286C7.6195 13.94 8.2355 14.0634 8.86637 14.4003C9.366 14.5726 9.8385 14.5009 10.3119 14.3084C10.7852 14.115 11.4704 13.3818 12.2701 11.8951C12.5737 11.2039 12.712 10.8303 12.684 10.7734Z" :fill="colorMode.preference === 'light' ? '#0D0D0D' : 'white'" />
56
+ </g>
57
+ <defs>
58
+ <clipPath id="mg-app-banner-apple"><rect width="14" height="14" fill="white" transform="translate(0 0.5)" /></clipPath>
59
+ </defs>
60
+ </svg>
61
+ </a>
62
+
63
+ <!-- Google Play icon -->
64
+ <a v-if="banner.android_url" :href="banner.android_url" target="_blank" rel="noopener" aria-label="Google Play">
65
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="13" viewBox="0 0 12 13" fill="none">
66
+ <g clip-path="url(#mg-app-banner-play)">
67
+ <path d="M8.85047 8.46295C10.372 7.62749 11.5255 6.99088 11.6249 6.94138C11.943 6.77226 12.2714 6.3246 11.6249 5.97688C11.4162 5.86753 10.2923 5.25074 8.85047 4.45532L6.85162 6.47399L8.85047 8.4629V8.46295Z" fill="#FFD900" />
68
+ <path d="M6.85173 6.47388L0.487183 12.8884C0.636573 12.9082 0.805229 12.8686 1.00407 12.7593C1.42154 12.5307 5.84711 10.1139 8.85057 8.4633L6.85173 6.47388Z" fill="#3378DD" />
69
+ <path d="M6.85167 6.47393L8.85052 4.4652C8.85052 4.4652 1.45167 0.427338 1.00402 0.188978C0.835359 0.0890876 0.646359 0.0594157 0.477234 0.0890876L6.85167 6.47393Z" fill="#00EE76" />
70
+ <path d="M6.85177 6.47396L0.477328 0.0891113C0.218625 0.148924 0 0.377486 0 0.844924V12.1327C0 12.5605 0.169172 12.8686 0.487219 12.8984L6.85177 6.47396Z" fill="#00D3FF" />
71
+ </g>
72
+ <defs>
73
+ <clipPath id="mg-app-banner-play"><rect width="12" height="12.8438" fill="white" transform="translate(0 0.078125)" /></clipPath>
74
+ </defs>
75
+ </svg>
76
+ </a>
77
+ </div>
78
+ </div>
79
+
80
+ <img
81
+ v-if="hasQrCode"
82
+ class="mg-app-install-banner__qrcode"
83
+ :src="qrCodeUrl!"
84
+ width="70"
85
+ height="70"
86
+ alt="QR Code"
87
+ />
88
+
89
+ <button
90
+ type="button"
91
+ class="mg-app-install-banner__close"
92
+ @click="handleClose"
93
+ :aria-label="$t('common.close')"
94
+ >
95
+ <MGIcon icon="close" />
96
+ </button>
97
+ </div>
98
+ </div>
99
+ </template>
100
+
101
+ <style lang="scss" scoped>
102
+ .mg-app-install-banner {
103
+ position: absolute;
104
+ bottom: 0.5rem;
105
+ right: 2rem;
106
+ z-index: 10;
107
+
108
+ @media (max-width: 430px) {
109
+ left: 0;
110
+ right: 0;
111
+ bottom: 0;
112
+ width: 100vw;
113
+ padding: 0 1rem;
114
+ }
115
+ }
116
+
117
+ .mg-app-install-banner__container {
118
+ min-height: 8rem;
119
+ border: 1px solid var(--banner-border-color);
120
+ border-bottom: none;
121
+ background: var(--banner-bg);
122
+ display: flex;
123
+ position: relative;
124
+ transition: border ease 0.3s, background ease 0.3s;
125
+
126
+ @media (max-width: 430px) {
127
+ min-height: 6.25rem;
128
+ }
129
+ }
130
+
131
+ .mg-app-install-banner__logo {
132
+ height: 8rem;
133
+ width: 8rem;
134
+ flex-shrink: 0;
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ transition: background ease 0.3s;
139
+
140
+ &.light {
141
+ background: linear-gradient(135deg, #eaedf0 0%, #c9d2dd 100%);
142
+ }
143
+
144
+ &.dark {
145
+ background: linear-gradient(135deg, rgba(28, 57, 92, 0.1) 0%, #1c395c 100%);
146
+ }
147
+
148
+ img {
149
+ width: 70%;
150
+ height: auto;
151
+ object-fit: contain;
152
+ }
153
+
154
+ @media (max-width: 430px) {
155
+ width: 5rem;
156
+ height: 5rem;
157
+ margin: 0.63rem 0;
158
+ margin-left: 0.88rem;
159
+ }
160
+ }
161
+
162
+ .mg-app-install-banner__content {
163
+ display: flex;
164
+ flex-direction: column;
165
+ padding: 1.25rem 1.5rem 1.25rem 1rem;
166
+ flex: 1;
167
+
168
+ @media (max-width: 430px) {
169
+ padding-top: 1rem;
170
+ padding-bottom: 1.12rem;
171
+ }
172
+ }
173
+
174
+ .mg-app-install-banner__title {
175
+ margin: 0;
176
+ font-size: 0.875rem;
177
+ color: var(--section-title-fg);
178
+ transition: color ease 0.3s;
179
+ }
180
+
181
+ .mg-app-install-banner__text {
182
+ margin: 0.5rem 0 0;
183
+ color: var(--text-secondary-color);
184
+ font-size: 0.75rem;
185
+
186
+ @media (max-width: 430px) {
187
+ margin-top: 0;
188
+ }
189
+ }
190
+
191
+ .mg-app-install-banner__actions {
192
+ display: flex;
193
+ align-items: center;
194
+ column-gap: 0.5rem;
195
+ margin-top: 0.75rem;
196
+
197
+ @media (max-width: 430px) {
198
+ margin-top: 1rem;
199
+ }
200
+ }
201
+
202
+ .mg-app-install-banner__link {
203
+ font-size: 0.75rem;
204
+ color: var(--banner-link-color);
205
+ transition: color ease 0.3s;
206
+
207
+ .mg-app-install-banner__link-big {
208
+ display: block;
209
+ }
210
+
211
+ .mg-app-install-banner__link-small {
212
+ display: none;
213
+ }
214
+
215
+ @media (max-width: 430px) {
216
+ .mg-app-install-banner__link-big {
217
+ display: none;
218
+ }
219
+
220
+ .mg-app-install-banner__link-small {
221
+ display: block;
222
+ }
223
+ }
224
+ }
225
+
226
+ .mg-app-install-banner__qrcode {
227
+ margin: 0.88rem 1.25rem 0.88rem 0;
228
+ height: 6.25rem;
229
+ width: 6.25rem;
230
+ object-fit: contain;
231
+
232
+ @media (max-width: 430px) {
233
+ display: none;
234
+ }
235
+ }
236
+
237
+ .mg-app-install-banner__close {
238
+ position: absolute;
239
+ top: 0;
240
+ right: 0;
241
+ width: 2.125rem;
242
+ height: 2.125rem;
243
+ border-radius: 100%;
244
+ background: var(--banner-button-bg);
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ transform: translate(50%, -50%);
249
+ border: none;
250
+ cursor: pointer;
251
+ transition: background ease 0.3s;
252
+
253
+ i {
254
+ color: var(--section-title-fg);
255
+ transition: color ease 0.3s;
256
+ }
257
+ }
258
+ </style>
@@ -0,0 +1,141 @@
1
+ <script lang="ts" setup>
2
+ import { fetchCampaignBanners, clickCampaignBanner } from "../../services/campaignBannersService";
3
+
4
+ const props = withDefaults(
5
+ defineProps<{
6
+ platform: string;
7
+ page: string;
8
+ interval?: number;
9
+ }>(),
10
+ { interval: 5000 },
11
+ );
12
+
13
+ const { locale } = useI18n();
14
+ const isMobile = ref(false);
15
+ const currentIndex = ref(0);
16
+ let timer: ReturnType<typeof setInterval> | null = null;
17
+
18
+ const { data: banners } = await useAsyncData(
19
+ `mg-campaign-banners-${props.platform}-${props.page}-${locale.value}`,
20
+ () => fetchCampaignBanners(props.platform, props.page, locale.value),
21
+ { default: () => [], lazy: true, server: false },
22
+ );
23
+
24
+ const hasBanners = computed(() => (banners.value?.length ?? 0) > 0);
25
+ const currentBanner = computed(() => banners.value?.[currentIndex.value] ?? null);
26
+
27
+ const imageUrl = computed(() => {
28
+ if (!currentBanner.value) return "";
29
+ return isMobile.value && currentBanner.value.url_image_mobile
30
+ ? currentBanner.value.url_image_mobile
31
+ : currentBanner.value.url_image;
32
+ });
33
+
34
+ const startCarousel = () => {
35
+ if ((banners.value?.length ?? 0) <= 1) return;
36
+ timer = setInterval(() => {
37
+ currentIndex.value = (currentIndex.value + 1) % (banners.value?.length ?? 1);
38
+ }, props.interval);
39
+ };
40
+
41
+ const handleClick = () => {
42
+ if (!currentBanner.value) return;
43
+ clickCampaignBanner(currentBanner.value.id);
44
+ window.open(currentBanner.value.link, "_blank");
45
+ };
46
+
47
+ const goTo = (index: number) => {
48
+ currentIndex.value = index;
49
+ if (timer) clearInterval(timer);
50
+ startCarousel();
51
+ };
52
+
53
+ const checkMobile = () => {
54
+ isMobile.value = window.innerWidth < 768;
55
+ };
56
+
57
+ onMounted(() => {
58
+ checkMobile();
59
+ window.addEventListener("resize", checkMobile);
60
+ startCarousel();
61
+ });
62
+
63
+ onUnmounted(() => {
64
+ if (timer) clearInterval(timer);
65
+ window.removeEventListener("resize", checkMobile);
66
+ });
67
+ </script>
68
+
69
+ <template>
70
+ <div v-if="hasBanners" class="mg-campaign-banner-carousel mb-4">
71
+ <div
72
+ class="mg-campaign-banner-slide"
73
+ role="button"
74
+ tabindex="0"
75
+ @click="handleClick"
76
+ @keydown.enter="handleClick"
77
+ >
78
+ <img
79
+ :src="imageUrl"
80
+ :alt="currentBanner?.title || ''"
81
+ class="mg-campaign-banner-img img-fluid"
82
+ loading="eager"
83
+ decoding="async"
84
+ />
85
+ </div>
86
+ <div v-if="(banners?.length ?? 0) > 1" class="mg-campaign-banner-indicators">
87
+ <button
88
+ v-for="(_, i) in banners"
89
+ :key="i"
90
+ type="button"
91
+ :class="{ active: i === currentIndex }"
92
+ @click.stop="goTo(i)"
93
+ />
94
+ </div>
95
+ </div>
96
+ </template>
97
+
98
+ <style lang="scss" scoped>
99
+ .mg-campaign-banner-carousel {
100
+ position: relative;
101
+ width: 100%;
102
+ overflow: hidden;
103
+ }
104
+
105
+ .mg-campaign-banner-slide {
106
+ cursor: pointer;
107
+ display: block;
108
+ width: 100%;
109
+ }
110
+
111
+ .mg-campaign-banner-img {
112
+ display: block;
113
+ width: 100%;
114
+ height: auto;
115
+ object-fit: cover;
116
+ }
117
+
118
+ .mg-campaign-banner-indicators {
119
+ position: absolute;
120
+ bottom: 8px;
121
+ left: 50%;
122
+ transform: translateX(-50%);
123
+ display: flex;
124
+ gap: 6px;
125
+ align-items: center;
126
+
127
+ button {
128
+ width: 8px;
129
+ height: 8px;
130
+ padding: 0;
131
+ border: 0;
132
+ background: rgba(255, 255, 255, 0.5);
133
+ cursor: pointer;
134
+ transition: background 0.2s;
135
+
136
+ &.active {
137
+ background: #fff;
138
+ }
139
+ }
140
+ }
141
+ </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mundogamernetwork/shared-ui",
3
- "version": "1.1.17",
3
+ "version": "1.1.18",
4
4
  "description": "Mundo Gamer Network - Shared UI Layer (Nuxt 3)",
5
5
  "type": "module",
6
6
  "main": "./nuxt.config.ts",
@@ -0,0 +1,11 @@
1
+ <svg width="70" height="58" viewBox="0 0 70 58" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M27.1845 0.728516L16.8204 19.078V0.728516H7.64563L0.849515 28.2528L0 31.311H7.64563L9.68447 23.3256L10.7039 19.078V31.311H17.8398L26.335 16.1897L22.4272 31.311H30.7524L38.2282 0.728516H27.1845Z" fill="white"/>
3
+ <path d="M68.1311 7.86444L70 0.728516H48.5923L36.3593 15.0004L40.4369 31.311H62.3544L64.9029 21.1169L67.4515 10.9227H54.1991L52.3301 18.0586H57.9369L56.7476 23.1557H46.3835L45.0243 17.2091L53.0097 7.86444H68.1311Z" fill="white"/>
4
+ <path d="M68.6407 36.748H6.45628L1.35919 57.4762H63.5437L68.6407 36.748Z" fill="#1C395C"/>
5
+ <path d="M39.9272 40.6543H31.2621L30.5825 43.3727H39.2476L39.9272 40.6543Z" fill="white"/>
6
+ <path d="M36.1893 44.3926L34.8301 49.8295H31.9417L33.1311 44.3926H30.4126L28.034 53.3974H36.699L38.9078 44.3926H36.1893Z" fill="white"/>
7
+ <path d="M53.0097 40.6543H49.2718L47.5728 43.3727H52.5L53.0097 40.6543Z" fill="white"/>
8
+ <path d="M45.3641 47.4508L45.534 44.3926H41.2864L39.0777 53.3974H41.7961L43.1553 47.9605L42.8155 53.3974H45.1942L47.9126 48.3003L46.5534 53.3974H49.9515L52.1602 44.3926H47.0631L45.3641 47.4508Z" fill="white"/>
9
+ <path d="M45.7039 40.6543H42.1359L41.4563 43.3727H45.534L45.7039 40.6543Z" fill="white"/>
10
+ <path d="M21.068 49.8291L20.5583 46.7708L23.4466 43.3727H28.3738L29.0534 40.6543H21.5777L16.9903 46.431L18.5194 53.397H25.8252L26.6748 49.8291H21.068Z" fill="white"/>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg width="70" height="58" viewBox="0 0 70 58" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M27.1845 0.728516L16.8204 19.078V0.728516H7.64563L0.849515 28.2528L0 31.311H7.64563L9.68447 23.3256L10.7039 19.078V31.311H17.8398L26.335 16.1897L22.4272 31.311H30.7524L38.2282 0.728516H27.1845Z" fill="#061922"/>
3
+ <path d="M68.1311 7.86444L70 0.728516H48.5923L36.3593 15.0004L40.4369 31.311H62.3544L64.9029 21.1169L67.4515 10.9227H54.1991L52.3301 18.0586H57.9369L56.7476 23.1557H46.3835L45.0243 17.2091L53.0097 7.86444H68.1311Z" fill="#061922"/>
4
+ <path d="M68.6407 36.748H6.45628L1.35919 57.4762H63.5437L68.6407 36.748Z" fill="#1C395C"/>
5
+ <path d="M39.9272 40.6543H31.2621L30.5825 43.3727H39.2476L39.9272 40.6543Z" fill="white"/>
6
+ <path d="M36.1893 44.3926L34.8301 49.8295H31.9417L33.1311 44.3926H30.4126L28.034 53.3974H36.699L38.9078 44.3926H36.1893Z" fill="white"/>
7
+ <path d="M53.0097 40.6543H49.2718L47.5728 43.3727H52.5L53.0097 40.6543Z" fill="white"/>
8
+ <path d="M45.3641 47.4508L45.534 44.3926H41.2864L39.0777 53.3974H41.7961L43.1553 47.9605L42.8155 53.3974H45.1942L47.9126 48.3003L46.5534 53.3974H49.9515L52.1602 44.3926H47.0631L45.3641 47.4508Z" fill="white"/>
9
+ <path d="M45.7039 40.6543H42.1359L41.4563 43.3727H45.534L45.7039 40.6543Z" fill="white"/>
10
+ <path d="M21.068 49.8291L20.5583 46.7708L23.4466 43.3727H28.3738L29.0534 40.6543H21.5777L16.9903 46.431L18.5194 53.397H25.8252L26.6748 49.8291H21.068Z" fill="white"/>
11
+ </svg>
@@ -0,0 +1,15 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="152" height="152" viewBox="0 0 152 152" fill="none">
2
+ <path d="M63.3685 30.6815L47.0778 60.0611V30.6815H32.4056L21.3926 74.6278L20.1611 79.5537H32.4056L35.6426 66.676L37.2963 60.026V79.5537H48.6963L62.1019 55.2408L56.05 79.5537H69.1037L81.2426 30.6815H63.3685Z" fill="white"/>
3
+ <path d="M128.989 42.0815L131.839 30.6815H97.6741L78.0408 53.4815L84.55 79.5537H119.63L123.676 63.2982L127.722 46.9723L106.576 47.0074L103.761 58.3371H112.663L110.622 66.5704H94.226L91.9389 57.0704L104.852 42.0815H128.989Z" fill="white"/>
4
+ <path d="M129.833 88.1741H30.4352L22.2019 121.319H121.6L129.833 88.1741Z" fill="#808485"/>
5
+ <path d="M77.337 94.5426H63.6148L62.524 98.8704H76.2815L77.337 94.5426Z" fill="white"/>
6
+ <path d="M71.3555 100.63L69.2092 109.144H64.5648L66.6759 100.63H62.1018L58.5129 114.95H72.2703L75.824 100.63H71.3555Z" fill="white"/>
7
+ <path d="M46.0574 94.5426L44.9667 98.8704H59.8148L60.8704 94.5426H46.0574Z" fill="white"/>
8
+ <path d="M46.4796 111.326L44.2981 114.95H50.3499L52.4962 111.326H46.4796Z" fill="white"/>
9
+ <path d="M38.2815 107.667L36.1 111.326H42.1166L44.2981 107.667H38.2815Z" fill="white"/>
10
+ <path d="M42.1166 111.326L44.2981 114.95H38.2463L36.1 111.326H42.1166Z" fill="white"/>
11
+ <path d="M52.4963 111.326L55.2055 100.63H49.1889L46.4796 111.326H52.4963Z" fill="white"/>
12
+ <path d="M81.1018 94.5426L80.011 98.8704H84.6555H91.0944H96.3018L97.3925 94.5426H81.1018ZM90.3555 102.072H83.8462L84.1981 100.63H79.5536L78.674 104.148L75.9296 114.985H92.2907L94.5073 106.013L91.6925 104.219L95.4222 102.354L95.8444 100.63H90.6722L90.3555 102.072ZM88.4907 110.13H81.7703L82.8259 106.083H89.2999L88.4907 110.13Z" fill="white"/>
13
+ <path d="M101.157 94.5426L100.067 98.8704H114.844L115.9 94.5426H101.157Z" fill="white"/>
14
+ <path d="M99.5741 100.841L98.2722 106.083H107.315L106.541 109.144H97.4981L96.9352 111.431L96.0555 114.95H110.798L114.422 100.63H99.6444L99.5741 100.841Z" fill="white"/>
15
+ </svg>
@@ -0,0 +1,15 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="152" height="152" viewBox="0 0 152 152" fill="none">
2
+ <path d="M63.3685 30.6815L47.0778 60.0611V30.6815H32.4056L21.3926 74.6278L20.1611 79.5537H32.4056L35.6426 66.676L37.2963 60.026V79.5537H48.6963L62.1019 55.2408L56.05 79.5537H69.1037L81.2426 30.6815H63.3685Z" fill="#061922"/>
3
+ <path d="M128.989 42.0815L131.839 30.6815H97.6741L78.0408 53.4815L84.55 79.5537H119.63L123.676 63.2982L127.722 46.9723L106.576 47.0074L103.761 58.3371H112.663L110.622 66.5704H94.226L91.9389 57.0704L104.852 42.0815H128.989Z" fill="#061922"/>
4
+ <path d="M129.833 88.1741H30.4352L22.2019 121.319H121.6L129.833 88.1741Z" fill="#808485"/>
5
+ <path d="M77.337 94.5426H63.6148L62.524 98.8704H76.2815L77.337 94.5426Z" fill="white"/>
6
+ <path d="M71.3555 100.63L69.2092 109.144H64.5648L66.6759 100.63H62.1018L58.5129 114.95H72.2703L75.824 100.63H71.3555Z" fill="white"/>
7
+ <path d="M46.0574 94.5426L44.9667 98.8704H59.8148L60.8704 94.5426H46.0574Z" fill="white"/>
8
+ <path d="M46.4796 111.326L44.2981 114.95H50.3499L52.4962 111.326H46.4796Z" fill="white"/>
9
+ <path d="M38.2815 107.667L36.1 111.326H42.1166L44.2981 107.667H38.2815Z" fill="white"/>
10
+ <path d="M42.1166 111.326L44.2981 114.95H38.2463L36.1 111.326H42.1166Z" fill="white"/>
11
+ <path d="M52.4963 111.326L55.2055 100.63H49.1889L46.4796 111.326H52.4963Z" fill="white"/>
12
+ <path d="M81.1018 94.5426L80.011 98.8704H84.6555H91.0944H96.3018L97.3925 94.5426H81.1018ZM90.3555 102.072H83.8462L84.1981 100.63H79.5536L78.674 104.148L75.9296 114.985H92.2907L94.5073 106.013L91.6925 104.219L95.4222 102.354L95.8444 100.63H90.6722L90.3555 102.072ZM88.4907 110.13H81.7703L82.8259 106.083H89.2999L88.4907 110.13Z" fill="white"/>
13
+ <path d="M101.157 94.5426L100.067 98.8704H114.844L115.9 94.5426H101.157Z" fill="white"/>
14
+ <path d="M99.5741 100.841L98.2722 106.083H107.315L106.541 109.144H97.4981L96.9352 111.431L96.0555 114.95H110.798L114.422 100.63H99.6444L99.5741 100.841Z" fill="white"/>
15
+ </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="135px" height="135px" viewBox="0 0 135 135" preserveAspectRatio="xMinYMin meet"><rect width="100%" height="100%" fill="white" cx="0" cy="0"/><path d="M5,5l5,0 0,5 -5,0 0,-5z M10,5l5,0 0,5 -5,0 0,-5z M15,5l5,0 0,5 -5,0 0,-5z M20,5l5,0 0,5 -5,0 0,-5z M25,5l5,0 0,5 -5,0 0,-5z M30,5l5,0 0,5 -5,0 0,-5z M35,5l5,0 0,5 -5,0 0,-5z M45,5l5,0 0,5 -5,0 0,-5z M55,5l5,0 0,5 -5,0 0,-5z M65,5l5,0 0,5 -5,0 0,-5z M70,5l5,0 0,5 -5,0 0,-5z M85,5l5,0 0,5 -5,0 0,-5z M95,5l5,0 0,5 -5,0 0,-5z M100,5l5,0 0,5 -5,0 0,-5z M105,5l5,0 0,5 -5,0 0,-5z M110,5l5,0 0,5 -5,0 0,-5z M115,5l5,0 0,5 -5,0 0,-5z M120,5l5,0 0,5 -5,0 0,-5z M125,5l5,0 0,5 -5,0 0,-5z M5,10l5,0 0,5 -5,0 0,-5z M35,10l5,0 0,5 -5,0 0,-5z M50,10l5,0 0,5 -5,0 0,-5z M55,10l5,0 0,5 -5,0 0,-5z M60,10l5,0 0,5 -5,0 0,-5z M65,10l5,0 0,5 -5,0 0,-5z M70,10l5,0 0,5 -5,0 0,-5z M95,10l5,0 0,5 -5,0 0,-5z M125,10l5,0 0,5 -5,0 0,-5z M5,15l5,0 0,5 -5,0 0,-5z M15,15l5,0 0,5 -5,0 0,-5z M20,15l5,0 0,5 -5,0 0,-5z M25,15l5,0 0,5 -5,0 0,-5z M35,15l5,0 0,5 -5,0 0,-5z M45,15l5,0 0,5 -5,0 0,-5z M50,15l5,0 0,5 -5,0 0,-5z M55,15l5,0 0,5 -5,0 0,-5z M70,15l5,0 0,5 -5,0 0,-5z M75,15l5,0 0,5 -5,0 0,-5z M95,15l5,0 0,5 -5,0 0,-5z M105,15l5,0 0,5 -5,0 0,-5z M110,15l5,0 0,5 -5,0 0,-5z M115,15l5,0 0,5 -5,0 0,-5z M125,15l5,0 0,5 -5,0 0,-5z M5,20l5,0 0,5 -5,0 0,-5z M15,20l5,0 0,5 -5,0 0,-5z M20,20l5,0 0,5 -5,0 0,-5z M25,20l5,0 0,5 -5,0 0,-5z M35,20l5,0 0,5 -5,0 0,-5z M45,20l5,0 0,5 -5,0 0,-5z M50,20l5,0 0,5 -5,0 0,-5z M55,20l5,0 0,5 -5,0 0,-5z M65,20l5,0 0,5 -5,0 0,-5z M70,20l5,0 0,5 -5,0 0,-5z M80,20l5,0 0,5 -5,0 0,-5z M85,20l5,0 0,5 -5,0 0,-5z M95,20l5,0 0,5 -5,0 0,-5z M105,20l5,0 0,5 -5,0 0,-5z M110,20l5,0 0,5 -5,0 0,-5z M115,20l5,0 0,5 -5,0 0,-5z M125,20l5,0 0,5 -5,0 0,-5z M5,25l5,0 0,5 -5,0 0,-5z M15,25l5,0 0,5 -5,0 0,-5z M20,25l5,0 0,5 -5,0 0,-5z M25,25l5,0 0,5 -5,0 0,-5z M35,25l5,0 0,5 -5,0 0,-5z M45,25l5,0 0,5 -5,0 0,-5z M60,25l5,0 0,5 -5,0 0,-5z M65,25l5,0 0,5 -5,0 0,-5z M70,25l5,0 0,5 -5,0 0,-5z M75,25l5,0 0,5 -5,0 0,-5z M80,25l5,0 0,5 -5,0 0,-5z M85,25l5,0 0,5 -5,0 0,-5z M95,25l5,0 0,5 -5,0 0,-5z M105,25l5,0 0,5 -5,0 0,-5z M110,25l5,0 0,5 -5,0 0,-5z M115,25l5,0 0,5 -5,0 0,-5z M125,25l5,0 0,5 -5,0 0,-5z M5,30l5,0 0,5 -5,0 0,-5z M35,30l5,0 0,5 -5,0 0,-5z M55,30l5,0 0,5 -5,0 0,-5z M60,30l5,0 0,5 -5,0 0,-5z M75,30l5,0 0,5 -5,0 0,-5z M85,30l5,0 0,5 -5,0 0,-5z M95,30l5,0 0,5 -5,0 0,-5z M125,30l5,0 0,5 -5,0 0,-5z M5,35l5,0 0,5 -5,0 0,-5z M10,35l5,0 0,5 -5,0 0,-5z M15,35l5,0 0,5 -5,0 0,-5z M20,35l5,0 0,5 -5,0 0,-5z M25,35l5,0 0,5 -5,0 0,-5z M30,35l5,0 0,5 -5,0 0,-5z M35,35l5,0 0,5 -5,0 0,-5z M45,35l5,0 0,5 -5,0 0,-5z M55,35l5,0 0,5 -5,0 0,-5z M65,35l5,0 0,5 -5,0 0,-5z M75,35l5,0 0,5 -5,0 0,-5z M85,35l5,0 0,5 -5,0 0,-5z M95,35l5,0 0,5 -5,0 0,-5z M100,35l5,0 0,5 -5,0 0,-5z M105,35l5,0 0,5 -5,0 0,-5z M110,35l5,0 0,5 -5,0 0,-5z M115,35l5,0 0,5 -5,0 0,-5z M120,35l5,0 0,5 -5,0 0,-5z M125,35l5,0 0,5 -5,0 0,-5z M55,40l5,0 0,5 -5,0 0,-5z M65,40l5,0 0,5 -5,0 0,-5z M80,40l5,0 0,5 -5,0 0,-5z M85,40l5,0 0,5 -5,0 0,-5z M5,45l5,0 0,5 -5,0 0,-5z M10,45l5,0 0,5 -5,0 0,-5z M15,45l5,0 0,5 -5,0 0,-5z M20,45l5,0 0,5 -5,0 0,-5z M35,45l5,0 0,5 -5,0 0,-5z M45,45l5,0 0,5 -5,0 0,-5z M55,45l5,0 0,5 -5,0 0,-5z M60,45l5,0 0,5 -5,0 0,-5z M65,45l5,0 0,5 -5,0 0,-5z M75,45l5,0 0,5 -5,0 0,-5z M80,45l5,0 0,5 -5,0 0,-5z M85,45l5,0 0,5 -5,0 0,-5z M90,45l5,0 0,5 -5,0 0,-5z M105,45l5,0 0,5 -5,0 0,-5z M110,45l5,0 0,5 -5,0 0,-5z M115,45l5,0 0,5 -5,0 0,-5z M125,45l5,0 0,5 -5,0 0,-5z M20,50l5,0 0,5 -5,0 0,-5z M40,50l5,0 0,5 -5,0 0,-5z M45,50l5,0 0,5 -5,0 0,-5z M55,50l5,0 0,5 -5,0 0,-5z M65,50l5,0 0,5 -5,0 0,-5z M100,50l5,0 0,5 -5,0 0,-5z M120,50l5,0 0,5 -5,0 0,-5z M15,55l5,0 0,5 -5,0 0,-5z M20,55l5,0 0,5 -5,0 0,-5z M25,55l5,0 0,5 -5,0 0,-5z M30,55l5,0 0,5 -5,0 0,-5z M35,55l5,0 0,5 -5,0 0,-5z M50,55l5,0 0,5 -5,0 0,-5z M55,55l5,0 0,5 -5,0 0,-5z M60,55l5,0 0,5 -5,0 0,-5z M65,55l5,0 0,5 -5,0 0,-5z M85,55l5,0 0,5 -5,0 0,-5z M95,55l5,0 0,5 -5,0 0,-5z M100,55l5,0 0,5 -5,0 0,-5z M10,60l5,0 0,5 -5,0 0,-5z M25,60l5,0 0,5 -5,0 0,-5z M30,60l5,0 0,5 -5,0 0,-5z M45,60l5,0 0,5 -5,0 0,-5z M50,60l5,0 0,5 -5,0 0,-5z M55,60l5,0 0,5 -5,0 0,-5z M70,60l5,0 0,5 -5,0 0,-5z M80,60l5,0 0,5 -5,0 0,-5z M85,60l5,0 0,5 -5,0 0,-5z M95,60l5,0 0,5 -5,0 0,-5z M105,60l5,0 0,5 -5,0 0,-5z M110,60l5,0 0,5 -5,0 0,-5z M115,60l5,0 0,5 -5,0 0,-5z M5,65l5,0 0,5 -5,0 0,-5z M10,65l5,0 0,5 -5,0 0,-5z M20,65l5,0 0,5 -5,0 0,-5z M25,65l5,0 0,5 -5,0 0,-5z M30,65l5,0 0,5 -5,0 0,-5z M35,65l5,0 0,5 -5,0 0,-5z M45,65l5,0 0,5 -5,0 0,-5z M50,65l5,0 0,5 -5,0 0,-5z M55,65l5,0 0,5 -5,0 0,-5z M65,65l5,0 0,5 -5,0 0,-5z M70,65l5,0 0,5 -5,0 0,-5z M75,65l5,0 0,5 -5,0 0,-5z M90,65l5,0 0,5 -5,0 0,-5z M95,65l5,0 0,5 -5,0 0,-5z M105,65l5,0 0,5 -5,0 0,-5z M115,65l5,0 0,5 -5,0 0,-5z M120,65l5,0 0,5 -5,0 0,-5z M125,65l5,0 0,5 -5,0 0,-5z M10,70l5,0 0,5 -5,0 0,-5z M15,70l5,0 0,5 -5,0 0,-5z M25,70l5,0 0,5 -5,0 0,-5z M40,70l5,0 0,5 -5,0 0,-5z M45,70l5,0 0,5 -5,0 0,-5z M50,70l5,0 0,5 -5,0 0,-5z M60,70l5,0 0,5 -5,0 0,-5z M65,70l5,0 0,5 -5,0 0,-5z M75,70l5,0 0,5 -5,0 0,-5z M80,70l5,0 0,5 -5,0 0,-5z M85,70l5,0 0,5 -5,0 0,-5z M90,70l5,0 0,5 -5,0 0,-5z M95,70l5,0 0,5 -5,0 0,-5z M100,70l5,0 0,5 -5,0 0,-5z M105,70l5,0 0,5 -5,0 0,-5z M125,70l5,0 0,5 -5,0 0,-5z M10,75l5,0 0,5 -5,0 0,-5z M15,75l5,0 0,5 -5,0 0,-5z M25,75l5,0 0,5 -5,0 0,-5z M35,75l5,0 0,5 -5,0 0,-5z M40,75l5,0 0,5 -5,0 0,-5z M45,75l5,0 0,5 -5,0 0,-5z M50,75l5,0 0,5 -5,0 0,-5z M55,75l5,0 0,5 -5,0 0,-5z M60,75l5,0 0,5 -5,0 0,-5z M70,75l5,0 0,5 -5,0 0,-5z M75,75l5,0 0,5 -5,0 0,-5z M85,75l5,0 0,5 -5,0 0,-5z M90,75l5,0 0,5 -5,0 0,-5z M105,75l5,0 0,5 -5,0 0,-5z M115,75l5,0 0,5 -5,0 0,-5z M120,75l5,0 0,5 -5,0 0,-5z M5,80l5,0 0,5 -5,0 0,-5z M15,80l5,0 0,5 -5,0 0,-5z M20,80l5,0 0,5 -5,0 0,-5z M25,80l5,0 0,5 -5,0 0,-5z M45,80l5,0 0,5 -5,0 0,-5z M60,80l5,0 0,5 -5,0 0,-5z M85,80l5,0 0,5 -5,0 0,-5z M90,80l5,0 0,5 -5,0 0,-5z M95,80l5,0 0,5 -5,0 0,-5z M100,80l5,0 0,5 -5,0 0,-5z M105,80l5,0 0,5 -5,0 0,-5z M125,80l5,0 0,5 -5,0 0,-5z M15,85l5,0 0,5 -5,0 0,-5z M35,85l5,0 0,5 -5,0 0,-5z M40,85l5,0 0,5 -5,0 0,-5z M45,85l5,0 0,5 -5,0 0,-5z M55,85l5,0 0,5 -5,0 0,-5z M70,85l5,0 0,5 -5,0 0,-5z M75,85l5,0 0,5 -5,0 0,-5z M80,85l5,0 0,5 -5,0 0,-5z M85,85l5,0 0,5 -5,0 0,-5z M90,85l5,0 0,5 -5,0 0,-5z M95,85l5,0 0,5 -5,0 0,-5z M100,85l5,0 0,5 -5,0 0,-5z M105,85l5,0 0,5 -5,0 0,-5z M110,85l5,0 0,5 -5,0 0,-5z M115,85l5,0 0,5 -5,0 0,-5z M120,85l5,0 0,5 -5,0 0,-5z M125,85l5,0 0,5 -5,0 0,-5z M45,90l5,0 0,5 -5,0 0,-5z M50,90l5,0 0,5 -5,0 0,-5z M55,90l5,0 0,5 -5,0 0,-5z M75,90l5,0 0,5 -5,0 0,-5z M85,90l5,0 0,5 -5,0 0,-5z M105,90l5,0 0,5 -5,0 0,-5z M115,90l5,0 0,5 -5,0 0,-5z M125,90l5,0 0,5 -5,0 0,-5z M5,95l5,0 0,5 -5,0 0,-5z M10,95l5,0 0,5 -5,0 0,-5z M15,95l5,0 0,5 -5,0 0,-5z M20,95l5,0 0,5 -5,0 0,-5z M25,95l5,0 0,5 -5,0 0,-5z M30,95l5,0 0,5 -5,0 0,-5z M35,95l5,0 0,5 -5,0 0,-5z M55,95l5,0 0,5 -5,0 0,-5z M65,95l5,0 0,5 -5,0 0,-5z M85,95l5,0 0,5 -5,0 0,-5z M95,95l5,0 0,5 -5,0 0,-5z M105,95l5,0 0,5 -5,0 0,-5z M115,95l5,0 0,5 -5,0 0,-5z M120,95l5,0 0,5 -5,0 0,-5z M125,95l5,0 0,5 -5,0 0,-5z M5,100l5,0 0,5 -5,0 0,-5z M35,100l5,0 0,5 -5,0 0,-5z M50,100l5,0 0,5 -5,0 0,-5z M55,100l5,0 0,5 -5,0 0,-5z M60,100l5,0 0,5 -5,0 0,-5z M75,100l5,0 0,5 -5,0 0,-5z M80,100l5,0 0,5 -5,0 0,-5z M85,100l5,0 0,5 -5,0 0,-5z M105,100l5,0 0,5 -5,0 0,-5z M5,105l5,0 0,5 -5,0 0,-5z M15,105l5,0 0,5 -5,0 0,-5z M20,105l5,0 0,5 -5,0 0,-5z M25,105l5,0 0,5 -5,0 0,-5z M35,105l5,0 0,5 -5,0 0,-5z M55,105l5,0 0,5 -5,0 0,-5z M60,105l5,0 0,5 -5,0 0,-5z M65,105l5,0 0,5 -5,0 0,-5z M75,105l5,0 0,5 -5,0 0,-5z M85,105l5,0 0,5 -5,0 0,-5z M90,105l5,0 0,5 -5,0 0,-5z M95,105l5,0 0,5 -5,0 0,-5z M100,105l5,0 0,5 -5,0 0,-5z M105,105l5,0 0,5 -5,0 0,-5z M110,105l5,0 0,5 -5,0 0,-5z M125,105l5,0 0,5 -5,0 0,-5z M5,110l5,0 0,5 -5,0 0,-5z M15,110l5,0 0,5 -5,0 0,-5z M20,110l5,0 0,5 -5,0 0,-5z M25,110l5,0 0,5 -5,0 0,-5z M35,110l5,0 0,5 -5,0 0,-5z M45,110l5,0 0,5 -5,0 0,-5z M50,110l5,0 0,5 -5,0 0,-5z M55,110l5,0 0,5 -5,0 0,-5z M60,110l5,0 0,5 -5,0 0,-5z M65,110l5,0 0,5 -5,0 0,-5z M70,110l5,0 0,5 -5,0 0,-5z M75,110l5,0 0,5 -5,0 0,-5z M90,110l5,0 0,5 -5,0 0,-5z M95,110l5,0 0,5 -5,0 0,-5z M105,110l5,0 0,5 -5,0 0,-5z M110,110l5,0 0,5 -5,0 0,-5z M115,110l5,0 0,5 -5,0 0,-5z M120,110l5,0 0,5 -5,0 0,-5z M125,110l5,0 0,5 -5,0 0,-5z M5,115l5,0 0,5 -5,0 0,-5z M15,115l5,0 0,5 -5,0 0,-5z M20,115l5,0 0,5 -5,0 0,-5z M25,115l5,0 0,5 -5,0 0,-5z M35,115l5,0 0,5 -5,0 0,-5z M45,115l5,0 0,5 -5,0 0,-5z M55,115l5,0 0,5 -5,0 0,-5z M60,115l5,0 0,5 -5,0 0,-5z M75,115l5,0 0,5 -5,0 0,-5z M85,115l5,0 0,5 -5,0 0,-5z M90,115l5,0 0,5 -5,0 0,-5z M95,115l5,0 0,5 -5,0 0,-5z M105,115l5,0 0,5 -5,0 0,-5z M115,115l5,0 0,5 -5,0 0,-5z M120,115l5,0 0,5 -5,0 0,-5z M5,120l5,0 0,5 -5,0 0,-5z M35,120l5,0 0,5 -5,0 0,-5z M45,120l5,0 0,5 -5,0 0,-5z M55,120l5,0 0,5 -5,0 0,-5z M70,120l5,0 0,5 -5,0 0,-5z M90,120l5,0 0,5 -5,0 0,-5z M95,120l5,0 0,5 -5,0 0,-5z M105,120l5,0 0,5 -5,0 0,-5z M115,120l5,0 0,5 -5,0 0,-5z M5,125l5,0 0,5 -5,0 0,-5z M10,125l5,0 0,5 -5,0 0,-5z M15,125l5,0 0,5 -5,0 0,-5z M20,125l5,0 0,5 -5,0 0,-5z M25,125l5,0 0,5 -5,0 0,-5z M30,125l5,0 0,5 -5,0 0,-5z M35,125l5,0 0,5 -5,0 0,-5z M45,125l5,0 0,5 -5,0 0,-5z M50,125l5,0 0,5 -5,0 0,-5z M55,125l5,0 0,5 -5,0 0,-5z M70,125l5,0 0,5 -5,0 0,-5z M75,125l5,0 0,5 -5,0 0,-5z M95,125l5,0 0,5 -5,0 0,-5z M100,125l5,0 0,5 -5,0 0,-5z M105,125l5,0 0,5 -5,0 0,-5z M110,125l5,0 0,5 -5,0 0,-5z M115,125l5,0 0,5 -5,0 0,-5z M120,125l5,0 0,5 -5,0 0,-5z M125,125l5,0 0,5 -5,0 0,-5z " stroke="transparent" fill="black"/></svg>
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="135px" height="135px" viewBox="0 0 135 135" preserveAspectRatio="xMinYMin meet"><rect width="100%" height="100%" fill="white" cx="0" cy="0"/><path d="M5,5l5,0 0,5 -5,0 0,-5z M10,5l5,0 0,5 -5,0 0,-5z M15,5l5,0 0,5 -5,0 0,-5z M20,5l5,0 0,5 -5,0 0,-5z M25,5l5,0 0,5 -5,0 0,-5z M30,5l5,0 0,5 -5,0 0,-5z M35,5l5,0 0,5 -5,0 0,-5z M45,5l5,0 0,5 -5,0 0,-5z M55,5l5,0 0,5 -5,0 0,-5z M65,5l5,0 0,5 -5,0 0,-5z M70,5l5,0 0,5 -5,0 0,-5z M85,5l5,0 0,5 -5,0 0,-5z M95,5l5,0 0,5 -5,0 0,-5z M100,5l5,0 0,5 -5,0 0,-5z M105,5l5,0 0,5 -5,0 0,-5z M110,5l5,0 0,5 -5,0 0,-5z M115,5l5,0 0,5 -5,0 0,-5z M120,5l5,0 0,5 -5,0 0,-5z M125,5l5,0 0,5 -5,0 0,-5z M5,10l5,0 0,5 -5,0 0,-5z M35,10l5,0 0,5 -5,0 0,-5z M50,10l5,0 0,5 -5,0 0,-5z M55,10l5,0 0,5 -5,0 0,-5z M60,10l5,0 0,5 -5,0 0,-5z M65,10l5,0 0,5 -5,0 0,-5z M70,10l5,0 0,5 -5,0 0,-5z M95,10l5,0 0,5 -5,0 0,-5z M125,10l5,0 0,5 -5,0 0,-5z M5,15l5,0 0,5 -5,0 0,-5z M15,15l5,0 0,5 -5,0 0,-5z M20,15l5,0 0,5 -5,0 0,-5z M25,15l5,0 0,5 -5,0 0,-5z M35,15l5,0 0,5 -5,0 0,-5z M45,15l5,0 0,5 -5,0 0,-5z M50,15l5,0 0,5 -5,0 0,-5z M55,15l5,0 0,5 -5,0 0,-5z M70,15l5,0 0,5 -5,0 0,-5z M75,15l5,0 0,5 -5,0 0,-5z M95,15l5,0 0,5 -5,0 0,-5z M105,15l5,0 0,5 -5,0 0,-5z M110,15l5,0 0,5 -5,0 0,-5z M115,15l5,0 0,5 -5,0 0,-5z M125,15l5,0 0,5 -5,0 0,-5z M5,20l5,0 0,5 -5,0 0,-5z M15,20l5,0 0,5 -5,0 0,-5z M20,20l5,0 0,5 -5,0 0,-5z M25,20l5,0 0,5 -5,0 0,-5z M35,20l5,0 0,5 -5,0 0,-5z M45,20l5,0 0,5 -5,0 0,-5z M50,20l5,0 0,5 -5,0 0,-5z M55,20l5,0 0,5 -5,0 0,-5z M65,20l5,0 0,5 -5,0 0,-5z M70,20l5,0 0,5 -5,0 0,-5z M80,20l5,0 0,5 -5,0 0,-5z M85,20l5,0 0,5 -5,0 0,-5z M95,20l5,0 0,5 -5,0 0,-5z M105,20l5,0 0,5 -5,0 0,-5z M110,20l5,0 0,5 -5,0 0,-5z M115,20l5,0 0,5 -5,0 0,-5z M125,20l5,0 0,5 -5,0 0,-5z M5,25l5,0 0,5 -5,0 0,-5z M15,25l5,0 0,5 -5,0 0,-5z M20,25l5,0 0,5 -5,0 0,-5z M25,25l5,0 0,5 -5,0 0,-5z M35,25l5,0 0,5 -5,0 0,-5z M45,25l5,0 0,5 -5,0 0,-5z M60,25l5,0 0,5 -5,0 0,-5z M65,25l5,0 0,5 -5,0 0,-5z M70,25l5,0 0,5 -5,0 0,-5z M75,25l5,0 0,5 -5,0 0,-5z M80,25l5,0 0,5 -5,0 0,-5z M85,25l5,0 0,5 -5,0 0,-5z M95,25l5,0 0,5 -5,0 0,-5z M105,25l5,0 0,5 -5,0 0,-5z M110,25l5,0 0,5 -5,0 0,-5z M115,25l5,0 0,5 -5,0 0,-5z M125,25l5,0 0,5 -5,0 0,-5z M5,30l5,0 0,5 -5,0 0,-5z M35,30l5,0 0,5 -5,0 0,-5z M55,30l5,0 0,5 -5,0 0,-5z M60,30l5,0 0,5 -5,0 0,-5z M75,30l5,0 0,5 -5,0 0,-5z M85,30l5,0 0,5 -5,0 0,-5z M95,30l5,0 0,5 -5,0 0,-5z M125,30l5,0 0,5 -5,0 0,-5z M5,35l5,0 0,5 -5,0 0,-5z M10,35l5,0 0,5 -5,0 0,-5z M15,35l5,0 0,5 -5,0 0,-5z M20,35l5,0 0,5 -5,0 0,-5z M25,35l5,0 0,5 -5,0 0,-5z M30,35l5,0 0,5 -5,0 0,-5z M35,35l5,0 0,5 -5,0 0,-5z M45,35l5,0 0,5 -5,0 0,-5z M55,35l5,0 0,5 -5,0 0,-5z M65,35l5,0 0,5 -5,0 0,-5z M75,35l5,0 0,5 -5,0 0,-5z M85,35l5,0 0,5 -5,0 0,-5z M95,35l5,0 0,5 -5,0 0,-5z M100,35l5,0 0,5 -5,0 0,-5z M105,35l5,0 0,5 -5,0 0,-5z M110,35l5,0 0,5 -5,0 0,-5z M115,35l5,0 0,5 -5,0 0,-5z M120,35l5,0 0,5 -5,0 0,-5z M125,35l5,0 0,5 -5,0 0,-5z M55,40l5,0 0,5 -5,0 0,-5z M65,40l5,0 0,5 -5,0 0,-5z M80,40l5,0 0,5 -5,0 0,-5z M85,40l5,0 0,5 -5,0 0,-5z M5,45l5,0 0,5 -5,0 0,-5z M10,45l5,0 0,5 -5,0 0,-5z M15,45l5,0 0,5 -5,0 0,-5z M20,45l5,0 0,5 -5,0 0,-5z M35,45l5,0 0,5 -5,0 0,-5z M45,45l5,0 0,5 -5,0 0,-5z M55,45l5,0 0,5 -5,0 0,-5z M60,45l5,0 0,5 -5,0 0,-5z M65,45l5,0 0,5 -5,0 0,-5z M75,45l5,0 0,5 -5,0 0,-5z M80,45l5,0 0,5 -5,0 0,-5z M85,45l5,0 0,5 -5,0 0,-5z M90,45l5,0 0,5 -5,0 0,-5z M105,45l5,0 0,5 -5,0 0,-5z M110,45l5,0 0,5 -5,0 0,-5z M115,45l5,0 0,5 -5,0 0,-5z M125,45l5,0 0,5 -5,0 0,-5z M15,50l5,0 0,5 -5,0 0,-5z M20,50l5,0 0,5 -5,0 0,-5z M25,50l5,0 0,5 -5,0 0,-5z M40,50l5,0 0,5 -5,0 0,-5z M55,50l5,0 0,5 -5,0 0,-5z M65,50l5,0 0,5 -5,0 0,-5z M75,50l5,0 0,5 -5,0 0,-5z M100,50l5,0 0,5 -5,0 0,-5z M120,50l5,0 0,5 -5,0 0,-5z M5,55l5,0 0,5 -5,0 0,-5z M10,55l5,0 0,5 -5,0 0,-5z M25,55l5,0 0,5 -5,0 0,-5z M30,55l5,0 0,5 -5,0 0,-5z M35,55l5,0 0,5 -5,0 0,-5z M40,55l5,0 0,5 -5,0 0,-5z M50,55l5,0 0,5 -5,0 0,-5z M55,55l5,0 0,5 -5,0 0,-5z M60,55l5,0 0,5 -5,0 0,-5z M65,55l5,0 0,5 -5,0 0,-5z M85,55l5,0 0,5 -5,0 0,-5z M95,55l5,0 0,5 -5,0 0,-5z M100,55l5,0 0,5 -5,0 0,-5z M10,60l5,0 0,5 -5,0 0,-5z M15,60l5,0 0,5 -5,0 0,-5z M30,60l5,0 0,5 -5,0 0,-5z M45,60l5,0 0,5 -5,0 0,-5z M50,60l5,0 0,5 -5,0 0,-5z M55,60l5,0 0,5 -5,0 0,-5z M70,60l5,0 0,5 -5,0 0,-5z M75,60l5,0 0,5 -5,0 0,-5z M80,60l5,0 0,5 -5,0 0,-5z M85,60l5,0 0,5 -5,0 0,-5z M95,60l5,0 0,5 -5,0 0,-5z M105,60l5,0 0,5 -5,0 0,-5z M110,60l5,0 0,5 -5,0 0,-5z M115,60l5,0 0,5 -5,0 0,-5z M15,65l5,0 0,5 -5,0 0,-5z M35,65l5,0 0,5 -5,0 0,-5z M50,65l5,0 0,5 -5,0 0,-5z M55,65l5,0 0,5 -5,0 0,-5z M65,65l5,0 0,5 -5,0 0,-5z M70,65l5,0 0,5 -5,0 0,-5z M90,65l5,0 0,5 -5,0 0,-5z M95,65l5,0 0,5 -5,0 0,-5z M105,65l5,0 0,5 -5,0 0,-5z M115,65l5,0 0,5 -5,0 0,-5z M120,65l5,0 0,5 -5,0 0,-5z M125,65l5,0 0,5 -5,0 0,-5z M30,70l5,0 0,5 -5,0 0,-5z M40,70l5,0 0,5 -5,0 0,-5z M60,70l5,0 0,5 -5,0 0,-5z M65,70l5,0 0,5 -5,0 0,-5z M80,70l5,0 0,5 -5,0 0,-5z M85,70l5,0 0,5 -5,0 0,-5z M90,70l5,0 0,5 -5,0 0,-5z M95,70l5,0 0,5 -5,0 0,-5z M100,70l5,0 0,5 -5,0 0,-5z M105,70l5,0 0,5 -5,0 0,-5z M125,70l5,0 0,5 -5,0 0,-5z M10,75l5,0 0,5 -5,0 0,-5z M20,75l5,0 0,5 -5,0 0,-5z M25,75l5,0 0,5 -5,0 0,-5z M35,75l5,0 0,5 -5,0 0,-5z M40,75l5,0 0,5 -5,0 0,-5z M55,75l5,0 0,5 -5,0 0,-5z M60,75l5,0 0,5 -5,0 0,-5z M85,75l5,0 0,5 -5,0 0,-5z M90,75l5,0 0,5 -5,0 0,-5z M105,75l5,0 0,5 -5,0 0,-5z M115,75l5,0 0,5 -5,0 0,-5z M120,75l5,0 0,5 -5,0 0,-5z M5,80l5,0 0,5 -5,0 0,-5z M25,80l5,0 0,5 -5,0 0,-5z M40,80l5,0 0,5 -5,0 0,-5z M45,80l5,0 0,5 -5,0 0,-5z M55,80l5,0 0,5 -5,0 0,-5z M60,80l5,0 0,5 -5,0 0,-5z M75,80l5,0 0,5 -5,0 0,-5z M85,80l5,0 0,5 -5,0 0,-5z M90,80l5,0 0,5 -5,0 0,-5z M95,80l5,0 0,5 -5,0 0,-5z M100,80l5,0 0,5 -5,0 0,-5z M105,80l5,0 0,5 -5,0 0,-5z M125,80l5,0 0,5 -5,0 0,-5z M15,85l5,0 0,5 -5,0 0,-5z M20,85l5,0 0,5 -5,0 0,-5z M25,85l5,0 0,5 -5,0 0,-5z M35,85l5,0 0,5 -5,0 0,-5z M50,85l5,0 0,5 -5,0 0,-5z M70,85l5,0 0,5 -5,0 0,-5z M75,85l5,0 0,5 -5,0 0,-5z M80,85l5,0 0,5 -5,0 0,-5z M85,85l5,0 0,5 -5,0 0,-5z M90,85l5,0 0,5 -5,0 0,-5z M95,85l5,0 0,5 -5,0 0,-5z M100,85l5,0 0,5 -5,0 0,-5z M105,85l5,0 0,5 -5,0 0,-5z M110,85l5,0 0,5 -5,0 0,-5z M115,85l5,0 0,5 -5,0 0,-5z M120,85l5,0 0,5 -5,0 0,-5z M125,85l5,0 0,5 -5,0 0,-5z M45,90l5,0 0,5 -5,0 0,-5z M55,90l5,0 0,5 -5,0 0,-5z M70,90l5,0 0,5 -5,0 0,-5z M75,90l5,0 0,5 -5,0 0,-5z M85,90l5,0 0,5 -5,0 0,-5z M105,90l5,0 0,5 -5,0 0,-5z M115,90l5,0 0,5 -5,0 0,-5z M125,90l5,0 0,5 -5,0 0,-5z M5,95l5,0 0,5 -5,0 0,-5z M10,95l5,0 0,5 -5,0 0,-5z M15,95l5,0 0,5 -5,0 0,-5z M20,95l5,0 0,5 -5,0 0,-5z M25,95l5,0 0,5 -5,0 0,-5z M30,95l5,0 0,5 -5,0 0,-5z M35,95l5,0 0,5 -5,0 0,-5z M55,95l5,0 0,5 -5,0 0,-5z M65,95l5,0 0,5 -5,0 0,-5z M70,95l5,0 0,5 -5,0 0,-5z M85,95l5,0 0,5 -5,0 0,-5z M95,95l5,0 0,5 -5,0 0,-5z M105,95l5,0 0,5 -5,0 0,-5z M115,95l5,0 0,5 -5,0 0,-5z M120,95l5,0 0,5 -5,0 0,-5z M125,95l5,0 0,5 -5,0 0,-5z M5,100l5,0 0,5 -5,0 0,-5z M35,100l5,0 0,5 -5,0 0,-5z M50,100l5,0 0,5 -5,0 0,-5z M65,100l5,0 0,5 -5,0 0,-5z M75,100l5,0 0,5 -5,0 0,-5z M80,100l5,0 0,5 -5,0 0,-5z M85,100l5,0 0,5 -5,0 0,-5z M105,100l5,0 0,5 -5,0 0,-5z M5,105l5,0 0,5 -5,0 0,-5z M15,105l5,0 0,5 -5,0 0,-5z M20,105l5,0 0,5 -5,0 0,-5z M25,105l5,0 0,5 -5,0 0,-5z M35,105l5,0 0,5 -5,0 0,-5z M65,105l5,0 0,5 -5,0 0,-5z M75,105l5,0 0,5 -5,0 0,-5z M85,105l5,0 0,5 -5,0 0,-5z M90,105l5,0 0,5 -5,0 0,-5z M95,105l5,0 0,5 -5,0 0,-5z M100,105l5,0 0,5 -5,0 0,-5z M105,105l5,0 0,5 -5,0 0,-5z M110,105l5,0 0,5 -5,0 0,-5z M125,105l5,0 0,5 -5,0 0,-5z M5,110l5,0 0,5 -5,0 0,-5z M15,110l5,0 0,5 -5,0 0,-5z M20,110l5,0 0,5 -5,0 0,-5z M25,110l5,0 0,5 -5,0 0,-5z M35,110l5,0 0,5 -5,0 0,-5z M45,110l5,0 0,5 -5,0 0,-5z M55,110l5,0 0,5 -5,0 0,-5z M60,110l5,0 0,5 -5,0 0,-5z M75,110l5,0 0,5 -5,0 0,-5z M90,110l5,0 0,5 -5,0 0,-5z M95,110l5,0 0,5 -5,0 0,-5z M105,110l5,0 0,5 -5,0 0,-5z M110,110l5,0 0,5 -5,0 0,-5z M115,110l5,0 0,5 -5,0 0,-5z M120,110l5,0 0,5 -5,0 0,-5z M125,110l5,0 0,5 -5,0 0,-5z M5,115l5,0 0,5 -5,0 0,-5z M15,115l5,0 0,5 -5,0 0,-5z M20,115l5,0 0,5 -5,0 0,-5z M25,115l5,0 0,5 -5,0 0,-5z M35,115l5,0 0,5 -5,0 0,-5z M45,115l5,0 0,5 -5,0 0,-5z M50,115l5,0 0,5 -5,0 0,-5z M55,115l5,0 0,5 -5,0 0,-5z M60,115l5,0 0,5 -5,0 0,-5z M70,115l5,0 0,5 -5,0 0,-5z M75,115l5,0 0,5 -5,0 0,-5z M85,115l5,0 0,5 -5,0 0,-5z M90,115l5,0 0,5 -5,0 0,-5z M95,115l5,0 0,5 -5,0 0,-5z M105,115l5,0 0,5 -5,0 0,-5z M115,115l5,0 0,5 -5,0 0,-5z M120,115l5,0 0,5 -5,0 0,-5z M5,120l5,0 0,5 -5,0 0,-5z M35,120l5,0 0,5 -5,0 0,-5z M45,120l5,0 0,5 -5,0 0,-5z M70,120l5,0 0,5 -5,0 0,-5z M90,120l5,0 0,5 -5,0 0,-5z M95,120l5,0 0,5 -5,0 0,-5z M105,120l5,0 0,5 -5,0 0,-5z M115,120l5,0 0,5 -5,0 0,-5z M5,125l5,0 0,5 -5,0 0,-5z M10,125l5,0 0,5 -5,0 0,-5z M15,125l5,0 0,5 -5,0 0,-5z M20,125l5,0 0,5 -5,0 0,-5z M25,125l5,0 0,5 -5,0 0,-5z M30,125l5,0 0,5 -5,0 0,-5z M35,125l5,0 0,5 -5,0 0,-5z M45,125l5,0 0,5 -5,0 0,-5z M50,125l5,0 0,5 -5,0 0,-5z M55,125l5,0 0,5 -5,0 0,-5z M70,125l5,0 0,5 -5,0 0,-5z M75,125l5,0 0,5 -5,0 0,-5z M95,125l5,0 0,5 -5,0 0,-5z M100,125l5,0 0,5 -5,0 0,-5z M105,125l5,0 0,5 -5,0 0,-5z M110,125l5,0 0,5 -5,0 0,-5z M115,125l5,0 0,5 -5,0 0,-5z M120,125l5,0 0,5 -5,0 0,-5z M125,125l5,0 0,5 -5,0 0,-5z " stroke="transparent" fill="black"/></svg>
@@ -0,0 +1,39 @@
1
+ import axios from "axios";
2
+
3
+ export interface CampaignBanner {
4
+ id: number;
5
+ title: string;
6
+ link: string;
7
+ url_image: string;
8
+ url_image_mobile: string;
9
+ }
10
+
11
+ const getNetworkBaseUrl = (): string => {
12
+ try {
13
+ // nuxt runtime config (preferred in SSR context)
14
+ const config = useRuntimeConfig();
15
+ const nuxtUrl = (config.public as any).mgSharedUi?.networkBaseUrl;
16
+ if (nuxtUrl) return nuxtUrl;
17
+ } catch {
18
+ // not in composable context — fall through to env var
19
+ }
20
+ return (import.meta.env.VITE_BASE_URL_NETWORK as string) || "";
21
+ };
22
+
23
+ export const fetchCampaignBanners = (
24
+ platform: string,
25
+ page: string,
26
+ language: string,
27
+ country?: string,
28
+ ): Promise<CampaignBanner[]> =>
29
+ axios
30
+ .get<{ data: CampaignBanner[] }>(`${getNetworkBaseUrl()}/public/campaigns-banners`, {
31
+ params: { platform, page, type: "web", language, ...(country ? { country } : {}) },
32
+ withCredentials: false,
33
+ })
34
+ .then((r) => r.data?.data ?? [])
35
+ .catch((): CampaignBanner[] => []);
36
+
37
+ export const clickCampaignBanner = (id: number): void => {
38
+ axios.put(`${getNetworkBaseUrl()}/public/campaigns-banners/${id}/click`).catch(() => {});
39
+ };
@@ -0,0 +1,137 @@
1
+ import { defineStore } from "pinia";
2
+
3
+ export interface AppInstallBanner {
4
+ id: number;
5
+ platform_id: number;
6
+ is_active: boolean;
7
+ ios_url: string | null;
8
+ android_url: string | null;
9
+ qr_code_url: string | null;
10
+ qr_code_url_dark: string | null;
11
+ logo_light_url: string | null;
12
+ logo_dark_url: string | null;
13
+ updated_at: string | null;
14
+ }
15
+
16
+ const CACHE_KEY_PREFIX = "mg_app_install_banner_cache_";
17
+ const DISMISS_KEY_PREFIX = "mg_app_install_dismissed_";
18
+ const CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes
19
+
20
+ interface CacheEntry {
21
+ banner: AppInstallBanner | null;
22
+ cachedAt: number;
23
+ }
24
+
25
+ function readCache(platformId: number): AppInstallBanner | null | undefined {
26
+ try {
27
+ const raw = localStorage.getItem(`${CACHE_KEY_PREFIX}${platformId}`);
28
+ if (!raw) return undefined;
29
+ const entry: CacheEntry = JSON.parse(raw);
30
+ if (Date.now() - entry.cachedAt > CACHE_TTL_MS) return undefined;
31
+ return entry.banner;
32
+ } catch {
33
+ return undefined;
34
+ }
35
+ }
36
+
37
+ function writeCache(platformId: number, banner: AppInstallBanner | null) {
38
+ try {
39
+ const entry: CacheEntry = { banner, cachedAt: Date.now() };
40
+ localStorage.setItem(`${CACHE_KEY_PREFIX}${platformId}`, JSON.stringify(entry));
41
+ } catch {
42
+ // localStorage unavailable — silently skip
43
+ }
44
+ }
45
+
46
+ function isDismissed(platformId: number): boolean {
47
+ try {
48
+ const raw = localStorage.getItem(`${DISMISS_KEY_PREFIX}${platformId}`);
49
+ if (!raw) return false;
50
+ const { expires } = JSON.parse(raw);
51
+ return new Date().getTime() < new Date(expires).getTime();
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+
57
+ function writeDismiss(platformId: number) {
58
+ try {
59
+ const expires = new Date();
60
+ expires.setDate(expires.getDate() + 7);
61
+ localStorage.setItem(`${DISMISS_KEY_PREFIX}${platformId}`, JSON.stringify({ expires }));
62
+ } catch {
63
+ // silently skip
64
+ }
65
+ }
66
+
67
+ export const useAppInstallBannerStore = defineStore("app-install-banner-store", {
68
+ state: () => ({
69
+ banner: null as AppInstallBanner | null,
70
+ dismissed: false,
71
+ loaded: false,
72
+ }),
73
+
74
+ actions: {
75
+ async fetchBanner() {
76
+ if (this.loaded) return;
77
+
78
+ const runtimeConfig = useRuntimeConfig();
79
+ const networkBaseUrl =
80
+ runtimeConfig.public.mgSharedUi?.networkBaseUrl ||
81
+ import.meta.env.VITE_BASE_URL_NETWORK;
82
+ const platformId = Number(
83
+ runtimeConfig.public.mgSharedUi?.systemId || import.meta.env.VITE_SYSTEM_ID,
84
+ );
85
+
86
+ if (!networkBaseUrl || !platformId) {
87
+ this.loaded = true;
88
+ return;
89
+ }
90
+
91
+ // Check dismiss first — no need to fetch if already dismissed
92
+ if (isDismissed(platformId)) {
93
+ this.dismissed = true;
94
+ this.loaded = true;
95
+ return;
96
+ }
97
+
98
+ // Try localStorage cache
99
+ const cached = readCache(platformId);
100
+ if (cached !== undefined) {
101
+ this.banner = cached;
102
+ this.loaded = true;
103
+ return;
104
+ }
105
+
106
+ // Cache miss — fetch from API
107
+ try {
108
+ const url = `${networkBaseUrl}/platform-app-banners/active?platform_id=${platformId}`;
109
+ const data: any = await $fetch(url, { credentials: "include" });
110
+ const banner: AppInstallBanner | null = data?.data ?? null;
111
+ this.banner = banner;
112
+ writeCache(platformId, banner);
113
+ } catch {
114
+ // Non-critical — silently fail, do not cache on error
115
+ } finally {
116
+ this.loaded = true;
117
+ }
118
+ },
119
+
120
+ dismiss() {
121
+ const runtimeConfig = useRuntimeConfig();
122
+ const platformId = Number(
123
+ runtimeConfig.public.mgSharedUi?.systemId || import.meta.env.VITE_SYSTEM_ID,
124
+ );
125
+ if (platformId) writeDismiss(platformId);
126
+ this.dismissed = true;
127
+ },
128
+ },
129
+
130
+ getters: {
131
+ isVisible: (state) => !!state.banner && !state.dismissed,
132
+ },
133
+ });
134
+
135
+ if (import.meta.hot) {
136
+ import.meta.hot.accept(acceptHMRUpdate(useAppInstallBannerStore, import.meta.hot));
137
+ }