@mundogamernetwork/shared-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +283 -0
  2. package/components/PressKit/AssetGallery.vue +349 -0
  3. package/components/PressKit/Awards.vue +100 -0
  4. package/components/PressKit/Credits.vue +78 -0
  5. package/components/PressKit/FactSheet.vue +204 -0
  6. package/components/PressKit/Hero.vue +143 -0
  7. package/components/PressKit/Quotes.vue +80 -0
  8. package/components/PressKit/VideoPlayer.vue +134 -0
  9. package/components/checkout/MgCartItemList.vue +214 -0
  10. package/components/checkout/MgCartSummary.vue +204 -0
  11. package/components/checkout/MgCheckoutSidebar.vue +230 -0
  12. package/components/checkout/MgGuestEmailForm.vue +97 -0
  13. package/components/checkout/MgPaymentMethodSelector.vue +162 -0
  14. package/components/checkout/MgPixQRCode.vue +222 -0
  15. package/components/indie-wall/IndieWallLeaderboard.vue +208 -0
  16. package/components/indie-wall/MuralCanvas.vue +481 -0
  17. package/components/indie-wall/StepBlock.vue +314 -0
  18. package/components/indie-wall/StepCustomize.vue +530 -0
  19. package/components/indie-wall/StepGoal.vue +169 -0
  20. package/components/indie-wall/StepPackage.vue +145 -0
  21. package/components/indie-wall/StepPay.vue +209 -0
  22. package/components/indie-wall/SupportStepper.vue +372 -0
  23. package/components/invoices/MgInvoiceDownload.vue +50 -0
  24. package/components/pricing/MgBillingToggle.vue +74 -0
  25. package/components/pricing/MgPricingCard.vue +245 -0
  26. package/components/ui/Header/MgMessageCard.vue +147 -0
  27. package/components/ui/Header/MgMessageModal.vue +414 -0
  28. package/components/ui/Header/MgNotificationCard.vue +200 -0
  29. package/components/ui/Header/MgNotificationsModal.vue +125 -0
  30. package/components/ui/MgAnnouncementBanner.vue +147 -0
  31. package/components/ui/MgBanners.vue +23 -0
  32. package/components/ui/MgHeaderComponent.vue +283 -0
  33. package/components/ui/MgHeaderUIConfig.vue +225 -0
  34. package/components/ui/MgHeaderUIUser.vue +301 -0
  35. package/components/ui/MgLoginModal.vue +156 -0
  36. package/components/ui/MgPromotionBanner.vue +185 -0
  37. package/composables/useLogout.ts +42 -0
  38. package/composables/useMgCheckout.ts +287 -0
  39. package/composables/useMgUserNotifications.ts +122 -0
  40. package/composables/usePaymentMethods.ts +75 -0
  41. package/composables/useSubscription.ts +163 -0
  42. package/middleware/auth.global.ts +40 -0
  43. package/nuxt.config.ts +31 -0
  44. package/package.json +40 -0
  45. package/pages/[slug]/index.vue +112 -0
  46. package/pages/about.vue +133 -0
  47. package/pages/blog.vue +430 -0
  48. package/pages/careers.vue +329 -0
  49. package/pages/contact.vue +339 -0
  50. package/pages/faq.vue +317 -0
  51. package/pages/health-check.vue +20 -0
  52. package/pages/icons.vue +58 -0
  53. package/pages/magazine/[slug].vue +209 -0
  54. package/pages/magazine/index.vue +267 -0
  55. package/pages/media-kit/[slug].vue +625 -0
  56. package/pages/mural/[slug].vue +1058 -0
  57. package/pages/partners.vue +290 -0
  58. package/pages/press.vue +237 -0
  59. package/pages/presskit/[slug].vue +191 -0
  60. package/pages/roadmap.vue +355 -0
  61. package/pages/status.vue +199 -0
  62. package/pages/team.vue +266 -0
  63. package/pages/wall/[slug].vue +11 -0
  64. package/plugins/auth.client.ts +17 -0
  65. package/plugins/echo.client.ts +132 -0
  66. package/services/authService.ts +95 -0
  67. package/services/chatService.ts +53 -0
  68. package/services/contactService.ts +35 -0
  69. package/services/documentService.ts +16 -0
  70. package/services/httpService.ts +95 -0
  71. package/services/indieWallService.ts +174 -0
  72. package/services/institutionalService.ts +248 -0
  73. package/services/mediaKitService.ts +51 -0
  74. package/services/notificationsService.ts +20 -0
  75. package/services/pressKitService.ts +55 -0
  76. package/stores/announcement.ts +129 -0
  77. package/stores/auth.ts +86 -0
  78. package/stores/chat.ts +150 -0
  79. package/stores/contact.ts +28 -0
  80. package/stores/document.ts +27 -0
  81. package/stores/index.ts +34 -0
  82. package/stores/institutional.ts +231 -0
  83. package/stores/login.ts +27 -0
  84. package/stores/notifications.ts +133 -0
  85. package/stores/promotion.ts +154 -0
  86. package/types/index.ts +135 -0
  87. package/utils/serialize.ts +29 -0
@@ -0,0 +1,225 @@
1
+ <script setup lang="ts">
2
+ import { ref } from "vue";
3
+ import type { MgLanguage } from "../../types";
4
+
5
+ const switchLocalePath = useSwitchLocalePath();
6
+ const runtimeConfig = useRuntimeConfig();
7
+ const configuredLangs: string[] = runtimeConfig.public.mgSharedUi?.languages || ["pt-BR", "en", "es", "de", "ro"];
8
+ const features = runtimeConfig.public.mgSharedUi?.features ?? {};
9
+
10
+ const theme = ref(useNuxtApp().$colorMode.preference);
11
+ const active = ref(0);
12
+
13
+ const allLanguages: MgLanguage[] = [
14
+ {
15
+ name: "Brasil",
16
+ name_abrev: "pt-BR",
17
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/255-brazil.svg",
18
+ native_name: "Portugues",
19
+ localized_name: "Portuguese",
20
+ },
21
+ {
22
+ name: "Espanha",
23
+ name_abrev: "es",
24
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/128-spain.svg",
25
+ native_name: "Espanol",
26
+ localized_name: "Spanish",
27
+ },
28
+ {
29
+ name: "Alemanha",
30
+ name_abrev: "de",
31
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/162-germany.svg",
32
+ native_name: "Deutsch",
33
+ localized_name: "German",
34
+ },
35
+ {
36
+ name: "Estados Unidos",
37
+ name_abrev: "en",
38
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/226-united-states.svg",
39
+ native_name: "English",
40
+ localized_name: "English",
41
+ },
42
+ {
43
+ name: "Romania",
44
+ name_abrev: "ro",
45
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/109-romania.svg",
46
+ native_name: "Romana",
47
+ localized_name: "Romanian",
48
+ },
49
+ {
50
+ name: "Emirados Arabes",
51
+ name_abrev: "ar",
52
+ flag_url: "https://storage.mundogamer.network/mg-public/countries/flags-svg/151-united-arab-emirates.svg",
53
+ native_name: "العربية",
54
+ localized_name: "Arabic",
55
+ },
56
+ ];
57
+
58
+ const tempLanguages = ref(allLanguages.filter((l) => configuredLangs.includes(l.name_abrev)));
59
+
60
+ const container = ref();
61
+ const wrapper = ref();
62
+
63
+ onMounted(() => {
64
+ setHeight();
65
+ scrollWrapper();
66
+ });
67
+
68
+ watch(theme, (themeChanged) => {
69
+ useNuxtApp().$colorMode.preference = themeChanged;
70
+ });
71
+
72
+ function setHeight() {
73
+ const elIndex = active.value;
74
+ const el = wrapper.value.children[elIndex];
75
+ const height = el.scrollHeight;
76
+ container.value.style.height = height + 32 + "px";
77
+ }
78
+
79
+ function scrollWrapper() {
80
+ const offset = 100 * active.value;
81
+ wrapper.value.style.transform = `translate3d(-${offset}%, 0, 0)`;
82
+ }
83
+
84
+ function changeTab(i: number) {
85
+ active.value = i;
86
+ scrollWrapper();
87
+ setHeight();
88
+ }
89
+
90
+ const selectedLanguage = computed(() => {
91
+ return useNuxtApp().$i18n.locale;
92
+ });
93
+
94
+ const emit = defineEmits(["toggleVisible"]);
95
+ const count = ref(0);
96
+ const focusOut = (event: MouseEvent) => {
97
+ if (count.value === 0) {
98
+ count.value++;
99
+ return;
100
+ }
101
+ const target = event.target as HTMLElement;
102
+ if (!container.value.contains(target)) emit("toggleVisible");
103
+ };
104
+
105
+ onBeforeMount(() => {
106
+ document.addEventListener("click", focusOut);
107
+ });
108
+ onUnmounted(() => {
109
+ document.removeEventListener("click", focusOut);
110
+ });
111
+ </script>
112
+
113
+ <template>
114
+ <div ref="container" class="ui-config">
115
+ <div ref="wrapper" class="ui-config__content">
116
+ <div class="ui-config__content__tab">
117
+ <div v-if="features.darkMode" class="ui-config__option">
118
+ <div>
119
+ <MGIcon icon="moon" />
120
+ {{ $t("header.menus.dark_mode") }}
121
+ </div>
122
+ <label class="switch">
123
+ <input v-model="theme" type="checkbox" :true-value="'dark'" :false-value="'light'" />
124
+ <span class="slider"></span>
125
+ </label>
126
+ </div>
127
+ <div class="ui-config__option" @click="changeTab(1)">
128
+ <div>
129
+ <MGIcon icon="region" />
130
+ {{ $t("header.menus.country") }}
131
+ </div>
132
+ <div>
133
+ <MGIcon icon="chevron-right" class="m-0" />
134
+ </div>
135
+ </div>
136
+ </div>
137
+ <div class="ui-config__content__tab">
138
+ <div class="ui-config__option" @click="changeTab(0)">
139
+ <div>
140
+ <MGIcon icon="chevron-left" />
141
+ {{ $t("community.buttons.back") }}
142
+ </div>
143
+ </div>
144
+ <p>{{ $t("header.menus.select_country_message") }}</p>
145
+ <NuxtLink
146
+ v-for="(item, index) in tempLanguages"
147
+ :key="'select_languages_' + index"
148
+ :to="switchLocalePath(item.name_abrev)"
149
+ :class="{ active: selectedLanguage === item.name_abrev }"
150
+ class="ui-config__option"
151
+ >
152
+ <div class="w-100">
153
+ <img :src="item.flag_url" class="me-1" alt="" /> {{ item.name }}
154
+ </div>
155
+ </NuxtLink>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </template>
160
+
161
+ <style scoped lang="scss">
162
+ .ui-config {
163
+ position: absolute;
164
+ max-width: 240px;
165
+ width: 100%;
166
+ padding: 1rem 0;
167
+ background-color: var(--header-ui-config-bg);
168
+ border: 1px solid var(--header-ui-config-border);
169
+ top: 60px;
170
+ right: 0;
171
+ z-index: 999;
172
+ overflow: hidden;
173
+ transition: background ease 0.3s;
174
+
175
+ &__option {
176
+ color: var(--sidebar-menus-fg);
177
+ display: flex;
178
+ justify-content: space-between;
179
+ padding: 0 1rem;
180
+ font-size: 0.875rem;
181
+ min-height: 48px;
182
+ align-items: center;
183
+ cursor: pointer;
184
+
185
+ img {
186
+ max-width: 16px;
187
+ display: inline-block;
188
+ }
189
+
190
+ &:hover {
191
+ background-color: var(--header-ui-config-hover);
192
+ }
193
+
194
+ & > div {
195
+ .icon {
196
+ display: inline-block;
197
+ vertical-align: middle;
198
+ font-size: 1.5rem;
199
+ margin-right: 0.5rem;
200
+ }
201
+ }
202
+ }
203
+
204
+ &__content {
205
+ display: flex;
206
+ justify-content: flex-start;
207
+ align-items: flex-start;
208
+ transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1);
209
+
210
+ &__tab {
211
+ flex: 1 0 100%;
212
+ width: 100%;
213
+ background-color: var(--header-ui-config-bg);
214
+ transition: background-color ease 0.3s;
215
+
216
+ p {
217
+ color: var(--active);
218
+ font-size: 12px;
219
+ padding: 0.5rem 1rem;
220
+ margin: 0;
221
+ }
222
+ }
223
+ }
224
+ }
225
+ </style>
@@ -0,0 +1,301 @@
1
+ <script setup lang="ts">
2
+ import { storeToRefs } from "pinia";
3
+
4
+ const emit = defineEmits(["toggleVisible"]);
5
+
6
+ const showOnline = ref(true);
7
+ const authStore = useAuthStore();
8
+ const { user, signedIn } = storeToRefs(authStore);
9
+ const { performLogout } = useLogout();
10
+
11
+ const runtimeConfig = useRuntimeConfig();
12
+ const accountsBaseUrl = runtimeConfig.public.mgSharedUi?.accountsBaseUrl || runtimeConfig.public.accountsBaseUrl;
13
+ const features = runtimeConfig.public.mgSharedUi?.features ?? {};
14
+
15
+ const refDiv = ref<HTMLElement | null>(null);
16
+ const count = ref(0);
17
+
18
+ const focusOut = (event: MouseEvent) => {
19
+ if (count.value === 0) {
20
+ count.value++;
21
+ return;
22
+ }
23
+ const target = event.target as HTMLElement;
24
+ if (refDiv.value && !refDiv.value.contains(target)) emit("toggleVisible");
25
+ };
26
+
27
+ onMounted(() => {
28
+ document.addEventListener("click", focusOut);
29
+ document.addEventListener("keydown", ({ key }) => {
30
+ if (key === "Escape") emit("toggleVisible");
31
+ });
32
+ });
33
+
34
+ onUnmounted(() => {
35
+ document.removeEventListener("click", focusOut);
36
+ });
37
+
38
+ const login = () => {
39
+ const redirectTo = encodeURIComponent(window.location.href);
40
+ window.location.href = `${accountsBaseUrl}/login?redirect_to=${redirectTo}`;
41
+ };
42
+
43
+ const handleLogout = async () => {
44
+ await performLogout(`${accountsBaseUrl}/login`);
45
+ };
46
+ </script>
47
+
48
+ <template>
49
+ <div ref="refDiv" :class="{ 'ui-config-user': true, 'signed-in': signedIn }">
50
+ <div ref="wrapper" class="ui-config-user__content">
51
+ <div v-if="!signedIn" class="ui-config-user__content__tab">
52
+ <div class="ui-config-user__option">
53
+ <div class="w-100">
54
+ <a class="btn primary lg w-100" href="#" @click.prevent="login">
55
+ {{ $t("header.login.btn_login") }}
56
+ </a>
57
+ </div>
58
+ </div>
59
+ <div class="ui-config-user__option">
60
+ <div>
61
+ <p class="d-flex">
62
+ {{ $t("header.login.register_message") }}
63
+ <a :href="`${accountsBaseUrl}/register?redirect_to=${encodeURIComponent(window.location.href)}`" class="ms-1">
64
+ {{ $t("header.login.btn_register") }}
65
+ </a>
66
+ </p>
67
+ </div>
68
+ </div>
69
+ </div>
70
+
71
+ <div v-else class="signed-in-menu">
72
+ <div class="row info-row ps-0">
73
+ <div class="col-auto px-3">
74
+ <div v-if="!user?.avatar_url" class="no-avatar-wrapper">
75
+ <MGIcon icon="profile" />
76
+ </div>
77
+ <img v-else :src="user.avatar_url" width="40" height="40" class="round" />
78
+ </div>
79
+ </div>
80
+
81
+ <div class="row info-row">
82
+ <div class="col p-0 d-flex flex-column">
83
+ <span class="username">{{ user?.nickname || user?.name }}</span>
84
+ </div>
85
+ </div>
86
+
87
+ <div v-if="user?.followers_count !== undefined" class="row info-row stats">
88
+ <div class="col-6 p-0">
89
+ <span class="stat-label">{{ $t("account_menu.following") }}</span>
90
+ <span class="stat-value">{{ user?.following_count ?? 0 }}</span>
91
+ </div>
92
+ <div class="col-6 p-0">
93
+ <span class="stat-label">{{ $t("account_menu.followers") }}</span>
94
+ <span class="stat-value">{{ user?.followers_count ?? 0 }}</span>
95
+ </div>
96
+ </div>
97
+
98
+ <div v-if="features.wallet && user?.coins !== null" class="row info-row">
99
+ <span class="coins">
100
+ <MGIcon icon="coin" />
101
+ {{ user?.coins ?? 0 }}
102
+ </span>
103
+ </div>
104
+
105
+ <div v-if="features.statusOnline" class="row info-row">
106
+ <div class="status-toggle">
107
+ <span>{{ $t("account_menu.buttons.show_online") }}</span>
108
+ <label class="switch">
109
+ <input v-model="showOnline" type="checkbox" />
110
+ <span class="slider"></span>
111
+ </label>
112
+ </div>
113
+ </div>
114
+
115
+ <div class="row info-row">
116
+ <a :href="accountsBaseUrl" target="_blank" class="btn btn-primary-outline mt-3">
117
+ {{ $t("account_menu.buttons.manage_account") }}
118
+ </a>
119
+ </div>
120
+
121
+ <slot name="extra-menu-items" />
122
+
123
+ <div class="row info-row my-3">
124
+ <button class="logout" type="button" @click="handleLogout">
125
+ {{ $t("account_menu.buttons.logout") }}
126
+ </button>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </template>
132
+
133
+ <style scoped lang="scss">
134
+ .ui-config-user {
135
+ position: absolute;
136
+ max-width: 240px;
137
+ width: 100%;
138
+ padding: 1rem 0;
139
+ background-color: var(--header-ui-config-bg);
140
+ border: 1px solid var(--header-ui-config-border);
141
+ top: 45px;
142
+ right: 0;
143
+ z-index: 999;
144
+ overflow: hidden;
145
+ transition: all ease 0.5s;
146
+
147
+ &:not(.signed-in) {
148
+ max-width: 340px;
149
+ }
150
+
151
+ &__option {
152
+ color: var(--sidebar-menus-fg);
153
+ display: flex;
154
+ justify-content: space-between;
155
+ padding: 0 1rem;
156
+ font-size: 0.875rem;
157
+ min-height: 48px;
158
+ align-items: center;
159
+
160
+ a {
161
+ font-size: 16px !important;
162
+ font-weight: 400;
163
+ }
164
+
165
+ & > div > p {
166
+ font-size: 15px !important;
167
+ font-weight: 400;
168
+ color: var(--sidebar-menus-fg);
169
+ }
170
+ }
171
+
172
+ &__content {
173
+ display: flex;
174
+ justify-content: flex-start;
175
+ align-items: flex-start;
176
+ transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1);
177
+
178
+ &__tab {
179
+ flex: 1 0 100%;
180
+ width: 100%;
181
+ background-color: var(--header-ui-config-bg);
182
+
183
+ p {
184
+ color: var(--active);
185
+ font-size: 12px;
186
+ padding: 0.5rem 1rem;
187
+ margin: 0;
188
+ }
189
+ }
190
+ }
191
+
192
+ .signed-in-menu {
193
+ width: 240px;
194
+ padding: 16px 0;
195
+ background-color: var(--header-ui-config-bg);
196
+
197
+ .row {
198
+ width: 100%;
199
+ max-width: 100%;
200
+ margin-left: auto;
201
+ margin-right: auto;
202
+
203
+ &.info-row {
204
+ padding: 0 16px;
205
+ }
206
+ }
207
+
208
+ .round {
209
+ border-radius: 100%;
210
+ }
211
+
212
+ .no-avatar-wrapper {
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ height: 40px;
217
+ width: 40px;
218
+ border-radius: 100%;
219
+ background: #555;
220
+ color: var(--ck-highlight-marker-blue);
221
+
222
+ i {
223
+ font-size: 1.6rem !important;
224
+ }
225
+ }
226
+
227
+ .username {
228
+ margin-top: 4px;
229
+ line-height: 1.25rem;
230
+ font-weight: 400;
231
+ font-size: 0.875rem;
232
+ color: var(--active);
233
+ }
234
+
235
+ .stats {
236
+ margin-top: 8px;
237
+
238
+ .stat-label {
239
+ font-size: 0.75rem;
240
+ color: var(--secondary-info-fg);
241
+ }
242
+
243
+ .stat-value {
244
+ font-size: 0.875rem;
245
+ font-weight: 500;
246
+ color: var(--active);
247
+ margin-left: 4px;
248
+ }
249
+ }
250
+
251
+ .coins {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 4px;
255
+ font-size: 0.875rem;
256
+ color: var(--active);
257
+ margin-top: 8px;
258
+ }
259
+
260
+ .status-toggle {
261
+ display: flex;
262
+ justify-content: space-between;
263
+ align-items: center;
264
+ margin-top: 8px;
265
+ font-size: 0.75rem;
266
+ color: var(--sidebar-menus-fg);
267
+ }
268
+
269
+ .btn-primary-outline {
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ height: 32px !important;
274
+ padding: 0 12px;
275
+ border: 1px solid var(--ck-highlight-marker-blue);
276
+ font-weight: 400;
277
+ font-size: 0.75rem;
278
+ color: var(--active);
279
+
280
+ &:hover,
281
+ &:active,
282
+ &:focus {
283
+ background: var(--ck-highlight-marker-blue);
284
+ }
285
+ }
286
+
287
+ .logout {
288
+ margin-top: 14px;
289
+ background: none;
290
+ border: none;
291
+ font-weight: 400;
292
+ font-size: 0.75rem;
293
+ color: var(--ck-highlight-marker-blue);
294
+ width: 100%;
295
+ display: block;
296
+ text-align: center;
297
+ cursor: pointer;
298
+ }
299
+ }
300
+ }
301
+ </style>
@@ -0,0 +1,156 @@
1
+ <script setup lang="ts">
2
+ import { storeToRefs } from "pinia";
3
+
4
+ const loginStore = useLoginStore();
5
+ const runtimeConfig = useRuntimeConfig();
6
+ const authStore = useAuthStore();
7
+ const { signedIn } = storeToRefs(authStore);
8
+ const accountsBaseUrl = runtimeConfig.public.mgSharedUi?.accountsBaseUrl || runtimeConfig.public.accountsBaseUrl;
9
+
10
+ defineProps({
11
+ open: {
12
+ type: Boolean,
13
+ default: false,
14
+ },
15
+ });
16
+
17
+ const registerUrl = computed(() => {
18
+ const current = typeof window !== "undefined" ? window.location.href : "";
19
+ return `${accountsBaseUrl}/register?redirect_to=${current}`;
20
+ });
21
+
22
+ function close() {
23
+ loginStore.toggleLoginModalComponent();
24
+ }
25
+ </script>
26
+
27
+ <template>
28
+ <div id="mgLoginModal">
29
+ <a v-if="!signedIn" class="menus__item__option" @click="close()">
30
+ {{ $t("header.login.btn_register") }}
31
+ </a>
32
+ <Teleport to="body">
33
+ <div v-if="open" class="modal">
34
+ <div class="modal-backdrop" @click="close()"></div>
35
+ <div class="pop-up">
36
+ <div class="title">
37
+ {{ $t("more.login_modal.title") }}
38
+ </div>
39
+ <div class="subtitle">
40
+ {{ $t("more.login_modal.subtitle") }}
41
+ </div>
42
+ <div class="buttons">
43
+ <a v-if="!signedIn" class="btn1" :href="registerUrl">
44
+ {{ $t("more.login_modal.btn_1") }}
45
+ </a>
46
+ <a class="btn2" @click="close()">
47
+ {{ $t("more.login_modal.btn_2") }}
48
+ </a>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </Teleport>
53
+ </div>
54
+ </template>
55
+
56
+ <style lang="scss">
57
+ #mgLoginModal {
58
+ a {
59
+ cursor: pointer;
60
+ margin-left: 5px;
61
+ }
62
+
63
+ .modal {
64
+ position: fixed;
65
+ display: block;
66
+ width: 100%;
67
+ height: 100vh;
68
+ z-index: 99999;
69
+ top: 0;
70
+ left: 0;
71
+
72
+ .modal-backdrop {
73
+ position: fixed;
74
+ width: 100%;
75
+ background-color: rgba(0, 0, 0, 0.5);
76
+ height: 100vh;
77
+ z-index: 1;
78
+ left: 0;
79
+ top: 0;
80
+ }
81
+
82
+ .pop-up {
83
+ max-height: 90vh;
84
+ width: 320px;
85
+ padding: 24px 32px;
86
+ background-color: var(--sidebar-bg);
87
+ border: 0;
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: 16px;
91
+ justify-content: center;
92
+ align-items: center;
93
+ text-align: center;
94
+ margin: auto;
95
+ margin-top: 15%;
96
+ position: relative;
97
+ z-index: 999;
98
+
99
+ .title {
100
+ font-size: 18px;
101
+ font-weight: 600;
102
+ line-height: 26px;
103
+ color: var(--active);
104
+ }
105
+
106
+ .subtitle {
107
+ font-size: 14px;
108
+ font-weight: 400;
109
+ line-height: 20px;
110
+ color: var(--active);
111
+ }
112
+
113
+ .buttons {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 8px;
117
+ width: 100%;
118
+
119
+ .btn1 {
120
+ display: flex;
121
+ width: 100%;
122
+ height: 44px;
123
+ padding: 0 12px;
124
+ justify-content: center;
125
+ align-items: center;
126
+ font-size: 16px;
127
+ color: var(--active);
128
+ background-color: var(--sidebar-bg);
129
+ cursor: pointer;
130
+ border: 1px solid var(--chip-text);
131
+ }
132
+
133
+ .btn2 {
134
+ display: flex;
135
+ width: 100%;
136
+ height: 44px;
137
+ padding: 0 12px;
138
+ justify-content: center;
139
+ align-items: center;
140
+ border: 0;
141
+ color: var(--chip-text);
142
+ cursor: pointer;
143
+ background-color: var(--search-bar-bg);
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ @media screen and (max-width: 768px) {
150
+ .modal .pop-up {
151
+ width: 100%;
152
+ margin-top: 50%;
153
+ }
154
+ }
155
+ }
156
+ </style>