@necrolab/dashboard 0.4.48 → 0.4.50
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/.claude/settings.local.json +2 -1
- package/.prettierrc +12 -1
- package/exit +209 -0
- package/index.html +1 -1
- package/package.json +1 -1
- package/public/manifest.json +8 -3
- package/src/assets/css/_input.scss +104 -111
- package/src/assets/css/_utilities.scss +441 -0
- package/src/assets/css/main.scss +228 -154
- package/src/components/Auth/LoginForm.vue +49 -6
- package/src/components/Editors/Account/Account.vue +156 -146
- package/src/components/Editors/Account/AccountCreator.vue +1 -1
- package/src/components/Editors/Account/AccountView.vue +13 -13
- package/src/components/Editors/Account/CreateAccount.vue +25 -16
- package/src/components/Editors/Profile/CreateProfile.vue +1 -1
- package/src/components/Editors/Profile/Profile.vue +1 -1
- package/src/components/Editors/Profile/ProfileCountryChooser.vue +83 -19
- package/src/components/Editors/Profile/ProfileView.vue +11 -11
- package/src/components/Tasks/CreateTaskAXS.vue +3 -3
- package/src/components/Tasks/CreateTaskTM.vue +7 -35
- package/src/components/Tasks/QuickSettings.vue +112 -9
- package/src/components/Tasks/Stats.vue +29 -26
- package/src/components/Tasks/Task.vue +499 -365
- package/src/components/Tasks/TaskView.vue +187 -127
- package/src/components/icons/Sandclock.vue +2 -2
- package/src/components/icons/Stadium.vue +1 -1
- package/src/components/ui/Modal.vue +37 -35
- package/src/components/ui/controls/CountryChooser.vue +200 -62
- package/src/components/ui/controls/atomic/Dropdown.vue +177 -91
- package/src/components/ui/controls/atomic/MultiDropdown.vue +247 -168
- package/src/composables/useClickOutside.js +21 -0
- package/src/composables/useDropdownPosition.js +174 -0
- package/src/stores/sampleData.js +4 -2
- package/src/stores/ui.js +8 -6
- package/src/views/Accounts.vue +12 -19
- package/src/views/Console.vue +34 -47
- package/src/views/Editor.vue +1194 -730
- package/src/views/Login.vue +65 -119
- package/src/views/Profiles.vue +2 -2
- package/src/views/Tasks.vue +170 -137
- package/static/offline.html +192 -50
- package/tailwind.config.js +47 -21
|
@@ -1,43 +1,77 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
<div class="dropdown input-default p-4 w-16 bg-dark-550 small-dropdown rounded-lg">
|
|
4
|
-
<span @click="
|
|
3
|
+
<div class="dropdown input-default p-4 w-16 bg-dark-550 small-dropdown rounded-lg" ref="dropdownRef">
|
|
4
|
+
<span @click="toggleOpen" class="flex justify-between items-center z-50 text-white">
|
|
5
5
|
<div class="flex gap-3 justify-center">
|
|
6
6
|
<img class="w-5" :src="`/flags/${current?.toLowerCase()}.svg`" />
|
|
7
7
|
</div>
|
|
8
8
|
</span>
|
|
9
|
-
<
|
|
10
|
-
v-if="open && !disabled"
|
|
11
|
-
class="dropdown-content special-dropdown snap-mandatory snap-y z-inf max-h-48 overflow-scroll hidden-scrollbars"
|
|
12
|
-
>
|
|
9
|
+
<Teleport to="body">
|
|
13
10
|
<div
|
|
14
|
-
v-
|
|
15
|
-
|
|
16
|
-
:
|
|
17
|
-
@click
|
|
11
|
+
v-if="open && !disabled"
|
|
12
|
+
class="dropdown-content-portal special-dropdown"
|
|
13
|
+
:style="menuStyle"
|
|
14
|
+
@click.stop
|
|
15
|
+
@wheel.stop
|
|
16
|
+
@touchmove.stop
|
|
18
17
|
>
|
|
19
|
-
<div
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
<div
|
|
19
|
+
v-for="(country, i) in countries"
|
|
20
|
+
v-bind:key="country"
|
|
21
|
+
:class="`cursor-pointer w-12 ${i === 0 ? '' : 'my-2'}`"
|
|
22
|
+
@click="set(country)"
|
|
23
|
+
>
|
|
24
|
+
<div class="flex justify-center items-center smooth-hover">
|
|
25
|
+
<span class="text-sm">{{ country }} </span>
|
|
26
|
+
<img class="w-5 ml-3" :src="`/flags/${country?.toLowerCase()}.svg`" />
|
|
27
|
+
</div>
|
|
22
28
|
</div>
|
|
23
29
|
</div>
|
|
24
|
-
</
|
|
30
|
+
</Teleport>
|
|
25
31
|
</div>
|
|
26
32
|
</div>
|
|
27
33
|
</template>
|
|
28
34
|
|
|
29
35
|
<script setup>
|
|
30
36
|
import { ref, watch } from "vue";
|
|
37
|
+
import { useDropdownPosition } from "@/composables/useDropdownPosition";
|
|
38
|
+
import { useClickOutside } from "@/composables/useClickOutside";
|
|
39
|
+
|
|
31
40
|
const countries = ["US", "CA", "DE", "FR", "DK"];
|
|
32
41
|
const open = ref(false);
|
|
42
|
+
const dropdownRef = ref(null);
|
|
33
43
|
|
|
34
44
|
const props = defineProps({
|
|
35
45
|
value: { type: String },
|
|
36
46
|
onClick: { type: Function },
|
|
37
47
|
disabled: { type: Boolean, required: false }
|
|
38
48
|
});
|
|
49
|
+
|
|
39
50
|
const current = ref(props.value || "US");
|
|
40
51
|
|
|
52
|
+
// Use composables for positioning and click outside
|
|
53
|
+
const { menuStyle, updatePosition } = useDropdownPosition(dropdownRef, {
|
|
54
|
+
offset: { x: -17.6, y: 4 },
|
|
55
|
+
minWidth: 80,
|
|
56
|
+
maxHeight: 192,
|
|
57
|
+
zIndex: 99999999999999,
|
|
58
|
+
estimateHeight: () => Math.min(countries.length * 32, 192)
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
useClickOutside(dropdownRef, () => {
|
|
62
|
+
if (open.value) {
|
|
63
|
+
open.value = false;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const toggleOpen = () => {
|
|
68
|
+
if (props.disabled) return;
|
|
69
|
+
open.value = !open.value;
|
|
70
|
+
if (open.value) {
|
|
71
|
+
updatePosition();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
41
75
|
const set = (c) => {
|
|
42
76
|
if (props.disabled) return;
|
|
43
77
|
current.value = c;
|
|
@@ -61,15 +95,45 @@ watch(
|
|
|
61
95
|
/* border-radius: 100% !important; */
|
|
62
96
|
padding: 0;
|
|
63
97
|
width: 3em !important;
|
|
64
|
-
|
|
98
|
+
height: 3.45em !important; /* Match input-default height */
|
|
65
99
|
display: flex;
|
|
66
100
|
justify-items: center;
|
|
67
101
|
justify-content: center;
|
|
68
102
|
}
|
|
69
103
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
104
|
+
@media (min-width: 768px) {
|
|
105
|
+
.small-dropdown {
|
|
106
|
+
height: 40px !important; /* Match input-default responsive height */
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.dropdown-content-portal {
|
|
111
|
+
@apply bg-dark-400 border border-dark-650 rounded-lg shadow-2xl z-50;
|
|
112
|
+
padding: 0.5rem;
|
|
113
|
+
max-height: 192px !important;
|
|
114
|
+
overflow-y: auto !important;
|
|
115
|
+
overscroll-behavior: contain !important;
|
|
116
|
+
touch-action: pan-y !important;
|
|
117
|
+
-webkit-overflow-scrolling: touch !important;
|
|
118
|
+
scrollbar-width: none;
|
|
119
|
+
-ms-overflow-style: none;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.dropdown-content-portal::-webkit-scrollbar {
|
|
123
|
+
display: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.dropdown-content-portal > div {
|
|
127
|
+
@apply px-3 py-2 text-sm text-white cursor-pointer;
|
|
128
|
+
border-radius: 6px;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.dropdown-content-portal > div:hover {
|
|
132
|
+
/* Removed hover background */
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.dropdown-content-portal > div .flex {
|
|
136
|
+
@apply items-center justify-center;
|
|
137
|
+
gap: 0.75rem;
|
|
73
138
|
}
|
|
74
139
|
</style>
|
|
75
|
-
, watch
|
|
@@ -8,29 +8,29 @@
|
|
|
8
8
|
@valueUpdate="ui.toggleMainCheckbox('profiles')"
|
|
9
9
|
:isHeader="true" />
|
|
10
10
|
<div class="mx-auto flex items-center" @click="ui.toggleSort('eventId')">
|
|
11
|
-
<ProfileIcon class="mr-0
|
|
12
|
-
<h4 class="hidden
|
|
11
|
+
<ProfileIcon class="mr-0 md:mr-3 w-4 h-4" />
|
|
12
|
+
<h4 class="hidden md:flex">Profile Name</h4>
|
|
13
13
|
</div>
|
|
14
14
|
</div>
|
|
15
15
|
<div class="lg:col-span-2 col-span-1 items-center justify-center flex" v-once>
|
|
16
|
-
<CartIcon class="mr-0
|
|
17
|
-
<h4 class="hidden
|
|
16
|
+
<CartIcon class="mr-0 md:mr-3 w-4 h-4" />
|
|
17
|
+
<h4 class="hidden md:flex">Card Number</h4>
|
|
18
18
|
</div>
|
|
19
19
|
<div class="col-span-1 flex items-center justify-center" v-once>
|
|
20
|
-
<TimerIcon class="mr-0
|
|
21
|
-
<h4 class="hidden
|
|
20
|
+
<TimerIcon class="mr-0 md:mr-3 w-4 h-4" />
|
|
21
|
+
<h4 class="hidden md:flex">Expiration</h4>
|
|
22
22
|
</div>
|
|
23
23
|
<div class="col-span-1 flex items-center justify-center" v-once>
|
|
24
|
-
<CheckmarkIcon class="mr-0
|
|
25
|
-
<h4 class="hidden
|
|
24
|
+
<CheckmarkIcon class="mr-0 md:mr-3 w-4 h-4" />
|
|
25
|
+
<h4 class="hidden md:flex">Enabled</h4>
|
|
26
26
|
</div>
|
|
27
27
|
<div class="col-span-1 hidden lg:flex items-center justify-center" v-once>
|
|
28
28
|
<TicketIcon class="mr-0 lg:mr-3 w-4 h-4" />
|
|
29
29
|
<h4 class="hidden lg:flex">Tags</h4>
|
|
30
30
|
</div>
|
|
31
31
|
<div class="col-span-1 flex items-center justify-center" v-once>
|
|
32
|
-
<ClickIcon class="mr-0
|
|
33
|
-
<h4 class="hidden
|
|
32
|
+
<ClickIcon class="mr-0 md:mr-3 w-4 h-4" />
|
|
33
|
+
<h4 class="hidden md:flex">Actions</h4>
|
|
34
34
|
</div>
|
|
35
35
|
</Header>
|
|
36
36
|
<div v-if="toRender.length != 0">
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<div class="profile" :key="`profile-${props.item._id || props.item.index}`">
|
|
45
45
|
<Profile
|
|
46
46
|
@click="i[props.item.index]++"
|
|
47
|
-
:
|
|
47
|
+
:class="props.item.index % 2 == 1 ? 'table-row-even' : 'table-row-odd'"
|
|
48
48
|
:profile="props.item" />
|
|
49
49
|
</div>
|
|
50
50
|
</template>
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
</div>
|
|
74
74
|
<!-- Ticket Quantity -->
|
|
75
75
|
<div class="input-wrapper">
|
|
76
|
-
<label class="label-override mb-2">Amount <span class="ml-2
|
|
76
|
+
<label class="label-override mb-2">Amount <span class="ml-2 h-[18px]">#</span></label>
|
|
77
77
|
<div class="input-default">
|
|
78
78
|
<input placeholder="20" min="1" type="number" pattern="\d*" v-model="task.taskQuantity" />
|
|
79
79
|
<div class="input-incrementer">
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
</div>
|
|
89
89
|
|
|
90
90
|
<!-- Profile Tag(s) -->
|
|
91
|
-
|
|
91
|
+
<div class="input-wrapper relative-positioned z-tooltip">
|
|
92
92
|
<label class="label-override mb-2"
|
|
93
93
|
>Profile Tag(s)
|
|
94
94
|
<TagIcon />
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
</div>
|
|
107
107
|
|
|
108
108
|
<!-- Account Tag -->
|
|
109
|
-
|
|
109
|
+
<div class="input-wrapper relative-positioned z-dropdown">
|
|
110
110
|
<label class="label-override mb-2"
|
|
111
111
|
>Account Tag
|
|
112
112
|
<ScannerIcon />
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
</template>
|
|
9
9
|
|
|
10
10
|
<!-- Task Form -->
|
|
11
|
-
<div class="
|
|
11
|
+
<div class="grid-responsive-1-2 gap-responsive mt-4 mb-4">
|
|
12
12
|
<!-- Event ID -->
|
|
13
13
|
<div class="input-wrapper">
|
|
14
14
|
<label class="label-override mb-2"
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
</div>
|
|
80
80
|
<!-- Ticket Quantity -->
|
|
81
81
|
<div class="input-wrapper">
|
|
82
|
-
<label class="label-override mb-2">Amount <span class="ml-2
|
|
82
|
+
<label class="label-override mb-2">Amount <span class="ml-2 h-[18px]">#</span></label>
|
|
83
83
|
<div class="input-default">
|
|
84
84
|
<input placeholder="20" min="1" type="number" pattern="\d*" v-model="task.taskQuantity" />
|
|
85
85
|
<div class="input-incrementer">
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
</div>
|
|
95
95
|
|
|
96
96
|
<!-- Profile Tag(s) -->
|
|
97
|
-
|
|
97
|
+
<div class="input-wrapper relative-positioned z-tooltip">
|
|
98
98
|
<label class="label-override mb-2"
|
|
99
99
|
>Profile Tag(s)
|
|
100
100
|
<TagIcon />
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
</div>
|
|
121
121
|
|
|
122
122
|
<!-- Account Tag -->
|
|
123
|
-
|
|
123
|
+
<div class="input-wrapper relative-positioned z-dropdown">
|
|
124
124
|
<label class="label-override mb-2"
|
|
125
125
|
>Account Tag
|
|
126
126
|
<ScannerIcon />
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
<!-- Task Switches -->
|
|
161
161
|
<div v-if="!isEU(ui.currentCountry.siteId)" class="grid grid-cols-3 task-switches gap-y-1 justify-between">
|
|
162
162
|
<div class="switch-wrapper flex flex-col mb-2">
|
|
163
|
-
<h4>
|
|
163
|
+
<h4 class="text-responsive-sm">
|
|
164
164
|
Aged <span class="hidden xs:block">Account</span>
|
|
165
165
|
<SandclockIcon />
|
|
166
166
|
</h4>
|
|
@@ -209,7 +209,7 @@
|
|
|
209
209
|
<div class="switch-wrapper flex flex-col">
|
|
210
210
|
<h4>
|
|
211
211
|
<span class="hidden xs:block">Supports </span> OTP
|
|
212
|
-
<MailIcon class="scale-90
|
|
212
|
+
<MailIcon class="scale-90 h-[17px]" />
|
|
213
213
|
</h4>
|
|
214
214
|
<Switch class="mx-auto" v-model="task.otpAccount" />
|
|
215
215
|
</div>
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
<div class="switch-wrapper flex flex-col">
|
|
276
276
|
<h4>
|
|
277
277
|
Supports OTP
|
|
278
|
-
<MailIcon class="scale-90" />
|
|
278
|
+
<MailIcon class="scale-90 h-[17px]" />
|
|
279
279
|
</h4>
|
|
280
280
|
<Switch class="mx-auto" v-model="task.otpAccount" />
|
|
281
281
|
</div>
|
|
@@ -421,38 +421,10 @@ watch(
|
|
|
421
421
|
);
|
|
422
422
|
</script>
|
|
423
423
|
|
|
424
|
-
<style lang="scss" scoped>
|
|
425
|
-
.task-switches {
|
|
426
|
-
h4 {
|
|
427
|
-
color: #e1e1e4;
|
|
428
|
-
@apply text-xs text-center flex items-center gap-x-2 mx-auto;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
.switch-wrapper {
|
|
432
|
-
@apply gap-y-2;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
@media (max-width: 720px) {
|
|
437
|
-
.task-switches {
|
|
438
|
-
h4 {
|
|
439
|
-
font-size: 12px !important;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
</style>
|
|
444
424
|
<style lang="scss" scoped>
|
|
445
425
|
.switch-wrapper {
|
|
446
426
|
svg path {
|
|
447
427
|
fill: #a0a0a6 !important;
|
|
448
428
|
}
|
|
449
429
|
}
|
|
450
|
-
|
|
451
|
-
.z-inf {
|
|
452
|
-
z-index: 1000;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
.z-inf2 {
|
|
456
|
-
z-index: 2000;
|
|
457
|
-
}
|
|
458
430
|
</style>
|
|
@@ -23,29 +23,33 @@
|
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
<div class="input-container relative-positioned z-tooltip">
|
|
27
27
|
<span class="w-1/3 text-light-300 font-medium text-xs">Checkout Proxies</span>
|
|
28
28
|
<Dropdown
|
|
29
|
-
class="
|
|
29
|
+
class="!w-2/3"
|
|
30
|
+
variant="transparent"
|
|
30
31
|
:default="ui.profile.proxyList?.checkout || proxyLists[0]"
|
|
32
|
+
:value="ui.profile.proxyList?.checkout"
|
|
31
33
|
:options="proxyLists"
|
|
32
34
|
:onClick="(f) => saveProxyListUpate('checkout', f)"
|
|
33
35
|
:allowDefault="false"
|
|
34
36
|
/>
|
|
35
37
|
</div>
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
<div class="input-container relative-positioned z-dropdown">
|
|
38
40
|
<span class="w-1/3 text-light-300 font-medium text-xs">Queue Proxies</span>
|
|
39
41
|
<Dropdown
|
|
40
|
-
class="
|
|
42
|
+
class="!w-2/3"
|
|
43
|
+
variant="transparent"
|
|
41
44
|
:default="ui.profile.proxyList?.queue || proxyLists[0]"
|
|
42
|
-
:
|
|
45
|
+
:value="ui.profile.proxyList?.queue"
|
|
43
46
|
:options="proxyLists"
|
|
47
|
+
:onClick="(f) => saveProxyListUpate('queue', f)"
|
|
44
48
|
:allowDefault="false"
|
|
45
49
|
/>
|
|
46
50
|
</div>
|
|
47
|
-
<div class="flex mt-5 justify-between flex-row items-center">
|
|
48
|
-
<div class="flex gap-3 items-center">
|
|
51
|
+
<div class="flex mt-5 justify-between flex-row items-center quicksettings-bottom">
|
|
52
|
+
<div class="flex gap-3 items-center quicksettings-versions">
|
|
49
53
|
<div class="bg-gradient-to-r from-dark-400 to-dark-500 rounded-lg text-xs shadow-lg p-2 px-3 text-white font-medium border border-light-300">
|
|
50
54
|
Dashboard v{{ version }}
|
|
51
55
|
</div>
|
|
@@ -54,7 +58,7 @@
|
|
|
54
58
|
</div>
|
|
55
59
|
</div>
|
|
56
60
|
|
|
57
|
-
<div class="flex gap-5">
|
|
61
|
+
<div class="flex gap-5 quicksettings-buttons">
|
|
58
62
|
<button
|
|
59
63
|
class="button-default bg-dark-400 w-24 text-xs flex items-center justify-center gap-x-2 border border-light-300 hover:border-light-400"
|
|
60
64
|
@click="checkBalances()"
|
|
@@ -83,7 +87,8 @@
|
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
.input-container {
|
|
86
|
-
@apply text-white bg-dark-500 mb-3 px-3 rounded-lg border-dark-550 border-2 flex items-center justify-between h-10
|
|
90
|
+
@apply text-white bg-dark-500 mb-3 px-3 rounded-lg border-dark-550 border-2 flex items-center justify-between h-10;
|
|
91
|
+
overflow: visible;
|
|
87
92
|
}
|
|
88
93
|
|
|
89
94
|
.quick-settings-input {
|
|
@@ -101,6 +106,104 @@
|
|
|
101
106
|
@apply text-light-400 opacity-70;
|
|
102
107
|
}
|
|
103
108
|
}
|
|
109
|
+
|
|
110
|
+
/* iPhone portrait mode fixes */
|
|
111
|
+
@media (max-width: 430px) and (orientation: portrait) {
|
|
112
|
+
.quicksettings-bottom {
|
|
113
|
+
flex-direction: column;
|
|
114
|
+
gap: 1rem;
|
|
115
|
+
align-items: stretch;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.quicksettings-versions {
|
|
119
|
+
justify-content: center;
|
|
120
|
+
flex-wrap: wrap;
|
|
121
|
+
gap: 0.5rem;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.quicksettings-versions > div {
|
|
125
|
+
flex: 1;
|
|
126
|
+
min-width: 120px;
|
|
127
|
+
text-align: center;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.quicksettings-buttons {
|
|
131
|
+
justify-content: center;
|
|
132
|
+
gap: 0.75rem;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.quicksettings-buttons button {
|
|
136
|
+
width: 5rem;
|
|
137
|
+
padding-left: 0.5rem;
|
|
138
|
+
padding-right: 0.5rem;
|
|
139
|
+
gap: 0.25rem;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.quicksettings-buttons button img {
|
|
143
|
+
width: 12px;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Fix dropdown visibility in modal */
|
|
148
|
+
:deep(.modal-body) {
|
|
149
|
+
overflow: visible !important;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
:deep(.component-modal) {
|
|
153
|
+
overflow: visible !important;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Dropdown styling fixes */
|
|
157
|
+
:deep(.dropdown) {
|
|
158
|
+
background: transparent !important;
|
|
159
|
+
border: none !important;
|
|
160
|
+
box-shadow: none !important;
|
|
161
|
+
padding: 0 !important;
|
|
162
|
+
height: 40px !important;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
:deep(.dropdown:hover),
|
|
166
|
+
:deep(.dropdown:focus-within) {
|
|
167
|
+
border: none !important;
|
|
168
|
+
background: transparent !important;
|
|
169
|
+
box-shadow: none !important;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
:deep(.dropdown-display) {
|
|
173
|
+
height: 100%;
|
|
174
|
+
padding: 0.625rem;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
:deep(.dropdown-value) {
|
|
178
|
+
font-size: 0.875rem;
|
|
179
|
+
line-height: 1.25rem;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
:deep(.dropdown-menu-portal) {
|
|
183
|
+
z-index: 1000 !important;
|
|
184
|
+
max-height: 200px !important;
|
|
185
|
+
overflow-y: auto !important;
|
|
186
|
+
overscroll-behavior: contain !important;
|
|
187
|
+
touch-action: pan-y !important;
|
|
188
|
+
-webkit-overflow-scrolling: touch !important;
|
|
189
|
+
border: 1px solid #3d3e44 !important;
|
|
190
|
+
background: linear-gradient(135deg, #2a2b30 0%, #2e2f34 100%) !important;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
:deep(.dropdown-item) {
|
|
194
|
+
padding: 0.625rem 1rem;
|
|
195
|
+
font-size: 0.875rem;
|
|
196
|
+
line-height: 1.25rem;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* Ensure proper z-index stacking */
|
|
200
|
+
.z-tooltip {
|
|
201
|
+
z-index: 100 !important;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.z-dropdown {
|
|
205
|
+
z-index: 90 !important;
|
|
206
|
+
}
|
|
104
207
|
</style>
|
|
105
208
|
<script setup>
|
|
106
209
|
import Modal from "@/components/ui/Modal.vue";
|
|
@@ -1,45 +1,49 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="flex text-white font-bold lg:gap-5 gap-1 lg:mb-
|
|
2
|
+
<div class="flex text-white font-bold lg:gap-5 gap-1 lg:mb-1 min-h-[2.5rem]" v-if="ui.queueStats.show" :key="key">
|
|
3
3
|
<div
|
|
4
4
|
v-if="ui.queueStats.total"
|
|
5
|
-
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8"
|
|
6
|
-
>
|
|
5
|
+
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8">
|
|
7
6
|
<h2 class="font-bold text-sm flex items-center gap-1 whitespace-nowrap">
|
|
8
|
-
<img width="14px" src="@/assets/img/wildcard.svg" />
|
|
7
|
+
<img width="14px" src="@/assets/img/wildcard.svg" />
|
|
8
|
+
Total MQM
|
|
9
9
|
</h2>
|
|
10
|
-
<span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">
|
|
11
|
-
ui.queueStats.total
|
|
12
|
-
|
|
10
|
+
<span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">
|
|
11
|
+
{{ ui.queueStats.total }}
|
|
12
|
+
</span>
|
|
13
13
|
</div>
|
|
14
14
|
<div
|
|
15
15
|
v-if="ui.queueStats.queued"
|
|
16
|
-
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8">
|
|
17
|
+
<h2 class="font-bold text-sm flex items-center gap-1 whitespace-nowrap">
|
|
18
|
+
<SkiIcon />
|
|
19
|
+
Queued
|
|
20
|
+
</h2>
|
|
21
|
+
<span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">
|
|
22
|
+
{{ ui.queueStats.queued }}
|
|
23
|
+
</span>
|
|
22
24
|
</div>
|
|
23
25
|
<div
|
|
24
26
|
v-if="ui.queueStats.sleeping"
|
|
25
|
-
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
class="stats-card lg:mb-2 mb-1 text-sm rounded-xl lg:p-3 p-2 lg:gap-3 gap-2 flex justify-between items-center min-w-0 h-8">
|
|
28
|
+
<h2 class="font-bold text-sm flex items-center gap-1 whitespace-nowrap">
|
|
29
|
+
<TimerIcon />
|
|
30
|
+
Sleeping
|
|
31
|
+
</h2>
|
|
32
|
+
<span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">
|
|
33
|
+
{{ ui.queueStats.sleeping }}
|
|
34
|
+
</span>
|
|
31
35
|
</div>
|
|
32
36
|
<div
|
|
33
37
|
v-if="ui.queueStats.nextQueuePasses.length > 0"
|
|
34
|
-
class="stats-card lg:mb-5 mb-2 rounded-xl text-sm flex justify-between items-center lg:p-3 p-2 lg:gap-3 gap-2 min-w-0 h-8"
|
|
35
|
-
>
|
|
38
|
+
class="stats-card lg:mb-5 mb-2 rounded-xl text-sm flex justify-between items-center lg:p-3 p-2 lg:gap-3 gap-2 min-w-0 h-8">
|
|
36
39
|
<h2 class="font-bold flex text-sm items-center gap-1 whitespace-nowrap">
|
|
37
|
-
<CartIcon
|
|
40
|
+
<CartIcon />
|
|
41
|
+
<span class="sm:block hidden">Next Passes</span>
|
|
38
42
|
<span class="sm:hidden block">Pass</span>
|
|
39
43
|
</h2>
|
|
40
|
-
<span class="text-light-400 text-xs font-black flex items-center text-right truncate">
|
|
41
|
-
ui.queueStats.nextQueuePasses.slice(0, queuePassAmount).join(", ")
|
|
42
|
-
|
|
44
|
+
<span class="text-light-400 text-xs font-black flex items-center text-right truncate">
|
|
45
|
+
{{ ui.queueStats.nextQueuePasses.slice(0, queuePassAmount).join(", ") }}
|
|
46
|
+
</span>
|
|
43
47
|
</div>
|
|
44
48
|
<!-- <div
|
|
45
49
|
v-if="ui.queueStats.carts"
|
|
@@ -64,7 +68,6 @@ const getQueuePassAmount = (width) => {
|
|
|
64
68
|
return 1;
|
|
65
69
|
};
|
|
66
70
|
|
|
67
|
-
let show = ref(true);
|
|
68
71
|
let key = ref(0);
|
|
69
72
|
let queuePassAmount = ref(getQueuePassAmount(window.innerWidth));
|
|
70
73
|
|