@necrolab/dashboard 0.4.221 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.prettierrc +27 -1
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +64 -2
  4. package/artwork/image.png +0 -0
  5. package/backend/api.js +26 -24
  6. package/backend/auth.js +2 -2
  7. package/backend/batching.js +1 -1
  8. package/backend/endpoints.js +8 -11
  9. package/backend/index.js +2 -2
  10. package/backend/mock-data.js +27 -36
  11. package/backend/mock-src/classes/logger.js +5 -7
  12. package/backend/mock-src/classes/utils.js +3 -2
  13. package/backend/mock-src/ticketmaster.js +4 -4
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +0 -1
  16. package/dev-server.js +134 -0
  17. package/exit +209 -0
  18. package/index.html +80 -8
  19. package/index.js +1 -1
  20. package/jsconfig.json +16 -0
  21. package/package.json +39 -25
  22. package/postcss.config.js +1 -1
  23. package/postinstall.js +124 -20
  24. package/public/android-chrome-192x192.png +0 -0
  25. package/public/android-chrome-512x512.png +0 -0
  26. package/public/apple-touch-icon.png +0 -0
  27. package/public/favicon-16x16.png +0 -0
  28. package/public/favicon-32x32.png +0 -0
  29. package/public/favicon.ico +0 -0
  30. package/public/img/logo_trans.png +0 -0
  31. package/public/img/necro_logo.png +0 -0
  32. package/public/manifest.json +16 -10
  33. package/public/reconnect-logo.png +0 -0
  34. package/run +176 -9
  35. package/src/App.vue +498 -85
  36. package/src/assets/css/base/reset.scss +43 -0
  37. package/src/assets/css/base/scroll.scss +114 -0
  38. package/src/assets/css/base/typography.scss +37 -0
  39. package/src/assets/css/components/buttons.scss +216 -0
  40. package/src/assets/css/components/forms.scss +221 -0
  41. package/src/assets/css/components/modals.scss +13 -0
  42. package/src/assets/css/components/tables.scss +27 -0
  43. package/src/assets/css/components/toasts.scss +100 -0
  44. package/src/assets/css/main.scss +202 -122
  45. package/src/assets/img/background.svg +2 -2
  46. package/src/assets/img/background.svg.backup +11 -0
  47. package/src/assets/img/logo_trans.png +0 -0
  48. package/src/components/Auth/LoginForm.vue +95 -11
  49. package/src/components/Editors/Account/Account.vue +116 -40
  50. package/src/components/Editors/Account/AccountCreator.vue +88 -39
  51. package/src/components/Editors/Account/AccountView.vue +102 -34
  52. package/src/components/Editors/Account/CreateAccount.vue +80 -32
  53. package/src/components/Editors/Profile/CreateProfile.vue +269 -83
  54. package/src/components/Editors/Profile/Profile.vue +132 -47
  55. package/src/components/Editors/Profile/ProfileCountryChooser.vue +82 -20
  56. package/src/components/Editors/Profile/ProfileView.vue +89 -32
  57. package/src/components/Editors/TagLabel.vue +67 -6
  58. package/src/components/Editors/TagToggle.vue +7 -2
  59. package/src/components/Filter/Filter.vue +288 -71
  60. package/src/components/Filter/FilterPreview.vue +202 -31
  61. package/src/components/Filter/PriceSortToggle.vue +76 -6
  62. package/src/components/Table/Header.vue +1 -1
  63. package/src/components/Table/Row.vue +1 -1
  64. package/src/components/Table/Table.vue +19 -2
  65. package/src/components/Tasks/CheckStock.vue +6 -8
  66. package/src/components/Tasks/Controls/DesktopControls.vue +27 -17
  67. package/src/components/Tasks/Controls/MobileControls.vue +8 -45
  68. package/src/components/Tasks/CreateTaskAXS.vue +80 -72
  69. package/src/components/Tasks/CreateTaskTM.vue +95 -141
  70. package/src/components/Tasks/MassEdit.vue +4 -6
  71. package/src/components/Tasks/QuickSettings.vue +199 -30
  72. package/src/components/Tasks/ScrapeVenue.vue +5 -6
  73. package/src/components/Tasks/Stats.vue +50 -24
  74. package/src/components/Tasks/Task.vue +384 -179
  75. package/src/components/Tasks/TaskLabel.vue +2 -2
  76. package/src/components/Tasks/TaskView.vue +136 -48
  77. package/src/components/Tasks/Utilities.vue +25 -10
  78. package/src/components/Tasks/ViewTask.vue +321 -0
  79. package/src/components/icons/Bag.vue +1 -1
  80. package/src/components/icons/Check.vue +5 -0
  81. package/src/components/icons/Close.vue +21 -0
  82. package/src/components/icons/CloseX.vue +5 -0
  83. package/src/components/icons/Eye.vue +6 -0
  84. package/src/components/icons/Key.vue +21 -0
  85. package/src/components/icons/Loyalty.vue +1 -1
  86. package/src/components/icons/Mail.vue +2 -2
  87. package/src/components/icons/Pencil.vue +21 -0
  88. package/src/components/icons/Play.vue +2 -2
  89. package/src/components/icons/Profile.vue +18 -0
  90. package/src/components/icons/Reload.vue +4 -5
  91. package/src/components/icons/Sandclock.vue +2 -2
  92. package/src/components/icons/Sell.vue +21 -0
  93. package/src/components/icons/Spinner.vue +42 -0
  94. package/src/components/icons/SquareCheck.vue +18 -0
  95. package/src/components/icons/SquareUncheck.vue +18 -0
  96. package/src/components/icons/Stadium.vue +1 -1
  97. package/src/components/icons/Wildcard.vue +18 -0
  98. package/src/components/icons/index.js +26 -1
  99. package/src/components/ui/Modal.vue +107 -13
  100. package/src/components/ui/Navbar.vue +175 -40
  101. package/src/components/ui/ReconnectIndicator.vue +351 -55
  102. package/src/components/ui/Splash.vue +5 -35
  103. package/src/components/ui/controls/CountryChooser.vue +200 -62
  104. package/src/components/ui/controls/atomic/Checkbox.vue +119 -10
  105. package/src/components/ui/controls/atomic/Dropdown.vue +216 -39
  106. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  107. package/src/components/ui/controls/atomic/MultiDropdown.vue +300 -37
  108. package/src/components/ui/controls/atomic/Switch.vue +53 -25
  109. package/src/composables/useClickOutside.js +21 -0
  110. package/src/composables/useDropdownPosition.js +174 -0
  111. package/src/libs/Filter.js +60 -24
  112. package/src/registerServiceWorker.js +1 -1
  113. package/src/stores/connection.js +4 -4
  114. package/src/stores/sampleData.js +172 -199
  115. package/src/stores/ui.js +55 -20
  116. package/src/stores/utils.js +30 -4
  117. package/src/types/index.js +41 -0
  118. package/src/utils/debug.js +1 -0
  119. package/src/views/Accounts.vue +116 -50
  120. package/src/views/Console.vue +394 -77
  121. package/src/views/Editor.vue +1176 -123
  122. package/src/views/FilterBuilder.vue +528 -250
  123. package/src/views/Login.vue +75 -14
  124. package/src/views/Profiles.vue +119 -34
  125. package/src/views/Tasks.vue +266 -98
  126. package/static/offline.html +192 -50
  127. package/switch-branch.sh +41 -0
  128. package/tailwind.config.js +119 -27
  129. package/vite.config.js +73 -16
  130. package/workbox-config.cjs +63 -0
  131. package/ICONS.md +0 -21
  132. package/public/img/background.svg +0 -14
  133. package/public/img/logo.png +0 -0
  134. package/public/img/logo_icon.png +0 -0
  135. package/public/img/logo_icon_2.png +0 -0
  136. package/src/assets/css/_input.scss +0 -143
  137. package/src/assets/img/logo.png +0 -0
  138. package/src/assets/img/logo_icon.png +0 -0
  139. package/src/assets/img/logo_icon_2.png +0 -0
  140. package/vue.config.js +0 -32
  141. package/workbox-config.js +0 -7
@@ -1,58 +1,229 @@
1
1
  <template>
2
2
  <Modal class="overflow-y-scroll max-w-screen">
3
- <template #header> Filter JSON data <FilterIcon class="ml-4" /> </template>
4
-
5
- <div class="max-h-80 overflow-auto hidden-scrollbars z-0 my-3">
6
- <CodeEditor
7
- v-model="text"
8
- width="100%"
9
- spellcheck="false"
10
- :hide_header="true"
11
- :language_selector="false"
12
- :languages="[['json', 'JSON']]"
13
- theme="dark"
14
- class=""
15
- ></CodeEditor>
16
- <p class="text-red-400 text-bold">{{ errorMessage }}</p>
3
+ <template #header>
4
+ Filter JSON data
5
+ <FilterIcon class="ml-4" />
6
+ </template>
7
+
8
+ <div class="my-3">
9
+ <div class="editor-container">
10
+ <div class="editor-wrapper">
11
+ <pre ref="codeDisplay" class="language-json code-highlight"></pre>
12
+ <textarea
13
+ ref="codeEditor"
14
+ v-model="text"
15
+ class="code-editor"
16
+ spellcheck="false"
17
+ @scroll="syncScroll"
18
+ @input="highlightCode"
19
+ @keydown.tab.prevent="handleTab"></textarea>
20
+ </div>
21
+ </div>
22
+ <p class="text-red-400 text-bold mt-2">{{ errorMessage }}</p>
17
23
  </div>
18
24
 
19
- <div class="ml-auto flex">
20
- <button
21
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2"
22
- @click="save()"
23
- >
24
- Apply
25
- </button>
26
-
27
- <button
28
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-2"
29
- @click="done()"
30
- >
31
- Close
32
- </button>
25
+ <div class="ml-auto flex gap-3 mt-3">
26
+ <button class="modal-btn save-btn" @click="save()">Apply</button>
27
+ <button class="modal-btn" @click="done()">Close</button>
33
28
  </div>
34
29
  </Modal>
35
30
  </template>
36
31
  <style lang="scss" scoped>
32
+ .modal-btn {
33
+ @apply rounded transition-all duration-150 flex items-center justify-center;
34
+ background: oklch(0.2046 0 0);
35
+ border: 2px solid oklch(0.2809 0 0);
36
+ color: oklch(0.90 0 0);
37
+ height: 2.5rem;
38
+ width: 6.5rem;
39
+ font-size: 0.75rem;
40
+ font-weight: 500;
41
+
42
+ &:hover {
43
+ border-color: oklch(0.72 0.15 145);
44
+ }
45
+
46
+ &:active, &:focus {
47
+ border-color: oklch(0.72 0.15 145);
48
+ outline: 1px solid oklch(0.72 0.15 145);
49
+ outline-offset: 0;
50
+ }
51
+
52
+ &.save-btn {
53
+ background-color: oklch(0.72 0.15 145 / 0.15);
54
+ border-color: oklch(0.72 0.15 145 / 0.5);
55
+
56
+ &:hover {
57
+ background-color: oklch(0.72 0.15 145 / 0.25);
58
+ border-color: oklch(0.72 0.15 145);
59
+ }
60
+ }
61
+ }
62
+
37
63
  .input-wrapper {
38
64
  label {
39
65
  @apply flex;
40
66
  }
41
67
  }
68
+
69
+ /* Prism.js syntax highlighting styles */
70
+ .editor-container {
71
+ position: relative;
72
+ min-height: 300px;
73
+ max-height: 500px;
74
+ border-radius: 8px;
75
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
76
+ overflow: hidden;
77
+ background-color: oklch(0.19 0 0);
78
+ }
79
+
80
+ .editor-wrapper {
81
+ position: relative;
82
+ width: 100%;
83
+ height: 100%;
84
+ min-height: 300px;
85
+ max-height: 500px;
86
+ }
87
+
88
+ .code-editor {
89
+ width: 100%;
90
+ height: 100%;
91
+ min-height: 300px;
92
+ max-height: 500px;
93
+ background-color: transparent;
94
+ /* Make text completely transparent */
95
+ color: rgba(0, 0, 0, 0);
96
+ caret-color: #e2e8f0;
97
+ font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
98
+ padding: 12px;
99
+ border: none;
100
+ resize: none;
101
+ font-size: 14px;
102
+ line-height: 1.6;
103
+ tab-size: 4;
104
+ outline: none;
105
+ border: 1px solid oklch(0.26 0 0);
106
+ border-radius: 8px;
107
+ z-index: 10;
108
+ position: absolute;
109
+ top: 0;
110
+ left: 0;
111
+ right: 0;
112
+ bottom: 0;
113
+ white-space: pre;
114
+ overflow: auto;
115
+ }
116
+
117
+ .code-highlight {
118
+ width: 100%;
119
+ height: 100%;
120
+ min-height: 300px;
121
+ max-height: 500px;
122
+ overflow: auto;
123
+ white-space: pre;
124
+ font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
125
+ font-size: 14px;
126
+ line-height: 1.6;
127
+ background-color: transparent !important;
128
+ pointer-events: none;
129
+ z-index: 5;
130
+ position: absolute;
131
+ top: 0;
132
+ left: 0;
133
+ right: 0;
134
+ bottom: 0;
135
+ padding: 12px;
136
+ margin: 0;
137
+ }
42
138
  </style>
43
139
  <script setup>
44
140
  import Modal from "@/components/ui/Modal.vue";
45
141
  import { FilterIcon } from "@/components/icons";
46
142
  import { useUIStore } from "@/stores/ui";
47
- import { ref, computed } from "vue";
48
- import CodeEditor from "simple-code-editor";
143
+ import { ref, computed, onMounted, nextTick } from "vue";
49
144
 
50
145
  const props = defineProps({
51
146
  filter: Object
52
147
  });
53
148
 
54
149
  const ui = useUIStore();
55
- const text = ref(JSON.stringify(props.filter.out(), null, "\t"));
150
+ const text = ref(JSON.stringify(props.filter.out(), null, 4));
151
+ const codeEditor = ref(null);
152
+ const codeDisplay = ref(null);
153
+
154
+ // Function to highlight code using Prism
155
+ const highlightCode = () => {
156
+ if (!codeDisplay.value || !codeEditor.value) return;
157
+
158
+ // Ensure Prism is available
159
+ if (typeof Prism === "undefined") {
160
+ console.error("Prism is not loaded");
161
+ return;
162
+ }
163
+
164
+ // Use requestAnimationFrame for smoother updates
165
+ requestAnimationFrame(() => {
166
+ try {
167
+ // Update the pre element with highlighted HTML
168
+ const highlighted = Prism.highlight(text.value || "", Prism.languages.json, "json");
169
+ codeDisplay.value.innerHTML = highlighted;
170
+ codeDisplay.value.className = "language-json code-highlight";
171
+ } catch (e) {
172
+ console.error("Highlight error:", e);
173
+ // Fallback to plain text if highlighting fails
174
+ codeDisplay.value.textContent = text.value || "";
175
+ }
176
+
177
+ // Ensure scroll positions are synced after highlighting
178
+ syncScroll();
179
+ });
180
+ };
181
+
182
+ // Function to sync scrolling between textarea and highlighted code
183
+ const syncScroll = () => {
184
+ if (!codeDisplay.value || !codeEditor.value) return;
185
+
186
+ // Synchronize scrolling between the textarea and the highlighted code
187
+ requestAnimationFrame(() => {
188
+ codeDisplay.value.scrollTop = codeEditor.value.scrollTop;
189
+ codeDisplay.value.scrollLeft = codeEditor.value.scrollLeft;
190
+ });
191
+ };
192
+
193
+ // Function to handle tab key press in the editor
194
+ const handleTab = (e) => {
195
+ const textarea = codeEditor.value;
196
+ const start = textarea.selectionStart;
197
+ const end = textarea.selectionEnd;
198
+
199
+ // Insert 4 spaces at cursor position
200
+ const spaces = " ";
201
+ text.value = text.value.substring(0, start) + spaces + text.value.substring(end);
202
+
203
+ // Move cursor position after the inserted tab
204
+ nextTick(() => {
205
+ textarea.selectionStart = textarea.selectionEnd = start + spaces.length;
206
+ highlightCode();
207
+ });
208
+ };
209
+
210
+ // Initialize syntax highlighting
211
+ onMounted(() => {
212
+ // Apply highlighting when the component is mounted
213
+ nextTick(() => {
214
+ highlightCode();
215
+
216
+ // Ensure scroll synchronization on initial load
217
+ if (codeEditor.value && codeDisplay.value) {
218
+ syncScroll();
219
+ }
220
+
221
+ // Focus the editor
222
+ if (codeEditor.value) {
223
+ codeEditor.value.focus();
224
+ }
225
+ });
226
+ });
56
227
 
57
228
  function done() {
58
229
  ui.toggleModal("");
@@ -1,16 +1,19 @@
1
1
  <template>
2
2
  <button
3
3
  @click="increase"
4
- :class="`w-full min-w-14 px-1 my-2 ${
5
- props.darker ? 'bg-dark-500 text-white h-10 rounded-lg' : 'bg-dark-550 text-gray h-8 rounded'
6
- } overflow-hidden`"
4
+ :class="[
5
+ 'sort-toggle',
6
+ { 'darker': props.darker }
7
+ ]"
7
8
  >
8
- {{ sortOptions[currentOpt] }}
9
+ <component :is="getCurrentIcon()" class="icon" />
10
+ <span class="text">{{ getCurrentText() }}</span>
9
11
  </button>
10
12
  </template>
11
13
 
12
14
  <script setup>
13
15
  import { ref } from "vue";
16
+ import { UpIcon, DownIcon, FilterIcon, CheckIcon, CloseIcon } from "@/components/icons";
14
17
 
15
18
  let sortOptions = ref(["none", "asc", "desc", "none"]);
16
19
  const currentOpt = ref(0);
@@ -24,14 +27,81 @@ const props = defineProps({
24
27
  current: String,
25
28
  darker: Boolean
26
29
  });
30
+
27
31
  if (props.options) sortOptions.value = props.options;
28
32
  if (props.current) currentOpt.value = sortOptions.value.findIndex((s) => s === props.current);
29
33
 
30
34
  const emit = defineEmits(["change"]);
31
35
 
32
36
  const increase = () => {
33
- currentOpt.value++;
37
+ currentOpt.value = (currentOpt.value + 1) % sortOptions.value.length;
34
38
  emit("change", sortOptions.value[currentOpt.value]);
35
- if (currentOpt.value === (props.options ? sortOptions.value.length : 3)) currentOpt.value = 0;
39
+ };
40
+
41
+ const getCurrentIcon = () => {
42
+ const current = sortOptions.value[currentOpt.value];
43
+
44
+ // Handle filter options (All, WL, BL)
45
+ if (props.options && props.options.includes('All')) {
46
+ switch (current) {
47
+ case 'All': return FilterIcon;
48
+ case 'WL': return CheckIcon;
49
+ case 'BL': return CloseIcon;
50
+ default: return FilterIcon;
51
+ }
52
+ }
53
+
54
+ // Handle sort options (none, asc, desc)
55
+ switch (current) {
56
+ case 'asc': return UpIcon;
57
+ case 'desc': return DownIcon;
58
+ case 'none':
59
+ default: return FilterIcon;
60
+ }
61
+ };
62
+
63
+ const getCurrentText = () => {
64
+ const current = sortOptions.value[currentOpt.value];
65
+
66
+ // Handle filter options (All, WL, BL)
67
+ if (props.options && props.options.includes('All')) {
68
+ return current;
69
+ }
70
+
71
+ // Handle sort options
72
+ switch (current) {
73
+ case 'asc': return 'Low';
74
+ case 'desc': return 'High';
75
+ case 'none': return 'None';
76
+ default: return current;
77
+ }
36
78
  };
37
79
  </script>
80
+
81
+ <style scoped>
82
+ .sort-toggle {
83
+ @apply flex items-center gap-2 px-3 py-2 rounded text-sm font-medium focus:outline-none;
84
+ background: oklch(0.2603 0 0);
85
+ border: 2px solid oklch(0.2809 0 0);
86
+ color: oklch(0.90 0 0);
87
+ min-width: 80px;
88
+ height: 40px;
89
+ }
90
+
91
+ .sort-toggle.darker {
92
+ background: oklch(0.2046 0 0);
93
+ border: 2px solid oklch(0.2809 0 0);
94
+ color: oklch(0.90 0 0);
95
+ min-width: 100px;
96
+ height: 40px;
97
+ padding: 0 0.75rem;
98
+ }
99
+
100
+ .icon {
101
+ @apply w-4 h-4 flex-shrink-0;
102
+ }
103
+
104
+ .text {
105
+ @apply text-center flex-1;
106
+ }
107
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="border-b-2 border-border w-full px-4 text-white text-xs py-4 grid grid-cols-12">
2
+ <div class="border-b border-dark-600 w-full px-2 md:px-4 text-white text-xs py-4 grid items-center bg-dark-300">
3
3
  <slot />
4
4
  </div>
5
5
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="px-4 text-xs grid grid-cols-12 text-white py-4 items-center h-full">
2
+ <div class="px-2 md:px-4 text-xs grid text-white py-4 items-center h-full hover:bg-dark-500 transition-colors">
3
3
  <slot />
4
4
  </div>
5
5
  </template>
@@ -5,10 +5,27 @@
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-dark-600 bg-dark-500;
9
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
10
+ overflow: auto !important;
11
+ overscroll-behavior: auto !important;
12
+ touch-action: auto !important;
13
+ max-height: calc(100vh - 200px);
9
14
  }
10
15
 
11
16
  .table-component > .grid {
12
- @apply bg-dark-500;
17
+ @apply bg-dark-400;
18
+ border-bottom: 1px solid oklch(0.26 0 0);
19
+ }
20
+
21
+ /* iPhone landscape mode table optimization */
22
+ @media screen and (max-height: 500px) and (orientation: landscape) {
23
+ .table-component {
24
+ max-height: calc(100vh - 160px) !important; // Leave even more space at bottom
25
+ width: 100% !important;
26
+ overflow-x: auto !important; // Allow horizontal scrolling if needed
27
+ overflow-y: auto !important; // Allow vertical scrolling
28
+ margin-bottom: 2rem !important; // Increase bottom margin for better spacing
29
+ }
13
30
  }
14
31
  </style>
@@ -4,16 +4,14 @@
4
4
  <!-- Event ID -->
5
5
  <div class="input-wrapper mt-7 mb-4">
6
6
  <label class="label-override mb-2">Event ID or URL <StadiumIcon /></label>
7
- <div class="input-default flex items-center">
7
+ <div class="input-default required">
8
8
  <input
9
9
  :placeholder="!isEU(ui.currentCountry.siteId) ? '102PDA9125510GYU' : '529171'"
10
10
  v-model="eventId"
11
- class="flex-grow"
12
11
  />
13
- <span class="text-red-400 text-lg absolute right-3 top-1/2 transform -translate-y-1/2">*</span>
14
12
  </div>
15
13
  </div>
16
- <!-- Ticker Quantity -->
14
+ <!-- Presale Code -->
17
15
  <div class="input-wrapper mb-4">
18
16
  <label class="label-override mb-2">Presale code <AwardIcon /></label>
19
17
  <div class="input-default">
@@ -35,10 +33,10 @@
35
33
  </div>
36
34
  </div>
37
35
  <button
38
- class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-auto"
39
- @click="done()"
40
- >
41
- Check Stock <BoxIcon />
36
+ class="button-default ml-auto mt-4 flex w-48 items-center justify-center gap-x-2 bg-dark-400 text-xs"
37
+ @click="done()">
38
+ Check Stock
39
+ <BoxIcon />
42
40
  </button>
43
41
  </Modal>
44
42
  </template>
@@ -1,29 +1,21 @@
1
1
  <template>
2
- <div class="task-controls flex-row" v-once>
2
+ <div class="task-controls flex-row">
3
3
  <div class="control-buttons mb-4 xl:mb-0">
4
- <button @click="$emit('startAll')" class="bg-green-400 smooth-hover flex-grow xl:flex-initial">
4
+ <button @click="$emit('startAll')" class="bg-green-400 smooth-hover responsive-button border-none">
5
5
  Start <PlayIcon />
6
6
  </button>
7
- <button @click="$emit('stopAll')" class="bg-red-400 smooth-hover flex-grow xl:flex-initial">
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 flex-grow xl:flex-initial">
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
- <h4 class="text-light-300text-sm flex-grow xl:flex-initial"></h4>
13
+ <h4 class="text-light-300 text-sm flex-grow xl:flex-initial"></h4>
14
14
  </div>
15
15
  <div class="flex gap-x-3">
16
- <button @click="$emit('expand')" class="bg-dark-400 smooth-hover flex-grow xl:flex-initial">
17
- Expand
18
- <ExpandIcon class="ml-2" />
19
- </button>
20
- <button @click="$emit('fold')" class="bg-dark-400 smooth-hover flex-grow xl:flex-initial">
21
- Fold
22
- <ShrinkIcon class="ml-2" />
23
- </button>
24
16
  <button
25
17
  :disabled="ui.disabledButtons['add-tasks']"
26
- class="bg-dark-400 disabled:opacity-70 smooth-hover flex-grow xl:flex-initial w-36"
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"
27
19
  @click="ui.toggleModal('create-task')"
28
20
  >
29
21
  Create Task
@@ -31,7 +23,7 @@
31
23
  </button>
32
24
 
33
25
  <button
34
- class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36"
26
+ class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36 border border-dark-650 hover:border-dark-700"
35
27
  @click="ui.toggleModal('mass-edit-presale-code')"
36
28
  :disabled="ui.disabledButtons['mass-edit']"
37
29
  v-if="ui.currentModule == 'TM'"
@@ -53,7 +45,25 @@ const isExpanded = ref(false);
53
45
  <style lang="scss" scoped>
54
46
  button {
55
47
  @apply text-white h-10 rounded-md text-xs flex items-center justify-center font-medium px-4;
48
+ transition: all 0.15s ease;
49
+
50
+ &.bg-dark-400:active, &.bg-dark-400:focus {
51
+ outline: 1px solid oklch(0.72 0.15 145);
52
+ outline-offset: 0;
53
+ border-color: oklch(0.72 0.15 145) !important;
54
+ }
56
55
  }
56
+
57
+ .responsive-button {
58
+ min-width: 80px;
59
+ max-width: 120px;
60
+ @apply flex-grow xl:flex-initial;
61
+
62
+ @media (max-width: 768px) {
63
+ @apply h-10 text-xs;
64
+ }
65
+ }
66
+
57
67
  .task-controls {
58
68
  @apply gap-x-3;
59
69
  .control-buttons {
@@ -65,9 +75,9 @@ button {
65
75
  }
66
76
  }
67
77
  .expand-shrink {
68
- @apply flex border border-dark-400 rounded-md;
78
+ @apply flex gap-x-2;
69
79
  button {
70
- @apply text-white text-xs px-4 flex items-center justify-center gap-x-4 duration-200;
80
+ @apply text-white text-xs px-4 flex items-center justify-center gap-x-4 duration-200 border border-light-300 hover:border-light-400;
71
81
  }
72
82
  }
73
83
  }
@@ -1,27 +1,11 @@
1
1
  <template>
2
- <div class="mobile-controls grow items-center" v-once>
3
- <div>
4
- <ul class="mobile-icons">
5
- <li>
6
- <button @click="$emit('startAll')"><PlayIcon /></button>
7
- </li>
8
- <li>
9
- <button @click="$emit('stopAll')"><PauseIcon /></button>
10
- </li>
11
-
12
- <li>
13
- <button @click="ui.toggleModal('mass-edit-presale-code')">
14
- <EditIcon />
15
- </button>
16
- </li>
17
- </ul>
18
- </div>
2
+ <div class="mobile-controls flex items-center justify-between" v-once>
19
3
  <div class="expand-shrink">
20
- <button class="rounded-md flex-1 bg-dark-400 xl:flex-auto" @click="$emit('expand')">
4
+ <button class="mobile-btn" @click="$emit('expand')">
21
5
  Expand
22
6
  <ExpandIcon />
23
7
  </button>
24
- <button class="rounded-md flex-1 bg-dark-400 xl:flex-auto" @click="$emit('fold')">
8
+ <button class="mobile-btn" @click="$emit('fold')">
25
9
  Fold
26
10
  <ShrinkIcon />
27
11
  </button>
@@ -36,33 +20,12 @@ const ui = useUIStore();
36
20
  </script>
37
21
  <style lang="scss" scoped>
38
22
  .mobile-controls {
39
- @apply gap-x-4;
40
23
  .expand-shrink {
41
- @apply flex ml-auto gap-x-2;
42
- button {
43
- width: 140px;
44
- @apply text-white text-xs px-4 flex items-center justify-center gap-x-2 duration-200 h-9;
45
- }
46
- }
47
- ul {
48
- @apply items-center gap-x-2;
49
- li {
50
- @apply text-white;
51
- }
52
- svg {
53
- width: 15px;
54
- height: 15px;
55
- }
56
- }
57
- }
58
- @media (max-width: 1024px) {
59
- .mobile-controls {
60
- .expand-shrink {
61
- button {
62
- width: 100px;
63
- font-size: 12px !important;
64
- @apply gap-x-2 px-0;
65
- }
24
+ @apply flex gap-x-2;
25
+ .mobile-btn {
26
+ @apply text-white text-xs px-3 flex items-center justify-center gap-x-1 h-10 rounded-md bg-dark-400 border border-dark-650 hover:border-dark-700 transition-all duration-150 font-medium;
27
+ width: 80px;
28
+ font-size: 11px;
66
29
  }
67
30
  }
68
31
  }