gabriel / musehub public
_components.scss
1,820 lines 47.5 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 /*
2 * MuseHub Component Classes
3 *
4 * Reusable UI components built on top of the design tokens in tokens.css.
5 * Every selector here uses var(--*) tokens exclusively — no hardcoded colors.
6 *
7 * Component inventory:
8 * Base reset, body
9 * Links
10 * Badges (.badge, .badge-open/closed/merged/clean/dirty/active)
11 * Buttons (.btn, .btn-primary/danger/secondary/ghost)
12 * Cards (.card, .artifact-card)
13 * Tables (.table)
14 * Forms (.form-group, .form-label, .form-input, .form-select, .form-hint)
15 * Token form (.token-form)
16 * Grids (.grid-auto, .grid-2, .grid-3, .artifact-grid)
17 * Modals (.modal, .modal-backdrop, .modal-panel, .modal-header, .modal-footer)
18 * Tabs (.tabs, .tab-list, .tab, .tab-panel)
19 * Tooltips (.tooltip, [data-tooltip])
20 * Rows (.commit-row, .proposal-row, .issue-row, .session-row, .session-row-active)
21 * Session enrichment(.session-row-header, .session-row-intent, .session-notes-preview,
22 * .session-row-participants, .participant-stack, .participant-avatar,
23 * .participant-overflow, .session-no-participants,
24 * .session-commit-pill, .session-location-tag)
25 * Meta rows (.meta-row, .meta-item, .meta-label, .meta-value)
26 * Misc utilities (.loading, .error, .empty-state, .session-live, .session-live-pulse)
27 * Code blocks (pre, code)
28 * Labels (.label, .label-*)
29 */
30
31 /* -------------------------------------------------------------------------
32 * Base reset
33 * ------------------------------------------------------------------------- */
34 *,
35 *::before,
36 *::after {
37 box-sizing: border-box;
38 margin: 0;
39 padding: 0;
40 }
41
42 html {
43 -webkit-text-size-adjust: 100%;
44 }
45
46 body {
47 font-family: var(--font-sans);
48 font-size: var(--font-size-base);
49 line-height: var(--line-height-normal);
50 background-color: var(--bg-base);
51 color: var(--text-secondary);
52 min-height: 100vh;
53 }
54
55 /* -------------------------------------------------------------------------
56 * Links
57 * ------------------------------------------------------------------------- */
58 a {
59 color: var(--color-accent-link);
60 text-decoration: none;
61 }
62
63 a:hover {
64 text-decoration: none;
65 }
66
67 /* -------------------------------------------------------------------------
68 * Headings
69 * ------------------------------------------------------------------------- */
70 h1 {
71 font-size: 26px;
72 font-weight: var(--font-weight-bold);
73 letter-spacing: -0.5px;
74 color: var(--text-primary);
75 margin-bottom: var(--space-3);
76 }
77
78 h2 {
79 font-size: 20px;
80 font-weight: var(--font-weight-semibold);
81 letter-spacing: -0.3px;
82 color: var(--text-primary);
83 margin-bottom: var(--space-2);
84 }
85
86 h3 {
87 font-size: var(--font-size-md);
88 font-weight: var(--font-weight-semibold);
89 color: var(--text-primary);
90 margin-bottom: var(--space-1);
91 }
92
93 /* -------------------------------------------------------------------------
94 * Badges
95 * ------------------------------------------------------------------------- */
96 .badge {
97 display: inline-block;
98 padding: 2px var(--space-2);
99 border-radius: var(--radius-full);
100 font-family: var(--font-mono);
101 font-size: var(--font-size-xs);
102 font-weight: var(--font-weight-semibold);
103 line-height: var(--line-height-tight);
104 white-space: nowrap;
105 letter-spacing: 0.3px;
106 }
107
108 .badge-open { background: var(--color-accent-muted); color: var(--text-primary); }
109 .badge-closed { background: var(--color-neutral); color: var(--text-primary); }
110 .badge-merged { background: var(--color-purple-bg); color: var(--text-primary); }
111 .badge-active { background: var(--color-success-bg); color: var(--text-primary); }
112 .badge-clean { background: var(--color-success-bg); color: var(--text-primary); }
113 .badge-dirty { background: var(--color-warning-bg); color: var(--text-primary); }
114 .badge-error { background: var(--color-danger-bg); color: var(--text-primary); }
115 .badge-dim-harmonic { background: var(--dim-harmonic-muted); color: var(--text-primary); }
116 .badge-dim-rhythmic { background: var(--dim-rhythmic-muted); color: var(--text-primary); }
117 .badge-dim-melodic { background: var(--dim-melodic-muted); color: var(--text-primary); }
118 .badge-dim-structural{ background: var(--dim-structural-muted);color: var(--text-primary); }
119 .badge-dim-dynamic { background: var(--dim-dynamic-muted); color: var(--text-primary); }
120
121 /* -------------------------------------------------------------------------
122 * Buttons
123 * ------------------------------------------------------------------------- */
124 .btn {
125 display: inline-flex;
126 align-items: center;
127 gap: var(--space-2);
128 padding: 6px var(--space-4);
129 border-radius: var(--radius-base);
130 font-family: var(--font-sans);
131 font-size: var(--font-size-sm);
132 font-weight: var(--font-weight-medium);
133 line-height: var(--line-height-tight);
134 cursor: pointer;
135 border: 1px solid transparent;
136 transition: background var(--transition-fast), border-color var(--transition-fast),
137 box-shadow var(--transition-fast), color var(--transition-fast);
138 text-decoration: none;
139 white-space: nowrap;
140 user-select: none;
141 letter-spacing: 0;
142
143 svg { flex-shrink: 0; }
144 }
145
146 .btn:disabled {
147 opacity: 0.4;
148 cursor: not-allowed;
149 }
150
151 .btn-primary {
152 background: var(--color-accent);
153 color: #fff;
154 border-color: var(--color-accent);
155
156 &:not(:disabled):hover {
157 opacity: 0.88;
158 transform: translateY(-1px);
159 text-decoration: none;
160 }
161 }
162
163 .btn-create {
164 background: var(--color-success-bg);
165 color: #fff;
166 border-color: var(--color-success-bg);
167
168 &:not(:disabled):hover {
169 background: var(--color-success);
170 border-color: var(--color-success);
171 text-decoration: none;
172 }
173 }
174
175 .btn-danger {
176 background: var(--color-danger-bg);
177 color: #fff;
178 border-color: var(--color-danger-bg);
179
180 &:not(:disabled):hover {
181 background: var(--color-danger);
182 border-color: var(--color-danger);
183 text-decoration: none;
184 }
185 }
186
187 .btn-secondary {
188 background: var(--bg-overlay);
189 color: var(--text-secondary);
190 border-color: var(--border-default);
191
192 &:not(:disabled):hover {
193 background: var(--bg-hover);
194 color: var(--text-primary);
195 border-color: var(--border-muted);
196 text-decoration: none;
197 }
198 }
199
200 .btn-ghost {
201 background: transparent;
202 color: var(--text-secondary);
203 border-color: var(--border-default);
204
205 &:not(:disabled):hover {
206 background: var(--bg-overlay);
207 color: var(--text-primary);
208 text-decoration: none;
209 }
210 }
211
212 .btn-accent {
213 background: var(--color-accent-muted);
214 color: var(--text-primary);
215 border-color: var(--color-accent-muted);
216
217 &:not(:disabled):hover {
218 background: var(--color-accent);
219 border-color: var(--color-accent);
220 text-decoration: none;
221 }
222 }
223
224 .btn-sm {
225 padding: 4px var(--space-3);
226 font-size: var(--font-size-xs);
227 border-radius: var(--radius-sm);
228 }
229
230 /* -------------------------------------------------------------------------
231 * Cards
232 * ------------------------------------------------------------------------- */
233 .card {
234 background: transparent;
235 border: 1px solid var(--border-subtle);
236 border-radius: var(--radius-sm);
237 padding: var(--space-3);
238 margin-bottom: var(--space-3);
239 }
240
241 .artifact-card {
242 background: var(--bg-overlay);
243 border: 1px solid var(--border-default);
244 border-radius: var(--radius-base);
245 padding: 10px;
246 display: flex;
247 flex-direction: column;
248 gap: var(--space-2);
249 }
250
251 .artifact-card img {
252 width: 100%;
253 border-radius: var(--radius-sm);
254 border: 1px solid var(--border-default);
255 }
256
257 .artifact-card audio {
258 width: 100%;
259 }
260
261 .artifact-card .path {
262 font-size: var(--font-size-sm);
263 color: var(--text-muted);
264 word-break: break-all;
265 }
266
267 /* -------------------------------------------------------------------------
268 * Repo card grid (explore page)
269 * ------------------------------------------------------------------------- */
270 .repo-card-grid {
271 display: grid;
272 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
273 gap: 12px;
274 }
275
276 .repo-card {
277 position: relative;
278 background: transparent;
279 border: 1px solid var(--border-subtle);
280 border-radius: var(--radius-sm);
281 padding: var(--space-3);
282 cursor: pointer;
283 transition: border-color 0.15s, background 0.15s;
284 text-decoration: none;
285 display: flex;
286 flex-direction: column;
287 gap: var(--space-2);
288 color: inherit;
289
290 &:hover {
291 border-color: var(--border-default);
292 background: rgba(255,255,255,0.02);
293 text-decoration: none;
294 color: inherit;
295 }
296 }
297
298 .repo-card-header {
299 display: flex;
300 align-items: center;
301 justify-content: space-between;
302 }
303
304 .repo-card-name {
305 font-weight: var(--font-weight-semibold);
306 font-size: var(--font-size-sm);
307 color: var(--text-primary);
308 letter-spacing: -0.01em;
309 }
310
311 .repo-card-sep {
312 color: var(--text-muted);
313 font-weight: var(--font-weight-regular);
314 margin: 0 1px;
315 }
316
317 .repo-card-desc {
318 font-size: var(--font-size-xs);
319 color: var(--text-muted);
320 line-height: var(--line-height-relaxed);
321 margin: 0;
322 display: -webkit-box;
323 -webkit-line-clamp: 2;
324 -webkit-box-orient: vertical;
325 overflow: hidden;
326 }
327
328 .repo-card-pills {
329 display: flex;
330 gap: 5px;
331 flex-wrap: wrap;
332 margin-top: var(--space-1);
333 }
334
335 .repo-meta-pill {
336 display: inline-flex;
337 align-items: center;
338 gap: 3px;
339 font-family: var(--font-mono);
340 font-size: 11px;
341 padding: 2px 8px;
342 border-radius: var(--radius-full);
343 background: var(--bg-overlay);
344 color: var(--text-muted);
345 border: 1px solid var(--border-subtle);
346 }
347
348 .tag-pill {
349 display: inline-flex;
350 align-items: center;
351 font-family: var(--font-mono);
352 font-size: 11px;
353 padding: 2px 8px;
354 border-radius: var(--radius-full);
355 background: rgba(79, 142, 247, 0.08);
356 color: var(--color-accent-link);
357 border: 1px solid rgba(79, 142, 247, 0.25);
358 }
359
360 .tag-pill-more {
361 opacity: 0.6;
362 }
363
364 .repo-card-footer {
365 display: flex;
366 align-items: center;
367 gap: var(--space-4);
368 margin-top: auto;
369 padding-top: var(--space-2);
370 border-top: 1px solid var(--border-subtle);
371 }
372
373 .repo-card-stat {
374 display: inline-flex;
375 align-items: center;
376 gap: 4px;
377 font-size: var(--font-size-xs);
378 color: var(--text-muted);
379
380 svg { opacity: 0.7; }
381 }
382
383 /* -------------------------------------------------------------------------
384 * Tables
385 * ------------------------------------------------------------------------- */
386 .table {
387 width: 100%;
388 border-collapse: collapse;
389 font-size: var(--font-size-base);
390 }
391
392 .table th {
393 text-align: left;
394 padding: var(--space-2) var(--space-3);
395 font-size: var(--font-size-xs);
396 font-weight: var(--font-weight-semibold);
397 color: var(--text-muted);
398 text-transform: uppercase;
399 letter-spacing: 0.5px;
400 border-bottom: 1px solid var(--border-default);
401 }
402
403 .table td {
404 padding: var(--space-2) var(--space-3);
405 border-bottom: 1px solid var(--border-subtle);
406 color: var(--text-secondary);
407 vertical-align: top;
408 }
409
410 .table tr:last-child td {
411 border-bottom: none;
412 }
413
414 .table tr:hover td {
415 background: var(--bg-overlay);
416 }
417
418 /* -------------------------------------------------------------------------
419 * Forms
420 * ------------------------------------------------------------------------- */
421 .form-group {
422 display: flex;
423 flex-direction: column;
424 gap: var(--space-1);
425 margin-bottom: var(--space-4);
426 }
427
428 .form-label {
429 font-size: var(--font-size-sm);
430 font-weight: var(--font-weight-medium);
431 color: var(--text-secondary);
432 }
433
434 .form-input,
435 .form-select,
436 select,
437 input[type="text"],
438 input[type="password"],
439 input[type="email"],
440 input[type="search"],
441 textarea {
442 background: var(--bg-base);
443 color: var(--text-secondary);
444 border: 1px solid var(--border-default);
445 border-radius: var(--radius-base);
446 padding: var(--space-2) var(--space-3);
447 font-size: var(--font-size-base);
448 font-family: var(--font-sans);
449 width: 100%;
450 transition: border-color var(--transition-base);
451 }
452
453 .form-input:focus,
454 .form-select:focus,
455 select:focus,
456 input[type="text"]:focus,
457 input[type="password"]:focus,
458 input[type="email"]:focus,
459 input[type="search"]:focus,
460 textarea:focus {
461 outline: none;
462 border-color: var(--color-accent);
463 }
464
465 .form-hint {
466 font-size: var(--font-size-xs);
467 color: var(--text-muted);
468 }
469
470 /* Token authentication form */
471 .token-form {
472 background: var(--bg-surface);
473 border: 1px solid var(--color-orange);
474 border-radius: var(--radius-base);
475 padding: var(--space-4);
476 margin-bottom: var(--space-5);
477 }
478
479 .token-form p {
480 font-size: var(--font-size-base);
481 color: var(--text-muted);
482 margin-bottom: var(--space-2);
483 }
484
485 /* -------------------------------------------------------------------------
486 * Grids
487 * ------------------------------------------------------------------------- */
488 .grid-auto {
489 display: grid;
490 grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
491 gap: var(--space-3);
492 }
493
494 .grid-2 {
495 display: grid;
496 grid-template-columns: 1fr 1fr;
497 gap: var(--space-3);
498 }
499
500 .grid-3 {
501 display: grid;
502 grid-template-columns: 1fr 1fr 1fr;
503 gap: var(--space-3);
504 }
505
506 .artifact-grid {
507 display: grid;
508 grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
509 gap: var(--space-3);
510 margin-top: var(--space-3);
511 }
512
513 /* -------------------------------------------------------------------------
514 * Modals
515 * ------------------------------------------------------------------------- */
516 .modal {
517 display: none;
518 position: fixed;
519 inset: 0;
520 z-index: var(--z-modal);
521 }
522
523 .modal.is-open {
524 display: flex;
525 align-items: center;
526 justify-content: center;
527 }
528
529 .modal-backdrop {
530 position: fixed;
531 inset: 0;
532 background: rgba(0, 0, 0, 0.6);
533 z-index: var(--z-overlay);
534 }
535
536 .modal-panel {
537 position: relative;
538 z-index: var(--z-modal);
539 background: var(--bg-surface);
540 border: 1px solid var(--border-default);
541 border-radius: var(--radius-md);
542 box-shadow: var(--shadow-xl);
543 padding: var(--space-6);
544 max-width: 560px;
545 width: 90%;
546 max-height: 80vh;
547 overflow-y: auto;
548 }
549
550 .modal-header {
551 display: flex;
552 align-items: center;
553 justify-content: space-between;
554 margin-bottom: var(--space-4);
555 }
556
557 .modal-footer {
558 display: flex;
559 gap: var(--space-2);
560 justify-content: flex-end;
561 margin-top: var(--space-4);
562 padding-top: var(--space-4);
563 border-top: 1px solid var(--border-default);
564 }
565
566 /* -------------------------------------------------------------------------
567 * Tabs
568 * ------------------------------------------------------------------------- */
569 .tabs {
570 margin-bottom: var(--space-4);
571 }
572
573 .tab-list {
574 display: flex;
575 border-bottom: 1px solid var(--border-default);
576 gap: 0;
577 list-style: none;
578 }
579
580 .tab {
581 padding: var(--space-2) var(--space-4);
582 font-size: var(--font-size-base);
583 font-weight: var(--font-weight-medium);
584 color: var(--text-muted);
585 cursor: pointer;
586 border-bottom: 2px solid transparent;
587 margin-bottom: -1px;
588 transition: color var(--transition-base), border-color var(--transition-base);
589 white-space: nowrap;
590 }
591
592 .tab:hover {
593 color: var(--text-primary);
594 }
595
596 .tab.is-active {
597 color: var(--text-primary);
598 border-bottom-color: var(--color-accent);
599 }
600
601 .tab-panel {
602 display: none;
603 padding-top: var(--space-4);
604 }
605
606 .tab-panel.is-active {
607 display: block;
608 }
609
610 /* -------------------------------------------------------------------------
611 * Tooltips (CSS-only via data-tooltip attribute)
612 * ------------------------------------------------------------------------- */
613 [data-tooltip] {
614 position: relative;
615 }
616
617 [data-tooltip]::after {
618 content: attr(data-tooltip);
619 position: absolute;
620 bottom: calc(100% + var(--space-1));
621 left: 50%;
622 transform: translateX(-50%);
623 background: var(--bg-overlay);
624 color: var(--text-primary);
625 border: 1px solid var(--border-default);
626 border-radius: var(--radius-sm);
627 padding: 4px var(--space-2);
628 font-size: var(--font-size-xs);
629 white-space: nowrap;
630 pointer-events: none;
631 opacity: 0;
632 transition: opacity var(--transition-base);
633 z-index: var(--z-tooltip);
634 box-shadow: var(--shadow-md);
635 }
636
637 [data-tooltip]:hover::after {
638 opacity: 1;
639 }
640
641 /* Explicit .tooltip class for programmatic usage */
642 .tooltip {
643 position: relative;
644 }
645
646 /* -------------------------------------------------------------------------
647 * List rows — commits, proposals, issues, sessions
648 * ------------------------------------------------------------------------- */
649 .commit-row,
650 .proposal-row,
651 .issue-row,
652 .session-row {
653 display: flex;
654 align-items: flex-start;
655 gap: var(--space-3);
656 padding: 10px 0;
657 border-bottom: 1px solid var(--border-subtle);
658 }
659
660 .commit-row:last-child,
661 .proposal-row:last-child,
662 .issue-row:last-child,
663 .session-row:last-child {
664 border-bottom: none;
665 }
666
667 .commit-sha {
668 font-family: var(--font-mono);
669 font-size: 13px;
670 color: var(--color-accent);
671 white-space: nowrap;
672 }
673
674 .commit-msg {
675 flex: 1;
676 font-size: var(--font-size-base);
677 }
678
679 .commit-meta {
680 font-size: var(--font-size-sm);
681 color: var(--text-muted);
682 white-space: nowrap;
683 }
684
685 /* Live session indicator */
686 .session-live {
687 display: inline-block;
688 width: 8px;
689 height: 8px;
690 border-radius: var(--radius-full);
691 background: var(--color-success);
692 box-shadow: 0 0 6px var(--color-success);
693 margin-right: var(--space-1);
694 vertical-align: middle;
695 flex-shrink: 0;
696 }
697
698 /* Pulsing animation for active sessions */
699 @keyframes session-pulse {
700 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--color-success); }
701 50% { opacity: 0.55; box-shadow: 0 0 12px var(--color-success); }
702 }
703 .session-live-pulse {
704 animation: session-pulse 1.6s ease-in-out infinite;
705 }
706
707 /* Active session row highlight */
708 .session-row-active {
709 background: color-mix(in srgb, var(--color-success) 4%, transparent);
710 border-radius: var(--radius-sm);
711 padding-left: var(--space-2);
712 padding-right: var(--space-2);
713 }
714
715 /* Session row header line */
716 .session-row-header {
717 display: flex;
718 align-items: center;
719 flex-wrap: wrap;
720 gap: var(--space-2);
721 font-size: 14px;
722 color: var(--text-primary);
723 margin-bottom: 4px;
724 }
725
726 /* Intent line */
727 .session-row-intent {
728 font-size: 13px;
729 color: var(--text-muted);
730 margin-top: 2px;
731 }
732
733 /* Notes preview — one-line subtitle below intent */
734 .session-notes-preview {
735 font-size: 12px;
736 color: var(--text-muted);
737 margin-top: 3px;
738 white-space: nowrap;
739 overflow: hidden;
740 text-overflow: ellipsis;
741 max-width: 600px;
742 font-style: italic;
743 }
744
745 /* Participant avatars row */
746 .session-row-participants {
747 margin-top: 6px;
748 }
749
750 /* Stacked participant avatar circles */
751 .participant-stack {
752 display: flex;
753 align-items: center;
754 }
755
756 .participant-avatar {
757 display: inline-flex;
758 align-items: center;
759 justify-content: center;
760 width: 26px;
761 height: 26px;
762 border-radius: var(--radius-full);
763 font-size: 11px;
764 font-weight: var(--font-weight-semibold);
765 color: #fff;
766 text-decoration: none;
767 border: 2px solid var(--bg-card);
768 margin-left: -6px;
769 transition: transform 0.15s ease, z-index 0s;
770 flex-shrink: 0;
771 }
772
773 .participant-avatar:first-child {
774 margin-left: 0;
775 }
776
777 .participant-avatar:hover {
778 transform: translateY(-2px);
779 text-decoration: none;
780 }
781
782 /* "+N more" overflow pill */
783 .participant-overflow {
784 display: inline-flex;
785 align-items: center;
786 justify-content: center;
787 height: 26px;
788 padding: 0 var(--space-2);
789 border-radius: var(--radius-full);
790 font-size: 11px;
791 font-weight: var(--font-weight-semibold);
792 color: var(--text-muted);
793 background: var(--bg-overlay);
794 border: 2px solid var(--bg-card);
795 margin-left: -6px;
796 white-space: nowrap;
797 }
798
799 /* Empty participant placeholder */
800 .session-no-participants {
801 color: var(--text-muted);
802 font-size: 13px;
803 }
804
805 /* Commit count pill */
806 .session-commit-pill {
807 display: inline-flex;
808 align-items: center;
809 gap: 3px;
810 padding: 1px var(--space-2);
811 border-radius: var(--radius-full);
812 font-size: var(--font-size-xs);
813 font-weight: var(--font-weight-semibold);
814 background: var(--bg-overlay);
815 color: var(--text-secondary);
816 white-space: nowrap;
817 }
818
819 /* Location tag */
820 .session-location-tag {
821 font-size: var(--font-size-xs);
822 color: var(--text-muted);
823 white-space: nowrap;
824 }
825
826 /* -------------------------------------------------------------------------
827 * Metadata rows (key-value pairs, e.g. commit detail sidebar)
828 * ------------------------------------------------------------------------- */
829 .meta-row {
830 display: flex;
831 gap: var(--space-6);
832 flex-wrap: wrap;
833 margin-bottom: var(--space-3);
834 }
835
836 .meta-item {
837 display: flex;
838 flex-direction: column;
839 gap: var(--space-1);
840 }
841
842 .meta-label {
843 font-size: var(--font-size-xs);
844 color: var(--text-muted);
845 text-transform: uppercase;
846 letter-spacing: 0.5px;
847 }
848
849 .meta-value {
850 font-size: var(--font-size-base);
851 color: var(--text-primary);
852 }
853
854 /* -------------------------------------------------------------------------
855 * Labels (issue/proposal taxonomy labels, similar to GitHub labels)
856 * ------------------------------------------------------------------------- */
857 .label {
858 display: inline-block;
859 padding: 1px var(--space-2);
860 border-radius: var(--radius-full);
861 font-size: var(--font-size-xs);
862 background: var(--bg-hover);
863 color: var(--text-secondary);
864 margin: 2px;
865 }
866
867 /* Branch indicator pill — from_branch / to_branch on proposal rows */
868 .branch-pill {
869 display: inline-block;
870 padding: 1px var(--space-2);
871 border-radius: var(--radius-full);
872 font-size: 11px;
873 font-family: var(--font-mono);
874 background: var(--bg-overlay);
875 color: var(--color-accent);
876 border: 1px solid var(--border-subtle);
877 white-space: nowrap;
878 overflow: hidden;
879 max-width: 200px;
880 text-overflow: ellipsis;
881 }
882
883 /* Clickable label pill for client-side filtering */
884 .label-pill {
885 transition: opacity 0.1s, outline 0.1s;
886 }
887
888 .label-pill:hover {
889 opacity: 0.8;
890 outline: 1px solid var(--color-accent);
891 }
892
893 /* Active (selected) label filter pill */
894 .label-active {
895 outline: 2px solid var(--color-accent);
896 background: color-mix(in srgb, var(--color-accent) 15%, var(--bg-hover));
897 color: var(--color-accent);
898 }
899
900 /* -------------------------------------------------------------------------
901 * Issue body preview (subtitle line under issue title)
902 * ------------------------------------------------------------------------- */
903 .issue-preview {
904 font-size: var(--font-size-sm);
905 color: var(--text-muted);
906 margin-top: 2px;
907 white-space: nowrap;
908 overflow: hidden;
909 text-overflow: ellipsis;
910 }
911
912 /* -------------------------------------------------------------------------
913 * Open/Closed tabs and sort buttons for issue list page
914 * ------------------------------------------------------------------------- */
915 .tab-btn {
916 background: none;
917 border: none;
918 border-bottom: 2px solid transparent;
919 padding: var(--space-2) var(--space-4);
920 font-size: var(--font-size-sm);
921 color: var(--text-muted);
922 cursor: pointer;
923 transition: color 0.15s, border-color 0.15s;
924 }
925
926 .tab-btn:hover {
927 color: var(--text-primary);
928 }
929
930 .tab-btn.tab-active {
931 color: var(--text-primary);
932 border-bottom-color: var(--color-accent);
933 font-weight: 600;
934 }
935
936 .tab-count {
937 display: inline-block;
938 background: var(--bg-hover);
939 border-radius: var(--radius-full);
940 font-size: var(--font-size-xs);
941 padding: 0 6px;
942 margin-left: 4px;
943 color: var(--text-muted);
944 }
945
946 .sort-btn {
947 font-size: var(--font-size-xs);
948 padding: 2px var(--space-2);
949 }
950
951 .sort-btn.sort-active {
952 color: var(--text-primary);
953 font-weight: 600;
954 }
955
956 /* -------------------------------------------------------------------------
957 * Code blocks
958 * ------------------------------------------------------------------------- */
959 pre {
960 background: var(--code-output-bg);
961 border: 1px solid var(--border-default);
962 border-radius: var(--radius-base);
963 padding: var(--space-3);
964 font-size: 13px;
965 font-family: var(--font-mono);
966 overflow-x: auto;
967 white-space: pre-wrap;
968 word-break: break-word;
969 color: #abb2bf;
970 line-height: 1.65;
971 }
972
973 code {
974 font-family: var(--font-mono);
975 font-size: 0.88em;
976 background: var(--bg-overlay);
977 border: 1px solid var(--border-subtle);
978 padding: 1px 6px;
979 border-radius: 4px;
980 }
981
982 pre code {
983 background: transparent;
984 border: none;
985 padding: 0;
986 font-size: inherit;
987 color: inherit;
988 }
989
990 /* -------------------------------------------------------------------------
991 * State / feedback
992 * ------------------------------------------------------------------------- */
993 .loading {
994 color: var(--text-muted);
995 font-size: var(--font-size-base);
996 }
997
998 .error {
999 color: var(--color-danger);
1000 font-size: var(--font-size-base);
1001 margin: var(--space-2) 0;
1002 }
1003
1004 .empty-state {
1005 text-align: center;
1006 padding: var(--space-12) var(--space-6);
1007 color: var(--text-muted);
1008 font-size: var(--font-size-base);
1009 }
1010
1011 .empty-state .empty-icon {
1012 display: flex;
1013 align-items: center;
1014 justify-content: center;
1015 width: 56px;
1016 height: 56px;
1017 border-radius: var(--radius-lg);
1018 background: var(--bg-overlay);
1019 border: 1px solid var(--border-subtle);
1020 margin: 0 auto var(--space-4);
1021 color: var(--text-muted);
1022
1023 svg, i[data-lucide] {
1024 width: 24px;
1025 height: 24px;
1026 stroke: currentColor;
1027 }
1028 }
1029
1030 .empty-title {
1031 font-size: var(--font-size-md);
1032 font-weight: var(--font-weight-semibold);
1033 color: var(--text-primary);
1034 margin-bottom: var(--space-2);
1035 letter-spacing: -0.01em;
1036 }
1037
1038 .empty-desc {
1039 font-size: var(--font-size-sm);
1040 color: var(--text-muted);
1041 margin-bottom: var(--space-5);
1042 max-width: 360px;
1043 margin-left: auto;
1044 margin-right: auto;
1045 line-height: var(--line-height-relaxed);
1046 }
1047
1048 /* -------------------------------------------------------------------------
1049 * Commit list (repo page)
1050 * ------------------------------------------------------------------------- */
1051 .commit-list {
1052 display: flex;
1053 flex-direction: column;
1054 gap: 0;
1055 }
1056
1057 .commit-row {
1058 display: grid;
1059 grid-template-columns: 80px 1fr auto;
1060 align-items: center;
1061 gap: var(--space-3);
1062 padding: var(--space-3) 0;
1063 border-bottom: 1px solid var(--border-subtle);
1064 }
1065
1066 .commit-row:last-child { border-bottom: none; }
1067
1068 .commit-sha {
1069 font-family: var(--font-mono);
1070 font-size: var(--font-size-sm);
1071 color: var(--color-accent);
1072 white-space: nowrap;
1073 }
1074
1075 .commit-msg {
1076 font-size: var(--font-size-sm);
1077 color: var(--text-secondary);
1078 overflow: hidden;
1079 text-overflow: ellipsis;
1080 white-space: nowrap;
1081 display: flex;
1082 align-items: center;
1083 gap: var(--space-2);
1084 }
1085
1086 .commit-msg a { color: var(--text-primary); }
1087 .commit-msg a:hover { color: var(--color-accent); text-decoration: none; }
1088
1089 .commit-meta {
1090 font-size: var(--font-size-xs);
1091 color: var(--text-muted);
1092 white-space: nowrap;
1093 flex-shrink: 0;
1094 display: flex;
1095 align-items: center;
1096 gap: var(--space-1);
1097 }
1098
1099 /* diff view */
1100 .diff-track-row {
1101 display: flex;
1102 align-items: center;
1103 gap: var(--space-3);
1104 padding: var(--space-2) var(--space-3);
1105 border-radius: var(--radius-sm);
1106 margin-bottom: var(--space-1);
1107 }
1108
1109 .diff-track-added { background: rgba(63,185,80,0.1); border-left: 3px solid var(--color-success); }
1110 .diff-track-removed { background: rgba(248,81,73,0.1); border-left: 3px solid var(--color-danger); }
1111 .diff-track-changed { background: rgba(88,166,255,0.1); border-left: 3px solid var(--color-accent); }
1112
1113 .diff-sign {
1114 font-size: var(--font-size-lg);
1115 font-weight: var(--font-weight-bold);
1116 width: 20px;
1117 flex-shrink: 0;
1118 }
1119
1120 .diff-sign-add { color: var(--color-success); }
1121 .diff-sign-remove { color: var(--color-danger); }
1122 .diff-sign-change { color: var(--color-accent); }
1123
1124 /* insights / analytics */
1125 .insights-grid {
1126 display: grid;
1127 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1128 gap: var(--space-4);
1129 margin-bottom: var(--space-4);
1130 }
1131
1132 .stat-card {
1133 background: var(--bg-surface);
1134 border: 1px solid var(--border-default);
1135 border-radius: var(--radius-base);
1136 padding: var(--space-4);
1137 text-align: center;
1138 }
1139
1140 .stat-card .stat-value {
1141 font-family: var(--font-mono);
1142 font-size: var(--font-size-2xl);
1143 font-weight: var(--font-weight-bold);
1144 color: var(--color-accent);
1145 display: block;
1146 line-height: 1.1;
1147 }
1148
1149 .stat-card .stat-label {
1150 font-size: var(--font-size-sm);
1151 color: var(--text-muted);
1152 margin-top: var(--space-1);
1153 }
1154
1155 /* contribution heatmap (weekly squares) */
1156 .heatmap-grid {
1157 display: flex;
1158 gap: 3px;
1159 overflow-x: auto;
1160 }
1161
1162 .heatmap-week {
1163 display: flex;
1164 flex-direction: column;
1165 gap: 3px;
1166 }
1167
1168 .heatmap-day {
1169 width: 12px;
1170 height: 12px;
1171 border-radius: 2px;
1172 background: var(--bg-overlay);
1173 }
1174
1175 .heatmap-day[data-count="0"] { background: var(--bg-overlay); }
1176 .heatmap-day[data-count="1"] { background: var(--dim-rhythmic-muted); }
1177 .heatmap-day[data-count="2"] { background: var(--dim-rhythmic); opacity: 0.6; }
1178 .heatmap-day[data-count="3"] { background: var(--dim-rhythmic); }
1179 .heatmap-day[data-count="4"] { background: var(--color-success); }
1180
1181
1182 /* social / comments */
1183 .comment-thread {
1184 border-top: 1px solid var(--border-subtle);
1185 margin-top: var(--space-4);
1186 padding-top: var(--space-4);
1187 }
1188
1189 .comment-item {
1190 display: flex;
1191 gap: var(--space-3);
1192 padding: var(--space-3) 0;
1193 border-bottom: 1px solid var(--border-subtle);
1194 }
1195
1196 .comment-avatar {
1197 width: 32px;
1198 height: 32px;
1199 border-radius: var(--radius-full);
1200 background: var(--bg-overlay);
1201 border: 1px solid var(--border-default);
1202 display: flex;
1203 align-items: center;
1204 justify-content: center;
1205 font-size: 14px;
1206 flex-shrink: 0;
1207 color: var(--text-muted);
1208 }
1209
1210 .comment-body {
1211 flex: 1;
1212 min-width: 0;
1213 }
1214
1215 .comment-meta {
1216 font-size: var(--font-size-xs);
1217 color: var(--text-muted);
1218 margin-bottom: var(--space-1);
1219 }
1220
1221 .comment-text {
1222 font-size: var(--font-size-sm);
1223 color: var(--text-secondary);
1224 white-space: pre-wrap;
1225 }
1226
1227 .comment-form {
1228 display: flex;
1229 flex-direction: column;
1230 gap: var(--space-3);
1231 margin-top: var(--space-4);
1232 padding-top: var(--space-3);
1233 border-top: 1px solid var(--border-subtle);
1234 }
1235
1236 .reactions-row {
1237 display: flex;
1238 gap: var(--space-2);
1239 flex-wrap: wrap;
1240 margin-top: var(--space-2);
1241 }
1242
1243 .reaction-btn {
1244 background: var(--bg-overlay);
1245 border: 1px solid var(--border-subtle);
1246 border-radius: var(--radius-full);
1247 padding: 2px var(--space-2);
1248 cursor: pointer;
1249 font-size: var(--font-size-sm);
1250 color: var(--text-secondary);
1251 transition: background var(--transition-fast);
1252 }
1253
1254 .reaction-btn:hover { background: var(--bg-hover); }
1255 .reaction-btn.active { background: var(--color-accent-muted); border-color: var(--color-accent); color: var(--text-primary); }
1256
1257 /* follow button */
1258 .follow-btn {
1259 background: var(--bg-overlay);
1260 border: 1px solid var(--border-default);
1261 border-radius: var(--radius-base);
1262 padding: 5px var(--space-4);
1263 cursor: pointer;
1264 font-size: var(--font-size-sm);
1265 color: var(--text-secondary);
1266 transition: background var(--transition-fast), border-color var(--transition-fast);
1267 }
1268
1269 .follow-btn.following {
1270 background: var(--color-success-bg);
1271 border-color: var(--color-success-bg);
1272 color: white;
1273 }
1274
1275 /* notification badge */
1276 .notif-badge {
1277 position: absolute;
1278 top: -4px;
1279 right: -4px;
1280 background: var(--color-danger);
1281 color: white;
1282 font-size: 10px;
1283 border-radius: var(--radius-full);
1284 min-width: 16px;
1285 height: 16px;
1286 display: flex;
1287 align-items: center;
1288 justify-content: center;
1289 padding: 0 4px;
1290 }
1291
1292 /* ---------------------------------------------------------------------------
1293 * Analysis dashboard grid
1294 * Used by analysis.html — 10 dimension summary cards at a glance.
1295 * --------------------------------------------------------------------------- */
1296 .analysis-grid {
1297 display: grid;
1298 grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1299 gap: 14px;
1300 margin-top: 4px;
1301 }
1302
1303 .analysis-card {
1304 background: var(--bg-surface);
1305 border: 1px solid var(--border-default);
1306 border-radius: 8px;
1307 padding: 16px;
1308 display: flex;
1309 flex-direction: column;
1310 gap: 6px;
1311 transition: border-color 0.15s, background 0.15s;
1312 color: inherit;
1313 text-decoration: none;
1314 }
1315
1316 .analysis-card:hover {
1317 border-color: var(--color-accent);
1318 background: var(--color-surface-raised);
1319 text-decoration: none;
1320 }
1321
1322 .card-emoji { font-size: 22px; }
1323 .card-dim { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.6px; }
1324 .card-metric { font-size: 18px; font-weight: 700; color: var(--color-text); word-break: break-word; }
1325 .card-sub { font-size: 12px; color: var(--text-muted); }
1326 .card-spark { font-size: 14px; color: var(--color-success); letter-spacing: 1px; margin-top: 2px; }
1327
1328 /* waveform placeholder */
1329 .waveform-bar {
1330 display: flex;
1331 align-items: flex-end;
1332 gap: 2px;
1333 height: 48px;
1334 overflow: hidden;
1335 }
1336
1337 .waveform-bar .wave-col {
1338 flex: 1;
1339 background: var(--color-accent);
1340 opacity: 0.6;
1341 border-radius: 2px 2px 0 0;
1342 min-height: 4px;
1343 transition: height 0.1s;
1344 }
1345
1346 /* ── Reaction bar ────────────────────────────────────────────────────────── */
1347 .reaction-bar {
1348 display: flex;
1349 flex-wrap: wrap;
1350 gap: 6px;
1351 padding: var(--space-3) 0;
1352 }
1353
1354 .reaction-btn {
1355 display: inline-flex;
1356 align-items: center;
1357 gap: 4px;
1358 padding: 4px 10px;
1359 border: 1px solid var(--border-subtle, rgba(255,255,255,0.12));
1360 border-radius: 20px;
1361 background: var(--bg-overlay, rgba(255,255,255,0.05));
1362 color: var(--text-primary, #e6edf3);
1363 font-size: 16px;
1364 cursor: pointer;
1365 transition: background 0.15s, border-color 0.15s, transform 0.1s;
1366 line-height: 1;
1367 user-select: none;
1368 }
1369
1370 .reaction-btn:hover {
1371 background: var(--bg-raised, rgba(255,255,255,0.1));
1372 border-color: var(--color-accent, #58a6ff);
1373 transform: scale(1.08);
1374 }
1375
1376 .reaction-btn--active {
1377 background: rgba(79, 142, 247, 0.15);
1378 border-color: var(--color-accent);
1379 }
1380
1381 .reaction-count {
1382 font-size: 12px;
1383 font-weight: 600;
1384 color: var(--text-secondary, #8b949e);
1385 min-width: 12px;
1386 }
1387
1388 .reaction-btn--active .reaction-count {
1389 color: var(--color-accent, #58a6ff);
1390 }
1391
1392 /* ── HTMX loading indicator — managed in _tokens.scss ──────────────────── */
1393
1394 /* =========================================================================
1395 * Muse protocol design language components
1396 * ========================================================================= */
1397
1398 /* -------------------------------------------------------------------------
1399 * Top-accent cards
1400 * Cards with a 3px colored top border, mirroring the capability showcase
1401 * cards from the Muse protocol site. Works on top of .card or standalone.
1402 *
1403 * Usage: <div class="card card-accent-top">…</div>
1404 * or with a specific dimension color:
1405 * <div class="card card-accent-harmonic">…</div>
1406 *
1407 * The .card-accent-{color} classes also set a matching subtle background
1408 * tint via a translucent overlay so the color reads without being garish.
1409 * ------------------------------------------------------------------------- */
1410 .card-accent-top { border-top: 3px solid var(--color-accent); }
1411 .card-accent-success { border-top: 3px solid var(--color-success); }
1412 .card-accent-warning { border-top: 3px solid var(--color-warning); }
1413 .card-accent-danger { border-top: 3px solid var(--color-danger); }
1414 .card-accent-purple { border-top: 3px solid var(--color-purple); }
1415 .card-accent-orange { border-top: 3px solid var(--color-orange); }
1416 .card-accent-harmonic { border-top: 3px solid var(--dim-harmonic); }
1417 .card-accent-rhythmic { border-top: 3px solid var(--dim-rhythmic); }
1418 .card-accent-melodic { border-top: 3px solid var(--dim-melodic); }
1419 .card-accent-structural { border-top: 3px solid var(--dim-structural); }
1420 .card-accent-dynamic { border-top: 3px solid var(--dim-dynamic); }
1421
1422 /* Hover lift — matches the Muse site card hover transform */
1423 .card-hover {
1424 transition: transform var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);
1425
1426 &:hover {
1427 transform: translateY(-2px);
1428 box-shadow: var(--shadow-md);
1429 }
1430 }
1431
1432 /* -------------------------------------------------------------------------
1433 * CTA button — Muse blue accent, for marketing/landing-style actions.
1434 * Distinct from .btn-primary (green = create/confirm) which retains its
1435 * GitHub-inspired semantic meaning.
1436 * ------------------------------------------------------------------------- */
1437 .btn-cta {
1438 background: #4f8ef7;
1439 color: #fff;
1440 border-color: #4f8ef7;
1441 font-weight: var(--font-weight-semibold);
1442
1443 &:not(:disabled):hover {
1444 background: var(--color-accent);
1445 border-color: var(--color-accent);
1446 opacity: 0.9;
1447 transform: translateY(-1px);
1448 text-decoration: none;
1449 }
1450 }
1451
1452 /* -------------------------------------------------------------------------
1453 * Monospaced eyebrow badge — small monospace chip used beside headings,
1454 * table headers, and capability cards.
1455 * Usage: <span class="mono-badge">active</span>
1456 * ------------------------------------------------------------------------- */
1457 .mono-badge {
1458 font-family: var(--font-mono);
1459 font-size: var(--font-size-xs);
1460 font-weight: var(--font-weight-medium);
1461 padding: 2px var(--space-2);
1462 border-radius: 4px;
1463 border: 1px solid var(--border-subtle);
1464 background: var(--bg-overlay);
1465 color: var(--text-muted);
1466 white-space: nowrap;
1467 letter-spacing: 0.3px;
1468 }
1469
1470 .mono-badge-accent {
1471 color: var(--color-accent);
1472 background: rgba(79, 142, 247, 0.08);
1473 border-color: rgba(79, 142, 247, 0.25);
1474 }
1475
1476 .mono-badge-success {
1477 color: var(--color-success);
1478 background: rgba(63, 185, 80, 0.08);
1479 border-color: rgba(63, 185, 80, 0.25);
1480 }
1481
1482 /* -------------------------------------------------------------------------
1483 * Ticker / scrolling marquee chip — for domain/tag horizontal scroll strips.
1484 * Matches the .ticker-item pattern from the Muse protocol hero section.
1485 * ------------------------------------------------------------------------- */
1486 .ticker-chip {
1487 font-family: var(--font-mono);
1488 font-size: 13px;
1489 padding: 4px var(--space-4);
1490 border-radius: var(--radius-full);
1491 border: 1px solid var(--border-default);
1492 white-space: nowrap;
1493 color: var(--text-muted);
1494 background: transparent;
1495 flex-shrink: 0;
1496 }
1497
1498 .ticker-chip.active {
1499 border-color: rgba(79, 142, 247, 0.5);
1500 color: var(--color-accent);
1501 background: rgba(79, 142, 247, 0.08);
1502 }
1503
1504 /* -------------------------------------------------------------------------
1505 * Stat cells — large number + small label, styled like the protocol stat
1506 * strip on the Muse site (e.g. "6 methods to implement").
1507 * Usage: <div class="stat-cell"><span class="stat-num">6</span><span class="stat-lbl">methods</span></div>
1508 * ------------------------------------------------------------------------- */
1509 .stat-cell-muse {
1510 display: flex;
1511 flex-direction: column;
1512 align-items: center;
1513 justify-content: center;
1514 padding: var(--space-4) var(--space-5);
1515 border: 1px solid var(--border-default);
1516 border-radius: var(--radius-base);
1517 text-align: center;
1518 background: var(--bg-surface);
1519 }
1520
1521 .stat-num-muse {
1522 font-family: var(--font-mono);
1523 font-size: 26px;
1524 font-weight: var(--font-weight-bold);
1525 color: var(--color-accent);
1526 line-height: 1.1;
1527 display: block;
1528 }
1529
1530 .stat-lbl-muse {
1531 font-size: 11px;
1532 color: var(--text-muted);
1533 margin-top: var(--space-1);
1534 line-height: 1.3;
1535 }
1536
1537 /* -------------------------------------------------------------------------
1538 * Shared page components — extracted from inline <style> blocks
1539 * These are used on 2+ pages and must live here so they are available
1540 * regardless of HTMX navigation direction.
1541 * ------------------------------------------------------------------------- */
1542
1543 /* ── Sidebar sections (explore, repo_home, issue_list, issue_detail) ────── */
1544 .sidebar-section {
1545 margin-bottom: var(--space-3);
1546 padding-bottom: var(--space-3);
1547 border-bottom: 1px solid var(--border-default);
1548 }
1549 .sidebar-section:last-child { border-bottom: none; }
1550 .sidebar-section-title {
1551 font-family: var(--font-mono);
1552 font-size: 10px;
1553 font-weight: 700;
1554 color: var(--color-accent);
1555 text-transform: uppercase;
1556 letter-spacing: 1.5px;
1557 margin: 0 0 var(--space-2) 0;
1558 }
1559
1560 /* ── Form fields (new_repo, settings) ───────────────────────────────────── */
1561 .form-group { margin-bottom: var(--space-4); }
1562 .form-label {
1563 display: block;
1564 font-size: var(--font-size-sm);
1565 font-weight: 600;
1566 margin-bottom: var(--space-1);
1567 color: var(--text-primary);
1568 }
1569 .form-label .required { color: #f85149; margin-left: 2px; }
1570 .form-description { font-size: var(--font-size-xs); color: var(--text-muted); margin-bottom: var(--space-2); }
1571 .form-input {
1572 width: 100%;
1573 box-sizing: border-box;
1574 padding: 6px 10px;
1575 background: var(--bg-surface);
1576 border: 1px solid var(--border-default);
1577 border-radius: var(--radius-md);
1578 color: var(--text-primary);
1579 font-size: var(--font-size-sm);
1580 }
1581 .form-input:focus {
1582 outline: none;
1583 border-color: var(--color-accent);
1584 box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-accent) 25%, transparent);
1585 }
1586 .form-checkbox-row {
1587 display: flex;
1588 align-items: flex-start;
1589 gap: var(--space-3);
1590 padding: var(--space-3);
1591 background: var(--bg-surface);
1592 border: 1px solid var(--border-subtle);
1593 border-radius: var(--radius-md);
1594 margin-bottom: var(--space-2);
1595 }
1596 .form-checkbox-row input[type=checkbox] { margin-top: 2px; flex-shrink: 0; }
1597 .form-checkbox-label { font-size: var(--font-size-sm); font-weight: 600; color: var(--text-primary); }
1598 .form-checkbox-desc { font-size: var(--font-size-xs); color: var(--text-muted); margin-top: 2px; }
1599
1600 /* ── Tag pill input widget (new_repo, settings) ─────────────────────────── */
1601 .tag-input-container {
1602 display: flex;
1603 flex-wrap: wrap;
1604 gap: 4px;
1605 padding: 6px 8px;
1606 background: var(--bg-surface);
1607 border: 1px solid var(--border-default);
1608 border-radius: var(--radius-md);
1609 min-height: 38px;
1610 cursor: text;
1611 }
1612 .tag-pill {
1613 display: inline-flex;
1614 align-items: center;
1615 gap: 4px;
1616 background: var(--bg-overlay);
1617 border: 1px solid var(--border-subtle);
1618 border-radius: 20px;
1619 padding: 2px 8px;
1620 font-size: 12px;
1621 color: var(--text-primary);
1622 }
1623 .tag-pill-remove {
1624 background: none;
1625 border: none;
1626 cursor: pointer;
1627 color: var(--text-muted);
1628 font-size: 14px;
1629 padding: 0;
1630 line-height: 1;
1631 }
1632 .tag-pill-remove:hover { color: #f85149; }
1633 .tag-text-input {
1634 border: none;
1635 outline: none;
1636 background: transparent;
1637 color: var(--text-primary);
1638 font-size: var(--font-size-sm);
1639 min-width: 80px;
1640 flex: 1;
1641 }
1642
1643 /* ── Branch pill (proposal_list, proposal_detail) ───────────────────────── */
1644 .branch-pill {
1645 display: inline-block;
1646 padding: 1px 7px;
1647 border-radius: 10px;
1648 font-size: 11px;
1649 font-family: var(--font-mono);
1650 background: var(--bg-surface);
1651 border: 1px solid var(--border-default);
1652 color: var(--text-primary);
1653 }
1654
1655 /* ── Sort button (proposal_list, commits) ───────────────────────────────── */
1656 .sort-btn {
1657 padding: 4px 10px;
1658 border-radius: var(--radius-md);
1659 border: 1px solid var(--border-default);
1660 background: var(--bg-overlay);
1661 color: var(--text-secondary);
1662 font-size: 12px;
1663 cursor: pointer;
1664 }
1665 .sort-btn:hover { border-color: var(--color-accent); color: var(--color-accent); }
1666 .sort-btn.sort-active {
1667 background: var(--color-accent);
1668 color: #fff;
1669 border-color: var(--color-accent);
1670 }
1671 // Standalone .sort-active (not on a .sort-btn) scoped to known containers
1672 .sort-controls .sort-active,
1673 .filter-bar .sort-active {
1674 background: var(--color-accent);
1675 color: #fff;
1676 border-color: var(--color-accent);
1677 }
1678
1679 /* ── HTMX indicator (new_repo, settings) ────────────────────────────────── */
1680 .htmx-indicator { opacity: 0; transition: opacity 0.2s ease; }
1681 .htmx-request .htmx-indicator,
1682 .htmx-request.htmx-indicator { opacity: 1; }
1683
1684 /* ── Comment system — full threaded (commit page) ───────────────────────── */
1685 .comment-thread { margin-bottom: var(--space-4); }
1686 .comment-thread:last-child { margin-bottom: 0; }
1687 .comment-row { display: flex; gap: var(--space-3); align-items: flex-start; }
1688 .comment-reply-row { margin-top: var(--space-3); }
1689 .comment-avatar {
1690 display: inline-flex;
1691 align-items: center;
1692 justify-content: center;
1693 width: 30px;
1694 height: 30px;
1695 border-radius: 50%;
1696 font-size: 12px;
1697 font-weight: var(--font-weight-semibold);
1698 background: var(--bg-overlay);
1699 color: var(--text-muted);
1700 flex-shrink: 0;
1701 }
1702 .comment-body-col { flex: 1; min-width: 0; }
1703 .comment-meta { display: flex; align-items: baseline; gap: var(--space-2); margin-bottom: var(--space-1); }
1704 .comment-author { font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--text-primary); }
1705 .comment-ts { font-size: var(--font-size-xs); color: var(--text-muted); }
1706 .comment-date { font-size: var(--font-size-xs); color: var(--text-muted); margin-left: auto; }
1707 .comment-text {
1708 font-size: var(--font-size-sm);
1709 color: var(--text-secondary);
1710 white-space: pre-wrap;
1711 word-break: break-word;
1712 line-height: 1.55;
1713 }
1714 .comment-body {
1715 font-size: var(--font-size-sm);
1716 color: var(--text-secondary);
1717 white-space: pre-wrap;
1718 word-break: break-word;
1719 line-height: 1.6;
1720 margin-bottom: 6px;
1721 }
1722 .comment-actions { display: flex; gap: var(--space-1); margin-top: var(--space-1); }
1723 .comment-delete-btn { color: var(--color-danger, #f87171); }
1724 .comment-replies {
1725 margin-top: var(--space-3);
1726 padding-left: var(--space-4);
1727 border-left: 2px solid var(--border-subtle);
1728 display: flex;
1729 flex-direction: column;
1730 gap: var(--space-3);
1731 }
1732 // Inside .comment-replies the gap handles spacing; kill any inherited margin.
1733 .comment-replies .comment-reply { margin-bottom: 0; }
1734 .reply-form { margin-top: var(--space-2); }
1735 .comment-textarea { width: 100%; font-family: var(--font-sans); font-size: var(--font-size-sm); }
1736 .comment-form-actions { display: flex; gap: var(--space-2); margin-top: var(--space-1); }
1737
1738 /* ── Comment block — Proposal style (proposal_detail) ───────────────────── */
1739 .comment-block {
1740 border: 1px solid var(--border-default);
1741 border-radius: 6px;
1742 overflow: hidden;
1743 margin-bottom: var(--space-3);
1744 }
1745 .comment-header-row {
1746 display: flex;
1747 align-items: center;
1748 gap: var(--space-2);
1749 padding: var(--space-2) var(--space-3);
1750 background: var(--bg-surface);
1751 border-bottom: 1px solid var(--border-default);
1752 font-size: 13px;
1753 }
1754 .comment-body-text {
1755 padding: var(--space-3);
1756 font-size: 13px;
1757 color: var(--text-primary);
1758 white-space: pre-wrap;
1759 word-break: break-word;
1760 }
1761
1762 /* ── Diff stats (proposal_detail) ───────────────────────────────────────── */
1763 .diff-stat { display: flex; gap: var(--space-3); font-size: 13px; flex-wrap: wrap; }
1764 .diff-stat-additions { color: var(--color-success, #3fb950); font-weight: 600; }
1765 .diff-stat-deletions { color: var(--color-danger, #f85149); font-weight: 600; }
1766 .diff-stat-files { color: var(--text-muted); }
1767
1768 /* ── Explore filter chip (explore, used in several sidebars) ────────────── */
1769 .filter-chip {
1770 display: inline-block;
1771 font-family: var(--font-mono);
1772 font-size: 11px;
1773 padding: 3px 10px;
1774 border-radius: var(--radius-full);
1775 background: var(--bg-overlay);
1776 color: var(--text-secondary);
1777 border: 1px solid var(--border-default);
1778 cursor: pointer;
1779 margin: 2px 3px 2px 0;
1780 text-decoration: none;
1781 transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
1782 }
1783 .filter-chip:hover { background: var(--bg-hover, var(--bg-overlay)); color: var(--text-primary); text-decoration: none; }
1784 .filter-chip.active {
1785 background: rgba(79, 142, 247, 0.12);
1786 color: var(--color-accent);
1787 border-color: rgba(79, 142, 247, 0.4);
1788 }
1789
1790 // ── Label chip — used by the label_chip macro across all issue pages ──────────
1791 .label-chip {
1792 display: inline-flex;
1793 align-items: center;
1794 gap: 5px;
1795 padding: 2px 8px;
1796 border-radius: var(--radius-full);
1797 border: 1px solid;
1798 font-size: 11px;
1799 font-weight: 500;
1800 letter-spacing: 0.02em;
1801 text-decoration: none;
1802 white-space: nowrap;
1803 transition: filter 0.12s;
1804
1805 &:hover {
1806 filter: brightness(1.15);
1807 text-decoration: none;
1808 }
1809
1810 &--active {
1811 box-shadow: 0 0 0 2px currentColor;
1812 }
1813 }
1814
1815 .label-dot {
1816 width: 7px;
1817 height: 7px;
1818 border-radius: 50%;
1819 flex-shrink: 0;
1820 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago