@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.
Files changed (42) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/.prettierrc +12 -1
  3. package/exit +209 -0
  4. package/index.html +1 -1
  5. package/package.json +1 -1
  6. package/public/manifest.json +8 -3
  7. package/src/assets/css/_input.scss +104 -111
  8. package/src/assets/css/_utilities.scss +441 -0
  9. package/src/assets/css/main.scss +228 -154
  10. package/src/components/Auth/LoginForm.vue +49 -6
  11. package/src/components/Editors/Account/Account.vue +156 -146
  12. package/src/components/Editors/Account/AccountCreator.vue +1 -1
  13. package/src/components/Editors/Account/AccountView.vue +13 -13
  14. package/src/components/Editors/Account/CreateAccount.vue +25 -16
  15. package/src/components/Editors/Profile/CreateProfile.vue +1 -1
  16. package/src/components/Editors/Profile/Profile.vue +1 -1
  17. package/src/components/Editors/Profile/ProfileCountryChooser.vue +83 -19
  18. package/src/components/Editors/Profile/ProfileView.vue +11 -11
  19. package/src/components/Tasks/CreateTaskAXS.vue +3 -3
  20. package/src/components/Tasks/CreateTaskTM.vue +7 -35
  21. package/src/components/Tasks/QuickSettings.vue +112 -9
  22. package/src/components/Tasks/Stats.vue +29 -26
  23. package/src/components/Tasks/Task.vue +499 -365
  24. package/src/components/Tasks/TaskView.vue +187 -127
  25. package/src/components/icons/Sandclock.vue +2 -2
  26. package/src/components/icons/Stadium.vue +1 -1
  27. package/src/components/ui/Modal.vue +37 -35
  28. package/src/components/ui/controls/CountryChooser.vue +200 -62
  29. package/src/components/ui/controls/atomic/Dropdown.vue +177 -91
  30. package/src/components/ui/controls/atomic/MultiDropdown.vue +247 -168
  31. package/src/composables/useClickOutside.js +21 -0
  32. package/src/composables/useDropdownPosition.js +174 -0
  33. package/src/stores/sampleData.js +4 -2
  34. package/src/stores/ui.js +8 -6
  35. package/src/views/Accounts.vue +12 -19
  36. package/src/views/Console.vue +34 -47
  37. package/src/views/Editor.vue +1194 -730
  38. package/src/views/Login.vue +65 -119
  39. package/src/views/Profiles.vue +2 -2
  40. package/src/views/Tasks.vue +170 -137
  41. package/static/offline.html +192 -50
  42. 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="open = !open" class="flex justify-between items-center z-inf text-white">
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
- <div
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-for="(country, i) in countries"
15
- v-bind:key="country"
16
- :class="`cursor-pointer w-12 snap-start ${i === 0 ? '' : 'my-2'}`"
17
- @click="set(country)"
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 class="flex gap-3 justify-between smooth-hover">
20
- <span class="text-sm">{{ country }} </span>
21
- <img class="w-5" :src="`/flags/${country?.toLowerCase()}.svg`" />
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
- </div>
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
- /* height: 3em !important; */
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
- .dropdown-content {
71
- left: -1.1rem;
72
- z-index: 99999999999999;
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 ipadlg:mr-3 w-4 h-4" />
12
- <h4 class="hidden ipadlg:flex">Profile Name</h4>
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 ipadlg:mr-3 w-4 h-4" />
17
- <h4 class="hidden ipadlg:flex">Card Number</h4>
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 ipadlg:mr-3 w-4 h-4" />
21
- <h4 class="hidden ipadlg:flex">Expiration</h4>
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 ipadlg:mr-3 w-4 h-4" />
25
- <h4 class="hidden ipadlg:flex">Enabled</h4>
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 ipadlg:mr-3 w-4 h-4" />
33
- <h4 class="hidden ipadlg:flex">Actions</h4>
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
- :style="{ backgroundColor: props.item.index % 2 == 1 ? '#1a1b1e' : '#242529' }"
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" style="height: 18px">#</span></label>
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
- <div class="input-wrapper" style="z-index: 200 !important; position: relative">
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
- <div class="input-wrapper" style="z-index: 100 !important; position: relative">
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="form-grid mt-4 mb-4">
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" style="height: 18px">#</span></label>
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
- <div class="input-wrapper" style="z-index: 200 !important; position: relative">
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
- <div class="input-wrapper" style="z-index: 100 !important; position: relative">
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" style="height: 17px" />
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
- <div class="input-container">
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="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-50"
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
- <div class="input-container">
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="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-30"
42
+ class="!w-2/3"
43
+ variant="transparent"
41
44
  :default="ui.profile.proxyList?.queue || proxyLists[0]"
42
- :onClick="(f) => saveProxyListUpate('queue', f)"
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 overflow-hidden;
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 mb-1 min-h-[2.5rem]" v-if="show" :key="key">
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" />Total MQM
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
- }}</span>
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
- <h2 class="font-bold text-sm flex items-center gap-1 whitespace-nowrap"><SkiIcon />Queued</h2>
19
- <span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">{{
20
- ui.queueStats.queued
21
- }}</span>
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
- <h2 class="font-bold text-sm flex items-center gap-1 whitespace-nowrap"><TimerIcon />Sleeping</h2>
28
- <span class="text-light-400 text-xs font-black flex items-center justify-center whitespace-nowrap">{{
29
- ui.queueStats.sleeping
30
- }}</span>
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 /><span class="sm:block hidden">Next Passes</span>
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
- }}</span>
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