gabriel / musehub public
_proposal_detail.scss
1,494 lines 40.8 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 // _proposal_detail.scss — Proposal detail page
2 // Design language: MCP/Domain — full-bleed hero with gradient glow,
3 // flat sections with border-only dividers, zero bubble cards.
4 // Prefixes: prd-* (hero/layout) + proposal-* (sections/sidebar content)
5
6 // ── State tokens ─────────────────────────────────────────────────────────────
7 $proposal-open: #3fb950;
8 $proposal-merged: #a371f7;
9 $proposal-closed: #8b949e;
10
11 // ── Page wrapper ─────────────────────────────────────────────────────────────
12 .prd-page {
13 min-height: 100vh;
14 }
15
16 // ── Hero ─────────────────────────────────────────────────────────────────────
17 .prd-hero {
18 position: relative;
19 background: linear-gradient(135deg, #0d1117 0%, #0f1923 60%, #0d1117 100%);
20 border-bottom: 1px solid var(--border-default);
21 overflow: hidden;
22 }
23
24 .prd-hero-glow {
25 position: absolute;
26 inset: 0;
27 pointer-events: none;
28
29 &--open {
30 background:
31 radial-gradient(ellipse 55% 70% at 75% 40%, rgba(79,142,247,0.08) 0%, transparent 65%),
32 radial-gradient(ellipse 35% 50% at 15% 70%, rgba(63,185,80,0.05) 0%, transparent 60%);
33 }
34 &--merged {
35 background:
36 radial-gradient(ellipse 55% 70% at 75% 40%, rgba(163,113,247,0.10) 0%, transparent 65%),
37 radial-gradient(ellipse 35% 50% at 15% 70%, rgba(88,166,255,0.05) 0%, transparent 60%);
38 }
39 &--closed {
40 background:
41 radial-gradient(ellipse 50% 60% at 70% 40%, rgba(139,148,158,0.06) 0%, transparent 65%);
42 }
43 }
44
45 .prd-hero-inner {
46 position: relative;
47 max-width: 1200px;
48 margin: 0 auto;
49 padding: var(--space-8) var(--space-6) var(--space-5);
50 }
51
52 // ── Eyebrow (state + branches) ────────────────────────────────────────────────
53 .prd-eyebrow {
54 display: flex;
55 align-items: center;
56 gap: var(--space-3);
57 flex-wrap: wrap;
58 margin-bottom: var(--space-4);
59 }
60
61 .prd-state-badge {
62 display: inline-flex;
63 align-items: center;
64 gap: 5px;
65 padding: 3px 10px;
66 border-radius: var(--radius-sm);
67 font-size: 11px;
68 font-weight: 600;
69 letter-spacing: 0.03em;
70 white-space: nowrap;
71
72 svg { flex-shrink: 0; }
73
74 &--open { background: rgba(63,185,80,0.12); color: $proposal-open; border: 1px solid rgba(63,185,80,0.3); }
75 &--merged { background: rgba(163,113,247,0.12); color: $proposal-merged; border: 1px solid rgba(163,113,247,0.3); }
76 &--closed { background: rgba(139,148,158,0.10); color: $proposal-closed; border: 1px solid rgba(139,148,158,0.25); }
77 }
78
79 .prd-branch-flow {
80 display: inline-flex;
81 align-items: center;
82 gap: 6px;
83 color: var(--text-muted);
84 font-size: 12px;
85 svg { opacity: 0.5; }
86 }
87
88 .prd-branch {
89 background: rgba(255,255,255,0.05);
90 border: 1px solid var(--border-subtle);
91 border-radius: var(--radius-sm);
92 padding: 2px 8px;
93 font-family: var(--font-mono);
94 font-size: 11px;
95 color: var(--color-accent);
96 text-decoration: none;
97 transition: border-color var(--transition-fast), background var(--transition-fast);
98
99 &:hover {
100 border-color: rgba(79,142,247,0.5);
101 background: rgba(79,142,247,0.1);
102 }
103
104 &--to {
105 color: var(--text-secondary);
106 &:hover {
107 border-color: var(--border-muted);
108 background: rgba(255,255,255,0.07);
109 color: var(--text-primary);
110 }
111 }
112 }
113
114 .prd-merge-sha {
115 font-family: var(--font-mono);
116 font-size: 11px;
117 color: var(--text-muted);
118 text-decoration: none;
119 &:hover { color: var(--color-accent); text-decoration: underline; }
120 }
121
122 // ── Title ─────────────────────────────────────────────────────────────────────
123 .prd-title {
124 font-size: clamp(20px, 3vw, 30px);
125 font-weight: 700;
126 line-height: 1.2;
127 color: var(--text-primary);
128 margin: 0 0 var(--space-3);
129 max-width: 760px;
130 }
131
132 // ── Meta row ─────────────────────────────────────────────────────────────────
133 .prd-meta {
134 display: flex;
135 align-items: center;
136 gap: 8px;
137 font-size: 13px;
138 color: var(--text-muted);
139 flex-wrap: wrap;
140 margin-bottom: var(--space-3);
141 }
142
143 .prd-actor {
144 display: inline-flex;
145 align-items: center;
146 gap: 6px;
147 color: var(--text-primary);
148 font-weight: 500;
149 text-decoration: none;
150 &:hover { color: var(--color-accent); }
151 }
152
153 .prd-avatar {
154 width: 18px;
155 height: 18px;
156 border-radius: 50%;
157 background: rgba(79,142,247,0.2);
158 border: 1px solid rgba(79,142,247,0.3);
159 color: var(--color-accent);
160 font-size: 9px;
161 font-weight: 700;
162 display: inline-flex;
163 align-items: center;
164 justify-content: center;
165 flex-shrink: 0;
166 }
167
168 .prd-meta-sep { color: var(--border-muted); }
169
170 // ── Description ───────────────────────────────────────────────────────────────
171 .prd-description {
172 font-size: 13px;
173 color: var(--text-secondary);
174 line-height: 1.65;
175 max-width: 680px;
176 border-left: 2px solid var(--border-default);
177 padding-left: var(--space-4);
178 margin-top: var(--space-3);
179
180 // Rendered markdown — reset browser defaults and apply design tokens
181 &--md {
182 white-space: normal;
183
184 h1, h2, h3, h4 {
185 color: var(--text-primary);
186 font-weight: 600;
187 margin: var(--space-4) 0 var(--space-2);
188 line-height: 1.3;
189 &:first-child { margin-top: 0; }
190 }
191 h1 { font-size: 16px; }
192 h2 { font-size: 14px; }
193 h3 { font-size: 13px; }
194
195 p {
196 margin: 0 0 var(--space-3);
197 &:last-child { margin-bottom: 0; }
198 }
199
200 strong { color: var(--text-primary); font-weight: 600; }
201 em { font-style: italic; }
202
203 ul, ol {
204 margin: 0 0 var(--space-3);
205 padding-left: var(--space-5);
206 &:last-child { margin-bottom: 0; }
207 }
208 li { margin-bottom: 3px; }
209
210 code {
211 font-family: var(--font-mono);
212 font-size: 11px;
213 background: rgba(255,255,255,0.06);
214 border: 1px solid var(--border-subtle);
215 border-radius: var(--radius-sm);
216 padding: 1px 5px;
217 color: var(--text-primary);
218 }
219
220 pre {
221 background: var(--bg-overlay);
222 border: 1px solid var(--border-subtle);
223 border-radius: var(--radius-sm);
224 padding: var(--space-3);
225 overflow-x: auto;
226 margin: 0 0 var(--space-3);
227 code {
228 background: none;
229 border: none;
230 padding: 0;
231 font-size: 12px;
232 }
233 }
234
235 a {
236 color: var(--color-accent);
237 text-decoration: none;
238 &:hover { text-decoration: underline; }
239 }
240
241 blockquote {
242 border-left: 2px solid var(--border-muted);
243 padding-left: var(--space-3);
244 color: var(--text-muted);
245 margin: 0 0 var(--space-3);
246 }
247
248 hr {
249 border: none;
250 border-top: 1px solid var(--border-subtle);
251 margin: var(--space-4) 0;
252 }
253 }
254 }
255
256 // ── Stats strip ───────────────────────────────────────────────────────────────
257 .prd-stats {
258 position: relative;
259 max-width: 1200px;
260 margin: 0 auto;
261 display: flex;
262 gap: 0;
263 border-top: 1px solid var(--border-subtle);
264 padding: 0 var(--space-6);
265 }
266
267 .prd-stat {
268 display: flex;
269 flex-direction: column;
270 align-items: center;
271 gap: 2px;
272 padding: var(--space-3) var(--space-4);
273 border-right: 1px solid var(--border-subtle);
274 min-width: 80px;
275 &:last-child { border-right: none; }
276 }
277
278 .prd-stat-val {
279 font-family: var(--font-mono);
280 font-size: 16px;
281 font-weight: 700;
282 color: var(--text-primary);
283 line-height: 1.2;
284 }
285
286 .prd-stat-label {
287 font-size: 10px;
288 color: var(--text-muted);
289 text-transform: uppercase;
290 letter-spacing: 0.06em;
291 white-space: nowrap;
292 }
293
294 // ── Body wrap + layout ────────────────────────────────────────────────────────
295 .prd-wrap {
296 max-width: 1200px;
297 margin: 0 auto;
298 padding: var(--space-4) var(--space-6) var(--space-10);
299 }
300
301 .prd-layout {
302 display: grid;
303 grid-template-columns: 1fr 240px;
304 gap: var(--space-6);
305 align-items: start;
306 @media (max-width: 900px) { grid-template-columns: 1fr; }
307 }
308
309 .prd-main { min-width: 0; }
310
311 // ── Merged / closed inline notice ─────────────────────────────────────────────
312 .prd-notice {
313 display: flex;
314 align-items: center;
315 gap: 8px;
316 padding: 9px 14px;
317 border-radius: var(--radius-sm);
318 font-size: 13px;
319 margin-bottom: var(--space-4);
320 border-left: 3px solid;
321 a { color: inherit; text-decoration: underline; opacity: 0.8; }
322
323 &--merged {
324 background: rgba(163,113,247,0.08);
325 border-color: $proposal-merged;
326 color: $proposal-merged;
327 }
328 &--closed {
329 background: rgba(139,148,158,0.07);
330 border-color: $proposal-closed;
331 color: $proposal-closed;
332 }
333 }
334
335 // ────────────────────────────────────────────────────────────────────────────
336 // SECTIONS — no background boxes; just a bottom border divider
337 // ────────────────────────────────────────────────────────────────────────────
338 .proposal-section {
339 border-bottom: 1px solid var(--border-subtle);
340 margin-bottom: var(--space-5);
341 padding-bottom: var(--space-5);
342 &:last-child { border-bottom: none; margin-bottom: 0; }
343 &--merge { border-bottom: none; }
344 }
345
346 .proposal-section-hd {
347 display: flex;
348 align-items: center;
349 gap: 8px;
350 margin-bottom: var(--space-3);
351 }
352
353 .proposal-section-icon {
354 color: var(--text-muted);
355 flex-shrink: 0;
356 }
357
358 .proposal-section-title {
359 font-size: 13px;
360 font-weight: 600;
361 color: var(--text-primary);
362 margin: 0;
363 letter-spacing: 0.01em;
364 }
365
366 .proposal-section-count {
367 font-family: var(--font-mono);
368 font-size: 11px;
369 color: var(--text-muted);
370 background: rgba(255,255,255,0.04);
371 border: 1px solid var(--border-subtle);
372 border-radius: var(--radius-sm);
373 padding: 1px 6px;
374 margin-left: auto;
375 }
376
377 .proposal-section-badge {
378 font-size: 11px;
379 font-weight: 600;
380 padding: 2px 8px;
381 border-radius: var(--radius-sm);
382 margin-left: auto;
383
384 &--success, &--passed { background: rgba(63,185,80,0.12); color: #3fb950; border: 1px solid rgba(63,185,80,0.25); }
385 &--failure, &--failed { background: rgba(248,81,73,0.10); color: #f85149; border: 1px solid rgba(248,81,73,0.25); }
386 &--running, &--pending { background: rgba(79,142,247,0.10); color: #4f8ef7; border: 1px solid rgba(79,142,247,0.25); }
387 &--skipped { background: rgba(139,148,158,0.08); color: #8b949e; border: 1px solid rgba(139,148,158,0.2); }
388 &--none { background: rgba(139,148,158,0.06); color: #8b949e; border: 1px solid rgba(139,148,158,0.15); }
389 }
390
391 .proposal-section-desc {
392 font-size: 12px;
393 color: var(--text-muted);
394 line-height: 1.6;
395 margin: 0 0 var(--space-3);
396 }
397
398 .proposal-section-body { padding: 0; }
399 .proposal-section-body--flush { padding: 0; }
400
401 // ── CI rows ───────────────────────────────────────────────────────────────────
402 .proposal-ci-row {
403 display: flex;
404 align-items: center;
405 gap: 10px;
406 padding: 7px 0;
407 border-bottom: 1px solid var(--border-subtle);
408 font-size: 13px;
409 &:last-child { border-bottom: none; }
410 }
411
412 .proposal-ci-dot {
413 width: 7px;
414 height: 7px;
415 border-radius: 50%;
416 flex-shrink: 0;
417 &--success, &--passed { background: #3fb950; }
418 &--failure, &--failed { background: #f85149; }
419 &--running, &--pending { background: #4f8ef7; box-shadow: 0 0 5px rgba(79,142,247,0.5); }
420 &--skipped { background: #8b949e; }
421 }
422
423 .proposal-ci-name { color: var(--text-primary); font-weight: 500; flex: 1; }
424 .proposal-ci-dur { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
425 .proposal-ci-state {
426 font-size: 11px; font-weight: 600; font-family: var(--font-mono);
427 &--success, &--passed { color: #3fb950; }
428 &--failure, &--failed { color: #f85149; }
429 &--running, &--pending { color: #4f8ef7; }
430 &--skipped { color: #8b949e; }
431 }
432 .proposal-ci-link {
433 font-size: 11px;
434 color: var(--color-accent);
435 text-decoration: none;
436 white-space: nowrap;
437 &:hover { text-decoration: underline; }
438 }
439
440 // ── Symbol delta ──────────────────────────────────────────────────────────────
441 .proposal-sym-columns {
442 display: flex;
443 gap: var(--space-4);
444 flex-wrap: wrap;
445 margin-bottom: var(--space-3);
446 }
447
448 .proposal-sym-group {
449 flex: 1;
450 min-width: 140px;
451 min-width: 0; // critical: lets flex children shrink below content size
452 overflow: hidden;
453 }
454
455 .proposal-sym-group-hd {
456 display: flex;
457 align-items: center;
458 gap: 5px;
459 font-size: 11px;
460 font-weight: 600;
461 text-transform: uppercase;
462 letter-spacing: 0.06em;
463 margin-bottom: var(--space-2);
464 padding-bottom: 6px;
465 border-bottom: 1px solid var(--border-subtle);
466
467 svg { flex-shrink: 0; }
468
469 &--add { color: #3fb950; }
470 &--mod { color: #d29922; }
471 &--del { color: #f85149; }
472 }
473
474 .proposal-sym-count {
475 font-family: var(--font-mono);
476 font-size: 10px;
477 opacity: 0.7;
478 }
479
480 // ── Grouped file rows ─────────────────────────────────────────────────────────
481 .proposal-sym-group-row {
482 border-left: 2px solid var(--border-subtle);
483 margin-bottom: 8px;
484 padding-left: 8px;
485 &--add { border-left-color: rgba(63,185,80,0.4); }
486 &--mod { border-left-color: rgba(210,153,34,0.4); }
487 &--del { border-left-color: rgba(248,81,73,0.35); }
488 &:last-child { margin-bottom: 0; }
489 }
490
491 .proposal-sym-file-hd {
492 display: flex;
493 align-items: center;
494 gap: 7px;
495 padding: 3px 0 4px;
496 }
497
498 .proposal-sym-file-name {
499 font-family: var(--font-mono);
500 font-size: 11px;
501 color: var(--text-secondary);
502 white-space: nowrap;
503 overflow: hidden;
504 text-overflow: ellipsis;
505 flex: 1;
506 min-width: 0;
507 }
508
509 .proposal-sym-file-badge {
510 font-family: var(--font-mono);
511 font-size: 10px;
512 color: var(--text-muted);
513 background: rgba(255,255,255,0.04);
514 border: 1px solid var(--border-subtle);
515 border-radius: var(--radius-sm);
516 padding: 0 5px;
517 flex-shrink: 0;
518 line-height: 16px;
519 }
520
521 .proposal-sym-items { padding-bottom: 2px; }
522
523 .proposal-sym-item { display: block; padding: 1px 0; }
524
525 .proposal-sym-item-name {
526 font-family: var(--font-mono);
527 font-size: 11px;
528 background: transparent;
529 border: none;
530 padding: 0;
531 white-space: nowrap;
532 overflow: hidden;
533 text-overflow: ellipsis;
534 display: block;
535 // Kind colours applied directly via --add/--mod/--del modifier
536 &--add { color: rgba(63,185,80,0.75); }
537 &--mod { color: rgba(210,153,34,0.75); }
538 &--del { color: rgba(248,81,73,0.7); }
539 }
540
541 // ── Inner symbol pager (per file group) ──────────────────────────────────────
542 .proposal-sym-ipager {
543 display: flex;
544 align-items: center;
545 gap: 1px;
546 padding: 3px 0 2px;
547 margin-top: 2px;
548 border-top: 1px solid var(--border-subtle);
549 }
550
551 .proposal-sym-ipager-btn {
552 display: inline-flex;
553 align-items: center;
554 justify-content: center;
555 width: 18px;
556 height: 18px;
557 border-radius: var(--radius-sm);
558 border: 1px solid transparent;
559 background: transparent;
560 color: var(--text-muted);
561 cursor: pointer;
562 flex-shrink: 0;
563 transition: background var(--transition-fast), color var(--transition-fast);
564 svg { display: block; }
565 &:hover:not(:disabled) {
566 background: rgba(255,255,255,0.06);
567 border-color: var(--border-subtle);
568 color: var(--text-secondary);
569 }
570 &:disabled { opacity: 0.2; cursor: not-allowed; }
571 }
572
573 .proposal-sym-ipager-info {
574 flex: 1;
575 text-align: center;
576 font-family: var(--font-mono);
577 font-size: 9px;
578 color: var(--text-secondary);
579 white-space: nowrap;
580 }
581
582 // ── Outer file-group paginator ────────────────────────────────────────────────
583 .proposal-sym-pager { margin-top: 6px; }
584
585 .proposal-sym-pager-inner {
586 display: flex;
587 align-items: center;
588 gap: 2px;
589 padding-top: 7px;
590 border-top: 1px solid var(--border-subtle);
591 }
592
593 .proposal-sym-pager-btn {
594 display: inline-flex;
595 align-items: center;
596 justify-content: center;
597 width: 22px;
598 height: 22px;
599 border-radius: var(--radius-sm);
600 border: 1px solid transparent;
601 background: transparent;
602 color: var(--text-muted);
603 cursor: pointer;
604 flex-shrink: 0;
605 transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
606 svg { display: block; }
607 &:hover:not(:disabled) {
608 background: rgba(255,255,255,0.06);
609 border-color: var(--border-subtle);
610 color: var(--text-primary);
611 }
612 &:disabled { opacity: 0.25; cursor: not-allowed; }
613 }
614
615 .proposal-sym-pager-info {
616 flex: 1;
617 text-align: center;
618 font-family: var(--font-mono);
619 font-size: 10px;
620 color: var(--text-primary);
621 white-space: nowrap;
622 }
623
624 .proposal-sym-pager-of { color: var(--text-muted); }
625
626 .proposal-breaking {
627 margin-top: var(--space-3);
628 padding: var(--space-3);
629 background: rgba(248,81,73,0.06);
630 border: 1px solid rgba(248,81,73,0.2);
631 border-left: 3px solid #f85149;
632 border-radius: var(--radius-sm);
633 }
634
635 .proposal-breaking-hd {
636 display: flex;
637 align-items: center;
638 gap: 6px;
639 font-size: 11px;
640 font-weight: 600;
641 color: #f85149;
642 text-transform: uppercase;
643 letter-spacing: 0.06em;
644 margin-bottom: var(--space-2);
645 }
646
647 .proposal-breaking-item {
648 font-size: 12px;
649 padding: 2px 0;
650 overflow: hidden;
651 color: var(--text-secondary);
652 code {
653 display: block;
654 font-family: var(--font-mono);
655 font-size: 11px;
656 color: #f85149;
657 white-space: nowrap;
658 overflow: hidden;
659 text-overflow: ellipsis;
660 }
661 }
662
663 // ── Files changed ─────────────────────────────────────────────────────────────
664 .proposal-file-list { }
665
666 .proposal-file-row {
667 display: flex;
668 align-items: center;
669 gap: 10px;
670 padding: 5px 0;
671 border-bottom: 1px solid var(--border-subtle);
672 font-size: 12px;
673 &:last-child { border-bottom: none; }
674 }
675
676 .proposal-file-sigil {
677 width: 16px;
678 height: 16px;
679 border-radius: var(--radius-sm);
680 display: inline-flex;
681 align-items: center;
682 justify-content: center;
683 font-size: 10px;
684 font-weight: 700;
685 flex-shrink: 0;
686 font-family: var(--font-mono);
687
688 .proposal-file-row--add & { background: rgba(63,185,80,0.15); color: #3fb950; border: 1px solid rgba(63,185,80,0.25); }
689 .proposal-file-row--mod & { background: rgba(210,153,34,0.12); color: #d29922; border: 1px solid rgba(210,153,34,0.25); }
690 .proposal-file-row--del & { background: rgba(248,81,73,0.10); color: #f85149; border: 1px solid rgba(248,81,73,0.25); }
691 }
692
693 .proposal-file-name {
694 font-family: var(--font-mono);
695 font-size: 12px;
696 color: var(--text-secondary);
697 flex: 1;
698 overflow: hidden;
699 text-overflow: ellipsis;
700 white-space: nowrap;
701 }
702
703 // ── Commits ───────────────────────────────────────────────────────────────────
704 .proposal-commit-row {
705 display: flex;
706 align-items: flex-start;
707 gap: var(--space-3);
708 padding: 8px 0;
709 border-bottom: 1px solid var(--border-subtle);
710 &:last-child { border-bottom: none; }
711 }
712
713 .proposal-commit-left {
714 display: flex;
715 align-items: center;
716 gap: 5px;
717 flex-shrink: 0;
718 min-width: 64px;
719 }
720
721 .proposal-commit-type {
722 font-size: 10px;
723 font-weight: 600;
724 font-family: var(--font-mono);
725 padding: 1px 6px;
726 border-radius: var(--radius-sm);
727 text-transform: lowercase;
728 border: 1px solid;
729
730 &--feat { color: #3fb950; border-color: rgba(63,185,80,0.3); background: rgba(63,185,80,0.08); }
731 &--fix { color: #f85149; border-color: rgba(248,81,73,0.3); background: rgba(248,81,73,0.08); }
732 &--chore { color: #8b949e; border-color: rgba(139,148,158,0.3); background: rgba(139,148,158,0.06); }
733 &--docs { color: #58a6ff; border-color: rgba(88,166,255,0.3); background: rgba(88,166,255,0.08); }
734 &--test { color: #bc8cff; border-color: rgba(188,140,255,0.3); background: rgba(188,140,255,0.08); }
735 &--refactor,
736 &--style { color: #d29922; border-color: rgba(210,153,34,0.3); background: rgba(210,153,34,0.08); }
737 }
738
739 .proposal-agent-badge {
740 font-size: 9px;
741 font-weight: 600;
742 padding: 1px 5px;
743 border-radius: var(--radius-sm);
744 color: var(--agent-accent);
745 background: var(--agent-accent-bg);
746 border: 1px solid rgba(167,139,250,0.3);
747 text-transform: uppercase;
748 letter-spacing: 0.04em;
749 }
750
751 .proposal-commit-center { flex: 1; min-width: 0; }
752
753 .proposal-commit-message {
754 font-size: 13px;
755 color: var(--text-primary);
756 white-space: nowrap;
757 overflow: hidden;
758 text-overflow: ellipsis;
759 line-height: 1.4;
760 }
761
762 .proposal-commit-meta {
763 font-size: 11px;
764 color: var(--text-muted);
765 display: flex;
766 gap: 6px;
767 margin-top: 2px;
768 }
769
770 .proposal-commit-sep { color: var(--border-muted); }
771
772 .proposal-commit-right {
773 display: flex;
774 align-items: center;
775 gap: 8px;
776 flex-shrink: 0;
777 }
778
779 .proposal-commit-semver {
780 font-size: 9px;
781 font-weight: 700;
782 padding: 1px 6px;
783 border-radius: var(--radius-sm);
784 text-transform: uppercase;
785 letter-spacing: 0.05em;
786 border: 1px solid;
787
788 &--major { color: #f85149; border-color: rgba(248,81,73,0.35); background: rgba(248,81,73,0.10); }
789 &--minor { color: #d29922; border-color: rgba(210,153,34,0.35); background: rgba(210,153,34,0.10); }
790 &--patch { color: #3fb950; border-color: rgba(63,185,80,0.35); background: rgba(63,185,80,0.10); }
791 }
792
793 .proposal-commit-sha {
794 font-family: var(--font-mono);
795 font-size: 11px;
796 color: var(--text-muted);
797 text-decoration: none;
798 &:hover { color: var(--color-accent); text-decoration: underline; }
799 }
800
801 // ── Divergence analysis ───────────────────────────────────────────────────────
802 .proposal-div-overview {
803 display: flex;
804 align-items: center;
805 gap: var(--space-4);
806 margin-bottom: var(--space-3);
807 }
808
809 .proposal-div-ring {
810 flex-shrink: 0;
811 svg { display: block; }
812 }
813
814 .proposal-div-summary { flex: 1; }
815
816 .proposal-div-pct {
817 font-size: 18px;
818 font-weight: 700;
819 font-family: var(--font-mono);
820 color: var(--text-primary);
821 line-height: 1.2;
822 }
823
824 .proposal-div-desc {
825 font-size: 12px;
826 color: var(--text-muted);
827 margin-top: 2px;
828 }
829
830 .proposal-div-ancestor {
831 display: block;
832 font-family: var(--font-mono);
833 font-size: 11px;
834 color: var(--text-muted);
835 text-decoration: none;
836 margin-top: 4px;
837 &:hover { color: var(--color-accent); }
838 }
839
840 .proposal-section-chips {
841 display: flex;
842 flex-wrap: wrap;
843 gap: 6px;
844 }
845
846 .proposal-section-chip {
847 font-size: 11px;
848 font-family: var(--font-mono);
849 padding: 2px 8px;
850 background: rgba(255,255,255,0.04);
851 border: 1px solid var(--border-subtle);
852 border-radius: var(--radius-sm);
853 color: var(--text-muted);
854 }
855
856 // ── Comment form ──────────────────────────────────────────────────────────────
857 .proposal-comment-form {
858 margin-top: var(--space-4);
859 border-top: 1px solid var(--border-subtle);
860 padding-top: var(--space-4);
861 }
862
863 .proposal-textarea {
864 width: 100%;
865 background: var(--bg-overlay);
866 border: 1px solid var(--border-default);
867 border-radius: var(--radius-sm);
868 color: var(--text-primary);
869 font-size: 13px;
870 font-family: var(--font-sans);
871 padding: var(--space-3);
872 resize: vertical;
873 box-sizing: border-box;
874 transition: border-color var(--transition-fast);
875
876 &::placeholder { color: var(--text-muted); }
877 &:focus {
878 outline: none;
879 border-color: var(--color-accent);
880 box-shadow: 0 0 0 2px rgba(79,142,247,0.15);
881 }
882 }
883
884 .proposal-comment-form-actions {
885 display: flex;
886 justify-content: flex-end;
887 margin-top: var(--space-2);
888 }
889
890 // ── Merge strategies ──────────────────────────────────────────────────────────
891 .proposal-strategies {
892 display: flex;
893 flex-direction: column;
894 gap: 6px;
895 margin-bottom: var(--space-4);
896 }
897
898 .proposal-strategy {
899 display: flex;
900 align-items: flex-start;
901 gap: var(--space-3);
902 padding: var(--space-3);
903 background: transparent;
904 border: 1px solid var(--border-subtle);
905 border-radius: var(--radius-sm);
906 cursor: pointer;
907 transition: border-color var(--transition-fast), background var(--transition-fast);
908
909 &:hover { border-color: var(--border-default); background: rgba(255,255,255,0.02); }
910
911 &--active {
912 border-color: rgba(79,142,247,0.4);
913 background: rgba(79,142,247,0.06);
914 .proposal-strategy-label { color: var(--color-accent); }
915 }
916 }
917
918 .proposal-strategy-icon {
919 width: 28px;
920 height: 28px;
921 border-radius: var(--radius-sm);
922 background: rgba(255,255,255,0.05);
923 border: 1px solid var(--border-subtle);
924 display: flex;
925 align-items: center;
926 justify-content: center;
927 flex-shrink: 0;
928 color: var(--text-muted);
929 }
930
931 .proposal-strategy-label {
932 font-size: 13px;
933 font-weight: 500;
934 color: var(--text-primary);
935 line-height: 1.3;
936 }
937
938 .proposal-strategy-desc {
939 font-size: 11px;
940 color: var(--text-muted);
941 line-height: 1.5;
942 margin-top: 2px;
943 }
944
945 .proposal-merge-actions {
946 display: flex;
947 align-items: center;
948 gap: var(--space-4);
949 flex-wrap: wrap;
950 }
951
952 .proposal-hero-btn {
953 display: inline-flex;
954 align-items: center;
955 gap: 6px;
956 padding: 8px 18px;
957 border-radius: var(--radius-sm);
958 font-size: 13px;
959 font-weight: 500;
960 line-height: 1;
961 cursor: pointer;
962 border: 1px solid;
963 text-decoration: none;
964 transition: background var(--transition-fast), border-color var(--transition-fast);
965 white-space: nowrap;
966
967 svg { flex-shrink: 0; }
968
969 &--primary {
970 background: rgba(79,142,247,0.14);
971 border-color: rgba(79,142,247,0.45);
972 color: var(--color-accent);
973 &:hover {
974 background: rgba(79,142,247,0.22);
975 border-color: rgba(79,142,247,0.7);
976 }
977 &:disabled {
978 opacity: 0.5;
979 cursor: not-allowed;
980 }
981 }
982 }
983
984 .proposal-merge-btn-icon { display: block; }
985 .proposal-merge-btn-spinner {
986 display: none;
987 animation: proposal-spin 0.8s linear infinite;
988 }
989
990 @keyframes proposal-spin {
991 from { transform: rotate(0deg); }
992 to { transform: rotate(360deg); }
993 }
994
995 .htmx-request .proposal-merge-btn-icon { display: none; }
996 .htmx-request .proposal-merge-btn-spinner { display: block; }
997
998 .proposal-delete-label {
999 display: flex;
1000 align-items: center;
1001 gap: 6px;
1002 font-size: 12px;
1003 color: var(--text-muted);
1004 cursor: pointer;
1005 input[type="checkbox"] { accent-color: var(--color-accent); }
1006 &:hover { color: var(--text-secondary); }
1007 }
1008
1009 .proposal-merge-success {
1010 display: flex;
1011 align-items: center;
1012 gap: 8px;
1013 font-size: 13px;
1014 color: $proposal-merged;
1015 padding: 10px 14px;
1016 background: rgba(163,113,247,0.08);
1017 border: 1px solid rgba(163,113,247,0.25);
1018 border-radius: var(--radius-sm);
1019 svg { color: $proposal-merged; }
1020 }
1021
1022 .proposal-merge-commit-link {
1023 font-family: var(--font-mono);
1024 font-size: 11px;
1025 color: $proposal-merged;
1026 text-decoration: underline;
1027 }
1028
1029 // ────────────────────────────────────────────────────────────────────────────
1030 // SIDEBAR — flat, no card boxes; just headings + thin dividers
1031 // ────────────────────────────────────────────────────────────────────────────
1032 .proposal-sidebar {
1033 display: flex;
1034 flex-direction: column;
1035 gap: 0;
1036 position: sticky;
1037 top: var(--space-4);
1038 @media (max-width: 900px) { position: static; }
1039 }
1040
1041 .proposal-scard {
1042 border-bottom: 1px solid var(--border-subtle);
1043 padding: var(--space-4) 0;
1044 &:first-child { padding-top: 0; }
1045 &:last-child { border-bottom: none; }
1046 }
1047
1048 .proposal-scard-hd {
1049 font-size: 11px;
1050 font-weight: 600;
1051 text-transform: uppercase;
1052 letter-spacing: 0.08em;
1053 color: var(--text-muted);
1054 margin-bottom: var(--space-2);
1055 }
1056
1057 .proposal-scard-body { }
1058
1059 .proposal-scard-label {
1060 font-size: 11px;
1061 color: var(--text-muted);
1062 margin-bottom: 3px;
1063 margin-top: var(--space-2);
1064 &:first-child { margin-top: 0; }
1065 }
1066
1067 .proposal-scard-desc {
1068 font-size: 11px;
1069 color: var(--text-muted);
1070 line-height: 1.5;
1071 margin: var(--space-2) 0 0;
1072 }
1073
1074 .proposal-scard-empty {
1075 font-size: 12px;
1076 color: var(--text-muted);
1077 font-style: italic;
1078 margin: 0;
1079 }
1080
1081 // ── State pill ────────────────────────────────────────────────────────────────
1082 .proposal-state-pill {
1083 display: inline-flex;
1084 align-items: center;
1085 gap: 5px;
1086 padding: 3px 10px;
1087 border-radius: var(--radius-sm);
1088 font-size: 12px;
1089 font-weight: 600;
1090 border: 1px solid;
1091
1092 &--open { background: rgba(63,185,80,0.10); color: $proposal-open; border-color: rgba(63,185,80,0.25); }
1093 &--merged { background: rgba(163,113,247,0.10); color: $proposal-merged; border-color: rgba(163,113,247,0.25); }
1094 &--closed { background: rgba(139,148,158,0.08); color: $proposal-closed; border-color: rgba(139,148,158,0.2); }
1095 &--wide { width: 100%; justify-content: center; }
1096 }
1097
1098 // ── Semver impact ─────────────────────────────────────────────────────────────
1099 .proposal-scard-semver {
1100 display: flex;
1101 align-items: center;
1102 gap: 6px;
1103 font-size: 12px;
1104 font-weight: 600;
1105 padding: 6px 10px;
1106 border-radius: var(--radius-sm);
1107 border: 1px solid;
1108
1109 svg { flex-shrink: 0; }
1110
1111 &--major { background: rgba(248,81,73,0.08); color: #f85149; border-color: rgba(248,81,73,0.25); }
1112 &--minor { background: rgba(210,153,34,0.08); color: #d29922; border-color: rgba(210,153,34,0.25); }
1113 &--patch { background: rgba(63,185,80,0.08); color: #3fb950; border-color: rgba(63,185,80,0.25); }
1114 &--none { background: rgba(139,148,158,0.06); color: #8b949e; border-color: rgba(139,148,158,0.2); }
1115 }
1116
1117 // ── Branch names ──────────────────────────────────────────────────────────────
1118 .proposal-branch-name {
1119 font-family: var(--font-mono);
1120 font-size: 11px;
1121 padding: 2px 7px;
1122 border-radius: var(--radius-sm);
1123 background: rgba(255,255,255,0.04);
1124 border: 1px solid var(--border-subtle);
1125 text-decoration: none;
1126 transition: border-color var(--transition-fast), background var(--transition-fast);
1127
1128 &--from {
1129 color: var(--color-accent);
1130 &:hover { border-color: rgba(79,142,247,0.45); background: rgba(79,142,247,0.08); }
1131 }
1132 &--to {
1133 color: var(--text-secondary);
1134 &:hover { border-color: var(--border-muted); background: rgba(255,255,255,0.06); color: var(--text-primary); }
1135 }
1136 &--block { display: block; margin-bottom: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1137 }
1138
1139 // ── Reviewers ─────────────────────────────────────────────────────────────────
1140 .proposal-reviewer {
1141 display: flex;
1142 align-items: center;
1143 gap: 8px;
1144 padding: 5px 0;
1145 border-bottom: 1px solid var(--border-subtle);
1146 &:last-child { border-bottom: none; }
1147 }
1148
1149 .proposal-reviewer-avatar {
1150 width: 22px;
1151 height: 22px;
1152 border-radius: 50%;
1153 display: flex;
1154 align-items: center;
1155 justify-content: center;
1156 font-size: 10px;
1157 font-weight: 700;
1158 flex-shrink: 0;
1159 border: 1px solid;
1160
1161 &--approved { background: rgba(63,185,80,0.12); color: #3fb950; border-color: rgba(63,185,80,0.3); }
1162 &--changes { background: rgba(210,153,34,0.12); color: #d29922; border-color: rgba(210,153,34,0.3); }
1163 &--pending { background: rgba(139,148,158,0.1); color: #8b949e; border-color: rgba(139,148,158,0.2); }
1164 }
1165
1166 .proposal-reviewer-info { flex: 1; min-width: 0; }
1167 .proposal-reviewer-name { font-size: 12px; color: var(--text-primary); display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1168 .proposal-reviewer-state {
1169 font-size: 10px;
1170 font-weight: 600;
1171 display: block;
1172 &--approved { color: #3fb950; }
1173 &--changes { color: #d29922; }
1174 &--pending { color: #8b949e; }
1175 }
1176
1177 // ── Timeline ──────────────────────────────────────────────────────────────────
1178 .proposal-timeline {
1179 display: flex;
1180 flex-direction: column;
1181 gap: 0;
1182 }
1183
1184 .proposal-tl-item {
1185 display: flex;
1186 align-items: flex-start;
1187 gap: 8px;
1188 padding: 6px 0;
1189 position: relative;
1190
1191 &:not(:last-child)::before {
1192 content: '';
1193 position: absolute;
1194 left: 3px;
1195 top: 18px;
1196 bottom: -6px;
1197 width: 1px;
1198 background: var(--border-subtle);
1199 }
1200 }
1201
1202 .proposal-tl-dot {
1203 width: 7px;
1204 height: 7px;
1205 border-radius: 50%;
1206 margin-top: 4px;
1207 flex-shrink: 0;
1208 border: 1px solid;
1209
1210 &--open { background: rgba(63,185,80,0.3); border-color: #3fb950; }
1211 &--merged { background: rgba(163,113,247,0.3); border-color: $proposal-merged; }
1212 &--closed { background: rgba(248,81,73,0.2); border-color: #f85149; }
1213 &--wait { background: transparent; border-color: var(--border-muted); }
1214 }
1215
1216 .proposal-tl-content { flex: 1; min-width: 0; }
1217 .proposal-tl-actor { font-size: 12px; font-weight: 500; color: var(--text-primary); }
1218 .proposal-tl-event { font-size: 12px; color: var(--text-muted); }
1219 .proposal-tl-date { font-size: 10px; color: var(--text-muted); margin-top: 1px; }
1220
1221 // ── Risk Band (Phase 2) ───────────────────────────────────────────────────────
1222
1223 // Band color tokens
1224 $risk-low: #3fb950;
1225 $risk-medium: #d29922;
1226 $risk-high: #f0883e;
1227 $risk-critical: #ff2244;
1228
1229 @mixin risk-band-theme($color) {
1230 border-color: rgba($color, 0.3);
1231 .proposal-risk-band-glow { background: radial-gradient(ellipse 70% 100% at 50% -10%, rgba($color, 0.07) 0%, transparent 70%); }
1232 .proposal-risk-num { fill: $color; }
1233 .proposal-risk-ring-arc--low { stroke: $risk-low; }
1234 .proposal-risk-ring-arc--medium { stroke: $risk-medium; }
1235 .proposal-risk-ring-arc--high { stroke: $risk-high; }
1236 .proposal-risk-ring-arc--critical { stroke: $risk-critical; }
1237 .proposal-risk-label { color: $color; }
1238 }
1239
1240 .proposal-risk-band {
1241 position: relative;
1242 overflow: hidden;
1243 border: 1px solid;
1244 border-radius: var(--radius);
1245 margin-bottom: 0.75rem;
1246 background: var(--bg-surface);
1247
1248 &--low { @include risk-band-theme($risk-low); }
1249 &--medium { @include risk-band-theme($risk-medium); }
1250 &--high { @include risk-band-theme($risk-high); }
1251 &--critical { @include risk-band-theme($risk-critical); }
1252 }
1253
1254 .proposal-risk-band-glow {
1255 position: absolute;
1256 inset: 0;
1257 pointer-events: none;
1258 }
1259
1260 .proposal-risk-band-inner {
1261 position: relative;
1262 display: flex;
1263 align-items: center;
1264 gap: 1.5rem;
1265 padding: 0.85rem 1.25rem;
1266 flex-wrap: wrap;
1267 }
1268
1269 // Score gauge
1270 .proposal-risk-score {
1271 display: flex;
1272 align-items: center;
1273 gap: 0.6rem;
1274 flex-shrink: 0;
1275 }
1276
1277 .proposal-risk-ring {
1278 display: block;
1279 flex-shrink: 0;
1280 }
1281
1282 .proposal-risk-ring-arc {
1283 transition: stroke-dashoffset 0.5s cubic-bezier(0.4, 0, 0.2, 1);
1284 }
1285
1286 .proposal-risk-label-wrap {
1287 display: flex;
1288 flex-direction: column;
1289 gap: 0.1rem;
1290 }
1291
1292 .proposal-risk-label {
1293 font-size: 0.9rem;
1294 font-weight: 800;
1295 font-family: var(--font-mono);
1296 line-height: 1;
1297 }
1298
1299 .proposal-risk-sublabel {
1300 font-size: 0.62rem;
1301 font-weight: 600;
1302 text-transform: uppercase;
1303 letter-spacing: 0.07em;
1304 color: var(--text-muted);
1305 }
1306
1307 // Dimensions bar
1308 .proposal-risk-dims {
1309 display: flex;
1310 align-items: center;
1311 gap: 0;
1312 flex-wrap: wrap;
1313 flex: 1;
1314 }
1315
1316 .proposal-risk-dim {
1317 display: flex;
1318 flex-direction: column;
1319 align-items: center;
1320 padding: 0 0.9rem;
1321 &:first-child { padding-left: 0; }
1322 }
1323
1324 .proposal-risk-dim-sep {
1325 width: 1px;
1326 height: 28px;
1327 background: rgba(255,255,255,0.06);
1328 align-self: center;
1329 }
1330
1331 .proposal-risk-dim-val {
1332 font-size: 1rem;
1333 font-weight: 700;
1334 font-family: var(--font-mono);
1335 color: var(--text-primary);
1336 line-height: 1;
1337 &--warn { color: $risk-medium; }
1338 &--danger { color: $risk-critical; }
1339 &--ok { color: $risk-low; }
1340 &--agent { color: #a78bfa; } // purple for agent commits
1341 }
1342
1343 .proposal-risk-dim-key {
1344 font-size: 0.6rem;
1345 font-weight: 600;
1346 text-transform: uppercase;
1347 letter-spacing: 0.07em;
1348 color: var(--text-muted);
1349 margin-top: 0.2rem;
1350 white-space: nowrap;
1351 }
1352
1353 // Hero stats risk stat
1354 .prd-stat-val--risk {
1355 font-family: var(--font-mono);
1356 &-low { color: $risk-low; }
1357 &-medium { color: $risk-medium; }
1358 &-high { color: $risk-high; }
1359 &-critical { color: $risk-critical; }
1360 }
1361
1362 // Agent commit count stat
1363 .prd-stat-val--agent {
1364 color: var(--color-accent-emphasis, #58a6ff);
1365 font-family: var(--font-mono);
1366 }
1367
1368 // Inline agent contribution note in the proposal meta line
1369 .prd-agent-contrib {
1370 display: inline-flex;
1371 align-items: center;
1372 gap: 3px;
1373 font-size: 0.78rem;
1374 color: var(--color-accent-emphasis, #58a6ff);
1375 opacity: 0.85;
1376
1377 svg { vertical-align: -1px; }
1378 }
1379
1380 // ── Blast radius note ─────────────────────────────────────────────────────────
1381
1382 .proposal-blast-note {
1383 display: inline-flex;
1384 align-items: center;
1385 gap: 0.3rem;
1386 margin-left: 0.5rem;
1387 font-size: 0.75rem;
1388 color: var(--text-muted);
1389 svg { color: $risk-medium; flex-shrink: 0; }
1390 strong { color: $risk-medium; }
1391 }
1392
1393 .proposal-blast-link {
1394 color: var(--color-accent-link);
1395 text-decoration: none;
1396 &:hover { text-decoration: underline; }
1397 }
1398
1399 // ── Symbol-anchored comments (Phase 2.4) ─────────────────────────────────────
1400
1401 // Anchor button on each symbol item
1402 .proposal-sym-item {
1403 display: flex;
1404 align-items: center;
1405 gap: 0.3rem;
1406 }
1407
1408 .proposal-sym-anchor-btn {
1409 display: inline-flex;
1410 align-items: center;
1411 justify-content: center;
1412 padding: 2px 4px;
1413 border: 1px solid transparent;
1414 border-radius: 3px;
1415 background: transparent;
1416 color: var(--text-muted);
1417 cursor: pointer;
1418 opacity: 0;
1419 transition: opacity 0.1s, color 0.1s, border-color 0.1s;
1420 flex-shrink: 0;
1421 .proposal-sym-item:hover & { opacity: 1; }
1422 &:hover {
1423 color: var(--color-accent-link);
1424 border-color: rgba(79,142,247,0.3);
1425 background: rgba(79,142,247,0.06);
1426 }
1427 }
1428
1429 // Anchor preview row in the comment form
1430 .proposal-sym-anchor-row {
1431 display: flex;
1432 align-items: center;
1433 gap: 0.4rem;
1434 padding: 0.3rem 0.5rem;
1435 background: rgba(79,142,247,0.06);
1436 border: 1px solid rgba(79,142,247,0.2);
1437 border-radius: 4px;
1438 margin-bottom: 0.4rem;
1439 font-size: 0.75rem;
1440 color: var(--color-accent-link);
1441 svg { flex-shrink: 0; }
1442 }
1443
1444 .proposal-sym-anchor-label { color: var(--text-muted); }
1445
1446 .proposal-sym-anchor-addr {
1447 font-family: var(--font-mono);
1448 font-size: 0.72rem;
1449 color: var(--text-primary);
1450 flex: 1;
1451 min-width: 0;
1452 overflow: hidden;
1453 text-overflow: ellipsis;
1454 white-space: nowrap;
1455 }
1456
1457 .proposal-sym-anchor-clear {
1458 border: none;
1459 background: transparent;
1460 color: var(--text-muted);
1461 cursor: pointer;
1462 font-size: 0.7rem;
1463 padding: 0 2px;
1464 line-height: 1;
1465 flex-shrink: 0;
1466 &:hover { color: var(--color-danger); }
1467 }
1468
1469 // Symbol anchor chip in comment thread
1470 .pd-sym-anchor {
1471 display: inline-flex;
1472 align-items: center;
1473 gap: 0.3rem;
1474 padding: 2px 8px 2px 6px;
1475 border-radius: 9999px;
1476 background: rgba(79,142,247,0.08);
1477 border: 1px solid rgba(79,142,247,0.2);
1478 font-size: 0.68rem;
1479 color: var(--color-accent-link);
1480 text-decoration: none;
1481 svg { flex-shrink: 0; }
1482 code {
1483 font-family: var(--font-mono);
1484 font-size: 0.68rem;
1485 color: var(--text-primary);
1486 max-width: 260px;
1487 overflow: hidden;
1488 text-overflow: ellipsis;
1489 white-space: nowrap;
1490 display: inline-block;
1491 vertical-align: middle;
1492 }
1493 &:hover { border-color: rgba(79,142,247,0.4); background: rgba(79,142,247,0.12); }
1494 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago