@necrolab/dashboard 0.4.220 → 0.5.1

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 (140) 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 +78 -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/run +176 -9
  34. package/src/App.vue +498 -85
  35. package/src/assets/css/base/reset.scss +43 -0
  36. package/src/assets/css/base/scroll.scss +114 -0
  37. package/src/assets/css/base/typography.scss +37 -0
  38. package/src/assets/css/components/buttons.scss +216 -0
  39. package/src/assets/css/components/forms.scss +221 -0
  40. package/src/assets/css/components/modals.scss +13 -0
  41. package/src/assets/css/components/tables.scss +27 -0
  42. package/src/assets/css/components/toasts.scss +100 -0
  43. package/src/assets/css/main.scss +201 -122
  44. package/src/assets/img/background.svg +2 -2
  45. package/src/assets/img/background.svg.backup +11 -0
  46. package/src/assets/img/logo_trans.png +0 -0
  47. package/src/components/Auth/LoginForm.vue +62 -11
  48. package/src/components/Editors/Account/Account.vue +116 -40
  49. package/src/components/Editors/Account/AccountCreator.vue +88 -39
  50. package/src/components/Editors/Account/AccountView.vue +102 -34
  51. package/src/components/Editors/Account/CreateAccount.vue +80 -32
  52. package/src/components/Editors/Profile/CreateProfile.vue +269 -83
  53. package/src/components/Editors/Profile/Profile.vue +132 -47
  54. package/src/components/Editors/Profile/ProfileCountryChooser.vue +82 -20
  55. package/src/components/Editors/Profile/ProfileView.vue +89 -32
  56. package/src/components/Editors/TagLabel.vue +67 -6
  57. package/src/components/Editors/TagToggle.vue +7 -2
  58. package/src/components/Filter/Filter.vue +288 -71
  59. package/src/components/Filter/FilterPreview.vue +202 -31
  60. package/src/components/Filter/PriceSortToggle.vue +76 -6
  61. package/src/components/Table/Header.vue +1 -1
  62. package/src/components/Table/Row.vue +1 -1
  63. package/src/components/Table/Table.vue +19 -2
  64. package/src/components/Tasks/CheckStock.vue +6 -8
  65. package/src/components/Tasks/Controls/DesktopControls.vue +27 -17
  66. package/src/components/Tasks/Controls/MobileControls.vue +8 -45
  67. package/src/components/Tasks/CreateTaskAXS.vue +80 -72
  68. package/src/components/Tasks/CreateTaskTM.vue +95 -141
  69. package/src/components/Tasks/MassEdit.vue +4 -6
  70. package/src/components/Tasks/QuickSettings.vue +199 -30
  71. package/src/components/Tasks/ScrapeVenue.vue +5 -6
  72. package/src/components/Tasks/Stats.vue +50 -24
  73. package/src/components/Tasks/Task.vue +384 -179
  74. package/src/components/Tasks/TaskLabel.vue +2 -2
  75. package/src/components/Tasks/TaskView.vue +136 -48
  76. package/src/components/Tasks/Utilities.vue +25 -10
  77. package/src/components/Tasks/ViewTask.vue +321 -0
  78. package/src/components/icons/Bag.vue +1 -1
  79. package/src/components/icons/Check.vue +5 -0
  80. package/src/components/icons/Close.vue +21 -0
  81. package/src/components/icons/CloseX.vue +5 -0
  82. package/src/components/icons/Eye.vue +6 -0
  83. package/src/components/icons/Key.vue +21 -0
  84. package/src/components/icons/Loyalty.vue +1 -1
  85. package/src/components/icons/Mail.vue +2 -2
  86. package/src/components/icons/Pencil.vue +21 -0
  87. package/src/components/icons/Play.vue +2 -2
  88. package/src/components/icons/Profile.vue +18 -0
  89. package/src/components/icons/Reload.vue +4 -5
  90. package/src/components/icons/Sandclock.vue +2 -2
  91. package/src/components/icons/Sell.vue +21 -0
  92. package/src/components/icons/Spinner.vue +42 -0
  93. package/src/components/icons/SquareCheck.vue +18 -0
  94. package/src/components/icons/SquareUncheck.vue +18 -0
  95. package/src/components/icons/Stadium.vue +1 -1
  96. package/src/components/icons/Wildcard.vue +18 -0
  97. package/src/components/icons/index.js +26 -1
  98. package/src/components/ui/Modal.vue +107 -13
  99. package/src/components/ui/Navbar.vue +175 -40
  100. package/src/components/ui/ReconnectIndicator.vue +351 -55
  101. package/src/components/ui/Splash.vue +5 -35
  102. package/src/components/ui/controls/CountryChooser.vue +200 -62
  103. package/src/components/ui/controls/atomic/Checkbox.vue +119 -10
  104. package/src/components/ui/controls/atomic/Dropdown.vue +216 -39
  105. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  106. package/src/components/ui/controls/atomic/MultiDropdown.vue +300 -37
  107. package/src/components/ui/controls/atomic/Switch.vue +53 -25
  108. package/src/composables/useClickOutside.js +21 -0
  109. package/src/composables/useDropdownPosition.js +174 -0
  110. package/src/libs/Filter.js +60 -24
  111. package/src/registerServiceWorker.js +1 -1
  112. package/src/stores/connection.js +4 -4
  113. package/src/stores/sampleData.js +172 -199
  114. package/src/stores/ui.js +55 -20
  115. package/src/stores/utils.js +30 -4
  116. package/src/types/index.js +41 -0
  117. package/src/utils/debug.js +1 -0
  118. package/src/views/Accounts.vue +116 -50
  119. package/src/views/Console.vue +394 -79
  120. package/src/views/Editor.vue +1176 -123
  121. package/src/views/FilterBuilder.vue +528 -250
  122. package/src/views/Login.vue +76 -14
  123. package/src/views/Profiles.vue +119 -34
  124. package/src/views/Tasks.vue +266 -98
  125. package/static/offline.html +192 -50
  126. package/switch-branch.sh +41 -0
  127. package/tailwind.config.js +119 -27
  128. package/vite.config.js +73 -16
  129. package/workbox-config.cjs +63 -0
  130. package/ICONS.md +0 -21
  131. package/public/img/background.svg +0 -14
  132. package/public/img/logo.png +0 -0
  133. package/public/img/logo_icon.png +0 -0
  134. package/public/img/logo_icon_2.png +0 -0
  135. package/src/assets/css/_input.scss +0 -143
  136. package/src/assets/img/logo.png +0 -0
  137. package/src/assets/img/logo_icon.png +0 -0
  138. package/src/assets/img/logo_icon_2.png +0 -0
  139. package/vue.config.js +0 -32
  140. package/workbox-config.js +0 -7
@@ -1,23 +1,98 @@
1
1
  <template>
2
- <div class="my-auto relative flex justify-center flex-col items-center" style="height: 80vh">
3
- <div class="spinner-container">
4
- <div class="spinner"></div>
5
- <img :src="logoIcon" alt="Beaker Logo" class="logo" />
2
+ <div class="reconnect-overlay">
3
+ <transition name="background-fill" appear>
4
+ <div class="background-layer"></div>
5
+ </transition>
6
+ <transition name="reconnect-content" appear>
7
+ <div class="reconnect-container">
8
+ <div class="loading-system">
9
+ <!-- Geometric loading rings -->
10
+ <div class="ring-system">
11
+ <div class="ring ring-outer"></div>
12
+ <div class="ring ring-middle"></div>
13
+ <div class="ring ring-inner"></div>
14
+ <!-- Central logo -->
15
+ <img :src="logoIcon" alt="Logo" class="logo" />
16
+ </div>
17
+
18
+ <!-- Progress indicators -->
19
+ <div class="progress-dots">
20
+ <div class="dot" :class="{ active: dotIndex >= 0 }"></div>
21
+ <div class="dot" :class="{ active: dotIndex >= 1 }"></div>
22
+ <div class="dot" :class="{ active: dotIndex >= 2 }"></div>
23
+ <div class="dot" :class="{ active: dotIndex >= 3 }"></div>
24
+ </div>
6
25
  </div>
7
- <span class="text-white text-3xl font-light mt-3">{{ props.message }}{{ dots }}</span>
26
+
27
+ <div class="message-container">
28
+ <h2 class="message-text">{{ props.message }}</h2>
29
+ <div class="status-bar">
30
+ <div class="status-fill"></div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </transition>
8
35
  </div>
9
36
  </template>
10
37
 
11
38
  <script setup>
12
- import { ref } from "vue";
13
- import logoIcon from "@/assets/img/logo_icon_2.png";
39
+ import { ref, onMounted, onUnmounted } from "vue";
40
+ import logoIcon from "/android-chrome-192x192.png";
41
+
42
+ const dotIndex = ref(0);
43
+ const progressWidth = ref(0);
44
+ let dotInterval;
45
+ let progressInterval;
46
+
47
+ // Animate progress dots
48
+ const animateDots = () => {
49
+ dotIndex.value = (dotIndex.value + 1) % 5; // 0-4, with 4 being all off
50
+ };
51
+
52
+ // Animate progress bar
53
+ onMounted(() => {
54
+ dotInterval = setInterval(animateDots, 600);
55
+ });
14
56
 
15
- const dots = ref(".");
57
+ // Add page fade-in effect when modal closes
58
+ const addPageFadeIn = () => {
59
+ // Add global style for underlying page fade-in
60
+ const style = document.createElement('style');
61
+ style.textContent = `
62
+ .page-fade-in {
63
+ animation: pageReveal 0.6s ease-out forwards;
64
+ }
65
+ @keyframes pageReveal {
66
+ from {
67
+ opacity: 0.7;
68
+ transform: scale(0.98);
69
+ filter: blur(1px);
70
+ }
71
+ to {
72
+ opacity: 1;
73
+ transform: scale(1);
74
+ filter: blur(0);
75
+ }
76
+ }
77
+ `;
78
+ document.head.appendChild(style);
79
+
80
+ // Apply the class to the body
81
+ document.body.classList.add('page-fade-in');
82
+
83
+ // Remove the class and style after animation
84
+ setTimeout(() => {
85
+ document.body.classList.remove('page-fade-in');
86
+ if (document.head.contains(style)) {
87
+ document.head.removeChild(style);
88
+ }
89
+ }, 600);
90
+ };
16
91
 
17
- setInterval(() => {
18
- dots.value += ".";
19
- if (dots.value.length > 3) dots.value = ".";
20
- }, 1000);
92
+ onUnmounted(() => {
93
+ if (dotInterval) clearInterval(dotInterval);
94
+ addPageFadeIn();
95
+ });
21
96
 
22
97
  const props = defineProps({
23
98
  message: {
@@ -27,64 +102,285 @@ const props = defineProps({
27
102
  });
28
103
  </script>
29
104
 
30
- <style scoped>
31
- .spinner-container {
105
+ <style lang="scss" scoped>
106
+ .reconnect-overlay {
107
+ position: fixed;
108
+ top: -100vh;
109
+ left: -100vw;
110
+ right: -100vw;
111
+ bottom: -100vh;
112
+ z-index: 9999;
113
+ --tw-ring-color: transparent !important;
114
+ }
115
+
116
+ .background-layer {
117
+ position: absolute;
118
+ top: 0;
119
+ left: 0;
120
+ right: 0;
121
+ bottom: 0;
122
+ background: rgba(26, 27, 30, 0.98);
123
+ backdrop-filter: blur(12px);
124
+ -webkit-backdrop-filter: blur(12px);
125
+ }
126
+
127
+ .reconnect-container {
128
+ position: absolute;
129
+ top: 100vh;
130
+ left: 100vw;
131
+ right: 100vw;
132
+ bottom: 100vh;
133
+ display: flex;
134
+ flex-direction: column;
135
+ align-items: center;
136
+ justify-content: center;
137
+ gap: 3rem;
138
+ --tw-ring-color: transparent !important;
139
+ }
140
+
141
+ .loading-system {
32
142
  position: relative;
33
- width: 200px;
34
- height: 200px;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
35
146
  }
36
- .logo {
147
+
148
+ .ring-system {
149
+ position: relative;
150
+ width: 160px;
151
+ height: 160px;
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ }
156
+
157
+ .ring {
37
158
  position: absolute;
38
- width: 180px;
39
- height: 180px;
40
- top: 50%;
41
- left: 50%;
42
- transform: translate(-50%, -50%);
159
+ border-radius: 50%;
160
+ background: transparent !important;
161
+ --tw-ring-color: transparent !important;
162
+ border: 4px solid transparent;
163
+ }
164
+
165
+ .ring-outer {
166
+ width: 160px;
167
+ height: 160px;
168
+ border-top: 4px solid oklch(0.78 0.12 145);
169
+ border-right: 4px solid rgba(157, 211, 168, 0.3);
170
+ border-bottom: 4px solid transparent;
171
+ border-left: 4px solid transparent;
172
+ animation: breathe-slow 3s ease-in-out infinite;
173
+ top: 0;
174
+ left: 0;
175
+ }
176
+
177
+ .ring-middle {
178
+ width: 120px;
179
+ height: 120px;
180
+ border-top: 4px solid oklch(0.72 0.15 145);
181
+ border-right: 4px solid rgba(136, 201, 153, 0.4);
182
+ border-bottom: 4px solid transparent;
183
+ border-left: 4px solid transparent;
184
+ animation: breathe-medium 2.5s ease-in-out infinite reverse;
185
+ top: 20px;
186
+ left: 20px;
187
+ }
188
+
189
+ .ring-inner {
190
+ width: 80px;
191
+ height: 80px;
192
+ border-top: 4px solid oklch(0.68 0.15 145);
193
+ border-right: 4px solid rgba(123, 193, 135, 0.5);
194
+ border-bottom: 4px solid transparent;
195
+ border-left: 4px solid transparent;
196
+ animation: breathe-fast 2s ease-in-out infinite;
197
+ top: 40px;
198
+ left: 40px;
199
+ }
200
+
201
+ .logo {
202
+ width: 72px;
203
+ height: 72px;
43
204
  border-radius: 50%;
44
205
  object-fit: cover;
45
- object-position: center;
46
- z-index: 2;
206
+ z-index: 10;
207
+ border: 2px solid rgba(136, 201, 153, 0.3);
208
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
47
209
  }
48
- .spinner {
210
+
211
+ .progress-dots {
49
212
  position: absolute;
50
- width: 185px;
51
- height: 185px;
52
- top: 50%;
213
+ bottom: -40px;
53
214
  left: 50%;
54
- transform: translate(-50%, -50%);
215
+ transform: translateX(-50%);
216
+ display: flex;
217
+ gap: 8px;
218
+ }
219
+
220
+ .dot {
221
+ width: 8px;
222
+ height: 8px;
55
223
  border-radius: 50%;
56
- border: 2px solid rgba(255, 255, 255, 0.1);
57
- border-top: 2px solid #ffffff;
58
- animation: spin 1s linear infinite;
224
+ background: oklch(0.28 0 0);
225
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
226
+
227
+ &.active {
228
+ background: oklch(0.72 0.15 145);
229
+ transform: scale(1.2);
230
+ }
231
+ }
232
+
233
+ .message-container {
234
+ text-align: center;
235
+ max-width: 400px;
236
+ }
237
+
238
+ .message-text {
239
+ color: oklch(0.90 0 0);
240
+ font-size: 1.5rem;
241
+ font-weight: 500;
242
+ margin-bottom: 1rem;
243
+ letter-spacing: 0.025em;
244
+ }
245
+
246
+ .status-bar {
247
+ width: 300px;
248
+ height: 8px;
249
+ background: oklch(0.22 0 0);
250
+ border-radius: 4px;
251
+ overflow: hidden;
252
+ position: relative;
253
+ }
254
+
255
+ .status-fill {
256
+ height: 100%;
257
+ background: linear-gradient(90deg, oklch(0.72 0.15 145) 0%, oklch(0.78 0.12 145) 50%, oklch(0.72 0.15 145) 100%);
258
+ border-radius: 4px;
259
+ width: 30%;
260
+ animation: infinite-slide 2s ease-in-out infinite;
261
+ position: relative;
262
+ overflow: hidden;
59
263
  }
60
- .glow {
264
+
265
+ .status-fill::after {
266
+ content: '';
61
267
  position: absolute;
62
- width: 220px;
63
- height: 220px;
64
- top: 50%;
65
- left: 50%;
66
- transform: translate(-50%, -50%);
67
- border-radius: 50%;
68
- background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0) 70%);
69
- animation: pulse 2s ease-in-out infinite;
268
+ top: 0;
269
+ left: -100%;
270
+ width: 100%;
271
+ height: 100%;
272
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
273
+ animation: shimmer 2s ease-in-out infinite;
274
+ }
275
+
276
+ // Smooth beautiful animations
277
+ @keyframes breathe-slow {
278
+ 0% { transform: rotate(0deg) scale(1); opacity: 0.8; }
279
+ 50% { transform: rotate(180deg) scale(1.05); opacity: 1; }
280
+ 100% { transform: rotate(360deg) scale(1); opacity: 0.8; }
281
+ }
282
+
283
+ @keyframes breathe-medium {
284
+ 0% { transform: rotate(0deg) scale(1); opacity: 0.9; }
285
+ 50% { transform: rotate(-180deg) scale(0.95); opacity: 1; }
286
+ 100% { transform: rotate(-360deg) scale(1); opacity: 0.9; }
287
+ }
288
+
289
+ @keyframes breathe-fast {
290
+ 0% { transform: rotate(0deg) scale(1); opacity: 1; }
291
+ 50% { transform: rotate(180deg) scale(1.08); opacity: 0.7; }
292
+ 100% { transform: rotate(360deg) scale(1); opacity: 1; }
293
+ }
294
+
295
+ @keyframes infinite-slide {
296
+ 0% { transform: translateX(-100%); }
297
+ 50% { transform: translateX(250%); }
298
+ 100% { transform: translateX(-100%); }
299
+ }
300
+
301
+ @keyframes shimmer {
302
+ 0% { transform: translateX(-100%); }
303
+ 50% { transform: translateX(100%); }
304
+ 100% { transform: translateX(300%); }
305
+ }
306
+
307
+ // Staged beautiful transitions
308
+ .background-fill-enter-active {
309
+ transition: all 0.15s ease-out;
70
310
  }
71
- @keyframes spin {
72
- 0% {
73
- transform: translate(-50%, -50%) rotate(0deg);
311
+
312
+ .background-fill-leave-active {
313
+ transition: all 0.3s ease-in;
314
+ }
315
+
316
+ .background-fill-enter-from {
317
+ opacity: 0;
318
+ transform: scale(0.8);
319
+ }
320
+
321
+ .background-fill-leave-to {
322
+ opacity: 0;
323
+ transform: scale(1.2);
324
+ }
325
+
326
+ .reconnect-content-enter-active {
327
+ transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
328
+ transition-delay: 0.1s;
329
+ }
330
+
331
+ .reconnect-content-leave-active {
332
+ transition: all 0.5s cubic-bezier(0.55, 0.085, 0.68, 0.53);
333
+ }
334
+
335
+ .reconnect-content-enter-from {
336
+ opacity: 0;
337
+ transform: scale(0.9) translateY(20px);
338
+ filter: blur(4px);
339
+ }
340
+
341
+ .reconnect-content-leave-to {
342
+ opacity: 0;
343
+ transform: scale(1.1) translateY(-10px);
344
+ filter: blur(2px);
345
+ }
346
+
347
+ // Responsive design
348
+ @media (max-width: 768px) {
349
+ .ring-system {
350
+ width: 120px;
351
+ height: 120px;
74
352
  }
75
- 100% {
76
- transform: translate(-50%, -50%) rotate(360deg);
353
+
354
+ .ring-outer {
355
+ width: 120px;
356
+ height: 120px;
77
357
  }
78
- }
79
- @keyframes pulse {
80
- 0%,
81
- 100% {
82
- transform: translate(-50%, -50%) scale(1);
83
- opacity: 0.5;
358
+
359
+ .ring-middle {
360
+ width: 90px;
361
+ height: 90px;
362
+ top: 15px;
363
+ left: 15px;
364
+ }
365
+
366
+ .ring-inner {
367
+ width: 60px;
368
+ height: 60px;
369
+ top: 30px;
370
+ left: 30px;
371
+ }
372
+
373
+ .logo {
374
+ width: 54px;
375
+ height: 54px;
376
+ }
377
+
378
+ .message-text {
379
+ font-size: 1.25rem;
84
380
  }
85
- 50% {
86
- transform: translate(-50%, -50%) scale(1.05);
87
- opacity: 0.7;
381
+
382
+ .status-bar {
383
+ width: 250px;
88
384
  }
89
385
  }
90
386
  </style>
@@ -1,47 +1,17 @@
1
1
  <template>
2
2
  <div class="darkBG h-screen w-screen z-[1000] fixed flex items-center flex-col justify-center gap-y-3">
3
3
  <img src="@/assets/img/logo_trans.png" class="w-[300px] mx-auto" />
4
- <svg class="spinner" viewBox="0 0 50 50">
5
- <circle class="path" cx="25" cy="25" r="20" fill="none" stroke-width="5"></circle>
6
- </svg>
4
+ <SpinnerIcon />
7
5
  </div>
8
6
  </template>
7
+
8
+ <script setup>
9
+ import { SpinnerIcon } from "@/components/icons";
10
+ </script>
9
11
  <style lang="scss" scoped>
10
12
  .darkBG {
11
13
  background-color: rgba(28, 28, 49, 100%);
12
14
  }
13
- .spinner {
14
- @apply mx-auto;
15
- animation: rotate 2s linear infinite;
16
- z-index: 2;
17
-
18
- width: 30px;
19
- height: 30px;
20
- & .path {
21
- stroke: rgba(70, 198, 210, 100%);
22
- stroke-linecap: round;
23
- animation: dash 1.5s ease-in-out infinite;
24
- }
25
- }
26
- @keyframes rotate {
27
- 100% {
28
- transform: rotate(360deg);
29
- }
30
- }
31
- @keyframes dash {
32
- 0% {
33
- stroke-dasharray: 1, 150;
34
- stroke-dashoffset: 0;
35
- }
36
- 50% {
37
- stroke-dasharray: 90, 150;
38
- stroke-dashoffset: -35;
39
- }
40
- 100% {
41
- stroke-dasharray: 90, 150;
42
- stroke-dashoffset: -124;
43
- }
44
- }
45
15
  </style>
46
16
 
47
17
  <style>