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