@necrolab/dashboard 0.4.61 → 0.4.208

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 (133) hide show
  1. package/.prettierrc +1 -27
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +79 -43
  4. package/backend/api.js +48 -40
  5. package/backend/auth.js +3 -3
  6. package/backend/batching.js +1 -1
  7. package/backend/endpoints.js +77 -13
  8. package/backend/index.js +2 -2
  9. package/backend/mock-data.js +38 -29
  10. package/backend/mock-src/classes/logger.js +8 -8
  11. package/backend/mock-src/classes/utils.js +3 -7
  12. package/backend/mock-src/database.js +0 -0
  13. package/backend/mock-src/ticketmaster.js +79 -79
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +3 -2
  16. package/config/filter.json +3 -2
  17. package/index.html +10 -81
  18. package/index.js +1 -1
  19. package/package.json +25 -40
  20. package/postcss.config.js +1 -1
  21. package/postinstall.js +17 -98
  22. package/public/android-chrome-192x192.png +0 -0
  23. package/public/android-chrome-512x512.png +0 -0
  24. package/public/apple-touch-icon.png +0 -0
  25. package/public/favicon-16x16.png +0 -0
  26. package/public/favicon-32x32.png +0 -0
  27. package/public/favicon.ico +0 -0
  28. package/public/manifest.json +7 -12
  29. package/public/sw.js +2 -0
  30. package/public/workbox-49fdaf31.js +2 -0
  31. package/public/workbox-49fdaf31.js.map +1 -0
  32. package/public/workbox-88575b92.js +2 -0
  33. package/public/workbox-88575b92.js.map +1 -0
  34. package/public/workbox-a67a7b11.js +2 -0
  35. package/public/workbox-a67a7b11.js.map +1 -0
  36. package/public/workbox-d4314735.js +2 -0
  37. package/public/workbox-d4314735.js.map +1 -0
  38. package/public/workbox-e0f89ef3.js +2 -0
  39. package/public/workbox-e0f89ef3.js.map +1 -0
  40. package/run +9 -176
  41. package/src/App.vue +85 -498
  42. package/src/assets/css/_input.scss +99 -144
  43. package/src/assets/css/main.scss +99 -450
  44. package/src/assets/img/background.svg +2 -2
  45. package/src/assets/img/logo_icon.png +0 -0
  46. package/src/components/Auth/LoginForm.vue +11 -62
  47. package/src/components/Editors/Account/Account.vue +40 -116
  48. package/src/components/Editors/Account/AccountCreator.vue +39 -88
  49. package/src/components/Editors/Account/AccountView.vue +34 -102
  50. package/src/components/Editors/Account/CreateAccount.vue +32 -80
  51. package/src/components/Editors/Profile/CreateProfile.vue +83 -269
  52. package/src/components/Editors/Profile/Profile.vue +47 -132
  53. package/src/components/Editors/Profile/ProfileCountryChooser.vue +20 -82
  54. package/src/components/Editors/Profile/ProfileView.vue +34 -91
  55. package/src/components/Editors/TagLabel.vue +6 -67
  56. package/src/components/Filter/Filter.vue +72 -289
  57. package/src/components/Filter/FilterPreview.vue +30 -171
  58. package/src/components/Filter/PriceSortToggle.vue +4 -74
  59. package/src/components/Table/Header.vue +1 -1
  60. package/src/components/Table/Row.vue +1 -1
  61. package/src/components/Table/Table.vue +2 -19
  62. package/src/components/Tasks/CheckStock.vue +13 -28
  63. package/src/components/Tasks/Controls/DesktopControls.vue +17 -17
  64. package/src/components/Tasks/Controls/MobileControls.vue +45 -8
  65. package/src/components/Tasks/CreateTaskAXS.vue +73 -79
  66. package/src/components/Tasks/CreateTaskTM.vue +142 -94
  67. package/src/components/Tasks/MassEdit.vue +7 -9
  68. package/src/components/Tasks/QuickSettings.vue +55 -169
  69. package/src/components/Tasks/ScrapeVenue.vue +4 -7
  70. package/src/components/Tasks/Stats.vue +23 -52
  71. package/src/components/Tasks/Task.vue +136 -378
  72. package/src/components/Tasks/TaskView.vue +47 -107
  73. package/src/components/Tasks/Utilities.vue +6 -5
  74. package/src/components/icons/Bag.vue +1 -1
  75. package/src/components/icons/Loyalty.vue +1 -1
  76. package/src/components/icons/Mail.vue +2 -2
  77. package/src/components/icons/Play.vue +2 -2
  78. package/src/components/icons/Reload.vue +5 -4
  79. package/src/components/icons/Sandclock.vue +2 -2
  80. package/src/components/icons/Stadium.vue +1 -1
  81. package/src/components/icons/index.js +1 -24
  82. package/src/components/ui/Modal.vue +13 -105
  83. package/src/components/ui/Navbar.vue +38 -171
  84. package/src/components/ui/ReconnectIndicator.vue +55 -351
  85. package/src/components/ui/Splash.vue +35 -5
  86. package/src/components/ui/controls/CountryChooser.vue +62 -200
  87. package/src/components/ui/controls/atomic/Checkbox.vue +10 -119
  88. package/src/components/ui/controls/atomic/Dropdown.vue +39 -208
  89. package/src/components/ui/controls/atomic/MultiDropdown.vue +37 -300
  90. package/src/libs/Filter.js +170 -200
  91. package/src/registerServiceWorker.js +1 -1
  92. package/src/stores/connection.js +53 -51
  93. package/src/stores/logger.js +3 -11
  94. package/src/stores/sampleData.js +235 -207
  95. package/src/stores/ui.js +44 -112
  96. package/src/stores/utils.js +6 -90
  97. package/src/views/Accounts.vue +35 -44
  98. package/src/views/Console.vue +90 -341
  99. package/src/views/Editor.vue +123 -1176
  100. package/src/views/FilterBuilder.vue +251 -607
  101. package/src/views/Login.vue +14 -76
  102. package/src/views/Profiles.vue +25 -44
  103. package/src/views/Tasks.vue +100 -187
  104. package/static/offline.html +50 -192
  105. package/tailwind.config.js +26 -104
  106. package/vite.config.js +16 -73
  107. package/vue.config.js +32 -0
  108. package/workbox-config.js +11 -0
  109. package/artwork/image.png +0 -0
  110. package/dev-server.js +0 -136
  111. package/exit +0 -209
  112. package/jsconfig.json +0 -16
  113. package/src/assets/css/_utilities.scss +0 -388
  114. package/src/assets/img/background.svg.backup +0 -11
  115. package/src/components/icons/Check.vue +0 -5
  116. package/src/components/icons/Close.vue +0 -21
  117. package/src/components/icons/CloseX.vue +0 -5
  118. package/src/components/icons/Key.vue +0 -21
  119. package/src/components/icons/Pencil.vue +0 -21
  120. package/src/components/icons/Profile.vue +0 -18
  121. package/src/components/icons/Sell.vue +0 -21
  122. package/src/components/icons/Spinner.vue +0 -42
  123. package/src/components/icons/SquareCheck.vue +0 -18
  124. package/src/components/icons/SquareUncheck.vue +0 -18
  125. package/src/components/icons/Wildcard.vue +0 -18
  126. package/src/components/ui/controls/atomic/LoadingButton.vue +0 -45
  127. package/src/composables/useClickOutside.js +0 -21
  128. package/src/composables/useDropdownPosition.js +0 -174
  129. package/src/types/index.js +0 -41
  130. package/src/utils/debug.js +0 -1
  131. package/switch-branch.sh +0 -41
  132. package/workbox-config.cjs +0 -63
  133. /package/src/assets/img/{logo_icon-old.png → logo_icon_2.png} +0 -0
@@ -4,37 +4,37 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
6
6
  <title>Site Offline</title>
7
- <meta name="theme-color" content="#0f1012" />
7
+ <meta name="theme-color" content="rgba(28, 28, 49, 1)" />
8
8
  <style>
9
- :root {
10
- --bg-primary: #0f1012;
11
- --bg-secondary: #1a1b1e;
12
- --bg-tertiary: #2e2f34;
13
- --text-primary: #ffffff;
14
- --text-secondary: #9ca3af;
15
- --accent: #ef4444;
16
- --border: #1f2937;
17
- --glow: rgba(239, 68, 68, 0.15);
18
- }
19
-
20
9
  body,
21
10
  html {
22
11
  margin: 0;
23
12
  padding: 0;
24
13
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
25
- background-color: var(--bg-primary);
26
- color: var(--text-primary);
14
+ background-color: rgba(28, 28, 49, 1);
15
+ color: #fff;
27
16
  height: 100%;
17
+ }
18
+
19
+ html,
20
+ body {
21
+ /* Prevent scrolling on both axes */
28
22
  overflow: hidden;
29
23
  position: fixed;
30
24
  width: 100%;
31
25
  height: 100%;
26
+
27
+ /* Prevent touch actions except for buttons */
32
28
  touch-action: none;
33
29
  -ms-touch-action: none;
30
+
31
+ /* Prevent text selection */
34
32
  -webkit-user-select: none;
35
33
  -moz-user-select: none;
36
34
  -ms-user-select: none;
37
35
  user-select: none;
36
+
37
+ /* Prevent pinch zoom */
38
38
  -webkit-touch-callout: none;
39
39
  -webkit-text-size-adjust: none;
40
40
  }
@@ -44,220 +44,73 @@
44
44
  justify-content: center;
45
45
  align-items: center;
46
46
  min-height: 100vh;
47
- background: radial-gradient(circle at center, var(--bg-secondary) 0%, var(--bg-primary) 100%);
48
- position: relative;
49
47
  }
50
-
51
- .container::before {
52
- content: "";
53
- position: absolute;
54
- top: 0;
55
- left: 0;
56
- right: 0;
57
- bottom: 0;
58
- background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%231a1b1e' fill-opacity='0.4'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
59
- opacity: 0.1;
60
- }
61
-
62
48
  .error-card {
63
- background-color: var(--bg-secondary);
64
- border: 1px solid var(--border);
65
- border-radius: 1rem;
66
- padding: 2.5rem;
67
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
49
+ background-color: rgba(39, 39, 67, 0.4);
50
+ border-radius: 0.5rem;
51
+ padding: 2rem;
52
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
68
53
  text-align: center;
69
- max-width: 24rem;
54
+ max-width: 20rem;
70
55
  width: 100%;
71
56
  margin: auto;
72
- animation: slideUp 0.5s ease-out;
73
- position: relative;
74
- overflow: hidden;
75
- backdrop-filter: blur(10px);
76
57
  }
77
-
78
- .error-card::before {
79
- content: "";
80
- position: absolute;
81
- top: 0;
82
- left: 0;
83
- right: 0;
84
- height: 1px;
85
- background: linear-gradient(90deg, transparent, var(--accent), transparent);
86
- opacity: 0.5;
87
- }
88
-
89
- .error-card::after {
90
- content: "";
91
- position: absolute;
92
- inset: 0;
93
- border-radius: 1rem;
94
- padding: 1px;
95
- background: linear-gradient(135deg, var(--accent), transparent);
96
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
97
- mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
98
- -webkit-mask-composite: xor;
99
- mask-composite: exclude;
100
- pointer-events: none;
101
- }
102
-
103
58
  .icon-wrapper {
104
- background-color: var(--bg-tertiary);
105
- width: 5rem;
106
- height: 5rem;
59
+ background-color: #4a4a61;
60
+ width: 4rem;
61
+ height: 4rem;
107
62
  border-radius: 50%;
108
63
  display: flex;
109
64
  justify-content: center;
110
65
  align-items: center;
111
- margin: 0 auto 1.5rem;
112
- font-size: 2.5rem;
113
- color: var(--accent);
114
- position: relative;
115
- animation: pulse 2s infinite;
116
- box-shadow: 0 0 20px var(--glow);
117
- }
118
-
119
- .icon-wrapper::after {
120
- content: "";
121
- position: absolute;
122
- width: 100%;
123
- height: 100%;
124
- border-radius: 50%;
125
- border: 1px solid var(--accent);
126
- opacity: 0.3;
127
- animation: ripple 2s infinite;
66
+ margin: 0 auto 1rem;
67
+ font-size: 2rem;
68
+ color: #ee8282;
128
69
  }
129
-
130
70
  h1 {
131
- font-size: 1.75rem;
132
- font-weight: 600;
133
- margin-bottom: 0.75rem;
134
- background: linear-gradient(90deg, var(--text-primary), var(--text-secondary));
135
- -webkit-background-clip: text;
136
- -webkit-text-fill-color: transparent;
137
- text-shadow: 0 0 20px var(--glow);
71
+ font-size: 1.5rem;
72
+ margin-bottom: 0.5rem;
138
73
  }
139
-
140
74
  p {
141
- color: var(--text-secondary);
142
- margin-bottom: 2rem;
143
- font-size: 1.1rem;
144
- line-height: 1.5;
75
+ color: rgba(255, 255, 255, 0.7);
76
+ margin-bottom: 1.5rem;
145
77
  }
146
-
147
78
  .refresh-button {
148
- background-color: var(--bg-tertiary);
149
- color: var(--text-primary);
79
+ background-color: #4a4a61;
80
+ color: white;
150
81
  border: none;
151
- padding: 0.75rem 1.5rem;
152
- border-radius: 0.5rem;
82
+ padding: 0.5rem 1rem;
83
+ border-radius: 0.25rem;
153
84
  font-size: 1rem;
154
- font-weight: 500;
155
85
  cursor: pointer;
156
- transition: all 0.3s ease;
86
+ transition: background-color 0.3s ease;
87
+ /* Enable touch actions specifically for the button */
157
88
  touch-action: manipulation;
158
89
  -webkit-tap-highlight-color: transparent;
159
- position: relative;
160
- overflow: hidden;
161
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
162
- }
163
-
164
- .refresh-button::before {
165
- content: "";
166
- position: absolute;
167
- top: 0;
168
- left: 0;
169
- width: 100%;
170
- height: 100%;
171
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
172
- transform: translateX(-100%);
90
+ touch-action: auto;
91
+ -webkit-touch-callout: none;
92
+ cursor: pointer;
173
93
  }
174
-
175
94
  .refresh-button:hover {
176
- background-color: var(--bg-tertiary);
177
- transform: translateY(-1px);
178
- box-shadow: 0 0 15px var(--glow);
95
+ background-color: rgba(255, 255, 255, 0.2);
179
96
  }
180
-
181
- .refresh-button:hover::before {
182
- transform: translateX(100%);
183
- transition: transform 0.6s ease;
184
- }
185
-
186
97
  .refresh-button:focus {
187
98
  outline: none;
188
- box-shadow: 0 0 0 3px var(--glow);
99
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.3);
189
100
  }
190
-
101
+ /* Add active state for better touch feedback */
191
102
  .refresh-button:active {
192
- transform: translateY(1px);
193
- background-color: var(--bg-tertiary);
194
- }
195
-
196
- @keyframes slideUp {
197
- from {
198
- opacity: 0;
199
- transform: translateY(20px);
200
- }
201
- to {
202
- opacity: 1;
203
- transform: translateY(0);
204
- }
205
- }
206
-
207
- @keyframes pulse {
208
- 0% {
209
- transform: scale(1);
210
- box-shadow: 0 0 20px var(--glow);
211
- }
212
- 50% {
213
- transform: scale(1.05);
214
- box-shadow: 0 0 30px var(--glow);
215
- }
216
- 100% {
217
- transform: scale(1);
218
- box-shadow: 0 0 20px var(--glow);
219
- }
220
- }
221
-
222
- @keyframes ripple {
223
- 0% {
224
- transform: scale(1);
225
- opacity: 0.3;
226
- }
227
- 100% {
228
- transform: scale(1.5);
229
- opacity: 0;
230
- }
231
- }
232
-
233
- @media (max-width: 640px) {
234
- .error-card {
235
- margin: 1rem;
236
- padding: 1.5rem;
237
- }
238
-
239
- .icon-wrapper {
240
- width: 4rem;
241
- height: 4rem;
242
- font-size: 2rem;
243
- }
244
-
245
- h1 {
246
- font-size: 1.5rem;
247
- }
248
-
249
- p {
250
- font-size: 1rem;
251
- }
103
+ background-color: rgba(255, 255, 255, 0.3);
104
+ transform: scale(0.98);
252
105
  }
253
106
  </style>
254
107
  </head>
255
108
  <body>
256
109
  <div class="container">
257
110
  <div class="error-card">
258
- <div class="icon-wrapper">⚠️</div>
111
+ <div class="icon-wrapper"><span style="margin-bottom: 0.2rem">&#9888;</span></div>
259
112
  <h1>Site Offline</h1>
260
- <p>We're experiencing technical difficulties. Please try again in a moment.</p>
113
+ <p>We're down. Please try again.</p>
261
114
  <button class="refresh-button" id="refreshButton">Refresh Page</button>
262
115
  </div>
263
116
  </div>
@@ -265,10 +118,12 @@
265
118
  document.addEventListener("DOMContentLoaded", function () {
266
119
  const button = document.getElementById("refreshButton");
267
120
 
121
+ // Handle button click/touch
268
122
  button.addEventListener("click", function (e) {
269
123
  window.location.reload();
270
124
  });
271
125
 
126
+ // Prevent zoom and scroll on the page but allow button interaction
272
127
  document.addEventListener(
273
128
  "touchstart",
274
129
  function (e) {
@@ -297,10 +152,12 @@
297
152
  { passive: false }
298
153
  );
299
154
 
155
+ // Prevent zoom via gesture
300
156
  document.addEventListener("gesturestart", function (e) {
301
157
  e.preventDefault();
302
158
  });
303
159
 
160
+ // Prevent zoom via mousewheel/trackpad
304
161
  document.addEventListener(
305
162
  "wheel",
306
163
  function (e) {
@@ -311,6 +168,7 @@
311
168
  { passive: false }
312
169
  );
313
170
 
171
+ // Prevent double-tap zoom
314
172
  let lastTap = 0;
315
173
  document.addEventListener("touchend", function (e) {
316
174
  const currentTime = new Date().getTime();
@@ -1,126 +1,48 @@
1
1
  /** @type {import('tailwindcss').Config} */
2
- export default {
2
+ module.exports = {
3
3
  content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
4
4
  theme: {
5
5
  colors: {
6
- transparent: "transparent",
7
- white: "#ffffff",
8
- pure: "#ffffff",
6
+ white: "#FFFFFF",
9
7
  lightgray: "#e5e7eb",
10
8
  green: {
11
- 300: "#4ade80",
12
- 400: "#22c55e",
13
- 500: "#16a34a"
9
+ 400: "#44b744"
14
10
  },
15
11
  red: {
16
- 300: "#f87171",
17
- 400: "#ef4444",
18
- 500: "#dc2626"
19
- },
20
- blue: {
21
- 300: "#60a5fa",
22
- 400: "#3b82f6",
23
- 500: "#2563eb"
24
- },
25
- yellow: {
26
- 300: "#fbbf24",
27
- 400: "#f59e0b",
28
- 500: "#d97706"
12
+ 400: "#EE8282"
29
13
  },
30
14
  dark: {
31
- 50: "#f8fafc",
32
- 100: "#f1f5f9",
33
- 200: "#e2e8f0",
34
- 300: "#1a1b1e", // Deep charcoal base
35
- 400: "#242529", // Card backgrounds
36
- 500: "#2e2f34", // Input backgrounds
37
- 550: "#35363c", // Subtle elevation
38
- 600: "#3d3e44", // Borders
39
- 650: "#44454b", // Hover states
40
- 700: "#4b4c53", // Active states
41
- 750: "#52535a", // Selected states
42
- 800: "#13141a", // Deep background
43
- 850: "#0d0e14", // Deepest background
44
- 900: "#06070d" // Ultra deep
15
+ 300: "#1B1C2B",
16
+ 400: "#2D2F4A",
17
+ 500: "#202036",
18
+ 550: "#292a43",
19
+ 600: "#25263c"
45
20
  },
46
21
  light: {
47
- 100: "#f6f8fa",
48
- 200: "#e1e4e8",
49
- 300: "#e2e2e5", // Primary text
50
- 400: "#d0d0d3", // Secondary text
51
- 500: "#a0a0a6", // Muted text
52
- 600: "#71717a", // Disabled text
53
- 700: "#57575f", // Very muted
54
- 800: "#3e3e46", // Dark muted
55
- 900: "#27272d" // Darkest muted
56
- },
57
- gray: {
58
- 50: "#f9fafb",
59
- 100: "#f3f4f6",
60
- 200: "#e5e7eb",
61
- 300: "#d1d5db",
62
- 400: "#9ca3af",
63
- 500: "#6b7280",
64
- 600: "#4b5563",
65
- 700: "#374151",
66
- 800: "#1f2937",
67
- 900: "#111827"
22
+ 300: "#4A4A61",
23
+ 400: "#A7A8AF"
68
24
  },
69
- accent: {
70
- blue: "#6b7a9a",
71
- purple: "#b794c0",
72
- pink: "#d16d9e",
73
- orange: "#d4976e",
74
- yellow: "#e6d192",
75
- green: "#88c999"
76
- },
77
- border: "#3d3e44"
25
+ border: "#29293F"
78
26
  },
79
27
  screens: {
80
- // Mobile first approach
81
- xs: "480px", // Small mobile landscape / large mobile portrait
82
- sm: "640px", // Tablet portrait
83
- md: "768px", // Tablet landscape / small desktop
84
- lg: "1024px", // Desktop
85
- xl: "1280px", // Large desktop
28
+ xs: "500px",
29
+ sm: "640px",
30
+ // => @media (min-width: 640px) { ... }
86
31
 
87
- // Device-specific breakpoints
88
- tablet: "768px", // Tablet-specific styling
89
- desktop: "1024px", // Desktop-specific styling
32
+ md: "768px",
33
+ // => @media (min-width: 768px) { ... }
90
34
 
91
- // Orientation-based breakpoints
92
- landscape: {
93
- raw: "(orientation: landscape)"
94
- },
95
- portrait: {
96
- raw: "(orientation: portrait)"
97
- },
35
+ ipadlg: "1000px",
36
+ lg: "1030px",
37
+ // => @media (min-width: 1024px) { ... }
98
38
 
99
- // Height-based breakpoints for better mobile experience
100
- "h-sm": {
101
- raw: "(max-height: 500px)"
102
- },
103
- "h-md": {
104
- raw: "(min-height: 600px)"
105
- },
106
- "h-lg": {
107
- raw: "(min-height: 900px)"
108
- },
109
-
110
- // Combined orientation and size breakpoints
111
- "mobile-landscape": {
112
- raw: "(max-width: 896px) and (orientation: landscape) and (max-height: 500px)"
113
- },
114
- "mobile-portrait": {
115
- raw: "(max-width: 480px) and (orientation: portrait)"
116
- },
39
+ xl: "1280px",
40
+ // => @media (min-width: 1280px) { ... }
117
41
 
118
- // Touch device detection
119
- touch: {
120
- raw: "(hover: none) and (pointer: coarse)"
121
- },
122
- "no-touch": {
123
- raw: "(hover: hover) and (pointer: fine)"
42
+ "2xl": "1536px",
43
+ // => @media (min-width: 1536px) { ... }
44
+ landscape: {
45
+ raw: "(orientation: landscape)"
124
46
  }
125
47
  }
126
48
  },
package/vite.config.js CHANGED
@@ -1,96 +1,39 @@
1
1
  import { fileURLToPath, URL } from "node:url";
2
2
  import { defineConfig } from "vite";
3
3
  import vue from "@vitejs/plugin-vue";
4
- import { readFileSync } from "node:fs";
5
-
6
- const pkg = JSON.parse(readFileSync("./package.json", "utf-8"));
4
+ import pkg from "./package.json";
7
5
 
8
6
  // https://vitejs.dev/config/
9
7
  export default defineConfig({
10
- cacheDir: './node_modules/.vite',
11
8
  build: {
12
9
  rollupOptions: {
13
- output: {
14
- manualChunks: {
15
- vue: ["vue", "vue-router", "pinia"],
16
- ui: ["@vueuse/core", "vue-virtual-scroller"],
17
- utils: ["@msgpack/msgpack", "websocket-heartbeat-js"]
18
- }
19
- }
20
- },
21
- target: "esnext",
22
- cssCodeSplit: true,
23
- sourcemap: false,
24
- minify: "esbuild",
25
- emptyOutDir: false
10
+ external: []
11
+ }
26
12
  },
27
13
  optimizeDeps: {
28
- include: ["vue", "vue-router", "pinia", "@vueuse/core"],
29
- exclude: ["sharp"]
14
+ exclude: ["sharp"] // Exclude 'sharp' from dependency optimization
30
15
  },
31
16
  define: {
32
- __APP_VERSION__: JSON.stringify(pkg.version),
33
- __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false
17
+ __APP_VERSION__: JSON.stringify(pkg.version) // Inject app version from package.json
34
18
  },
35
- plugins: [
36
- vue({
37
- template: {
38
- compilerOptions: {
39
- isCustomElement: (tag) => tag.startsWith("necro-")
40
- }
41
- }
42
- })
43
- ],
19
+ plugins: [vue()], // Use Vue plugin
44
20
  resolve: {
45
21
  alias: {
46
- "@": fileURLToPath(new URL("./src", import.meta.url))
22
+ "@": fileURLToPath(new URL("./src", import.meta.url)) // Alias for src directory
23
+ },
24
+ fallback: {
25
+ "node-persist": false,
26
+ redis: false,
27
+ sharp: false,
28
+ fs: false,
29
+ path: false,
30
+ os: false
47
31
  }
48
32
  },
49
33
  css: {
50
34
  preprocessorOptions: {
51
35
  scss: {
52
- api: "modern-compiler",
53
- silenceDeprecations: ["legacy-js-api"]
54
- }
55
- },
56
- devSourcemap: true
57
- },
58
- server: {
59
- port: 5173,
60
- strictPort: true,
61
- host: true,
62
- cors: true,
63
- hmr: {
64
- overlay: false
65
- },
66
- // Handle iOS connection resets gracefully
67
- watch: {
68
- usePolling: false,
69
- interval: 1000
70
- },
71
- proxy: {
72
- "/api": {
73
- target: "http://localhost:8081",
74
- changeOrigin: true,
75
- secure: false,
76
- configure: (proxy) => {
77
- proxy.on("error", (err, req, res) => {
78
- res.writeHead(503, {
79
- "Content-Type": "application/json"
80
- });
81
- res.end(JSON.stringify({ error: "Backend starting up, please wait..." }));
82
- });
83
- }
84
- },
85
- "/ws": {
86
- target: "ws://localhost:8081",
87
- ws: true,
88
- changeOrigin: true,
89
- configure: (proxy) => {
90
- proxy.on("error", () => {
91
- // Silently handle WebSocket connection errors
92
- });
93
- }
36
+ api: "modern-compiler" // Use modern SCSS compiler
94
37
  }
95
38
  }
96
39
  }
package/vue.config.js ADDED
@@ -0,0 +1,32 @@
1
+ module.exports = {
2
+ chainWebpack: (config) => {
3
+ config.plugin('preload').tap((options) => {
4
+ options[0].as = (entry) => {
5
+ if (/\.css$/.test(entry)) return 'style';
6
+ if (/\.woff$/.test(entry)) return 'font';
7
+ if (/\.png$/.test(entry)) return 'image';
8
+ return 'script';
9
+ };
10
+ options[0].include = 'allAssets';
11
+ // options[0].fileWhitelist: [/\.files/, /\.to/, /\.include/]
12
+ // options[0].fileBlacklist: [/\.files/, /\.to/, /\.exclude/]
13
+ return options;
14
+ });
15
+ },
16
+ pwa: {
17
+ name: 'Russonoro',
18
+ themeColor: '#4DBA87',
19
+ msTileColor: '#000000',
20
+ appleMobileWebAppCapable: 'yes',
21
+ appleMobileWebAppStatusBarStyle: 'black',
22
+
23
+ // configure the workbox plugin
24
+ // workboxPluginMode: 'InjectManifest',
25
+ workboxPluginMode: "GenerateSW",
26
+ workboxOptions: {
27
+ // swSrc is required in InjectManifest mode.
28
+ swSrc: 'dev/sw.js',
29
+ // ...other Workbox options...
30
+ }
31
+ }
32
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ globDirectory: 'public/',
3
+ globPatterns: [
4
+ '**/*.{png,ico}'
5
+ ],
6
+ swDest: 'public/sw.js',
7
+ ignoreURLParametersMatching: [
8
+ /^utm_/,
9
+ /^fbclid$/
10
+ ]
11
+ };
package/artwork/image.png DELETED
Binary file