create-fluxstack 1.7.5 → 1.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.dockerignore +82 -0
  2. package/.env.example +19 -0
  3. package/Dockerfile +70 -0
  4. package/README.md +6 -3
  5. package/app/client/SIMPLIFICATION.md +140 -0
  6. package/app/client/frontend-only.ts +1 -1
  7. package/app/client/src/App.tsx +148 -283
  8. package/app/client/src/index.css +5 -20
  9. package/app/client/src/lib/eden-api.ts +53 -220
  10. package/app/client/src/main.tsx +2 -3
  11. package/app/server/app.ts +20 -5
  12. package/app/server/backend-only.ts +15 -12
  13. package/app/server/controllers/users.controller.ts +57 -31
  14. package/app/server/index.ts +86 -96
  15. package/app/server/live/register-components.ts +18 -7
  16. package/app/server/routes/env-test.ts +110 -0
  17. package/app/server/routes/index.ts +1 -8
  18. package/app/server/routes/users.routes.ts +192 -91
  19. package/config/app.config.ts +2 -54
  20. package/config/client.config.ts +95 -0
  21. package/config/fluxstack.config.ts +2 -2
  22. package/config/index.ts +57 -22
  23. package/config/monitoring.config.ts +114 -0
  24. package/config/plugins.config.ts +80 -0
  25. package/config/runtime.config.ts +0 -17
  26. package/config/server.config.ts +50 -30
  27. package/core/build/bundler.ts +17 -16
  28. package/core/build/flux-plugins-generator.ts +34 -23
  29. package/core/build/index.ts +32 -31
  30. package/core/build/live-components-generator.ts +44 -30
  31. package/core/build/optimizer.ts +37 -17
  32. package/core/cli/command-registry.ts +4 -14
  33. package/core/cli/commands/plugin-deps.ts +8 -8
  34. package/core/cli/generators/component.ts +3 -3
  35. package/core/cli/generators/controller.ts +4 -4
  36. package/core/cli/generators/index.ts +8 -8
  37. package/core/cli/generators/interactive.ts +4 -4
  38. package/core/cli/generators/plugin.ts +3 -3
  39. package/core/cli/generators/prompts.ts +1 -1
  40. package/core/cli/generators/route.ts +27 -11
  41. package/core/cli/generators/service.ts +5 -5
  42. package/core/cli/generators/template-engine.ts +1 -1
  43. package/core/cli/generators/types.ts +1 -1
  44. package/core/cli/index.ts +158 -189
  45. package/core/cli/plugin-discovery.ts +3 -3
  46. package/core/client/hooks/index.ts +2 -2
  47. package/core/client/hooks/state-validator.ts +1 -1
  48. package/core/client/hooks/useAuth.ts +1 -1
  49. package/core/client/hooks/useChunkedUpload.ts +1 -1
  50. package/core/client/hooks/useHybridLiveComponent.ts +1 -1
  51. package/core/client/hooks/useWebSocket.ts +1 -1
  52. package/core/config/env.ts +5 -1
  53. package/core/config/runtime-config.ts +12 -10
  54. package/core/config/schema.ts +33 -2
  55. package/core/framework/server.ts +30 -14
  56. package/core/framework/types.ts +2 -2
  57. package/core/index.ts +31 -23
  58. package/core/live/ComponentRegistry.ts +1 -1
  59. package/core/plugins/built-in/live-components/commands/create-live-component.ts +1 -1
  60. package/core/plugins/built-in/live-components/index.ts +1 -1
  61. package/core/plugins/built-in/monitoring/index.ts +65 -161
  62. package/core/plugins/built-in/static/index.ts +75 -277
  63. package/core/plugins/built-in/swagger/index.ts +301 -231
  64. package/core/plugins/built-in/vite/index.ts +342 -377
  65. package/core/plugins/config.ts +2 -2
  66. package/core/plugins/dependency-manager.ts +2 -2
  67. package/core/plugins/discovery.ts +1 -1
  68. package/core/plugins/executor.ts +2 -2
  69. package/core/plugins/manager.ts +19 -4
  70. package/core/plugins/module-resolver.ts +1 -1
  71. package/core/plugins/registry.ts +25 -21
  72. package/core/plugins/types.ts +147 -5
  73. package/core/server/backend-entry.ts +51 -0
  74. package/core/server/framework.ts +2 -2
  75. package/core/server/live/ComponentRegistry.ts +9 -26
  76. package/core/server/live/FileUploadManager.ts +1 -1
  77. package/core/server/live/auto-generated-components.ts +26 -0
  78. package/core/server/live/websocket-plugin.ts +211 -19
  79. package/core/server/middleware/errorHandling.ts +1 -1
  80. package/core/server/middleware/index.ts +4 -4
  81. package/core/server/plugins/database.ts +1 -2
  82. package/core/server/plugins/static-files-plugin.ts +259 -231
  83. package/core/server/plugins/swagger.ts +1 -1
  84. package/core/server/services/BaseService.ts +1 -1
  85. package/core/server/services/ServiceContainer.ts +1 -1
  86. package/core/server/services/index.ts +4 -4
  87. package/core/server/standalone.ts +16 -1
  88. package/core/testing/index.ts +1 -1
  89. package/core/testing/setup.ts +1 -1
  90. package/core/types/plugin.ts +6 -0
  91. package/core/utils/build-logger.ts +324 -0
  92. package/core/utils/config-schema.ts +2 -6
  93. package/core/utils/helpers.ts +14 -9
  94. package/core/utils/logger/startup-banner.ts +7 -33
  95. package/core/utils/regenerate-files.ts +69 -0
  96. package/core/utils/version.ts +6 -6
  97. package/create-fluxstack.ts +68 -25
  98. package/fluxstack.config.ts +138 -252
  99. package/package.json +3 -18
  100. package/plugins/crypto-auth/index.ts +52 -47
  101. package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
  102. package/plugins/crypto-auth/server/middlewares/helpers.ts +16 -1
  103. package/vitest.config.ts +17 -26
  104. package/app/client/src/App.css +0 -883
  105. package/app/client/src/components/ErrorBoundary.tsx +0 -107
  106. package/app/client/src/components/ErrorDisplay.css +0 -365
  107. package/app/client/src/components/ErrorDisplay.tsx +0 -258
  108. package/app/client/src/components/FluxStackConfig.tsx +0 -1321
  109. package/app/client/src/components/HybridLiveCounter.tsx +0 -140
  110. package/app/client/src/components/LiveClock.tsx +0 -286
  111. package/app/client/src/components/MainLayout.tsx +0 -388
  112. package/app/client/src/components/SidebarNavigation.tsx +0 -391
  113. package/app/client/src/components/StateDemo.tsx +0 -178
  114. package/app/client/src/components/SystemMonitor.tsx +0 -1044
  115. package/app/client/src/components/UserProfile.tsx +0 -809
  116. package/app/client/src/hooks/useAuth.ts +0 -39
  117. package/app/client/src/hooks/useNotifications.ts +0 -56
  118. package/app/client/src/lib/errors.ts +0 -340
  119. package/app/client/src/lib/hooks/useErrorHandler.ts +0 -258
  120. package/app/client/src/lib/index.ts +0 -45
  121. package/app/client/src/pages/ApiDocs.tsx +0 -182
  122. package/app/client/src/pages/CryptoAuthPage.tsx +0 -394
  123. package/app/client/src/pages/Demo.tsx +0 -174
  124. package/app/client/src/pages/HybridLive.tsx +0 -263
  125. package/app/client/src/pages/Overview.tsx +0 -155
  126. package/app/client/src/store/README.md +0 -43
  127. package/app/client/src/store/index.ts +0 -16
  128. package/app/client/src/store/slices/uiSlice.ts +0 -151
  129. package/app/client/src/store/slices/userSlice.ts +0 -161
  130. package/app/client/src/test/README.md +0 -257
  131. package/app/client/src/test/setup.ts +0 -70
  132. package/app/client/src/test/types.ts +0 -12
  133. package/app/server/live/CounterComponent.ts +0 -191
  134. package/app/server/live/FluxStackConfig.ts +0 -534
  135. package/app/server/live/SidebarNavigation.ts +0 -157
  136. package/app/server/live/SystemMonitor.ts +0 -595
  137. package/app/server/live/SystemMonitorIntegration.ts +0 -151
  138. package/app/server/live/UserProfileComponent.ts +0 -141
  139. package/app/server/middleware/auth.ts +0 -136
  140. package/app/server/middleware/errorHandling.ts +0 -252
  141. package/app/server/middleware/index.ts +0 -10
  142. package/app/server/middleware/rateLimit.ts +0 -193
  143. package/app/server/middleware/requestLogging.ts +0 -215
  144. package/app/server/middleware/validation.ts +0 -270
  145. package/app/server/routes/config.ts +0 -145
  146. package/app/server/routes/crypto-auth-demo.routes.ts +0 -167
  147. package/app/server/routes/example-with-crypto-auth.routes.ts +0 -235
  148. package/app/server/routes/exemplo-posts.routes.ts +0 -161
  149. package/app/server/routes/upload.ts +0 -92
  150. package/app/server/services/NotificationService.ts +0 -302
  151. package/app/server/services/UserService.ts +0 -222
  152. package/app/server/services/index.ts +0 -46
  153. package/app/server/types/index.ts +0 -1
  154. package/config/build.config.ts +0 -24
@@ -1,883 +0,0 @@
1
- /* Clean Modern App Styles */
2
-
3
- * {
4
- box-sizing: border-box;
5
- }
6
-
7
- #root {
8
- max-width: none;
9
- margin: 0;
10
- padding: 0;
11
- }
12
-
13
- body {
14
- margin: 0;
15
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
16
- -webkit-font-smoothing: antialiased;
17
- -moz-osx-font-smoothing: grayscale;
18
- background: #f8fafc;
19
- color: #1e293b;
20
- line-height: 1.6;
21
- }
22
-
23
- .app {
24
- min-height: 100vh;
25
- background: #f8fafc;
26
- }
27
-
28
- /* Header */
29
- .header {
30
- background: white;
31
- border-bottom: 1px solid #e2e8f0;
32
- padding: 1rem 0;
33
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
34
- }
35
-
36
- .header-content {
37
- max-width: 1200px;
38
- margin: 0 auto;
39
- padding: 0 1rem;
40
- display: flex;
41
- justify-content: space-between;
42
- align-items: center;
43
- }
44
-
45
- .header-left {
46
- display: flex;
47
- align-items: center;
48
- gap: 2rem;
49
- }
50
-
51
- .logo {
52
- font-size: 1.5rem;
53
- font-weight: 700;
54
- color: #2563eb;
55
- display: flex;
56
- align-items: center;
57
- gap: 0.5rem;
58
- }
59
-
60
- .header-tabs {
61
- display: flex;
62
- gap: 0;
63
- align-items: center;
64
- }
65
-
66
- .status-badge {
67
- display: flex;
68
- align-items: center;
69
- gap: 0.5rem;
70
- padding: 0.5rem 1rem;
71
- border-radius: 6px;
72
- font-size: 0.875rem;
73
- font-weight: 500;
74
- }
75
-
76
- .status-badge.online {
77
- background: #dcfce7;
78
- color: #166534;
79
- }
80
-
81
- .status-badge.offline {
82
- background: #fee2e2;
83
- color: #991b1b;
84
- }
85
-
86
- .status-dot {
87
- width: 8px;
88
- height: 8px;
89
- border-radius: 50%;
90
- }
91
-
92
- .status-badge.online .status-dot {
93
- background: #22c55e;
94
- }
95
-
96
- .status-badge.offline .status-dot {
97
- background: #ef4444;
98
- }
99
-
100
- /* Main Content */
101
- .main {
102
- max-width: 1200px;
103
- margin: 0 auto;
104
- padding: 2rem 1rem;
105
- }
106
-
107
- .page-title {
108
- font-size: 2rem;
109
- font-weight: 700;
110
- color: #1a202c;
111
- margin-bottom: 0.5rem;
112
- }
113
-
114
- .page-subtitle {
115
- color: #64748b;
116
- font-size: 1.125rem;
117
- margin-bottom: 2rem;
118
- }
119
-
120
- /* Stats Grid */
121
- .stats-grid {
122
- display: grid;
123
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
124
- gap: 1rem;
125
- margin-bottom: 2rem;
126
- }
127
-
128
- .stat-card {
129
- background: white;
130
- border: 1px solid #e2e8f0;
131
- border-radius: 8px;
132
- padding: 1.5rem;
133
- text-align: center;
134
- transition: all 0.2s ease;
135
- }
136
-
137
- .stat-card:hover {
138
- border-color: #2563eb;
139
- box-shadow: 0 4px 12px rgba(37, 99, 235, 0.1);
140
- }
141
-
142
- .stat-number {
143
- font-size: 2.5rem;
144
- font-weight: 700;
145
- color: #2563eb;
146
- margin-bottom: 0.5rem;
147
- line-height: 1;
148
- }
149
-
150
- .stat-label {
151
- color: #64748b;
152
- font-size: 0.875rem;
153
- font-weight: 500;
154
- text-transform: uppercase;
155
- letter-spacing: 0.05em;
156
- }
157
-
158
- /* Form Section */
159
- .form-section {
160
- background: white;
161
- border: 1px solid #e2e8f0;
162
- border-radius: 8px;
163
- padding: 1.5rem;
164
- margin-bottom: 2rem;
165
- }
166
-
167
- .section-title {
168
- font-size: 1.25rem;
169
- font-weight: 600;
170
- color: #1a202c;
171
- margin-bottom: 1rem;
172
- }
173
-
174
- .form-grid {
175
- display: grid;
176
- grid-template-columns: 1fr 1fr auto;
177
- gap: 1rem;
178
- align-items: end;
179
- }
180
-
181
- .form-group {
182
- display: flex;
183
- flex-direction: column;
184
- }
185
-
186
- .form-label {
187
- font-size: 0.875rem;
188
- font-weight: 500;
189
- color: #374151;
190
- margin-bottom: 0.5rem;
191
- }
192
-
193
- .form-input {
194
- padding: 0.75rem;
195
- border: 1px solid #d1d5db;
196
- border-radius: 6px;
197
- font-size: 1rem;
198
- transition: all 0.2s ease;
199
- background: white;
200
- }
201
-
202
- .form-input:focus {
203
- outline: none;
204
- border-color: #2563eb;
205
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
206
- }
207
-
208
- .btn {
209
- padding: 0.75rem 1.5rem;
210
- border: none;
211
- border-radius: 6px;
212
- font-size: 0.875rem;
213
- font-weight: 500;
214
- cursor: pointer;
215
- transition: all 0.2s ease;
216
- display: inline-flex;
217
- align-items: center;
218
- gap: 0.5rem;
219
- }
220
-
221
- .btn-primary {
222
- background: #2563eb;
223
- color: white;
224
- }
225
-
226
- .btn-primary:hover:not(:disabled) {
227
- background: #1d4ed8;
228
- }
229
-
230
- .btn-secondary {
231
- background: #f1f5f9;
232
- color: #475569;
233
- border: 1px solid #e2e8f0;
234
- }
235
-
236
- .btn-secondary:hover:not(:disabled) {
237
- background: #e2e8f0;
238
- }
239
-
240
- .btn:disabled {
241
- opacity: 0.5;
242
- cursor: not-allowed;
243
- }
244
-
245
- /* Users Section */
246
- .users-section {
247
- background: white;
248
- border: 1px solid #e2e8f0;
249
- border-radius: 8px;
250
- padding: 1.5rem;
251
- }
252
-
253
- .section-header {
254
- display: flex;
255
- justify-content: space-between;
256
- align-items: center;
257
- margin-bottom: 1.5rem;
258
- }
259
-
260
- .users-grid {
261
- display: grid;
262
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
263
- gap: 1rem;
264
- }
265
-
266
- .user-card {
267
- border: 1px solid #e2e8f0;
268
- border-radius: 6px;
269
- padding: 1rem;
270
- transition: all 0.2s ease;
271
- }
272
-
273
- .user-card:hover {
274
- border-color: #2563eb;
275
- box-shadow: 0 2px 8px rgba(37, 99, 235, 0.1);
276
- }
277
-
278
- .user-avatar {
279
- width: 40px;
280
- height: 40px;
281
- border-radius: 50%;
282
- background: linear-gradient(135deg, #2563eb, #1d4ed8);
283
- display: flex;
284
- align-items: center;
285
- justify-content: center;
286
- color: white;
287
- font-weight: 600;
288
- margin-bottom: 0.75rem;
289
- }
290
-
291
- .user-name {
292
- font-weight: 600;
293
- color: #1a202c;
294
- margin-bottom: 0.25rem;
295
- }
296
-
297
- .user-email {
298
- color: #64748b;
299
- font-size: 0.875rem;
300
- margin-bottom: 0.75rem;
301
- }
302
-
303
- .user-actions {
304
- display: flex;
305
- gap: 0.5rem;
306
- }
307
-
308
- .btn-sm {
309
- padding: 0.5rem 0.75rem;
310
- font-size: 0.75rem;
311
- }
312
-
313
- .btn-danger {
314
- background: #ef4444;
315
- color: white;
316
- }
317
-
318
- .btn-danger:hover:not(:disabled) {
319
- background: #dc2626;
320
- }
321
-
322
- /* Empty State */
323
- .empty-state {
324
- text-align: center;
325
- padding: 3rem 1rem;
326
- color: #64748b;
327
- }
328
-
329
- .empty-icon {
330
- font-size: 3rem;
331
- margin-bottom: 1rem;
332
- opacity: 0.5;
333
- }
334
-
335
- /* Loading */
336
- .loading {
337
- text-align: center;
338
- padding: 2rem;
339
- color: #64748b;
340
- }
341
-
342
- .spinner {
343
- width: 20px;
344
- height: 20px;
345
- border: 2px solid #e2e8f0;
346
- border-top-color: #2563eb;
347
- border-radius: 50%;
348
- animation: spin 1s linear infinite;
349
- display: inline-block;
350
- margin-right: 0.5rem;
351
- }
352
-
353
- @keyframes spin {
354
- to { transform: rotate(360deg); }
355
- }
356
-
357
- /* Toast Notifications */
358
- .toast {
359
- position: fixed;
360
- top: 1rem;
361
- right: 1rem;
362
- z-index: 1000;
363
- padding: 1rem 1.5rem;
364
- border-radius: 6px;
365
- color: white;
366
- font-weight: 500;
367
- cursor: pointer;
368
- transition: all 0.3s ease;
369
- transform: translateY(-100px);
370
- opacity: 0;
371
- max-width: 400px;
372
- }
373
-
374
- .toast.show {
375
- transform: translateY(0);
376
- opacity: 1;
377
- }
378
-
379
- .toast.success {
380
- background: #22c55e;
381
- }
382
-
383
- .toast.error {
384
- background: #ef4444;
385
- }
386
-
387
- /* Responsive */
388
- @media (max-width: 768px) {
389
- .header-content {
390
- flex-direction: column;
391
- gap: 1rem;
392
- }
393
-
394
- .header-left {
395
- flex-direction: column;
396
- gap: 1rem;
397
- align-items: center;
398
- }
399
-
400
- .header-tabs {
401
- gap: 0.5rem;
402
- }
403
-
404
- .tab {
405
- padding: 0.5rem 1rem;
406
- font-size: 0.8rem;
407
- }
408
-
409
- .form-grid {
410
- grid-template-columns: 1fr;
411
- }
412
-
413
- .stats-grid {
414
- grid-template-columns: repeat(2, 1fr);
415
- }
416
-
417
- .users-grid {
418
- grid-template-columns: 1fr;
419
- }
420
-
421
- .section-header {
422
- flex-direction: column;
423
- gap: 1rem;
424
- align-items: stretch;
425
- }
426
- }
427
-
428
- @media (max-width: 480px) {
429
- .stats-grid {
430
- grid-template-columns: 1fr;
431
- }
432
- }
433
-
434
- .tab {
435
- background: none;
436
- border: none;
437
- padding: 0.75rem 1.5rem;
438
- cursor: pointer;
439
- font-size: 0.875rem;
440
- font-weight: 500;
441
- color: #64748b;
442
- border-radius: 6px;
443
- transition: all 0.2s ease;
444
- position: relative;
445
- }
446
-
447
- .tab:hover {
448
- color: #2563eb;
449
- background: rgba(37, 99, 235, 0.05);
450
- }
451
-
452
- .tab.active {
453
- color: #2563eb;
454
- background: rgba(37, 99, 235, 0.1);
455
- }
456
-
457
- /* Overview Content */
458
- .overview-content {
459
- padding: 2rem 0;
460
- }
461
-
462
- .hero-section {
463
- text-align: center;
464
- margin-bottom: 4rem;
465
- }
466
-
467
- .hero-text h1 {
468
- font-size: 4rem;
469
- font-weight: 700;
470
- margin-bottom: 1rem;
471
- background: linear-gradient(135deg, #2563eb, #1d4ed8);
472
- -webkit-background-clip: text;
473
- -webkit-text-fill-color: transparent;
474
- background-clip: text;
475
- }
476
-
477
- .hero-subtitle {
478
- font-size: 1.5rem;
479
- color: #64748b;
480
- margin-bottom: 3rem;
481
- max-width: 600px;
482
- margin-left: auto;
483
- margin-right: auto;
484
- }
485
-
486
- .features-grid {
487
- display: grid;
488
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
489
- gap: 2rem;
490
- margin-top: 3rem;
491
- }
492
-
493
- .feature-item {
494
- background: white;
495
- border: 1px solid #e2e8f0;
496
- border-radius: 12px;
497
- padding: 2rem;
498
- text-align: center;
499
- transition: all 0.2s ease;
500
- }
501
-
502
- .feature-item:hover {
503
- border-color: #2563eb;
504
- box-shadow: 0 8px 25px rgba(37, 99, 235, 0.15);
505
- transform: translateY(-2px);
506
- }
507
-
508
- .feature-icon {
509
- font-size: 3rem;
510
- margin-bottom: 1rem;
511
- display: block;
512
- }
513
-
514
- .feature-item h3 {
515
- font-size: 1.25rem;
516
- font-weight: 600;
517
- color: #1a202c;
518
- margin-bottom: 0.5rem;
519
- }
520
-
521
- .feature-item p {
522
- color: #64748b;
523
- margin: 0;
524
- }
525
-
526
- .tech-stack {
527
- background: white;
528
- border: 1px solid #e2e8f0;
529
- border-radius: 12px;
530
- padding: 3rem;
531
- margin-top: 3rem;
532
- }
533
-
534
- .tech-stack h2 {
535
- text-align: center;
536
- font-size: 2rem;
537
- font-weight: 600;
538
- color: #1a202c;
539
- margin-bottom: 2rem;
540
- }
541
-
542
- .stack-items {
543
- display: grid;
544
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
545
- gap: 2rem;
546
- }
547
-
548
- .stack-category h3 {
549
- color: #2563eb;
550
- font-size: 1.25rem;
551
- font-weight: 600;
552
- margin-bottom: 1rem;
553
- padding-bottom: 0.5rem;
554
- border-bottom: 2px solid #e2e8f0;
555
- }
556
-
557
- .stack-category ul {
558
- list-style: none;
559
- padding: 0;
560
- margin: 0;
561
- }
562
-
563
- .stack-category li {
564
- padding: 0.5rem 0;
565
- color: #4b5563;
566
- border-bottom: 1px solid #f1f5f9;
567
- }
568
-
569
- .stack-category li:last-child {
570
- border-bottom: none;
571
- }
572
-
573
- /* Demo Content */
574
- .demo-content {
575
- padding: 2rem 0;
576
- }
577
-
578
- .demo-content h2 {
579
- font-size: 2rem;
580
- font-weight: 600;
581
- color: #1a202c;
582
- margin-bottom: 0.5rem;
583
- }
584
-
585
- .demo-subtitle {
586
- color: #64748b;
587
- font-size: 1.125rem;
588
- margin-bottom: 2rem;
589
- }
590
-
591
- /* API Docs */
592
- .api-docs {
593
- padding: 2rem 0;
594
- }
595
-
596
- .api-docs h2 {
597
- font-size: 2rem;
598
- font-weight: 600;
599
- color: #1a202c;
600
- margin-bottom: 0.5rem;
601
- }
602
-
603
- .api-subtitle {
604
- color: #64748b;
605
- font-size: 1.125rem;
606
- margin-bottom: 2rem;
607
- }
608
-
609
- .swagger-links {
610
- display: grid;
611
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
612
- gap: 1.5rem;
613
- margin-bottom: 2rem;
614
- }
615
-
616
- .swagger-iframe-container {
617
- margin: 2rem 0;
618
- background: white;
619
- border-radius: 8px;
620
- overflow: hidden;
621
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
622
- }
623
-
624
- .swagger-iframe-container h3 {
625
- margin: 0;
626
- padding: 1rem 1.5rem;
627
- background: #f8fafc;
628
- border-bottom: 1px solid #e2e8f0;
629
- font-size: 1.1rem;
630
- color: #475569;
631
- }
632
-
633
- .swagger-iframe {
634
- width: 100%;
635
- height: 800px;
636
- border: none;
637
- display: block;
638
- }
639
-
640
- .swagger-card {
641
- background: white;
642
- border: 1px solid #e2e8f0;
643
- border-radius: 12px;
644
- padding: 2rem;
645
- text-align: center;
646
- transition: all 0.2s ease;
647
- }
648
-
649
- .swagger-card:hover {
650
- border-color: #2563eb;
651
- box-shadow: 0 8px 25px rgba(37, 99, 235, 0.15);
652
- transform: translateY(-2px);
653
- }
654
-
655
- .swagger-card h3 {
656
- font-size: 1.25rem;
657
- font-weight: 600;
658
- color: #1a202c;
659
- margin-bottom: 0.5rem;
660
- }
661
-
662
- .swagger-card p {
663
- color: #64748b;
664
- margin-bottom: 1.5rem;
665
- }
666
-
667
- .swagger-card .btn {
668
- text-decoration: none;
669
- display: inline-flex;
670
- align-items: center;
671
- gap: 0.5rem;
672
- }
673
-
674
- .swagger-preview {
675
- background: white;
676
- border: 1px solid #e2e8f0;
677
- border-radius: 12px;
678
- padding: 2rem;
679
- margin-bottom: 2rem;
680
- }
681
-
682
- .swagger-preview h3 {
683
- font-size: 1.5rem;
684
- font-weight: 600;
685
- color: #1a202c;
686
- margin-bottom: 1.5rem;
687
- }
688
-
689
- .code-examples {
690
- display: flex;
691
- flex-direction: column;
692
- gap: 2rem;
693
- }
694
-
695
- .example-section h4 {
696
- font-size: 1rem;
697
- font-weight: 600;
698
- color: #374151;
699
- margin-bottom: 0.5rem;
700
- }
701
-
702
- .api-features {
703
- background: white;
704
- border: 1px solid #e2e8f0;
705
- border-radius: 12px;
706
- padding: 2rem;
707
- }
708
-
709
- .api-features h3 {
710
- font-size: 1.5rem;
711
- font-weight: 600;
712
- color: #1a202c;
713
- margin-bottom: 1.5rem;
714
- text-align: center;
715
- }
716
-
717
- .features-list {
718
- display: grid;
719
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
720
- gap: 1.5rem;
721
- }
722
-
723
- .feature {
724
- display: flex;
725
- align-items: flex-start;
726
- gap: 1rem;
727
- padding: 1rem;
728
- border-radius: 8px;
729
- transition: all 0.2s ease;
730
- }
731
-
732
- .feature:hover {
733
- background: #f8fafc;
734
- }
735
-
736
- .feature-icon {
737
- font-size: 2rem;
738
- line-height: 1;
739
- }
740
-
741
- .feature h4 {
742
- font-size: 1rem;
743
- font-weight: 600;
744
- color: #1a202c;
745
- margin-bottom: 0.25rem;
746
- }
747
-
748
- .feature p {
749
- color: #64748b;
750
- font-size: 0.875rem;
751
- margin: 0;
752
- }
753
-
754
- .endpoint-section {
755
- margin-bottom: 3rem;
756
- }
757
-
758
- .endpoint-section h3 {
759
- font-size: 1.5rem;
760
- font-weight: 600;
761
- color: #1a202c;
762
- margin-bottom: 1rem;
763
- }
764
-
765
- .endpoint-card {
766
- background: white;
767
- border: 1px solid #e2e8f0;
768
- border-radius: 8px;
769
- overflow: hidden;
770
- }
771
-
772
- .endpoint-header {
773
- background: #f8fafc;
774
- padding: 1rem 1.5rem;
775
- border-bottom: 1px solid #e2e8f0;
776
- display: flex;
777
- align-items: center;
778
- gap: 1rem;
779
- }
780
-
781
- .method {
782
- padding: 0.25rem 0.75rem;
783
- border-radius: 4px;
784
- font-size: 0.75rem;
785
- font-weight: 600;
786
- text-transform: uppercase;
787
- letter-spacing: 0.05em;
788
- }
789
-
790
- .method.get {
791
- background: #dcfce7;
792
- color: #166534;
793
- }
794
-
795
- .method.post {
796
- background: #dbeafe;
797
- color: #1e40af;
798
- }
799
-
800
- .method.delete {
801
- background: #fee2e2;
802
- color: #991b1b;
803
- }
804
-
805
- .endpoint-header code {
806
- background: #f1f5f9;
807
- padding: 0.25rem 0.5rem;
808
- border-radius: 4px;
809
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
810
- font-size: 0.875rem;
811
- }
812
-
813
- .endpoint-body {
814
- padding: 1.5rem;
815
- }
816
-
817
- .endpoint-body h4 {
818
- font-size: 1rem;
819
- font-weight: 600;
820
- color: #374151;
821
- margin: 1.5rem 0 0.5rem 0;
822
- }
823
-
824
- .endpoint-body h4:first-child {
825
- margin-top: 0;
826
- }
827
-
828
- .code-block {
829
- background: #1e293b;
830
- color: #e2e8f0;
831
- padding: 1rem;
832
- border-radius: 6px;
833
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
834
- font-size: 0.875rem;
835
- line-height: 1.6;
836
- overflow-x: auto;
837
- margin: 0.5rem 0 1rem 0;
838
- border: 1px solid #334155;
839
- }
840
-
841
- /* Responsive Enhancements */
842
- @media (max-width: 768px) {
843
- .hero-text h1 {
844
- font-size: 3rem;
845
- }
846
-
847
- .hero-subtitle {
848
- font-size: 1.25rem;
849
- }
850
-
851
- .features-grid {
852
- grid-template-columns: 1fr;
853
- }
854
-
855
- .stack-items {
856
- grid-template-columns: 1fr;
857
- }
858
-
859
- .tech-stack {
860
- padding: 2rem 1.5rem;
861
- }
862
-
863
- .endpoint-header {
864
- flex-direction: column;
865
- align-items: flex-start;
866
- gap: 0.5rem;
867
- }
868
- }
869
-
870
- @media (max-width: 480px) {
871
- .hero-text h1 {
872
- font-size: 2.5rem;
873
- }
874
-
875
- .header-left {
876
- gap: 0.5rem;
877
- }
878
-
879
- .tab {
880
- padding: 0.5rem 0.75rem;
881
- font-size: 0.75rem;
882
- }
883
- }