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