@bridge_gpt/mcp-server 0.2.19 → 0.2.21

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 (35) hide show
  1. package/README.md +6 -3
  2. package/build/agents.generated.js +1 -1
  3. package/build/commands.generated.js +4 -3
  4. package/build/conductor/local-merge.js +458 -95
  5. package/build/estimate-epic.js +84 -0
  6. package/build/executor/job-runner.js +151 -17
  7. package/build/executor/merge-job.js +84 -10
  8. package/build/executor/worker-finalization.js +98 -18
  9. package/build/index.js +1843 -401
  10. package/build/pipelines.generated.js +16 -20
  11. package/build/readme.generated.js +1 -1
  12. package/build/review-tickets.js +15 -5
  13. package/build/sfcc/client.js +192 -50
  14. package/build/sfcc/ocapi-write-faults.js +94 -0
  15. package/build/sfcc/permissions.js +7 -22
  16. package/build/sfcc/register.js +9 -0
  17. package/build/sfcc/write-grants.js +80 -0
  18. package/build/sfcc/write-guard.js +39 -0
  19. package/build/sfcc/write-result.js +47 -0
  20. package/build/sfcc/write-tool-common.js +85 -0
  21. package/build/sfcc/writes-custom-object-def.js +141 -0
  22. package/build/sfcc/writes-object-attribute-payloads.js +97 -0
  23. package/build/sfcc/writes-site-preference-payloads.js +59 -0
  24. package/build/sfcc/writes-site-preference.js +96 -0
  25. package/build/sfcc/writes-system-object-payloads.js +213 -0
  26. package/build/sfcc/writes-system-object.js +348 -0
  27. package/build/sfcc/writes.js +66 -0
  28. package/build/version.generated.js +1 -1
  29. package/package.json +3 -3
  30. package/pipelines/idea-to-ticket.json +7 -0
  31. package/pipelines/review-ticket.json +5 -18
  32. package/public/css/main.min.css +1583 -117
  33. package/public/css/main.min.css.map +1 -1
  34. package/public/js/main.min.js +2792 -449
  35. package/public/js/main.min.js.map +1 -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 ***!
@@ -1287,31 +1631,303 @@ select.input-error {
1287
1631
  }
1288
1632
 
1289
1633
 
1290
- /*!********************************************************************************************************!*\
1291
- !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/public-pages.css ***!
1292
- \********************************************************************************************************/
1293
- /* Public-page styling for the homepage and the legal placeholder pages.
1294
- Class-scoped only no overrides of body, :root, .hidden, or form elements. */
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. */
1295
1642
 
1296
- .public-page-header {
1643
+ .run-dashboard-container .section-header {
1297
1644
  display: flex;
1298
1645
  align-items: center;
1299
- justify-content: flex-start;
1300
- padding: 1rem 0;
1301
- margin-bottom: 1.5rem;
1302
- border-bottom: 1px solid var(--border-color);
1646
+ justify-content: space-between;
1647
+ gap: 1rem;
1648
+ margin-bottom: 1rem;
1303
1649
  }
1304
1650
 
1305
- .public-page-header a {
1306
- display: inline-flex;
1307
- align-items: center;
1308
- text-decoration: none;
1309
- color: inherit;
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;
1310
1665
  }
1311
1666
 
1312
- .public-page-logo {
1313
- height: auto;
1314
- max-width: 240px;
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.
1910
+ Class-scoped only — no overrides of body, :root, .hidden, or form elements. */
1911
+
1912
+ .public-page-header {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ justify-content: flex-start;
1916
+ padding: 1rem 0;
1917
+ margin-bottom: 1.5rem;
1918
+ border-bottom: 1px solid var(--border-color);
1919
+ }
1920
+
1921
+ .public-page-header a {
1922
+ display: inline-flex;
1923
+ align-items: center;
1924
+ text-decoration: none;
1925
+ color: inherit;
1926
+ }
1927
+
1928
+ .public-page-logo {
1929
+ height: auto;
1930
+ max-width: 240px;
1315
1931
  width: 100%;
1316
1932
  display: block;
1317
1933
  }
@@ -1709,97 +2325,332 @@ select.input-error {
1709
2325
  font-size: 0.875rem;
1710
2326
  line-height: 1.4;
1711
2327
  }
1712
- /*!*************************************************************************************************************!*\
1713
- !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/optimize_analysis.css ***!
1714
- \*************************************************************************************************************/
1715
- /* Code Analysis Styling */
1716
2328
 
1717
- .hidden {
1718
- 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;
1719
2338
  }
1720
2339
 
1721
- .analysis-section {
1722
- margin-bottom: 2rem;
1723
- padding-bottom: 1.5rem;
1724
- border-bottom: 1px solid var(--border-color);
2340
+ #project-detail-container .review-policy-intro {
2341
+ margin: 0.25rem 0 0.75rem;
1725
2342
  }
1726
2343
 
1727
- #build-section {
1728
- 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;
1729
2350
  }
1730
2351
 
1731
- .analysis-section:last-child {
1732
- 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;
1733
2361
  }
1734
2362
 
1735
- .analysis-section h4 {
1736
- margin-bottom: 1rem;
1737
- font-size: 1.1rem;
2363
+ #project-detail-container .review-policy-boundary-label {
2364
+ color: var(--text-color);
1738
2365
  font-weight: 600;
1739
2366
  }
1740
2367
 
1741
- .analysis-info-label {
1742
- margin-bottom: 10px;
1743
- font-style: italic;
1744
- color: #555;
1745
- line-height: 1.5;
1746
- }
1747
-
1748
- .reanalyze-container {
1749
- margin-top: 10px;
1750
- font-size: 0.9em;
1751
- }
1752
-
1753
- .reanalyze-container p {
1754
- margin: 0;
2368
+ #project-detail-container .review-policy-boundary-range {
2369
+ color: var(--secondary-color);
1755
2370
  }
1756
2371
 
1757
- .reanalyze-container a {
1758
- color: var(--primary-color);
1759
- text-decoration: none;
1760
- font-weight: 500;
2372
+ #project-detail-container .review-policy-toolbar {
2373
+ display: flex;
2374
+ justify-content: flex-end;
2375
+ margin-bottom: 0.75rem;
1761
2376
  }
1762
2377
 
1763
- .reanalyze-container a:hover {
1764
- text-decoration: underline;
2378
+ #project-detail-container .review-policy-buckets {
2379
+ display: flex;
2380
+ flex-direction: column;
2381
+ gap: 0.75rem;
1765
2382
  }
1766
2383
 
1767
- .code-analysis {
1768
- margin-top: 2rem;
1769
- padding: 1rem 0;
1770
- 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);
1771
2389
  }
1772
2390
 
1773
- .code-analysis h3 {
1774
- margin-bottom: 1rem;
1775
- font-size: 1.1rem;
1776
- 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);
1777
2395
  }
1778
2396
 
1779
- .code-analysis form {
2397
+ #project-detail-container .review-policy-bucket-header {
1780
2398
  display: flex;
1781
- flex-direction: column;
1782
- gap: 1rem;
1783
- margin-bottom: 1rem;
2399
+ flex-wrap: wrap;
2400
+ align-items: center;
2401
+ gap: 0.5rem;
2402
+ margin-bottom: 0.5rem;
1784
2403
  }
1785
2404
 
1786
- .code-analysis form > div {
2405
+ #project-detail-container .review-policy-bucket-heading {
1787
2406
  display: flex;
1788
2407
  flex-direction: column;
1789
- gap: 0.25rem;
2408
+ margin-right: auto;
1790
2409
  }
1791
2410
 
1792
- .code-analysis label {
1793
- font-weight: 500;
2411
+ #project-detail-container .review-policy-bucket-name {
2412
+ font-weight: 600;
1794
2413
  color: var(--text-color);
1795
2414
  }
1796
2415
 
1797
- .code-analysis select,
1798
- .code-analysis textarea {
1799
- 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;
1800
2428
  border: 1px solid var(--border-color);
1801
- border-radius: 0.25rem;
1802
- font-family: inherit;
2429
+ }
2430
+
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);
2438
+ border-color: var(--primary-color);
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;
1803
2654
  }
1804
2655
 
1805
2656
  .code-analysis select:focus,
@@ -2363,6 +3214,621 @@ textarea {
2363
3214
  justify-content: center;
2364
3215
  }
2365
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
+
2366
3832
  /*!*******************************************************************************************************!*\
2367
3833
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!./src/css/data_health.css ***!
2368
3834
  \*******************************************************************************************************/