heimdall-api-platform 1.6.0 → 1.8.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.
- package/dist/lib/clients/http-client.js +1 -1
- package/dist/lib/environment.js +1 -1
- package/dist/lib/factory/api-gateway.js +1 -1
- package/dist/lib/factory/client-factory.js +1 -1
- package/dist/lib/factory/function-factory.js +1 -1
- package/dist/lib/factory/operation-flow-factory.js +1 -1
- package/dist/lib/factory/server-factory.js +1 -1
- package/dist/lib/factory/transformation-function-factory.js +1 -1
- package/dist/lib/handle-route.js +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/integrations/commons-elasticsearch.js +1 -1
- package/dist/lib/integrations/commons-opensearch.js +1 -1
- package/dist/lib/integrations/commons-splunk.js +1 -1
- package/dist/lib/license/license-service.js +1 -1
- package/dist/lib/models/base-context.js +1 -1
- package/dist/lib/models/flow-context.js +1 -1
- package/dist/lib/models/monitor-request-view.js +1 -1
- package/dist/lib/models/route-context.js +1 -1
- package/dist/lib/models/security-route.js +1 -1
- package/dist/lib/models/service-context.js +1 -1
- package/dist/lib/models/service-group.js +1 -1
- package/dist/lib/models/service-route.js +1 -1
- package/dist/lib/models/splunk-data.js +1 -1
- package/dist/lib/observability/models/monitor-flow-step.js +1 -1
- package/dist/lib/observability/models/monitor-function-operation.js +1 -1
- package/dist/lib/observability/models/monitor-function-transformation.js +1 -1
- package/dist/lib/observability/models/monitor-http-operation.js +1 -1
- package/dist/lib/observability/models/monitor-mock-operation.js +1 -1
- package/dist/lib/observability/monitor-event-bus.js +1 -1
- package/dist/lib/observability/monitor-event.js +1 -1
- package/dist/lib/observability/subscribers/monitor-event-subscriber.js +1 -1
- package/dist/lib/observability/subscribers/opensearch-event-subscriber.js +1 -1
- package/dist/lib/observability/subscribers/redis-event-subscriber.js +1 -1
- package/dist/lib/observability/subscribers/splunk-event-subscriber.js +1 -1
- package/dist/lib/operations/abstract-operation.js +1 -1
- package/dist/lib/operations/function.js +1 -1
- package/dist/lib/operations/http.js +1 -1
- package/dist/lib/operations/mock.js +1 -1
- package/dist/lib/operations/monitor-check.js +1 -1
- package/dist/lib/orchestration-flow.js +1 -1
- package/dist/lib/router.js +1 -1
- package/dist/lib/routes/default-routes-admin.js +1 -1
- package/dist/lib/routes/default-routes-docs.js +1 -1
- package/dist/lib/routes/default-routes-monitor-metrics.js +1 -1
- package/dist/lib/routes/default-routes-opensearch.js +1 -1
- package/dist/lib/routes/default-routes-pos.js +1 -1
- package/dist/lib/routes/default-routes-pre.js +1 -1
- package/dist/lib/routes/native-routes-catalog.js +1 -1
- package/dist/lib/security/api-key-validator.js +1 -1
- package/dist/lib/security/jwt-util.js +1 -1
- package/dist/lib/security/quota-enforcer.js +1 -1
- package/dist/lib/security/rate-limiter.js +1 -1
- package/dist/lib/security/security-validation.js +1 -1
- package/dist/lib/services/api-key-service.js +1 -1
- package/dist/lib/services/consumer-service.js +1 -1
- package/dist/lib/services/fixed-window-rate-limit-service.js +1 -1
- package/dist/lib/services/health-service.js +1 -1
- package/dist/lib/services/metrics-service.js +1 -1
- package/dist/lib/services/monitor-metrics-service.js +1 -1
- package/dist/lib/services/quota-service.js +1 -1
- package/dist/lib/services/rate-limit-service.js +1 -1
- package/dist/lib/services/server.js +1 -1
- package/dist/lib/services/template-monitorcheck-route.js +1 -1
- package/dist/lib/storage/key-value-storage.js +1 -1
- package/dist/lib/utils/commons-cache.js +1 -1
- package/dist/lib/utils/commons-const.js +1 -1
- package/dist/lib/utils/commons-context.js +1 -1
- package/dist/lib/utils/commons-cookie.js +1 -1
- package/dist/lib/utils/commons-date.js +1 -1
- package/dist/lib/utils/commons-encoding.js +1 -1
- package/dist/lib/utils/commons-errors.js +1 -1
- package/dist/lib/utils/commons-logger.js +1 -1
- package/dist/lib/utils/commons-trace.js +1 -1
- package/dist/lib/utils/commons-util.js +1 -1
- package/dist/lib/utils/document-utils.js +1 -1
- package/dist/lib/utils/monitor-filter-builder.js +1 -1
- package/dist/public/redoc.html +8 -10
- package/dist/public/scalardoc.html +114 -73
- package/dist/public/swagger.html +843 -148
- package/package.json +1 -1
package/dist/public/swagger.html
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="pt-BR"
|
|
2
|
+
<html lang="pt-BR">
|
|
3
3
|
|
|
4
4
|
<head>
|
|
5
5
|
<meta charset="UTF-8"/>
|
|
@@ -8,23 +8,21 @@
|
|
|
8
8
|
content="Heimdall API Platform - Microgateway de alta performance para APIs, com orquestração inteligente, roteamento dinâmico e integração entre microsserviços"/>
|
|
9
9
|
<meta name="keywords"
|
|
10
10
|
content="API Gateway, microgateway, orquestração, roteamento dinâmico, Node.js, Redis, OpenSearch, Swagger, microsserviços, REST API, cache, throttling, observabilidade"/>
|
|
11
|
-
<meta name="author" content="P4F
|
|
11
|
+
<meta name="author" content="P4F"/>
|
|
12
12
|
<meta name="theme-color" content="#003d7a"/>
|
|
13
13
|
<meta property="og:title" content="Heimdall API Platform - Interactive Documentation"/>
|
|
14
14
|
<meta property="og:description"
|
|
15
15
|
content="Microgateway de alta performance com orquestração inteligente e roteamento dinâmico para APIs"/>
|
|
16
16
|
<meta property="og:type" content="website"/>
|
|
17
|
-
<meta property="og:url" content="https://
|
|
18
|
-
<meta property="og:image"
|
|
19
|
-
content="https://static.wixstatic.com/media/20b3f7_42a596f7c2244e1f946ebb5fa8a8512f~mv2.png"/>
|
|
17
|
+
<meta property="og:url" content="https://p4f.dev"/>
|
|
18
|
+
<meta property="og:image" content="https://p4f.dev/img/logo-p4f.png"/>
|
|
20
19
|
<meta name="twitter:card" content="summary_large_image"/>
|
|
21
20
|
<meta name="twitter:title" content="Heimdall API Platform - Interactive Documentation"/>
|
|
22
21
|
<meta name="twitter:description"
|
|
23
22
|
content="Microgateway de alta performance com orquestração inteligente e roteamento dinâmico para APIs"/>
|
|
24
23
|
<title>Heimdall API Platform - Interactive Documentation | Swagger UI</title>
|
|
25
24
|
|
|
26
|
-
<link rel="icon" href="https://
|
|
27
|
-
type="image/png"/>
|
|
25
|
+
<link rel="icon" href="https://p4f.dev/favicon.ico" type="image/x-icon"/>
|
|
28
26
|
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
|
29
27
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
|
|
30
28
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
|
|
@@ -35,43 +33,48 @@
|
|
|
35
33
|
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist/swagger-ui-standalone-preset.js"></script>
|
|
36
34
|
|
|
37
35
|
<style>
|
|
36
|
+
/*
|
|
37
|
+
* Design tokens — always-dark theme inspired by Vercel/Linear/Stripe:
|
|
38
|
+
* true neutrals (no blue-tinted slate), low-contrast borders, single
|
|
39
|
+
* sky accent reserved for interactive surfaces, semantic method
|
|
40
|
+
* colors for HTTP verbs. The P4F logo PNG is white-on-transparent,
|
|
41
|
+
* so the light theme was dropped entirely.
|
|
42
|
+
*/
|
|
38
43
|
:root {
|
|
39
|
-
--primary-color: #
|
|
40
|
-
--primary-hover: #
|
|
44
|
+
--primary-color: #38bdf8;
|
|
45
|
+
--primary-hover: #7dd3fc;
|
|
41
46
|
--secondary-color: #b8d430;
|
|
42
|
-
--accent-color: #
|
|
43
|
-
|
|
44
|
-
--bg-
|
|
45
|
-
--bg-
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
|
|
49
|
-
--border-color: #
|
|
50
|
-
--
|
|
51
|
-
|
|
52
|
-
--
|
|
53
|
-
--
|
|
47
|
+
--accent-color: #22d3ee;
|
|
48
|
+
|
|
49
|
+
--bg-primary: #000000;
|
|
50
|
+
--bg-secondary: #0a0a0a;
|
|
51
|
+
--bg-tertiary: #141414;
|
|
52
|
+
--bg-elevated: #1c1c1c;
|
|
53
|
+
|
|
54
|
+
--border-color: #1f1f1f;
|
|
55
|
+
--border-strong: #2e2e2e;
|
|
56
|
+
|
|
57
|
+
--text-primary: #fafafa;
|
|
58
|
+
--text-secondary: #a3a3a3;
|
|
59
|
+
--text-tertiary: #737373;
|
|
60
|
+
--text-muted: #525252;
|
|
61
|
+
|
|
62
|
+
--method-get: #10b981;
|
|
63
|
+
--method-post: #3b82f6;
|
|
64
|
+
--method-put: #f59e0b;
|
|
65
|
+
--method-delete: #ef4444;
|
|
66
|
+
--method-patch: #8b5cf6;
|
|
67
|
+
|
|
68
|
+
--font-mono: 'JetBrains Mono', 'SF Mono', Monaco, Menlo, Consolas, monospace;
|
|
69
|
+
|
|
70
|
+
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
|
|
71
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.55), 0 2px 4px -1px rgba(0, 0, 0, 0.45);
|
|
72
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.6), 0 4px 6px -2px rgba(0, 0, 0, 0.5);
|
|
73
|
+
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.7), 0 10px 10px -5px rgba(0, 0, 0, 0.6);
|
|
74
|
+
|
|
54
75
|
--navbar-height: 64px;
|
|
55
76
|
--footer-height: 80px;
|
|
56
|
-
--transition-smooth: all 0.
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
[data-theme="dark"] {
|
|
60
|
-
--primary-color: #0ea5e9;
|
|
61
|
-
--primary-hover: #0284c7;
|
|
62
|
-
--secondary-color: #b8d430;
|
|
63
|
-
--accent-color: #22d3ee;
|
|
64
|
-
--bg-primary: #0f172a;
|
|
65
|
-
--bg-secondary: #1e293b;
|
|
66
|
-
--bg-tertiary: #334155;
|
|
67
|
-
--text-primary: #f8fafc;
|
|
68
|
-
--text-secondary: #cbd5e1;
|
|
69
|
-
--text-tertiary: #94a3b8;
|
|
70
|
-
--border-color: #334155;
|
|
71
|
-
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
|
|
72
|
-
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
|
|
73
|
-
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.4);
|
|
74
|
-
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 10px 10px -5px rgba(0, 0, 0, 0.5);
|
|
77
|
+
--transition-smooth: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
75
78
|
}
|
|
76
79
|
|
|
77
80
|
* {
|
|
@@ -156,15 +159,16 @@
|
|
|
156
159
|
.navbar__badge {
|
|
157
160
|
display: inline-flex;
|
|
158
161
|
align-items: center;
|
|
159
|
-
padding:
|
|
160
|
-
background:
|
|
161
|
-
color:
|
|
162
|
-
border
|
|
163
|
-
|
|
164
|
-
font-
|
|
165
|
-
|
|
162
|
+
padding: 3px 10px;
|
|
163
|
+
background: var(--bg-tertiary);
|
|
164
|
+
color: var(--text-secondary);
|
|
165
|
+
border: 1px solid var(--border-color);
|
|
166
|
+
border-radius: 999px;
|
|
167
|
+
font-size: 11px;
|
|
168
|
+
font-weight: 500;
|
|
169
|
+
letter-spacing: 0.06em;
|
|
166
170
|
text-transform: uppercase;
|
|
167
|
-
|
|
171
|
+
font-family: var(--font-mono);
|
|
168
172
|
}
|
|
169
173
|
|
|
170
174
|
.navbar__right {
|
|
@@ -207,31 +211,6 @@
|
|
|
207
211
|
width: 100%;
|
|
208
212
|
}
|
|
209
213
|
|
|
210
|
-
.theme-toggle {
|
|
211
|
-
display: flex;
|
|
212
|
-
align-items: center;
|
|
213
|
-
justify-content: center;
|
|
214
|
-
width: 40px;
|
|
215
|
-
height: 40px;
|
|
216
|
-
border: none;
|
|
217
|
-
background: var(--bg-tertiary);
|
|
218
|
-
border-radius: 10px;
|
|
219
|
-
cursor: pointer;
|
|
220
|
-
transition: var(--transition-smooth);
|
|
221
|
-
color: var(--text-primary);
|
|
222
|
-
font-size: 18px;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
.theme-toggle:hover {
|
|
226
|
-
background: var(--primary-color);
|
|
227
|
-
color: white;
|
|
228
|
-
transform: rotate(15deg) scale(1.05);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
.theme-toggle:active {
|
|
232
|
-
transform: rotate(15deg) scale(0.95);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
214
|
.status-badge {
|
|
236
215
|
display: inline-flex;
|
|
237
216
|
align-items: center;
|
|
@@ -264,30 +243,765 @@
|
|
|
264
243
|
#swagger-ui {
|
|
265
244
|
margin: 0 auto;
|
|
266
245
|
max-width: 1440px;
|
|
267
|
-
padding:
|
|
246
|
+
padding: 24px;
|
|
268
247
|
min-height: calc(100vh - var(--navbar-height) - var(--footer-height));
|
|
269
248
|
}
|
|
270
249
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
250
|
+
/* ============================================================
|
|
251
|
+
* Swagger UI — dark theme overrides.
|
|
252
|
+
*
|
|
253
|
+
* We target the bundled `swagger-ui.css` classes directly instead
|
|
254
|
+
* of relying on the `filter: invert + hue-rotate` hack (which
|
|
255
|
+
* washes out colors, breaks icons and produces inconsistent
|
|
256
|
+
* rendering). The result is a single-tone dark surface that mirrors
|
|
257
|
+
* Vercel/Linear/Stripe conventions: true neutrals, low-contrast
|
|
258
|
+
* borders, accent only on interactive elements, semantic method
|
|
259
|
+
* colors for badges.
|
|
260
|
+
* ============================================================ */
|
|
261
|
+
|
|
262
|
+
.swagger-ui {
|
|
263
|
+
color: var(--text-primary);
|
|
264
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
279
265
|
}
|
|
280
266
|
|
|
281
267
|
.swagger-ui .topbar {
|
|
282
268
|
display: none;
|
|
283
269
|
}
|
|
284
270
|
|
|
271
|
+
/* Info block (title, description, contact, license) */
|
|
272
|
+
.swagger-ui .info {
|
|
273
|
+
margin: 24px 0 32px;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.swagger-ui .info .title {
|
|
277
|
+
color: var(--text-primary);
|
|
278
|
+
font-size: 32px;
|
|
279
|
+
font-weight: 700;
|
|
280
|
+
letter-spacing: -0.025em;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.swagger-ui .info .title small,
|
|
284
|
+
.swagger-ui .info .title small.version-stamp {
|
|
285
|
+
background: var(--bg-tertiary);
|
|
286
|
+
color: var(--text-secondary);
|
|
287
|
+
border: 1px solid var(--border-color);
|
|
288
|
+
border-radius: 6px;
|
|
289
|
+
padding: 3px 10px;
|
|
290
|
+
margin-left: 12px;
|
|
291
|
+
font-size: 13px;
|
|
292
|
+
font-weight: 500;
|
|
293
|
+
font-family: var(--font-mono);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.swagger-ui .info .title small pre {
|
|
297
|
+
background: transparent;
|
|
298
|
+
border: none;
|
|
299
|
+
padding: 0;
|
|
300
|
+
color: inherit;
|
|
301
|
+
font-family: inherit;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.swagger-ui .info p,
|
|
305
|
+
.swagger-ui .info li,
|
|
306
|
+
.swagger-ui .info table,
|
|
307
|
+
.swagger-ui .markdown p,
|
|
308
|
+
.swagger-ui .markdown li,
|
|
309
|
+
.swagger-ui .renderedMarkdown p,
|
|
310
|
+
.swagger-ui .renderedMarkdown li {
|
|
311
|
+
color: var(--text-secondary);
|
|
312
|
+
font-size: 14px;
|
|
313
|
+
line-height: 1.65;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.swagger-ui .info h1,
|
|
317
|
+
.swagger-ui .info h2,
|
|
318
|
+
.swagger-ui .info h3,
|
|
319
|
+
.swagger-ui .info h4,
|
|
320
|
+
.swagger-ui .markdown h1,
|
|
321
|
+
.swagger-ui .markdown h2,
|
|
322
|
+
.swagger-ui .markdown h3,
|
|
323
|
+
.swagger-ui .markdown h4 {
|
|
324
|
+
color: var(--text-primary);
|
|
325
|
+
font-weight: 600;
|
|
326
|
+
letter-spacing: -0.015em;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.swagger-ui a,
|
|
330
|
+
.swagger-ui .info a,
|
|
331
|
+
.swagger-ui .markdown a {
|
|
332
|
+
color: var(--primary-color);
|
|
333
|
+
text-decoration: none;
|
|
334
|
+
transition: color 0.15s ease;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.swagger-ui a:hover,
|
|
338
|
+
.swagger-ui .info a:hover,
|
|
339
|
+
.swagger-ui .markdown a:hover {
|
|
340
|
+
color: var(--primary-hover);
|
|
341
|
+
text-decoration: underline;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* Inline code in descriptions */
|
|
345
|
+
.swagger-ui code,
|
|
346
|
+
.swagger-ui .info code,
|
|
347
|
+
.swagger-ui .markdown code,
|
|
348
|
+
.swagger-ui .renderedMarkdown code {
|
|
349
|
+
background: var(--bg-tertiary);
|
|
350
|
+
color: var(--primary-hover);
|
|
351
|
+
border: 1px solid var(--border-color);
|
|
352
|
+
padding: 1px 6px;
|
|
353
|
+
border-radius: 4px;
|
|
354
|
+
font-family: var(--font-mono);
|
|
355
|
+
font-size: 12.5px;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/* Server selector / scheme container */
|
|
359
|
+
.swagger-ui .scheme-container {
|
|
360
|
+
background: var(--bg-secondary);
|
|
361
|
+
border: 1px solid var(--border-color);
|
|
362
|
+
border-radius: 12px;
|
|
363
|
+
box-shadow: none;
|
|
364
|
+
margin: 0 0 24px;
|
|
365
|
+
padding: 20px;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.swagger-ui .scheme-container .schemes-title {
|
|
369
|
+
color: var(--text-secondary);
|
|
370
|
+
font-weight: 500;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* Authorize button (top-right) */
|
|
374
|
+
.swagger-ui .auth-wrapper .authorize {
|
|
375
|
+
background: var(--bg-tertiary);
|
|
376
|
+
color: var(--text-primary);
|
|
377
|
+
border: 1px solid var(--border-color);
|
|
378
|
+
border-radius: 8px;
|
|
379
|
+
padding: 8px 14px;
|
|
380
|
+
font-weight: 500;
|
|
381
|
+
box-shadow: none;
|
|
382
|
+
transition: var(--transition-smooth);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.swagger-ui .auth-wrapper .authorize:hover {
|
|
386
|
+
background: var(--bg-elevated);
|
|
387
|
+
border-color: var(--border-strong);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.swagger-ui .auth-wrapper .authorize svg {
|
|
391
|
+
fill: var(--text-primary);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/* Filter input */
|
|
395
|
+
.swagger-ui .filter-container {
|
|
396
|
+
margin: 0 0 16px;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.swagger-ui .filter .operation-filter-input {
|
|
400
|
+
background: var(--bg-secondary);
|
|
401
|
+
color: var(--text-primary);
|
|
402
|
+
border: 1px solid var(--border-color);
|
|
403
|
+
border-radius: 10px;
|
|
404
|
+
padding: 12px 16px;
|
|
405
|
+
box-shadow: none;
|
|
406
|
+
font-size: 14px;
|
|
407
|
+
transition: border-color 0.15s ease;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.swagger-ui .filter .operation-filter-input::placeholder {
|
|
411
|
+
color: var(--text-muted);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.swagger-ui .filter .operation-filter-input:focus {
|
|
415
|
+
border-color: var(--primary-color);
|
|
416
|
+
outline: 2px solid rgba(56, 189, 248, 0.18);
|
|
417
|
+
outline-offset: 0;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/* Tag section heading */
|
|
421
|
+
.swagger-ui .opblock-tag {
|
|
422
|
+
color: var(--text-primary);
|
|
423
|
+
font-size: 20px;
|
|
424
|
+
font-weight: 600;
|
|
425
|
+
letter-spacing: -0.01em;
|
|
426
|
+
border-bottom: 1px solid var(--border-color);
|
|
427
|
+
padding: 16px 0 12px;
|
|
428
|
+
margin-top: 32px;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.swagger-ui .opblock-tag:hover {
|
|
432
|
+
background: transparent;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.swagger-ui .opblock-tag small,
|
|
436
|
+
.swagger-ui .opblock-tag .renderedMarkdown p {
|
|
437
|
+
color: var(--text-tertiary);
|
|
438
|
+
font-weight: 400;
|
|
439
|
+
font-size: 13px;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.swagger-ui .opblock-tag a.nostyle {
|
|
443
|
+
color: var(--text-primary);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
.swagger-ui .opblock-tag svg,
|
|
447
|
+
.swagger-ui .expand-operation svg,
|
|
448
|
+
.swagger-ui section.models svg,
|
|
449
|
+
.swagger-ui svg.arrow {
|
|
450
|
+
fill: var(--text-secondary);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/* Operation block */
|
|
454
|
+
.swagger-ui .opblock {
|
|
455
|
+
background: var(--bg-secondary);
|
|
456
|
+
border: 1px solid var(--border-color);
|
|
457
|
+
border-radius: 12px;
|
|
458
|
+
box-shadow: none;
|
|
459
|
+
margin: 10px 0;
|
|
460
|
+
overflow: hidden;
|
|
461
|
+
transition: border-color 0.15s ease;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.swagger-ui .opblock:hover {
|
|
465
|
+
border-color: var(--border-strong);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
.swagger-ui .opblock .opblock-summary {
|
|
469
|
+
padding: 12px 16px;
|
|
470
|
+
border: none;
|
|
471
|
+
align-items: center;
|
|
472
|
+
gap: 12px;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.swagger-ui .opblock .opblock-summary-path,
|
|
476
|
+
.swagger-ui .opblock .opblock-summary-path__deprecated {
|
|
477
|
+
color: var(--text-primary);
|
|
478
|
+
font-family: var(--font-mono);
|
|
479
|
+
font-weight: 600;
|
|
480
|
+
font-size: 14px;
|
|
481
|
+
text-shadow: none;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.swagger-ui .opblock .opblock-summary-description {
|
|
485
|
+
color: var(--text-tertiary);
|
|
486
|
+
font-size: 13px;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.swagger-ui .opblock .opblock-summary-method {
|
|
490
|
+
border-radius: 6px;
|
|
491
|
+
font-weight: 700;
|
|
492
|
+
font-family: var(--font-mono);
|
|
493
|
+
min-width: 80px;
|
|
494
|
+
text-shadow: none;
|
|
495
|
+
box-shadow: none;
|
|
496
|
+
color: #ffffff;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/* Method colors (semantic, uniform across all opblocks) */
|
|
500
|
+
.swagger-ui .opblock.opblock-get {
|
|
501
|
+
background: var(--bg-secondary);
|
|
502
|
+
border-color: rgba(16, 185, 129, 0.25);
|
|
503
|
+
}
|
|
504
|
+
.swagger-ui .opblock.opblock-get .opblock-summary {
|
|
505
|
+
background: rgba(16, 185, 129, 0.06);
|
|
506
|
+
border-color: transparent;
|
|
507
|
+
}
|
|
508
|
+
.swagger-ui .opblock.opblock-get .opblock-summary-method {
|
|
509
|
+
background: var(--method-get);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.swagger-ui .opblock.opblock-post {
|
|
513
|
+
background: var(--bg-secondary);
|
|
514
|
+
border-color: rgba(59, 130, 246, 0.25);
|
|
515
|
+
}
|
|
516
|
+
.swagger-ui .opblock.opblock-post .opblock-summary {
|
|
517
|
+
background: rgba(59, 130, 246, 0.06);
|
|
518
|
+
border-color: transparent;
|
|
519
|
+
}
|
|
520
|
+
.swagger-ui .opblock.opblock-post .opblock-summary-method {
|
|
521
|
+
background: var(--method-post);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.swagger-ui .opblock.opblock-put {
|
|
525
|
+
background: var(--bg-secondary);
|
|
526
|
+
border-color: rgba(245, 158, 11, 0.25);
|
|
527
|
+
}
|
|
528
|
+
.swagger-ui .opblock.opblock-put .opblock-summary {
|
|
529
|
+
background: rgba(245, 158, 11, 0.06);
|
|
530
|
+
border-color: transparent;
|
|
531
|
+
}
|
|
532
|
+
.swagger-ui .opblock.opblock-put .opblock-summary-method {
|
|
533
|
+
background: var(--method-put);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.swagger-ui .opblock.opblock-delete {
|
|
537
|
+
background: var(--bg-secondary);
|
|
538
|
+
border-color: rgba(239, 68, 68, 0.25);
|
|
539
|
+
}
|
|
540
|
+
.swagger-ui .opblock.opblock-delete .opblock-summary {
|
|
541
|
+
background: rgba(239, 68, 68, 0.06);
|
|
542
|
+
border-color: transparent;
|
|
543
|
+
}
|
|
544
|
+
.swagger-ui .opblock.opblock-delete .opblock-summary-method {
|
|
545
|
+
background: var(--method-delete);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
.swagger-ui .opblock.opblock-patch {
|
|
549
|
+
background: var(--bg-secondary);
|
|
550
|
+
border-color: rgba(139, 92, 246, 0.25);
|
|
551
|
+
}
|
|
552
|
+
.swagger-ui .opblock.opblock-patch .opblock-summary {
|
|
553
|
+
background: rgba(139, 92, 246, 0.06);
|
|
554
|
+
border-color: transparent;
|
|
555
|
+
}
|
|
556
|
+
.swagger-ui .opblock.opblock-patch .opblock-summary-method {
|
|
557
|
+
background: var(--method-patch);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* Inner sections (Parameters, Request body, Responses, ...) */
|
|
561
|
+
.swagger-ui .opblock-section-header {
|
|
562
|
+
background: var(--bg-tertiary);
|
|
563
|
+
border: none;
|
|
564
|
+
border-top: 1px solid var(--border-color);
|
|
565
|
+
box-shadow: none;
|
|
566
|
+
padding: 12px 16px;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.swagger-ui .opblock-section-header h4,
|
|
570
|
+
.swagger-ui .opblock-section-header > label {
|
|
571
|
+
color: var(--text-primary);
|
|
572
|
+
font-weight: 600;
|
|
573
|
+
font-size: 14px;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.swagger-ui .opblock-description-wrapper,
|
|
577
|
+
.swagger-ui .opblock-body,
|
|
578
|
+
.swagger-ui .opblock-external-docs-wrapper,
|
|
579
|
+
.swagger-ui .responses-wrapper {
|
|
580
|
+
background: transparent;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
.swagger-ui .opblock-description-wrapper p,
|
|
584
|
+
.swagger-ui .opblock-external-docs-wrapper p {
|
|
585
|
+
color: var(--text-secondary);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
.swagger-ui .opblock h4,
|
|
589
|
+
.swagger-ui .opblock h5,
|
|
590
|
+
.swagger-ui .opblock h3,
|
|
591
|
+
.swagger-ui .responses-inner h4,
|
|
592
|
+
.swagger-ui .responses-inner h5,
|
|
593
|
+
.swagger-ui .response-content-type {
|
|
594
|
+
color: var(--text-primary);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.swagger-ui .response-content-type {
|
|
598
|
+
font-family: var(--font-mono);
|
|
599
|
+
font-size: 12px;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/* Tables (parameters, responses) */
|
|
603
|
+
.swagger-ui table {
|
|
604
|
+
background: transparent;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.swagger-ui table thead tr td,
|
|
608
|
+
.swagger-ui table thead tr th {
|
|
609
|
+
color: var(--text-tertiary);
|
|
610
|
+
border-bottom: 1px solid var(--border-color);
|
|
611
|
+
background: transparent;
|
|
612
|
+
font-size: 11px;
|
|
613
|
+
text-transform: uppercase;
|
|
614
|
+
letter-spacing: 0.06em;
|
|
615
|
+
font-weight: 600;
|
|
616
|
+
padding: 10px 16px;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.swagger-ui table tbody tr td {
|
|
620
|
+
color: var(--text-primary);
|
|
621
|
+
border-bottom: 1px solid var(--border-color);
|
|
622
|
+
background: transparent;
|
|
623
|
+
padding: 12px 16px;
|
|
624
|
+
font-size: 13px;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
.swagger-ui .parameter__name {
|
|
628
|
+
color: var(--text-primary);
|
|
629
|
+
font-family: var(--font-mono);
|
|
630
|
+
font-weight: 600;
|
|
631
|
+
font-size: 13px;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
.swagger-ui .parameter__name.required::after {
|
|
635
|
+
color: var(--method-delete);
|
|
636
|
+
content: ' *';
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.swagger-ui .parameter__type {
|
|
640
|
+
color: var(--primary-color);
|
|
641
|
+
font-family: var(--font-mono);
|
|
642
|
+
font-size: 12px;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
.swagger-ui .parameter__in,
|
|
646
|
+
.swagger-ui .parameter__deprecated,
|
|
647
|
+
.swagger-ui .parameter__extension {
|
|
648
|
+
color: var(--text-tertiary);
|
|
649
|
+
font-size: 11px;
|
|
650
|
+
font-style: normal;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/* Response status codes */
|
|
654
|
+
.swagger-ui .response-col_status,
|
|
655
|
+
.swagger-ui .responses-table .response-col_status {
|
|
656
|
+
color: var(--text-primary);
|
|
657
|
+
font-family: var(--font-mono);
|
|
658
|
+
font-weight: 600;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.swagger-ui .response-col_description__inner div.markdown,
|
|
662
|
+
.swagger-ui .response-col_description__inner div.renderedMarkdown {
|
|
663
|
+
color: var(--text-secondary);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/* Code blocks (examples, schemas) */
|
|
667
|
+
.swagger-ui pre,
|
|
668
|
+
.swagger-ui .microlight,
|
|
669
|
+
.swagger-ui .highlight-code,
|
|
670
|
+
.swagger-ui .opblock-body pre.microlight,
|
|
671
|
+
.swagger-ui .responses-inner pre {
|
|
672
|
+
background: #050505 !important;
|
|
673
|
+
color: #fafafa !important;
|
|
674
|
+
border: 1px solid var(--border-color);
|
|
675
|
+
border-radius: 8px;
|
|
676
|
+
font-family: var(--font-mono) !important;
|
|
677
|
+
font-size: 12.5px;
|
|
678
|
+
line-height: 1.55;
|
|
679
|
+
text-shadow: none;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
.swagger-ui .highlight-code .copy-to-clipboard {
|
|
683
|
+
background: var(--bg-tertiary);
|
|
684
|
+
border: 1px solid var(--border-color);
|
|
685
|
+
border-radius: 6px;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.swagger-ui .highlight-code .copy-to-clipboard:hover {
|
|
689
|
+
background: var(--bg-elevated);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/* Microlight token colors (JSON/YAML syntax highlight) */
|
|
693
|
+
.swagger-ui .microlight .token.string {
|
|
694
|
+
color: #a5f3fc;
|
|
695
|
+
}
|
|
696
|
+
.swagger-ui .microlight .token.number {
|
|
697
|
+
color: #fcd34d;
|
|
698
|
+
}
|
|
699
|
+
.swagger-ui .microlight .token.boolean,
|
|
700
|
+
.swagger-ui .microlight .token.null {
|
|
701
|
+
color: #f472b6;
|
|
702
|
+
}
|
|
703
|
+
.swagger-ui .microlight .token.property {
|
|
704
|
+
color: #93c5fd;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/* Models / schemas */
|
|
708
|
+
.swagger-ui section.models {
|
|
709
|
+
background: var(--bg-secondary);
|
|
710
|
+
border: 1px solid var(--border-color);
|
|
711
|
+
border-radius: 12px;
|
|
712
|
+
box-shadow: none;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
.swagger-ui section.models h4 {
|
|
716
|
+
color: var(--text-primary);
|
|
717
|
+
font-weight: 600;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
.swagger-ui section.models.is-open h4 {
|
|
721
|
+
border-bottom: 1px solid var(--border-color);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.swagger-ui .model-container {
|
|
725
|
+
background: transparent;
|
|
726
|
+
border-bottom: 1px solid var(--border-color);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
.swagger-ui .model-container:last-child {
|
|
730
|
+
border-bottom: none;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
.swagger-ui .model-box {
|
|
734
|
+
background: var(--bg-tertiary);
|
|
735
|
+
border-radius: 8px;
|
|
736
|
+
padding: 12px;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
.swagger-ui .model-title,
|
|
740
|
+
.swagger-ui .model .model-title {
|
|
741
|
+
color: var(--text-primary);
|
|
742
|
+
font-family: var(--font-mono);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.swagger-ui .model,
|
|
746
|
+
.swagger-ui .model .property {
|
|
747
|
+
color: var(--text-secondary);
|
|
748
|
+
font-family: var(--font-mono);
|
|
749
|
+
font-size: 13px;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
.swagger-ui .model .property.primitive {
|
|
753
|
+
color: var(--primary-hover);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
.swagger-ui .prop-type,
|
|
757
|
+
.swagger-ui .prop .prop-type {
|
|
758
|
+
color: var(--primary-color);
|
|
759
|
+
font-family: var(--font-mono);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.swagger-ui .prop-format {
|
|
763
|
+
color: var(--text-tertiary);
|
|
764
|
+
font-family: var(--font-mono);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
.swagger-ui .model .model-deprecated-warning {
|
|
768
|
+
color: var(--method-put);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
/* Buttons */
|
|
772
|
+
.swagger-ui .btn {
|
|
773
|
+
background: var(--bg-tertiary);
|
|
774
|
+
color: var(--text-primary);
|
|
775
|
+
border: 1px solid var(--border-color);
|
|
776
|
+
border-radius: 8px;
|
|
777
|
+
padding: 8px 16px;
|
|
778
|
+
font-weight: 500;
|
|
779
|
+
font-family: 'Inter', sans-serif;
|
|
780
|
+
font-size: 13px;
|
|
781
|
+
box-shadow: none;
|
|
782
|
+
text-shadow: none;
|
|
783
|
+
transition: all 0.15s ease;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
.swagger-ui .btn:hover {
|
|
787
|
+
background: var(--bg-elevated);
|
|
788
|
+
border-color: var(--border-strong);
|
|
789
|
+
transform: none;
|
|
790
|
+
box-shadow: none;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.swagger-ui .btn.try-out__btn {
|
|
794
|
+
color: var(--primary-color);
|
|
795
|
+
border-color: rgba(56, 189, 248, 0.3);
|
|
796
|
+
background: rgba(56, 189, 248, 0.08);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
.swagger-ui .btn.try-out__btn:hover {
|
|
800
|
+
background: rgba(56, 189, 248, 0.16);
|
|
801
|
+
border-color: var(--primary-color);
|
|
802
|
+
color: var(--primary-hover);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
.swagger-ui .btn.execute {
|
|
806
|
+
background: var(--primary-color);
|
|
807
|
+
color: #000000;
|
|
808
|
+
border: 1px solid var(--primary-color);
|
|
809
|
+
font-weight: 600;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.swagger-ui .btn.execute:hover {
|
|
813
|
+
background: var(--primary-hover);
|
|
814
|
+
border-color: var(--primary-hover);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
.swagger-ui .btn.cancel {
|
|
818
|
+
background: transparent;
|
|
819
|
+
color: var(--text-secondary);
|
|
820
|
+
border-color: var(--border-color);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
.swagger-ui .btn.cancel:hover {
|
|
824
|
+
color: var(--text-primary);
|
|
825
|
+
border-color: var(--border-strong);
|
|
826
|
+
background: var(--bg-tertiary);
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/* Form inputs */
|
|
830
|
+
.swagger-ui input[type=text],
|
|
831
|
+
.swagger-ui input[type=password],
|
|
832
|
+
.swagger-ui input[type=email],
|
|
833
|
+
.swagger-ui input[type=number],
|
|
834
|
+
.swagger-ui input[type=search],
|
|
835
|
+
.swagger-ui textarea,
|
|
836
|
+
.swagger-ui select {
|
|
837
|
+
background: var(--bg-tertiary);
|
|
838
|
+
color: var(--text-primary);
|
|
839
|
+
border: 1px solid var(--border-color);
|
|
840
|
+
border-radius: 8px;
|
|
841
|
+
padding: 8px 12px;
|
|
842
|
+
box-shadow: none;
|
|
843
|
+
font-family: var(--font-mono);
|
|
844
|
+
font-size: 13px;
|
|
845
|
+
transition: border-color 0.15s ease, outline 0.15s ease;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
.swagger-ui input[type=text]::placeholder,
|
|
849
|
+
.swagger-ui input[type=password]::placeholder,
|
|
850
|
+
.swagger-ui input[type=email]::placeholder,
|
|
851
|
+
.swagger-ui input[type=number]::placeholder,
|
|
852
|
+
.swagger-ui input[type=search]::placeholder,
|
|
853
|
+
.swagger-ui textarea::placeholder {
|
|
854
|
+
color: var(--text-muted);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
.swagger-ui input[type=text]:focus,
|
|
858
|
+
.swagger-ui input[type=password]:focus,
|
|
859
|
+
.swagger-ui input[type=email]:focus,
|
|
860
|
+
.swagger-ui input[type=number]:focus,
|
|
861
|
+
.swagger-ui input[type=search]:focus,
|
|
862
|
+
.swagger-ui textarea:focus,
|
|
863
|
+
.swagger-ui select:focus {
|
|
864
|
+
outline: 2px solid rgba(56, 189, 248, 0.2);
|
|
865
|
+
border-color: var(--primary-color);
|
|
866
|
+
outline-offset: 0;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/* Tabs (Example Value / Schema) */
|
|
870
|
+
.swagger-ui .tab li button.tablinks {
|
|
871
|
+
color: var(--text-tertiary);
|
|
872
|
+
border: none;
|
|
873
|
+
background: transparent;
|
|
874
|
+
padding: 8px 0;
|
|
875
|
+
font-weight: 500;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
.swagger-ui .tab li button.tablinks.active {
|
|
879
|
+
color: var(--primary-color);
|
|
880
|
+
border-bottom: 2px solid var(--primary-color);
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
/* Modal (Authorize, etc.) */
|
|
884
|
+
.swagger-ui .dialog-ux .modal-ux {
|
|
885
|
+
background: var(--bg-secondary);
|
|
886
|
+
border: 1px solid var(--border-color);
|
|
887
|
+
border-radius: 16px;
|
|
888
|
+
box-shadow: var(--shadow-xl);
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
.swagger-ui .dialog-ux .modal-ux-header {
|
|
892
|
+
background: var(--bg-tertiary);
|
|
893
|
+
border-bottom: 1px solid var(--border-color);
|
|
894
|
+
border-radius: 16px 16px 0 0;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
.swagger-ui .dialog-ux .modal-ux-header h3,
|
|
898
|
+
.swagger-ui .dialog-ux .modal-ux-content h4,
|
|
899
|
+
.swagger-ui .dialog-ux .modal-ux-content h5 {
|
|
900
|
+
color: var(--text-primary);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
.swagger-ui .dialog-ux .modal-ux-content {
|
|
904
|
+
color: var(--text-secondary);
|
|
905
|
+
background: var(--bg-secondary);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
.swagger-ui .dialog-ux .modal-ux-content p {
|
|
909
|
+
color: var(--text-secondary);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
.swagger-ui .dialog-ux .backdrop-ux {
|
|
913
|
+
background: rgba(0, 0, 0, 0.75);
|
|
914
|
+
backdrop-filter: blur(4px);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
.swagger-ui .auth-container .auth-container-header {
|
|
918
|
+
color: var(--text-primary);
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
.swagger-ui .auth-container code {
|
|
922
|
+
background: var(--bg-tertiary);
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
/* Error states */
|
|
926
|
+
.swagger-ui .errors-wrapper {
|
|
927
|
+
background: rgba(239, 68, 68, 0.08);
|
|
928
|
+
border: 1px solid rgba(239, 68, 68, 0.3);
|
|
929
|
+
border-radius: 12px;
|
|
930
|
+
color: #fca5a5;
|
|
931
|
+
box-shadow: none;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
.swagger-ui .errors-wrapper .errors h4 {
|
|
935
|
+
color: #fca5a5;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
.swagger-ui .opblock-deprecated {
|
|
939
|
+
opacity: 0.55;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
/* Loading state */
|
|
943
|
+
.swagger-ui .loading-container .loading {
|
|
944
|
+
color: var(--text-secondary);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/* Scrollbars inside swagger-ui (webkit only) */
|
|
948
|
+
.swagger-ui *::-webkit-scrollbar {
|
|
949
|
+
width: 8px;
|
|
950
|
+
height: 8px;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
.swagger-ui *::-webkit-scrollbar-track {
|
|
954
|
+
background: var(--bg-secondary);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
.swagger-ui *::-webkit-scrollbar-thumb {
|
|
958
|
+
background: var(--border-strong);
|
|
959
|
+
border-radius: 4px;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.swagger-ui *::-webkit-scrollbar-thumb:hover {
|
|
963
|
+
background: var(--text-tertiary);
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
/* Try-it-out form labels */
|
|
967
|
+
.swagger-ui .opblock .opblock-section-header label {
|
|
968
|
+
color: var(--text-primary);
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
.swagger-ui label {
|
|
972
|
+
color: var(--text-secondary);
|
|
973
|
+
font-size: 13px;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/* Markdown tables inside descriptions */
|
|
977
|
+
.swagger-ui .markdown table {
|
|
978
|
+
border-collapse: collapse;
|
|
979
|
+
margin: 12px 0;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.swagger-ui .markdown table th,
|
|
983
|
+
.swagger-ui .markdown table td {
|
|
984
|
+
border: 1px solid var(--border-color);
|
|
985
|
+
padding: 8px 12px;
|
|
986
|
+
color: var(--text-secondary);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
.swagger-ui .markdown table th {
|
|
990
|
+
background: var(--bg-tertiary);
|
|
991
|
+
color: var(--text-primary);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
/*
|
|
995
|
+
* Footer mirrors the navbar token-wise: same --bg-primary surface,
|
|
996
|
+
* same border treatment, same subtle pill-style CTAs. No gradient
|
|
997
|
+
* backgrounds, no decorative emojis — single sky accent reserved
|
|
998
|
+
* for actual interactive elements.
|
|
999
|
+
*/
|
|
285
1000
|
.pay2b-footer {
|
|
286
1001
|
background: var(--bg-primary);
|
|
287
1002
|
border-top: 1px solid var(--border-color);
|
|
288
|
-
padding:
|
|
1003
|
+
padding: 20px 32px;
|
|
289
1004
|
min-height: var(--footer-height);
|
|
290
|
-
transition: var(--transition-smooth);
|
|
291
1005
|
}
|
|
292
1006
|
|
|
293
1007
|
.footer__container {
|
|
@@ -319,7 +1033,7 @@
|
|
|
319
1033
|
}
|
|
320
1034
|
|
|
321
1035
|
.footer__logo-p4f {
|
|
322
|
-
height:
|
|
1036
|
+
height: 32px;
|
|
323
1037
|
width: auto;
|
|
324
1038
|
object-fit: contain;
|
|
325
1039
|
}
|
|
@@ -328,6 +1042,13 @@
|
|
|
328
1042
|
font-size: 13px;
|
|
329
1043
|
color: var(--text-tertiary);
|
|
330
1044
|
font-weight: 400;
|
|
1045
|
+
margin: 0;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.footer__separator {
|
|
1049
|
+
color: var(--border-strong);
|
|
1050
|
+
margin: 0 4px;
|
|
1051
|
+
user-select: none;
|
|
331
1052
|
}
|
|
332
1053
|
|
|
333
1054
|
.footer__right {
|
|
@@ -374,55 +1095,54 @@
|
|
|
374
1095
|
|
|
375
1096
|
.footer__social {
|
|
376
1097
|
display: flex;
|
|
377
|
-
gap:
|
|
1098
|
+
gap: 8px;
|
|
378
1099
|
}
|
|
379
1100
|
|
|
380
1101
|
.footer__social-link {
|
|
381
|
-
display: flex;
|
|
1102
|
+
display: inline-flex;
|
|
382
1103
|
align-items: center;
|
|
383
1104
|
justify-content: center;
|
|
384
|
-
width:
|
|
385
|
-
height:
|
|
1105
|
+
width: 32px;
|
|
1106
|
+
height: 32px;
|
|
386
1107
|
border-radius: 8px;
|
|
387
1108
|
background: var(--bg-tertiary);
|
|
1109
|
+
border: 1px solid var(--border-color);
|
|
388
1110
|
color: var(--text-secondary);
|
|
389
1111
|
text-decoration: none;
|
|
390
|
-
|
|
391
|
-
font-size:
|
|
1112
|
+
font-family: var(--font-mono);
|
|
1113
|
+
font-size: 12px;
|
|
1114
|
+
font-weight: 600;
|
|
1115
|
+
letter-spacing: -0.02em;
|
|
1116
|
+
transition: all 0.15s ease;
|
|
392
1117
|
}
|
|
393
1118
|
|
|
394
1119
|
.footer__social-link:hover {
|
|
395
|
-
background: var(--
|
|
396
|
-
color:
|
|
397
|
-
|
|
398
|
-
box-shadow: var(--shadow-md);
|
|
1120
|
+
background: var(--bg-elevated);
|
|
1121
|
+
border-color: var(--border-strong);
|
|
1122
|
+
color: var(--text-primary);
|
|
399
1123
|
}
|
|
400
1124
|
|
|
401
1125
|
.powered-by {
|
|
402
1126
|
display: inline-flex;
|
|
403
1127
|
align-items: center;
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
1128
|
+
padding: 5px 12px;
|
|
1129
|
+
background: var(--bg-tertiary);
|
|
1130
|
+
color: var(--text-secondary);
|
|
1131
|
+
border: 1px solid var(--border-color);
|
|
1132
|
+
border-radius: 999px;
|
|
408
1133
|
text-decoration: none;
|
|
409
|
-
|
|
410
|
-
font-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
1134
|
+
font-size: 11px;
|
|
1135
|
+
font-weight: 500;
|
|
1136
|
+
letter-spacing: 0.06em;
|
|
1137
|
+
text-transform: uppercase;
|
|
1138
|
+
font-family: var(--font-mono);
|
|
1139
|
+
transition: all 0.15s ease;
|
|
415
1140
|
}
|
|
416
1141
|
|
|
417
1142
|
.powered-by:hover {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
.powered-by::before {
|
|
424
|
-
content: '⚡';
|
|
425
|
-
font-size: 14px;
|
|
1143
|
+
background: var(--bg-elevated);
|
|
1144
|
+
border-color: var(--border-strong);
|
|
1145
|
+
color: var(--text-primary);
|
|
426
1146
|
}
|
|
427
1147
|
|
|
428
1148
|
@media (max-width: 768px) {
|
|
@@ -478,9 +1198,9 @@
|
|
|
478
1198
|
<div class="navbar__container">
|
|
479
1199
|
<div class="navbar__left">
|
|
480
1200
|
<a href="/" class="navbar__logo">
|
|
481
|
-
<img src="https://
|
|
1201
|
+
<img src="https://p4f.dev/img/logo-p4f.png"
|
|
482
1202
|
alt="P4F Logo" class="navbar__logo-p4f"/>
|
|
483
|
-
<span class="navbar__title">API
|
|
1203
|
+
<span class="navbar__title">Heimdall API Platform</span>
|
|
484
1204
|
</a>
|
|
485
1205
|
<span class="navbar__badge">Swagger</span>
|
|
486
1206
|
</div>
|
|
@@ -490,10 +1210,6 @@
|
|
|
490
1210
|
<span class="status-dot"></span>
|
|
491
1211
|
<span>All Systems Operational</span>
|
|
492
1212
|
</div>
|
|
493
|
-
|
|
494
|
-
<button class="theme-toggle" id="themeToggle" aria-label="Toggle theme">
|
|
495
|
-
<span id="themeIcon">🌙</span>
|
|
496
|
-
</button>
|
|
497
1213
|
</div>
|
|
498
1214
|
</div>
|
|
499
1215
|
</nav>
|
|
@@ -503,48 +1219,27 @@
|
|
|
503
1219
|
<footer class="pay2b-footer">
|
|
504
1220
|
<div class="footer__container">
|
|
505
1221
|
<div class="footer__left">
|
|
506
|
-
<img src="https://
|
|
1222
|
+
<img src="https://p4f.dev/img/logo-p4f.png"
|
|
507
1223
|
alt="P4F Logo" class="footer__logo-p4f"/>
|
|
508
|
-
<p class="footer__copyright"
|
|
1224
|
+
<p class="footer__copyright">
|
|
1225
|
+
© 2026 P4F · Heimdall API Platform
|
|
1226
|
+
</p>
|
|
509
1227
|
</div>
|
|
510
1228
|
|
|
511
1229
|
<div class="footer__right">
|
|
512
1230
|
<div class="footer__social">
|
|
513
|
-
<a href="https://www.linkedin.com/company/protonss4fun" class="footer__social-link"
|
|
514
|
-
rel="noopener noreferrer" aria-label="LinkedIn P4F"
|
|
515
|
-
style="background: linear-gradient(135deg, var(--accent-color), var(--primary-color)); color: white;">
|
|
516
|
-
in
|
|
517
|
-
</a>
|
|
1231
|
+
<a href="https://www.linkedin.com/company/protonss4fun" class="footer__social-link"
|
|
1232
|
+
target="_blank" rel="noopener noreferrer" aria-label="LinkedIn P4F">in</a>
|
|
518
1233
|
</div>
|
|
519
1234
|
|
|
520
|
-
<a href="https://
|
|
521
|
-
|
|
1235
|
+
<a href="https://p4f.dev" class="powered-by" target="_blank" rel="noopener noreferrer">
|
|
1236
|
+
p4f.dev
|
|
522
1237
|
</a>
|
|
523
1238
|
</div>
|
|
524
1239
|
</div>
|
|
525
1240
|
</footer>
|
|
526
1241
|
|
|
527
1242
|
<script>
|
|
528
|
-
const themeToggle = document.getElementById('themeToggle');
|
|
529
|
-
const themeIcon = document.getElementById('themeIcon');
|
|
530
|
-
const html = document.documentElement;
|
|
531
|
-
|
|
532
|
-
const savedTheme = localStorage.getItem('theme') || 'light';
|
|
533
|
-
html.setAttribute('data-theme', savedTheme);
|
|
534
|
-
updateThemeIcon(savedTheme);
|
|
535
|
-
|
|
536
|
-
themeToggle.addEventListener('click', () => {
|
|
537
|
-
const currentTheme = html.getAttribute('data-theme');
|
|
538
|
-
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
|
|
539
|
-
html.setAttribute('data-theme', newTheme);
|
|
540
|
-
localStorage.setItem('theme', newTheme);
|
|
541
|
-
updateThemeIcon(newTheme);
|
|
542
|
-
});
|
|
543
|
-
|
|
544
|
-
function updateThemeIcon(theme) {
|
|
545
|
-
themeIcon.textContent = theme === 'light' ? '🌙' : '☀️';
|
|
546
|
-
}
|
|
547
|
-
|
|
548
1243
|
window.onload = () => {
|
|
549
1244
|
SwaggerUIBundle({
|
|
550
1245
|
url: "/docs/openapi.yaml",
|