@necrolab/dashboard 0.4.33 → 0.4.35

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 (48) hide show
  1. package/.claude/settings.local.json +7 -1
  2. package/index.html +5 -3
  3. package/package.json +1 -1
  4. package/src/App.vue +0 -8
  5. package/src/assets/css/_input.scss +7 -7
  6. package/src/assets/css/main.scss +91 -20
  7. package/src/assets/img/background.svg +2 -2
  8. package/src/assets/img/background.svg.backup +11 -0
  9. package/src/assets/img/logo_icon.png +0 -0
  10. package/src/components/Editors/Account/Account.vue +87 -12
  11. package/src/components/Editors/Account/AccountCreator.vue +5 -5
  12. package/src/components/Editors/Account/AccountView.vue +1 -0
  13. package/src/components/Editors/Account/CreateAccount.vue +10 -4
  14. package/src/components/Editors/Profile/CreateProfile.vue +133 -39
  15. package/src/components/Editors/Profile/Profile.vue +87 -12
  16. package/src/components/Editors/Profile/ProfileView.vue +1 -0
  17. package/src/components/Filter/Filter.vue +23 -23
  18. package/src/components/Filter/FilterPreview.vue +2 -2
  19. package/src/components/Filter/PriceSortToggle.vue +8 -6
  20. package/src/components/Table/Table.vue +3 -1
  21. package/src/components/Tasks/Controls/DesktopControls.vue +3 -3
  22. package/src/components/Tasks/Controls/MobileControls.vue +1 -1
  23. package/src/components/Tasks/CreateTaskTM.vue +4 -6
  24. package/src/components/Tasks/Stats.vue +26 -6
  25. package/src/components/Tasks/Task.vue +178 -32
  26. package/src/components/Tasks/TaskView.vue +85 -18
  27. package/src/components/Tasks/Utilities.vue +4 -5
  28. package/src/components/icons/Bag.vue +1 -1
  29. package/src/components/icons/Loyalty.vue +1 -1
  30. package/src/components/icons/Stadium.vue +1 -1
  31. package/src/components/ui/Modal.vue +12 -1
  32. package/src/components/ui/Navbar.vue +1 -1
  33. package/src/components/ui/ReconnectIndicator.vue +1 -1
  34. package/src/components/ui/controls/atomic/Checkbox.vue +119 -9
  35. package/src/components/ui/controls/atomic/Dropdown.vue +8 -7
  36. package/src/components/ui/controls/atomic/MultiDropdown.vue +2 -1
  37. package/src/stores/sampleData.js +60 -94
  38. package/src/stores/ui.js +1 -1
  39. package/src/utils/debug.js +1 -1
  40. package/src/views/Accounts.vue +9 -4
  41. package/src/views/Console.vue +16 -9
  42. package/src/views/Editor.vue +7 -7
  43. package/src/views/FilterBuilder.vue +40 -22
  44. package/src/views/Profiles.vue +4 -4
  45. package/src/views/Tasks.vue +32 -53
  46. package/tailwind.config.js +62 -14
  47. package/vite.config.js +2 -1
  48. package/src/assets/img/logo_icon_2.png +0 -0
@@ -10,7 +10,9 @@
10
10
  <div class="grid grid-cols-12 gap-3 my-3">
11
11
  <!-- Profile tag -->
12
12
  <div class="input-wrapper col-span-4" style="z-index: 30 !important">
13
- <label class="label-override mb-2">Profile Tag </label>
13
+ <label class="label-override mb-2">Profile Tag
14
+ <TagIcon />
15
+ </label>
14
16
  <Dropdown
15
17
  :class="`input-default dropdown w-full ${errors.includes('profileTag') ? 'error' : ''}`"
16
18
  :default="ui.profile.accountTags[0]"
@@ -22,7 +24,9 @@
22
24
 
23
25
  <!-- Card Number -->
24
26
  <div class="input-wrapper col-span-8 z-0">
25
- <label class="label-override mb-2">Card Number </label>
27
+ <label class="label-override mb-2">Card Number
28
+ <CartIcon />
29
+ </label>
26
30
  <div :class="`input-default ${errors.includes('cardNumber') ? 'error' : ''}`">
27
31
  <input
28
32
  ref="cardNumberInput"
@@ -38,7 +42,9 @@
38
42
 
39
43
  <!-- Country chooser -->
40
44
  <div class="input-wrapper col-span-2">
41
- <label class="label-override mb-2">Country </label>
45
+ <label class="label-override mb-2">Country
46
+ <SandclockIcon />
47
+ </label>
42
48
  <ProfileCountryChooser
43
49
  class="h-8"
44
50
  :value="profile.country"
@@ -49,7 +55,9 @@
49
55
 
50
56
  <!-- Exp Year -->
51
57
  <div class="input-wrapper col-span-5">
52
- <label class="label-override mb-2 z-0">Expiry Year </label>
58
+ <label class="label-override mb-2 z-0">Expiry Year
59
+ <TimerIcon />
60
+ </label>
53
61
  <Dropdown
54
62
  :class="`input-default dropdown w-full ${errors.includes('expYear') ? 'error' : ''}`"
55
63
  default="Expiry Year"
@@ -66,8 +74,10 @@
66
74
  </div>
67
75
 
68
76
  <!-- Exp Month -->
69
- <div class="input-wrapper col-span-5">
70
- <label class="label-override mb-2">Expiry Month </label>
77
+ <div class="input-wrapper col-span-5 z-2">
78
+ <label class="label-override mb-2">Expiry Month
79
+ <TimerIcon />
80
+ </label>
71
81
  <Dropdown
72
82
  :class="`input-default dropdown w-full ${errors.includes('expMonth') ? 'error' : ''}`"
73
83
  default="Expiry Month"
@@ -79,7 +89,9 @@
79
89
 
80
90
  <!-- CVV -->
81
91
  <div class="input-wrapper col-span-6 md:col-span-4 z-0">
82
- <label class="label-override mb-2">CVV </label>
92
+ <label class="label-override mb-2">CVV
93
+ <ShieldIcon />
94
+ </label>
83
95
  <div :class="`input-default ${errors.includes('cvv') ? 'error' : ''}`">
84
96
  <input
85
97
  placeholder="183"
@@ -94,20 +106,24 @@
94
106
 
95
107
  <!-- City -->
96
108
  <div class="input-wrapper col-span-6 md:col-span-4 z-0">
97
- <label class="label-override mb-2">City </label>
109
+ <label class="label-override mb-2">City
110
+ <StadiumIcon />
111
+ </label>
98
112
  <div :class="`input-default ${errors.includes('city') ? 'error' : ''}`">
99
113
  <input placeholder="Denver" v-model="profile.city" />
100
114
  </div>
101
115
  </div>
102
116
 
103
117
  <!-- State -->
104
- <div class="input-wrapper col-span-6 md:col-span-4 z-50">
105
- <label class="label-override mb-2">State </label>
118
+ <div class="input-wrapper col-span-6 md:col-span-4 z-1">
119
+ <label class="label-override mb-2">State
120
+ <SandclockIcon />
121
+ </label>
106
122
  <div v-if="profile.country === 'US'" :class="`${errors.includes('state') ? 'error' : ''}`">
107
123
  <Dropdown
108
124
  class="input-default w-full"
109
125
  default="Select State"
110
- :onClick="(state) => profile.state = state"
126
+ :onClick="(state) => (profile.state = state)"
111
127
  :options="usStates"
112
128
  :allowDefault="false"
113
129
  rightAmount="right-2"
@@ -121,26 +137,45 @@
121
137
 
122
138
  <!-- Zip -->
123
139
  <div class="input-wrapper col-span-6 md:col-span-4 z-0">
124
- <label class="label-override mb-2">Zip </label>
140
+ <label class="label-override mb-2">Zip
141
+ <KeyIcon />
142
+ </label>
125
143
  <div :class="`input-default ${errors.includes('zipCode') ? 'error' : ''}`">
126
- <input placeholder="80281" type="number" min="1" max="12" v-model="profile.zipCode" />
144
+ <input placeholder="10005" type="number" min="1" max="12" v-model="profile.zipCode" />
127
145
  </div>
128
146
  </div>
129
147
 
130
148
  <!-- Address -->
131
149
  <div class="input-wrapper col-span-6 md:col-span-4 z-0">
132
- <label class="label-override mb-2">Address </label>
150
+ <label class="label-override mb-2">Address
151
+ <HandIcon />
152
+ </label>
133
153
  <div :class="`input-default ${errors.includes('address') ? 'error' : ''}`">
134
- <input placeholder="Denver" v-model="profile.address" />
154
+ <input placeholder="100 5th Avenue" v-model="profile.address" />
135
155
  </div>
136
156
  </div>
137
157
 
138
158
  <!-- Generate -->
139
159
  <div class="input-wrapper col-span-6 md:col-span-4 z-0">
140
- <label class="label-override mb-2 z-0"> Fake ID</label>
160
+ <label class="label-override mb-2"> Fake ID
161
+ <WildcardIcon />
162
+ </label>
141
163
  <div class="input-default mt-2 w-full h-10 flex items-center">
142
- <button @click="generate" class="text-white w-full text-xs flex items-center justify-center gap-2">
143
- <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
164
+ <button
165
+ @click="generate"
166
+ class="text-white w-full text-xs flex items-center justify-center gap-2"
167
+ >
168
+ <svg
169
+ xmlns="http://www.w3.org/2000/svg"
170
+ width="14"
171
+ height="14"
172
+ viewBox="0 0 24 24"
173
+ fill="none"
174
+ stroke="currentColor"
175
+ stroke-width="2"
176
+ stroke-linecap="round"
177
+ stroke-linejoin="round"
178
+ >
144
179
  <rect x="3" y="4" width="18" height="16" rx="2" />
145
180
  <line x1="7" y1="2" x2="7" y2="6" />
146
181
  <line x1="17" y1="2" x2="17" y2="6" />
@@ -169,6 +204,12 @@
169
204
  .z-0 {
170
205
  z-index: 0 !important;
171
206
  }
207
+ .z-1 {
208
+ z-index: 1 !important;
209
+ }
210
+ .z-1 {
211
+ z-index: 2 !important;
212
+ }
172
213
 
173
214
  .error {
174
215
  border-width: 2px !important;
@@ -177,6 +218,7 @@
177
218
  </style>
178
219
  <script setup>
179
220
  import Modal from "@/components/ui/Modal.vue";
221
+ import { MailIcon, CartIcon, ShieldIcon, StadiumIcon, KeyIcon, HandIcon, ProfileIcon, SandclockIcon, TimerIcon, TagIcon, WildcardIcon } from "@/components/icons";
180
222
  import { EditIcon } from "@/components/icons";
181
223
  import ProfileCountryChooser from "@/components/Editors/Profile/ProfileCountryChooser.vue";
182
224
  import { useUIStore } from "@/stores/ui";
@@ -191,7 +233,55 @@ const ui = useUIStore();
191
233
 
192
234
  // US States list (excluding GA and PR, alphabetically ordered)
193
235
  const usStates = [
194
- "AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DE", "FL", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY"
236
+ "AK",
237
+ "AL",
238
+ "AR",
239
+ "AZ",
240
+ "CA",
241
+ "CO",
242
+ "CT",
243
+ "DE",
244
+ "FL",
245
+ "HI",
246
+ "IA",
247
+ "ID",
248
+ "IL",
249
+ "IN",
250
+ "KS",
251
+ "KY",
252
+ "LA",
253
+ "MA",
254
+ "MD",
255
+ "ME",
256
+ "MI",
257
+ "MN",
258
+ "MO",
259
+ "MS",
260
+ "MT",
261
+ "NC",
262
+ "ND",
263
+ "NE",
264
+ "NH",
265
+ "NJ",
266
+ "NM",
267
+ "NV",
268
+ "NY",
269
+ "OH",
270
+ "OK",
271
+ "OR",
272
+ "PA",
273
+ "RI",
274
+ "SC",
275
+ "SD",
276
+ "TN",
277
+ "TX",
278
+ "UT",
279
+ "VA",
280
+ "VT",
281
+ "WA",
282
+ "WI",
283
+ "WV",
284
+ "WY"
195
285
  ];
196
286
  const cardNumberInput = ref(null);
197
287
  const profile = ref({
@@ -232,17 +322,20 @@ const formatCardNumberDisplay = () => {
232
322
  };
233
323
 
234
324
  // Watch for changes in profile.cardNumber to sync with display
235
- watch(() => profile.value.cardNumber, (newValue) => {
236
- if (newValue) {
237
- const cleanNumber = newValue.replace(/\s+/g, "");
238
- if (cleanNumber) {
239
- const cardInfo = validateCard(cleanNumber);
240
- displayCardNumber.value = cardInfo.formatted;
325
+ watch(
326
+ () => profile.value.cardNumber,
327
+ (newValue) => {
328
+ if (newValue) {
329
+ const cleanNumber = newValue.replace(/\s+/g, "");
330
+ if (cleanNumber) {
331
+ const cardInfo = validateCard(cleanNumber);
332
+ displayCardNumber.value = cardInfo.formatted;
333
+ }
334
+ } else {
335
+ displayCardNumber.value = "";
241
336
  }
242
- } else {
243
- displayCardNumber.value = "";
244
337
  }
245
- });
338
+ );
246
339
 
247
340
  // Initialize on modal open
248
341
  onMounted(() => {
@@ -277,9 +370,10 @@ const validate = (p) => {
277
370
  if (!/^\d{3,4}$/.test(`${p.cvv}`)) errors.value.push("cvv");
278
371
  const cleanCardNumber = p.cardNumber.replace(/\s+/g, "");
279
372
  // Validate card number based on type and length
280
- const isValidCard = cleanCardNumber.match(/^4\d{15}$/) || // Visa (16 digits)
281
- cleanCardNumber.match(/^5[1-5]\d{14}$/) || // Mastercard (16 digits)
282
- cleanCardNumber.match(/^3[47]\d{13}$/); // AMEX (15 digits)
373
+ const isValidCard =
374
+ cleanCardNumber.match(/^4\d{15}$/) || // Visa (16 digits)
375
+ cleanCardNumber.match(/^5[1-5]\d{14}$/) || // Mastercard (16 digits)
376
+ cleanCardNumber.match(/^3[47]\d{13}$/); // AMEX (15 digits)
283
377
  if (!isValidCard) errors.value.push("cardNumber");
284
378
  if (!p.expYear) errors.value.push("expYear");
285
379
  if (!p.expMonth) errors.value.push("expMonth");
@@ -289,18 +383,18 @@ const validate = (p) => {
289
383
 
290
384
  const handleCreditCardUpdate = (event) => {
291
385
  const value = event.target.value.replace(/\D/g, "");
292
-
386
+
293
387
  // Determine max length based on card type
294
388
  let maxLength = 16; // Default for Visa/Mastercard
295
- if (value.startsWith('3')) {
389
+ if (value.startsWith("3")) {
296
390
  maxLength = 15; // AMEX
297
- } else if (value.startsWith('4') || value.startsWith('5')) {
391
+ } else if (value.startsWith("4") || value.startsWith("5")) {
298
392
  maxLength = 16; // Visa/Mastercard
299
393
  }
300
-
394
+
301
395
  const subs = value.substring(0, maxLength);
302
396
  const cardInfo = validateCard(subs);
303
-
397
+
304
398
  // Store clean number (without spaces) in profile
305
399
  profile.value.cardNumber = subs;
306
400
  // Display formatted number in input
@@ -309,10 +403,10 @@ const handleCreditCardUpdate = (event) => {
309
403
 
310
404
  function done() {
311
405
  // Clear state if country is not US
312
- if (profile.value.country !== 'US') {
313
- profile.value.state = '';
406
+ if (profile.value.country !== "US") {
407
+ profile.value.state = "";
314
408
  }
315
-
409
+
316
410
  ui.logger.Info("Created profile", profile.value);
317
411
  if (validate(profile.value) !== true) return;
318
412
  ui.toggleModal("");
@@ -77,35 +77,110 @@ h4 {
77
77
  @apply text-center;
78
78
  }
79
79
  .task-buttons {
80
- @apply flex mx-auto gap-x-2;
81
-
80
+ @apply flex items-center justify-center mx-auto bg-dark-500 border border-dark-650 rounded;
81
+ padding: 3px;
82
+ gap: 2px;
83
+
82
84
  button {
83
- @apply p-1 rounded transition-colors hover:bg-dark-500;
84
- }
85
-
86
- svg {
87
- @apply w-4 h-4;
85
+ @apply flex items-center justify-center transition-all duration-150 border-0 outline-0 relative rounded;
86
+ background: transparent;
87
+ width: 28px;
88
+ height: 28px;
89
+ color: #d0d0d3;
90
+
91
+ &:hover {
92
+ background: rgba(255, 255, 255, 0.1);
93
+ color: #ffffff;
94
+ transform: scale(1.05);
95
+ }
96
+
97
+ &:active {
98
+ background: rgba(255, 255, 255, 0.2);
99
+ transform: scale(0.95);
100
+ }
88
101
  }
89
-
102
+
103
+ svg,
90
104
  img {
91
- @apply w-4 h-4;
105
+ width: 16px;
106
+ height: 16px;
107
+ position: relative;
108
+ z-index: 1;
109
+ }
110
+
111
+ svg path {
112
+ fill: currentColor;
92
113
  }
93
114
  }
94
115
 
116
+ // Tablet optimization
95
117
  @media (max-width: 1024px) {
96
118
  h4 {
97
119
  font-size: 10px !important;
98
120
  }
121
+
99
122
  .task-buttons {
100
- @apply gap-x-3;
123
+ padding: 3px;
124
+ gap: 2px;
125
+
126
+ button {
127
+ width: 26px;
128
+ height: 26px;
129
+ }
130
+
131
+ svg,
132
+ img {
133
+ width: 14px;
134
+ height: 14px;
135
+ }
101
136
  }
137
+
102
138
  .task-id {
103
139
  font-size: 6px !important;
104
140
  margin-right: -12px;
105
141
  margin-top: 20px;
106
142
  }
107
- .task-id-alt {
108
- font-size: 7px !important;
143
+ }
144
+
145
+ // Mobile optimization
146
+ @media (max-width: 768px) {
147
+ .task-buttons {
148
+ padding: 2px;
149
+ gap: 1px;
150
+
151
+ button {
152
+ width: 22px;
153
+ height: 22px;
154
+ }
155
+
156
+ svg,
157
+ img {
158
+ width: 12px;
159
+ height: 12px;
160
+ }
161
+ }
162
+ }
163
+
164
+ // iPhone vertical (portrait) specific
165
+ @media (max-width: 480px) and (orientation: portrait) {
166
+ .task-buttons {
167
+ padding: 2px;
168
+ gap: 1px;
169
+
170
+ button {
171
+ width: 18px;
172
+ height: 18px;
173
+
174
+ &:hover {
175
+ transform: scale(1.1);
176
+ }
177
+ }
178
+
179
+ svg,
180
+ img {
181
+ width: 10px;
182
+ height: 10px;
183
+ }
109
184
  }
110
185
  }
111
186
  </style>
@@ -6,6 +6,7 @@
6
6
  class="mr-3"
7
7
  :toggled="ui.mainCheckbox.profiles"
8
8
  @valueUpdate="ui.toggleMainCheckbox('profiles')"
9
+ :isHeader="true"
9
10
  />
10
11
  <div class="mx-auto flex items-center" @click="ui.toggleSort('eventId')">
11
12
  <ProfileIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  <div class="flex-1 min-w-0">
17
17
  <h3 class="font-medium text-white group-hover:text-light-400 transition-colors text-sm sm:text-base truncate">{{ filterTitle }}</h3>
18
- <p class="text-xs text-gray mt-1 truncate" v-if="getFilterSubtitle()">{{ getFilterSubtitle() }}</p>
18
+ <p class="text-xs mt-1 truncate text-light-400" v-if="getFilterSubtitle()">{{ getFilterSubtitle() }}</p>
19
19
  </div>
20
20
  </div>
21
21
  <div class="expanded-content mt-4 mx-2 sm:mx-0" v-if="filterBuilder.expandedFilter === filter.id">
@@ -87,7 +87,7 @@
87
87
  <label class="text-sm font-medium">Excluded</label>
88
88
  </div>
89
89
  <div class="flex items-center gap-2 control-group">
90
- <label class="text-xs text-gray whitespace-nowrap">Min:</label>
90
+ <label class="text-xs whitespace-nowrap text-light-400">Min:</label>
91
91
  <input
92
92
  type="number"
93
93
  :value="filter.minPrice"
@@ -105,7 +105,7 @@
105
105
  />
106
106
  </div>
107
107
  <div class="flex items-center gap-2 control-group">
108
- <label class="text-xs text-gray whitespace-nowrap">Max:</label>
108
+ <label class="text-xs whitespace-nowrap text-light-400">Max:</label>
109
109
  <input
110
110
  type="number"
111
111
  :value="filter.maxPrice"
@@ -289,22 +289,22 @@ props.filterBuilder.onUpdate(() => {
289
289
  <style scoped>
290
290
  .filter-card {
291
291
  @apply bg-dark-500 border-dark-550 relative;
292
- border: 1px solid rgba(74, 74, 97, 0.3);
292
+ border: 1px solid rgba(61, 62, 68, 0.3);
293
293
  margin-bottom: 8px;
294
294
  transition: all 0.15s ease-out;
295
295
  }
296
296
 
297
297
  .filter-card:hover:not(.expanded-filter) {
298
- border-color: rgba(74, 74, 97, 0.6);
299
- background-color: rgba(45, 47, 74, 0.8);
298
+ border-color: rgba(61, 62, 68, 0.6);
299
+ background-color: rgba(46, 47, 52, 0.8);
300
300
  }
301
301
 
302
302
  .expanded-filter:hover {
303
- border-color: rgba(74, 74, 97, 0.8);
303
+ border-color: rgba(61, 62, 68, 0.8);
304
304
  }
305
305
 
306
306
  .filter-card + .filter-card {
307
- border-top: 1px solid rgba(74, 74, 97, 0.2);
307
+ border-top: 1px solid rgba(61, 62, 68, 0.2);
308
308
  }
309
309
 
310
310
  .filter-type-badge {
@@ -316,7 +316,7 @@ props.filterBuilder.onUpdate(() => {
316
316
  }
317
317
 
318
318
  .label {
319
- @apply text-xs text-gray font-medium;
319
+ @apply text-xs font-medium text-light-400;
320
320
  }
321
321
 
322
322
  .value {
@@ -333,13 +333,13 @@ props.filterBuilder.onUpdate(() => {
333
333
 
334
334
  .filter-input {
335
335
  @apply border border-dark-550 rounded px-2 py-1.5 text-sm text-white focus:outline-none transition-colors;
336
- background-color: rgba(32, 32, 54, 0.9);
336
+ background-color: rgba(35, 36, 41, 0.9);
337
337
  color: white;
338
338
  }
339
339
 
340
340
  .filter-input:focus {
341
- border-color: #4A4A61;
342
- background-color: rgba(45, 47, 74, 0.9);
341
+ border-color: #44454b;
342
+ background-color: rgba(46, 47, 52, 0.9);
343
343
  }
344
344
 
345
345
  .filter-input::placeholder {
@@ -351,7 +351,7 @@ props.filterBuilder.onUpdate(() => {
351
351
  width: 28px;
352
352
  height: 28px;
353
353
  color: #9CA3AF;
354
- background-color: rgba(32, 32, 54, 0.8);
354
+ background-color: rgba(35, 36, 41, 0.8);
355
355
  backdrop-filter: blur(4px);
356
356
  }
357
357
 
@@ -369,8 +369,8 @@ props.filterBuilder.onUpdate(() => {
369
369
  }
370
370
 
371
371
  .drag-btn:hover {
372
- background-color: rgba(74, 74, 97, 0.8);
373
- border-color: #4A4A61;
372
+ background-color: rgba(68, 69, 75, 0.8);
373
+ border-color: #44454b;
374
374
  }
375
375
 
376
376
  .delete-btn:hover {
@@ -380,14 +380,14 @@ props.filterBuilder.onUpdate(() => {
380
380
  }
381
381
 
382
382
  .drag-handle.sortable-chosen {
383
- border: 1px solid #4A4A61;
384
- background-color: rgba(74, 74, 97, 0.2);
383
+ border: 1px solid #44454b;
384
+ background-color: rgba(68, 69, 75, 0.2);
385
385
  }
386
386
 
387
387
  .filter-card.sortable-ghost {
388
388
  @apply opacity-50;
389
- border: 1px solid #4A4A61;
390
- background-color: rgba(74, 74, 97, 0.1);
389
+ border: 1px solid #44454b;
390
+ background-color: rgba(68, 69, 75, 0.1);
391
391
  }
392
392
 
393
393
  .filter-card.sortable-drag {
@@ -395,18 +395,18 @@ props.filterBuilder.onUpdate(() => {
395
395
  }
396
396
 
397
397
  .expanded-filter {
398
- border-left: 4px solid #4A4A61;
399
- background-color: rgba(27, 28, 43, 0.95);
398
+ border-left: 4px solid #44454b;
399
+ background-color: rgba(26, 27, 30, 0.95);
400
400
  }
401
401
 
402
402
  .expanded-content {
403
- background-color: rgba(27, 28, 43, 0.95);
403
+ background-color: rgba(26, 27, 30, 0.95);
404
404
  border-radius: 6px;
405
405
  padding: 12px;
406
406
  }
407
407
 
408
408
  .controls-section {
409
- background-color: rgba(27, 28, 43, 0.98);
409
+ background-color: rgba(26, 27, 30, 0.98);
410
410
  border-radius: 6px;
411
411
  padding: 12px;
412
412
  }
@@ -52,7 +52,7 @@
52
52
  border-radius: 8px;
53
53
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
54
54
  overflow: hidden;
55
- background-color: #1a1a2e;
55
+ background-color: #2e2f34;
56
56
  }
57
57
 
58
58
  .editor-wrapper {
@@ -80,7 +80,7 @@
80
80
  line-height: 1.6;
81
81
  tab-size: 4;
82
82
  outline: none;
83
- border: 1px solid #2d2d3b;
83
+ border: 1px solid #3d3e44;
84
84
  border-radius: 8px;
85
85
  z-index: 10;
86
86
  position: absolute;
@@ -81,20 +81,22 @@ const getCurrentText = () => {
81
81
 
82
82
  <style scoped>
83
83
  .sort-toggle {
84
- @apply flex items-center gap-2 px-3 py-2 bg-dark-500 border border-dark-550 rounded text-gray text-sm font-medium transition-all duration-200 hover:bg-dark-400 hover:text-white hover:border-light-300 focus:outline-none;
84
+ @apply flex items-center gap-2 px-3 py-2 bg-dark-500 border border-dark-650 rounded text-sm font-medium transition-all duration-150 hover:bg-dark-550 hover:border-dark-700 focus:outline-none;
85
+ color: #cccccc;
85
86
  min-width: 80px;
86
87
  }
87
88
 
89
+ .sort-toggle:hover {
90
+ color: #ffffff;
91
+ }
92
+
88
93
  .sort-toggle.darker {
89
- @apply bg-dark-400 text-white border-light-300;
94
+ @apply bg-dark-550 border-dark-700 hover:bg-dark-600;
95
+ color: #d4d4d4;
90
96
  min-width: 100px;
91
97
  height: 40px;
92
98
  }
93
99
 
94
- .sort-toggle.darker:hover {
95
- @apply bg-dark-300 border-light-400;
96
- }
97
-
98
100
  .icon {
99
101
  @apply w-4 h-4 flex-shrink-0;
100
102
  }
@@ -5,10 +5,12 @@
5
5
  </template>
6
6
  <style lang="scss">
7
7
  .table-component {
8
- @apply flex-col bg-clip-padding rounded relative box-border border-2 border-b-0 border-dark-550 bg-dark-500;
8
+ @apply flex-col bg-clip-padding rounded relative box-border border border-b-0 border-dark-650 bg-dark-400;
9
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
9
10
  }
10
11
 
11
12
  .table-component > .grid {
12
13
  @apply bg-dark-500;
14
+ border-bottom: 1px solid #3d3e44;
13
15
  }
14
16
  </style>
@@ -7,7 +7,7 @@
7
7
  <button @click="$emit('stopAll')" class="bg-red-400 smooth-hover responsive-button border-none">
8
8
  Stop <PauseIcon />
9
9
  </button>
10
- <button @click="$emit('deleteAll')" class="bg-dark-400 smooth-hover responsive-button border border-light-300 hover:border-light-400">
10
+ <button @click="$emit('deleteAll')" class="bg-dark-400 smooth-hover responsive-button border border-dark-650 hover:border-dark-700">
11
11
  Delete <TrashIcon />
12
12
  </button>
13
13
  <h4 class="text-light-300 text-sm flex-grow xl:flex-initial"></h4>
@@ -15,7 +15,7 @@
15
15
  <div class="flex gap-x-3">
16
16
  <button
17
17
  :disabled="ui.disabledButtons['add-tasks']"
18
- class="bg-dark-400 disabled:opacity-70 smooth-hover flex-grow xl:flex-initial w-36 border border-light-300 hover:border-light-400"
18
+ class="bg-dark-400 disabled:opacity-70 smooth-hover flex-grow xl:flex-initial w-36 border border-dark-650 hover:border-dark-700"
19
19
  @click="ui.toggleModal('create-task')"
20
20
  >
21
21
  Create Task
@@ -23,7 +23,7 @@
23
23
  </button>
24
24
 
25
25
  <button
26
- class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36 border border-light-300 hover:border-light-400"
26
+ class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36 border border-dark-650 hover:border-dark-700"
27
27
  @click="ui.toggleModal('mass-edit-presale-code')"
28
28
  :disabled="ui.disabledButtons['mass-edit']"
29
29
  v-if="ui.currentModule == 'TM'"