antigravity-claude-proxy 3.0.0 → 3.1.0

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 (53) hide show
  1. package/bin/cli.js +4 -11
  2. package/package.json +1 -1
  3. package/public/app.js +7 -4
  4. package/public/css/src/input.css +379 -216
  5. package/public/css/style.css +1 -1
  6. package/public/favicon.svg +4 -8
  7. package/public/index.html +78 -72
  8. package/public/js/components/claude-config.js +0 -8
  9. package/public/js/components/dashboard/charts.js +25 -51
  10. package/public/js/components/dashboard/stats.js +1 -1
  11. package/public/js/components/dashboard.js +16 -21
  12. package/public/js/components/logs-viewer.js +1 -1
  13. package/public/js/components/models.js +12 -12
  14. package/public/js/components/server-config.js +1 -9
  15. package/public/js/data-store.js +2 -2
  16. package/public/js/store.js +1 -1
  17. package/public/js/translations/en.js +37 -39
  18. package/public/js/translations/id.js +36 -37
  19. package/public/js/translations/pt.js +37 -38
  20. package/public/js/translations/tr.js +37 -39
  21. package/public/js/translations/zh.js +0 -2
  22. package/public/js/utils/error-handler.js +0 -2
  23. package/public/js/utils/ui-logger.js +4 -3
  24. package/public/views/accounts.html +34 -38
  25. package/public/views/dashboard.html +86 -99
  26. package/public/views/logs.html +4 -4
  27. package/public/views/models.html +32 -36
  28. package/public/views/settings.html +50 -50
  29. package/src/account-manager/index.js +0 -4
  30. package/src/account-manager/rate-limits.js +0 -5
  31. package/src/account-manager/strategies/base-strategy.js +4 -4
  32. package/src/account-manager/strategies/hybrid-strategy.js +3 -3
  33. package/src/auth/database.js +1 -0
  34. package/src/auth/oauth.js +43 -41
  35. package/src/auth/token-extractor.js +1 -1
  36. package/src/cli/accounts.js +2 -1
  37. package/src/cloudcode/model-registry.js +0 -3
  38. package/src/cloudcode/rate-limit-state.js +1 -7
  39. package/src/config.js +1 -1
  40. package/src/constants.js +0 -2
  41. package/src/format/content-converter.js +0 -4
  42. package/src/format/request-converter.js +1 -6
  43. package/src/format/response-converter.js +0 -3
  44. package/src/format/schema-sanitizer.js +3 -22
  45. package/src/format/thinking-utils.js +1 -13
  46. package/src/index.js +1 -6
  47. package/src/modules/usage-stats.js +1 -1
  48. package/src/server.js +1 -28
  49. package/src/utils/claude-config.js +2 -6
  50. package/src/utils/native-module-helper.js +0 -4
  51. package/src/utils/proxy.js +1 -10
  52. package/src/utils/version-detector.js +14 -5
  53. package/src/webui/index.js +1 -37
@@ -2,97 +2,178 @@
2
2
  @tailwind components;
3
3
  @tailwind utilities;
4
4
 
5
+ /*
6
+ * Design tokens.
7
+ * JS reads several of these by name (charts.js) and appends alpha suffixes,
8
+ * so every colour must stay a 6-digit hex.
9
+ */
5
10
  :root {
6
- /* === Background Layers === */
7
- --color-space-950: #09090b;
8
- --color-space-900: #0f0f11;
9
- --color-space-850: #121214;
10
- --color-space-800: #18181b;
11
- --color-space-border: #27272a;
12
-
13
- /* === Neon Accents (Full Saturation) === */
14
- --color-neon-purple: #a855f7;
15
- --color-neon-green: #22c55e;
16
- --color-neon-cyan: #06b6d4;
17
- --color-neon-yellow: #eab308;
18
- --color-neon-red: #ef4444;
19
-
20
- /* === Soft Neon (Reduced Saturation for Fills) === */
21
- --color-neon-purple-soft: #9333ea;
22
- --color-neon-green-soft: #16a34a;
23
- --color-neon-cyan-soft: #0891b2;
24
-
25
- /* === Text Hierarchy (WCAG AA Compliant) === */
26
- --color-text-primary: #ffffff; /* Emphasis: Titles, Key Numbers */
27
- --color-text-secondary: #d4d4d8; /* Content: Body Text (zinc-300) */
28
- --color-text-tertiary: #a1a1aa; /* Metadata: Timestamps, Labels (zinc-400) */
29
- --color-text-quaternary: #71717a; /* Subtle: Decorative (zinc-500) */
30
-
31
- /* === Legacy Aliases (Backward Compatibility) === */
11
+ /* === Surfaces: near-black panel, darkest first === */
12
+ --color-space-950: #0b0c0d;
13
+ --color-space-900: #111214;
14
+ --color-space-850: #16181a;
15
+ --color-space-800: #1c1e21;
16
+ --color-space-border: #27292d;
17
+
18
+ /* === Glass-cockpit colour code (legacy token names kept for JS) ===
19
+ purple -> cyan : things you set
20
+ magenta : the one current thing
21
+ green/yellow/red: normal / caution / warning */
22
+ --color-neon-purple: #4cc9d6;
23
+ --color-neon-cyan: #4cc9d6;
24
+ --color-neon-magenta: #d45bc2;
25
+ --color-neon-green: #6fcf6a;
26
+ --color-neon-yellow: #f2a93b;
27
+ --color-neon-red: #ee5a4f;
28
+
29
+ --color-neon-purple-soft: #2fa3b0;
30
+ --color-neon-green-soft: #57b553;
31
+ --color-neon-cyan-soft: #2fa3b0;
32
+
33
+ /* === Model families: never share a hue with a status === */
34
+ --color-family-claude: #4cc9d6;
35
+ --color-family-gemini: #d9c39a;
36
+ --color-family-other: #9aa7b0;
37
+
38
+ /* === Lettering === */
39
+ --color-text-primary: #eceae4;
40
+ --color-text-secondary: #c4c2bc;
41
+ --color-text-tertiary: #a3a19c;
42
+ --color-text-quaternary: #87857f;
43
+
44
+ /* === Legacy aliases (read by charts.js) === */
32
45
  --color-text-main: var(--color-text-secondary);
33
46
  --color-text-dim: var(--color-text-tertiary);
34
47
  --color-text-muted: var(--color-text-tertiary);
35
48
  --color-text-bright: var(--color-text-primary);
36
49
 
37
- /* Gradient Accents */
38
- --color-green-400: #4ade80;
39
- --color-yellow-400: #facc15;
40
- --color-red-400: #f87171;
41
-
42
- /* Chart Colors */
43
- --color-chart-1: #a855f7;
44
- --color-chart-2: #c084fc;
45
- --color-chart-3: #e879f9;
46
- --color-chart-4: #d946ef;
47
- --color-chart-5: #22c55e;
48
- --color-chart-6: #4ade80;
49
- --color-chart-7: #86efac;
50
- --color-chart-8: #10b981;
51
- --color-chart-9: #06b6d4;
52
- --color-chart-10: #f59e0b;
53
- --color-chart-11: #ef4444;
54
- --color-chart-12: #ec4899;
55
- --color-chart-13: #8b5cf6;
56
- --color-chart-14: #14b8a6;
57
- --color-chart-15: #f97316;
58
- --color-chart-16: #6366f1;
50
+ --color-green-400: #93dc8f;
51
+ --color-yellow-400: #f6c06a;
52
+ --color-red-400: #f27e74;
53
+
54
+ /* === Chart series: Claude models in blue-greens, Gemini in sands, others in steel === */
55
+ --color-chart-1: #4cc9d6;
56
+ --color-chart-2: #7fdbe4;
57
+ --color-chart-3: #2fa3b0;
58
+ --color-chart-4: #a9e7ec;
59
+ --color-chart-5: #d9c39a;
60
+ --color-chart-6: #bfa678;
61
+ --color-chart-7: #ecdcbc;
62
+ --color-chart-8: #a08a5f;
63
+ --color-chart-9: #9aa7b0;
64
+ --color-chart-10: #c7ccd1;
65
+ --color-chart-11: #74828c;
66
+ --color-chart-12: #5fb3a0;
67
+ --color-chart-13: #c2a1bb;
68
+ --color-chart-14: #8fb7c9;
69
+ --color-chart-15: #b8b08f;
70
+ --color-chart-16: #6f97a8;
71
+
72
+ /* === Shape === */
73
+ --view-padding: 2rem;
74
+ --view-gap: 1.75rem;
75
+ --card-radius: 0.625rem;
76
+ --control-radius: 0.375rem;
77
+ }
78
+
79
+ @media (max-width: 768px) {
80
+ :root {
81
+ --view-padding: 1rem;
82
+ --view-gap: 1.25rem;
83
+ }
59
84
  }
60
85
 
61
86
  [x-cloak] {
62
87
  display: none !important;
63
88
  }
64
89
 
65
- /* Custom Scrollbar */
90
+ /* -------------------------------------------------------------------------- */
91
+ /* Base */
92
+ /* -------------------------------------------------------------------------- */
93
+
94
+ html {
95
+ font-feature-settings: "ss02";
96
+ }
97
+
98
+ body {
99
+ background-color: var(--color-space-950);
100
+ letter-spacing: -0.003em;
101
+ }
102
+
103
+ /* Tabular figures wherever numbers are compared side by side */
104
+ .font-mono,
105
+ .stat-value,
106
+ table td {
107
+ font-variant-numeric: tabular-nums;
108
+ }
109
+
110
+ :focus-visible {
111
+ outline: 2px solid var(--color-neon-purple);
112
+ outline-offset: 2px;
113
+ }
114
+
115
+ .btn:focus-visible,
116
+ .input:focus-visible,
117
+ .select:focus-visible,
118
+ .toggle:focus-visible {
119
+ outline: 2px solid var(--color-neon-purple);
120
+ outline-offset: 2px;
121
+ }
122
+
123
+ ::selection {
124
+ background: rgba(76, 201, 214, 0.3);
125
+ color: var(--color-text-primary);
126
+ }
127
+
128
+ /*
129
+ * Small all-caps tracked labels read as template chrome.
130
+ * Labels across views carry `uppercase` + `tracking-*`; calm them globally
131
+ * so the copy (sentence case in translations) sets the tone.
132
+ */
133
+ .uppercase.tracking-wider,
134
+ .uppercase.tracking-widest,
135
+ .uppercase.tracking-wide {
136
+ letter-spacing: 0.02em;
137
+ }
138
+
139
+ /* Glows and frosted glass are replaced by flat surfaces */
140
+ [class*="shadow-[0_0_"] {
141
+ --tw-shadow: 0 0 #0000 !important;
142
+ --tw-shadow-colored: 0 0 #0000 !important;
143
+ box-shadow: none !important;
144
+ }
145
+
146
+ /* Scrollbar */
66
147
  .custom-scrollbar {
67
148
  scrollbar-gutter: stable;
68
149
  }
69
150
 
70
151
  ::-webkit-scrollbar {
71
- width: 8px;
72
- height: 8px;
152
+ width: 10px;
153
+ height: 10px;
73
154
  }
74
155
 
75
156
  ::-webkit-scrollbar-track {
76
- background: rgba(9, 9, 11, 0.3);
77
- border-radius: 4px;
157
+ background: transparent;
78
158
  }
79
159
 
80
160
  ::-webkit-scrollbar-thumb {
81
- background: linear-gradient(180deg, #27272a 0%, #18181b 100%);
82
- border-radius: 4px;
83
- border: 1px solid rgba(255, 255, 255, 0.05);
84
- transition: background 0.2s ease;
161
+ background: var(--color-space-border);
162
+ border-radius: 999px;
163
+ border: 3px solid var(--color-space-950);
85
164
  }
86
165
 
87
166
  ::-webkit-scrollbar-thumb:hover {
88
- background: linear-gradient(180deg, #3f3f46 0%, #27272a 100%);
89
- border-color: rgba(168, 85, 247, 0.3);
167
+ background: #4d4d4a;
90
168
  }
91
169
 
92
- /* Animations */
170
+ /* -------------------------------------------------------------------------- */
171
+ /* Motion */
172
+ /* -------------------------------------------------------------------------- */
173
+
93
174
  .fade-enter-active,
94
175
  .fade-leave-active {
95
- transition: opacity 0.2s ease;
176
+ transition: opacity 0.15s ease;
96
177
  }
97
178
 
98
179
  .fade-enter-from,
@@ -103,65 +184,133 @@
103
184
  @keyframes fadeIn {
104
185
  from {
105
186
  opacity: 0;
106
- transform: translateY(5px);
107
187
  }
108
188
  to {
109
189
  opacity: 1;
110
- transform: translateY(0);
111
190
  }
112
191
  }
113
192
 
114
193
  .animate-fade-in {
115
- animation: fadeIn 0.4s ease-out forwards;
194
+ animation: fadeIn 0.2s ease-out forwards;
116
195
  }
117
196
 
118
- .nav-item.active {
119
- background: linear-gradient(
120
- 90deg,
121
- theme("colors.neon.purple / 15%") 0%,
122
- transparent 100%
123
- );
124
- @apply border-l-4 border-neon-purple text-white;
197
+ @media (prefers-reduced-motion: reduce) {
198
+ *,
199
+ *::before,
200
+ *::after {
201
+ animation-duration: 0.01ms !important;
202
+ animation-iteration-count: 1 !important;
203
+ transition-duration: 0.01ms !important;
204
+ }
205
+ }
206
+
207
+ /* -------------------------------------------------------------------------- */
208
+ /* Shell */
209
+ /* -------------------------------------------------------------------------- */
210
+
211
+ .app-topbar {
212
+ background: var(--color-space-950);
213
+ border-bottom: 1px solid var(--color-space-border);
214
+ }
215
+
216
+ .app-sidebar {
217
+ background: var(--color-space-950);
218
+ }
219
+
220
+ .nav-section-label {
221
+ @apply px-5 mb-1.5 text-xs font-medium text-gray-600;
125
222
  }
126
223
 
127
224
  .nav-item {
128
- @apply border-l-4 border-transparent transition-all duration-200;
225
+ @apply relative mx-3 rounded-md transition-colors duration-150;
129
226
  }
130
227
 
131
- .progress-gradient-success::-webkit-progress-value {
132
- background-image: linear-gradient(
228
+ .nav-item.active {
229
+ background: var(--color-space-800);
230
+ @apply text-white;
231
+ }
232
+
233
+ .nav-item.active::before {
234
+ content: "";
235
+ position: absolute;
236
+ left: -0.75rem;
237
+ top: 0.625rem;
238
+ bottom: 0.625rem;
239
+ width: 3px;
240
+ border-radius: 0 3px 3px 0;
241
+ background: var(--color-neon-magenta);
242
+ }
243
+
244
+ .nav-item.active svg {
245
+ color: var(--color-neon-magenta);
246
+ }
247
+
248
+ /* -------------------------------------------------------------------------- */
249
+ /* Quota gauges */
250
+ /* Progress bars read as instrument tapes: square ends, a 10% tick scale */
251
+ /* engraved on the track, and a fill coloured only by health. */
252
+ /* -------------------------------------------------------------------------- */
253
+
254
+ .progress {
255
+ border-radius: 1px;
256
+ background-color: var(--color-space-800);
257
+ background-image: repeating-linear-gradient(
133
258
  to right,
134
- var(--color-neon-green),
135
- var(--color-green-400)
259
+ transparent 0,
260
+ transparent calc(10% - 1px),
261
+ rgba(236, 234, 228, 0.14) calc(10% - 1px),
262
+ rgba(236, 234, 228, 0.14) 10%
136
263
  );
137
264
  }
138
265
 
266
+ .progress::-webkit-progress-bar {
267
+ background: transparent;
268
+ border-radius: 1px;
269
+ }
270
+
271
+ .progress::-webkit-progress-value {
272
+ border-radius: 1px;
273
+ }
274
+
275
+ .progress::-moz-progress-bar {
276
+ border-radius: 1px;
277
+ }
278
+
279
+ .progress-gradient-success::-webkit-progress-value {
280
+ background: var(--color-neon-green);
281
+ }
282
+
139
283
  .progress-gradient-warning::-webkit-progress-value {
140
- background-image: linear-gradient(
141
- to right,
142
- var(--color-neon-yellow),
143
- var(--color-yellow-400)
144
- );
284
+ background: var(--color-neon-yellow);
145
285
  }
146
286
 
147
287
  .progress-gradient-error::-webkit-progress-value {
148
- background-image: linear-gradient(
149
- to right,
150
- var(--color-neon-red),
151
- var(--color-red-400)
152
- );
288
+ background: var(--color-neon-red);
289
+ }
290
+
291
+ .progress-gradient-success::-moz-progress-bar {
292
+ background: var(--color-neon-green);
293
+ }
294
+
295
+ .progress-gradient-warning::-moz-progress-bar {
296
+ background: var(--color-neon-yellow);
297
+ }
298
+
299
+ .progress-gradient-error::-moz-progress-bar {
300
+ background: var(--color-neon-red);
153
301
  }
154
302
 
155
- /* Dashboard Grid */
156
- .stats-grid {
157
- display: grid;
158
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
159
- gap: 1.5rem;
303
+ /* Readouts: every number a person reads off the panel */
304
+ .readout {
305
+ @apply font-display;
306
+ font-variant-numeric: tabular-nums;
307
+ letter-spacing: 0;
160
308
  }
161
309
 
162
- /* Tooltip Customization */
310
+ /* Tooltip */
163
311
  .tooltip:before {
164
- @apply bg-space-800 border border-space-border text-gray-200 font-mono text-xs;
312
+ @apply bg-space-800 border border-space-border text-gray-200 font-sans text-xs;
313
+ border-radius: var(--control-radius);
165
314
  }
166
315
 
167
316
  .tooltip-left:before {
@@ -169,38 +318,23 @@
169
318
  }
170
319
 
171
320
  /* -------------------------------------------------------------------------- */
172
- /* Refactored Global Utilities */
321
+ /* Layout */
173
322
  /* -------------------------------------------------------------------------- */
174
323
 
175
- /* Standard Layout Constants */
176
- :root {
177
- --view-padding: 2rem; /* 32px - Standard Padding */
178
- --view-gap: 2rem; /* 32px - Standard component gap */
179
- --card-radius: 0.75rem; /* 12px */
180
- }
181
-
182
- @media (max-width: 768px) {
183
- :root {
184
- --view-padding: 1rem;
185
- --view-gap: 1.25rem;
186
- }
324
+ .view-container {
325
+ display: flex;
326
+ flex-direction: column;
327
+ margin-left: auto;
328
+ margin-right: auto;
329
+ width: 100%;
330
+ padding: var(--view-padding);
331
+ gap: var(--view-gap);
332
+ min-height: calc(100vh - 56px);
333
+ max-width: 1400px;
334
+ scrollbar-gutter: stable;
187
335
  }
188
336
 
189
- /* Base View Container */
190
- .view-container {
191
- display: flex;
192
- flex-direction: column;
193
- margin-left: auto;
194
- margin-right: auto;
195
- width: 100%;
196
- padding: var(--view-padding);
197
- gap: var(--view-gap);
198
- min-height: calc(100vh - 56px); /* Align with navbar height */
199
- max-width: 1400px;
200
- scrollbar-gutter: stable;
201
- }
202
-
203
- /* Specialized container for data-heavy pages (Logs) */
337
+ /* Data-heavy pages (Logs) */
204
338
  .view-container-full {
205
339
  @apply w-full animate-fade-in flex flex-col;
206
340
  padding: var(--view-padding);
@@ -209,29 +343,27 @@
209
343
  max-width: 100%;
210
344
  }
211
345
 
212
- /* Centered container for form-heavy pages (Settings/Accounts) */
346
+ /* Form-heavy pages (Settings/Accounts) */
213
347
  .view-container-centered {
214
348
  @apply mx-auto w-full animate-fade-in flex flex-col;
215
349
  padding: var(--view-padding);
216
350
  gap: var(--view-gap);
217
351
  min-height: calc(100vh - 56px);
218
- max-width: 900px; /* Comfortable reading width for forms */
352
+ max-width: 900px;
219
353
  }
220
354
 
221
- /* Standard Section Header */
222
355
  .view-header {
223
- display: flex;
224
- flex-direction: column;
225
- justify-content: space-between;
226
- margin-bottom: 0.5rem;
227
- gap: 1rem;
356
+ display: flex;
357
+ flex-direction: column;
358
+ justify-content: space-between;
359
+ gap: 1rem;
228
360
  }
229
361
 
230
362
  @media (min-width: 768px) {
231
- .view-header {
232
- flex-direction: row;
233
- align-items: flex-end;
234
- }
363
+ .view-header {
364
+ flex-direction: row;
365
+ align-items: flex-end;
366
+ }
235
367
  }
236
368
 
237
369
  .view-header-title {
@@ -239,7 +371,8 @@
239
371
  }
240
372
 
241
373
  .view-header-title h2 {
242
- @apply text-2xl font-bold text-white tracking-tight;
374
+ @apply font-display text-[1.5rem] leading-tight font-bold text-white;
375
+ letter-spacing: -0.01em;
243
376
  }
244
377
 
245
378
  .view-header-title p {
@@ -250,59 +383,69 @@
250
383
  @apply flex items-center gap-3;
251
384
  }
252
385
 
253
- /* Standard Card Panel */
386
+ /* Panel */
254
387
  .view-card {
255
- position: relative;
256
- overflow: hidden;
257
- border-radius: var(--card-radius);
258
- padding: 1.5rem;
259
- border: 1px solid rgba(255, 255, 255, 0.08);
260
- background: linear-gradient(135deg,
261
- rgba(15, 15, 17, 0.75) 0%,
262
- rgba(18, 18, 20, 0.70) 100%
263
- );
264
- -webkit-backdrop-filter: blur(12px);
265
- backdrop-filter: blur(12px);
266
- box-shadow:
267
- 0 0 0 1px rgba(255, 255, 255, 0.02) inset,
268
- 0 4px 24px rgba(0, 0, 0, 0.4);
269
- transition: border-color 0.3s ease, box-shadow 0.3s ease;
270
- }
271
-
272
- .view-card:hover {
273
- border-color: rgba(255, 255, 255, 0.12);
274
- box-shadow:
275
- 0 0 0 1px rgba(255, 255, 255, 0.04) inset,
276
- 0 8px 32px rgba(0, 0, 0, 0.5);
388
+ position: relative;
389
+ overflow: hidden;
390
+ border-radius: var(--card-radius);
391
+ padding: 1.5rem;
392
+ border: 1px solid var(--color-space-border);
393
+ background: var(--color-space-900);
277
394
  }
278
395
 
279
396
  .view-card-header {
280
- @apply flex items-center justify-between mb-4 pb-4 border-b border-[rgba(39,39,42,0.3)];
397
+ @apply flex items-center justify-between mb-4 pb-4 border-b border-space-border;
398
+ }
399
+
400
+ /* Stat tiles share the panel surface */
401
+ .stat {
402
+ border-color: var(--color-space-border);
403
+ }
404
+
405
+ .stat-title {
406
+ text-transform: none;
407
+ letter-spacing: 0;
281
408
  }
282
409
 
283
- /* Component Unification */
410
+ /* -------------------------------------------------------------------------- */
411
+ /* Tables */
412
+ /* -------------------------------------------------------------------------- */
413
+
284
414
  .standard-table {
285
415
  @apply table w-full border-separate border-spacing-0;
286
416
  }
417
+
287
418
  .standard-table thead {
288
- @apply bg-space-900/50 text-gray-500 font-mono text-xs uppercase border-b border-space-border;
419
+ @apply text-gray-500 font-sans text-xs border-b border-space-border;
420
+ background: transparent;
289
421
  }
422
+
423
+ .standard-table thead th {
424
+ @apply font-medium normal-case;
425
+ letter-spacing: 0;
426
+ border-bottom: 1px solid var(--color-space-border);
427
+ }
428
+
290
429
  .standard-table tbody tr {
291
- @apply transition-all duration-200 border-b border-[rgba(39,39,42,0.3)] last:border-0;
430
+ @apply transition-colors duration-150;
431
+ }
432
+
433
+ .standard-table tbody td {
434
+ border-bottom: 1px solid rgba(39, 41, 45, 0.7);
435
+ }
436
+
437
+ .standard-table tbody tr:last-child td {
438
+ border-bottom: 0;
292
439
  }
293
440
 
294
441
  .standard-table tbody tr:hover {
295
- background: linear-gradient(
296
- 90deg,
297
- rgba(255, 255, 255, 0.03) 0%,
298
- rgba(255, 255, 255, 0.05) 50%,
299
- rgba(255, 255, 255, 0.03) 100%
300
- );
301
- border-color: rgba(255, 255, 255, 0.08);
302
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
442
+ background: rgba(28, 30, 33, 0.6);
303
443
  }
304
444
 
305
- /* Custom Range Slider - Simplified */
445
+ /* -------------------------------------------------------------------------- */
446
+ /* Range slider */
447
+ /* -------------------------------------------------------------------------- */
448
+
306
449
  .custom-range {
307
450
  -webkit-appearance: none;
308
451
  appearance: none;
@@ -321,6 +464,8 @@
321
464
  height: 14px;
322
465
  border-radius: 50%;
323
466
  background: var(--range-color, var(--color-neon-purple));
467
+ border: 2px solid var(--color-space-950);
468
+ box-shadow: 0 0 0 1px var(--range-color, var(--color-neon-purple));
324
469
  cursor: pointer;
325
470
  transition: transform 0.1s ease;
326
471
  }
@@ -332,7 +477,7 @@
332
477
  .custom-range::-moz-range-thumb {
333
478
  width: 14px;
334
479
  height: 14px;
335
- border: none;
480
+ border: 2px solid var(--color-space-950);
336
481
  border-radius: 50%;
337
482
  background: var(--range-color, var(--color-neon-purple));
338
483
  cursor: pointer;
@@ -343,7 +488,11 @@
343
488
  transform: scale(1.15);
344
489
  }
345
490
 
346
- /* Color Variants */
491
+ .custom-range:focus-visible {
492
+ outline: 2px solid var(--color-neon-purple);
493
+ outline-offset: 4px;
494
+ }
495
+
347
496
  .custom-range-purple {
348
497
  --range-color: var(--color-neon-purple);
349
498
  }
@@ -361,29 +510,26 @@
361
510
  }
362
511
 
363
512
  /* -------------------------------------------------------------------------- */
364
- /* Refactored UI Components (Phase 1.2) */
513
+ /* Controls */
365
514
  /* -------------------------------------------------------------------------- */
366
515
 
367
- /* Phase 1.2 additions ... */
368
-
369
- /* Filter Controls */
370
516
  .filter-control {
371
- @apply flex items-center justify-center gap-2 px-3 py-1.5 lg:px-4 lg:py-2
372
- text-[10px] lg:text-xs font-mono font-medium text-gray-400
373
- bg-space-800 lg:bg-transparent border border-space-border/50 lg:border-transparent
374
- rounded lg:rounded-md hover:text-white lg:hover:bg-space-800
375
- transition-all duration-200 whitespace-nowrap w-full sm:w-auto;
517
+ @apply flex items-center justify-center gap-2 px-3 py-1.5
518
+ text-xs font-sans font-medium text-gray-400
519
+ bg-space-800 border border-space-border
520
+ rounded-md hover:text-white hover:border-gray-600
521
+ transition-colors duration-150 whitespace-nowrap w-full sm:w-auto;
376
522
  }
377
523
 
378
- .filter-control:hover {
379
- @apply border-neon-cyan/50 lg:border-neon-cyan/30 lg:shadow-lg lg:shadow-neon-cyan/10;
524
+ .filter-control-item {
525
+ @apply block w-full px-3 py-1.5 text-left text-xs font-sans hover:bg-white/5 transition-colors;
380
526
  }
381
527
 
382
- .filter-control-item {
383
- @apply block w-full px-3 py-1.5 text-left text-[10px] font-mono hover:bg-white/5 transition-colors;
528
+ .btn {
529
+ @apply font-medium normal-case;
530
+ letter-spacing: 0;
384
531
  }
385
532
 
386
- /* Action Buttons */
387
533
  .btn-action-ghost {
388
534
  @apply btn btn-xs btn-ghost text-gray-400 hover:text-white transition-colors;
389
535
  }
@@ -393,92 +539,109 @@
393
539
  }
394
540
 
395
541
  .btn-action-primary {
396
- @apply btn bg-gradient-to-r from-neon-purple to-indigo-600
397
- border-none text-white shadow-lg shadow-neon-purple/20
398
- hover:shadow-neon-purple/40 transition-all;
542
+ @apply btn border-none transition-colors;
543
+ background: var(--color-neon-purple);
544
+ color: var(--color-space-950);
545
+ }
546
+
547
+ .btn-action-primary:hover {
548
+ background: #7fdbe4;
399
549
  }
400
550
 
401
551
  .btn-action-success {
402
- @apply btn btn-xs btn-ghost btn-square text-green-500 hover:bg-green-500/20;
552
+ @apply btn btn-xs btn-ghost btn-square text-neon-green hover:bg-neon-green/15;
403
553
  }
404
554
 
405
555
  .btn-action-danger {
406
- @apply btn btn-xs btn-ghost btn-square text-red-400 hover:bg-red-500/20;
556
+ @apply btn btn-xs btn-ghost btn-square text-neon-red hover:bg-neon-red/15;
407
557
  }
408
558
 
409
559
  .btn-action-neutral {
410
560
  @apply btn btn-xs btn-ghost btn-square text-gray-500 hover:bg-gray-500/20;
411
561
  }
412
562
 
413
- /* Status Pills/Badges */
563
+ /* Status pills: quiet sentence-case chips; colour carries the meaning */
414
564
  .status-pill {
415
- @apply px-2 py-1 text-[10px] font-mono font-bold uppercase rounded border;
565
+ @apply inline-flex items-center gap-1 px-2 py-0.5 text-[11px] font-sans font-medium rounded-full border normal-case;
566
+ letter-spacing: 0;
416
567
  }
417
568
 
418
569
  .status-pill-purple {
419
- @apply status-pill bg-neon-purple/10 text-neon-purple border-neon-purple/30;
570
+ @apply status-pill bg-neon-purple/10 text-neon-purple border-neon-purple/25;
420
571
  }
421
572
 
422
573
  .status-pill-ultra {
423
- @apply status-pill bg-yellow-500/10 text-yellow-400 border-yellow-500/30;
574
+ @apply status-pill bg-neon-yellow/10 text-neon-yellow border-neon-yellow/25;
424
575
  }
425
576
 
426
577
  .status-pill-pro {
427
- @apply status-pill bg-blue-500/10 text-blue-400 border-blue-500/30;
578
+ @apply status-pill bg-neon-cyan/10 text-neon-cyan border-neon-cyan/25;
428
579
  }
429
580
 
430
581
  .status-pill-free {
431
- @apply status-pill bg-gray-500/10 text-gray-400 border-gray-500/30;
582
+ @apply status-pill bg-gray-500/10 text-gray-400 border-gray-500/25;
432
583
  }
433
584
 
434
585
  .status-pill-success {
435
- @apply status-pill bg-neon-green/10 text-neon-green border-neon-green/30;
586
+ @apply status-pill bg-neon-green/10 text-neon-green border-neon-green/25;
436
587
  }
437
588
 
438
589
  .status-pill-warning {
439
- @apply status-pill bg-yellow-500/10 text-yellow-400 border-yellow-500/30;
590
+ @apply status-pill bg-neon-yellow/10 text-neon-yellow border-neon-yellow/25;
440
591
  }
441
592
 
442
593
  .status-pill-error {
443
- @apply status-pill bg-red-500/10 text-red-400 border-red-500/30;
594
+ @apply status-pill bg-neon-red/10 text-neon-red border-neon-red/25;
444
595
  }
445
596
 
446
- /* Input Components */
597
+ /* Inputs */
447
598
  .input-search {
448
- @apply w-full bg-space-900/50 border border-[rgba(39,39,42,0.5)] text-gray-300
449
- rounded-lg pl-10 pr-4 py-2
450
- focus:outline-none focus:bg-space-800 focus:border-neon-purple/50
451
- hover:border-space-border hover:bg-space-800/80
452
- transition-all placeholder-gray-600/80;
599
+ @apply w-full bg-space-900 border border-space-border text-gray-200
600
+ rounded-md pl-10 pr-4 py-2
601
+ focus:outline-none focus:border-neon-purple/60
602
+ hover:border-gray-600
603
+ transition-colors placeholder-gray-600;
453
604
  }
454
605
 
455
606
  .input-search-sm {
456
607
  @apply input-search h-8 text-xs font-normal;
457
608
  }
458
609
 
610
+ .input,
611
+ .select,
612
+ .textarea {
613
+ border-radius: var(--control-radius);
614
+ }
615
+
616
+ /* Modals */
617
+ .modal-box {
618
+ border-radius: 0.75rem;
619
+ }
620
+
621
+ .modal-backdrop {
622
+ background: rgba(0, 0, 0, 0.7);
623
+ }
624
+
459
625
  /* -------------------------------------------------------------------------- */
460
- /* Skeleton Loading (Phase 4.1) */
626
+ /* Skeleton loading */
461
627
  /* -------------------------------------------------------------------------- */
462
628
 
463
- /* Skeleton animation */
464
629
  @keyframes skeleton-pulse {
465
- 0%, 100% {
630
+ 0%,
631
+ 100% {
466
632
  opacity: 1;
467
633
  }
468
634
  50% {
469
- opacity: 0.4;
635
+ opacity: 0.5;
470
636
  }
471
637
  }
472
638
 
473
- /* Base skeleton element */
474
639
  .skeleton {
475
- @apply bg-gradient-to-r from-space-900/60 via-space-800/40 to-space-900/60;
476
- background-size: 200% 100%;
640
+ background: var(--color-space-800);
477
641
  animation: skeleton-pulse 1.5s ease-in-out infinite;
478
642
  border-radius: 0.375rem;
479
643
  }
480
644
 
481
- /* Skeleton variants */
482
645
  .skeleton-text {
483
646
  @apply skeleton h-4 w-full;
484
647
  }
@@ -513,11 +676,11 @@
513
676
  background-color: oklch(var(--su)) !important;
514
677
  }
515
678
 
516
- /* Desktop Sidebar Collapsed State */
679
+ /* Desktop sidebar collapsed state */
517
680
  @media (min-width: 1024px) {
518
681
  body .sidebar-collapsed {
519
682
  width: 0;
520
683
  padding: 0;
521
684
  border: none;
522
685
  }
523
- }
686
+ }