@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.
- package/.claude/settings.local.json +7 -1
- package/index.html +5 -3
- package/package.json +1 -1
- package/src/App.vue +0 -8
- package/src/assets/css/_input.scss +7 -7
- package/src/assets/css/main.scss +91 -20
- package/src/assets/img/background.svg +2 -2
- package/src/assets/img/background.svg.backup +11 -0
- package/src/assets/img/logo_icon.png +0 -0
- package/src/components/Editors/Account/Account.vue +87 -12
- package/src/components/Editors/Account/AccountCreator.vue +5 -5
- package/src/components/Editors/Account/AccountView.vue +1 -0
- package/src/components/Editors/Account/CreateAccount.vue +10 -4
- package/src/components/Editors/Profile/CreateProfile.vue +133 -39
- package/src/components/Editors/Profile/Profile.vue +87 -12
- package/src/components/Editors/Profile/ProfileView.vue +1 -0
- package/src/components/Filter/Filter.vue +23 -23
- package/src/components/Filter/FilterPreview.vue +2 -2
- package/src/components/Filter/PriceSortToggle.vue +8 -6
- package/src/components/Table/Table.vue +3 -1
- package/src/components/Tasks/Controls/DesktopControls.vue +3 -3
- package/src/components/Tasks/Controls/MobileControls.vue +1 -1
- package/src/components/Tasks/CreateTaskTM.vue +4 -6
- package/src/components/Tasks/Stats.vue +26 -6
- package/src/components/Tasks/Task.vue +178 -32
- package/src/components/Tasks/TaskView.vue +85 -18
- package/src/components/Tasks/Utilities.vue +4 -5
- package/src/components/icons/Bag.vue +1 -1
- package/src/components/icons/Loyalty.vue +1 -1
- package/src/components/icons/Stadium.vue +1 -1
- package/src/components/ui/Modal.vue +12 -1
- package/src/components/ui/Navbar.vue +1 -1
- package/src/components/ui/ReconnectIndicator.vue +1 -1
- package/src/components/ui/controls/atomic/Checkbox.vue +119 -9
- package/src/components/ui/controls/atomic/Dropdown.vue +8 -7
- package/src/components/ui/controls/atomic/MultiDropdown.vue +2 -1
- package/src/stores/sampleData.js +60 -94
- package/src/stores/ui.js +1 -1
- package/src/utils/debug.js +1 -1
- package/src/views/Accounts.vue +9 -4
- package/src/views/Console.vue +16 -9
- package/src/views/Editor.vue +7 -7
- package/src/views/FilterBuilder.vue +40 -22
- package/src/views/Profiles.vue +4 -4
- package/src/views/Tasks.vue +32 -53
- package/tailwind.config.js +62 -14
- package/vite.config.js +2 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
105
|
-
<label class="label-override mb-2">State
|
|
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
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
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
|
|
143
|
-
|
|
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",
|
|
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(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
if (
|
|
239
|
-
const
|
|
240
|
-
|
|
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 =
|
|
281
|
-
|
|
282
|
-
|
|
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(
|
|
389
|
+
if (value.startsWith("3")) {
|
|
296
390
|
maxLength = 15; // AMEX
|
|
297
|
-
} else if (value.startsWith(
|
|
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 !==
|
|
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
|
|
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
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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>
|
|
@@ -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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
299
|
-
background-color: rgba(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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: #
|
|
342
|
-
background-color: rgba(
|
|
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(
|
|
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(
|
|
373
|
-
border-color: #
|
|
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 #
|
|
384
|
-
background-color: rgba(
|
|
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 #
|
|
390
|
-
background-color: rgba(
|
|
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 #
|
|
399
|
-
background-color: rgba(
|
|
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(
|
|
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(
|
|
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: #
|
|
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 #
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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'"
|