@worca/app 1.4.0 → 1.5.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -1
- package/docker/.env.example +54 -0
- package/docker/compose.clonein.yml +24 -0
- package/docker/compose.dev.yml +24 -0
- package/docker/compose.egress.yml +47 -0
- package/docker/compose.ssh.yml +17 -0
- package/docker/compose.teams.yml +25 -0
- package/docker/compose.yml +57 -0
- package/package.json +4 -1
- package/src/cli/container.mjs +227 -0
- package/src/cli/models.mjs +5 -4
- package/src/cli/schedule.mjs +23 -10
- package/src/cli/worca-cc.mjs +62 -4
- package/src/core/agent-user.mjs +92 -0
- package/src/core/artifacts.mjs +41 -9
- package/src/core/ask/clone-deps.mjs +25 -0
- package/src/core/ask/clone-proposal.mjs +79 -0
- package/src/core/ask/events.mjs +10 -0
- package/src/core/ask/mcp-stdio.mjs +4 -2
- package/src/core/ask/model-proposal.mjs +14 -3
- package/src/core/ask/prompt.mjs +27 -6
- package/src/core/ask/schedule-deps.mjs +16 -11
- package/src/core/ask/spawn.mjs +8 -3
- package/src/core/ask/store.mjs +40 -10
- package/src/core/ask/tool-deps.mjs +36 -1
- package/src/core/ask/tools.mjs +69 -8
- package/src/core/ask/turn.mjs +31 -1
- package/src/core/bridge/errors.mjs +50 -2
- package/src/core/bridge/provider-ops.mjs +20 -7
- package/src/core/bridge/providers/copilot.mjs +51 -5
- package/src/core/bridge/translate/common.mjs +144 -0
- package/src/core/bridge/translate/request.mjs +16 -73
- package/src/core/bridge/translate/responses-request.mjs +185 -0
- package/src/core/bridge/translate/responses-stream.mjs +327 -0
- package/src/core/bridge/upstream.mjs +37 -10
- package/src/core/cf-access.mjs +90 -0
- package/src/core/chat/command-router.mjs +17 -12
- package/src/core/claude-runner.mjs +26 -3
- package/src/core/clone-project.mjs +139 -0
- package/src/core/config.mjs +16 -9
- package/src/core/db.mjs +60 -5
- package/src/core/deployment.mjs +33 -0
- package/src/core/diff-comments.mjs +17 -8
- package/src/core/git-info.mjs +27 -7
- package/src/core/github-app.mjs +107 -0
- package/src/core/github-credentials.mjs +93 -0
- package/src/core/graph/executor.mjs +22 -4
- package/src/core/graph/script-runner.mjs +24 -3
- package/src/core/guardrails.mjs +1 -0
- package/src/core/identity.mjs +83 -0
- package/src/core/metrics/pr-events-workflow.yml +127 -0
- package/src/core/metrics/prs.mjs +383 -0
- package/src/core/metrics/read.mjs +39 -29
- package/src/core/metrics/record.mjs +30 -2
- package/src/core/metrics/sync.mjs +35 -4
- package/src/core/model-env.mjs +47 -7
- package/src/core/model-test.mjs +29 -5
- package/src/core/notifications.mjs +36 -14
- package/src/core/orchestrator.mjs +10 -4
- package/src/core/phases.mjs +2 -0
- package/src/core/pipeline-delete.mjs +4 -3
- package/src/core/plugin-repo.mjs +7 -3
- package/src/core/policy/gate.mjs +9 -5
- package/src/core/policy/state.mjs +2 -2
- package/src/core/policy/sync.mjs +5 -4
- package/src/core/remote-access.mjs +138 -0
- package/src/core/run-harness.mjs +71 -9
- package/src/core/scheduler.mjs +63 -33
- package/src/shared/team-metrics/timeline.mjs +330 -0
- package/ui/public/app.js +591 -14
- package/ui/public/ask-panel.mjs +65 -3
- package/ui/public/bridge-view.mjs +72 -14
- package/ui/public/index.html +42 -9
- package/ui/public/schedules-view.mjs +21 -2
- package/ui/public/session-guard.mjs +77 -0
- package/ui/public/style.css +171 -1
- package/ui/public/team-metrics-timeline.mjs +480 -0
- package/ui/public/team-metrics-view.mjs +10 -2
- package/ui/public/team-policy-view.mjs +6 -1
- package/ui/server.mjs +454 -104
package/ui/public/style.css
CHANGED
|
@@ -294,6 +294,11 @@ body{
|
|
|
294
294
|
same card, so padding-top (above Settings), gap (above the toggle) and
|
|
295
295
|
.sidebar's padding-bottom (below it) all read 10px. */
|
|
296
296
|
.side-foot{margin-top:auto;display:flex;flex-direction:column;gap:10px;padding-top:10px;}
|
|
297
|
+
/* "Signed in as" (attribution, not an account menu): one quiet line above the spend card. */
|
|
298
|
+
.side-who{padding:0 12px;font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
299
|
+
.side-who[hidden]{display:none;}
|
|
300
|
+
.side-who-name{color:var(--ink-2);font-weight:600;}
|
|
301
|
+
.sidebar.collapsed .side-who{display:none;}
|
|
297
302
|
.user{display:flex;align-items:center;gap:11px;padding:6px 8px;}
|
|
298
303
|
.user .ava{width:36px;height:36px;border-radius:50%;flex:0 0 auto;
|
|
299
304
|
background:linear-gradient(135deg,var(--ava-a),var(--ava-b));}
|
|
@@ -764,6 +769,17 @@ fieldset.source legend{font-weight:600;font-size:13px;padding:0 6px;color:var(--
|
|
|
764
769
|
color:var(--amber-ink);font-weight:700;font-size:14px;}
|
|
765
770
|
.run-ask-banner .rab-text{flex:1;font-weight:500;font-size:13px;color:var(--amber-ink);}
|
|
766
771
|
|
|
772
|
+
/* Identity-proxy sign-in expired (session-guard.mjs): one fixed bar above
|
|
773
|
+
everything, amber like the other "needs you" banners. */
|
|
774
|
+
.session-expired{position:fixed;top:12px;left:50%;transform:translateX(-50%);z-index:10000;
|
|
775
|
+
display:flex;align-items:center;gap:14px;max-width:calc(100vw - 32px);padding:10px 12px 10px 18px;
|
|
776
|
+
background:var(--amber-wash);border:1px solid var(--amber);border-radius:14px;
|
|
777
|
+
box-shadow:var(--shadow-pop);}
|
|
778
|
+
.session-expired .se-text{font-weight:500;font-size:13px;color:var(--amber-ink);}
|
|
779
|
+
.session-expired .se-reload{font:inherit;font-size:13px;font-weight:600;padding:6px 14px;border-radius:10px;
|
|
780
|
+
border:0;background:var(--ink);color:var(--on-ink);cursor:pointer;}
|
|
781
|
+
.session-expired .se-reload:focus-visible{outline:2px solid var(--amber);outline-offset:2px;}
|
|
782
|
+
|
|
767
783
|
.run-card{padding:22px 24px;}
|
|
768
784
|
.run-title{font-weight:700;font-size:16px;letter-spacing:-.01em;display:flex;align-items:center;gap:10px;}
|
|
769
785
|
.run-title .hash{font-family:var(--mono);font-size:11.5px;color:var(--ink-3);font-weight:500;}
|
|
@@ -2270,7 +2286,7 @@ button.pd-ov-card:hover{border-color:var(--ink-3);}
|
|
|
2270
2286
|
display:flex beats the UA [hidden] rule, so every hidden-toggled flex container needs this.
|
|
2271
2287
|
.tm-enable-err is a .hint, and .hint{display:block} beats the UA [hidden] rule too, so without
|
|
2272
2288
|
it the empty error line is always visible in the Enable dialog. */
|
|
2273
|
-
#tm-custom[hidden],#tm-sync[hidden],#tm-filters[hidden],.ws-home[hidden],#stats-tm-hint[hidden],
|
|
2289
|
+
#tm-custom[hidden],#tm-sync[hidden],#tm-filters[hidden],#tm-range[hidden],#tm-body[hidden],#tm-timeline[hidden],.ws-home[hidden],#stats-tm-hint[hidden],
|
|
2274
2290
|
.tm-enable-err[hidden],#wiz-metrics-pre[hidden]{display:none;}
|
|
2275
2291
|
.tm-sync-error{white-space:pre-wrap;margin:0;}
|
|
2276
2292
|
section[data-view="team-metrics"] .topbar{align-items:flex-start;}
|
|
@@ -2331,6 +2347,133 @@ section[data-view="team-metrics"] .topbar{align-items:flex-start;}
|
|
|
2331
2347
|
.tm-empty .hint,.tm-empty-foot{color:var(--ink-2);}
|
|
2332
2348
|
.linkish{background:none;border:0;padding:0;color:var(--blue-ink-strong);font:inherit;cursor:pointer;text-decoration:underline;}
|
|
2333
2349
|
@media (max-width:1080px){ .tm-empty{grid-template-columns:1fr;} .tm-group{margin-left:0;} }
|
|
2350
|
+
|
|
2351
|
+
/* Team metrics — Overview | Timeline tabs, and the Timeline (docs/team-metrics.md "Timeline").
|
|
2352
|
+
Bars are positioned in px by team-metrics-timeline.mjs; the label column is sticky so the
|
|
2353
|
+
calendar scrolls under it. Colour comes from one tone per status (--tl-c/--tl-bg/--tl-ink). */
|
|
2354
|
+
.tl{display:flex;flex-direction:column;gap:18px;}
|
|
2355
|
+
.tl-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;}
|
|
2356
|
+
.tl-tile{text-align:left;font:inherit;color:inherit;display:flex;flex-direction:column;border:1.5px solid var(--line);}
|
|
2357
|
+
button.tl-tile{cursor:pointer;}
|
|
2358
|
+
button.tl-tile:hover{border-color:var(--line-2);}
|
|
2359
|
+
button.tl-tile[aria-pressed="true"]{border-color:var(--ink);}
|
|
2360
|
+
.tl-tile .stat-value{margin-top:6px;}
|
|
2361
|
+
.tl-note{display:block;color:var(--ink-2);line-height:1.5;}
|
|
2362
|
+
.tl-note code{font-family:var(--mono);font-size:12px;background:var(--field);padding:1px 5px;border-radius:5px;}
|
|
2363
|
+
.tl-card{padding:16px 0 10px;display:flex;flex-direction:column;gap:12px;min-width:0;}
|
|
2364
|
+
.tl-controls{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;padding:0 20px;}
|
|
2365
|
+
.tl-nav,.tl-opts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
|
|
2366
|
+
.tl-step{min-width:36px;font-size:15px;line-height:1;}
|
|
2367
|
+
.tl-crumbs{display:flex;align-items:center;gap:2px;font-size:15px;font-weight:600;margin-left:6px;flex-wrap:wrap;}
|
|
2368
|
+
.tl-crumb{border:0;background:none;font:inherit;font-weight:500;color:var(--ink-3);padding:4px 6px;border-radius:8px;cursor:pointer;}
|
|
2369
|
+
.tl-crumb:hover{background:var(--field);color:var(--ink);}
|
|
2370
|
+
.tl-crumb-cur{padding:4px 6px;}
|
|
2371
|
+
.tl-sep{color:var(--ink-3);}
|
|
2372
|
+
.tl-mode button{padding:6px 14px;font-size:12.5px;}
|
|
2373
|
+
|
|
2374
|
+
.tl-card{--tl-lab:300px;}
|
|
2375
|
+
.tl-scroll{overflow-x:auto;overscroll-behavior-x:contain;}
|
|
2376
|
+
.tl-grid{position:relative;}
|
|
2377
|
+
.tl-row{display:flex;min-height:50px;border-top:1px solid var(--line);}
|
|
2378
|
+
.tl-lab{position:sticky;left:0;z-index:3;width:var(--tl-lab);flex:none;background:var(--panel);padding:7px 14px 7px 20px;
|
|
2379
|
+
display:flex;flex-direction:column;justify-content:center;min-width:0;border-right:1px solid var(--line);}
|
|
2380
|
+
.tl-track{position:relative;flex:none;overflow:hidden;z-index:1;}
|
|
2381
|
+
.tl-title{display:flex;align-items:center;gap:8px;font-weight:500;font-size:13px;min-width:0;}
|
|
2382
|
+
.tl-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
2383
|
+
.tl-meta{font-size:11px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:16px;}
|
|
2384
|
+
.tl-st{color:var(--tl-ink);}
|
|
2385
|
+
.tl-dot{width:8px;height:8px;border-radius:50%;flex:none;display:inline-block;background:var(--tl-c,var(--ink-3));}
|
|
2386
|
+
.tl-group{min-height:38px;background:var(--canvas-2);}
|
|
2387
|
+
.tl-group .tl-lab{background:var(--canvas-2);flex-direction:row;align-items:center;justify-content:flex-start;gap:9px;font-size:13px;}
|
|
2388
|
+
.tl-group .tl-lab b{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
2389
|
+
.tl-group .tl-lab small{color:var(--ink-3);font-size:12px;white-space:nowrap;flex:none;}
|
|
2390
|
+
.tl-ava{width:22px;height:22px;border-radius:50%;background:var(--field);border:1px solid var(--line-2);display:grid;place-items:center;
|
|
2391
|
+
font-size:10px;font-weight:600;color:var(--ink-2);flex:none;}
|
|
2392
|
+
.tl-proj{width:10px;height:10px;border-radius:3px;background:var(--ink-3);flex:none;}
|
|
2393
|
+
|
|
2394
|
+
.tl-hrow{border-top:0;}
|
|
2395
|
+
.tl-hrow .tl-lab{justify-content:flex-end;font-size:11px;color:var(--ink-3);padding-bottom:8px;}
|
|
2396
|
+
.tl-h-weeks{min-height:30px;} .tl-h-days{min-height:52px;} .tl-z-week .tl-h-days{min-height:58px;} .tl-h-hours{min-height:40px;}
|
|
2397
|
+
.tl-hcell{position:absolute;top:0;bottom:0;border:0;border-left:1px solid var(--line);background:none;padding:0;font:inherit;
|
|
2398
|
+
display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-size:11px;color:var(--ink-3);cursor:pointer;}
|
|
2399
|
+
.tl-hcell:hover{background:var(--field);color:var(--ink);}
|
|
2400
|
+
.tl-hcell .tl-dn{font-size:13px;color:var(--ink);font-weight:500;font-variant-numeric:tabular-nums;}
|
|
2401
|
+
.tl-hcell.is-today .tl-dn{background:var(--ink);color:var(--on-ink);border-radius:6px;padding:0 5px;}
|
|
2402
|
+
.tl-week{flex-direction:row;justify-content:flex-start;padding-left:8px;font-weight:500;color:var(--ink-2);}
|
|
2403
|
+
.tl-pips{display:flex;gap:2px;height:6px;align-items:center;}
|
|
2404
|
+
.tl-pips i{width:5px;height:5px;border-radius:1.5px;background:var(--green);transform:rotate(45deg);}
|
|
2405
|
+
.tl-pips em{font-style:normal;font-size:9px;font-weight:600;color:var(--green-ink);line-height:1;margin-left:1px;}
|
|
2406
|
+
.tl-hour{position:absolute;top:0;bottom:0;border-left:1px solid var(--line);font-size:11px;color:var(--ink-3);padding:14px 0 0 5px;font-family:var(--mono);}
|
|
2407
|
+
|
|
2408
|
+
.tl-body{position:relative;}
|
|
2409
|
+
.tl-cols{position:absolute;top:0;bottom:0;left:var(--tl-lab);pointer-events:none;z-index:0;}
|
|
2410
|
+
.tl-col{position:absolute;top:0;bottom:0;border-left:1px solid var(--line);}
|
|
2411
|
+
.tl-col.is-weekend{background:var(--canvas-2);}
|
|
2412
|
+
.tl-future{position:absolute;top:0;bottom:0;right:0;background:var(--bg);opacity:.45;}
|
|
2413
|
+
.tl-now{position:absolute;top:0;bottom:0;width:0;border-left:2px solid var(--peach);}
|
|
2414
|
+
.tl-now-tag{position:absolute;top:2px;transform:translateX(-50%);font-size:10px;font-weight:600;color:var(--on-status);background:var(--peach);
|
|
2415
|
+
padding:1px 6px;border-radius:6px;z-index:4;letter-spacing:.03em;pointer-events:none;}
|
|
2416
|
+
|
|
2417
|
+
.tl-t-green{--tl-c:var(--green);--tl-bg:var(--green-bg);--tl-ink:var(--green-ink);}
|
|
2418
|
+
.tl-t-blue{--tl-c:var(--blue);--tl-bg:var(--blue-bg);--tl-ink:var(--blue-ink);}
|
|
2419
|
+
.tl-t-red{--tl-c:var(--red);--tl-bg:var(--red-bg);--tl-ink:var(--red-ink);}
|
|
2420
|
+
.tl-t-violet{--tl-c:var(--violet);--tl-bg:var(--violet-bg);--tl-ink:var(--violet-ink);}
|
|
2421
|
+
.tl-t-slate{--tl-c:var(--slate);--tl-bg:var(--slate-bg);--tl-ink:var(--slate-ink);}
|
|
2422
|
+
.tl-hit{position:absolute;top:0;bottom:0;border:0;background:none;padding:0;cursor:pointer;min-width:14px;}
|
|
2423
|
+
.tl-hit:focus-visible{outline:2px solid var(--ink);outline-offset:-2px;border-radius:6px;}
|
|
2424
|
+
.tl-hit:hover .tl-run{box-shadow:0 0 0 2px var(--panel),0 0 0 3px var(--ink-3);}
|
|
2425
|
+
.tl-span,.tl-run{position:absolute;top:50%;height:18px;margin-top:-9px;}
|
|
2426
|
+
.tl-span{border-radius:6px;background:var(--tl-bg);}
|
|
2427
|
+
.tl-run{box-sizing:border-box;border-radius:3px;min-width:3px;font-size:10.5px;color:var(--on-status);display:flex;align-items:center;padding:0;
|
|
2428
|
+
white-space:nowrap;overflow:hidden;font-family:var(--mono);font-style:normal;background:var(--tl-c);}
|
|
2429
|
+
.tl-z-day .tl-run{padding:0 6px;border-radius:4px;}
|
|
2430
|
+
.tl-run.is-failed{background:var(--red);}
|
|
2431
|
+
.tl-run.is-stopped{background:var(--slate);}
|
|
2432
|
+
.tl-z-day .tl-span,.tl-z-day .tl-run{height:24px;margin-top:-12px;}
|
|
2433
|
+
.tl-tail{position:absolute;top:50%;height:0;border-top:2px dashed var(--ink-3);}
|
|
2434
|
+
.tl-mark{position:absolute;top:50%;width:12px;height:12px;margin:-6px 0 0 -6px;}
|
|
2435
|
+
.tl-mark.is-merged{background:var(--green-ink);transform:rotate(45deg);border-radius:2px;box-shadow:0 0 0 2px var(--panel);}
|
|
2436
|
+
.tl-mark.is-open{border:2.5px solid var(--blue-ink);border-radius:50%;background:var(--panel);}
|
|
2437
|
+
.tl-mark.is-closed::before{content:"×";position:absolute;inset:-4px 0 0;text-align:center;font-size:15px;font-weight:600;line-height:1;color:var(--slate-ink);font-style:normal;}
|
|
2438
|
+
.tl-empty{padding:36px 20px;text-align:center;border-top:1px solid var(--line);}
|
|
2439
|
+
/* A pull request with no Worca run: the PR's life is the bar (solid, in its tone), opened at a hollow dot. */
|
|
2440
|
+
.tl-pr-start{position:absolute;top:50%;left:0;width:9px;height:9px;margin-top:-4.5px;border-radius:50%;border:2px solid var(--tl-c);background:var(--panel);box-sizing:border-box;z-index:1;}
|
|
2441
|
+
.is-outside .tl-tail,.tl-lg .tl-pr-start + .tl-tail{border-top:3px solid var(--tl-c);margin-top:-1px;}
|
|
2442
|
+
.tl-lg .tl-pr-start{margin-top:-4.5px;}
|
|
2443
|
+
.tl-outside{flex:none;font-size:10px;font-weight:600;letter-spacing:.02em;color:var(--ink-3);border:1px solid var(--line-2);border-radius:999px;padding:0 6px;line-height:15px;}
|
|
2444
|
+
.tl-toggle{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-2);cursor:pointer;margin-right:6px;}
|
|
2445
|
+
.tl-toggle input{margin:0;accent-color:var(--ink);}
|
|
2446
|
+
.tl-pop-note{margin:0;color:var(--ink-2);font-size:12.5px;}
|
|
2447
|
+
|
|
2448
|
+
.tl-legend{display:flex;flex-wrap:wrap;gap:8px 18px;padding:6px 20px 4px;font-size:12px;color:var(--ink-2);border-top:1px solid var(--line);}
|
|
2449
|
+
.tl-lg{display:inline-flex;align-items:center;gap:7px;padding-top:6px;}
|
|
2450
|
+
.tl-lg-sw{position:relative;display:inline-block;width:30px;height:14px;}
|
|
2451
|
+
.tl-lg-sw .tl-span,.tl-lg-sw .tl-run{height:12px;margin-top:-6px;}
|
|
2452
|
+
.tl-foot{display:block;color:var(--ink-2);}
|
|
2453
|
+
|
|
2454
|
+
.tl-pop{position:fixed;z-index:60;width:340px;max-width:calc(100vw - 32px);background:var(--panel);border:1px solid var(--line);border-radius:20px;
|
|
2455
|
+
box-shadow:var(--shadow-sheet);padding:16px 18px;display:flex;flex-direction:column;gap:10px;}
|
|
2456
|
+
.tl-pop h3{margin:0;font-size:16px;font-weight:600;line-height:1.3;text-wrap:balance;}
|
|
2457
|
+
.tl-pop-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
|
|
2458
|
+
.tl-pop-kicker{font-size:11.5px;color:var(--ink-3);}
|
|
2459
|
+
.tl-pill{display:inline-flex;align-items:center;font-size:11.5px;font-weight:600;padding:3px 10px;border-radius:999px;background:var(--tl-bg);color:var(--tl-ink);}
|
|
2460
|
+
.tl-pop-x{border:0;background:none;cursor:pointer;color:var(--ink-3);font-size:18px;line-height:1;padding:4px;}
|
|
2461
|
+
.tl-reason{margin:0;font-size:12.5px;color:var(--red-ink);background:var(--red-bg);padding:7px 10px;border-radius:10px;}
|
|
2462
|
+
.tl-pop dl{display:grid;grid-template-columns:auto 1fr;gap:5px 14px;margin:0;font-size:12.5px;}
|
|
2463
|
+
.tl-pop dt{color:var(--ink-3);}
|
|
2464
|
+
.tl-pop dd{margin:0;text-align:right;font-variant-numeric:tabular-nums;}
|
|
2465
|
+
.tl-pop a{color:var(--blue-ink-strong);}
|
|
2466
|
+
.tl-attempts{display:flex;flex-direction:column;gap:4px;border-top:1px solid var(--line);padding-top:10px;}
|
|
2467
|
+
.tl-attempts-h{font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);font-weight:600;}
|
|
2468
|
+
.tl-att{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-2);}
|
|
2469
|
+
.tl-att-dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--green);}
|
|
2470
|
+
.tl-att-dot.is-failed{background:var(--red);} .tl-att-dot.is-stopped{background:var(--slate);}
|
|
2471
|
+
.tl-att-r{margin-left:auto;}
|
|
2472
|
+
@media (max-width:720px){
|
|
2473
|
+
.tl-card{--tl-lab:176px;}
|
|
2474
|
+
.tl-lab{padding-left:12px;}
|
|
2475
|
+
.tl-pop{left:16px !important;right:16px;width:auto;top:auto !important;bottom:16px;}
|
|
2476
|
+
}
|
|
2334
2477
|
.hd-tm.st-ok{color:var(--green-ink)} .hd-tm.st-warn{color:var(--amber-ink)} .hd-tm.st-err{color:var(--red-ink)} .hd-tm.st-muted{color:var(--ink-2)}
|
|
2335
2478
|
|
|
2336
2479
|
/* Team metrics — Projects cell (board 4) */
|
|
@@ -3076,6 +3219,9 @@ section[data-view="team-metrics"] .topbar{align-items:flex-start;}
|
|
|
3076
3219
|
.md-tab{height:22px;padding:0 10px;border:0;border-radius:6px;background:transparent;color:var(--ink-2);
|
|
3077
3220
|
font:500 11.5px var(--sans);cursor:pointer;}
|
|
3078
3221
|
.md-tab[aria-selected="true"]{background:var(--surface);color:var(--ink);box-shadow:var(--knob-shadow);}
|
|
3222
|
+
/* Add project: Folder / Clone from URL. */
|
|
3223
|
+
.proj-add-tabs{margin:0 0 12px;}
|
|
3224
|
+
.md-tab:disabled{cursor:default;opacity:.55;}
|
|
3079
3225
|
.hd-cmt-input{width:100%;min-height:72px;padding:12px 14px;border:0;background:transparent;color:var(--ink);
|
|
3080
3226
|
font:400 13px/1.5 var(--sans);resize:vertical;}
|
|
3081
3227
|
.hd-cmt-input::placeholder{color:var(--ink-2);}
|
|
@@ -3477,6 +3623,7 @@ button.hd-mem-chip:focus-visible{outline:2px solid var(--ink);outline-offset:2px
|
|
|
3477
3623
|
.rc-status-word.st-green{color:var(--green-ink);}
|
|
3478
3624
|
.rc-status-word.st-red{color:var(--red-ink);}
|
|
3479
3625
|
.rc-meta .run-time,.rc-meta .run-cost{font-weight:700;color:var(--ink);}
|
|
3626
|
+
.rc-meta .rc-by[hidden]{display:none;} /* author inline-flex beats the UA [hidden] rule */
|
|
3480
3627
|
.rc-branch{display:flex;align-items:center;gap:6px;margin-top:6px;min-width:0;
|
|
3481
3628
|
font-family:var(--mono);font-size:12px;font-weight:600;color:var(--ink-2);}
|
|
3482
3629
|
.rc-branch[hidden]{display:none;} /* author display:flex beats the UA [hidden] rule */
|
|
@@ -6457,3 +6604,26 @@ input.gv-name:focus-visible{outline:none;}
|
|
|
6457
6604
|
/* pooled-budget tile meter (board 10): warn from 80 %, over from 100 % */
|
|
6458
6605
|
.stat-meter .stat-meter-fill.warn{background:var(--amber-ink);}
|
|
6459
6606
|
.stat-meter .stat-meter-fill.over{background:var(--red-ink);}
|
|
6607
|
+
|
|
6608
|
+
/* Attribution (shared deployments only): a neutral initials circle and the detail-header
|
|
6609
|
+
person chip. Deliberately NOT a status pill and never coloured per person. */
|
|
6610
|
+
.person-ini{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
|
|
6611
|
+
width:18px;height:18px;border-radius:50%;background:var(--slate-bg);color:var(--slate-ink);
|
|
6612
|
+
border:1px solid var(--line);font:600 9px/1 var(--sans);letter-spacing:.02em;
|
|
6613
|
+
vertical-align:middle;}
|
|
6614
|
+
.rc-meta .rc-by .person-ini,.hist-by-seg .person-ini,.rc-meta .sched-by .person-ini{margin-right:5px;}
|
|
6615
|
+
.rc-meta .rc-by .person-ini:empty{display:none;}
|
|
6616
|
+
.person-chip{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;max-width:280px;
|
|
6617
|
+
padding:4px 11px 4px 5px;border-radius:999px;background:var(--panel);border:1px solid var(--line);
|
|
6618
|
+
color:var(--ink-2);font-size:13px;font-weight:500;}
|
|
6619
|
+
.person-chip .person-ini{width:22px;height:22px;font-size:10px;}
|
|
6620
|
+
.person-chip-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
6621
|
+
.rd-row1 .person-chip{margin-left:auto;}
|
|
6622
|
+
|
|
6623
|
+
.hd-row2 .person-chip{margin-left:auto;}
|
|
6624
|
+
.nav-child .child-by{margin-left:6px;}
|
|
6625
|
+
.hist-pill-label{margin-left:8px;font-size:12px;color:var(--ink-3);}
|
|
6626
|
+
.hist-pill.person .person-ini{width:16px;height:16px;font-size:8px;}
|
|
6627
|
+
|
|
6628
|
+
/* Team metrics: an actor may be a full email (attribution) — clip it to the column, full name in the tooltip. */
|
|
6629
|
+
.tm-person{display:inline-block;max-width:24ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;}
|