@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
@@ -0,0 +1,100 @@
1
+ /* ==========================================================================
2
+ TOAST NOTIFICATIONS (Toastify overrides)
3
+ ========================================================================== */
4
+
5
+ .Toastify__toast-theme--colored.Toastify__toast--default,
6
+ .Toastify__toast-theme--light {
7
+ @apply bg-dark-550 text-white;
8
+ }
9
+
10
+ .Toastify__toast-icon {
11
+ background: white;
12
+ border-radius: 100%;
13
+ }
14
+
15
+ .Toastify__close-button.Toastify__close-button--light {
16
+ margin-top: 1px;
17
+ padding-left: 0.1rem;
18
+ @apply border-2 border-white flex border-solid w-6 h-6 items-center justify-center rounded-full;
19
+ }
20
+
21
+ .Toastify__close-button.Toastify__close-button--light svg {
22
+ color: white;
23
+ }
24
+
25
+ .Toastify__close-button.Toastify__close-button--light svg path {
26
+ fill: currentColor !important;
27
+ }
28
+
29
+ .Toastify__toast-container {
30
+ pointer-events: none;
31
+ --toastify-toast-bd-radius: 6px;
32
+ }
33
+
34
+ .Toastify__toast {
35
+ min-height: 50px !important;
36
+ height: 50px !important;
37
+ pointer-events: auto !important;
38
+ margin-bottom: 6px !important;
39
+
40
+ transition: transform 0.18s cubic-bezier(0.25, 0.1, 0.25, 1), opacity 0.12s cubic-bezier(0.25, 0.1, 0.25, 1) !important;
41
+ transform: translate3d(0, 0, 0);
42
+
43
+ &.Toastify__slide-enter-active {
44
+ animation: slideInRight 0.22s cubic-bezier(0.25, 0.1, 0.25, 1);
45
+ }
46
+
47
+ &.Toastify__slide-exit-active {
48
+ animation: slideOutRight 0.12s cubic-bezier(0.4, 0, 1, 1);
49
+ }
50
+
51
+ &-body > div:last-child {
52
+ font-family: "Inter", sans-serif;
53
+ @apply font-medium;
54
+ }
55
+
56
+ &--error {
57
+ .Toastify__progress-bar {
58
+ @apply bg-red-400;
59
+ }
60
+ }
61
+ }
62
+
63
+ @keyframes slideInRight {
64
+ 0% {
65
+ transform: translateX(110%);
66
+ opacity: 0;
67
+ }
68
+ 100% {
69
+ transform: translateX(0);
70
+ opacity: 1;
71
+ }
72
+ }
73
+
74
+ @keyframes slideOutRight {
75
+ 0% {
76
+ transform: translateX(0);
77
+ opacity: 1;
78
+ }
79
+ 100% {
80
+ transform: translateX(110%);
81
+ opacity: 0;
82
+ }
83
+ }
84
+
85
+ .Toastify__toast--error svg {
86
+ color: oklch(0.68 0.18 25);
87
+ }
88
+
89
+ .Toastify__toast--error svg path {
90
+ fill: currentColor !important;
91
+ }
92
+
93
+ .Toastify__toast--success .Toastify__progress-bar {
94
+ @apply bg-green-400;
95
+ }
96
+
97
+ .Toastify__progress-bar {
98
+ height: 2px;
99
+ transition: width 0.08s cubic-bezier(0.25, 0.1, 0.25, 1);
100
+ }
@@ -1,185 +1,264 @@
1
- @use "input";
1
+ /* ==========================================================================
2
+ NECRO DASHBOARD - MAIN STYLES
3
+ Modular SCSS architecture with @use imports
4
+ ========================================================================== */
5
+
6
+ /* Module imports */
7
+ @use "base/reset";
8
+ @use "base/scroll";
9
+ @use "base/typography";
10
+ @use "components/buttons";
11
+ @use "components/forms";
12
+ @use "components/toasts";
13
+ @use "components/modals";
14
+ @use "components/tables";
15
+
16
+ /* ==========================================================================
17
+ BODY LAYOUT & BACKGROUND
18
+ ========================================================================== */
2
19
 
3
- html {
4
- // margin-top: 50px;
5
- overscroll-behavior: contain;
20
+ body {
21
+ background-color: oklch(0.1822 0 0);
22
+ position: relative;
23
+
24
+ &::before {
25
+ content: "";
26
+ position: fixed;
27
+ top: 0;
28
+ left: 0;
29
+ right: 0;
30
+ bottom: 0;
31
+ background-image: url("@/assets/img/background.svg");
32
+ background-position: center center;
33
+ background-size: cover;
34
+ background-repeat: no-repeat;
35
+ -webkit-background-size: cover;
36
+ z-index: -1;
37
+ pointer-events: none;
38
+ will-change: transform;
39
+ -webkit-transform: translateZ(0);
40
+ transform: translateZ(0);
41
+ }
6
42
  }
7
43
 
8
- * {
9
- @apply hidden-scrollbars
44
+ img {
45
+ pointer-events: none;
10
46
  }
11
47
 
12
- body {
13
- font-family: "Inter", sans-serif;
14
- background: url("@/assets/img/background.svg") center center;
15
- background-size: cover;
16
- background-attachment: fixed;
17
- padding-top: 10px;
18
- overscroll-behavior-y: contain;
19
- // overscroll-behavior: none;
48
+ /* Global icon color consistency */
49
+ svg {
50
+ color: oklch(0.90 0 0) !important;
51
+ }
20
52
 
21
- -webkit-font-smoothing: antialiased;
22
- -moz-osx-font-smoothing: grayscale;
23
- @apply bg-cover bg-dark-300;
24
- touch-action: pan-x pan-y;
53
+ /* For stroke icons (Eye, etc) - stroke on svg element */
54
+ svg[stroke] path,
55
+ svg[stroke] circle,
56
+ svg[stroke] line {
57
+ stroke: oklch(0.90 0 0) !important;
25
58
  }
26
59
 
27
- .ios-wrapper {
28
- // width: 100%;
29
- // padding-left: calc(env(safe-area-inset-left));
60
+ /* For filled icons with explicit fill */
61
+ svg path[fill]:not([fill="none"]),
62
+ svg circle[fill]:not([fill="none"]),
63
+ svg rect[fill]:not([fill="none"]),
64
+ svg polygon[fill]:not([fill="none"]) {
65
+ fill: oklch(0.90 0 0) !important;
30
66
  }
31
67
 
32
- // Used for table heights
33
- .max-h-big {
34
- max-height: 36rem;
68
+ /* For filled icons without explicit fill attribute */
69
+ svg:not([stroke]):not([fill="none"]) path:not([fill]),
70
+ svg:not([stroke]):not([fill="none"]) circle:not([fill]),
71
+ svg:not([stroke]):not([fill="none"]) rect:not([fill]),
72
+ svg:not([stroke]):not([fill="none"]) polygon:not([fill]) {
73
+ fill: oklch(0.90 0 0) !important;
35
74
  }
36
75
 
37
- @media only screen and (min-device-width: 768px) and (max-device-width: 1366px) and (orientation: landscape) and (-webkit-min-device-pixel-ratio: 2) {
38
- .max-h-big {
39
- max-height: 44rem;
40
- }
76
+ /* ==========================================================================
77
+ COMPONENT UTILITIES
78
+ ========================================================================== */
79
+
80
+ .smooth-hover {
81
+ @apply transition-all duration-200;
41
82
  }
42
83
 
43
- @media only screen and (min-device-width: 768px) and (max-device-width: 1366px) and (orientation: portrait) and (-webkit-min-device-pixel-ratio: 2) {
44
- .max-h-big {
45
- max-height: 68rem;
46
- }
84
+ .status-indicator {
85
+ @apply w-2 h-2 rounded-full flex-shrink-0;
86
+ min-width: 4px;
87
+ min-height: 4px;
47
88
  }
48
89
 
49
- @media screen and (max-device-height: 500px) {
50
- .max-h-big {
51
- max-height: 11.7rem;
90
+ .mobile-icons {
91
+ @apply flex lg:hidden ml-auto items-center gap-x-2;
92
+
93
+ button {
94
+ @apply w-8 h-8 flex items-center justify-center rounded transition-all duration-150;
95
+ background-color: oklch(0.2046 0 0);
96
+ border: 2px solid oklch(0.2809 0 0);
97
+ color: oklch(0.82 0 0);
98
+
99
+ &:hover, &:active {
100
+ border-color: oklch(0.72 0.15 145);
101
+ outline: 1px solid oklch(0.72 0.15 145);
102
+ outline-offset: 0;
103
+ color: oklch(0.90 0 0);
104
+ }
52
105
  }
53
106
  }
54
107
 
55
- .top-3\,5 {
56
- top: 1.1rem;
108
+ .loading-spinner {
109
+ @apply animate-spin w-4 h-4 border-2 border-white border-t-transparent rounded-full;
57
110
  }
58
111
 
112
+ /* ==========================================================================
113
+ LABEL & ICON STYLING
114
+ ========================================================================== */
59
115
 
60
- .fade-enter-active,
61
- .fade-leave-active {
62
- will-change: transform, opacity, filter;
116
+ .label-override {
117
+ @apply flex items-center text-xs mb-2;
118
+ color: oklch(0.65 0 0);
63
119
 
64
- transition: opacity 0.15s ease;
120
+ svg {
121
+ @apply ml-2;
122
+ color: oklch(0.65 0 0) !important;
123
+ width: 16px;
124
+ height: 16px;
125
+ fill: oklch(0.65 0 0) !important;
126
+ }
65
127
  }
66
128
 
67
- .fade-enter-from,
68
- .fade-leave-to {
69
- will-change: transform, opacity, filter;
129
+ .task-switches {
130
+ h4 {
131
+ color: oklch(0.90 0 0);
132
+ font-size: 0.8125rem;
133
+ font-weight: 500;
134
+ @apply text-center flex items-center gap-x-2 mx-auto mb-2;
135
+ }
70
136
 
71
- opacity: 0;
72
- }
137
+ .switch-wrapper {
138
+ @apply gap-y-2;
139
+ }
73
140
 
74
- /* Disable zoom */
75
- :root {
76
- touch-action: pan-x pan-y;
77
- height: 100%;
141
+ svg {
142
+ width: 15px !important;
143
+ height: 15px !important;
144
+ color: oklch(0.90 0 0) !important;
145
+ margin-left: 0.25rem !important;
146
+ }
78
147
  }
79
148
 
80
- .hidden-scrollbars::-webkit-scrollbar
149
+ /* ==========================================================================
150
+ SCROLLBAR UTILITIES
151
+ ========================================================================== */
81
152
 
82
- /* Hide scrollbar for Chrome, Safari and Opera */ {
83
- display: none;
84
- }
85
-
86
- /* Hide scrollbar for IE, Edge and Firefox */
87
153
  .hidden-scrollbars {
88
- -ms-overflow-style: none;
89
- /* IE and Edge */
90
154
  scrollbar-width: none;
91
- /* Firefox */
92
- }
93
-
94
- /* Make text not selectable (request from xsonoro) */
155
+ -ms-overflow-style: none;
95
156
 
96
- * {
97
- -webkit-user-select: none;
98
- /* Safari */
99
- -moz-user-select: none;
100
- /* Firefox */
101
- -ms-user-select: none;
102
- /* IE10+/Edge */
103
- user-select: none;
104
- /* Standard */
157
+ &::-webkit-scrollbar {
158
+ display: none;
159
+ }
105
160
  }
106
161
 
107
- img {
108
- pointer-events: none;
109
- }
162
+ /* ==========================================================================
163
+ DYNAMIC HEIGHTS & RESPONSIVE DESIGN
164
+ ========================================================================== */
110
165
 
111
- /** Toast Design **/
112
- .Toastify__toast-theme--colored.Toastify__toast--default,
113
- .Toastify__toast-theme--light {
114
- @apply bg-dark-400 text-white;
166
+ .max-h-big {
167
+ max-height: calc(100vh - 12rem);
168
+ min-height: 8rem;
169
+ overflow: hidden;
115
170
  }
116
171
 
117
- .Toastify__toast-icon {
118
- svg {
119
- path {
120
- // fill: white !important;
121
- }
172
+ @screen xl {
173
+ .max-h-big {
174
+ max-height: calc(100vh - 11rem);
122
175
  }
123
176
  }
124
177
 
125
- .Toastify__toast-icon {
126
- background: white;
127
- border-radius: 100%;
178
+ @screen h-sm {
179
+ .max-h-big {
180
+ max-height: calc(100vh - 12rem);
181
+ min-height: 8rem;
182
+ }
128
183
  }
129
184
 
130
- button.Toastify__close-button.Toastify__close-button--light {
131
- margin-top: 1px;
132
- padding-left: 0.1rem;
133
- @apply border-2 border-white flex border-solid w-6 h-6 items-center justify-center rounded-full;
185
+ /* ==========================================================================
186
+ TRANSITIONS & ANIMATIONS
187
+ ========================================================================== */
134
188
 
135
- svg {
136
- path {
137
- fill: white !important;
138
- }
139
- }
189
+ .fade-enter-active,
190
+ .fade-leave-active {
191
+ transition: opacity 0.15s ease;
140
192
  }
141
193
 
142
- .Toastify__toast {
143
- min-height: 50px !important;
144
- height: 50px !important;
194
+ .fade-enter-from,
195
+ .fade-leave-to {
196
+ opacity: 0;
145
197
  }
146
198
 
147
- .Toastify__toast-body > div:last-child {
148
- font-family: "Inter", sans-serif;
149
- @apply font-medium;
199
+ .will-change-auto {
200
+ will-change: auto;
150
201
  }
151
202
 
152
- .Toastify__progress-bar {
153
- height: 2px;
203
+ /* ==========================================================================
204
+ iOS OPTIMIZATIONS
205
+ ========================================================================== */
206
+
207
+ @supports (-webkit-appearance: none) {
208
+ .component-container,
209
+ h1,
210
+ h2,
211
+ h3,
212
+ h4,
213
+ h5,
214
+ h6 {
215
+ transform: translate3d(0, 0, 0);
216
+ }
154
217
  }
155
218
 
156
- .Toastify__toast--error {
157
- svg {
158
- path {
159
- fill: #ee8282 !important;
160
- }
161
- }
219
+ /* ==========================================================================
220
+ MOBILE RESPONSIVE OPTIMIZATIONS
221
+ ========================================================================== */
162
222
 
163
- .Toastify__progress-bar {
164
- @apply bg-red-400;
223
+ @screen md {
224
+ .btn-primary,
225
+ .btn-secondary {
226
+ @apply text-sm px-3 py-1.5;
165
227
  }
166
- }
167
228
 
168
- .Toastify__toast--success {
169
- .Toastify__progress-bar {
170
- @apply bg-green-400;
229
+ .btn-action {
230
+ @apply text-sm px-6 h-12;
231
+ min-height: 48px;
171
232
  }
172
- }
173
233
 
174
- :root {
175
- --toastify-toast-width: 520px;
234
+ .status-indicator {
235
+ width: 6px;
236
+ height: 6px;
237
+ min-width: 6px;
238
+ min-height: 6px;
239
+ }
176
240
  }
177
241
 
242
+ @screen mobile-portrait {
243
+ .btn-action {
244
+ @apply text-base px-8 h-14;
245
+ min-height: 56px;
246
+ font-weight: 600;
247
+ border-radius: 8px;
248
+ }
178
249
 
179
- .mobile-icons {
180
- @apply flex lg:hidden ml-auto items-center gap-x-2;
250
+ .status-indicator {
251
+ width: 5px;
252
+ height: 5px;
253
+ min-width: 5px;
254
+ min-height: 5px;
255
+ }
256
+ }
181
257
 
182
- button {
183
- @apply text-white text-2xl rounded bg-dark-500 border-2 border-dark-550 shadow-lg w-9 h-9 flex items-center justify-center;
258
+ @screen mobile-landscape {
259
+ .btn-action {
260
+ @apply text-base px-8 h-14;
261
+ min-height: 56px;
262
+ font-weight: 600;
184
263
  }
185
264
  }