@bridge_gpt/mcp-server 0.2.18 → 0.2.20

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 (100) hide show
  1. package/CONDUCTOR.md +75 -0
  2. package/README.md +8 -5
  3. package/build/agent-capabilities/probe-context.js +13 -3
  4. package/build/agent-capabilities/probes.js +262 -11
  5. package/build/agent-capabilities/reporter.js +1 -0
  6. package/build/agents.generated.js +1 -1
  7. package/build/backend-warnings.js +44 -0
  8. package/build/claude-settings.js +129 -0
  9. package/build/commands.generated.js +5 -3
  10. package/build/conductor/bridge-api-client.js +7 -7
  11. package/build/conductor/cli.js +65 -12
  12. package/build/conductor/deny-enforcement-preflight.js +96 -0
  13. package/build/conductor/doctor.js +183 -2
  14. package/build/conductor/epic-reconcile.js +9 -1
  15. package/build/conductor/epic-runtime.js +403 -43
  16. package/build/conductor/epic-state.js +7 -0
  17. package/build/conductor/errors.js +115 -3
  18. package/build/conductor/event-accessors.js +28 -10
  19. package/build/conductor/local-merge.js +458 -95
  20. package/build/conductor/merge-ledger.js +6 -4
  21. package/build/conductor/pr-ci-producer.js +17 -2
  22. package/build/conductor/producer-ledger.js +1 -1
  23. package/build/conductor/store.js +161 -18
  24. package/build/conductor/supervisor-merge.js +32 -5
  25. package/build/conductor/taxonomy.js +8 -0
  26. package/build/conductor/tools.js +28 -6
  27. package/build/conductor/worker-ledger-cli.js +244 -0
  28. package/build/conductor-bin.js +1884 -6917
  29. package/build/doctor.js +8 -0
  30. package/build/estimate-epic.js +84 -0
  31. package/build/executor/cli.js +229 -0
  32. package/build/executor/credentials.js +65 -0
  33. package/build/executor/deps.js +117 -0
  34. package/build/executor/env.js +79 -0
  35. package/build/executor/heartbeat.js +59 -0
  36. package/build/executor/http-client.js +131 -0
  37. package/build/executor/index.js +10 -0
  38. package/build/executor/job-errors.js +55 -0
  39. package/build/executor/job-log-registry.js +110 -0
  40. package/build/executor/job-runner.js +822 -0
  41. package/build/executor/job-types.js +60 -0
  42. package/build/executor/merge-job.js +229 -0
  43. package/build/executor/observation.js +123 -0
  44. package/build/executor/permissions.js +79 -0
  45. package/build/executor/preflight.js +144 -0
  46. package/build/executor/process.js +81 -0
  47. package/build/executor/prompt-spec.js +235 -0
  48. package/build/executor/results.js +134 -0
  49. package/build/executor/resume-pre-spawn.js +179 -0
  50. package/build/executor/runner.js +98 -0
  51. package/build/executor/terminal-mutation.js +34 -0
  52. package/build/executor/test-clock.js +109 -0
  53. package/build/executor/types.js +18 -0
  54. package/build/executor/verdict-artifact.js +53 -0
  55. package/build/executor/viewer-tabs.js +78 -0
  56. package/build/executor/watch-cli.js +113 -0
  57. package/build/executor/worker-command.js +106 -0
  58. package/build/executor/worker-finalization.js +177 -0
  59. package/build/executor/worker-log.js +92 -0
  60. package/build/executor/worktree-gc.js +134 -0
  61. package/build/executor/worktree-inspection.js +86 -0
  62. package/build/executor/worktree.js +103 -0
  63. package/build/index.js +14534 -10416
  64. package/build/mcp-invoke.js +19 -3
  65. package/build/mcp-provisioning.js +31 -25
  66. package/build/mcp-registration-doctor.js +27 -7
  67. package/build/mcp-server-invocation.js +152 -0
  68. package/build/pipelines.generated.js +16 -20
  69. package/build/readme.generated.js +1 -1
  70. package/build/sfcc/client.js +192 -50
  71. package/build/sfcc/ocapi-write-faults.js +94 -0
  72. package/build/sfcc/permissions.js +7 -22
  73. package/build/sfcc/reads-site-preference.js +52 -19
  74. package/build/sfcc/register.js +9 -0
  75. package/build/sfcc/write-grants.js +80 -0
  76. package/build/sfcc/write-guard.js +39 -0
  77. package/build/sfcc/write-result.js +47 -0
  78. package/build/sfcc/write-tool-common.js +85 -0
  79. package/build/sfcc/writes-custom-object-def.js +141 -0
  80. package/build/sfcc/writes-object-attribute-payloads.js +97 -0
  81. package/build/sfcc/writes-site-preference-payloads.js +59 -0
  82. package/build/sfcc/writes-site-preference.js +96 -0
  83. package/build/sfcc/writes-system-object-payloads.js +213 -0
  84. package/build/sfcc/writes-system-object.js +348 -0
  85. package/build/sfcc/writes.js +66 -0
  86. package/build/start-tickets-conductor.js +25 -93
  87. package/build/start-tickets-prereqs.js +152 -1
  88. package/build/start-tickets.js +96 -158
  89. package/build/version.generated.js +1 -1
  90. package/build/visual-diff-worker.js +313 -0
  91. package/build/visual-diff.js +632 -0
  92. package/build/worktree-core.js +202 -0
  93. package/package.json +8 -4
  94. package/pipelines/idea-to-ticket.json +7 -0
  95. package/pipelines/review-ticket.json +5 -18
  96. package/public/css/main.min.css +1612 -107
  97. package/public/css/main.min.css.map +1 -1
  98. package/public/js/main.min.js +10267 -1
  99. package/public/js/main.min.js.map +1 -1
  100. package/smoke-test/SMOKE-TEST.md +2 -1
@@ -171,92 +171,403 @@ textarea {
171
171
  margin-bottom: 0;
172
172
  }
173
173
 
174
- /* Projects grid */
174
+ /* ==========================================================================
175
+ BAPI-548: attention-first setup dashboard
176
+ Reuses the existing cream/coral globals.css tokens; no new palette fork.
177
+ ========================================================================== */
178
+
179
+ /* Dashboard header counters */
180
+ .setup-dashboard-title-group {
181
+ display: flex;
182
+ align-items: baseline;
183
+ gap: 0.75rem;
184
+ flex-wrap: wrap;
185
+ }
186
+
187
+ .setup-dashboard-counts {
188
+ font-size: 0.9rem;
189
+ color: var(--secondary-color);
190
+ }
191
+
192
+ .setup-dashboard-count {
193
+ color: var(--secondary-color);
194
+ }
195
+
196
+ .setup-dashboard-attention-count {
197
+ color: var(--primary-color);
198
+ font-weight: 700;
199
+ }
200
+
201
+ /* Projects list — single-column, low-density signpost list */
175
202
  .projects-grid {
176
203
  display: grid;
177
204
  grid-template-columns: 1fr;
178
- gap: 1rem;
205
+ gap: 1.25rem;
179
206
  }
180
207
 
181
208
  .project-card {
182
209
  background-color: var(--surface-color);
183
210
  border: 1px solid var(--border-color);
184
- border-radius: 0.5rem;
185
- padding: 1.5rem;
186
- transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1);
211
+ border-radius: 0.75rem;
212
+ padding: 1.25rem 1.5rem;
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 0.6rem;
187
216
  }
188
217
 
189
- .project-card:hover {
190
- transform: translateY(-2px);
191
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
218
+ /* Summary row: state dot + title + repo tag on the left, status pill on the right */
219
+ .project-card-summary {
220
+ display: flex;
221
+ justify-content: space-between;
222
+ align-items: center;
223
+ gap: 1rem;
224
+ flex-wrap: wrap;
192
225
  }
193
226
 
194
- .project-card h2 {
195
- font-size: 1.125rem;
196
- margin-bottom: 1rem;
227
+ .project-identity {
228
+ display: flex;
229
+ align-items: center;
230
+ gap: 0.6rem;
231
+ min-width: 0;
232
+ }
233
+
234
+ .project-state-dot {
235
+ width: 0.65rem;
236
+ height: 0.65rem;
237
+ border-radius: 50%;
238
+ flex-shrink: 0;
239
+ background-color: var(--secondary-color);
240
+ }
241
+
242
+ .project-state-dot--ok { background-color: var(--success-color); }
243
+ .project-state-dot--warning { background-color: var(--light-orange); }
244
+ .project-state-dot--critical { background-color: var(--primary-color); }
245
+ .project-state-dot--unknown { background-color: #cfcabc; }
246
+
247
+ .project-title {
248
+ font-size: 1.05rem;
249
+ font-weight: 700;
197
250
  color: var(--text-color);
251
+ overflow: hidden;
252
+ text-overflow: ellipsis;
253
+ white-space: nowrap;
254
+ }
255
+
256
+ .project-repo-tag {
257
+ font-size: 0.72rem;
258
+ color: var(--secondary-color);
259
+ background-color: var(--secondary-button-background);
260
+ border: 1px solid var(--border-color);
261
+ border-radius: 0.35rem;
262
+ padding: 0.1rem 0.45rem;
263
+ white-space: nowrap;
264
+ }
265
+
266
+ /* Status pill */
267
+ .project-status-pill {
268
+ font-size: 0.8rem;
269
+ font-weight: 600;
270
+ padding: 0.28rem 0.7rem;
271
+ border-radius: 999px;
272
+ white-space: nowrap;
273
+ }
274
+
275
+ .project-status-pill--ok {
276
+ color: #0f8a5f;
277
+ background-color: rgba(16, 185, 129, 0.14);
278
+ }
279
+
280
+ .project-status-pill--attention {
281
+ color: var(--dark-orange);
282
+ background-color: rgba(242, 178, 122, 0.28);
283
+ }
284
+
285
+ /* A card carrying any critical signal uses the coral (error) pill treatment. */
286
+ .project-card--critical .project-status-pill--attention {
287
+ color: var(--primary-color);
288
+ background-color: rgba(226, 98, 75, 0.14);
289
+ }
290
+
291
+ /* Muted meta line */
292
+ .project-meta-line {
293
+ font-size: 0.8rem;
294
+ color: var(--secondary-color);
198
295
  }
199
296
 
200
- .project-card p {
297
+ /* Description — clamped to two lines */
298
+ .project-description {
201
299
  font-size: 0.875rem;
202
300
  color: var(--secondary-color);
203
- margin-bottom: 1.5rem;
204
- height: 4.5rem;
301
+ line-height: 1.45;
205
302
  overflow: hidden;
206
- text-overflow: ellipsis;
207
303
  display: -webkit-box;
208
- -webkit-line-clamp: 3;
304
+ -webkit-line-clamp: 2;
305
+ line-clamp: 2;
209
306
  -webkit-box-orient: vertical;
210
- line-clamp: 3;
211
307
  }
212
308
 
213
- .project-card .project-meta {
309
+ /* Attention panels (signposts) */
310
+ .project-attention-list {
311
+ display: flex;
312
+ flex-direction: column;
313
+ gap: 0.5rem;
314
+ }
315
+
316
+ .attention-panel {
214
317
  display: flex;
215
- justify-content: space-between;
216
318
  align-items: center;
217
- font-size: 0.75rem;
319
+ gap: 0.7rem;
320
+ padding: 0.7rem 0.85rem;
321
+ border-radius: 0.55rem;
322
+ border: 1px solid transparent;
323
+ }
324
+
325
+ .attention-panel--warning {
326
+ background-color: rgba(242, 178, 122, 0.18);
327
+ border-color: rgba(242, 178, 122, 0.5);
328
+ }
329
+
330
+ .attention-panel--critical {
331
+ background-color: rgba(226, 98, 75, 0.1);
332
+ border-color: rgba(226, 98, 75, 0.35);
333
+ }
334
+
335
+ .attention-panel--unknown {
336
+ background-color: transparent;
337
+ border-style: dashed;
338
+ border-color: var(--border-color);
339
+ }
340
+
341
+ .attention-icon {
342
+ flex-shrink: 0;
343
+ width: 1.75rem;
344
+ height: 1.75rem;
345
+ border-radius: 0.4rem;
346
+ display: flex;
347
+ align-items: center;
348
+ justify-content: center;
349
+ font-size: 0.9rem;
350
+ background-color: var(--surface-color);
351
+ border: 1px solid var(--border-color);
352
+ }
353
+
354
+ .attention-content {
355
+ display: flex;
356
+ flex-direction: column;
357
+ gap: 0.1rem;
358
+ flex: 1;
359
+ min-width: 0;
360
+ }
361
+
362
+ .attention-label {
363
+ font-weight: 700;
364
+ font-size: 0.85rem;
365
+ color: var(--text-color);
366
+ }
367
+
368
+ .attention-message {
369
+ font-size: 0.78rem;
218
370
  color: var(--secondary-color);
219
- margin-bottom: 1rem;
220
371
  }
221
372
 
222
- /* Project card actions layout */
223
- .project-card-actions {
373
+ .attention-fix-link {
374
+ flex-shrink: 0;
375
+ font-size: 0.8rem;
376
+ font-weight: 600;
377
+ color: var(--primary-color);
378
+ text-decoration: none;
379
+ background-color: var(--surface-color);
380
+ border: 1px solid var(--border-color);
381
+ border-radius: 0.4rem;
382
+ padding: 0.35rem 0.7rem;
383
+ white-space: nowrap;
384
+ }
385
+
386
+ .attention-fix-link:hover {
387
+ border-color: var(--primary-color);
388
+ }
389
+
390
+ .attention-fix-link--inert {
391
+ color: var(--secondary-color);
392
+ cursor: default;
393
+ }
394
+
395
+ /* "Show all checks" disclosure */
396
+ .project-checks-details {
397
+ font-size: 0.82rem;
398
+ }
399
+
400
+ .project-checks-summary {
401
+ cursor: pointer;
402
+ color: var(--secondary-color);
403
+ font-weight: 600;
404
+ padding: 0.2rem 0;
405
+ width: fit-content;
406
+ list-style: revert;
407
+ }
408
+
409
+ .project-checks-list {
224
410
  display: flex;
225
411
  flex-direction: column;
226
- gap: 0.75rem;
412
+ gap: 0.35rem;
413
+ margin-top: 0.5rem;
414
+ padding-left: 0.5rem;
227
415
  }
228
416
 
229
- .project-card-actions-row {
417
+ .project-check-row {
230
418
  display: flex;
419
+ align-items: center;
231
420
  gap: 0.5rem;
421
+ }
422
+
423
+ .project-check-icon {
424
+ flex-shrink: 0;
425
+ width: 1.2rem;
426
+ text-align: center;
427
+ color: var(--secondary-color);
428
+ }
429
+
430
+ .project-check-row--ok .project-check-icon { color: var(--success-color); }
431
+ .project-check-row--warning .project-check-icon { color: var(--dark-orange); }
432
+ .project-check-row--critical .project-check-icon { color: var(--primary-color); }
433
+
434
+ /* Unknown / backend-dependent check rows are visually dashed & neutral. */
435
+ .project-check-row--unknown {
436
+ color: var(--secondary-color);
437
+ border-left: 2px dashed var(--border-color);
438
+ padding-left: 0.5rem;
439
+ }
440
+
441
+ .project-check-label { font-weight: 600; color: var(--text-color); }
442
+ .project-check-message { color: var(--secondary-color); }
443
+
444
+ /* Bottom launcher row + overflow */
445
+ .project-actions-footer {
446
+ display: flex;
232
447
  justify-content: space-between;
233
448
  align-items: center;
234
- width: 100%;
449
+ gap: 0.5rem;
450
+ margin-top: 0.4rem;
451
+ padding-top: 0.9rem;
452
+ border-top: 1px solid var(--border-color);
453
+ flex-wrap: wrap;
235
454
  }
236
455
 
237
- .project-card-actions-row .btn {
238
- flex: 1;
239
- text-align: center;
240
- margin: 0.5rem;
456
+ .project-launcher {
457
+ display: flex;
458
+ gap: 0.4rem;
459
+ flex-wrap: wrap;
241
460
  }
242
461
 
243
- .project-card-actions-secondary {
244
- justify-content: flex-end;
462
+ .project-launcher-link {
463
+ font-size: 0.82rem;
464
+ font-weight: 600;
465
+ color: var(--text-color);
466
+ text-decoration: none;
467
+ background-color: var(--surface-color);
468
+ border: 1px solid var(--border-color);
469
+ border-radius: 0.45rem;
470
+ padding: 0.4rem 0.8rem;
245
471
  }
246
472
 
247
- /* Delete link styling */
248
- .delete-link {
249
- color: var(--error-color);
473
+ .project-launcher-link:hover {
474
+ border-color: var(--primary-color);
475
+ color: var(--primary-color);
476
+ }
477
+
478
+ .project-overflow {
479
+ position: relative;
480
+ }
481
+
482
+ .project-overflow-summary {
483
+ cursor: pointer;
484
+ list-style: none;
485
+ display: inline-flex;
486
+ align-items: center;
487
+ justify-content: center;
488
+ width: 2.2rem;
489
+ height: 2.1rem;
490
+ border: 1px solid var(--border-color);
491
+ border-radius: 0.45rem;
492
+ color: var(--secondary-color);
493
+ font-weight: 700;
494
+ }
495
+
496
+ .project-overflow-summary::-webkit-details-marker { display: none; }
497
+
498
+ .project-overflow-menu {
499
+ position: absolute;
500
+ right: 0;
501
+ top: calc(100% + 0.35rem);
502
+ z-index: 10;
503
+ display: flex;
504
+ flex-direction: column;
505
+ min-width: 12rem;
506
+ background-color: var(--surface-color);
507
+ border: 1px solid var(--border-color);
508
+ border-radius: 0.5rem;
509
+ box-shadow: var(--box-shadow);
510
+ padding: 0.35rem;
511
+ }
512
+
513
+ .project-overflow-action {
514
+ font-size: 0.85rem;
515
+ text-align: left;
516
+ color: var(--text-color);
250
517
  text-decoration: none;
251
- font-size: 0.875rem;
252
- font-weight: 500;
518
+ background: none;
519
+ border: none;
520
+ border-radius: 0.35rem;
521
+ padding: 0.5rem 0.6rem;
253
522
  cursor: pointer;
254
- transition: color 150ms ease;
523
+ font: inherit;
255
524
  }
256
525
 
257
- .delete-link:hover {
258
- color: #dc2626;
259
- text-decoration: underline;
526
+ .project-overflow-action:hover {
527
+ background-color: var(--secondary-button-background);
528
+ }
529
+
530
+ .project-overflow-action--delete {
531
+ color: var(--error-color);
532
+ }
533
+
534
+ /* Empty & error states */
535
+ .setup-empty-state,
536
+ .setup-error-state {
537
+ text-align: center;
538
+ padding: 2.5rem 1.5rem;
539
+ border: 1px dashed var(--border-color);
540
+ border-radius: 0.75rem;
541
+ background-color: var(--background-color);
542
+ }
543
+
544
+ .setup-empty-title,
545
+ .setup-error-title {
546
+ font-weight: 700;
547
+ color: var(--text-color);
548
+ margin-bottom: 0.4rem;
549
+ }
550
+
551
+ .setup-empty-message,
552
+ .setup-error-message {
553
+ font-size: 0.875rem;
554
+ color: var(--secondary-color);
555
+ }
556
+
557
+ .setup-error-state {
558
+ border-color: rgba(239, 68, 68, 0.4);
559
+ }
560
+
561
+ .setup-error-title { color: var(--error-color); }
562
+
563
+ /* Keyboard-visible focus styles for interactive dashboard controls */
564
+ .project-launcher-link:focus-visible,
565
+ .project-overflow-summary:focus-visible,
566
+ .project-overflow-action:focus-visible,
567
+ .attention-fix-link:focus-visible,
568
+ .project-checks-summary:focus-visible {
569
+ outline: 2px solid var(--primary-color);
570
+ outline-offset: 2px;
260
571
  }
261
572
 
262
573
  /* Modal styles */
@@ -381,6 +692,39 @@ textarea {
381
692
  width: 90%;
382
693
  margin: 10% auto;
383
694
  }
695
+
696
+ /* BAPI-548: let the dashboard wrap instead of overflowing horizontally. */
697
+ .project-card-summary {
698
+ flex-direction: column;
699
+ align-items: flex-start;
700
+ gap: 0.5rem;
701
+ }
702
+
703
+ .project-status-pill {
704
+ align-self: flex-start;
705
+ }
706
+
707
+ .attention-panel {
708
+ flex-wrap: wrap;
709
+ }
710
+
711
+ .attention-fix-link {
712
+ margin-left: 2.45rem;
713
+ }
714
+
715
+ .project-actions-footer {
716
+ flex-direction: column;
717
+ align-items: stretch;
718
+ }
719
+
720
+ .project-launcher {
721
+ justify-content: flex-start;
722
+ }
723
+
724
+ .project-overflow-menu {
725
+ right: auto;
726
+ left: 0;
727
+ }
384
728
  }
385
729
  /*!********************************************************************************************************!*\
386
730
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/setup-detail.css ***!
@@ -494,6 +838,45 @@ textarea {
494
838
  line-height: 1.4;
495
839
  }
496
840
 
841
+ /* Structured server-sourced setup instructions (BAPI-515), rendered inside
842
+ .explanation-content by renderExplanationContent(). Scoped to this wrapper
843
+ only — the container above is left untouched. */
844
+ .explanation-content .setup-instructions {
845
+ display: flex;
846
+ flex-direction: column;
847
+ gap: 8px;
848
+ }
849
+
850
+ .explanation-content .setup-instructions-link {
851
+ color: var(--primary-color);
852
+ font-weight: 500;
853
+ text-decoration: underline;
854
+ overflow-wrap: anywhere;
855
+ }
856
+
857
+ .explanation-content .setup-instructions-link:hover {
858
+ color: var(--primary-dark);
859
+ }
860
+
861
+ .explanation-content .setup-instructions-link:focus-visible {
862
+ outline: 2px solid var(--primary-color);
863
+ outline-offset: 2px;
864
+ }
865
+
866
+ .explanation-content .setup-instructions-steps {
867
+ margin: 0;
868
+ padding-left: 20px;
869
+ }
870
+
871
+ .explanation-content .setup-instructions-steps li + li {
872
+ margin-top: 4px;
873
+ }
874
+
875
+ .explanation-content .setup-instructions-note {
876
+ margin: 0;
877
+ color: var(--secondary-color);
878
+ }
879
+
497
880
  /* Form error styling */
498
881
  .form-error {
499
882
  color: var(--error-color);
@@ -1248,10 +1631,282 @@ select.input-error {
1248
1631
  }
1249
1632
 
1250
1633
 
1251
- /*!********************************************************************************************************!*\
1252
- !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/public-pages.css ***!
1253
- \********************************************************************************************************/
1254
- /* Public-page styling for the homepage and the legal placeholder pages.
1634
+ /*!*********************************************************************************************************!*\
1635
+ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/run-dashboard.css ***!
1636
+ \*********************************************************************************************************/
1637
+ /* src/css/run-dashboard.css */
1638
+ /* Epic Conductor v2 run dashboard (BAPI-539, T8) — a dense, calm operations
1639
+ surface. Reuses the Warm Coral + Cream tokens from globals.css instead of
1640
+ hardcoding matching colors. Selectors are scoped under
1641
+ .run-dashboard-container so nothing here leaks onto other pages. */
1642
+
1643
+ .run-dashboard-container .section-header {
1644
+ display: flex;
1645
+ align-items: center;
1646
+ justify-content: space-between;
1647
+ gap: 1rem;
1648
+ margin-bottom: 1rem;
1649
+ }
1650
+
1651
+ .run-dashboard-container .run-dashboard-error,
1652
+ .run-dashboard-container .gate-matrix-error,
1653
+ .run-dashboard-container .active-jobs-error,
1654
+ .run-dashboard-container .needs-human-error {
1655
+ background-color: #fef2f2;
1656
+ border: 1px solid var(--error-color);
1657
+ /* var(--error-color) text on this pale background is only 3.44:1 —
1658
+ below the 4.5:1 normal-text floor. var(--primary-dark) on the same
1659
+ background is 5.48:1. */
1660
+ color: var(--primary-dark);
1661
+ border-radius: 0.25rem;
1662
+ padding: 0.5rem 0.75rem;
1663
+ margin-bottom: 0.5rem;
1664
+ font-size: 14px;
1665
+ }
1666
+
1667
+ /* -------------------------------------------------------------------- *
1668
+ * Run health summary
1669
+ * -------------------------------------------------------------------- */
1670
+
1671
+ .run-dashboard-summary {
1672
+ display: grid;
1673
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1674
+ gap: 1rem;
1675
+ margin-bottom: 1.5rem;
1676
+ }
1677
+
1678
+ .run-health-card {
1679
+ background: var(--surface-color);
1680
+ border: 1px solid var(--border-color);
1681
+ border-radius: 0.25rem;
1682
+ padding: 0.75rem 1rem;
1683
+ box-shadow: var(--box-shadow);
1684
+ }
1685
+
1686
+ .run-health-card--warning {
1687
+ border-color: var(--dark-orange);
1688
+ background: var(--secondary-button-background);
1689
+ }
1690
+
1691
+ .run-health-card--error {
1692
+ border-color: var(--error-color);
1693
+ background: #fef2f2;
1694
+ }
1695
+
1696
+ .run-health-card .card-label {
1697
+ font-size: 14px;
1698
+ color: var(--secondary-color);
1699
+ text-transform: uppercase;
1700
+ letter-spacing: 0.5px;
1701
+ margin-bottom: 4px;
1702
+ }
1703
+
1704
+ .run-health-card .card-value {
1705
+ font-size: 20px;
1706
+ font-weight: 600;
1707
+ color: var(--text-color);
1708
+ }
1709
+
1710
+ /* -------------------------------------------------------------------- *
1711
+ * Ticket x Gate matrix
1712
+ * -------------------------------------------------------------------- */
1713
+
1714
+ .gate-matrix-wrapper {
1715
+ overflow-x: auto;
1716
+ }
1717
+
1718
+ .gate-matrix-table {
1719
+ width: 100%;
1720
+ border-collapse: collapse;
1721
+ font-size: 14px;
1722
+ }
1723
+
1724
+ .gate-matrix-table th,
1725
+ .gate-matrix-table td {
1726
+ padding: 8px 12px;
1727
+ text-align: left;
1728
+ border-bottom: 1px solid var(--border-color);
1729
+ vertical-align: top;
1730
+ }
1731
+
1732
+ .gate-matrix-table th {
1733
+ font-weight: 600;
1734
+ color: var(--secondary-color);
1735
+ white-space: nowrap;
1736
+ }
1737
+
1738
+ .gate-cell {
1739
+ min-width: 96px;
1740
+ }
1741
+
1742
+ .gate-status-badge {
1743
+ display: inline-block;
1744
+ padding: 4px 8px;
1745
+ border-radius: 999px;
1746
+ font-size: 14px;
1747
+ font-weight: 600;
1748
+ text-transform: capitalize;
1749
+ color: var(--text-color);
1750
+ background: var(--light-grey);
1751
+ }
1752
+
1753
+ .gate-status-badge--passed {
1754
+ /* white on var(--success-color) is only 2.54:1. This darker shade of the
1755
+ same green is 5.34:1 against white. */
1756
+ background: #0f7a53;
1757
+ color: #ffffff;
1758
+ }
1759
+
1760
+ .gate-status-badge--in_progress,
1761
+ .gate-status-badge--running {
1762
+ background: var(--light-orange);
1763
+ color: var(--text-color);
1764
+ }
1765
+
1766
+ .gate-status-badge--needs_human {
1767
+ /* white on var(--error-color) is only 3.76:1. var(--primary-dark) is
1768
+ 6.00:1 against white and reuses an existing token. */
1769
+ background: var(--primary-dark);
1770
+ color: #ffffff;
1771
+ }
1772
+
1773
+ .gate-status-badge--failed {
1774
+ background: var(--primary-dark);
1775
+ color: #ffffff;
1776
+ }
1777
+
1778
+ .gate-status-badge--pending,
1779
+ .gate-status-badge--queued,
1780
+ .gate-status-badge--skipped {
1781
+ background: var(--light-grey);
1782
+ color: var(--secondary-color);
1783
+ }
1784
+
1785
+ .gate-observation-detail {
1786
+ margin-top: 4px;
1787
+ }
1788
+
1789
+ .gate-observation-detail summary {
1790
+ cursor: pointer;
1791
+ font-size: 14px;
1792
+ color: var(--secondary-color);
1793
+ }
1794
+
1795
+ .observation-detail-body {
1796
+ margin-top: 4px;
1797
+ padding: 8px;
1798
+ background: var(--background-color);
1799
+ border: 1px solid var(--border-color);
1800
+ border-radius: 0.25rem;
1801
+ font-size: 14px;
1802
+ white-space: pre-wrap;
1803
+ word-break: break-word;
1804
+ }
1805
+
1806
+ /* -------------------------------------------------------------------- *
1807
+ * Active jobs
1808
+ * -------------------------------------------------------------------- */
1809
+
1810
+ .active-job-row {
1811
+ display: flex;
1812
+ flex-wrap: wrap;
1813
+ align-items: center;
1814
+ gap: 12px;
1815
+ padding: 8px 12px;
1816
+ border-bottom: 1px solid var(--border-color);
1817
+ font-size: 14px;
1818
+ }
1819
+
1820
+ .active-job-row .phase-hint {
1821
+ color: var(--secondary-color);
1822
+ font-style: italic;
1823
+ }
1824
+
1825
+ .active-job-row .job-commit-count,
1826
+ .active-job-row .job-activity {
1827
+ color: var(--secondary-color);
1828
+ }
1829
+
1830
+ /* -------------------------------------------------------------------- *
1831
+ * Needs-human incident cards
1832
+ * -------------------------------------------------------------------- */
1833
+
1834
+ .needs-human-card {
1835
+ background: var(--surface-color);
1836
+ border: 1px solid var(--dark-orange);
1837
+ border-radius: 0.25rem;
1838
+ padding: 1rem;
1839
+ margin-bottom: 1rem;
1840
+ }
1841
+
1842
+ .needs-human-card h3 {
1843
+ margin-bottom: 8px;
1844
+ }
1845
+
1846
+ .needs-human-field {
1847
+ margin-bottom: 4px;
1848
+ font-size: 14px;
1849
+ }
1850
+
1851
+ .needs-human-actions {
1852
+ display: flex;
1853
+ align-items: center;
1854
+ gap: 12px;
1855
+ margin-top: 8px;
1856
+ }
1857
+
1858
+ .needs-human-secondary-action {
1859
+ color: var(--secondary-color);
1860
+ font-size: 14px;
1861
+ font-style: italic;
1862
+ }
1863
+
1864
+ /* -------------------------------------------------------------------- *
1865
+ * Monospace + empty state
1866
+ * -------------------------------------------------------------------- */
1867
+
1868
+ .run-dashboard-container .monospace {
1869
+ font-family: 'Courier New', Courier, monospace;
1870
+ word-break: break-all;
1871
+ }
1872
+
1873
+ .run-dashboard-container .empty-state {
1874
+ padding: 1.5rem;
1875
+ text-align: center;
1876
+ color: var(--secondary-color);
1877
+ font-size: 16px;
1878
+ }
1879
+
1880
+ /* -------------------------------------------------------------------- *
1881
+ * Responsive
1882
+ * -------------------------------------------------------------------- */
1883
+
1884
+ @media (max-width: 768px) {
1885
+ .run-dashboard-container .section-header {
1886
+ flex-direction: column;
1887
+ align-items: flex-start;
1888
+ gap: 0.75rem;
1889
+ }
1890
+
1891
+ .run-dashboard-summary {
1892
+ grid-template-columns: 1fr;
1893
+ }
1894
+
1895
+ .gate-matrix-table {
1896
+ font-size: 14px;
1897
+ }
1898
+
1899
+ .active-job-row {
1900
+ flex-direction: column;
1901
+ align-items: flex-start;
1902
+ gap: 4px;
1903
+ }
1904
+ }
1905
+
1906
+ /*!********************************************************************************************************!*\
1907
+ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/public-pages.css ***!
1908
+ \********************************************************************************************************/
1909
+ /* Public-page styling for the homepage and the legal placeholder pages.
1255
1910
  Class-scoped only — no overrides of body, :root, .hidden, or form elements. */
1256
1911
 
1257
1912
  .public-page-header {
@@ -1670,104 +2325,339 @@ select.input-error {
1670
2325
  font-size: 0.875rem;
1671
2326
  line-height: 1.4;
1672
2327
  }
1673
- /*!*************************************************************************************************************!*\
1674
- !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/optimize_analysis.css ***!
1675
- \*************************************************************************************************************/
1676
- /* Code Analysis Styling */
1677
2328
 
1678
- .hidden {
1679
- display: none !important;
2329
+ /* --- Difficulty-adaptive review policy overrides (BAPI-579) --- */
2330
+ /* Page-scoped, low-specificity kebab-case classes that reuse the cream/coral
2331
+ globals.css tokens (no new palette). State differences (default / override /
2332
+ invalid) are always carried by a text label, never color alone. */
2333
+ #project-detail-container .review-policy-section {
2334
+ border: 1px solid var(--border-color);
2335
+ border-radius: 0.25rem;
2336
+ padding: 0.75rem;
2337
+ margin-top: 0.5rem;
1680
2338
  }
1681
2339
 
1682
- .analysis-section {
1683
- margin-bottom: 2rem;
1684
- padding-bottom: 1.5rem;
1685
- border-bottom: 1px solid var(--border-color);
2340
+ #project-detail-container .review-policy-intro {
2341
+ margin: 0.25rem 0 0.75rem;
1686
2342
  }
1687
2343
 
1688
- #build-section {
1689
- padding-top: 2rem;
2344
+ /* Compact 1-10 boundary reference strip (display-only). */
2345
+ #project-detail-container .review-policy-boundary-strip {
2346
+ display: flex;
2347
+ flex-wrap: wrap;
2348
+ gap: 0.5rem;
2349
+ margin-bottom: 0.75rem;
1690
2350
  }
1691
2351
 
1692
- .analysis-section:last-child {
1693
- border-bottom: none;
2352
+ #project-detail-container .review-policy-boundary-item {
2353
+ display: inline-flex;
2354
+ align-items: baseline;
2355
+ gap: 0.375rem;
2356
+ padding: 0.25rem 0.5rem;
2357
+ border: 1px solid var(--border-color);
2358
+ border-radius: 999px;
2359
+ background-color: var(--secondary-button-background);
2360
+ font-size: 0.8125rem;
1694
2361
  }
1695
2362
 
1696
- .analysis-section h4 {
1697
- margin-bottom: 1rem;
1698
- font-size: 1.1rem;
2363
+ #project-detail-container .review-policy-boundary-label {
2364
+ color: var(--text-color);
1699
2365
  font-weight: 600;
1700
2366
  }
1701
2367
 
1702
- .analysis-info-label {
1703
- margin-bottom: 10px;
1704
- font-style: italic;
1705
- color: #555;
1706
- line-height: 1.5;
1707
- }
1708
-
1709
- .reanalyze-container {
1710
- margin-top: 10px;
1711
- font-size: 0.9em;
1712
- }
1713
-
1714
- .reanalyze-container p {
1715
- margin: 0;
2368
+ #project-detail-container .review-policy-boundary-range {
2369
+ color: var(--secondary-color);
1716
2370
  }
1717
2371
 
1718
- .reanalyze-container a {
1719
- color: var(--primary-color);
1720
- text-decoration: none;
1721
- font-weight: 500;
2372
+ #project-detail-container .review-policy-toolbar {
2373
+ display: flex;
2374
+ justify-content: flex-end;
2375
+ margin-bottom: 0.75rem;
1722
2376
  }
1723
2377
 
1724
- .reanalyze-container a:hover {
1725
- text-decoration: underline;
2378
+ #project-detail-container .review-policy-buckets {
2379
+ display: flex;
2380
+ flex-direction: column;
2381
+ gap: 0.75rem;
1726
2382
  }
1727
2383
 
1728
- .code-analysis {
1729
- margin-top: 2rem;
1730
- padding: 1rem 0;
1731
- border-top: 1px solid var(--border-color);
2384
+ #project-detail-container .review-policy-bucket-card {
2385
+ border: 1px solid var(--border-color);
2386
+ border-radius: 0.25rem;
2387
+ padding: 0.75rem;
2388
+ background-color: var(--surface-color);
1732
2389
  }
1733
2390
 
1734
- .code-analysis h3 {
1735
- margin-bottom: 1rem;
1736
- font-size: 1.1rem;
1737
- font-weight: 600;
2391
+ /* Invalid buckets get a coral edge AND a visible error message below the header. */
2392
+ #project-detail-container .review-policy-bucket-card--invalid {
2393
+ border-color: var(--error-color);
2394
+ box-shadow: 0 0 0 0.15rem rgba(239, 68, 68, 0.2);
1738
2395
  }
1739
2396
 
1740
- .code-analysis form {
2397
+ #project-detail-container .review-policy-bucket-header {
1741
2398
  display: flex;
1742
- flex-direction: column;
1743
- gap: 1rem;
1744
- margin-bottom: 1rem;
2399
+ flex-wrap: wrap;
2400
+ align-items: center;
2401
+ gap: 0.5rem;
2402
+ margin-bottom: 0.5rem;
1745
2403
  }
1746
2404
 
1747
- .code-analysis form > div {
2405
+ #project-detail-container .review-policy-bucket-heading {
1748
2406
  display: flex;
1749
2407
  flex-direction: column;
1750
- gap: 0.25rem;
2408
+ margin-right: auto;
1751
2409
  }
1752
2410
 
1753
- .code-analysis label {
1754
- font-weight: 500;
2411
+ #project-detail-container .review-policy-bucket-name {
2412
+ font-weight: 600;
1755
2413
  color: var(--text-color);
1756
2414
  }
1757
2415
 
1758
- .code-analysis select,
1759
- .code-analysis textarea {
1760
- padding: 0.5rem;
2416
+ #project-detail-container .review-policy-bucket-range {
2417
+ font-size: 0.8125rem;
2418
+ color: var(--secondary-color);
2419
+ }
2420
+
2421
+ /* State chip: text label always present ("Using built-in defaults" /
2422
+ "Override active"); the color is a redundant, secondary cue. */
2423
+ #project-detail-container .review-policy-state {
2424
+ padding: 0.125rem 0.5rem;
2425
+ border-radius: 999px;
2426
+ font-size: 0.75rem;
2427
+ font-weight: 600;
1761
2428
  border: 1px solid var(--border-color);
1762
- border-radius: 0.25rem;
1763
- font-family: inherit;
1764
2429
  }
1765
2430
 
1766
- .code-analysis select:focus,
1767
- .code-analysis textarea:focus {
1768
- outline: none;
2431
+ #project-detail-container .review-policy-state--default {
2432
+ color: var(--secondary-color);
2433
+ background-color: var(--secondary-button-background);
2434
+ }
2435
+
2436
+ #project-detail-container .review-policy-state--override {
2437
+ color: var(--primary-dark);
1769
2438
  border-color: var(--primary-color);
1770
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
2439
+ background-color: var(--secondary-button-background);
2440
+ }
2441
+
2442
+ #project-detail-container .review-policy-bucket-error {
2443
+ margin-top: 0;
2444
+ margin-bottom: 0.5rem;
2445
+ }
2446
+
2447
+ /* Two automation columns side-by-side; stacks on narrow viewports (see media). */
2448
+ #project-detail-container .review-policy-groups {
2449
+ display: flex;
2450
+ flex-wrap: wrap;
2451
+ gap: 0.75rem;
2452
+ }
2453
+
2454
+ #project-detail-container .review-policy-group {
2455
+ flex: 1 1 220px;
2456
+ min-width: 0;
2457
+ border: 1px solid var(--border-color);
2458
+ border-radius: 0.25rem;
2459
+ padding: 0.5rem;
2460
+ background-color: var(--background-color);
2461
+ }
2462
+
2463
+ #project-detail-container .review-policy-group-title {
2464
+ font-weight: 600;
2465
+ font-size: 0.875rem;
2466
+ margin-bottom: 0.5rem;
2467
+ color: var(--text-color);
2468
+ }
2469
+
2470
+ #project-detail-container .review-policy-rounds {
2471
+ display: flex;
2472
+ flex-direction: column;
2473
+ gap: 0.5rem;
2474
+ margin-bottom: 0.5rem;
2475
+ }
2476
+
2477
+ #project-detail-container .review-policy-round {
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: 0.5rem;
2481
+ }
2482
+
2483
+ #project-detail-container .review-policy-round-label {
2484
+ display: flex;
2485
+ align-items: center;
2486
+ gap: 0.375rem;
2487
+ flex: 1 1 auto;
2488
+ min-width: 0;
2489
+ }
2490
+
2491
+ #project-detail-container .review-policy-round-label-text {
2492
+ font-size: 0.8125rem;
2493
+ color: var(--secondary-color);
2494
+ white-space: nowrap;
2495
+ }
2496
+
2497
+ #project-detail-container .review-policy-tier-select {
2498
+ flex: 1 1 auto;
2499
+ min-width: 0;
2500
+ padding: 0.25rem 0.375rem;
2501
+ border: 1px solid var(--border-color);
2502
+ border-radius: 0.25rem;
2503
+ background-color: var(--surface-color);
2504
+ color: var(--text-color);
2505
+ font-size: 0.875rem;
2506
+ }
2507
+
2508
+ #project-detail-container .review-policy-empty {
2509
+ margin: 0 0 0.5rem;
2510
+ font-size: 0.8125rem;
2511
+ font-style: italic;
2512
+ color: var(--secondary-color);
2513
+ }
2514
+
2515
+ /* Buttons: neutral by default; the two reset actions read as low-emphasis. */
2516
+ #project-detail-container .review-policy-add-round,
2517
+ #project-detail-container .review-policy-remove-round,
2518
+ #project-detail-container .review-policy-reset-bucket,
2519
+ #project-detail-container .review-policy-reset-all {
2520
+ padding: 0.25rem 0.625rem;
2521
+ border: 1px solid var(--border-color);
2522
+ border-radius: 0.25rem;
2523
+ background-color: var(--secondary-button-background);
2524
+ color: var(--text-color);
2525
+ font-size: 0.8125rem;
2526
+ cursor: pointer;
2527
+ }
2528
+
2529
+ #project-detail-container .review-policy-add-round:hover:not(:disabled),
2530
+ #project-detail-container .review-policy-remove-round:hover:not(:disabled),
2531
+ #project-detail-container .review-policy-reset-bucket:hover,
2532
+ #project-detail-container .review-policy-reset-all:hover {
2533
+ border-color: var(--primary-color);
2534
+ color: var(--primary-dark);
2535
+ }
2536
+
2537
+ #project-detail-container .review-policy-add-round:disabled,
2538
+ #project-detail-container .review-policy-remove-round:disabled {
2539
+ opacity: 0.5;
2540
+ cursor: not-allowed;
2541
+ }
2542
+
2543
+ /* Keep a clearly-visible keyboard focus ring on every interactive control. */
2544
+ #project-detail-container .review-policy-tier-select:focus-visible,
2545
+ #project-detail-container .review-policy-add-round:focus-visible,
2546
+ #project-detail-container .review-policy-remove-round:focus-visible,
2547
+ #project-detail-container .review-policy-reset-bucket:focus-visible,
2548
+ #project-detail-container .review-policy-reset-all:focus-visible {
2549
+ outline: 2px solid var(--primary-color);
2550
+ outline-offset: 1px;
2551
+ }
2552
+
2553
+ /* Stack the clarify/critique groups on narrow viewports. */
2554
+ @media (max-width: 768px) {
2555
+ #project-detail-container .review-policy-groups {
2556
+ flex-direction: column;
2557
+ }
2558
+
2559
+ #project-detail-container .review-policy-group {
2560
+ flex-basis: auto;
2561
+ }
2562
+ }
2563
+ /*!*************************************************************************************************************!*\
2564
+ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/optimize_analysis.css ***!
2565
+ \*************************************************************************************************************/
2566
+ /* Code Analysis Styling */
2567
+
2568
+ .hidden {
2569
+ display: none !important;
2570
+ }
2571
+
2572
+ .analysis-section {
2573
+ margin-bottom: 2rem;
2574
+ padding-bottom: 1.5rem;
2575
+ border-bottom: 1px solid var(--border-color);
2576
+ }
2577
+
2578
+ #build-section {
2579
+ padding-top: 2rem;
2580
+ }
2581
+
2582
+ .analysis-section:last-child {
2583
+ border-bottom: none;
2584
+ }
2585
+
2586
+ .analysis-section h4 {
2587
+ margin-bottom: 1rem;
2588
+ font-size: 1.1rem;
2589
+ font-weight: 600;
2590
+ }
2591
+
2592
+ .analysis-info-label {
2593
+ margin-bottom: 10px;
2594
+ font-style: italic;
2595
+ color: #555;
2596
+ line-height: 1.5;
2597
+ }
2598
+
2599
+ .reanalyze-container {
2600
+ margin-top: 10px;
2601
+ font-size: 0.9em;
2602
+ }
2603
+
2604
+ .reanalyze-container p {
2605
+ margin: 0;
2606
+ }
2607
+
2608
+ .reanalyze-container a {
2609
+ color: var(--primary-color);
2610
+ text-decoration: none;
2611
+ font-weight: 500;
2612
+ }
2613
+
2614
+ .reanalyze-container a:hover {
2615
+ text-decoration: underline;
2616
+ }
2617
+
2618
+ .code-analysis {
2619
+ margin-top: 2rem;
2620
+ padding: 1rem 0;
2621
+ border-top: 1px solid var(--border-color);
2622
+ }
2623
+
2624
+ .code-analysis h3 {
2625
+ margin-bottom: 1rem;
2626
+ font-size: 1.1rem;
2627
+ font-weight: 600;
2628
+ }
2629
+
2630
+ .code-analysis form {
2631
+ display: flex;
2632
+ flex-direction: column;
2633
+ gap: 1rem;
2634
+ margin-bottom: 1rem;
2635
+ }
2636
+
2637
+ .code-analysis form > div {
2638
+ display: flex;
2639
+ flex-direction: column;
2640
+ gap: 0.25rem;
2641
+ }
2642
+
2643
+ .code-analysis label {
2644
+ font-weight: 500;
2645
+ color: var(--text-color);
2646
+ }
2647
+
2648
+ .code-analysis select,
2649
+ .code-analysis textarea {
2650
+ padding: 0.5rem;
2651
+ border: 1px solid var(--border-color);
2652
+ border-radius: 0.25rem;
2653
+ font-family: inherit;
2654
+ }
2655
+
2656
+ .code-analysis select:focus,
2657
+ .code-analysis textarea:focus {
2658
+ outline: none;
2659
+ border-color: var(--primary-color);
2660
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
1771
2661
  }
1772
2662
 
1773
2663
  .status-message {
@@ -2324,6 +3214,621 @@ textarea {
2324
3214
  justify-content: center;
2325
3215
  }
2326
3216
 
3217
+ /*!*******************************************************************************************************!*\
3218
+ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/get-started.css ***!
3219
+ \*******************************************************************************************************/
3220
+ /* ============================================================
3221
+ Get-Started onboarding page styles
3222
+ All rules scoped under #get-started-container
3223
+ ============================================================ */
3224
+
3225
+ #get-started-container .get-started-intro {
3226
+ color: var(--text-muted, #666);
3227
+ max-width: 720px;
3228
+ margin-bottom: 1.5rem;
3229
+ line-height: 1.6;
3230
+ }
3231
+
3232
+ /* ---- Section cards ---- */
3233
+ #get-started-container .get-started-section {
3234
+ background: var(--card-bg, #fff);
3235
+ border: 1px solid var(--border-color, #e0e0e0);
3236
+ border-radius: 8px;
3237
+ padding: 1.5rem;
3238
+ margin-bottom: 1.5rem;
3239
+ }
3240
+
3241
+ #get-started-container .get-started-section h2 {
3242
+ margin-top: 0;
3243
+ font-size: 1.15rem;
3244
+ margin-bottom: 0.75rem;
3245
+ }
3246
+
3247
+ /* ---- Install-key generation panel ---- */
3248
+ .install-key-panel {
3249
+ border: 1px solid var(--border-color, #e0e0e0);
3250
+ background: var(--code-bg, #f8f9fa);
3251
+ border-radius: 8px;
3252
+ padding: 1rem 1.25rem;
3253
+ margin: 0.75rem 0 1.25rem;
3254
+ }
3255
+
3256
+ .install-key-header {
3257
+ display: flex;
3258
+ align-items: flex-start;
3259
+ justify-content: space-between;
3260
+ gap: 1rem;
3261
+ flex-wrap: wrap;
3262
+ }
3263
+
3264
+ .install-key-header h3 {
3265
+ margin: 0 0 0.25rem;
3266
+ font-size: 1rem;
3267
+ }
3268
+
3269
+ .install-key-header p {
3270
+ margin: 0;
3271
+ font-size: 0.88rem;
3272
+ color: var(--text-muted, #666);
3273
+ max-width: 48ch;
3274
+ }
3275
+
3276
+ .install-key-actions {
3277
+ display: flex;
3278
+ align-items: center;
3279
+ gap: 0.6rem;
3280
+ flex-shrink: 0;
3281
+ }
3282
+
3283
+ .install-key-status {
3284
+ font-size: 0.82rem;
3285
+ color: var(--success-color, #28a745);
3286
+ }
3287
+
3288
+ .install-key-error {
3289
+ margin: 0.75rem 0 0;
3290
+ font-size: 0.85rem;
3291
+ color: var(--danger-color, #dc3545);
3292
+ }
3293
+
3294
+ .install-key-error.hidden {
3295
+ display: none;
3296
+ }
3297
+
3298
+ .install-key-result {
3299
+ margin-top: 1rem;
3300
+ }
3301
+
3302
+ .install-key-result.hidden {
3303
+ display: none;
3304
+ }
3305
+
3306
+ /* Mirror the Security page warning treatment */
3307
+ .install-key-panel .key-warning {
3308
+ color: #856404;
3309
+ background: #fff3cd;
3310
+ border: 1px solid #ffc107;
3311
+ border-radius: 4px;
3312
+ padding: 0.75rem;
3313
+ margin-bottom: 0.75rem;
3314
+ font-weight: 600;
3315
+ font-size: 0.88rem;
3316
+ }
3317
+
3318
+ .install-key-panel .key-display {
3319
+ display: flex;
3320
+ align-items: center;
3321
+ gap: 0.5rem;
3322
+ flex-wrap: wrap;
3323
+ }
3324
+
3325
+ .install-key-panel .key-display input {
3326
+ flex: 1;
3327
+ min-width: 200px;
3328
+ padding: 0.5rem 0.75rem;
3329
+ border: 1px solid var(--border-color, #dee2e6);
3330
+ border-radius: 4px;
3331
+ font-family: monospace;
3332
+ font-size: 0.85rem;
3333
+ background: #fff;
3334
+ }
3335
+
3336
+ /* Snippet placeholder once the minted key has been injected */
3337
+ .bapi-api-key-slot-filled {
3338
+ background: #d4edda;
3339
+ color: #155724;
3340
+ font-style: normal;
3341
+ }
3342
+
3343
+ /* ---- Snippet tabs ---- */
3344
+ #editor-tabs {
3345
+ display: flex;
3346
+ flex-wrap: wrap;
3347
+ gap: 0.5rem;
3348
+ margin-bottom: 1rem;
3349
+ border-bottom: 2px solid var(--border-color, #e0e0e0);
3350
+ padding-bottom: 0.25rem;
3351
+ }
3352
+
3353
+ .snippet-tab-btn {
3354
+ background: none;
3355
+ border: none;
3356
+ padding: 0.4rem 0.8rem;
3357
+ cursor: pointer;
3358
+ font-size: 0.9rem;
3359
+ color: var(--text-muted, #666);
3360
+ border-radius: 4px 4px 0 0;
3361
+ border-bottom: 3px solid transparent;
3362
+ transition: color 0.15s, border-color 0.15s;
3363
+ }
3364
+
3365
+ .snippet-tab-btn:hover {
3366
+ color: var(--primary-color, #007bff);
3367
+ }
3368
+
3369
+ .snippet-tab-btn.active,
3370
+ .snippet-tab-btn[aria-selected="true"] {
3371
+ color: var(--primary-color, #007bff);
3372
+ border-bottom-color: var(--primary-color, #007bff);
3373
+ font-weight: 600;
3374
+ }
3375
+
3376
+ .snippet-tab-btn:focus-visible {
3377
+ outline: 2px solid var(--primary-color, #007bff);
3378
+ outline-offset: 2px;
3379
+ }
3380
+
3381
+ /* ---- Code panels ---- */
3382
+ .snippet-panel {
3383
+ margin-bottom: 0.5rem;
3384
+ }
3385
+
3386
+ .snippet-panel.hidden {
3387
+ display: none;
3388
+ }
3389
+
3390
+ .snippet-meta {
3391
+ font-size: 0.78rem;
3392
+ color: var(--text-muted, #888);
3393
+ margin-bottom: 0.4rem;
3394
+ font-family: monospace;
3395
+ }
3396
+
3397
+ .snippet-notes {
3398
+ font-size: 0.85rem;
3399
+ color: var(--text-muted, #666);
3400
+ margin-bottom: 0.5rem;
3401
+ font-style: italic;
3402
+ }
3403
+
3404
+ .snippet-panel pre {
3405
+ background: var(--code-bg, #f5f5f5);
3406
+ border: 1px solid var(--border-color, #ddd);
3407
+ border-radius: 6px;
3408
+ padding: 1rem;
3409
+ overflow-x: auto;
3410
+ margin-bottom: 0.5rem;
3411
+ max-width: 100%;
3412
+ }
3413
+
3414
+ .snippet-panel code {
3415
+ font-family: 'Courier New', Courier, monospace;
3416
+ font-size: 0.82rem;
3417
+ line-height: 1.5;
3418
+ white-space: pre;
3419
+ word-break: normal;
3420
+ overflow-wrap: normal;
3421
+ }
3422
+
3423
+ /* API-key placeholder slot */
3424
+ .bapi-api-key-slot {
3425
+ background: #fff3cd;
3426
+ color: #856404;
3427
+ border-radius: 3px;
3428
+ padding: 0 2px;
3429
+ font-style: italic;
3430
+ font-weight: 600;
3431
+ }
3432
+
3433
+ /* ---- Copy row ---- */
3434
+ .snippet-copy-row {
3435
+ display: flex;
3436
+ align-items: center;
3437
+ gap: 0.5rem;
3438
+ margin-top: 0.25rem;
3439
+ }
3440
+
3441
+ .copy-status {
3442
+ font-size: 0.82rem;
3443
+ color: var(--success-color, #28a745);
3444
+ min-width: 60px;
3445
+ }
3446
+
3447
+ /* ---- /install-bridge hand-off ---- */
3448
+ .install-bridge-notice {
3449
+ background: #fff8e1;
3450
+ border-left: 4px solid #f59e0b;
3451
+ padding: 0.75rem 1rem;
3452
+ border-radius: 4px;
3453
+ margin-bottom: 1rem;
3454
+ font-size: 0.9rem;
3455
+ line-height: 1.5;
3456
+ }
3457
+
3458
+ .handoff-copy-row {
3459
+ display: flex;
3460
+ align-items: center;
3461
+ gap: 0.75rem;
3462
+ flex-wrap: wrap;
3463
+ }
3464
+
3465
+ .handoff-command {
3466
+ background: var(--code-bg, #f5f5f5);
3467
+ border: 1px solid var(--border-color, #ddd);
3468
+ border-radius: 4px;
3469
+ padding: 0.3rem 0.6rem;
3470
+ font-size: 0.95rem;
3471
+ font-family: monospace;
3472
+ }
3473
+
3474
+ /* ---- Config-status readout ---- */
3475
+ .status-summary {
3476
+ display: flex;
3477
+ align-items: center;
3478
+ gap: 0.5rem;
3479
+ margin-bottom: 1rem;
3480
+ flex-wrap: wrap;
3481
+ }
3482
+
3483
+ .status-total {
3484
+ font-size: 0.85rem;
3485
+ color: var(--text-muted, #666);
3486
+ }
3487
+
3488
+ .status-chip {
3489
+ display: inline-block;
3490
+ padding: 0.2rem 0.6rem;
3491
+ border-radius: 12px;
3492
+ font-size: 0.8rem;
3493
+ font-weight: 600;
3494
+ letter-spacing: 0.02em;
3495
+ }
3496
+
3497
+ .status-set {
3498
+ background: #d4edda;
3499
+ color: #155724;
3500
+ }
3501
+
3502
+ .status-unset {
3503
+ background: #f8d7da;
3504
+ color: #721c24;
3505
+ }
3506
+
3507
+ .status-group {
3508
+ margin-bottom: 1rem;
3509
+ }
3510
+
3511
+ .status-group-title {
3512
+ font-size: 0.9rem;
3513
+ font-weight: 600;
3514
+ color: var(--text-muted, #555);
3515
+ margin: 0 0 0.4rem;
3516
+ text-transform: uppercase;
3517
+ letter-spacing: 0.05em;
3518
+ }
3519
+
3520
+ .status-field-row {
3521
+ display: flex;
3522
+ align-items: baseline;
3523
+ gap: 0.6rem;
3524
+ padding: 0.25rem 0;
3525
+ border-bottom: 1px solid var(--border-color, #eee);
3526
+ flex-wrap: wrap;
3527
+ }
3528
+
3529
+ .status-field-row:last-child {
3530
+ border-bottom: none;
3531
+ }
3532
+
3533
+ .status-field-name {
3534
+ font-size: 0.88rem;
3535
+ font-family: monospace;
3536
+ }
3537
+
3538
+ .status-field-value {
3539
+ font-size: 0.8rem;
3540
+ color: var(--text-muted, #888);
3541
+ font-family: monospace;
3542
+ word-break: break-all;
3543
+ }
3544
+
3545
+ .status-empty {
3546
+ color: var(--text-muted, #888);
3547
+ font-style: italic;
3548
+ font-size: 0.9rem;
3549
+ }
3550
+
3551
+ /* ---- Integrations checklist (BAPI-516) ---- */
3552
+ /* Collapse the container entirely when the checklist renders nothing so the
3553
+ absent-safe / fail-open cases leave no visual gap. */
3554
+ #get-started-container .install-integrations:empty {
3555
+ display: none;
3556
+ }
3557
+
3558
+ .install-integrations:not(:empty) {
3559
+ margin: 0.75rem 0 1rem;
3560
+ padding-top: 0.75rem;
3561
+ border-top: 1px solid var(--border-color, #eee);
3562
+ }
3563
+
3564
+ .install-integrations-title {
3565
+ font-size: 1rem;
3566
+ font-weight: 600;
3567
+ margin: 0 0 0.35rem;
3568
+ }
3569
+
3570
+ .install-integrations-note {
3571
+ color: var(--text-muted, #666);
3572
+ font-size: 0.8rem;
3573
+ line-height: 1.5;
3574
+ margin: 0 0 0.6rem;
3575
+ }
3576
+
3577
+ .install-integrations-list {
3578
+ display: flex;
3579
+ flex-direction: column;
3580
+ gap: 0.35rem;
3581
+ }
3582
+
3583
+ .install-integration-row {
3584
+ flex-wrap: wrap;
3585
+ }
3586
+
3587
+ /* Integration labels are human-readable names, not field keys — override the
3588
+ monospace treatment inherited from .status-field-name. */
3589
+ .install-integration-label {
3590
+ font-family: inherit;
3591
+ font-size: 1rem;
3592
+ font-weight: 600;
3593
+ }
3594
+
3595
+ .install-integration-required {
3596
+ font-size: 0.875rem;
3597
+ line-height: 1.5;
3598
+ overflow-wrap: anywhere;
3599
+ }
3600
+
3601
+ .install-integration-link {
3602
+ color: var(--primary-color, #0066cc);
3603
+ font-size: 0.875rem;
3604
+ text-decoration: underline;
3605
+ }
3606
+
3607
+ .install-integration-link:focus-visible {
3608
+ outline: 2px solid var(--primary-color, #0066cc);
3609
+ outline-offset: 2px;
3610
+ }
3611
+
3612
+ /* ---- Skeleton loading ---- */
3613
+ .get-started-state {
3614
+ padding: 1rem 0;
3615
+ }
3616
+
3617
+ .get-started-state.hidden {
3618
+ display: none;
3619
+ }
3620
+
3621
+ .skeleton {
3622
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
3623
+ background-size: 200% 100%;
3624
+ animation: skeleton-shimmer 1.4s infinite;
3625
+ border-radius: 6px;
3626
+ margin-bottom: 0.75rem;
3627
+ }
3628
+
3629
+ @keyframes skeleton-shimmer {
3630
+ 0% { background-position: 200% 0; }
3631
+ 100% { background-position: -200% 0; }
3632
+ }
3633
+
3634
+ .skeleton-tabs {
3635
+ height: 36px;
3636
+ width: 70%;
3637
+ }
3638
+
3639
+ .skeleton-code {
3640
+ height: 160px;
3641
+ width: 100%;
3642
+ }
3643
+
3644
+ .skeleton-status {
3645
+ height: 80px;
3646
+ width: 100%;
3647
+ }
3648
+
3649
+ /* ---- Inline error ---- */
3650
+ .get-started-error-msg {
3651
+ color: var(--danger-color, #dc3545);
3652
+ margin-bottom: 0.75rem;
3653
+ }
3654
+
3655
+ /* ---- Footer link ---- */
3656
+ .get-started-footer {
3657
+ margin-top: 1rem;
3658
+ text-align: center;
3659
+ }
3660
+
3661
+ /* ---- Responsive ---- */
3662
+ @media (max-width: 600px) {
3663
+ .snippet-tab-btn {
3664
+ padding: 0.35rem 0.55rem;
3665
+ font-size: 0.82rem;
3666
+ }
3667
+
3668
+ .handoff-copy-row {
3669
+ flex-direction: column;
3670
+ align-items: flex-start;
3671
+ }
3672
+
3673
+ .install-key-header {
3674
+ flex-direction: column;
3675
+ }
3676
+
3677
+ .install-key-actions {
3678
+ width: 100%;
3679
+ }
3680
+
3681
+ .install-key-actions .btn {
3682
+ flex: 1;
3683
+ }
3684
+
3685
+ .install-key-panel .key-display {
3686
+ flex-direction: column;
3687
+ align-items: stretch;
3688
+ }
3689
+
3690
+ .install-key-panel .key-display input,
3691
+ .install-key-panel .key-display .btn {
3692
+ width: 100%;
3693
+ }
3694
+
3695
+ .status-field-row {
3696
+ flex-direction: column;
3697
+ gap: 0.2rem;
3698
+ }
3699
+
3700
+ /* Collapse checklist rows into a readable single-column stack at narrow
3701
+ widths so long required-for text never forces horizontal overflow. */
3702
+ .install-integration-row {
3703
+ align-items: flex-start;
3704
+ }
3705
+
3706
+ .install-integration-required {
3707
+ overflow-wrap: anywhere;
3708
+ }
3709
+
3710
+ .github-connect-actions {
3711
+ flex-direction: column;
3712
+ align-items: stretch;
3713
+ }
3714
+
3715
+ .github-connect-actions .btn {
3716
+ width: 100%;
3717
+ }
3718
+ }
3719
+
3720
+ /* ============================================================
3721
+ GitHub App connect flow (BAPI-506)
3722
+ ============================================================ */
3723
+
3724
+ #get-started-container .github-connect-section {
3725
+ /* Inherits .get-started-section card rhythm; nothing extra needed here. */
3726
+ }
3727
+
3728
+ .github-connect-card {
3729
+ border: 1px solid var(--border-color, #e0e0e0);
3730
+ background: var(--card-bg, #fff);
3731
+ border-radius: 8px;
3732
+ padding: 1rem 1.25rem;
3733
+ margin-top: 0.75rem;
3734
+ }
3735
+
3736
+ .github-connect-card > p {
3737
+ color: var(--text-muted, #666);
3738
+ line-height: 1.6;
3739
+ margin-top: 0;
3740
+ }
3741
+
3742
+ .github-connect-actions {
3743
+ display: flex;
3744
+ align-items: center;
3745
+ flex-wrap: wrap;
3746
+ gap: 0.5rem 0.75rem;
3747
+ margin: 0.75rem 0;
3748
+ }
3749
+
3750
+ #github-connect-status {
3751
+ color: var(--text-muted, #666);
3752
+ font-size: 0.9rem;
3753
+ }
3754
+
3755
+ .github-connect-result {
3756
+ border: 1px solid var(--border-color, #e0e0e0);
3757
+ border-radius: 6px;
3758
+ padding: 0.75rem 1rem;
3759
+ margin: 0.75rem 0;
3760
+ }
3761
+
3762
+ .github-connect-result-title {
3763
+ font-weight: 600;
3764
+ margin: 0 0 0.25rem;
3765
+ }
3766
+
3767
+ .github-connect-result--success {
3768
+ border-color: var(--success-color, #2e7d32);
3769
+ background: var(--success-bg, #edf7ee);
3770
+ }
3771
+
3772
+ .github-connect-result--warning {
3773
+ border-color: var(--warning-color, #b26a00);
3774
+ background: var(--warning-bg, #fff6e5);
3775
+ }
3776
+
3777
+ .github-connect-result--error {
3778
+ border-color: var(--error-color, #c62828);
3779
+ background: var(--error-bg, #fdecea);
3780
+ }
3781
+
3782
+ /* ---- Ambiguous-install repository picker ---- */
3783
+ .github-repo-picker-panel {
3784
+ border: 1px solid var(--border-color, #e0e0e0);
3785
+ background: var(--code-bg, #f8f9fa);
3786
+ border-radius: 6px;
3787
+ padding: 0.75rem 1rem;
3788
+ margin: 0.75rem 0;
3789
+ }
3790
+
3791
+ .github-repo-picker-list {
3792
+ display: flex;
3793
+ flex-direction: column;
3794
+ gap: 0.4rem;
3795
+ margin-top: 0.5rem;
3796
+ }
3797
+
3798
+ .github-repo-picker-option {
3799
+ display: flex;
3800
+ flex-direction: column;
3801
+ align-items: flex-start;
3802
+ gap: 0.15rem;
3803
+ text-align: left;
3804
+ width: 100%;
3805
+ overflow-wrap: anywhere;
3806
+ word-break: break-word;
3807
+ }
3808
+
3809
+ .github-repo-picker-option:focus-visible {
3810
+ outline: 2px solid var(--focus-ring, #1a73e8);
3811
+ outline-offset: 2px;
3812
+ }
3813
+
3814
+ .github-repo-picker-option-name {
3815
+ font-weight: 600;
3816
+ overflow-wrap: anywhere;
3817
+ }
3818
+
3819
+ .github-repo-picker-option-owner {
3820
+ color: var(--text-muted, #666);
3821
+ font-size: 0.85rem;
3822
+ }
3823
+
3824
+ /* ---- Manual fallback helper text ---- */
3825
+ .github-manual-fallback {
3826
+ color: var(--text-muted, #666);
3827
+ font-size: 0.9rem;
3828
+ margin-top: 0.75rem;
3829
+ margin-bottom: 0;
3830
+ }
3831
+
2327
3832
  /*!*******************************************************************************************************!*\
2328
3833
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/data_health.css ***!
2329
3834
  \*******************************************************************************************************/