@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
@@ -1,8 +1,7 @@
1
1
  <template>
2
2
  <div class="navbar" :class="{ 'force-z': menuOpen }">
3
- <div :class="`component-container ios-wrapper flex items-center relative ${landscapeIos ? 'ios-wrapper' : ''}`">
3
+ <div :class="['component-container ios-wrapper flex items-center relative', { 'ios-wrapper': landscapeIos }]">
4
4
  <!-- Brand -->
5
- <!-- <h3 class="font-bold text-white mr-4 z-30">Necro Lab</h3> -->
6
5
  <img src="@/assets/img/logo_trans.png" class="h-6 lg:h-8 mr-4 z-30 object-cover" alt="Logo: Necro" />
7
6
  <!-- Navlinks -->
8
7
  <ul class="hidden lg:flex">
@@ -16,18 +15,16 @@
16
15
  <router-link to="/console"><ConsoleIcon /><span class="hidden xl:block">Console</span></router-link>
17
16
  </li>
18
17
  <li>
19
- <router-link to="/profiles"
20
- ><img src="/img/groups.svg" class="xl:mr-2" /><span class="hidden xl:block"
21
- >Profiles</span
22
- ></router-link
23
- >
18
+ <router-link to="/profiles">
19
+ <GroupIcon class="xl:mr-2" />
20
+ <span class="hidden xl:block">Profiles</span>
21
+ </router-link>
24
22
  </li>
25
23
  <li>
26
- <router-link to="/accounts"
27
- ><img src="/img/mail.svg" class="xl:mr-2" /><span class="hidden xl:block"
28
- >Accounts</span
29
- ></router-link
30
- >
24
+ <router-link to="/accounts">
25
+ <MailIcon class="xl:mr-2" />
26
+ <span class="hidden xl:block">Accounts</span>
27
+ </router-link>
31
28
  </li>
32
29
  <li>
33
30
  <router-link to="/filter"><FilterIcon /><span class="hidden xl:block">Filter</span></router-link>
@@ -45,7 +42,6 @@
45
42
  <h4 v-else class="hidden lg:block text-white text-sm font-medium">
46
43
  <span class="text-lightgray">Loading </span>
47
44
  </h4>
48
- <!-- <div class="hidden lg:block w-10 h-10 rounded-full bg-dark-400"></div> -->
49
45
  <img
50
46
  v-if="ui.profile?.profilePicture"
51
47
  :src="ui.profile?.profilePicture"
@@ -76,10 +72,16 @@
76
72
  <router-link to="/console"><ConsoleIcon />Console</router-link>
77
73
  </li>
78
74
  <li @click="toggleMenu">
79
- <router-link to="/profiles"><img src="/img/groups.svg" class="mr-2" />Profiles</router-link>
75
+ <router-link to="/profiles">
76
+ <GroupIcon class="mr-2" />
77
+ Profiles
78
+ </router-link>
80
79
  </li>
81
80
  <li @click="toggleMenu">
82
- <router-link to="/accounts"><img src="/img/mail.svg" class="mr-2" />Accounts</router-link>
81
+ <router-link to="/accounts">
82
+ <MailIcon class="mr-2" />
83
+ Accounts
84
+ </router-link>
83
85
  </li>
84
86
  <li @click="toggleMenu">
85
87
  <router-link to="/filter"><FilterIcon />Filter</router-link>
@@ -95,17 +97,18 @@
95
97
  <span class="text-lightgray">Logged in as </span>
96
98
  <span class="font-black"> {{ ui.profile?.name }}</span>
97
99
  </h4>
98
- <!-- <div class="w-10 h-10 rounded-full bg-light-300"></div> -->
99
100
  <img :src="ui.profile?.profilePicture" alt="" class="h-10 w-10 rounded-full" />
100
101
  </div>
101
102
 
102
- <div class="mx-auto mt-6 mb-14 flex gap-3">
103
- <span class="bg-dark-500 rounded-full text-sm shadow-lg p-2 px-3 text-light-400"
104
- >Dashboard: v{{ dashVersion }}</span
105
- >
106
- <span class="bg-dark-500 rounded-full text-sm shadow-lg p-2 px-3 text-light-400"
107
- >Bot: v{{ ui.botVersion }}</span
108
- >
103
+ <div class="mx-auto mt-6 mb-14 flex gap-3 items-center">
104
+ <div class="version-badge">
105
+ <span class="version-label">Dashboard</span>
106
+ <span class="version-number">v{{ dashVersion }}</span>
107
+ </div>
108
+ <div class="version-badge">
109
+ <span class="version-label">Bot</span>
110
+ <span class="version-number">v{{ ui.botVersion }}</span>
111
+ </div>
109
112
  </div>
110
113
  </div>
111
114
  </transition>
@@ -115,48 +118,180 @@
115
118
  .navbar {
116
119
  @apply border-b py-5 fixed w-full;
117
120
  top: 0;
118
- z-index: 1;
121
+ left: 0;
122
+ z-index: 1000;
123
+ background: oklch(0.1822 0 0 / 0.95);
119
124
  backdrop-filter: blur(23px);
120
- border-color: #323340;
125
+ -webkit-backdrop-filter: blur(23px);
126
+ border-color: oklch(0.26 0 0);
127
+
128
+ // Consistent padding base
129
+ padding-top: 1.25rem;
130
+ padding-bottom: 1.25rem;
131
+
132
+ // Only add safe area top padding for portrait notch devices
133
+ @supports (padding-top: env(safe-area-inset-top)) {
134
+ @media (max-device-width: 430px) and (orientation: portrait) {
135
+ padding-top: max(1.25rem, env(safe-area-inset-top));
136
+ }
137
+ }
138
+
139
+ // Extend background above viewport for notch area with theme gradient
140
+ &::before {
141
+ content: "";
142
+ position: absolute;
143
+ top: -100px;
144
+ left: 0;
145
+ right: 0;
146
+ height: 100px;
147
+ background: oklch(0.1822 0 0);
148
+ backdrop-filter: blur(8px);
149
+ -webkit-backdrop-filter: blur(8px);
150
+ z-index: -1;
151
+ }
152
+
121
153
  ul {
122
154
  @apply gap-x-4;
123
- li {
124
- a {
125
- @apply flex text-white text-sm border-none h-10 items-center px-4 rounded-lg;
155
+
156
+ // Global SVG normalization - force all icons to be identical
157
+ svg {
158
+ width: 20px !important;
159
+ height: 20px !important;
160
+ display: block !important;
161
+ flex-shrink: 0 !important;
162
+ box-sizing: border-box !important;
163
+ }
164
+
165
+ li a {
166
+ @apply flex text-white text-sm items-center rounded-lg;
167
+ height: 40px;
168
+ border: 1px solid transparent;
169
+ border-left: 3px solid transparent;
170
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
171
+ position: relative;
172
+
173
+ svg {
174
+ @apply mr-2;
175
+ }
176
+
177
+ &.router-link-exact-active {
178
+ border-bottom: 2px solid oklch(0.72 0.15 145);
179
+ color: oklch(0.72 0.15 145);
180
+ background: oklch(0.72 0.15 145 / 0.08);
181
+ margin-bottom: -2px;
182
+
183
+ // Mobile styling
184
+ @media (max-width: 1023px) {
185
+ border: 2px solid oklch(0.72 0.15 145);
186
+ color: oklch(0.72 0.15 145);
187
+ background: oklch(0.72 0.15 145 / 0.08);
188
+ padding: 0.5rem 0.75rem;
189
+ border-radius: 0.5rem;
190
+ margin-bottom: 0;
191
+ }
192
+ }
193
+ }
194
+
195
+ // Desktop mode (lg to xl): icon-only view with perfect centering
196
+ @media (min-width: 1024px) and (max-width: 1279px) {
197
+ li a {
198
+ width: 40px;
199
+ height: 40px;
200
+ padding: 0 !important;
201
+ display: flex !important;
202
+ align-items: center !important;
203
+ justify-content: center !important;
204
+ position: relative;
205
+
206
+ // Hide text completely in icon-only mode
207
+ span {
208
+ display: none !important;
209
+ }
210
+
126
211
  svg {
127
- @apply mr-2;
212
+ margin: 0 !important;
213
+ padding: 0 !important;
214
+ position: absolute;
215
+ top: 50%;
216
+ left: 50%;
217
+ transform: translate(-50%, -50%);
128
218
  }
219
+
129
220
  &.router-link-exact-active {
130
- @apply border-solid border border-light-300;
221
+ border: 2px solid oklch(0.72 0.15 145) !important;
222
+ color: oklch(0.72 0.15 145) !important;
223
+ background: oklch(0.72 0.15 145 / 0.08) !important;
224
+ border-radius: 0.5rem !important;
225
+ width: 40px !important;
226
+ height: 40px !important;
227
+ }
228
+ }
229
+ }
230
+
231
+ // XL and above: full width with text
232
+ @media (min-width: 1280px) {
233
+ li a {
234
+ @apply px-4;
235
+ height: 40px;
236
+
237
+ svg {
238
+ @apply mr-2;
131
239
  }
132
240
  }
133
241
  }
134
242
  }
135
243
  }
244
+
136
245
  .force-z {
137
246
  z-index: 20000;
138
247
  }
248
+
139
249
  .mobile-menu {
140
- margin-top: -81px; // Tuck under Nav
141
- height: calc(100vh + 40px);
250
+ margin-top: 0;
251
+ height: 100vh;
252
+ height: 100dvh; // Dynamic viewport height for mobile
142
253
  will-change: transform, opacity, filter;
254
+ @apply bg-dark-400 fixed inset-0 pt-20 pb-8 w-full z-10;
143
255
 
144
- @apply bg-dark-400 absolute pt-16 pb-8 w-full z-10;
145
- ul {
146
- li {
147
- @apply mb-4 mx-auto;
148
- a {
149
- font-size: 20px !important;
150
- }
256
+ ul li {
257
+ @apply mb-4 mx-auto;
258
+
259
+ a {
260
+ font-size: 20px !important;
151
261
  }
152
262
  }
153
263
  }
264
+
265
+ .version-badge {
266
+ @apply flex items-center gap-x-2 px-3 py-2 rounded-lg border;
267
+ background: oklch(0.2046 0 0);
268
+ border-color: oklch(0.2809 0 0);
269
+
270
+ .version-label {
271
+ @apply text-xs font-medium;
272
+ color: oklch(0.65 0 0);
273
+ }
274
+
275
+ .version-number {
276
+ @apply text-xs font-bold;
277
+ color: oklch(0.72 0.15 145);
278
+ }
279
+ }
154
280
  </style>
155
281
 
156
282
  <script setup>
157
283
  import { storeToRefs } from "pinia";
158
284
  import { ref } from "vue";
159
- import { EditIcon, ConsoleIcon, TasksIcon, LogoutIcon, MenuIcon, FilterIcon } from "@/components/icons";
285
+ import {
286
+ EditIcon,
287
+ ConsoleIcon,
288
+ TasksIcon,
289
+ LogoutIcon,
290
+ MenuIcon,
291
+ FilterIcon,
292
+ GroupIcon,
293
+ MailIcon
294
+ } from "@/components/icons";
160
295
  import { useUIStore } from "@/stores/ui";
161
296
  import router from "@/router/index";
162
297
  import CountryChooser from "@/components/ui/controls/CountryChooser.vue";