adfinem 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/CODE_OF_CONDUCT.md +21 -0
  3. package/CONTRIBUTING.md +29 -0
  4. package/LICENSE +21 -0
  5. package/README.md +86 -2
  6. package/SECURITY.md +13 -0
  7. package/catalogs/.gitkeep +0 -0
  8. package/catalogs/api-operations.yaml +21 -0
  9. package/catalogs/batches.yaml +74 -0
  10. package/catalogs/queries.yaml +75 -0
  11. package/config/environments.yaml +13 -0
  12. package/dist/actions/assert-db.js +3 -0
  13. package/dist/actions/run-eod.js +3 -0
  14. package/dist/adapters/api/api-collections.js +296 -0
  15. package/dist/adapters/api/body-utils.js +9 -0
  16. package/dist/adapters/api/rest-client.js +557 -0
  17. package/dist/adapters/api/soap-client.js +5 -0
  18. package/dist/adapters/db/assertions.js +87 -0
  19. package/dist/adapters/db/oracle-client.js +115 -0
  20. package/dist/adapters/db/query-catalog.js +75 -0
  21. package/dist/adapters/unix/batch-catalog.js +71 -0
  22. package/dist/adapters/unix/batch-input-files.js +36 -0
  23. package/dist/adapters/unix/batch-runner.js +382 -0
  24. package/dist/adapters/unix/ssh-client.js +228 -0
  25. package/dist/app/server.js +826 -0
  26. package/dist/cli.js +465 -0
  27. package/dist/config/environments.js +138 -0
  28. package/dist/config/registry.js +18 -0
  29. package/dist/config/secrets.js +123 -0
  30. package/dist/dsl/parser.js +20 -0
  31. package/dist/dsl/schema.js +182 -0
  32. package/dist/dsl/types.js +1 -0
  33. package/dist/dsl/validator.js +264 -0
  34. package/dist/engine/captures.js +68 -0
  35. package/dist/engine/context.js +69 -0
  36. package/dist/engine/evidence.js +33 -0
  37. package/dist/engine/known-errors.js +129 -0
  38. package/dist/engine/retry.js +13 -0
  39. package/dist/engine/runner.js +710 -0
  40. package/dist/engine/step-result.js +58 -0
  41. package/dist/flows/catalog-normalizer.js +72 -0
  42. package/dist/flows/compiler.js +237 -0
  43. package/dist/flows/concat.js +130 -0
  44. package/dist/flows/parser.js +21 -0
  45. package/dist/flows/schema.js +142 -0
  46. package/dist/flows/types.js +1 -0
  47. package/dist/flows/validator.js +470 -0
  48. package/dist/reports/html-report.js +112 -0
  49. package/dist/reports/junit-report.js +48 -0
  50. package/docs/.gitkeep +0 -0
  51. package/docs/DB_UNIX_OPERATIONS.md +118 -0
  52. package/docs/FLOW_BUILDER.md +87 -0
  53. package/flows/account_processing_cycle.flow.yaml +88 -0
  54. package/flows/new_flow.flow.yaml +22 -0
  55. package/package.json +92 -7
  56. package/scenarios/smoke/account-processing-smoke.yaml +44 -0
  57. package/scenarios/smoke/api-db-batch-check.yaml +40 -0
  58. package/src/actions/assert-db.ts +6 -0
  59. package/src/actions/run-eod.ts +6 -0
  60. package/src/adapters/api/api-collections.ts +375 -0
  61. package/src/adapters/api/body-utils.ts +10 -0
  62. package/src/adapters/api/rest-client.ts +587 -0
  63. package/src/adapters/api/soap-client.ts +7 -0
  64. package/src/adapters/db/assertions.ts +83 -0
  65. package/src/adapters/db/oracle-client.ts +133 -0
  66. package/src/adapters/db/query-catalog.ts +80 -0
  67. package/src/adapters/unix/batch-catalog.ts +81 -0
  68. package/src/adapters/unix/batch-input-files.ts +39 -0
  69. package/src/adapters/unix/batch-runner.ts +456 -0
  70. package/src/adapters/unix/ssh-client.ts +248 -0
  71. package/src/app/server.ts +913 -0
  72. package/src/cli.ts +466 -0
  73. package/src/config/environments.ts +193 -0
  74. package/src/config/registry.ts +23 -0
  75. package/src/config/secrets.ts +128 -0
  76. package/src/dsl/parser.ts +24 -0
  77. package/src/dsl/schema.ts +189 -0
  78. package/src/dsl/types.ts +371 -0
  79. package/src/dsl/validator.ts +282 -0
  80. package/src/engine/captures.ts +66 -0
  81. package/src/engine/context.ts +76 -0
  82. package/src/engine/evidence.ts +35 -0
  83. package/src/engine/known-errors.ts +145 -0
  84. package/src/engine/retry.ts +11 -0
  85. package/src/engine/runner.ts +746 -0
  86. package/src/engine/step-result.ts +64 -0
  87. package/src/flows/catalog-normalizer.ts +86 -0
  88. package/src/flows/compiler.ts +247 -0
  89. package/src/flows/concat.ts +149 -0
  90. package/src/flows/parser.ts +27 -0
  91. package/src/flows/schema.ts +154 -0
  92. package/src/flows/types.ts +130 -0
  93. package/src/flows/validator.ts +468 -0
  94. package/src/llm/system-prompt.md +9 -0
  95. package/src/reports/html-report.ts +113 -0
  96. package/src/reports/junit-report.ts +55 -0
  97. package/src/types/oracledb.d.ts +1 -0
  98. package/templates/.gitkeep +0 -0
  99. package/templates/api/create-test-case.json +5 -0
  100. package/templates/api/record-test-activity.json +6 -0
  101. package/tsconfig.json +15 -0
  102. package/vite.config.ts +17 -0
  103. package/web/index.html +12 -0
  104. package/web/src/App.tsx +6588 -0
  105. package/web/src/main.tsx +10 -0
  106. package/web/src/styles.css +3147 -0
  107. package/index.js +0 -1
@@ -0,0 +1,3147 @@
1
+ :root {
2
+ color: #17202c;
3
+ background: #eef1f5;
4
+ font-family: Inter, "Segoe UI", Arial, sans-serif;
5
+ }
6
+
7
+ * {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ body {
12
+ margin: 0;
13
+ }
14
+
15
+ button,
16
+ input,
17
+ select,
18
+ textarea {
19
+ font: inherit;
20
+ }
21
+
22
+ button,
23
+ .upload-button {
24
+ border: 1px solid #c8d0dc;
25
+ background: #ffffff;
26
+ color: #17202c;
27
+ border-radius: 6px;
28
+ min-height: 34px;
29
+ padding: 7px 10px;
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: 7px;
33
+ cursor: pointer;
34
+ }
35
+
36
+ button:hover,
37
+ .upload-button:hover {
38
+ border-color: #64748b;
39
+ }
40
+
41
+ button:disabled {
42
+ cursor: not-allowed;
43
+ opacity: 0.52;
44
+ }
45
+
46
+ button.primary {
47
+ background: #0f6b5f;
48
+ color: #ffffff;
49
+ border-color: #0f6b5f;
50
+ }
51
+
52
+ button.danger {
53
+ color: #9f1d35;
54
+ border-color: #e3a4af;
55
+ }
56
+
57
+ button.compact {
58
+ min-height: 32px;
59
+ }
60
+
61
+ .workbench-shell {
62
+ display: grid;
63
+ grid-template-columns: 300px minmax(0, 1fr);
64
+ min-height: 100vh;
65
+ }
66
+
67
+ .project-explorer {
68
+ background: #202833;
69
+ color: #eef2f7;
70
+ padding: 18px;
71
+ overflow: auto;
72
+ }
73
+
74
+ .brand {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 12px;
78
+ margin-bottom: 22px;
79
+ }
80
+
81
+ .mark {
82
+ width: 38px;
83
+ height: 38px;
84
+ display: grid;
85
+ place-items: center;
86
+ background: #b91c1c;
87
+ color: #ffffff;
88
+ border-radius: 6px;
89
+ font-weight: 700;
90
+ }
91
+
92
+ .brand h1 {
93
+ margin: 0;
94
+ font-size: 18px;
95
+ }
96
+
97
+ .brand p,
98
+ .flow-title label {
99
+ margin: 2px 0 0;
100
+ color: #9aa6b4;
101
+ font-size: 13px;
102
+ }
103
+
104
+ .project-explorer section {
105
+ border-top: 1px solid #3a4250;
106
+ padding-top: 16px;
107
+ margin-top: 16px;
108
+ }
109
+
110
+ .project-explorer h2,
111
+ .inspector h2,
112
+ .node-editor h3,
113
+ .environment-form h3 {
114
+ margin: 0 0 10px;
115
+ font-size: 13px;
116
+ text-transform: uppercase;
117
+ letter-spacing: 0;
118
+ color: #738095;
119
+ }
120
+
121
+ .project-explorer button,
122
+ .project-explorer .upload-button {
123
+ width: 100%;
124
+ justify-content: flex-start;
125
+ margin-bottom: 7px;
126
+ background: #2c3542;
127
+ color: #f8fafc;
128
+ border-color: #465163;
129
+ }
130
+
131
+ .project-explorer .upload-button input,
132
+ .topbar .upload-button input {
133
+ display: none;
134
+ }
135
+
136
+ .upload-button.light {
137
+ width: auto;
138
+ background: #ffffff;
139
+ color: #17202c;
140
+ border-color: #c8d0dc;
141
+ margin: 0;
142
+ }
143
+
144
+ .tool-button {
145
+ font-weight: 600;
146
+ }
147
+
148
+ .item-list.dense {
149
+ display: grid;
150
+ gap: 6px;
151
+ }
152
+
153
+ .flow-row {
154
+ display: grid;
155
+ grid-template-columns: minmax(0, 1fr) 34px;
156
+ gap: 6px;
157
+ align-items: center;
158
+ }
159
+
160
+ .flow-row button {
161
+ margin: 0;
162
+ }
163
+
164
+ .flow-row > button:first-child .flow-row-text {
165
+ overflow: hidden;
166
+ text-overflow: ellipsis;
167
+ white-space: nowrap;
168
+ display: grid;
169
+ gap: 2px;
170
+ min-width: 0;
171
+ text-align: left;
172
+ }
173
+
174
+ .flow-row > button:first-child .flow-row-text strong,
175
+ .flow-row > button:first-child .flow-row-text small {
176
+ overflow: hidden;
177
+ text-overflow: ellipsis;
178
+ white-space: nowrap;
179
+ }
180
+
181
+ .flow-row > button:first-child .flow-row-text small {
182
+ color: #9fb0c5;
183
+ font-size: 11px;
184
+ font-weight: 500;
185
+ }
186
+
187
+ .flow-row.selected > button:first-child {
188
+ background: #0f6b5f;
189
+ border-color: #0f6b5f;
190
+ }
191
+
192
+ .icon-button {
193
+ width: 34px;
194
+ min-width: 34px;
195
+ padding: 0;
196
+ justify-content: center;
197
+ }
198
+
199
+ .icon-button.danger-plain {
200
+ color: #f5b6c1;
201
+ }
202
+
203
+ .collection-card {
204
+ display: grid;
205
+ grid-template-columns: 18px minmax(0, 1fr) auto;
206
+ align-items: center;
207
+ gap: 8px;
208
+ }
209
+
210
+ .collection-card[draggable="true"],
211
+ .batch-check[draggable="true"],
212
+ .db-template-row[draggable="true"],
213
+ .quick-api-row button[draggable="true"],
214
+ .add-step-section button[draggable="true"],
215
+ .project-explorer button[draggable="true"] {
216
+ cursor: grab;
217
+ }
218
+
219
+ .collection-card[draggable="true"]:active,
220
+ .batch-check[draggable="true"]:active,
221
+ .db-template-row[draggable="true"]:active,
222
+ .quick-api-row button[draggable="true"]:active,
223
+ .add-step-section button[draggable="true"]:active,
224
+ .project-explorer button[draggable="true"]:active {
225
+ cursor: grabbing;
226
+ }
227
+
228
+ .collection-card span {
229
+ overflow: hidden;
230
+ text-overflow: ellipsis;
231
+ white-space: nowrap;
232
+ }
233
+
234
+ .collection-card small {
235
+ color: #b7c2d0;
236
+ font-size: 12px;
237
+ }
238
+
239
+ .mini-library,
240
+ .batch-picker {
241
+ border: 1px solid #465163;
242
+ border-radius: 6px;
243
+ padding: 9px;
244
+ margin: 8px 0;
245
+ background: #293240;
246
+ }
247
+
248
+ .mini-title,
249
+ .batch-picker-title {
250
+ color: #b7c2d0;
251
+ font-size: 12px;
252
+ font-weight: 700;
253
+ margin-bottom: 8px;
254
+ text-transform: uppercase;
255
+ }
256
+
257
+ .batch-check {
258
+ display: grid;
259
+ grid-template-columns: 18px minmax(0, 1fr);
260
+ gap: 7px;
261
+ align-items: center;
262
+ color: #eef2f7;
263
+ font-size: 13px;
264
+ margin-bottom: 8px;
265
+ }
266
+
267
+ .batch-check input {
268
+ width: 14px;
269
+ height: 14px;
270
+ }
271
+
272
+ .batch-check span {
273
+ overflow-wrap: anywhere;
274
+ }
275
+
276
+ .run-history {
277
+ display: grid;
278
+ gap: 8px;
279
+ }
280
+
281
+ .history-row {
282
+ display: grid;
283
+ grid-template-columns: 18px minmax(0, 1fr);
284
+ gap: 8px;
285
+ align-items: start;
286
+ padding: 8px;
287
+ border: 1px solid #465163;
288
+ border-radius: 6px;
289
+ background: #293240;
290
+ }
291
+
292
+ .history-row strong,
293
+ .history-row span,
294
+ .history-row small {
295
+ display: block;
296
+ }
297
+
298
+ .history-row strong {
299
+ font-size: 13px;
300
+ text-transform: capitalize;
301
+ }
302
+
303
+ .history-row span,
304
+ .history-row small {
305
+ color: #b7c2d0;
306
+ font-size: 12px;
307
+ overflow-wrap: anywhere;
308
+ }
309
+
310
+ .history-row.passed strong {
311
+ color: #8fd3be;
312
+ }
313
+
314
+ .history-row.failed strong {
315
+ color: #f5b6c1;
316
+ }
317
+
318
+ .workbench-main {
319
+ display: flex;
320
+ flex-direction: column;
321
+ min-width: 0;
322
+ height: 100vh;
323
+ }
324
+
325
+ .topbar {
326
+ min-height: 70px;
327
+ background: #ffffff;
328
+ border-bottom: 1px solid #d5dbe4;
329
+ display: flex;
330
+ justify-content: space-between;
331
+ align-items: center;
332
+ gap: 16px;
333
+ padding: 12px 18px;
334
+ }
335
+
336
+ .flow-title {
337
+ display: grid;
338
+ gap: 4px;
339
+ min-width: 280px;
340
+ }
341
+
342
+ .flow-title input {
343
+ border: 0;
344
+ font-size: 20px;
345
+ font-weight: 700;
346
+ min-width: 300px;
347
+ }
348
+
349
+ .flow-title label {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 8px;
353
+ }
354
+
355
+ .flow-title .flow-id-input {
356
+ min-width: 220px;
357
+ width: 260px;
358
+ border: 1px solid #c8d0dc;
359
+ border-radius: 6px;
360
+ padding: 5px 8px;
361
+ font-size: 13px;
362
+ font-weight: 500;
363
+ }
364
+
365
+ .actions {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 8px;
369
+ flex-wrap: wrap;
370
+ justify-content: flex-end;
371
+ }
372
+
373
+ .env-select {
374
+ width: 130px;
375
+ border: 1px solid #c8d0dc;
376
+ border-radius: 6px;
377
+ padding: 7px 9px;
378
+ min-height: 34px;
379
+ background: #ffffff;
380
+ color: #17202c;
381
+ }
382
+
383
+ .builder-layout {
384
+ display: grid;
385
+ grid-template-columns: minmax(620px, 1fr) clamp(460px, 28vw, 560px);
386
+ gap: 14px;
387
+ padding: 14px;
388
+ min-height: 0;
389
+ flex: 1 1 auto;
390
+ overflow: hidden;
391
+ }
392
+
393
+ .workflow-canvas,
394
+ .inspector {
395
+ background: #ffffff;
396
+ border: 1px solid #d5dbe4;
397
+ border-radius: 8px;
398
+ overflow: auto;
399
+ }
400
+
401
+ .inspector {
402
+ overflow-x: hidden;
403
+ }
404
+
405
+ .workflow-canvas {
406
+ padding: 18px;
407
+ }
408
+
409
+ .workflow-canvas.flow-canvas {
410
+ position: relative;
411
+ display: grid;
412
+ grid-template-rows: auto minmax(0, 1fr);
413
+ min-height: 0;
414
+ padding: 0;
415
+ overflow: hidden;
416
+ }
417
+
418
+ .workflow-canvas.flow-canvas.fullscreen {
419
+ position: fixed;
420
+ inset: 10px;
421
+ z-index: 85;
422
+ border-radius: 10px;
423
+ box-shadow: 0 20px 70px rgba(15, 23, 42, 0.35);
424
+ }
425
+
426
+ .canvas-toolbar {
427
+ min-height: 44px;
428
+ display: flex;
429
+ justify-content: space-between;
430
+ align-items: center;
431
+ gap: 12px;
432
+ border-bottom: 1px solid #e5e9f0;
433
+ padding: 7px 10px;
434
+ background: #ffffff;
435
+ }
436
+
437
+ .canvas-toolbar div {
438
+ display: flex;
439
+ gap: 9px;
440
+ align-items: baseline;
441
+ min-width: 0;
442
+ }
443
+
444
+ .canvas-toolbar strong {
445
+ color: #17202c;
446
+ font-size: 13px;
447
+ }
448
+
449
+ .canvas-toolbar span {
450
+ color: #64748b;
451
+ font-size: 12px;
452
+ }
453
+
454
+ .icon-text-button {
455
+ width: auto;
456
+ min-height: 30px;
457
+ display: inline-flex;
458
+ gap: 6px;
459
+ align-items: center;
460
+ padding: 5px 9px;
461
+ white-space: nowrap;
462
+ }
463
+
464
+ .workflow-graph {
465
+ width: 100%;
466
+ height: 100%;
467
+ min-height: 500px;
468
+ background: #f8fafc;
469
+ }
470
+
471
+ .graph-empty {
472
+ height: 100%;
473
+ margin: 18px;
474
+ border: 1px dashed #9fb0c4;
475
+ background: #f8fafc;
476
+ }
477
+
478
+ .graph-node {
479
+ position: relative;
480
+ width: 100%;
481
+ height: 100%;
482
+ display: grid;
483
+ grid-template-rows: minmax(0, 1fr) auto;
484
+ gap: 8px;
485
+ border: 1px solid #c8d0dc;
486
+ border-left: 4px solid #64748b;
487
+ border-radius: 8px;
488
+ background: #ffffff;
489
+ padding: 10px;
490
+ box-shadow: 0 8px 18px rgba(15, 23, 42, 0.08);
491
+ cursor: grab;
492
+ }
493
+
494
+ .graph-node:active {
495
+ cursor: grabbing;
496
+ }
497
+
498
+ .graph-port {
499
+ z-index: 8;
500
+ border: 0 !important;
501
+ background: transparent !important;
502
+ opacity: 0 !important;
503
+ box-shadow: none !important;
504
+ pointer-events: all;
505
+ cursor: crosshair;
506
+ }
507
+
508
+ .graph-port-top,
509
+ .graph-port-bottom {
510
+ width: min(260px, 92%) !important;
511
+ height: 46px !important;
512
+ left: 50% !important;
513
+ border-radius: 999px;
514
+ }
515
+
516
+ .graph-port-top {
517
+ top: -23px !important;
518
+ transform: translateX(-50%) !important;
519
+ }
520
+
521
+ .graph-port-bottom {
522
+ bottom: -23px !important;
523
+ transform: translateX(-50%) !important;
524
+ }
525
+
526
+ .graph-port::before,
527
+ .graph-port::after {
528
+ display: none;
529
+ }
530
+
531
+ .graph-port:hover,
532
+ .graph-port.connectingfrom,
533
+ .graph-port.connectingto,
534
+ .graph-port.valid {
535
+ border: 0 !important;
536
+ background: transparent !important;
537
+ opacity: 0 !important;
538
+ box-shadow: none !important;
539
+ }
540
+
541
+ .graph-insert-node .react-flow__handle {
542
+ opacity: 0;
543
+ border: 0;
544
+ background: transparent;
545
+ }
546
+
547
+ .graph-node.api {
548
+ border-left-color: #0f6b5f;
549
+ }
550
+
551
+ .graph-node.db {
552
+ border-left-color: #4f46e5;
553
+ }
554
+
555
+ .graph-node.batch {
556
+ border-left-color: #b45309;
557
+ }
558
+
559
+ .graph-node.control {
560
+ border-left-color: #7c3aed;
561
+ background: #fbfaff;
562
+ }
563
+
564
+ .graph-node.selected {
565
+ border-color: #0f6b5f;
566
+ box-shadow: 0 0 0 3px rgba(15, 107, 95, 0.18), 0 12px 24px rgba(15, 23, 42, 0.12);
567
+ }
568
+
569
+ .graph-node.disabled {
570
+ opacity: 0.58;
571
+ }
572
+
573
+ .graph-node.missing {
574
+ border-bottom-color: #b45309;
575
+ }
576
+
577
+ .graph-node.failed {
578
+ border-color: #9f1d35;
579
+ box-shadow: 0 0 0 3px rgba(159, 29, 53, 0.16), 0 12px 24px rgba(15, 23, 42, 0.12);
580
+ }
581
+
582
+ .graph-node.passed {
583
+ border-color: #0f6b5f;
584
+ }
585
+
586
+ .graph-node.running {
587
+ border-color: #2563eb;
588
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.18), 0 12px 24px rgba(15, 23, 42, 0.12);
589
+ animation: graph-running-pulse 1.4s ease-in-out infinite;
590
+ }
591
+
592
+ @keyframes graph-running-pulse {
593
+ 0%,
594
+ 100% {
595
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.16), 0 12px 24px rgba(15, 23, 42, 0.12);
596
+ }
597
+ 50% {
598
+ box-shadow: 0 0 0 6px rgba(37, 99, 235, 0.08), 0 12px 24px rgba(15, 23, 42, 0.12);
599
+ }
600
+ }
601
+
602
+ .graph-node-main {
603
+ min-width: 0;
604
+ border: 0;
605
+ padding: 0;
606
+ display: grid;
607
+ grid-template-columns: 22px minmax(0, 1fr);
608
+ gap: 8px;
609
+ align-items: start;
610
+ background: transparent;
611
+ text-align: left;
612
+ }
613
+
614
+ .graph-node-main strong,
615
+ .graph-node-main small,
616
+ .graph-node-main em {
617
+ display: block;
618
+ overflow: hidden;
619
+ text-overflow: ellipsis;
620
+ white-space: nowrap;
621
+ }
622
+
623
+ .graph-node-main strong {
624
+ color: #17202c;
625
+ font-size: 14px;
626
+ }
627
+
628
+ .graph-node-main small {
629
+ margin-top: 3px;
630
+ color: #64748b;
631
+ font-size: 12px;
632
+ }
633
+
634
+ .graph-node-main em {
635
+ margin-top: 2px;
636
+ color: #738095;
637
+ font-size: 11px;
638
+ font-style: normal;
639
+ }
640
+
641
+ .graph-node-kicker {
642
+ display: flex;
643
+ gap: 6px;
644
+ align-items: center;
645
+ color: #738095;
646
+ font-size: 11px;
647
+ text-transform: uppercase;
648
+ font-weight: 700;
649
+ }
650
+
651
+ .run-dot {
652
+ max-width: 86px;
653
+ border-radius: 999px;
654
+ padding: 1px 5px;
655
+ background: #edf0f4;
656
+ color: #334155;
657
+ overflow: hidden;
658
+ text-overflow: ellipsis;
659
+ white-space: nowrap;
660
+ text-transform: none;
661
+ }
662
+
663
+ .run-dot.passed {
664
+ background: #e8f6f0;
665
+ color: #0f6b5f;
666
+ }
667
+
668
+ .run-dot.failed {
669
+ background: #fae8ec;
670
+ color: #9f1d35;
671
+ }
672
+
673
+ .run-dot.running {
674
+ background: #dbeafe;
675
+ color: #1d4ed8;
676
+ }
677
+
678
+ .graph-node-badges,
679
+ .graph-node-actions {
680
+ display: flex;
681
+ gap: 5px;
682
+ flex-wrap: wrap;
683
+ align-items: center;
684
+ }
685
+
686
+ .graph-node-badges span {
687
+ min-height: 20px;
688
+ display: inline-flex;
689
+ align-items: center;
690
+ border-radius: 999px;
691
+ background: #edf0f4;
692
+ color: #334155;
693
+ padding: 2px 7px;
694
+ font-size: 11px;
695
+ font-weight: 700;
696
+ }
697
+
698
+ .graph-node-badges .warn {
699
+ background: #fff4df;
700
+ color: #92400e;
701
+ }
702
+
703
+ .graph-node-badges .loop-badge {
704
+ background: #f3e8ff;
705
+ color: #6d28d9;
706
+ }
707
+
708
+ .graph-node-actions {
709
+ position: absolute;
710
+ left: 10px;
711
+ right: 10px;
712
+ bottom: -30px;
713
+ z-index: 14;
714
+ opacity: 0;
715
+ pointer-events: none;
716
+ transition: opacity 0.12s ease;
717
+ }
718
+
719
+ .graph-node:hover .graph-node-actions,
720
+ .graph-node.selected .graph-node-actions {
721
+ opacity: 1;
722
+ pointer-events: auto;
723
+ }
724
+
725
+ .graph-node-actions .icon-button {
726
+ width: 28px;
727
+ min-width: 28px;
728
+ height: 26px;
729
+ min-height: 26px;
730
+ background: #ffffff;
731
+ box-shadow: 0 4px 10px rgba(15, 23, 42, 0.12);
732
+ font-size: 11px;
733
+ }
734
+
735
+ .graph-insert-node {
736
+ width: 100%;
737
+ height: 100%;
738
+ display: grid;
739
+ place-items: center;
740
+ border: 1px dashed #c8d0dc;
741
+ border-radius: 999px;
742
+ background: rgba(255, 255, 255, 0.86);
743
+ }
744
+
745
+ .graph-insert-node.active {
746
+ border-color: #0f6b5f;
747
+ background: #eef8f5;
748
+ }
749
+
750
+ .graph-insert-node button {
751
+ min-height: 28px;
752
+ padding: 4px 10px;
753
+ font-size: 12px;
754
+ color: #566275;
755
+ }
756
+
757
+ .graph-and-join {
758
+ width: 100%;
759
+ height: 100%;
760
+ display: grid;
761
+ place-items: center;
762
+ border: 1px solid #e4cf86;
763
+ border-radius: 999px;
764
+ background: #fff7d6;
765
+ color: #6d5d00;
766
+ font-size: 12px;
767
+ font-weight: 700;
768
+ }
769
+
770
+ .graph-section-lane {
771
+ width: 100%;
772
+ height: 100%;
773
+ border: 1px solid #d5dbe4;
774
+ border-radius: 10px;
775
+ background: rgba(235, 240, 247, 0.52);
776
+ padding: 12px 14px;
777
+ pointer-events: none;
778
+ }
779
+
780
+ .graph-section-lane.subflow {
781
+ border-color: #bcd8d3;
782
+ background: rgba(226, 246, 241, 0.55);
783
+ }
784
+
785
+ .graph-section-lane strong,
786
+ .graph-section-lane span {
787
+ display: block;
788
+ }
789
+
790
+ .graph-section-lane strong {
791
+ color: #334155;
792
+ font-size: 13px;
793
+ }
794
+
795
+ .graph-section-lane span {
796
+ margin-top: 2px;
797
+ color: #64748b;
798
+ font-size: 11px;
799
+ text-transform: uppercase;
800
+ font-weight: 700;
801
+ }
802
+
803
+ .react-flow__node-sectionLane {
804
+ z-index: -10 !important;
805
+ }
806
+
807
+ .react-flow__edge.and-edge .react-flow__edge-path {
808
+ stroke: #6d5d00;
809
+ }
810
+
811
+ .graph-edge-hitbox {
812
+ fill: none;
813
+ stroke: transparent;
814
+ stroke-width: 18;
815
+ pointer-events: stroke;
816
+ }
817
+
818
+ .graph-edge-controls {
819
+ position: absolute;
820
+ display: inline-flex;
821
+ gap: 5px;
822
+ align-items: center;
823
+ pointer-events: all;
824
+ opacity: 0;
825
+ transition: opacity 0.12s ease;
826
+ }
827
+
828
+ .graph-edge-controls.visible {
829
+ opacity: 1;
830
+ }
831
+
832
+ .graph-edge-controls span {
833
+ border: 1px solid #d5dbe4;
834
+ border-radius: 999px;
835
+ padding: 2px 7px;
836
+ background: #ffffff;
837
+ color: #566275;
838
+ font-size: 11px;
839
+ font-weight: 700;
840
+ box-shadow: 0 4px 10px rgba(15, 23, 42, 0.1);
841
+ }
842
+
843
+ .graph-edge-delete {
844
+ min-width: 22px;
845
+ width: 22px;
846
+ min-height: 22px;
847
+ height: 22px;
848
+ border-color: #cbd5e1;
849
+ border-radius: 999px;
850
+ padding: 0;
851
+ background: rgba(255, 255, 255, 0.92);
852
+ color: #64748b;
853
+ box-shadow: 0 4px 10px rgba(15, 23, 42, 0.12);
854
+ }
855
+
856
+ .graph-edge-delete:hover {
857
+ border-color: #9f1d35;
858
+ background: #fff5f7;
859
+ color: #9f1d35;
860
+ }
861
+
862
+ .inspector {
863
+ padding: 16px;
864
+ }
865
+
866
+ .flow-settings-card {
867
+ margin: 12px 16px 0;
868
+ border: 1px solid #d5dbe4;
869
+ border-radius: 8px;
870
+ background: #ffffff;
871
+ }
872
+
873
+ .flow-settings-head {
874
+ width: 100%;
875
+ margin: 0;
876
+ border: 0;
877
+ border-radius: 8px;
878
+ display: grid;
879
+ grid-template-columns: minmax(0, 1fr) auto auto auto;
880
+ gap: 12px;
881
+ align-items: center;
882
+ background: #ffffff;
883
+ text-align: left;
884
+ }
885
+
886
+ .flow-settings-head strong {
887
+ color: #17202c;
888
+ }
889
+
890
+ .flow-settings-head small {
891
+ color: #64748b;
892
+ }
893
+
894
+ .flow-settings-body {
895
+ display: grid;
896
+ gap: 10px;
897
+ border-top: 1px solid #e5e9f0;
898
+ padding: 12px;
899
+ }
900
+
901
+ .insert-point {
902
+ display: grid;
903
+ place-items: center;
904
+ margin: 6px 0;
905
+ border: 1px dashed transparent;
906
+ border-radius: 8px;
907
+ padding: 4px;
908
+ }
909
+
910
+ .insert-point button {
911
+ min-height: 28px;
912
+ padding: 4px 9px;
913
+ font-size: 12px;
914
+ color: #566275;
915
+ background: #f8fafc;
916
+ }
917
+
918
+ .insert-point.active {
919
+ border-color: #0f6b5f;
920
+ background: #eef8f5;
921
+ }
922
+
923
+ .insert-point.active button {
924
+ border-color: #0f6b5f;
925
+ color: #0f6b5f;
926
+ }
927
+
928
+ .insert-point:hover {
929
+ border-color: #aeb8c6;
930
+ }
931
+
932
+ .node-stack {
933
+ display: grid;
934
+ justify-items: center;
935
+ }
936
+
937
+ .section-chip {
938
+ justify-self: center;
939
+ margin: 6px 0 8px;
940
+ border: 1px solid #c8d0dc;
941
+ border-radius: 999px;
942
+ padding: 4px 10px;
943
+ font-size: 12px;
944
+ color: #566275;
945
+ background: #f8fafc;
946
+ }
947
+
948
+ .node-card {
949
+ width: min(780px, 100%);
950
+ min-height: 76px;
951
+ display: grid;
952
+ grid-template-columns: minmax(0, 1fr) auto;
953
+ gap: 10px;
954
+ align-items: center;
955
+ border: 1px solid #c8d0dc;
956
+ border-radius: 8px;
957
+ background: #ffffff;
958
+ padding: 10px;
959
+ }
960
+
961
+ .node-card.active {
962
+ border-color: #0f6b5f;
963
+ box-shadow: 0 0 0 2px rgba(15, 107, 95, 0.14);
964
+ }
965
+
966
+ .disabled-node {
967
+ opacity: 0.62;
968
+ }
969
+
970
+ .node-main {
971
+ border: 0;
972
+ background: transparent;
973
+ padding: 4px;
974
+ width: 100%;
975
+ justify-content: flex-start;
976
+ text-align: left;
977
+ }
978
+
979
+ .node-main strong,
980
+ .node-main span {
981
+ display: block;
982
+ }
983
+
984
+ .node-main span {
985
+ margin-top: 3px;
986
+ color: #64748b;
987
+ font-size: 13px;
988
+ overflow-wrap: anywhere;
989
+ }
990
+
991
+ .node-actions {
992
+ display: flex;
993
+ gap: 5px;
994
+ align-items: center;
995
+ }
996
+
997
+ .node-actions .icon-button {
998
+ color: #566275;
999
+ }
1000
+
1001
+ .post-card {
1002
+ width: min(650px, calc(100% - 56px));
1003
+ min-height: 38px;
1004
+ margin-top: 8px;
1005
+ background: #f8fafc;
1006
+ justify-content: flex-start;
1007
+ }
1008
+
1009
+ .post-card.active {
1010
+ border-color: #0f6b5f;
1011
+ box-shadow: 0 0 0 2px rgba(15, 107, 95, 0.14);
1012
+ }
1013
+
1014
+ .arrow {
1015
+ margin: 10px 0 4px;
1016
+ color: #64748b;
1017
+ }
1018
+
1019
+ .empty-state {
1020
+ min-height: 220px;
1021
+ display: grid;
1022
+ place-items: center;
1023
+ align-content: center;
1024
+ gap: 8px;
1025
+ color: #64748b;
1026
+ border: 1px dashed #c8d0dc;
1027
+ border-radius: 8px;
1028
+ }
1029
+
1030
+ .empty-state strong {
1031
+ color: #17202c;
1032
+ }
1033
+
1034
+ .inspector-section {
1035
+ border-bottom: 1px solid #e5e9f0;
1036
+ padding-bottom: 16px;
1037
+ margin-bottom: 16px;
1038
+ }
1039
+
1040
+ .inspector-section:last-child {
1041
+ border-bottom: 0;
1042
+ margin-bottom: 0;
1043
+ padding-bottom: 0;
1044
+ }
1045
+
1046
+ .node-editor,
1047
+ .editor-pane {
1048
+ display: grid;
1049
+ gap: 12px;
1050
+ }
1051
+
1052
+ .node-editor.v2 {
1053
+ gap: 0;
1054
+ }
1055
+
1056
+ .step-header-sticky {
1057
+ position: sticky;
1058
+ top: -16px;
1059
+ z-index: 5;
1060
+ display: grid;
1061
+ gap: 10px;
1062
+ margin: -16px -16px 0;
1063
+ padding: 16px 16px 10px;
1064
+ background: #ffffff;
1065
+ border-bottom: 1px solid #e5e9f0;
1066
+ }
1067
+
1068
+ .step-header-card {
1069
+ display: flex;
1070
+ gap: 12px;
1071
+ align-items: flex-start;
1072
+ border: 1px solid #d5dbe4;
1073
+ border-left-width: 4px;
1074
+ border-radius: 8px;
1075
+ padding: 12px;
1076
+ background: #fbfcfe;
1077
+ }
1078
+
1079
+ .step-header-card.api {
1080
+ border-left-color: #0f6b5f;
1081
+ }
1082
+
1083
+ .step-header-card.db {
1084
+ border-left-color: #4f46e5;
1085
+ }
1086
+
1087
+ .step-header-card.batch {
1088
+ border-left-color: #b45309;
1089
+ }
1090
+
1091
+ .step-header-card.control {
1092
+ border-left-color: #7c3aed;
1093
+ }
1094
+
1095
+ .type-icon {
1096
+ flex: 0 0 42px;
1097
+ height: 42px;
1098
+ display: grid;
1099
+ place-items: center;
1100
+ border-radius: 8px;
1101
+ background: #eef1f5;
1102
+ color: #334155;
1103
+ font-size: 11px;
1104
+ font-weight: 800;
1105
+ }
1106
+
1107
+ .step-header-body {
1108
+ min-width: 0;
1109
+ flex: 1;
1110
+ }
1111
+
1112
+ .step-header-eyebrow {
1113
+ color: #64748b;
1114
+ font-size: 12px;
1115
+ margin-bottom: 4px;
1116
+ }
1117
+
1118
+ .step-header-name {
1119
+ display: flex;
1120
+ gap: 8px;
1121
+ align-items: center;
1122
+ min-width: 0;
1123
+ }
1124
+
1125
+ .node-editor .step-name-inline {
1126
+ min-height: 0;
1127
+ border: 0;
1128
+ border-radius: 0;
1129
+ padding: 0;
1130
+ background: transparent;
1131
+ color: #17202c;
1132
+ font-size: 17px;
1133
+ font-weight: 700;
1134
+ }
1135
+
1136
+ .type-tag {
1137
+ flex: 0 0 auto;
1138
+ border-radius: 999px;
1139
+ padding: 3px 7px;
1140
+ background: #edf0f4;
1141
+ color: #334155;
1142
+ font-size: 11px;
1143
+ font-weight: 700;
1144
+ }
1145
+
1146
+ .type-tag.api {
1147
+ background: #e8f6f0;
1148
+ color: #0f6b5f;
1149
+ }
1150
+
1151
+ .type-tag.db {
1152
+ background: #eef2ff;
1153
+ color: #4f46e5;
1154
+ }
1155
+
1156
+ .type-tag.batch {
1157
+ background: #fff4df;
1158
+ color: #92400e;
1159
+ }
1160
+
1161
+ .type-tag.control {
1162
+ background: #f3e8ff;
1163
+ color: #6d28d9;
1164
+ }
1165
+
1166
+ .pill-strip {
1167
+ display: flex;
1168
+ gap: 6px;
1169
+ flex-wrap: wrap;
1170
+ margin-top: 9px;
1171
+ }
1172
+
1173
+ .pill {
1174
+ min-height: 26px;
1175
+ max-width: 100%;
1176
+ display: inline-flex;
1177
+ align-items: center;
1178
+ border: 1px solid #d5dbe4;
1179
+ border-radius: 999px;
1180
+ padding: 4px 8px;
1181
+ background: #ffffff;
1182
+ color: #566275;
1183
+ font-size: 12px;
1184
+ overflow: hidden;
1185
+ text-overflow: ellipsis;
1186
+ white-space: nowrap;
1187
+ }
1188
+
1189
+ button.pill {
1190
+ width: auto;
1191
+ }
1192
+
1193
+ .pill.toggle.on {
1194
+ border-color: #8ecfc3;
1195
+ color: #0f6b5f;
1196
+ background: #eef8f5;
1197
+ }
1198
+
1199
+ .pill.toggle.off {
1200
+ border-color: #e3a4af;
1201
+ color: #9f1d35;
1202
+ background: #fff5f7;
1203
+ }
1204
+
1205
+ .node-editor .section-inline {
1206
+ width: 120px;
1207
+ min-height: 26px;
1208
+ border-radius: 999px;
1209
+ padding: 4px 8px;
1210
+ font-size: 12px;
1211
+ }
1212
+
1213
+ .step-header-menu {
1214
+ position: relative;
1215
+ flex: 0 0 auto;
1216
+ }
1217
+
1218
+ .step-header-menu-pop {
1219
+ position: absolute;
1220
+ top: 40px;
1221
+ right: 0;
1222
+ z-index: 20;
1223
+ width: 160px;
1224
+ display: grid;
1225
+ gap: 4px;
1226
+ border: 1px solid #d5dbe4;
1227
+ border-radius: 8px;
1228
+ padding: 6px;
1229
+ background: #ffffff;
1230
+ box-shadow: 0 16px 36px rgba(15, 23, 42, 0.16);
1231
+ }
1232
+
1233
+ .step-header-menu-pop button {
1234
+ width: 100%;
1235
+ justify-content: flex-start;
1236
+ border: 0;
1237
+ }
1238
+
1239
+ .step-header-menu-pop hr {
1240
+ width: 100%;
1241
+ border: 0;
1242
+ border-top: 1px solid #e5e9f0;
1243
+ margin: 3px 0;
1244
+ }
1245
+
1246
+ .panel-tabs {
1247
+ display: grid;
1248
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1249
+ gap: 6px;
1250
+ }
1251
+
1252
+ .panel-tabs button {
1253
+ justify-content: center;
1254
+ min-width: 0;
1255
+ min-height: 32px;
1256
+ padding: 5px 7px;
1257
+ font-size: 12px;
1258
+ }
1259
+
1260
+ .panel-tabs button.on {
1261
+ border-color: #0f6b5f;
1262
+ color: #0f6b5f;
1263
+ background: #eef8f5;
1264
+ }
1265
+
1266
+ .panel-tabs button.off {
1267
+ color: #94a3b8;
1268
+ background: #f8fafc;
1269
+ }
1270
+
1271
+ .data-chip {
1272
+ min-width: 18px;
1273
+ min-height: 18px;
1274
+ display: inline-grid;
1275
+ place-items: center;
1276
+ border-radius: 999px;
1277
+ background: #dfe9e7;
1278
+ color: #0f6b5f;
1279
+ font-size: 11px;
1280
+ }
1281
+
1282
+ .panel-body {
1283
+ display: grid;
1284
+ gap: 12px;
1285
+ padding-top: 14px;
1286
+ }
1287
+
1288
+ .edit-pane,
1289
+ .inputs-pane {
1290
+ display: grid;
1291
+ gap: 12px;
1292
+ }
1293
+
1294
+ .empty-inspector {
1295
+ display: grid;
1296
+ gap: 8px;
1297
+ min-height: 180px;
1298
+ align-content: center;
1299
+ border: 1px dashed #c8d0dc;
1300
+ border-radius: 8px;
1301
+ padding: 18px;
1302
+ color: #64748b;
1303
+ }
1304
+
1305
+ .empty-inspector h2 {
1306
+ color: #17202c;
1307
+ }
1308
+
1309
+ .node-editor label,
1310
+ .environment-form label,
1311
+ .ssh-host-row label {
1312
+ display: grid;
1313
+ gap: 5px;
1314
+ font-size: 13px;
1315
+ color: #566275;
1316
+ }
1317
+
1318
+ .node-editor input,
1319
+ .node-editor select,
1320
+ .node-editor textarea,
1321
+ .environment-form input,
1322
+ .ssh-host-row input {
1323
+ width: 100%;
1324
+ min-height: 34px;
1325
+ border: 1px solid #c8d0dc;
1326
+ border-radius: 6px;
1327
+ padding: 7px 9px;
1328
+ color: #17202c;
1329
+ background: #ffffff;
1330
+ }
1331
+
1332
+ .node-editor textarea {
1333
+ min-height: 220px;
1334
+ resize: vertical;
1335
+ font-family: Consolas, "SFMono-Regular", monospace;
1336
+ font-size: 13px;
1337
+ line-height: 1.45;
1338
+ }
1339
+
1340
+ .form-grid {
1341
+ display: grid;
1342
+ gap: 10px;
1343
+ }
1344
+
1345
+ .form-grid.two {
1346
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1347
+ }
1348
+
1349
+ .form-grid.three {
1350
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1351
+ }
1352
+
1353
+ .form-grid.four {
1354
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1355
+ }
1356
+
1357
+ .toggle-row {
1358
+ display: flex;
1359
+ gap: 16px;
1360
+ flex-wrap: wrap;
1361
+ }
1362
+
1363
+ .toggle-row label {
1364
+ display: flex;
1365
+ align-items: center;
1366
+ gap: 7px;
1367
+ color: #17202c;
1368
+ }
1369
+
1370
+ .toggle-line {
1371
+ display: flex !important;
1372
+ grid-column: 1 / -1;
1373
+ align-items: center;
1374
+ gap: 8px;
1375
+ color: #17202c;
1376
+ }
1377
+
1378
+ .toggle-line input {
1379
+ width: 15px;
1380
+ min-height: 15px;
1381
+ }
1382
+
1383
+ .toggle-row input {
1384
+ width: 15px;
1385
+ min-height: 15px;
1386
+ }
1387
+
1388
+ .tabs {
1389
+ display: flex;
1390
+ gap: 5px;
1391
+ flex-wrap: wrap;
1392
+ border-bottom: 1px solid #e5e9f0;
1393
+ padding-bottom: 8px;
1394
+ }
1395
+
1396
+ .tabs button {
1397
+ min-height: 30px;
1398
+ font-size: 12px;
1399
+ padding: 5px 8px;
1400
+ }
1401
+
1402
+ .tabs button.active {
1403
+ border-color: #0f6b5f;
1404
+ color: #0f6b5f;
1405
+ background: #eef8f5;
1406
+ }
1407
+
1408
+ .api-sub-tabs {
1409
+ display: flex;
1410
+ gap: 5px;
1411
+ flex-wrap: wrap;
1412
+ border-bottom: 1px solid #e5e9f0;
1413
+ padding-bottom: 8px;
1414
+ }
1415
+
1416
+ .api-sub-tabs button {
1417
+ min-height: 30px;
1418
+ font-size: 12px;
1419
+ padding: 5px 8px;
1420
+ }
1421
+
1422
+ .api-sub-tabs button.active {
1423
+ border-color: #0f6b5f;
1424
+ color: #0f6b5f;
1425
+ background: #eef8f5;
1426
+ }
1427
+
1428
+ .api-request-editor {
1429
+ display: grid;
1430
+ gap: 12px;
1431
+ border: 1px solid #d5dbe4;
1432
+ border-radius: 8px;
1433
+ padding: 12px;
1434
+ background: #fbfcfe;
1435
+ }
1436
+
1437
+ .api-request-editor:not(.popout) {
1438
+ gap: 10px;
1439
+ overflow: hidden;
1440
+ }
1441
+
1442
+ .api-request-editor:not(.popout) .request-editor-header,
1443
+ .api-request-editor:not(.popout) .request-url-row,
1444
+ .api-request-editor:not(.popout) .api-sub-tabs,
1445
+ .api-request-editor:not(.popout) .request-output-toolbar,
1446
+ .api-request-editor:not(.popout) .editor-pane,
1447
+ .api-request-editor:not(.popout) .record-editor,
1448
+ .api-request-editor:not(.popout) .capture-editor,
1449
+ .api-request-editor:not(.popout) .assertion-editor {
1450
+ display: none;
1451
+ }
1452
+
1453
+ .api-editor-backdrop {
1454
+ position: fixed;
1455
+ inset: 0;
1456
+ z-index: 79;
1457
+ min-height: 0;
1458
+ border: 0;
1459
+ border-radius: 0;
1460
+ padding: 0;
1461
+ background: rgba(15, 23, 42, 0.48);
1462
+ cursor: default;
1463
+ }
1464
+
1465
+ .api-editor-launchbar {
1466
+ display: grid;
1467
+ grid-template-columns: minmax(0, 1fr) auto;
1468
+ gap: 10px;
1469
+ align-items: center;
1470
+ border: 1px solid #b7cac6;
1471
+ border-radius: 8px;
1472
+ padding: 10px;
1473
+ background: #eef8f5;
1474
+ }
1475
+
1476
+ .api-editor-launchbar div {
1477
+ display: grid;
1478
+ gap: 3px;
1479
+ min-width: 0;
1480
+ }
1481
+
1482
+ .api-editor-launchbar strong {
1483
+ overflow: hidden;
1484
+ color: #17202c;
1485
+ font-family: Consolas, "SFMono-Regular", monospace;
1486
+ font-size: 12px;
1487
+ text-overflow: ellipsis;
1488
+ white-space: nowrap;
1489
+ }
1490
+
1491
+ .api-editor-launchbar span {
1492
+ color: #566275;
1493
+ font-size: 12px;
1494
+ }
1495
+
1496
+ .api-editor-launchbar button {
1497
+ white-space: nowrap;
1498
+ }
1499
+
1500
+ .api-request-editor.popout {
1501
+ position: fixed;
1502
+ top: 4vh;
1503
+ right: 3vw;
1504
+ bottom: 4vh;
1505
+ left: 3vw;
1506
+ z-index: 80;
1507
+ align-content: start;
1508
+ grid-template-rows: auto auto auto auto auto minmax(0, 1fr);
1509
+ overflow: auto;
1510
+ border-color: #8ea4c0;
1511
+ background: #ffffff;
1512
+ box-shadow: 0 22px 70px rgba(15, 23, 42, 0.35);
1513
+ }
1514
+
1515
+ .api-request-editor.popout textarea {
1516
+ min-height: 58vh;
1517
+ }
1518
+
1519
+ .api-request-editor.expanded {
1520
+ max-width: 94vw;
1521
+ max-height: 92vh;
1522
+ }
1523
+
1524
+ .request-editor-header {
1525
+ display: flex;
1526
+ justify-content: space-between;
1527
+ gap: 12px;
1528
+ align-items: flex-start;
1529
+ border-bottom: 1px solid #e5e9f0;
1530
+ padding-bottom: 10px;
1531
+ }
1532
+
1533
+ .api-request-editor.popout .request-editor-header {
1534
+ position: sticky;
1535
+ top: -1px;
1536
+ z-index: 2;
1537
+ margin: -12px -12px 0;
1538
+ padding: 12px;
1539
+ background: #ffffff;
1540
+ }
1541
+
1542
+ .request-editor-header h3 {
1543
+ margin: 0;
1544
+ color: #17202c;
1545
+ font-size: 15px;
1546
+ text-transform: none;
1547
+ }
1548
+
1549
+ .request-editor-header p {
1550
+ margin: 3px 0 0;
1551
+ color: #64748b;
1552
+ font-size: 12px;
1553
+ overflow-wrap: anywhere;
1554
+ }
1555
+
1556
+ .request-editor-actions {
1557
+ display: flex;
1558
+ align-items: center;
1559
+ gap: 8px;
1560
+ flex-wrap: wrap;
1561
+ justify-content: flex-end;
1562
+ }
1563
+
1564
+ .request-editor-actions button {
1565
+ min-height: 30px;
1566
+ padding: 5px 9px;
1567
+ font-size: 12px;
1568
+ }
1569
+
1570
+ .request-url-row {
1571
+ display: grid;
1572
+ grid-template-columns: 110px minmax(0, 1fr);
1573
+ gap: 8px;
1574
+ }
1575
+
1576
+ .request-url-row select,
1577
+ .request-url-row input {
1578
+ min-height: 38px;
1579
+ border: 1px solid #c8d0dc;
1580
+ border-radius: 6px;
1581
+ padding: 7px 9px;
1582
+ background: #ffffff;
1583
+ }
1584
+
1585
+ .request-url-row input {
1586
+ font-family: Consolas, "SFMono-Regular", monospace;
1587
+ font-size: 13px;
1588
+ }
1589
+
1590
+ .tpl-card {
1591
+ border: 1px solid #e5e9f0;
1592
+ border-radius: 8px;
1593
+ background: #ffffff;
1594
+ overflow: hidden;
1595
+ }
1596
+
1597
+ .tpl-head {
1598
+ display: grid;
1599
+ grid-template-columns: auto minmax(0, 1fr);
1600
+ gap: 12px;
1601
+ align-items: center;
1602
+ padding: 7px 11px;
1603
+ background: #f8fafc;
1604
+ border-bottom: 1px solid #e5e9f0;
1605
+ }
1606
+
1607
+ .tpl-lbl {
1608
+ text-transform: uppercase;
1609
+ letter-spacing: 0;
1610
+ font-size: 11px;
1611
+ font-weight: 700;
1612
+ color: #738095;
1613
+ }
1614
+
1615
+ .tpl-select {
1616
+ border: 1px solid #c8d0dc;
1617
+ border-radius: 5px;
1618
+ background: #ffffff;
1619
+ font: inherit;
1620
+ font-size: 13px;
1621
+ min-height: 30px;
1622
+ padding: 3px 7px;
1623
+ width: 100%;
1624
+ min-width: 0;
1625
+ }
1626
+
1627
+ .tpl-meta {
1628
+ padding: 6px 11px 8px;
1629
+ font-size: 12px;
1630
+ color: #64748b;
1631
+ font-family: Consolas, "SFMono-Regular", monospace;
1632
+ overflow-wrap: anywhere;
1633
+ }
1634
+
1635
+ .override-banner {
1636
+ display: flex;
1637
+ align-items: center;
1638
+ gap: 9px;
1639
+ background: #fff7e8;
1640
+ border: 1px solid #ecc88c;
1641
+ color: #955a00;
1642
+ border-radius: 6px;
1643
+ padding: 7px 11px;
1644
+ font-size: 13px;
1645
+ flex-wrap: wrap;
1646
+ }
1647
+
1648
+ .override-banner b {
1649
+ font-weight: 700;
1650
+ }
1651
+
1652
+ .override-dot {
1653
+ width: 8px;
1654
+ height: 8px;
1655
+ border-radius: 50%;
1656
+ background: #b46d00;
1657
+ flex-shrink: 0;
1658
+ }
1659
+
1660
+ .override-banner .link {
1661
+ background: transparent;
1662
+ border: 0;
1663
+ color: #955a00;
1664
+ min-height: 0;
1665
+ padding: 0 0 0 6px;
1666
+ font: inherit;
1667
+ text-decoration: underline;
1668
+ cursor: pointer;
1669
+ }
1670
+
1671
+ .override-banner .link.danger {
1672
+ color: #9f1d35;
1673
+ margin-left: auto;
1674
+ }
1675
+
1676
+ .override-diff {
1677
+ border: 1px solid #e5e9f0;
1678
+ border-radius: 6px;
1679
+ padding: 8px 10px;
1680
+ background: #ffffff;
1681
+ display: grid;
1682
+ gap: 4px;
1683
+ }
1684
+
1685
+ .diff-line {
1686
+ display: grid;
1687
+ grid-template-columns: minmax(90px, 130px) minmax(0, 1fr) 24px minmax(0, 1fr);
1688
+ gap: 10px;
1689
+ font-family: Consolas, "SFMono-Regular", monospace;
1690
+ font-size: 12px;
1691
+ padding: 3px 0;
1692
+ }
1693
+
1694
+ .diff-path {
1695
+ color: #64748b;
1696
+ }
1697
+
1698
+ .diff-from {
1699
+ color: #64748b;
1700
+ text-decoration: line-through;
1701
+ overflow-wrap: anywhere;
1702
+ }
1703
+
1704
+ .diff-arrow {
1705
+ color: #64748b;
1706
+ text-align: center;
1707
+ }
1708
+
1709
+ .diff-to {
1710
+ color: #955a00;
1711
+ font-weight: 600;
1712
+ overflow-wrap: anywhere;
1713
+ }
1714
+
1715
+ .request-summary-panel {
1716
+ display: grid;
1717
+ grid-template-columns: 1fr auto auto auto;
1718
+ gap: 8px;
1719
+ align-items: center;
1720
+ border: 1px solid #e5e9f0;
1721
+ border-radius: 6px;
1722
+ background: #ffffff;
1723
+ padding: 9px;
1724
+ font-size: 12px;
1725
+ }
1726
+
1727
+ .request-summary-panel strong {
1728
+ overflow-wrap: anywhere;
1729
+ }
1730
+
1731
+ .request-summary-panel span {
1732
+ color: #64748b;
1733
+ white-space: nowrap;
1734
+ }
1735
+
1736
+ .request-output-toolbar {
1737
+ display: grid;
1738
+ grid-template-columns: auto minmax(160px, 1fr) minmax(140px, 1fr) auto auto;
1739
+ gap: 8px;
1740
+ align-items: center;
1741
+ border: 1px solid #d9e8e4;
1742
+ border-radius: 8px;
1743
+ background: #f4fbf9;
1744
+ padding: 8px;
1745
+ color: #334155;
1746
+ font-size: 12px;
1747
+ }
1748
+
1749
+ .request-output-toolbar span {
1750
+ font-weight: 700;
1751
+ color: #0f6b5f;
1752
+ }
1753
+
1754
+ .request-output-toolbar select {
1755
+ min-height: 32px;
1756
+ border: 1px solid #c8d0dc;
1757
+ border-radius: 6px;
1758
+ background: #ffffff;
1759
+ padding: 5px 8px;
1760
+ }
1761
+
1762
+ .request-output-toolbar code {
1763
+ overflow: hidden;
1764
+ font-family: Consolas, "SFMono-Regular", monospace;
1765
+ color: #0f6b5f;
1766
+ text-overflow: ellipsis;
1767
+ white-space: nowrap;
1768
+ }
1769
+
1770
+ .request-output-toolbar button {
1771
+ min-height: 30px;
1772
+ padding: 5px 9px;
1773
+ font-size: 12px;
1774
+ }
1775
+
1776
+ .record-editor {
1777
+ display: grid;
1778
+ gap: 8px;
1779
+ }
1780
+
1781
+ .record-header,
1782
+ .record-row {
1783
+ display: grid;
1784
+ grid-template-columns: 1fr 1.4fr 34px;
1785
+ gap: 6px;
1786
+ }
1787
+
1788
+ .record-editor.with-output .record-header,
1789
+ .record-editor.with-output .record-row {
1790
+ grid-template-columns: 1fr 1.2fr 1.2fr 34px;
1791
+ }
1792
+
1793
+ .record-header {
1794
+ color: #738095;
1795
+ font-size: 12px;
1796
+ font-weight: 700;
1797
+ text-transform: uppercase;
1798
+ }
1799
+
1800
+ .record-row input,
1801
+ .record-row select {
1802
+ width: 100%;
1803
+ min-height: 34px;
1804
+ border: 1px solid #c8d0dc;
1805
+ border-radius: 6px;
1806
+ padding: 7px 9px;
1807
+ background: #ffffff;
1808
+ color: #17202c;
1809
+ }
1810
+
1811
+ .record-row select {
1812
+ font-size: 12px;
1813
+ }
1814
+
1815
+ .record-row button {
1816
+ padding: 0;
1817
+ justify-content: center;
1818
+ }
1819
+
1820
+ .mapping-editor {
1821
+ display: grid;
1822
+ gap: 8px;
1823
+ }
1824
+
1825
+ .mapping-header {
1826
+ display: grid;
1827
+ grid-template-columns: 1fr 1.2fr 1.2fr 34px;
1828
+ gap: 6px;
1829
+ color: #738095;
1830
+ font-size: 12px;
1831
+ font-weight: 700;
1832
+ text-transform: uppercase;
1833
+ }
1834
+
1835
+ .mapping-row {
1836
+ display: grid;
1837
+ grid-template-columns: 1fr 1.2fr 1.2fr 34px;
1838
+ gap: 6px;
1839
+ }
1840
+
1841
+ .suggested-param-row {
1842
+ display: flex;
1843
+ flex-wrap: wrap;
1844
+ gap: 7px;
1845
+ }
1846
+
1847
+ .mapping-row.compact,
1848
+ .mapping-row.compact + .mapping-header {
1849
+ grid-template-columns: 1fr 1.4fr 34px;
1850
+ }
1851
+
1852
+ .mapping-row input,
1853
+ .mapping-row select {
1854
+ width: 100%;
1855
+ min-height: 34px;
1856
+ border: 1px solid #c8d0dc;
1857
+ border-radius: 6px;
1858
+ padding: 7px 9px;
1859
+ background: #ffffff;
1860
+ color: #17202c;
1861
+ }
1862
+
1863
+ .mapping-row input:disabled,
1864
+ .mapping-row select:disabled {
1865
+ background: #eef1f5;
1866
+ color: #566275;
1867
+ }
1868
+
1869
+ .mapping-output-select {
1870
+ font-size: 12px;
1871
+ }
1872
+
1873
+ .mapping-row[data-locked="true"] button {
1874
+ cursor: not-allowed;
1875
+ opacity: 0.55;
1876
+ pointer-events: none;
1877
+ }
1878
+
1879
+ .mapping-row button,
1880
+ .assertion-row button {
1881
+ padding: 0;
1882
+ justify-content: center;
1883
+ }
1884
+
1885
+ .batch-step-files {
1886
+ background: #f4fbf9;
1887
+ border-color: #cfe7e1;
1888
+ }
1889
+
1890
+ .batch-step-file-card {
1891
+ display: grid;
1892
+ gap: 9px;
1893
+ border: 1px solid #d8e2ec;
1894
+ border-radius: 8px;
1895
+ padding: 10px;
1896
+ background: #ffffff;
1897
+ }
1898
+
1899
+ .batch-step-file-card > div:first-child {
1900
+ display: flex;
1901
+ gap: 8px;
1902
+ align-items: center;
1903
+ flex-wrap: wrap;
1904
+ }
1905
+
1906
+ .batch-step-file-card small {
1907
+ color: #64748b;
1908
+ }
1909
+
1910
+ .batch-file-picker-row {
1911
+ display: grid;
1912
+ grid-template-columns: minmax(180px, 0.8fr) minmax(0, 1fr) auto;
1913
+ gap: 8px;
1914
+ align-items: center;
1915
+ }
1916
+
1917
+ .batch-file-picker-row span {
1918
+ min-width: 0;
1919
+ overflow-wrap: anywhere;
1920
+ color: #475569;
1921
+ font-size: 12px;
1922
+ }
1923
+
1924
+ .capture-editor {
1925
+ display: grid;
1926
+ gap: 10px;
1927
+ }
1928
+
1929
+ .capture-help {
1930
+ display: grid;
1931
+ gap: 5px;
1932
+ border: 1px solid #d9e8e4;
1933
+ border-radius: 8px;
1934
+ background: #f4fbf9;
1935
+ padding: 10px;
1936
+ color: #334155;
1937
+ }
1938
+
1939
+ .capture-help strong {
1940
+ color: #0f6b5f;
1941
+ }
1942
+
1943
+ .capture-help p {
1944
+ margin: 0;
1945
+ font-size: 12px;
1946
+ line-height: 1.45;
1947
+ }
1948
+
1949
+ .capture-help code,
1950
+ .capture-row code {
1951
+ font-family: Consolas, "SFMono-Regular", monospace;
1952
+ }
1953
+
1954
+ .capture-quick {
1955
+ display: flex;
1956
+ gap: 7px;
1957
+ flex-wrap: wrap;
1958
+ }
1959
+
1960
+ .capture-quick button {
1961
+ min-height: 30px;
1962
+ padding: 5px 9px;
1963
+ font-size: 12px;
1964
+ }
1965
+
1966
+ .capture-header,
1967
+ .capture-row {
1968
+ display: grid;
1969
+ grid-template-columns: minmax(92px, 0.9fr) minmax(140px, 1.4fr) minmax(132px, 1.1fr) 34px;
1970
+ gap: 6px;
1971
+ align-items: center;
1972
+ }
1973
+
1974
+ .capture-header {
1975
+ color: #738095;
1976
+ font-size: 12px;
1977
+ font-weight: 700;
1978
+ text-transform: uppercase;
1979
+ }
1980
+
1981
+ .capture-row input {
1982
+ width: 100%;
1983
+ min-height: 34px;
1984
+ border: 1px solid #c8d0dc;
1985
+ border-radius: 6px;
1986
+ padding: 7px 9px;
1987
+ background: #ffffff;
1988
+ color: #17202c;
1989
+ }
1990
+
1991
+ .capture-row code {
1992
+ display: block;
1993
+ overflow: hidden;
1994
+ color: #0f6b5f;
1995
+ font-size: 12px;
1996
+ text-overflow: ellipsis;
1997
+ white-space: nowrap;
1998
+ }
1999
+
2000
+ .capture-row button {
2001
+ padding: 0;
2002
+ justify-content: center;
2003
+ }
2004
+
2005
+ .field-help {
2006
+ color: #64748b;
2007
+ font-size: 12px;
2008
+ margin: 2px 0 0;
2009
+ }
2010
+
2011
+ .button-row {
2012
+ display: flex;
2013
+ gap: 8px;
2014
+ flex-wrap: wrap;
2015
+ }
2016
+
2017
+ .button-row.right {
2018
+ justify-content: flex-end;
2019
+ }
2020
+
2021
+ .assertion-editor {
2022
+ display: grid;
2023
+ gap: 8px;
2024
+ }
2025
+
2026
+ .assertion-row {
2027
+ display: grid;
2028
+ grid-template-columns: 1fr 1.2fr 1fr 34px;
2029
+ gap: 6px;
2030
+ }
2031
+
2032
+ .assertion-row input,
2033
+ .assertion-row select {
2034
+ width: 100%;
2035
+ min-height: 34px;
2036
+ border: 1px solid #c8d0dc;
2037
+ border-radius: 6px;
2038
+ padding: 7px 9px;
2039
+ }
2040
+
2041
+ .validation,
2042
+ .message {
2043
+ border-top: 1px solid #e5e9f0;
2044
+ padding-top: 14px;
2045
+ margin-top: 14px;
2046
+ }
2047
+
2048
+ .validation-title-row {
2049
+ display: flex;
2050
+ align-items: center;
2051
+ justify-content: space-between;
2052
+ gap: 10px;
2053
+ }
2054
+
2055
+ .validation p,
2056
+ .message {
2057
+ color: #566275;
2058
+ font-size: 13px;
2059
+ overflow-wrap: anywhere;
2060
+ }
2061
+
2062
+ .ok {
2063
+ color: #0f6b5f;
2064
+ }
2065
+
2066
+ .bad,
2067
+ .failed {
2068
+ color: #9f1d35;
2069
+ }
2070
+
2071
+ .add-step-panel {
2072
+ display: grid;
2073
+ gap: 16px;
2074
+ }
2075
+
2076
+ .panel-title-row {
2077
+ display: flex;
2078
+ justify-content: space-between;
2079
+ align-items: flex-start;
2080
+ gap: 12px;
2081
+ border-bottom: 1px solid #e5e9f0;
2082
+ padding-bottom: 14px;
2083
+ }
2084
+
2085
+ .panel-title-row h2 {
2086
+ margin: 0 0 4px;
2087
+ color: #17202c;
2088
+ font-size: 18px;
2089
+ text-transform: none;
2090
+ }
2091
+
2092
+ .panel-title-row p {
2093
+ margin: 0;
2094
+ color: #64748b;
2095
+ font-size: 13px;
2096
+ }
2097
+
2098
+ .add-step-section {
2099
+ display: grid;
2100
+ gap: 8px;
2101
+ }
2102
+
2103
+ .add-step-section h3 {
2104
+ margin: 0 0 2px;
2105
+ color: #738095;
2106
+ font-size: 12px;
2107
+ text-transform: uppercase;
2108
+ }
2109
+
2110
+ .collection-add-row {
2111
+ display: grid;
2112
+ grid-template-columns: 18px minmax(0, 1fr) auto;
2113
+ gap: 8px;
2114
+ justify-content: stretch;
2115
+ width: 100%;
2116
+ }
2117
+
2118
+ .collection-add-row span {
2119
+ overflow: hidden;
2120
+ text-overflow: ellipsis;
2121
+ white-space: nowrap;
2122
+ }
2123
+
2124
+ .collection-add-row small {
2125
+ color: #64748b;
2126
+ }
2127
+
2128
+ .quick-api-row {
2129
+ display: grid;
2130
+ grid-template-columns: minmax(0, 1fr) 34px;
2131
+ gap: 6px;
2132
+ }
2133
+
2134
+ .quick-api-row > button:first-child {
2135
+ justify-content: flex-start;
2136
+ overflow: hidden;
2137
+ }
2138
+
2139
+ .quick-config-row {
2140
+ display: grid;
2141
+ grid-template-columns: minmax(0, 1fr) auto;
2142
+ gap: 8px;
2143
+ }
2144
+
2145
+ .quick-config-row select {
2146
+ min-height: 34px;
2147
+ border: 1px solid #c8d0dc;
2148
+ border-radius: 6px;
2149
+ padding: 7px 9px;
2150
+ }
2151
+
2152
+ .button-grid {
2153
+ display: grid;
2154
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2155
+ gap: 8px;
2156
+ }
2157
+
2158
+ .button-grid button {
2159
+ justify-content: center;
2160
+ }
2161
+
2162
+ .environment-manager {
2163
+ background: #ffffff;
2164
+ border-bottom: 1px solid #d5dbe4;
2165
+ padding: 14px 18px 18px;
2166
+ }
2167
+
2168
+ .environment-manager-header {
2169
+ display: flex;
2170
+ justify-content: space-between;
2171
+ gap: 16px;
2172
+ align-items: flex-start;
2173
+ margin-bottom: 12px;
2174
+ }
2175
+
2176
+ .environment-manager-header h2 {
2177
+ margin: 0;
2178
+ font-size: 16px;
2179
+ }
2180
+
2181
+ .environment-manager-header p {
2182
+ margin: 3px 0 0;
2183
+ color: #64748b;
2184
+ font-size: 12px;
2185
+ }
2186
+
2187
+ .environment-manager-body {
2188
+ display: grid;
2189
+ grid-template-columns: 220px minmax(0, 1fr);
2190
+ gap: 16px;
2191
+ }
2192
+
2193
+ .environment-list {
2194
+ display: grid;
2195
+ align-content: start;
2196
+ gap: 7px;
2197
+ }
2198
+
2199
+ .environment-list button {
2200
+ justify-content: flex-start;
2201
+ }
2202
+
2203
+ .environment-list button.selected {
2204
+ border-color: #0f6b5f;
2205
+ box-shadow: 0 0 0 2px rgba(15, 107, 95, 0.14);
2206
+ }
2207
+
2208
+ .environment-form {
2209
+ display: grid;
2210
+ gap: 12px;
2211
+ }
2212
+
2213
+ .ssh-host-row {
2214
+ display: grid;
2215
+ grid-template-columns: 0.9fr 1fr 0.9fr 0.9fr 1fr auto;
2216
+ gap: 8px;
2217
+ align-items: end;
2218
+ padding: 10px;
2219
+ border: 1px solid #e5e9f0;
2220
+ border-radius: 8px;
2221
+ background: #f8fafc;
2222
+ }
2223
+
2224
+ .side-drawer-shell {
2225
+ position: fixed;
2226
+ top: 0;
2227
+ right: 0;
2228
+ bottom: 0;
2229
+ width: min(560px, 100vw);
2230
+ display: flex;
2231
+ justify-content: flex-end;
2232
+ padding: 0;
2233
+ z-index: 20;
2234
+ pointer-events: none;
2235
+ }
2236
+
2237
+ .collection-modal {
2238
+ width: 100%;
2239
+ height: 100%;
2240
+ max-height: 100vh;
2241
+ display: grid;
2242
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
2243
+ gap: 12px;
2244
+ background: #ffffff;
2245
+ border-left: 1px solid #c8d0dc;
2246
+ border-radius: 0;
2247
+ padding: 16px;
2248
+ box-shadow: -18px 0 48px rgba(15, 23, 42, 0.18);
2249
+ pointer-events: auto;
2250
+ }
2251
+
2252
+ .db-query-shell {
2253
+ width: min(980px, 100vw);
2254
+ }
2255
+
2256
+ .db-query-modal {
2257
+ width: min(980px, 100vw);
2258
+ }
2259
+
2260
+ .db-template-shell {
2261
+ width: min(640px, 100vw);
2262
+ }
2263
+
2264
+ .db-template-modal {
2265
+ width: min(640px, 100vw);
2266
+ }
2267
+
2268
+ .db-template-list {
2269
+ min-height: 0;
2270
+ overflow: auto;
2271
+ display: grid;
2272
+ align-content: start;
2273
+ gap: 8px;
2274
+ }
2275
+
2276
+ .db-template-row {
2277
+ width: 100%;
2278
+ display: grid;
2279
+ grid-template-columns: minmax(0, 1fr) auto;
2280
+ gap: 12px;
2281
+ align-items: center;
2282
+ text-align: left;
2283
+ padding: 11px 12px;
2284
+ }
2285
+
2286
+ .db-template-row.selectable {
2287
+ grid-template-columns: auto minmax(0, 1fr) auto;
2288
+ border: 1px solid #d5dbe4;
2289
+ border-radius: 8px;
2290
+ background: #ffffff;
2291
+ cursor: pointer;
2292
+ }
2293
+
2294
+ .db-template-row.selectable.selected {
2295
+ border-color: #0f6b5f;
2296
+ background: #eef8f5;
2297
+ box-shadow: 0 0 0 2px rgba(15, 107, 95, 0.12);
2298
+ }
2299
+
2300
+ .db-template-row.selectable > input {
2301
+ width: 16px;
2302
+ min-height: 16px;
2303
+ }
2304
+
2305
+ .db-template-row > div:first-child {
2306
+ min-width: 0;
2307
+ display: grid;
2308
+ gap: 4px;
2309
+ }
2310
+
2311
+ .db-template-row strong,
2312
+ .db-template-row span,
2313
+ .db-template-row code {
2314
+ overflow: hidden;
2315
+ text-overflow: ellipsis;
2316
+ white-space: nowrap;
2317
+ }
2318
+
2319
+ .db-template-row span {
2320
+ color: #64748b;
2321
+ font-size: 12px;
2322
+ }
2323
+
2324
+ .db-template-row code {
2325
+ color: #475569;
2326
+ font-size: 12px;
2327
+ background: #f1f5f9;
2328
+ border-radius: 5px;
2329
+ padding: 3px 5px;
2330
+ }
2331
+
2332
+ .db-template-meta {
2333
+ display: grid;
2334
+ justify-items: end;
2335
+ gap: 4px;
2336
+ color: #64748b;
2337
+ font-size: 11px;
2338
+ }
2339
+
2340
+ .db-template-meta b {
2341
+ color: #0f6b5f;
2342
+ font-size: 13px;
2343
+ }
2344
+
2345
+ .link-button {
2346
+ width: auto;
2347
+ min-height: 0;
2348
+ border: 0;
2349
+ padding: 0;
2350
+ background: transparent;
2351
+ color: #0f6b5f;
2352
+ font-size: 13px;
2353
+ font-weight: 700;
2354
+ justify-content: end;
2355
+ }
2356
+
2357
+ .link-button:hover {
2358
+ text-decoration: underline;
2359
+ }
2360
+
2361
+ .db-query-manager {
2362
+ min-height: 0;
2363
+ display: grid;
2364
+ grid-template-columns: 270px minmax(0, 1fr);
2365
+ gap: 14px;
2366
+ overflow: hidden;
2367
+ }
2368
+
2369
+ .db-query-list,
2370
+ .db-query-form {
2371
+ min-height: 0;
2372
+ overflow: auto;
2373
+ }
2374
+
2375
+ .db-query-list {
2376
+ display: grid;
2377
+ grid-template-rows: auto auto minmax(0, 1fr);
2378
+ gap: 10px;
2379
+ }
2380
+
2381
+ .db-query-create {
2382
+ display: grid;
2383
+ grid-template-columns: 1fr 1fr;
2384
+ gap: 8px;
2385
+ }
2386
+
2387
+ .db-query-create.single {
2388
+ grid-template-columns: 1fr;
2389
+ }
2390
+
2391
+ .db-query-items {
2392
+ display: grid;
2393
+ align-content: start;
2394
+ gap: 7px;
2395
+ overflow: auto;
2396
+ }
2397
+
2398
+ .db-query-items button {
2399
+ display: grid;
2400
+ grid-template-columns: minmax(0, 1fr) auto;
2401
+ gap: 3px 8px;
2402
+ justify-content: stretch;
2403
+ text-align: left;
2404
+ }
2405
+
2406
+ .db-query-items button.selected {
2407
+ border-color: #0f6b5f;
2408
+ box-shadow: 0 0 0 2px rgba(15, 107, 95, 0.14);
2409
+ }
2410
+
2411
+ .db-query-items strong,
2412
+ .db-query-items small {
2413
+ overflow: hidden;
2414
+ text-overflow: ellipsis;
2415
+ white-space: nowrap;
2416
+ }
2417
+
2418
+ .db-query-items span {
2419
+ font-size: 11px;
2420
+ color: #64748b;
2421
+ text-transform: uppercase;
2422
+ }
2423
+
2424
+ .db-query-items small {
2425
+ grid-column: 1 / -1;
2426
+ color: #64748b;
2427
+ }
2428
+
2429
+ .db-query-form {
2430
+ display: grid;
2431
+ gap: 12px;
2432
+ }
2433
+
2434
+ .db-query-form label {
2435
+ display: grid;
2436
+ gap: 5px;
2437
+ color: #566275;
2438
+ font-size: 13px;
2439
+ }
2440
+
2441
+ .db-query-form input,
2442
+ .db-query-form select,
2443
+ .db-query-form textarea {
2444
+ width: 100%;
2445
+ min-height: 34px;
2446
+ border: 1px solid #c8d0dc;
2447
+ border-radius: 6px;
2448
+ padding: 7px 9px;
2449
+ }
2450
+
2451
+ .db-query-form .sql-editor {
2452
+ min-height: 230px;
2453
+ resize: vertical;
2454
+ font-family: Consolas, "SFMono-Regular", monospace;
2455
+ line-height: 1.45;
2456
+ }
2457
+
2458
+ .db-query-form .small-code-editor {
2459
+ min-height: 80px;
2460
+ resize: vertical;
2461
+ font-family: Consolas, "SFMono-Regular", monospace;
2462
+ line-height: 1.45;
2463
+ }
2464
+
2465
+ .db-query-form .command-line-editor {
2466
+ min-height: 72px;
2467
+ resize: vertical;
2468
+ font-family: Consolas, "SFMono-Regular", monospace;
2469
+ line-height: 1.45;
2470
+ }
2471
+
2472
+ .db-sub-editor {
2473
+ display: grid;
2474
+ gap: 8px;
2475
+ border: 1px solid #e5e9f0;
2476
+ border-radius: 8px;
2477
+ padding: 10px;
2478
+ background: #f8fafc;
2479
+ }
2480
+
2481
+ .db-sub-head {
2482
+ display: flex;
2483
+ justify-content: space-between;
2484
+ align-items: center;
2485
+ gap: 12px;
2486
+ }
2487
+
2488
+ .db-sub-head h3 {
2489
+ margin: 0;
2490
+ color: #17202c;
2491
+ font-size: 14px;
2492
+ }
2493
+
2494
+ .db-param-row,
2495
+ .db-capture-row,
2496
+ .db-expect-row {
2497
+ display: grid;
2498
+ gap: 7px;
2499
+ align-items: center;
2500
+ }
2501
+
2502
+ .db-param-row {
2503
+ grid-template-columns: minmax(100px, 1fr) 112px 70px minmax(130px, 1.2fr) 54px 32px;
2504
+ }
2505
+
2506
+ .batch-file-row {
2507
+ display: grid;
2508
+ grid-template-columns: minmax(110px, 0.9fr) minmax(180px, 1.6fr) minmax(120px, 0.9fr) 74px 64px 32px;
2509
+ gap: 7px;
2510
+ align-items: center;
2511
+ }
2512
+
2513
+ .batch-file-row.header {
2514
+ color: #64748b;
2515
+ font-size: 11px;
2516
+ font-weight: 700;
2517
+ text-transform: uppercase;
2518
+ }
2519
+
2520
+ .batch-file-row input[type="checkbox"] {
2521
+ width: 18px;
2522
+ min-height: 18px;
2523
+ justify-self: center;
2524
+ }
2525
+
2526
+ .batch-file-row button {
2527
+ padding: 0;
2528
+ justify-content: center;
2529
+ }
2530
+
2531
+ .batch-output-card {
2532
+ display: grid;
2533
+ gap: 10px;
2534
+ padding: 10px;
2535
+ border: 1px solid #dbe3ee;
2536
+ border-radius: 8px;
2537
+ background: #ffffff;
2538
+ }
2539
+
2540
+ .checkbox-label.compact {
2541
+ min-height: 32px;
2542
+ }
2543
+
2544
+ .db-capture-row {
2545
+ grid-template-columns: minmax(130px, 1fr) minmax(180px, 1.5fr) 32px;
2546
+ }
2547
+
2548
+ .db-expect-row {
2549
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2550
+ }
2551
+
2552
+ .db-param-row.header,
2553
+ .db-capture-row.header {
2554
+ color: #64748b;
2555
+ font-size: 11px;
2556
+ font-weight: 700;
2557
+ text-transform: uppercase;
2558
+ }
2559
+
2560
+ .compact-toggle {
2561
+ display: flex !important;
2562
+ margin: 0;
2563
+ }
2564
+
2565
+ .control-editor {
2566
+ gap: 12px;
2567
+ }
2568
+
2569
+ .repeat-step-panel {
2570
+ display: grid;
2571
+ gap: 10px;
2572
+ border: 1px solid #d5dbe4;
2573
+ border-radius: 8px;
2574
+ padding: 11px;
2575
+ background: #f8fafc;
2576
+ }
2577
+
2578
+ .repeat-step-panel p {
2579
+ margin: 4px 0 0;
2580
+ color: #64748b;
2581
+ font-size: 12px;
2582
+ }
2583
+
2584
+ .repeat-range-box {
2585
+ display: grid;
2586
+ gap: 8px;
2587
+ border-top: 1px solid #d5dbe4;
2588
+ padding-top: 9px;
2589
+ }
2590
+
2591
+ .repeat-range-box label {
2592
+ display: grid;
2593
+ gap: 5px;
2594
+ color: #566275;
2595
+ font-size: 12px;
2596
+ }
2597
+
2598
+ .repeat-range-box select {
2599
+ min-height: 34px;
2600
+ border: 1px solid #c8d0dc;
2601
+ border-radius: 6px;
2602
+ background: #ffffff;
2603
+ padding: 6px 8px;
2604
+ }
2605
+
2606
+ .loop-date-settings {
2607
+ display: grid;
2608
+ gap: 10px;
2609
+ border: 1px solid #d8c8ff;
2610
+ border-radius: 8px;
2611
+ padding: 11px;
2612
+ background: #fbfaff;
2613
+ }
2614
+
2615
+ .checkbox-row {
2616
+ display: inline-flex !important;
2617
+ grid-template-columns: auto minmax(0, 1fr);
2618
+ gap: 8px;
2619
+ align-items: center;
2620
+ color: #334155;
2621
+ font-weight: 700;
2622
+ }
2623
+
2624
+ .checkbox-row input {
2625
+ width: auto;
2626
+ min-height: 0;
2627
+ }
2628
+
2629
+ .loop-warning {
2630
+ border: 1px solid #f2c66d;
2631
+ border-radius: 8px;
2632
+ padding: 9px 10px;
2633
+ background: #fff7e6;
2634
+ color: #75500d;
2635
+ font-size: 12px;
2636
+ }
2637
+
2638
+ .loop-unwrap-button {
2639
+ justify-self: start;
2640
+ }
2641
+
2642
+ .control-branch {
2643
+ display: grid;
2644
+ gap: 8px;
2645
+ border: 1px solid #e5e9f0;
2646
+ border-radius: 8px;
2647
+ padding: 10px;
2648
+ background: #f8fafc;
2649
+ }
2650
+
2651
+ .nested-step-list {
2652
+ display: grid;
2653
+ gap: 7px;
2654
+ }
2655
+
2656
+ .nested-step-list > div {
2657
+ display: grid;
2658
+ grid-template-columns: minmax(0, 1fr) auto auto;
2659
+ gap: 8px;
2660
+ align-items: center;
2661
+ border: 1px solid #dbe3ef;
2662
+ border-radius: 7px;
2663
+ padding: 7px 8px;
2664
+ background: #ffffff;
2665
+ }
2666
+
2667
+ .nested-step-list span {
2668
+ overflow: hidden;
2669
+ text-overflow: ellipsis;
2670
+ white-space: nowrap;
2671
+ font-weight: 700;
2672
+ }
2673
+
2674
+ .nested-step-list small {
2675
+ color: #64748b;
2676
+ font-size: 11px;
2677
+ text-transform: uppercase;
2678
+ }
2679
+
2680
+ .collection-modal header,
2681
+ .collection-modal footer {
2682
+ display: flex;
2683
+ justify-content: space-between;
2684
+ gap: 16px;
2685
+ align-items: center;
2686
+ }
2687
+
2688
+ .collection-modal h2 {
2689
+ margin: 0;
2690
+ font-size: 18px;
2691
+ }
2692
+
2693
+ .collection-modal p {
2694
+ margin: 3px 0 0;
2695
+ color: #64748b;
2696
+ font-size: 13px;
2697
+ }
2698
+
2699
+ .search-row {
2700
+ display: grid;
2701
+ grid-template-columns: 22px minmax(0, 1fr);
2702
+ align-items: center;
2703
+ gap: 8px;
2704
+ border: 1px solid #c8d0dc;
2705
+ border-radius: 6px;
2706
+ padding: 0 9px;
2707
+ }
2708
+
2709
+ .search-row input {
2710
+ border: 0;
2711
+ min-height: 38px;
2712
+ }
2713
+
2714
+ .request-list {
2715
+ overflow: auto;
2716
+ display: grid;
2717
+ gap: 8px;
2718
+ }
2719
+
2720
+ .request-row {
2721
+ display: grid;
2722
+ grid-template-columns: minmax(0, 1fr) auto;
2723
+ gap: 8px;
2724
+ align-items: center;
2725
+ border: 1px solid #e5e9f0;
2726
+ border-radius: 8px;
2727
+ padding: 8px;
2728
+ cursor: grab;
2729
+ }
2730
+
2731
+ .request-row label {
2732
+ display: grid;
2733
+ grid-template-columns: 18px 64px minmax(0, 1fr);
2734
+ gap: 8px;
2735
+ align-items: center;
2736
+ min-width: 0;
2737
+ }
2738
+
2739
+ .request-row label small,
2740
+ .request-row label code {
2741
+ grid-column: 3;
2742
+ }
2743
+
2744
+ .request-row strong,
2745
+ .request-row small,
2746
+ .request-row code {
2747
+ overflow: hidden;
2748
+ text-overflow: ellipsis;
2749
+ white-space: nowrap;
2750
+ }
2751
+
2752
+ .request-row small {
2753
+ color: #64748b;
2754
+ }
2755
+
2756
+ .request-row code {
2757
+ color: #334155;
2758
+ font-size: 12px;
2759
+ }
2760
+
2761
+ .method {
2762
+ display: inline-grid;
2763
+ place-items: center;
2764
+ min-height: 24px;
2765
+ border-radius: 4px;
2766
+ font-size: 11px;
2767
+ font-weight: 700;
2768
+ background: #edf0f4;
2769
+ color: #334155;
2770
+ }
2771
+
2772
+ .method.POST,
2773
+ .method.PUT,
2774
+ .method.PATCH {
2775
+ background: #e8f6f0;
2776
+ color: #0f6b5f;
2777
+ }
2778
+
2779
+ .method.DELETE {
2780
+ background: #fae8ec;
2781
+ color: #9f1d35;
2782
+ }
2783
+
2784
+ .run-dock {
2785
+ background: #ffffff;
2786
+ border-top: 2px solid #0f6b5f;
2787
+ display: grid;
2788
+ grid-template-rows: auto 1fr;
2789
+ overflow: hidden;
2790
+ flex-shrink: 0;
2791
+ min-height: 22px;
2792
+ }
2793
+
2794
+ .run-dock.failed {
2795
+ border-top-color: #9f1d35;
2796
+ }
2797
+
2798
+ .run-dock.running,
2799
+ .run-dock.stopping {
2800
+ border-top-color: #234a8a;
2801
+ }
2802
+
2803
+ .run-dock.collapsed {
2804
+ height: 22px !important;
2805
+ grid-template-rows: 22px;
2806
+ }
2807
+
2808
+ .run-dock-resize {
2809
+ height: 4px;
2810
+ background: linear-gradient(180deg, transparent, #d5dbe4 50%, transparent);
2811
+ cursor: ns-resize;
2812
+ }
2813
+
2814
+ .run-dock-head {
2815
+ display: flex;
2816
+ align-items: center;
2817
+ gap: 10px;
2818
+ padding: 6px 16px;
2819
+ border-bottom: 1px solid #e5e9f0;
2820
+ font-size: 13px;
2821
+ min-height: 22px;
2822
+ }
2823
+
2824
+ .run-dock-status {
2825
+ display: inline-grid;
2826
+ place-items: center;
2827
+ width: 22px;
2828
+ height: 22px;
2829
+ border-radius: 50%;
2830
+ color: #ffffff;
2831
+ font-size: 11px;
2832
+ font-weight: 700;
2833
+ background: #64748b;
2834
+ }
2835
+
2836
+ .run-dock.passed .run-dock-status {
2837
+ background: #0f6b5f;
2838
+ }
2839
+
2840
+ .run-dock.failed .run-dock-status {
2841
+ background: #9f1d35;
2842
+ }
2843
+
2844
+ .run-dock.running .run-dock-status,
2845
+ .run-dock.stopping .run-dock-status {
2846
+ background: #234a8a;
2847
+ }
2848
+
2849
+ .run-dock-title {
2850
+ flex: 1;
2851
+ min-width: 0;
2852
+ }
2853
+
2854
+ .run-dock-title b {
2855
+ font-weight: 700;
2856
+ text-transform: capitalize;
2857
+ }
2858
+
2859
+ .run-dock-title code {
2860
+ font-family: Consolas, "SFMono-Regular", monospace;
2861
+ background: #f8fafc;
2862
+ padding: 1px 5px;
2863
+ border-radius: 3px;
2864
+ }
2865
+
2866
+ .run-dock-title small {
2867
+ color: #64748b;
2868
+ }
2869
+
2870
+ .run-dock-actions {
2871
+ display: flex;
2872
+ gap: 6px;
2873
+ flex-wrap: wrap;
2874
+ justify-content: flex-end;
2875
+ }
2876
+
2877
+ .run-dock-actions button {
2878
+ border: 1px solid #c8d0dc;
2879
+ background: #ffffff;
2880
+ border-radius: 5px;
2881
+ padding: 4px 9px;
2882
+ font: inherit;
2883
+ font-size: 12px;
2884
+ min-height: 28px;
2885
+ }
2886
+
2887
+ .run-dock-body {
2888
+ display: grid;
2889
+ grid-template-columns: minmax(230px, 0.7fr) minmax(280px, 0.85fr) minmax(420px, 1.45fr);
2890
+ overflow: hidden;
2891
+ min-height: 0;
2892
+ }
2893
+
2894
+ .run-dock-col {
2895
+ padding: 10px 16px;
2896
+ overflow: auto;
2897
+ font-size: 13px;
2898
+ min-height: 0;
2899
+ }
2900
+
2901
+ .run-dock-col + .run-dock-col {
2902
+ border-left: 1px solid #e5e9f0;
2903
+ }
2904
+
2905
+ .run-dock-col h6 {
2906
+ margin: 0 0 6px;
2907
+ font-size: 11px;
2908
+ font-weight: 700;
2909
+ text-transform: uppercase;
2910
+ letter-spacing: 0;
2911
+ color: #738095;
2912
+ }
2913
+
2914
+ .run-dock-step {
2915
+ display: grid;
2916
+ grid-template-columns: 20px 14px minmax(0, 1fr) auto;
2917
+ gap: 8px;
2918
+ align-items: center;
2919
+ padding: 5px 0;
2920
+ border-bottom: 1px dashed #edf0f4;
2921
+ }
2922
+
2923
+ .run-dock-step .idx {
2924
+ color: #64748b;
2925
+ font-family: Consolas, "SFMono-Regular", monospace;
2926
+ font-size: 12px;
2927
+ }
2928
+
2929
+ .run-dock-step .dot {
2930
+ width: 10px;
2931
+ height: 10px;
2932
+ border-radius: 50%;
2933
+ background: #cdd5e0;
2934
+ }
2935
+
2936
+ .run-dock-step.passed .dot {
2937
+ background: #0f6b5f;
2938
+ }
2939
+
2940
+ .run-dock-step.failed .dot {
2941
+ background: #9f1d35;
2942
+ }
2943
+
2944
+ .run-dock-step.running .dot {
2945
+ background: #234a8a;
2946
+ }
2947
+
2948
+ .run-dock-step.skipped .dot {
2949
+ background: #cdd5e0;
2950
+ }
2951
+
2952
+ .run-dock-step .step-name {
2953
+ border: 0;
2954
+ background: transparent;
2955
+ text-align: left;
2956
+ font: inherit;
2957
+ padding: 0;
2958
+ color: #17202c;
2959
+ cursor: pointer;
2960
+ min-height: 0;
2961
+ overflow: hidden;
2962
+ text-overflow: ellipsis;
2963
+ }
2964
+
2965
+ .run-dock-step .step-name:hover {
2966
+ text-decoration: underline;
2967
+ }
2968
+
2969
+ .run-dock-step .err {
2970
+ grid-column: 3 / -1;
2971
+ color: #9f1d35;
2972
+ font-size: 12px;
2973
+ font-family: Consolas, "SFMono-Regular", monospace;
2974
+ }
2975
+
2976
+ .run-dock-step.failed {
2977
+ background: #fae8ec;
2978
+ margin: 0 -16px;
2979
+ padding: 6px 16px;
2980
+ }
2981
+
2982
+ .run-dock-col.detail pre {
2983
+ font-family: Consolas, "SFMono-Regular", monospace;
2984
+ font-size: 12px;
2985
+ color: #2a3340;
2986
+ background: #f8fafc;
2987
+ border: 1px solid #e5e9f0;
2988
+ border-radius: 5px;
2989
+ padding: 10px 12px;
2990
+ white-space: pre-wrap;
2991
+ margin: 0;
2992
+ }
2993
+
2994
+ .api-evidence {
2995
+ min-width: 0;
2996
+ }
2997
+
2998
+ .api-evidence-summary {
2999
+ display: flex;
3000
+ gap: 7px;
3001
+ flex-wrap: wrap;
3002
+ align-items: center;
3003
+ margin-bottom: 8px;
3004
+ }
3005
+
3006
+ .api-evidence-summary span,
3007
+ .api-evidence-summary strong {
3008
+ border-radius: 999px;
3009
+ background: #edf0f4;
3010
+ color: #334155;
3011
+ padding: 3px 8px;
3012
+ font-size: 12px;
3013
+ }
3014
+
3015
+ .api-evidence-summary strong.ok {
3016
+ background: #e8f6f0;
3017
+ color: #0f6b5f;
3018
+ }
3019
+
3020
+ .api-evidence-summary strong.bad {
3021
+ background: #fae8ec;
3022
+ color: #9f1d35;
3023
+ }
3024
+
3025
+ .api-evidence-summary button {
3026
+ min-height: 28px;
3027
+ padding: 4px 9px;
3028
+ font-size: 12px;
3029
+ }
3030
+
3031
+ .api-evidence-reason {
3032
+ margin: 0 0 8px;
3033
+ color: #9f1d35;
3034
+ font-size: 13px;
3035
+ }
3036
+
3037
+ .api-evidence-tabs {
3038
+ display: flex;
3039
+ gap: 5px;
3040
+ flex-wrap: wrap;
3041
+ margin-bottom: 8px;
3042
+ }
3043
+
3044
+ .api-evidence-tabs button {
3045
+ min-height: 28px;
3046
+ padding: 4px 8px;
3047
+ font-size: 12px;
3048
+ }
3049
+
3050
+ .api-evidence-tabs button.active {
3051
+ border-color: #0f6b5f;
3052
+ color: #0f6b5f;
3053
+ background: #eef8f5;
3054
+ }
3055
+
3056
+ .evidence-pre {
3057
+ max-height: 46vh;
3058
+ overflow: auto;
3059
+ margin: 0;
3060
+ border: 1px solid #d5dbe4;
3061
+ border-radius: 8px;
3062
+ background: #0f172a;
3063
+ color: #e2e8f0;
3064
+ padding: 10px;
3065
+ font-family: Consolas, "SFMono-Regular", monospace;
3066
+ font-size: 12px;
3067
+ line-height: 1.45;
3068
+ white-space: pre-wrap;
3069
+ }
3070
+
3071
+ .evidence-table {
3072
+ display: grid;
3073
+ gap: 7px;
3074
+ }
3075
+
3076
+ .evidence-table > div {
3077
+ display: grid;
3078
+ grid-template-columns: auto minmax(120px, 1fr) minmax(120px, 1fr);
3079
+ gap: 8px;
3080
+ align-items: center;
3081
+ border: 1px solid #d5dbe4;
3082
+ border-radius: 8px;
3083
+ background: #ffffff;
3084
+ padding: 7px 9px;
3085
+ font-size: 12px;
3086
+ }
3087
+
3088
+ .evidence-table > div.passed strong {
3089
+ color: #0f6b5f;
3090
+ }
3091
+
3092
+ .evidence-table > div.failed strong {
3093
+ color: #9f1d35;
3094
+ }
3095
+
3096
+ .evidence-table > div.warn strong {
3097
+ color: #92400e;
3098
+ }
3099
+
3100
+ .evidence-table code {
3101
+ overflow-wrap: anywhere;
3102
+ }
3103
+
3104
+ @media (max-width: 1180px) {
3105
+ .workbench-shell,
3106
+ .builder-layout {
3107
+ grid-template-columns: 1fr;
3108
+ }
3109
+
3110
+ .project-explorer {
3111
+ max-height: none;
3112
+ }
3113
+
3114
+ .topbar,
3115
+ .actions,
3116
+ .environment-manager-header {
3117
+ align-items: stretch;
3118
+ flex-direction: column;
3119
+ }
3120
+
3121
+ .flow-title input,
3122
+ .flow-title .flow-id-input {
3123
+ min-width: 0;
3124
+ width: 100%;
3125
+ }
3126
+
3127
+ .environment-manager-body,
3128
+ .form-grid.two,
3129
+ .form-grid.three,
3130
+ .form-grid.four,
3131
+ .ssh-host-row,
3132
+ .assertion-row,
3133
+ .request-url-row,
3134
+ .request-summary-panel,
3135
+ .request-row,
3136
+ .request-row label {
3137
+ grid-template-columns: 1fr;
3138
+ }
3139
+
3140
+ .node-card {
3141
+ grid-template-columns: 1fr;
3142
+ }
3143
+
3144
+ .node-actions {
3145
+ justify-content: flex-end;
3146
+ }
3147
+ }