@necrolab/dashboard 0.4.221 → 0.5.2

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 (141) hide show
  1. package/.prettierrc +27 -1
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +64 -2
  4. package/artwork/image.png +0 -0
  5. package/backend/api.js +26 -24
  6. package/backend/auth.js +2 -2
  7. package/backend/batching.js +1 -1
  8. package/backend/endpoints.js +8 -11
  9. package/backend/index.js +2 -2
  10. package/backend/mock-data.js +27 -36
  11. package/backend/mock-src/classes/logger.js +5 -7
  12. package/backend/mock-src/classes/utils.js +3 -2
  13. package/backend/mock-src/ticketmaster.js +4 -4
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +0 -1
  16. package/dev-server.js +134 -0
  17. package/exit +209 -0
  18. package/index.html +80 -8
  19. package/index.js +1 -1
  20. package/jsconfig.json +16 -0
  21. package/package.json +39 -25
  22. package/postcss.config.js +1 -1
  23. package/postinstall.js +124 -20
  24. package/public/android-chrome-192x192.png +0 -0
  25. package/public/android-chrome-512x512.png +0 -0
  26. package/public/apple-touch-icon.png +0 -0
  27. package/public/favicon-16x16.png +0 -0
  28. package/public/favicon-32x32.png +0 -0
  29. package/public/favicon.ico +0 -0
  30. package/public/img/logo_trans.png +0 -0
  31. package/public/img/necro_logo.png +0 -0
  32. package/public/manifest.json +16 -10
  33. package/public/reconnect-logo.png +0 -0
  34. package/run +176 -9
  35. package/src/App.vue +498 -85
  36. package/src/assets/css/base/reset.scss +43 -0
  37. package/src/assets/css/base/scroll.scss +114 -0
  38. package/src/assets/css/base/typography.scss +37 -0
  39. package/src/assets/css/components/buttons.scss +216 -0
  40. package/src/assets/css/components/forms.scss +221 -0
  41. package/src/assets/css/components/modals.scss +13 -0
  42. package/src/assets/css/components/tables.scss +27 -0
  43. package/src/assets/css/components/toasts.scss +100 -0
  44. package/src/assets/css/main.scss +202 -122
  45. package/src/assets/img/background.svg +2 -2
  46. package/src/assets/img/background.svg.backup +11 -0
  47. package/src/assets/img/logo_trans.png +0 -0
  48. package/src/components/Auth/LoginForm.vue +95 -11
  49. package/src/components/Editors/Account/Account.vue +116 -40
  50. package/src/components/Editors/Account/AccountCreator.vue +88 -39
  51. package/src/components/Editors/Account/AccountView.vue +102 -34
  52. package/src/components/Editors/Account/CreateAccount.vue +80 -32
  53. package/src/components/Editors/Profile/CreateProfile.vue +269 -83
  54. package/src/components/Editors/Profile/Profile.vue +132 -47
  55. package/src/components/Editors/Profile/ProfileCountryChooser.vue +82 -20
  56. package/src/components/Editors/Profile/ProfileView.vue +89 -32
  57. package/src/components/Editors/TagLabel.vue +67 -6
  58. package/src/components/Editors/TagToggle.vue +7 -2
  59. package/src/components/Filter/Filter.vue +288 -71
  60. package/src/components/Filter/FilterPreview.vue +202 -31
  61. package/src/components/Filter/PriceSortToggle.vue +76 -6
  62. package/src/components/Table/Header.vue +1 -1
  63. package/src/components/Table/Row.vue +1 -1
  64. package/src/components/Table/Table.vue +19 -2
  65. package/src/components/Tasks/CheckStock.vue +6 -8
  66. package/src/components/Tasks/Controls/DesktopControls.vue +27 -17
  67. package/src/components/Tasks/Controls/MobileControls.vue +8 -45
  68. package/src/components/Tasks/CreateTaskAXS.vue +80 -72
  69. package/src/components/Tasks/CreateTaskTM.vue +95 -141
  70. package/src/components/Tasks/MassEdit.vue +4 -6
  71. package/src/components/Tasks/QuickSettings.vue +199 -30
  72. package/src/components/Tasks/ScrapeVenue.vue +5 -6
  73. package/src/components/Tasks/Stats.vue +50 -24
  74. package/src/components/Tasks/Task.vue +384 -179
  75. package/src/components/Tasks/TaskLabel.vue +2 -2
  76. package/src/components/Tasks/TaskView.vue +136 -48
  77. package/src/components/Tasks/Utilities.vue +25 -10
  78. package/src/components/Tasks/ViewTask.vue +321 -0
  79. package/src/components/icons/Bag.vue +1 -1
  80. package/src/components/icons/Check.vue +5 -0
  81. package/src/components/icons/Close.vue +21 -0
  82. package/src/components/icons/CloseX.vue +5 -0
  83. package/src/components/icons/Eye.vue +6 -0
  84. package/src/components/icons/Key.vue +21 -0
  85. package/src/components/icons/Loyalty.vue +1 -1
  86. package/src/components/icons/Mail.vue +2 -2
  87. package/src/components/icons/Pencil.vue +21 -0
  88. package/src/components/icons/Play.vue +2 -2
  89. package/src/components/icons/Profile.vue +18 -0
  90. package/src/components/icons/Reload.vue +4 -5
  91. package/src/components/icons/Sandclock.vue +2 -2
  92. package/src/components/icons/Sell.vue +21 -0
  93. package/src/components/icons/Spinner.vue +42 -0
  94. package/src/components/icons/SquareCheck.vue +18 -0
  95. package/src/components/icons/SquareUncheck.vue +18 -0
  96. package/src/components/icons/Stadium.vue +1 -1
  97. package/src/components/icons/Wildcard.vue +18 -0
  98. package/src/components/icons/index.js +26 -1
  99. package/src/components/ui/Modal.vue +107 -13
  100. package/src/components/ui/Navbar.vue +175 -40
  101. package/src/components/ui/ReconnectIndicator.vue +351 -55
  102. package/src/components/ui/Splash.vue +5 -35
  103. package/src/components/ui/controls/CountryChooser.vue +200 -62
  104. package/src/components/ui/controls/atomic/Checkbox.vue +119 -10
  105. package/src/components/ui/controls/atomic/Dropdown.vue +216 -39
  106. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  107. package/src/components/ui/controls/atomic/MultiDropdown.vue +300 -37
  108. package/src/components/ui/controls/atomic/Switch.vue +53 -25
  109. package/src/composables/useClickOutside.js +21 -0
  110. package/src/composables/useDropdownPosition.js +174 -0
  111. package/src/libs/Filter.js +60 -24
  112. package/src/registerServiceWorker.js +1 -1
  113. package/src/stores/connection.js +4 -4
  114. package/src/stores/sampleData.js +172 -199
  115. package/src/stores/ui.js +55 -20
  116. package/src/stores/utils.js +30 -4
  117. package/src/types/index.js +41 -0
  118. package/src/utils/debug.js +1 -0
  119. package/src/views/Accounts.vue +116 -50
  120. package/src/views/Console.vue +394 -77
  121. package/src/views/Editor.vue +1176 -123
  122. package/src/views/FilterBuilder.vue +528 -250
  123. package/src/views/Login.vue +75 -14
  124. package/src/views/Profiles.vue +119 -34
  125. package/src/views/Tasks.vue +266 -98
  126. package/static/offline.html +192 -50
  127. package/switch-branch.sh +41 -0
  128. package/tailwind.config.js +119 -27
  129. package/vite.config.js +73 -16
  130. package/workbox-config.cjs +63 -0
  131. package/ICONS.md +0 -21
  132. package/public/img/background.svg +0 -14
  133. package/public/img/logo.png +0 -0
  134. package/public/img/logo_icon.png +0 -0
  135. package/public/img/logo_icon_2.png +0 -0
  136. package/src/assets/css/_input.scss +0 -143
  137. package/src/assets/img/logo.png +0 -0
  138. package/src/assets/img/logo_icon.png +0 -0
  139. package/src/assets/img/logo_icon_2.png +0 -0
  140. package/vue.config.js +0 -32
  141. package/workbox-config.js +0 -7
@@ -9,63 +9,71 @@
9
9
  <div
10
10
  v-for="(value, keyName) in category"
11
11
  :key="keyName"
12
- class="text-white bg-dark-500 mb-3 rounded border-dark-550 border-2 px-3 flex items-center justify-between h-10"
12
+ class="input-container"
13
13
  >
14
- <span class="w-1/3">{{ keyName }}</span>
15
- <input
16
- type="text"
17
- class="transparent w-2/3 bg-transparent border-none text-white placeholder-light-400"
18
- :placeholder="`Enter ${keyName} key`"
19
- v-model="quickConfig.keys[categoryName][keyName]"
20
- />
14
+ <span class="w-1/3 text-light-300 font-medium text-xs">{{ keyName }}</span>
15
+ <div class="w-2/3 h-full flex items-center">
16
+ <input
17
+ type="text"
18
+ class="quick-settings-input"
19
+ :placeholder="`Enter ${keyName} key`"
20
+ v-model="quickConfig.keys[categoryName][keyName]"
21
+ />
22
+ </div>
21
23
  </div>
22
24
  </div>
23
25
 
24
- <div
25
- class="text-white bg-dark-500 mb-3 px-3 rounded border-dark-550 border-2 flex items-center justify-between h-10"
26
- >
27
- <span class="w-1/3">Checkout Proxies</span>
26
+ <div class="text-light-400 mb-2 mt-4">Proxy Lists</div>
27
+
28
+ <div class="input-container relative-positioned z-tooltip">
29
+ <span class="w-1/3 text-light-300 font-medium text-xs">Checkout Proxies</span>
28
30
  <Dropdown
29
- class="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-50"
31
+ class="!w-2/3"
32
+ variant="transparent"
30
33
  :default="ui.profile.proxyList?.checkout || proxyLists[0]"
34
+ :value="ui.profile.proxyList?.checkout"
31
35
  :options="proxyLists"
32
36
  :onClick="(f) => saveProxyListUpate('checkout', f)"
33
37
  :allowDefault="false"
34
- rightAmount="right-3"
35
38
  />
36
39
  </div>
37
40
 
38
- <div
39
- class="text-white bg-dark-500 mb-3 px-3 rounded border-dark-550 border-2 flex items-center justify-between h-10"
40
- >
41
- <span class="w-1/3">Queue Proxies</span>
41
+ <div class="input-container relative-positioned z-dropdown">
42
+ <span class="w-1/3 text-light-300 font-medium text-xs">Queue Proxies</span>
42
43
  <Dropdown
43
- class="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-30"
44
+ class="!w-2/3"
45
+ variant="transparent"
44
46
  :default="ui.profile.proxyList?.queue || proxyLists[0]"
45
- :onClick="(f) => saveProxyListUpate('queue', f)"
47
+ :value="ui.profile.proxyList?.queue"
46
48
  :options="proxyLists"
49
+ :onClick="(f) => saveProxyListUpate('queue', f)"
47
50
  :allowDefault="false"
48
- rightAmount="right-3"
49
51
  />
50
52
  </div>
51
- <div class="flex mt-5 justify-between flex-row items-center">
52
- <div>
53
- <p class="text-light-400 text-sm">Dashboard: v{{ version }}</p>
54
- <p class="text-light-400 text-sm">Bot: v{{ ui.botVersion }}</p>
53
+ <div class="flex mt-5 justify-between flex-row items-center quicksettings-bottom">
54
+ <div class="flex gap-3 items-center quicksettings-versions">
55
+ <div class="version-badge">
56
+ <span class="version-label">Dashboard</span>
57
+ <span class="version-number">v{{ version }}</span>
58
+ </div>
59
+ <div class="version-badge">
60
+ <span class="version-label">Bot</span>
61
+ <span class="version-number">v{{ ui.botVersion }}</span>
62
+ </div>
55
63
  </div>
56
64
 
57
- <div class="flex gap-5">
65
+ <div class="flex gap-3 quicksettings-buttons">
58
66
  <button
59
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-24 text-xs flex items-center justify-center gap-x-2"
67
+ class="quicksettings-btn bg-dark-400 flex items-center justify-center gap-x-2"
60
68
  @click="checkBalances()"
61
69
  >
62
- Balances <img src="@/assets/img/sell.svg" width="14" />
70
+ Balances <img src="@/assets/img/sell.svg" width="12" />
63
71
  </button>
64
72
  <button
65
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-24 text-xs flex items-center justify-center gap-x-2"
73
+ class="quicksettings-btn bg-dark-400 flex items-center justify-center gap-x-2"
66
74
  @click="done(true)"
67
75
  >
68
- Save <img src="/img/save.svg" width="14" class="invert" />
76
+ Save <img src="/img/save.svg" width="12" class="invert" />
69
77
  </button>
70
78
  </div>
71
79
  </div>
@@ -81,6 +89,167 @@
81
89
  .transparent {
82
90
  background: transparent !important;
83
91
  }
92
+
93
+ .input-container {
94
+ @apply text-white bg-dark-500 mb-3 px-3 rounded-lg border-dark-550 border-2 flex items-center justify-between h-10;
95
+ overflow: visible;
96
+ }
97
+
98
+ .quick-settings-input {
99
+ @apply w-full h-full text-sm text-white bg-transparent border-0 outline-none px-2 py-1 transition-colors duration-150;
100
+
101
+ &:focus {
102
+ @apply outline-none border-0 shadow-none bg-transparent;
103
+ }
104
+
105
+ &:hover:not(:focus) {
106
+ background: transparent;
107
+ }
108
+
109
+ &::placeholder {
110
+ color: oklch(0.50 0 0);
111
+ }
112
+ }
113
+
114
+ .input-container:hover {
115
+ border-color: oklch(0.30 0 0);
116
+ }
117
+
118
+ .input-container:focus-within {
119
+ border-color: oklch(0.72 0.15 145) !important;
120
+ outline: 1px solid oklch(0.72 0.15 145);
121
+ outline-offset: 0;
122
+ }
123
+
124
+ /* iPhone portrait mode fixes */
125
+ @media (max-width: 430px) and (orientation: portrait) {
126
+ .quicksettings-bottom {
127
+ flex-direction: column;
128
+ gap: 1rem;
129
+ align-items: stretch;
130
+ }
131
+
132
+ .quicksettings-versions {
133
+ justify-content: center;
134
+ flex-wrap: wrap;
135
+ gap: 0.5rem;
136
+ }
137
+
138
+ .quicksettings-versions > div {
139
+ flex: 1;
140
+ min-width: 120px;
141
+ text-align: center;
142
+ }
143
+
144
+ .quicksettings-buttons {
145
+ justify-content: center;
146
+ gap: 0.75rem;
147
+ }
148
+
149
+ .quicksettings-buttons button {
150
+ width: 5rem;
151
+ padding-left: 0.5rem;
152
+ padding-right: 0.5rem;
153
+ gap: 0.25rem;
154
+ }
155
+
156
+ .quicksettings-buttons button img {
157
+ width: 12px;
158
+ }
159
+ }
160
+
161
+ /* Dropdowns are teleported to body, so modal can scroll normally */
162
+
163
+ /* Dropdown styling fixes */
164
+ :deep(.dropdown) {
165
+ background: transparent !important;
166
+ border: none !important;
167
+ box-shadow: none !important;
168
+ padding: 0 !important;
169
+ height: 40px !important;
170
+ }
171
+
172
+ :deep(.dropdown:hover),
173
+ :deep(.dropdown:focus-within) {
174
+ border: none !important;
175
+ background: transparent !important;
176
+ box-shadow: none !important;
177
+ }
178
+
179
+ :deep(.dropdown-display) {
180
+ height: 100%;
181
+ padding: 0.625rem;
182
+ }
183
+
184
+ :deep(.dropdown-value) {
185
+ font-size: 0.875rem;
186
+ line-height: 1.25rem;
187
+ }
188
+
189
+ :deep(.dropdown-menu-portal) {
190
+ z-index: 26000 !important;
191
+ max-height: 200px !important;
192
+ overflow-y: auto !important;
193
+ overscroll-behavior: contain !important;
194
+ touch-action: pan-y !important;
195
+ -webkit-overflow-scrolling: touch !important;
196
+ border: 1px solid oklch(0.26 0 0) !important;
197
+ background: linear-gradient(135deg, oklch(0.18 0 0) 0%, oklch(0.20 0 0) 100%) !important;
198
+ }
199
+
200
+ :deep(.dropdown-item) {
201
+ padding: 0.625rem 1rem;
202
+ font-size: 0.875rem;
203
+ line-height: 1.25rem;
204
+ }
205
+
206
+ /* Ensure proper z-index stacking */
207
+ .z-tooltip {
208
+ z-index: 100 !important;
209
+ }
210
+
211
+ .z-dropdown {
212
+ z-index: 90 !important;
213
+ }
214
+
215
+ /* QuickSettings compact buttons */
216
+ .quicksettings-btn {
217
+ @apply rounded transition-all duration-150;
218
+ background: oklch(0.2046 0 0);
219
+ border: 2px solid oklch(0.2809 0 0);
220
+ color: oklch(0.90 0 0);
221
+ height: 2.5rem;
222
+ width: 6.5rem;
223
+ font-size: 0.75rem;
224
+ font-weight: 500;
225
+
226
+ &:hover {
227
+ border-color: oklch(0.72 0.15 145);
228
+ }
229
+
230
+ &:active, &:focus {
231
+ border-color: oklch(0.72 0.15 145);
232
+ outline: 1px solid oklch(0.72 0.15 145);
233
+ outline-offset: 0;
234
+ }
235
+ }
236
+
237
+ /* Version badges */
238
+ .version-badge {
239
+ @apply flex items-center gap-x-2 px-3 py-2 rounded-lg border;
240
+ background: oklch(0.2046 0 0);
241
+ border-color: oklch(0.2809 0 0);
242
+
243
+ .version-label {
244
+ @apply text-xs font-medium;
245
+ color: oklch(0.65 0 0);
246
+ }
247
+
248
+ .version-number {
249
+ @apply text-xs font-bold;
250
+ color: oklch(0.72 0.15 145);
251
+ }
252
+ }
84
253
  </style>
85
254
  <script setup>
86
255
  import Modal from "@/components/ui/Modal.vue";
@@ -4,19 +4,18 @@
4
4
  <!-- Event ID -->
5
5
  <div class="input-wrapper mt-7 mb-4">
6
6
  <label class="label-override mb-2">Event ID or URL <StadiumIcon /></label>
7
- <div class="input-default">
7
+ <div class="input-default required">
8
8
  <input
9
9
  :placeholder="!isEU(ui.currentCountry.siteId) ? '102PDA9125510GYU' : '529171'"
10
10
  v-model="eventId"
11
11
  />
12
- <span class="text-red-400 my-auto mr-2 mt-3">* </span>
13
12
  </div>
14
13
  </div>
15
14
  <button
16
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-auto"
17
- @click="done()"
18
- >
19
- Scrape Venue <ScrapeIcon />
15
+ class="button-default ml-auto mt-4 flex w-48 items-center justify-center gap-x-2 bg-dark-400 text-xs"
16
+ @click="done()">
17
+ Scrape Venue
18
+ <ScrapeIcon />
20
19
  </button>
21
20
  </Modal>
22
21
  </template>
@@ -1,43 +1,53 @@
1
1
  <template>
2
- <div class="flex text-white font-bold lg:gap-5 gap-1" v-if="show" :key="key">
2
+ <div class="flex items-center gap-1 font-bold text-white lg:gap-3" v-if="ui.queueStats.show" :key="key">
3
3
  <div
4
4
  v-if="ui.queueStats.total"
5
- class="bg-dark-500 mb-5 text-sm rounded-lg lg:p-2 p-1 lg:gap-3 gap-2 flex justify-between"
6
- >
7
- <h2 class="font-bold text-sm flex items-center gap-1 scale-100">
8
- <img width="14px" src="@/assets/img/wildcard.svg" />Total MQM
5
+ class="stats-card flex h-10 min-w-0 items-center justify-between gap-2 rounded-lg px-3 text-sm">
6
+ <h2 class="flex items-center gap-1 whitespace-nowrap text-sm font-bold">
7
+ <img width="14px" src="@/assets/img/wildcard.svg" />
8
+ <span class="hidden md:inline">Total</span>
9
9
  </h2>
10
- <span class="text-light-400 text-sm font-black flex justify-center">{{ ui.queueStats.total }} </span>
10
+ <span class="flex items-center justify-center whitespace-nowrap text-xs font-black text-light-400">
11
+ {{ ui.queueStats.total }}
12
+ </span>
11
13
  </div>
12
14
  <div
13
15
  v-if="ui.queueStats.queued"
14
- class="bg-dark-500 mb-5 text-sm rounded-lg lg:p-2 p-1 lg:gap-3 gap-2 flex justify-between"
15
- >
16
- <h2 class="font-bold text-sm flex items-center gap-1"><SkiIcon />Queued</h2>
17
- <span class="text-light-400 text-sm font-black flex justify-center">{{ ui.queueStats.queued }} </span>
16
+ class="stats-card flex h-10 min-w-0 items-center justify-between gap-2 rounded-lg px-3 text-sm">
17
+ <h2 class="flex items-center gap-1 whitespace-nowrap text-sm font-bold">
18
+ <SkiIcon />
19
+ <span class="hidden md:inline">Queued</span>
20
+ </h2>
21
+ <span class="flex items-center justify-center whitespace-nowrap text-xs font-black text-light-400">
22
+ {{ ui.queueStats.queued }}
23
+ </span>
18
24
  </div>
19
25
  <div
20
26
  v-if="ui.queueStats.sleeping"
21
- class="bg-dark-500 mb-5 text-sm rounded-lg lg:p-2 p-1 lg:gap-3 gap-2 flex justify-between"
22
- >
23
- <h2 class="font-bold text-sm flex items-center gap-1"><TimerIcon />Sleeping</h2>
24
- <span class="text-light-400 text-sm font-black flex justify-center">{{ ui.queueStats.sleeping }} </span>
27
+ class="stats-card flex h-10 min-w-0 items-center justify-between gap-2 rounded-lg px-3 text-sm">
28
+ <h2 class="flex items-center gap-1 whitespace-nowrap text-sm font-bold">
29
+ <TimerIcon />
30
+ <span class="hidden md:inline">Sleeping</span>
31
+ </h2>
32
+ <span class="flex items-center justify-center whitespace-nowrap text-xs font-black text-light-400">
33
+ {{ ui.queueStats.sleeping }}
34
+ </span>
25
35
  </div>
26
36
  <div
27
37
  v-if="ui.queueStats.nextQueuePasses.length > 0"
28
- class="bg-dark-500 mb-5 rounded-lg text-sm flex justify-between lg:p-2 p-1 lg:gap-3 gap-2"
29
- >
30
- <h2 class="font-bold flex text-sm items-center gap-1">
31
- <CartIcon /><span class="sm:block hidden">Next Passes</span>
32
- <span class="sm:hidden block">Pass</span>
38
+ class="stats-card mb-2 flex h-8 min-w-0 items-center justify-between gap-2 rounded-xl p-2 text-sm lg:mb-5 lg:gap-3 lg:p-3">
39
+ <h2 class="flex items-center gap-1 whitespace-nowrap text-sm font-bold">
40
+ <CartIcon />
41
+ <span class="hidden sm:block">Next Passes</span>
42
+ <span class="block sm:hidden">Pass</span>
33
43
  </h2>
34
- <span class="text-light-400 text-sm font-black">{{
35
- ui.queueStats.nextQueuePasses.slice(0, queuePassAmount).join(", ")
36
- }}</span>
44
+ <span class="flex items-center truncate text-right text-xs font-black text-light-400">
45
+ {{ ui.queueStats.nextQueuePasses.slice(0, queuePassAmount).join(", ") }}
46
+ </span>
37
47
  </div>
38
48
  <!-- <div
39
49
  v-if="ui.queueStats.carts"
40
- class="bg-dark-500 mb-5 text-sm rounded-lg lg:p-2 p-1 lg:gap-3 gap-2 flex justify-between"
50
+ class="bg-dark-500 mb-2 text-sm rounded-lg lg:p-2 p-1 lg:gap-3 gap-2 flex justify-between"
41
51
  >
42
52
  <h2 class="font-bold text-sm flex items-center gap-1"><CartIcon />Carts</h2>
43
53
  <span class="text-light-400 text-sm font-black flex justify-center">{{ ui.queueStats.sleeping }} </span>
@@ -58,9 +68,25 @@ const getQueuePassAmount = (width) => {
58
68
  return 1;
59
69
  };
60
70
 
61
- let show = ref(true);
62
71
  let key = ref(0);
63
72
  let queuePassAmount = ref(getQueuePassAmount(window.innerWidth));
64
73
 
65
74
  window.addEventListener("resize", () => (queuePassAmount.value = getQueuePassAmount(window.innerWidth)));
66
75
  </script>
76
+ <style lang="scss" scoped>
77
+ .stats-card {
78
+ @apply rounded;
79
+ background: oklch(0.2046 0 0);
80
+ border: 2px solid oklch(0.2809 0 0);
81
+
82
+ h2 {
83
+ font-weight: 600;
84
+ color: oklch(0.90 0 0);
85
+ }
86
+
87
+ span {
88
+ font-weight: 700;
89
+ color: oklch(0.90 0 0);
90
+ }
91
+ }
92
+ </style>