@necrolab/dashboard 0.4.3

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 (240) hide show
  1. package/.claude/settings.local.json +45 -0
  2. package/.eslintrc.js +24 -0
  3. package/.prettierignore +1 -0
  4. package/.prettierrc +10 -0
  5. package/.vscode/extensions.json +3 -0
  6. package/ICONS.md +21 -0
  7. package/README.md +65 -0
  8. package/backend/api.js +430 -0
  9. package/backend/auth.js +62 -0
  10. package/backend/batching.js +43 -0
  11. package/backend/endpoints.js +343 -0
  12. package/backend/index.js +23 -0
  13. package/backend/mock-data.js +66 -0
  14. package/backend/mock-src/classes/logger.js +112 -0
  15. package/backend/mock-src/classes/utils.js +42 -0
  16. package/backend/mock-src/ticketmaster.js +92 -0
  17. package/backend/validator.js +62 -0
  18. package/config/configs.json +20 -0
  19. package/config/filter.json +3 -0
  20. package/config/presale.csv +3 -0
  21. package/config/proxies.txt +6 -0
  22. package/config/used-codes.json +4 -0
  23. package/index.html +114 -0
  24. package/index.js +2 -0
  25. package/jsconfig.json +16 -0
  26. package/package.json +48 -0
  27. package/postcss.config.js +6 -0
  28. package/postinstall.js +9 -0
  29. package/public/android-chrome-192x192.png +0 -0
  30. package/public/android-chrome-512x512.png +0 -0
  31. package/public/apple-touch-icon.png +0 -0
  32. package/public/favicon-16x16.png +0 -0
  33. package/public/favicon-32x32.png +0 -0
  34. package/public/favicon.ico +0 -0
  35. package/public/flags/ae.svg +1 -0
  36. package/public/flags/at.svg +1 -0
  37. package/public/flags/au.svg +1 -0
  38. package/public/flags/be.svg +1 -0
  39. package/public/flags/ch.svg +1 -0
  40. package/public/flags/cz.svg +1 -0
  41. package/public/flags/de.svg +1 -0
  42. package/public/flags/dk.svg +1 -0
  43. package/public/flags/es.svg +1 -0
  44. package/public/flags/nl.svg +1 -0
  45. package/public/flags/no.svg +1 -0
  46. package/public/flags/nz.svg +1 -0
  47. package/public/flags/pl.svg +1 -0
  48. package/public/flags/se.svg +1 -0
  49. package/public/flags/uk.svg +1 -0
  50. package/public/flags/us.svg +1 -0
  51. package/public/img/award.svg +3 -0
  52. package/public/img/background.svg +14 -0
  53. package/public/img/bag_w.svg +12 -0
  54. package/public/img/banks/amex.svg +4 -0
  55. package/public/img/banks/mastercard.svg +4 -0
  56. package/public/img/banks/visa.svg +4 -0
  57. package/public/img/camera.svg +3 -0
  58. package/public/img/close.svg +3 -0
  59. package/public/img/controls/disable.svg +5 -0
  60. package/public/img/controls/enable.svg +5 -0
  61. package/public/img/groups.svg +3 -0
  62. package/public/img/hand.svg +3 -0
  63. package/public/img/key.svg +3 -0
  64. package/public/img/logo.png +0 -0
  65. package/public/img/logo_icon.png +0 -0
  66. package/public/img/logo_icon_2.png +0 -0
  67. package/public/img/logo_trans.png +0 -0
  68. package/public/img/loyalty.svg +3 -0
  69. package/public/img/mail.svg +3 -0
  70. package/public/img/pencil.svg +3 -0
  71. package/public/img/profile.svg +4 -0
  72. package/public/img/reload.svg +3 -0
  73. package/public/img/sandclock.svg +25 -0
  74. package/public/img/save.svg +5 -0
  75. package/public/img/savings.svg +3 -0
  76. package/public/img/scanner.svg +3 -0
  77. package/public/img/sell.svg +3 -0
  78. package/public/img/shield.svg +3 -0
  79. package/public/img/ski.svg +3 -0
  80. package/public/img/stadium.svg +8 -0
  81. package/public/img/stadium_w.svg +8 -0
  82. package/public/img/timer.svg +3 -0
  83. package/public/manifest.json +27 -0
  84. package/public/robots.txt +2 -0
  85. package/run +10 -0
  86. package/src/App.vue +307 -0
  87. package/src/assets/css/_input.scss +197 -0
  88. package/src/assets/css/main.scss +269 -0
  89. package/src/assets/css/tailwind.css +3 -0
  90. package/src/assets/img/award.svg +3 -0
  91. package/src/assets/img/background.svg +11 -0
  92. package/src/assets/img/camera.svg +3 -0
  93. package/src/assets/img/close.svg +3 -0
  94. package/src/assets/img/eyes/closed.svg +13 -0
  95. package/src/assets/img/eyes/open.svg +12 -0
  96. package/src/assets/img/groups.svg +3 -0
  97. package/src/assets/img/hand.svg +3 -0
  98. package/src/assets/img/key.svg +3 -0
  99. package/src/assets/img/logo.png +0 -0
  100. package/src/assets/img/logo_icon.png +0 -0
  101. package/src/assets/img/logo_icon_2.png +0 -0
  102. package/src/assets/img/logo_trans.png +0 -0
  103. package/src/assets/img/loyalty.svg +3 -0
  104. package/src/assets/img/mail.svg +3 -0
  105. package/src/assets/img/pencil.svg +3 -0
  106. package/src/assets/img/reload.svg +3 -0
  107. package/src/assets/img/savings.svg +3 -0
  108. package/src/assets/img/scanner.svg +3 -0
  109. package/src/assets/img/sell.svg +3 -0
  110. package/src/assets/img/shield.svg +3 -0
  111. package/src/assets/img/ski.svg +3 -0
  112. package/src/assets/img/square_check.svg +5 -0
  113. package/src/assets/img/square_uncheck.svg +5 -0
  114. package/src/assets/img/stadium.svg +8 -0
  115. package/src/assets/img/timer.svg +3 -0
  116. package/src/assets/img/wildcard.svg +7 -0
  117. package/src/components/Auth/LoginForm.vue +48 -0
  118. package/src/components/Editors/Account/Account.vue +119 -0
  119. package/src/components/Editors/Account/AccountCreator.vue +147 -0
  120. package/src/components/Editors/Account/AccountView.vue +87 -0
  121. package/src/components/Editors/Account/CreateAccount.vue +106 -0
  122. package/src/components/Editors/Profile/CreateProfile.vue +321 -0
  123. package/src/components/Editors/Profile/Profile.vue +142 -0
  124. package/src/components/Editors/Profile/ProfileCountryChooser.vue +75 -0
  125. package/src/components/Editors/Profile/ProfileView.vue +96 -0
  126. package/src/components/Editors/TagLabel.vue +16 -0
  127. package/src/components/Editors/TagToggle.vue +41 -0
  128. package/src/components/Filter/Filter.vue +409 -0
  129. package/src/components/Filter/FilterPreview.vue +236 -0
  130. package/src/components/Filter/PriceSortToggle.vue +105 -0
  131. package/src/components/Table/Header.vue +5 -0
  132. package/src/components/Table/Row.vue +5 -0
  133. package/src/components/Table/Table.vue +14 -0
  134. package/src/components/Table/index.js +4 -0
  135. package/src/components/Tasks/CheckStock.vue +62 -0
  136. package/src/components/Tasks/Controls/DesktopControls.vue +73 -0
  137. package/src/components/Tasks/Controls/MobileControls.vue +32 -0
  138. package/src/components/Tasks/Controls/index.js +3 -0
  139. package/src/components/Tasks/CreateTaskAXS.vue +339 -0
  140. package/src/components/Tasks/CreateTaskTM.vue +459 -0
  141. package/src/components/Tasks/MassEdit.vue +50 -0
  142. package/src/components/Tasks/QuickSettings.vue +167 -0
  143. package/src/components/Tasks/ScrapeVenue.vue +42 -0
  144. package/src/components/Tasks/Stats.vue +66 -0
  145. package/src/components/Tasks/Task.vue +296 -0
  146. package/src/components/Tasks/TaskLabel.vue +20 -0
  147. package/src/components/Tasks/TaskView.vue +126 -0
  148. package/src/components/Tasks/Utilities.vue +33 -0
  149. package/src/components/icons/Award.vue +8 -0
  150. package/src/components/icons/Bag.vue +8 -0
  151. package/src/components/icons/BagWhite.vue +8 -0
  152. package/src/components/icons/Box.vue +8 -0
  153. package/src/components/icons/Camera.vue +8 -0
  154. package/src/components/icons/Cart.vue +8 -0
  155. package/src/components/icons/Check.vue +5 -0
  156. package/src/components/icons/Checkmark.vue +11 -0
  157. package/src/components/icons/Click.vue +8 -0
  158. package/src/components/icons/Close.vue +21 -0
  159. package/src/components/icons/CloseX.vue +5 -0
  160. package/src/components/icons/Console.vue +13 -0
  161. package/src/components/icons/Down.vue +8 -0
  162. package/src/components/icons/Edit.vue +13 -0
  163. package/src/components/icons/Event.vue +8 -0
  164. package/src/components/icons/Expand.vue +8 -0
  165. package/src/components/icons/Filter.vue +13 -0
  166. package/src/components/icons/Gear.vue +8 -0
  167. package/src/components/icons/Group.vue +8 -0
  168. package/src/components/icons/Hand.vue +8 -0
  169. package/src/components/icons/Key.vue +21 -0
  170. package/src/components/icons/Logout.vue +13 -0
  171. package/src/components/icons/Loyalty.vue +8 -0
  172. package/src/components/icons/Mail.vue +8 -0
  173. package/src/components/icons/Menu.vue +8 -0
  174. package/src/components/icons/Pause.vue +5 -0
  175. package/src/components/icons/Pencil.vue +21 -0
  176. package/src/components/icons/Play.vue +8 -0
  177. package/src/components/icons/Plus.vue +8 -0
  178. package/src/components/icons/Profile.vue +18 -0
  179. package/src/components/icons/Reload.vue +7 -0
  180. package/src/components/icons/Sandclock.vue +33 -0
  181. package/src/components/icons/Savings.vue +8 -0
  182. package/src/components/icons/Scanner.vue +8 -0
  183. package/src/components/icons/Scrape.vue +8 -0
  184. package/src/components/icons/Sell.vue +21 -0
  185. package/src/components/icons/Shield.vue +8 -0
  186. package/src/components/icons/Shrink.vue +8 -0
  187. package/src/components/icons/Ski.vue +8 -0
  188. package/src/components/icons/Spinner.vue +42 -0
  189. package/src/components/icons/SquareCheck.vue +18 -0
  190. package/src/components/icons/SquareUncheck.vue +18 -0
  191. package/src/components/icons/Stadium.vue +13 -0
  192. package/src/components/icons/StadiumWhite.vue +13 -0
  193. package/src/components/icons/Status.vue +8 -0
  194. package/src/components/icons/Tag.vue +8 -0
  195. package/src/components/icons/Tasks.vue +13 -0
  196. package/src/components/icons/Ticket.vue +8 -0
  197. package/src/components/icons/Timer.vue +8 -0
  198. package/src/components/icons/Trash.vue +8 -0
  199. package/src/components/icons/Up.vue +10 -0
  200. package/src/components/icons/Wildcard.vue +18 -0
  201. package/src/components/icons/index.js +111 -0
  202. package/src/components/ui/Modal.vue +61 -0
  203. package/src/components/ui/Navbar.vue +207 -0
  204. package/src/components/ui/ReconnectIndicator.vue +90 -0
  205. package/src/components/ui/Splash.vue +24 -0
  206. package/src/components/ui/controls/CountryChooser.vue +87 -0
  207. package/src/components/ui/controls/EyeToggle.vue +11 -0
  208. package/src/components/ui/controls/atomic/Checkbox.vue +28 -0
  209. package/src/components/ui/controls/atomic/Dropdown.vue +138 -0
  210. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  211. package/src/components/ui/controls/atomic/MultiDropdown.vue +262 -0
  212. package/src/components/ui/controls/atomic/Switch.vue +84 -0
  213. package/src/libs/Filter.js +593 -0
  214. package/src/libs/ansii.js +565 -0
  215. package/src/libs/panzoom.js +1413 -0
  216. package/src/main.js +23 -0
  217. package/src/registerServiceWorker.js +32 -0
  218. package/src/router/index.js +65 -0
  219. package/src/stores/cities.json +1 -0
  220. package/src/stores/connection.js +399 -0
  221. package/src/stores/countries.js +88 -0
  222. package/src/stores/logger.js +103 -0
  223. package/src/stores/requests.js +88 -0
  224. package/src/stores/sampleData.js +1034 -0
  225. package/src/stores/ui.js +584 -0
  226. package/src/stores/utils.js +554 -0
  227. package/src/types/index.js +42 -0
  228. package/src/utils/debug.js +1 -0
  229. package/src/views/Accounts.vue +191 -0
  230. package/src/views/Console.vue +224 -0
  231. package/src/views/Editor.vue +785 -0
  232. package/src/views/FilterBuilder.vue +785 -0
  233. package/src/views/Login.vue +27 -0
  234. package/src/views/Profiles.vue +209 -0
  235. package/src/views/Tasks.vue +157 -0
  236. package/static/offline.html +184 -0
  237. package/tailwind.config.js +57 -0
  238. package/vite.config.js +63 -0
  239. package/vue.config.js +32 -0
  240. package/workbox-config.js +66 -0
package/src/App.vue ADDED
@@ -0,0 +1,307 @@
1
+ <template>
2
+ <div class="layout">
3
+ <transition name="fade">
4
+ <Splash v-if="isLoading" />
5
+ </transition>
6
+ <div class="refresh-wrapper">
7
+ <div
8
+ class="refresh-container w-fit mx-auto"
9
+ :style="{
10
+ 'margin-top': maxPull() + 'px',
11
+ transform: `rotate(${ui.pullChange}deg)`
12
+ }"
13
+ >
14
+ <div
15
+ class="refresh-icon p-2 rounded-full mx-auto duration-200"
16
+ :class="{
17
+ 'opacity-100': ui.pullChange > 250,
18
+ 'opacity-0': ui.pullChange < 250
19
+ }"
20
+ >
21
+ <svg
22
+ xmlns="http://www.w3.org/2000/svg"
23
+ fill="none"
24
+ viewBox="0 0 24 24"
25
+ class="stroke-2 w-4 stroke-dark-400"
26
+ :class="{ 'opacity-0': ui.pullChange == 0 }"
27
+ >
28
+ <path
29
+ strokeLinecap="round"
30
+ strokeLinejoin="round"
31
+ d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"
32
+ />
33
+ </svg>
34
+ </div>
35
+ </div>
36
+ <h2
37
+ class="text-dark-400 text-center duration-200"
38
+ :class="{
39
+ 'opacity-100': ui.pullChange > 250,
40
+ 'opacity-0': ui.pullChange < 250
41
+ }"
42
+ >
43
+ Release to refresh
44
+ </h2>
45
+ </div>
46
+ <transition name="out-in">
47
+ <div v-if="spinner" key="reconnect-indicator" class="h-full">
48
+ <ReconnectIndicator :message="ui.spinnerMessage" />
49
+ </div>
50
+ <div v-else key="main-components" class="flex">
51
+ <Navbar v-if="layout == 'dashboard'" class="fixed" />
52
+ <div :class="['router-wrapper', { '-mt-[60px]': ui.pullChange > 1 }]"></div>
53
+ <router-view v-slot="{ Component }">
54
+ <component
55
+ :is="Component"
56
+ :class="[
57
+ 'component-container pb-2 mt-0 lg:mt-4 ios-wrapper',
58
+ { 'w-full': landscapeIos }
59
+ ]"
60
+ />
61
+ </router-view>
62
+ </div>
63
+ </transition>
64
+ </div>
65
+ </template>
66
+
67
+ <script setup>
68
+ import { storeToRefs } from "pinia";
69
+ import { ref, computed, watch } from "vue";
70
+ import { useRouter } from "vue-router";
71
+ import Navbar from "@/components/ui/Navbar.vue";
72
+ import { useUIStore } from "@/stores/ui";
73
+ import Splash from "@/components/ui/Splash.vue";
74
+ import ReconnectIndicator from "@/components/ui/ReconnectIndicator.vue";
75
+
76
+ const ui = useUIStore();
77
+ const router = useRouter();
78
+ const isLoading = ref(false);
79
+ const spinner = storeToRefs(ui).showSpinner;
80
+ const landscapeIos = ref(false);
81
+
82
+ function isIOS() {
83
+ if (/iPad|iPhone|iPod/.test(navigator.platform)) {
84
+ return true;
85
+ } else {
86
+ return navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform);
87
+ }
88
+ }
89
+
90
+ function isIpadOS() {
91
+ return navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform);
92
+ }
93
+
94
+ window.matchMedia("(orientation: portrait)").addEventListener("change", (e) => {
95
+ if (!e.matches && isIOS() && !isIpadOS()) landscapeIos.value = true;
96
+ else landscapeIos.value = false;
97
+ });
98
+
99
+ if (!window.location.href.includes(":5173")) ui.startSpinner("Loading...");
100
+
101
+ // close modals on esc
102
+ document.onkeydown = function (evt) {
103
+ evt = evt || window.event;
104
+ var isEscape = false;
105
+ if ("key" in evt) {
106
+ isEscape = evt.key === "Escape" || evt.key === "Esc";
107
+ } else {
108
+ isEscape = evt.keyCode === 27;
109
+ }
110
+ if (isEscape) {
111
+ ui.activeModal = "";
112
+ }
113
+ };
114
+
115
+ document.addEventListener("keydown", function (event) {
116
+ if (
117
+ (event.ctrlKey || event.metaKey) &&
118
+ (event.which === 61 ||
119
+ event.which === 107 ||
120
+ event.which === 173 ||
121
+ event.which === 109 ||
122
+ event.which === 187 ||
123
+ event.which === 189)
124
+ ) {
125
+ event.preventDefault();
126
+ }
127
+ });
128
+ // prevent zoom
129
+ window.addEventListener(
130
+ "mousewheel",
131
+ function (event) {
132
+ if (event.ctrlKey == true) {
133
+ event.preventDefault();
134
+ }
135
+ },
136
+ { passive: false }
137
+ );
138
+
139
+ window.addEventListener(
140
+ "DOMMouseScroll",
141
+ function (event) {
142
+ if (event.ctrlKey == true) {
143
+ event.preventDefault();
144
+ }
145
+ },
146
+ { passive: false }
147
+ );
148
+
149
+ window.screen.orientation.onchange = () => {
150
+ if (document.body.classList.contains("overflow-hidden")) {
151
+ document.body.classList.remove("overflow-hidden");
152
+ setTimeout(() => {
153
+ document.body.classList.add("overflow-hidden");
154
+ }, 5);
155
+ }
156
+ handleNotch();
157
+ };
158
+
159
+ document.addEventListener("DOMContentLoaded", handleNotch, false);
160
+ window.simulateRotate = handleNotch;
161
+
162
+ function handleNotch() {
163
+ const wrappers = [...document.querySelectorAll(".ios-wrapper")];
164
+
165
+ // Check if the device is an iPhone with a notch
166
+ const hasNotch = CSS.supports("padding-left: env(safe-area-inset-left)");
167
+
168
+ const orientation = window.orientation; //window.screen.orientation.angle;
169
+ if (!isIpadOS() && isIOS()) {
170
+ if (hasNotch && orientation !== 0) {
171
+ // Landscape mode
172
+ if (orientation === 90) {
173
+ // Notch is on the left
174
+ wrappers.forEach((wrapper) => {
175
+ wrapper.style.paddingLeft = "env(safe-area-inset-left)";
176
+ wrapper.style.paddingRight = "0.5rem";
177
+ });
178
+ } else if (orientation === -90) {
179
+ // Notch is on the right
180
+ wrappers.forEach((wrapper) => {
181
+ wrapper.style.paddingRight = "env(safe-area-inset-right)";
182
+ wrapper.style.paddingLeft = "0.5rem";
183
+ });
184
+ }
185
+ } else {
186
+ wrappers.forEach((wrapper) => {
187
+ // Portrait mode or no notch
188
+ const amount =
189
+ window.innerWidth > 1280
190
+ ? "2.5rem"
191
+ : window.innerWidth > 1030
192
+ ? "1.5rem"
193
+ : window.innerWidth > 768
194
+ ? "0.5rem"
195
+ : "0.5rem";
196
+ wrapper.style.paddingLeft = amount;
197
+ wrapper.style.paddingRight = amount;
198
+ });
199
+ }
200
+ }
201
+ }
202
+
203
+ // Call the function initially
204
+ window.addEventListener("orientationchange", handleNotch);
205
+
206
+ const pullStart = (e) => {
207
+ const { screenY } = e.targetTouches[0];
208
+ ui.setStartPoint(screenY);
209
+ };
210
+ const initLoading = () => {
211
+ // refreshCont.current.classList.add("loading");
212
+ setTimeout(() => {
213
+ isLoading.value = true;
214
+ }, 500);
215
+ setTimeout(() => {
216
+ window.location.reload();
217
+ }, 1500);
218
+ };
219
+ const pull = (e) => {
220
+ /**
221
+ * get the current user touch event data
222
+ */
223
+ const touch = e.targetTouches[0];
224
+ /**
225
+ * get the touch position on the screen's Y axis
226
+ */
227
+ const { screenY } = touch;
228
+ /**
229
+ * The length of the pull
230
+ *
231
+ * if the start touch position is lesser than the current touch position, calculate the difference, which gives the `pullLength`
232
+ *
233
+ * This tells us how much the user has pulled
234
+ */
235
+ let pullLength = ui.startPoint < screenY ? Math.abs(screenY - ui.startPoint) : 0;
236
+ ui.setPullChange(pullLength);
237
+ };
238
+ const endPull = (e) => {
239
+ if (ui.pullChange > 250) {
240
+ e.preventDefault();
241
+ }
242
+ if (ui.pullChange > 200) initLoading();
243
+ ui.setStartPoint(0);
244
+ ui.setPullChange(0);
245
+ };
246
+ window.addEventListener("touchstart", pullStart);
247
+ window.addEventListener("touchmove", pull);
248
+ window.addEventListener("touchend", endPull);
249
+
250
+ function maxPull() {
251
+ if (ui.pullChange < 250) {
252
+ return ui.pullChange;
253
+ } else {
254
+ ui.setPullChange(250);
255
+ return 250;
256
+ }
257
+ }
258
+ watch(
259
+ () => router.currentRoute.value.name,
260
+ () => {
261
+ setTimeout(() => handleNotch(), 5);
262
+ }
263
+ );
264
+ const layout = computed(() => router.currentRoute.value.meta.layout);
265
+ </script>
266
+ <style lang="scss">
267
+ .task-buttons {
268
+ @apply flex mx-auto gap-x-4;
269
+
270
+ svg {
271
+ width: 15px;
272
+ height: 15px;
273
+ }
274
+ }
275
+
276
+ .dropdown {
277
+ position: relative;
278
+ display: inline-block;
279
+ }
280
+
281
+ .dropdown-content {
282
+ @apply bg-dark-500 text-white shadow rounded-lg top-10 left-0;
283
+ position: absolute;
284
+ min-width: 160px;
285
+ padding: 12px 16px;
286
+ z-index: 1;
287
+ }
288
+
289
+ .layout {
290
+ @apply flex flex-col;
291
+ min-height: 90vh;
292
+ }
293
+
294
+ .router-wrapper {
295
+ @apply pt-5;
296
+ transition: margin 0.25s;
297
+ z-index: 0;
298
+ }
299
+
300
+ .refresh-container {
301
+ transition: margin 0.25s;
302
+ }
303
+
304
+ .component-container {
305
+ @apply w-full mx-auto px-4 xs:px-4 md:px-2 lg:px-6 xl:px-10;
306
+ }
307
+ </style>
@@ -0,0 +1,197 @@
1
+ .input-default {
2
+ @apply h-12 bg-dark-500 flex items-center bg-clip-padding rounded-lg relative box-border border-dark-550 border-2;
3
+
4
+ input {
5
+ @apply h-full w-full px-4 focus:outline-none text-xs text-white;
6
+ background-color: transparent;
7
+ }
8
+
9
+ /* When input has incrementer, add right padding */
10
+ &:has(.input-incrementer) input {
11
+ @apply pr-10;
12
+ }
13
+
14
+ /* Required field indicator */
15
+ &.required {
16
+ /* Professional style with colored border */
17
+ border-left: 3px solid rgba(239, 68, 68, 0.7);
18
+
19
+ /* Red bullet indicator directly in the field */
20
+ &::after {
21
+ content: "";
22
+ position: absolute;
23
+ right: 8px;
24
+ top: 50%;
25
+ transform: translateY(-50%);
26
+ width: 6px;
27
+ height: 6px;
28
+ border-radius: 50%;
29
+ background-color: #ef4444;
30
+ }
31
+
32
+ &:has(.input-incrementer)::after {
33
+ right: 16px;
34
+ }
35
+ }
36
+ }
37
+ .input-wrapper {
38
+ @apply z-20;
39
+
40
+ label {
41
+ @apply text-xs text-light-300 block;
42
+ }
43
+ }
44
+
45
+ .button-default {
46
+ @apply text-white font-medium h-12 rounded-lg duration-150 border border-light-300 hover:border-light-400 #{!important};
47
+ }
48
+
49
+ // Remove number input spinners
50
+ input[type="number"] {
51
+ -webkit-appearance: textfield;
52
+ -moz-appearance: textfield;
53
+ appearance: textfield;
54
+
55
+ &::-webkit-inner-spin-button,
56
+ &::-webkit-outer-spin-button {
57
+ -webkit-appearance: none;
58
+ }
59
+ }
60
+
61
+ .input-incrementer {
62
+ @apply flex flex-col absolute right-2 top-1/2 transform -translate-y-1/2 #{!important};
63
+ gap: 2px;
64
+
65
+ button {
66
+ @apply w-6 h-4 flex items-center justify-center transition-all duration-150 rounded-sm;
67
+ background: rgba(42, 43, 59, 0.8);
68
+ border: 1px solid rgba(74, 74, 97, 0.6);
69
+ color: rgba(255, 255, 255, 0.9);
70
+ font-size: 8px;
71
+
72
+ &:hover {
73
+ background: rgba(74, 74, 97, 0.9);
74
+ border-color: rgba(167, 168, 175, 0.4);
75
+ color: white;
76
+ }
77
+
78
+ &:active {
79
+ background: rgba(32, 32, 54, 0.9);
80
+ }
81
+
82
+ svg {
83
+ @apply w-2.5 h-2.5;
84
+ }
85
+ }
86
+ }
87
+
88
+ // Mobile responsive adjustments
89
+ @media (max-width: 810px) {
90
+ .input-default {
91
+ height: 40px;
92
+
93
+ input {
94
+ font-size: 12px;
95
+ }
96
+
97
+ .input-incrementer button {
98
+ @apply w-5 h-3;
99
+
100
+ svg {
101
+ @apply w-2 h-2;
102
+ }
103
+ }
104
+ }
105
+
106
+ .input-wrapper label {
107
+ font-size: 15px;
108
+ }
109
+
110
+ .ant-select {
111
+ height: fit-content;
112
+ min-height: 40px;
113
+ padding: 0;
114
+
115
+ &-show-search:not(.ant-select-customize-input) .ant-select-selector {
116
+ font-size: 12px;
117
+ }
118
+
119
+ &-multiple .ant-select-selection-item {
120
+ height: 25px;
121
+ }
122
+ }
123
+ }
124
+ // Ant Design Select styling
125
+ .ant-select-dropdown {
126
+ z-index: 20000000000;
127
+ position: relative;
128
+ @apply rounded-lg #{!important};
129
+ }
130
+
131
+ .ant-select {
132
+ @apply bg-dark-500 flex items-center bg-clip-padding rounded-lg relative box-border px-1 py-1 border-dark-550 border-2 #{!important};
133
+ min-height: 3.45em;
134
+ height: fit-content;
135
+
136
+ .ant-select-selector {
137
+ @apply h-full w-full focus:outline-none text-xs text-white #{!important};
138
+ background: transparent;
139
+ background-color: transparent !important;
140
+ border: 0 !important;
141
+ box-shadow: 0 0 0 !important;
142
+ }
143
+ }
144
+
145
+ // Ant Design Select item styling
146
+ .ant-select-multiple .ant-select-selection-item {
147
+ @apply bg-dark-400 items-center gap-x-4 #{!important};
148
+ padding-inline-end: 15px;
149
+ padding-inline-start: 15px;
150
+ border-radius: 10px;
151
+ height: 40px;
152
+ border: 0;
153
+
154
+ &-remove > .anticon {
155
+ vertical-align: 0.05rem;
156
+ }
157
+ }
158
+
159
+ .ant-select-selection-item-remove > .anticon svg {
160
+ color: #fff;
161
+ }
162
+
163
+ .ant-select-selection-item-remove > .anticon svg path {
164
+ fill: currentColor;
165
+ }
166
+
167
+ .ant-select-item-option {
168
+ &-selected:not(.ant-select-item-option-disabled) {
169
+ @apply bg-dark-500 text-white #{!important};
170
+
171
+ .ant-select-item-option-state {
172
+ @apply text-white #{!important};
173
+
174
+ svg {
175
+ margin-top: -1.5px;
176
+ }
177
+ }
178
+ }
179
+
180
+ &-active:not(.ant-select-item-option-disabled) {
181
+ background-color: transparent;
182
+ }
183
+
184
+ &-content {
185
+ @apply text-white #{!important};
186
+ }
187
+ }
188
+
189
+ .ant-select-dropdown {
190
+ @apply bg-dark-400 #{!important};
191
+ }
192
+
193
+ .ant-select-selector:before {
194
+ content: "";
195
+ position: absolute;
196
+ @apply bg-light-400 h-1 w-1 right-1 rounded-full #{!important};
197
+ }