@softtechai/quickmcp 1.0.8

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 (163) hide show
  1. package/README.md +553 -0
  2. package/dist/client/MCPClient.d.ts +24 -0
  3. package/dist/client/MCPClient.d.ts.map +1 -0
  4. package/dist/client/MCPClient.js +211 -0
  5. package/dist/client/MCPClient.js.map +1 -0
  6. package/dist/client/MCPClientUnified.d.ts +31 -0
  7. package/dist/client/MCPClientUnified.d.ts.map +1 -0
  8. package/dist/client/MCPClientUnified.js +275 -0
  9. package/dist/client/MCPClientUnified.js.map +1 -0
  10. package/dist/client/MCPTestRunner.d.ts +44 -0
  11. package/dist/client/MCPTestRunner.d.ts.map +1 -0
  12. package/dist/client/MCPTestRunner.js +220 -0
  13. package/dist/client/MCPTestRunner.js.map +1 -0
  14. package/dist/client/MCPTestRunnerUnified.d.ts +48 -0
  15. package/dist/client/MCPTestRunnerUnified.d.ts.map +1 -0
  16. package/dist/client/MCPTestRunnerUnified.js +183 -0
  17. package/dist/client/MCPTestRunnerUnified.js.map +1 -0
  18. package/dist/database/json-manager.d.ts +55 -0
  19. package/dist/database/json-manager.d.ts.map +1 -0
  20. package/dist/database/json-manager.js +128 -0
  21. package/dist/database/json-manager.js.map +1 -0
  22. package/dist/database/sqlite-manager.d.ts +53 -0
  23. package/dist/database/sqlite-manager.d.ts.map +1 -0
  24. package/dist/database/sqlite-manager.js +193 -0
  25. package/dist/database/sqlite-manager.js.map +1 -0
  26. package/dist/dynamic-mcp-executor.d.ts +14 -0
  27. package/dist/dynamic-mcp-executor.d.ts.map +1 -0
  28. package/dist/dynamic-mcp-executor.js +274 -0
  29. package/dist/dynamic-mcp-executor.js.map +1 -0
  30. package/dist/generators/MCPServerGenerator-new.d.ts +37 -0
  31. package/dist/generators/MCPServerGenerator-new.d.ts.map +1 -0
  32. package/dist/generators/MCPServerGenerator-new.js +287 -0
  33. package/dist/generators/MCPServerGenerator-new.js.map +1 -0
  34. package/dist/generators/MCPServerGenerator.d.ts +42 -0
  35. package/dist/generators/MCPServerGenerator.d.ts.map +1 -0
  36. package/dist/generators/MCPServerGenerator.js +494 -0
  37. package/dist/generators/MCPServerGenerator.js.map +1 -0
  38. package/dist/generators/database/sqlite-manager.d.ts +52 -0
  39. package/dist/generators/database/sqlite-manager.js +143 -0
  40. package/dist/generators/generators/MCPServerGenerator.d.ts +37 -0
  41. package/dist/generators/generators/MCPServerGenerator.js +396 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +23 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/integrated-mcp-server-new.d.ts +12 -0
  47. package/dist/integrated-mcp-server-new.d.ts.map +1 -0
  48. package/dist/integrated-mcp-server-new.js +253 -0
  49. package/dist/integrated-mcp-server-new.js.map +1 -0
  50. package/dist/integrated-mcp-server.d.ts +25 -0
  51. package/dist/integrated-mcp-server.d.ts.map +1 -0
  52. package/dist/integrated-mcp-server.js +541 -0
  53. package/dist/integrated-mcp-server.js.map +1 -0
  54. package/dist/mcp-inspector-server.d.ts +3 -0
  55. package/dist/mcp-inspector-server.d.ts.map +1 -0
  56. package/dist/mcp-inspector-server.js +119 -0
  57. package/dist/mcp-inspector-server.js.map +1 -0
  58. package/dist/mcp-sdk-server.d.ts +3 -0
  59. package/dist/mcp-sdk-server.d.ts.map +1 -0
  60. package/dist/mcp-sdk-server.js +90 -0
  61. package/dist/mcp-sdk-server.js.map +1 -0
  62. package/dist/mcp-server.d.ts +3 -0
  63. package/dist/mcp-server.d.ts.map +1 -0
  64. package/dist/mcp-server.js +300 -0
  65. package/dist/mcp-server.js.map +1 -0
  66. package/dist/parsers/CsvParser.d.ts +7 -0
  67. package/dist/parsers/CsvParser.d.ts.map +1 -0
  68. package/dist/parsers/CsvParser.js +98 -0
  69. package/dist/parsers/CsvParser.js.map +1 -0
  70. package/dist/parsers/DatabaseParser.d.ts +18 -0
  71. package/dist/parsers/DatabaseParser.d.ts.map +1 -0
  72. package/dist/parsers/DatabaseParser.js +372 -0
  73. package/dist/parsers/DatabaseParser.js.map +1 -0
  74. package/dist/parsers/ExcelParser.d.ts +8 -0
  75. package/dist/parsers/ExcelParser.d.ts.map +1 -0
  76. package/dist/parsers/ExcelParser.js +119 -0
  77. package/dist/parsers/ExcelParser.js.map +1 -0
  78. package/dist/parsers/index.d.ts +13 -0
  79. package/dist/parsers/index.d.ts.map +1 -0
  80. package/dist/parsers/index.js +88 -0
  81. package/dist/parsers/index.js.map +1 -0
  82. package/dist/parsers/parsers/ExcelParser.js +118 -0
  83. package/dist/parsers/types/index.js +2 -0
  84. package/dist/quickmcp-unified-bridge.d.ts +13 -0
  85. package/dist/quickmcp-unified-bridge.d.ts.map +1 -0
  86. package/dist/quickmcp-unified-bridge.js +176 -0
  87. package/dist/quickmcp-unified-bridge.js.map +1 -0
  88. package/dist/server/ServerManager.d.ts +37 -0
  89. package/dist/server/ServerManager.d.ts.map +1 -0
  90. package/dist/server/ServerManager.js +376 -0
  91. package/dist/server/ServerManager.js.map +1 -0
  92. package/dist/sqlite-manager.js +145 -0
  93. package/dist/start-new-server.d.ts +3 -0
  94. package/dist/start-new-server.d.ts.map +1 -0
  95. package/dist/start-new-server.js +10 -0
  96. package/dist/start-new-server.js.map +1 -0
  97. package/dist/test-app.d.ts +2 -0
  98. package/dist/test-app.d.ts.map +1 -0
  99. package/dist/test-app.js +119 -0
  100. package/dist/test-app.js.map +1 -0
  101. package/dist/test-new-architecture.d.ts +3 -0
  102. package/dist/test-new-architecture.d.ts.map +1 -0
  103. package/dist/test-new-architecture.js +72 -0
  104. package/dist/test-new-architecture.js.map +1 -0
  105. package/dist/transport/base-transport.d.ts +21 -0
  106. package/dist/transport/base-transport.d.ts.map +1 -0
  107. package/dist/transport/base-transport.js +16 -0
  108. package/dist/transport/base-transport.js.map +1 -0
  109. package/dist/transport/index.d.ts +10 -0
  110. package/dist/transport/index.d.ts.map +1 -0
  111. package/dist/transport/index.js +12 -0
  112. package/dist/transport/index.js.map +1 -0
  113. package/dist/transport/sse-transport.d.ts +13 -0
  114. package/dist/transport/sse-transport.d.ts.map +1 -0
  115. package/dist/transport/sse-transport.js +106 -0
  116. package/dist/transport/sse-transport.js.map +1 -0
  117. package/dist/transport/stdio-transport.d.ts +8 -0
  118. package/dist/transport/stdio-transport.d.ts.map +1 -0
  119. package/dist/transport/stdio-transport.js +53 -0
  120. package/dist/transport/stdio-transport.js.map +1 -0
  121. package/dist/transport/streamable-http-transport.d.ts +15 -0
  122. package/dist/transport/streamable-http-transport.d.ts.map +1 -0
  123. package/dist/transport/streamable-http-transport.js +151 -0
  124. package/dist/transport/streamable-http-transport.js.map +1 -0
  125. package/dist/types/index.d.ts +64 -0
  126. package/dist/types/index.d.ts.map +1 -0
  127. package/dist/types/index.js +3 -0
  128. package/dist/types/index.js.map +1 -0
  129. package/dist/web/client/MCPClient.js +348 -0
  130. package/dist/web/client/MCPTestRunner.js +317 -0
  131. package/dist/web/database/json-manager.js +124 -0
  132. package/dist/web/database/sqlite-manager.js +146 -0
  133. package/dist/web/dynamic-mcp-executor.js +443 -0
  134. package/dist/web/generators/MCPServerGenerator-new.js +284 -0
  135. package/dist/web/generators/MCPServerGenerator.js +566 -0
  136. package/dist/web/integrated-mcp-server-new.js +394 -0
  137. package/dist/web/parsers/CsvParser.js +144 -0
  138. package/dist/web/parsers/DatabaseParser.js +637 -0
  139. package/dist/web/parsers/ExcelParser.js +180 -0
  140. package/dist/web/parsers/index.js +152 -0
  141. package/dist/web/server.d.ts +3 -0
  142. package/dist/web/server.d.ts.map +1 -0
  143. package/dist/web/server.js +790 -0
  144. package/dist/web/server.js.map +1 -0
  145. package/dist/web/types/index.js +2 -0
  146. package/dist/web/web/server.js +860 -0
  147. package/package.json +68 -0
  148. package/quickmcp-direct-stdio.js +328 -0
  149. package/src/web/public/app.js +1795 -0
  150. package/src/web/public/database-tables.html +711 -0
  151. package/src/web/public/how-to-use.html +571 -0
  152. package/src/web/public/how-to-use.js +255 -0
  153. package/src/web/public/images/1-claude-quickmcp-stdio.png +0 -0
  154. package/src/web/public/images/2-claude-tools.png +0 -0
  155. package/src/web/public/images/3-claude-developer-settings.png +0 -0
  156. package/src/web/public/images/4-claude-config.png +0 -0
  157. package/src/web/public/images/5-claude-config-edit.png +0 -0
  158. package/src/web/public/index.html +626 -0
  159. package/src/web/public/manage-servers.html +198 -0
  160. package/src/web/public/modern-styles.css +946 -0
  161. package/src/web/public/shared-styles.css +2091 -0
  162. package/src/web/public/shared.js +93 -0
  163. package/src/web/public/test-servers.html +302 -0
@@ -0,0 +1,946 @@
1
+ /* Modern QuickMCP UI System */
2
+
3
+ /* CSS Variables for Design System */
4
+ :root {
5
+ /* Colors */
6
+ --primary-50: #f0f9ff;
7
+ --primary-100: #e0f2fe;
8
+ --primary-500: #0ea5e9;
9
+ --primary-600: #0284c7;
10
+ --primary-700: #0369a1;
11
+ --primary-900: #0c4a6e;
12
+
13
+ --secondary-50: #f8fafc;
14
+ --secondary-100: #f1f5f9;
15
+ --secondary-200: #e2e8f0;
16
+ --secondary-300: #cbd5e1;
17
+ --secondary-400: #94a3b8;
18
+ --secondary-500: #64748b;
19
+ --secondary-600: #475569;
20
+ --secondary-700: #334155;
21
+ --secondary-800: #1e293b;
22
+ --secondary-900: #0f172a;
23
+
24
+ --success-50: #f0fdf4;
25
+ --success-500: #22c55e;
26
+ --success-600: #16a34a;
27
+
28
+ --warning-50: #fffbeb;
29
+ --warning-500: #f59e0b;
30
+ --warning-600: #d97706;
31
+
32
+ --error-50: #fef2f2;
33
+ --error-500: #ef4444;
34
+ --error-600: #dc2626;
35
+
36
+ /* Spacing */
37
+ --space-1: 0.25rem;
38
+ --space-2: 0.5rem;
39
+ --space-3: 0.75rem;
40
+ --space-4: 1rem;
41
+ --space-5: 1.25rem;
42
+ --space-6: 1.5rem;
43
+ --space-8: 2rem;
44
+ --space-10: 2.5rem;
45
+ --space-12: 3rem;
46
+ --space-16: 4rem;
47
+ --space-20: 5rem;
48
+
49
+ /* Border Radius */
50
+ --radius-sm: 0.375rem;
51
+ --radius-md: 0.5rem;
52
+ --radius-lg: 0.75rem;
53
+ --radius-xl: 1rem;
54
+ --radius-2xl: 1.5rem;
55
+ --radius-full: 9999px;
56
+
57
+ /* Typography */
58
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
59
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
60
+
61
+ /* Shadows */
62
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
63
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
64
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
65
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
66
+
67
+ /* Transitions */
68
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
69
+ --transition-normal: 300ms cubic-bezier(0.4, 0, 0.2, 1);
70
+ --transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1);
71
+ }
72
+
73
+ /* Reset and Base Styles */
74
+ *, *::before, *::after {
75
+ box-sizing: border-box;
76
+ margin: 0;
77
+ padding: 0;
78
+ }
79
+
80
+ html {
81
+ font-family: var(--font-sans);
82
+ line-height: 1.5;
83
+ -webkit-font-smoothing: antialiased;
84
+ -moz-osx-font-smoothing: grayscale;
85
+ }
86
+
87
+ body {
88
+ background: linear-gradient(135deg, var(--primary-50) 0%, var(--secondary-50) 100%);
89
+ color: var(--secondary-900);
90
+ min-height: 100vh;
91
+ overflow-x: hidden;
92
+ }
93
+
94
+ /* Layout Components */
95
+ .app {
96
+ display: flex;
97
+ min-height: 100vh;
98
+ }
99
+
100
+ /* Modern Sidebar */
101
+ .sidebar {
102
+ width: 280px;
103
+ background: rgba(255, 255, 255, 0.95);
104
+ backdrop-filter: blur(20px);
105
+ border-right: 1px solid var(--secondary-200);
106
+ display: flex;
107
+ flex-direction: column;
108
+ position: fixed;
109
+ height: 100vh;
110
+ z-index: 1000;
111
+ transform: translateX(0);
112
+ transition: transform var(--transition-normal);
113
+ }
114
+
115
+ .sidebar.open {
116
+ transform: translateX(0);
117
+ }
118
+
119
+ .sidebar-header {
120
+ padding: var(--space-6);
121
+ border-bottom: 1px solid var(--secondary-200);
122
+ display: flex;
123
+ align-items: center;
124
+ gap: var(--space-3);
125
+ }
126
+
127
+ .sidebar-logo {
128
+ width: 48px;
129
+ height: 48px;
130
+ background: linear-gradient(135deg, var(--primary-500) 0%, var(--primary-700) 100%);
131
+ border-radius: var(--radius-xl);
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ color: white;
136
+ font-weight: 700;
137
+ font-size: 1.25rem;
138
+ box-shadow: var(--shadow-md);
139
+ }
140
+
141
+ .sidebar-title {
142
+ font-size: 1.25rem;
143
+ font-weight: 700;
144
+ color: var(--secondary-900);
145
+ }
146
+
147
+ .sidebar-nav {
148
+ flex: 1;
149
+ padding: var(--space-4);
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: var(--space-2);
153
+ }
154
+
155
+ .nav-item {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: var(--space-3);
159
+ padding: var(--space-3) var(--space-4);
160
+ border-radius: var(--radius-lg);
161
+ color: var(--secondary-600);
162
+ text-decoration: none;
163
+ font-weight: 500;
164
+ transition: all var(--transition-fast);
165
+ cursor: pointer;
166
+ border: none;
167
+ background: none;
168
+ width: 100%;
169
+ text-align: left;
170
+ }
171
+
172
+ .nav-item:hover {
173
+ background: var(--secondary-100);
174
+ color: var(--secondary-900);
175
+ }
176
+
177
+ .nav-item.active {
178
+ background: linear-gradient(135deg, var(--primary-500) 0%, var(--primary-600) 100%);
179
+ color: white;
180
+ box-shadow: var(--shadow-md);
181
+ }
182
+
183
+ .nav-item-icon {
184
+ width: 20px;
185
+ height: 20px;
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ font-size: 1.125rem;
190
+ }
191
+
192
+ /* Main Content */
193
+ .main-content {
194
+ flex: 1;
195
+ margin-left: 280px;
196
+ transition: margin-left var(--transition-normal);
197
+ }
198
+
199
+ .main-content.with-sidebar {
200
+ margin-left: 280px;
201
+ }
202
+
203
+ /* Top Bar */
204
+ .top-bar {
205
+ height: 72px;
206
+ background: rgba(255, 255, 255, 0.95);
207
+ backdrop-filter: blur(20px);
208
+ border-bottom: 1px solid var(--secondary-200);
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: space-between;
212
+ padding: 0 var(--space-6);
213
+ position: sticky;
214
+ top: 0;
215
+ z-index: 100;
216
+ }
217
+
218
+ .hamburger {
219
+ display: none;
220
+ flex-direction: column;
221
+ gap: 4px;
222
+ background: none;
223
+ border: none;
224
+ cursor: pointer;
225
+ padding: var(--space-2);
226
+ border-radius: var(--radius-md);
227
+ transition: background var(--transition-fast);
228
+ }
229
+
230
+ .hamburger:hover {
231
+ background: var(--secondary-100);
232
+ }
233
+
234
+ .hamburger span {
235
+ width: 24px;
236
+ height: 3px;
237
+ background: var(--secondary-700);
238
+ border-radius: var(--radius-full);
239
+ transition: all var(--transition-fast);
240
+ }
241
+
242
+ .hamburger.active span:nth-child(1) {
243
+ transform: rotate(45deg) translate(6px, 6px);
244
+ }
245
+
246
+ .hamburger.active span:nth-child(2) {
247
+ opacity: 0;
248
+ }
249
+
250
+ .hamburger.active span:nth-child(3) {
251
+ transform: rotate(-45deg) translate(6px, -6px);
252
+ }
253
+
254
+ .page-title {
255
+ font-size: 1.875rem;
256
+ font-weight: 700;
257
+ color: var(--secondary-900);
258
+ }
259
+
260
+ /* Container */
261
+ .container {
262
+ max-width: 1200px;
263
+ margin: 0 auto;
264
+ padding: var(--space-6);
265
+ }
266
+
267
+ /* Modern Cards */
268
+ .card {
269
+ background: rgba(255, 255, 255, 0.8);
270
+ backdrop-filter: blur(20px);
271
+ border: 1px solid var(--secondary-200);
272
+ border-radius: var(--radius-2xl);
273
+ box-shadow: var(--shadow-lg);
274
+ overflow: hidden;
275
+ transition: all var(--transition-normal);
276
+ }
277
+
278
+ .card:hover {
279
+ transform: translateY(-4px);
280
+ box-shadow: var(--shadow-xl);
281
+ border-color: var(--primary-200);
282
+ }
283
+
284
+ .card-header {
285
+ padding: var(--space-6);
286
+ border-bottom: 1px solid var(--secondary-200);
287
+ background: linear-gradient(135deg, var(--secondary-50) 0%, rgba(255, 255, 255, 0.8) 100%);
288
+ }
289
+
290
+ .card-title {
291
+ font-size: 1.5rem;
292
+ font-weight: 700;
293
+ color: var(--secondary-900);
294
+ margin-bottom: var(--space-2);
295
+ }
296
+
297
+ .card-description {
298
+ color: var(--secondary-600);
299
+ font-size: 1rem;
300
+ }
301
+
302
+ .card-content {
303
+ padding: var(--space-6);
304
+ }
305
+
306
+ .card-actions {
307
+ padding: var(--space-6);
308
+ background: var(--secondary-50);
309
+ border-top: 1px solid var(--secondary-200);
310
+ display: flex;
311
+ gap: var(--space-3);
312
+ flex-wrap: wrap;
313
+ }
314
+
315
+ /* Modern Grid System */
316
+ .grid {
317
+ display: grid;
318
+ gap: var(--space-6);
319
+ }
320
+
321
+ .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
322
+ .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
323
+ .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
324
+ .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
325
+
326
+ .grid-auto {
327
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
328
+ }
329
+
330
+ /* Modern Buttons */
331
+ .btn {
332
+ display: inline-flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ gap: var(--space-2);
336
+ padding: var(--space-3) var(--space-6);
337
+ border: 2px solid transparent;
338
+ border-radius: var(--radius-xl);
339
+ font-size: 0.875rem;
340
+ font-weight: 600;
341
+ text-decoration: none;
342
+ cursor: pointer;
343
+ transition: all var(--transition-fast);
344
+ position: relative;
345
+ overflow: hidden;
346
+ }
347
+
348
+ .btn::before {
349
+ content: '';
350
+ position: absolute;
351
+ top: 50%;
352
+ left: 50%;
353
+ width: 0;
354
+ height: 0;
355
+ background: rgba(255, 255, 255, 0.2);
356
+ border-radius: 50%;
357
+ transition: all var(--transition-normal);
358
+ transform: translate(-50%, -50%);
359
+ }
360
+
361
+ .btn:hover::before {
362
+ width: 300px;
363
+ height: 300px;
364
+ }
365
+
366
+ .btn-primary {
367
+ background: linear-gradient(135deg, var(--primary-500) 0%, var(--primary-600) 100%);
368
+ color: white;
369
+ box-shadow: var(--shadow-md);
370
+ }
371
+
372
+ .btn-primary:hover {
373
+ transform: translateY(-2px);
374
+ box-shadow: var(--shadow-lg);
375
+ }
376
+
377
+ .btn-secondary {
378
+ background: white;
379
+ color: var(--secondary-700);
380
+ border-color: var(--secondary-300);
381
+ }
382
+
383
+ .btn-secondary:hover {
384
+ background: var(--secondary-50);
385
+ border-color: var(--secondary-400);
386
+ }
387
+
388
+ .btn-success {
389
+ background: linear-gradient(135deg, var(--success-500) 0%, var(--success-600) 100%);
390
+ color: white;
391
+ box-shadow: var(--shadow-md);
392
+ }
393
+
394
+ .btn-warning {
395
+ background: linear-gradient(135deg, var(--warning-500) 0%, var(--warning-600) 100%);
396
+ color: white;
397
+ box-shadow: var(--shadow-md);
398
+ }
399
+
400
+ .btn-danger {
401
+ background: linear-gradient(135deg, var(--error-500) 0%, var(--error-600) 100%);
402
+ color: white;
403
+ box-shadow: var(--shadow-md);
404
+ }
405
+
406
+ .btn-sm {
407
+ padding: var(--space-2) var(--space-4);
408
+ font-size: 0.75rem;
409
+ }
410
+
411
+ .btn-lg {
412
+ padding: var(--space-4) var(--space-8);
413
+ font-size: 1rem;
414
+ }
415
+
416
+ /* Modern Forms */
417
+ .form-group {
418
+ margin-bottom: var(--space-6);
419
+ }
420
+
421
+ .form-label {
422
+ display: block;
423
+ margin-bottom: var(--space-2);
424
+ font-weight: 600;
425
+ color: var(--secondary-800);
426
+ font-size: 0.875rem;
427
+ }
428
+
429
+ .form-input, .form-select, .form-textarea {
430
+ width: 100%;
431
+ padding: var(--space-4);
432
+ border: 2px solid var(--secondary-300);
433
+ border-radius: var(--radius-lg);
434
+ font-size: 1rem;
435
+ background: white;
436
+ transition: all var(--transition-fast);
437
+ font-family: var(--font-sans);
438
+ }
439
+
440
+ .form-input:focus, .form-select:focus, .form-textarea:focus {
441
+ outline: none;
442
+ border-color: var(--primary-500);
443
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1);
444
+ }
445
+
446
+ .form-textarea {
447
+ resize: vertical;
448
+ min-height: 120px;
449
+ }
450
+
451
+ /* File Upload */
452
+ .file-upload-area {
453
+ border: 3px dashed var(--secondary-300);
454
+ border-radius: var(--radius-2xl);
455
+ padding: var(--space-16);
456
+ text-align: center;
457
+ cursor: pointer;
458
+ transition: all var(--transition-normal);
459
+ background: linear-gradient(135deg, var(--secondary-50) 0%, white 100%);
460
+ position: relative;
461
+ overflow: hidden;
462
+ }
463
+
464
+ .file-upload-area::before {
465
+ content: '';
466
+ position: absolute;
467
+ top: 0;
468
+ left: 0;
469
+ right: 0;
470
+ bottom: 0;
471
+ background: linear-gradient(135deg, var(--primary-50) 0%, var(--primary-100) 100%);
472
+ opacity: 0;
473
+ transition: opacity var(--transition-normal);
474
+ }
475
+
476
+ .file-upload-area:hover::before,
477
+ .file-upload-area.dragover::before {
478
+ opacity: 1;
479
+ }
480
+
481
+ .file-upload-area:hover,
482
+ .file-upload-area.dragover {
483
+ border-color: var(--primary-500);
484
+ transform: scale(1.02);
485
+ }
486
+
487
+ .file-upload-content {
488
+ position: relative;
489
+ z-index: 1;
490
+ }
491
+
492
+ .file-upload-icon {
493
+ font-size: 4rem;
494
+ margin-bottom: var(--space-4);
495
+ color: var(--secondary-400);
496
+ transition: color var(--transition-fast);
497
+ }
498
+
499
+ .file-upload-area:hover .file-upload-icon {
500
+ color: var(--primary-500);
501
+ }
502
+
503
+ .file-upload-text {
504
+ font-size: 1.25rem;
505
+ font-weight: 600;
506
+ color: var(--secondary-800);
507
+ margin-bottom: var(--space-2);
508
+ }
509
+
510
+ .file-upload-hint {
511
+ color: var(--secondary-500);
512
+ font-size: 1rem;
513
+ }
514
+
515
+ /* Status Badges */
516
+ .badge {
517
+ display: inline-flex;
518
+ align-items: center;
519
+ gap: var(--space-1);
520
+ padding: var(--space-1) var(--space-3);
521
+ border-radius: var(--radius-full);
522
+ font-size: 0.75rem;
523
+ font-weight: 600;
524
+ text-transform: uppercase;
525
+ letter-spacing: 0.025em;
526
+ }
527
+
528
+ .badge-primary {
529
+ background: var(--primary-100);
530
+ color: var(--primary-700);
531
+ }
532
+
533
+ .badge-success {
534
+ background: var(--success-50);
535
+ color: var(--success-600);
536
+ }
537
+
538
+ .badge-warning {
539
+ background: var(--warning-50);
540
+ color: var(--warning-600);
541
+ }
542
+
543
+ .badge-secondary {
544
+ background: var(--secondary-100);
545
+ color: var(--secondary-600);
546
+ }
547
+
548
+ /* Server Cards */
549
+ .server-card {
550
+ background: rgba(255, 255, 255, 0.9);
551
+ backdrop-filter: blur(20px);
552
+ border: 1px solid var(--secondary-200);
553
+ border-radius: var(--radius-2xl);
554
+ overflow: hidden;
555
+ transition: all var(--transition-normal);
556
+ position: relative;
557
+ }
558
+
559
+ .server-card::before {
560
+ content: '';
561
+ position: absolute;
562
+ top: 0;
563
+ left: 0;
564
+ right: 0;
565
+ height: 4px;
566
+ background: linear-gradient(90deg, var(--primary-500) 0%, var(--primary-600) 100%);
567
+ }
568
+
569
+ .server-card:hover {
570
+ transform: translateY(-8px);
571
+ box-shadow: var(--shadow-xl);
572
+ border-color: var(--primary-300);
573
+ }
574
+
575
+ .server-card-header {
576
+ padding: var(--space-6);
577
+ background: linear-gradient(135deg, var(--secondary-50) 0%, white 100%);
578
+ }
579
+
580
+ .server-card-title {
581
+ font-size: 1.25rem;
582
+ font-weight: 700;
583
+ color: var(--secondary-900);
584
+ margin-bottom: var(--space-2);
585
+ }
586
+
587
+ .server-card-description {
588
+ color: var(--secondary-600);
589
+ line-height: 1.6;
590
+ }
591
+
592
+ .server-card-content {
593
+ padding: var(--space-6);
594
+ }
595
+
596
+ .server-stats {
597
+ display: grid;
598
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
599
+ gap: var(--space-4);
600
+ margin-bottom: var(--space-6);
601
+ }
602
+
603
+ .stat-item {
604
+ text-align: center;
605
+ padding: var(--space-4);
606
+ background: var(--secondary-50);
607
+ border-radius: var(--radius-lg);
608
+ }
609
+
610
+ .stat-value {
611
+ display: block;
612
+ font-size: 1.5rem;
613
+ font-weight: 700;
614
+ color: var(--secondary-900);
615
+ margin-bottom: var(--space-1);
616
+ }
617
+
618
+ .stat-label {
619
+ font-size: 0.75rem;
620
+ color: var(--secondary-500);
621
+ text-transform: uppercase;
622
+ letter-spacing: 0.05em;
623
+ font-weight: 600;
624
+ }
625
+
626
+ /* Empty States */
627
+ .empty-state {
628
+ text-align: center;
629
+ padding: var(--space-20);
630
+ color: var(--secondary-500);
631
+ }
632
+
633
+ .empty-state-icon {
634
+ font-size: 5rem;
635
+ margin-bottom: var(--space-6);
636
+ opacity: 0.8;
637
+ }
638
+
639
+ .empty-state-title {
640
+ font-size: 1.5rem;
641
+ font-weight: 700;
642
+ color: var(--secondary-800);
643
+ margin-bottom: var(--space-3);
644
+ }
645
+
646
+ .empty-state-description {
647
+ font-size: 1rem;
648
+ color: var(--secondary-600);
649
+ margin-bottom: var(--space-8);
650
+ max-width: 480px;
651
+ margin-left: auto;
652
+ margin-right: auto;
653
+ line-height: 1.6;
654
+ }
655
+
656
+ /* Loading States */
657
+ .loading {
658
+ display: none;
659
+ text-align: center;
660
+ padding: var(--space-8);
661
+ }
662
+
663
+ .loading.show {
664
+ display: flex;
665
+ flex-direction: column;
666
+ align-items: center;
667
+ gap: var(--space-4);
668
+ }
669
+
670
+ .spinner {
671
+ width: 32px;
672
+ height: 32px;
673
+ border: 3px solid var(--secondary-200);
674
+ border-top: 3px solid var(--primary-500);
675
+ border-radius: 50%;
676
+ animation: spin 1s linear infinite;
677
+ }
678
+
679
+ @keyframes spin {
680
+ 0% { transform: rotate(0deg); }
681
+ 100% { transform: rotate(360deg); }
682
+ }
683
+
684
+ /* Alerts */
685
+ .alert {
686
+ padding: var(--space-4) var(--space-6);
687
+ border-radius: var(--radius-lg);
688
+ margin-bottom: var(--space-6);
689
+ border-left: 4px solid;
690
+ display: none;
691
+ }
692
+
693
+ .alert.show {
694
+ display: block;
695
+ }
696
+
697
+ .alert-success {
698
+ background: var(--success-50);
699
+ color: var(--success-600);
700
+ border-color: var(--success-500);
701
+ }
702
+
703
+ .alert-error {
704
+ background: var(--error-50);
705
+ color: var(--error-600);
706
+ border-color: var(--error-500);
707
+ }
708
+
709
+ .alert-warning {
710
+ background: var(--warning-50);
711
+ color: var(--warning-600);
712
+ border-color: var(--warning-500);
713
+ }
714
+
715
+ /* Modals */
716
+ .modal-overlay {
717
+ position: fixed;
718
+ top: 0;
719
+ left: 0;
720
+ right: 0;
721
+ bottom: 0;
722
+ background: rgba(0, 0, 0, 0.6);
723
+ backdrop-filter: blur(8px);
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ z-index: 2000;
728
+ padding: var(--space-6);
729
+ opacity: 0;
730
+ visibility: hidden;
731
+ transition: all var(--transition-normal);
732
+ }
733
+
734
+ .modal-overlay.show {
735
+ opacity: 1;
736
+ visibility: visible;
737
+ }
738
+
739
+ .modal {
740
+ background: white;
741
+ border-radius: var(--radius-2xl);
742
+ box-shadow: var(--shadow-xl);
743
+ max-width: 600px;
744
+ width: 100%;
745
+ max-height: 90vh;
746
+ overflow: hidden;
747
+ transform: scale(0.9);
748
+ transition: transform var(--transition-normal);
749
+ }
750
+
751
+ .modal-overlay.show .modal {
752
+ transform: scale(1);
753
+ }
754
+
755
+ .modal-header {
756
+ padding: var(--space-6);
757
+ border-bottom: 1px solid var(--secondary-200);
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: space-between;
761
+ }
762
+
763
+ .modal-title {
764
+ font-size: 1.5rem;
765
+ font-weight: 700;
766
+ color: var(--secondary-900);
767
+ }
768
+
769
+ .modal-close {
770
+ background: none;
771
+ border: none;
772
+ font-size: 1.5rem;
773
+ color: var(--secondary-500);
774
+ cursor: pointer;
775
+ padding: var(--space-2);
776
+ border-radius: var(--radius-md);
777
+ transition: all var(--transition-fast);
778
+ }
779
+
780
+ .modal-close:hover {
781
+ background: var(--secondary-100);
782
+ color: var(--secondary-700);
783
+ }
784
+
785
+ .modal-body {
786
+ padding: var(--space-6);
787
+ overflow-y: auto;
788
+ max-height: calc(90vh - 200px);
789
+ }
790
+
791
+ /* Tabs */
792
+ .tabs {
793
+ border-bottom: 1px solid var(--secondary-200);
794
+ margin-bottom: var(--space-6);
795
+ }
796
+
797
+ .tab-list {
798
+ display: flex;
799
+ gap: var(--space-2);
800
+ padding: 0 var(--space-6);
801
+ }
802
+
803
+ .tab-button {
804
+ padding: var(--space-4) var(--space-6);
805
+ border: none;
806
+ background: none;
807
+ color: var(--secondary-600);
808
+ font-weight: 500;
809
+ border-bottom: 3px solid transparent;
810
+ cursor: pointer;
811
+ transition: all var(--transition-fast);
812
+ }
813
+
814
+ .tab-button:hover {
815
+ color: var(--secondary-900);
816
+ }
817
+
818
+ .tab-button.active {
819
+ color: var(--primary-600);
820
+ border-bottom-color: var(--primary-500);
821
+ }
822
+
823
+ .tab-content {
824
+ display: none;
825
+ }
826
+
827
+ .tab-content.active {
828
+ display: block;
829
+ }
830
+
831
+ /* Responsive Design */
832
+ @media (max-width: 1024px) {
833
+ .grid-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
834
+ .grid-cols-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
835
+ }
836
+
837
+ @media (max-width: 768px) {
838
+ .hamburger {
839
+ display: flex;
840
+ }
841
+
842
+ .sidebar {
843
+ transform: translateX(-100%);
844
+ }
845
+
846
+ .main-content {
847
+ margin-left: 0;
848
+ }
849
+
850
+ .grid-cols-4,
851
+ .grid-cols-3,
852
+ .grid-cols-2 {
853
+ grid-template-columns: 1fr;
854
+ }
855
+
856
+ .grid-auto {
857
+ grid-template-columns: 1fr;
858
+ }
859
+
860
+ .container {
861
+ padding: var(--space-4);
862
+ }
863
+
864
+ .card-actions {
865
+ flex-direction: column;
866
+ }
867
+
868
+ .server-stats {
869
+ grid-template-columns: repeat(2, 1fr);
870
+ }
871
+
872
+ .modal {
873
+ margin: var(--space-4);
874
+ max-width: none;
875
+ }
876
+ }
877
+
878
+ @media (max-width: 480px) {
879
+ .page-title {
880
+ font-size: 1.5rem;
881
+ }
882
+
883
+ .server-stats {
884
+ grid-template-columns: 1fr;
885
+ }
886
+
887
+ .stat-item {
888
+ text-align: left;
889
+ }
890
+
891
+ .file-upload-area {
892
+ padding: var(--space-8);
893
+ }
894
+
895
+ .file-upload-icon {
896
+ font-size: 3rem;
897
+ }
898
+ }
899
+
900
+ /* Sidebar overlay for mobile */
901
+ .sidebar-overlay {
902
+ position: fixed;
903
+ top: 0;
904
+ left: 0;
905
+ right: 0;
906
+ bottom: 0;
907
+ background: rgba(0, 0, 0, 0.5);
908
+ z-index: 999;
909
+ opacity: 0;
910
+ visibility: hidden;
911
+ transition: all var(--transition-normal);
912
+ }
913
+
914
+ .sidebar-overlay.show {
915
+ opacity: 1;
916
+ visibility: visible;
917
+ }
918
+
919
+ /* Utilities */
920
+ .hidden { display: none !important; }
921
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
922
+
923
+ /* Dark mode support */
924
+ @media (prefers-color-scheme: dark) {
925
+ :root {
926
+ --secondary-50: #0f172a;
927
+ --secondary-100: #1e293b;
928
+ --secondary-200: #334155;
929
+ --secondary-300: #475569;
930
+ --secondary-400: #64748b;
931
+ --secondary-500: #94a3b8;
932
+ --secondary-600: #cbd5e1;
933
+ --secondary-700: #e2e8f0;
934
+ --secondary-800: #f1f5f9;
935
+ --secondary-900: #f8fafc;
936
+ }
937
+
938
+ body {
939
+ background: linear-gradient(135deg, var(--secondary-900) 0%, var(--secondary-800) 100%);
940
+ }
941
+
942
+ .card, .server-card {
943
+ background: rgba(30, 41, 59, 0.8);
944
+ border-color: var(--secondary-700);
945
+ }
946
+ }