gabriel / musehub public
_components.scss
675 lines 21.3 KB
Raw
sha256:bb2baaabdd19320bde50cb69d447fd1c1e571467df729be1a23b5e93064b046a feat(intel): standardize headers, gauge icon, velocity card… Sonnet 4.6 minor ⚠ breaking 144 days ago
1 /*
2 * MuseHub — Base reset, typography, and unmigrated component patterns.
3 *
4 * Buttons, badges, pills, chips, cards, inputs, canvas, avatars, code,
5 * timeline, nav, toasts, spectral, surfaces, and agents now live in
6 * src/scss/components/ and src/scss/patterns/.
7 *
8 * This file keeps: base reset, body, headings, links, artifact-card,
9 * repo-card, table, grids, heatmap, stat-card, comment thread, reactions,
10 * analysis-grid, stat-cell, diff-stat, and misc utilities.
11 */
12
13 /* ── Base reset ─────────────────────────────────────────────────────────── */
14 *,
15 *::before,
16 *::after {
17 box-sizing: border-box;
18 margin: 0;
19 padding: 0;
20 }
21
22 html {
23 -webkit-text-size-adjust: 100%;
24 }
25
26 body {
27 font-family: var(--font-sans);
28 font-size: var(--text-base);
29 line-height: var(--line-height-normal);
30 background-color: var(--bg-base);
31 color: var(--text-secondary);
32 min-height: 100vh;
33 }
34
35 /* ── Links ──────────────────────────────────────────────────────────────── */
36 a {
37 color: var(--color-accent-link);
38 text-decoration: none;
39 }
40
41 a:hover { text-decoration: none; }
42
43 /* ── Headings ───────────────────────────────────────────────────────────── */
44 h1 {
45 font-size: var(--text-2xl);
46 font-weight: var(--weight-bold);
47 letter-spacing: -0.03em;
48 line-height: 1.15;
49 color: var(--text-primary);
50 margin-bottom: var(--space-4);
51 }
52
53 h2 {
54 font-size: var(--text-xl);
55 font-weight: var(--weight-semibold);
56 letter-spacing: -0.02em;
57 line-height: 1.25;
58 color: var(--text-primary);
59 margin-bottom: var(--space-3);
60 }
61
62 h3 {
63 font-size: var(--text-lg);
64 font-weight: var(--weight-semibold);
65 letter-spacing: -0.01em;
66 line-height: 1.3;
67 color: var(--text-primary);
68 margin-bottom: var(--space-2);
69 }
70
71 h4 {
72 font-size: var(--text-md);
73 font-weight: var(--weight-semibold);
74 line-height: 1.4;
75 color: var(--text-primary);
76 margin-bottom: var(--space-2);
77 }
78
79 h5 {
80 font-size: var(--text-base);
81 font-weight: var(--weight-semibold);
82 line-height: 1.4;
83 color: var(--text-primary);
84 margin-bottom: var(--space-1);
85 }
86
87 h6 {
88 font-size: var(--text-sm);
89 font-weight: var(--weight-semibold);
90 line-height: 1.4;
91 color: var(--text-secondary);
92 text-transform: uppercase;
93 letter-spacing: 0.06em;
94 margin-bottom: var(--space-1);
95 }
96
97 /* ── Body copy ──────────────────────────────────────────────────────────── */
98 p {
99 font-size: var(--text-base);
100 line-height: var(--line-height-relaxed);
101 color: var(--text-secondary);
102 margin-bottom: var(--space-3);
103
104 &:last-child { margin-bottom: 0; }
105 }
106
107 strong, b { font-weight: var(--weight-semibold); color: var(--text-primary); }
108 em, i { font-style: italic; }
109 small { font-size: var(--text-xs); color: var(--text-muted); }
110
111 blockquote {
112 border-left: 3px solid var(--border-strong);
113 padding: var(--space-2) var(--space-4);
114 margin: var(--space-4) 0;
115 color: var(--text-muted);
116 font-style: italic;
117 background: var(--bg-surface);
118 border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
119 }
120
121 hr {
122 border: none;
123 border-top: 1px solid var(--border-subtle);
124 margin: var(--space-6) 0;
125 }
126
127 /* ── Lists ──────────────────────────────────────────────────────────────── */
128 ul, ol {
129 padding-left: var(--space-5);
130 margin-bottom: var(--space-3);
131 color: var(--text-secondary);
132
133 &:last-child { margin-bottom: 0; }
134 }
135
136 li {
137 font-size: var(--text-base);
138 line-height: var(--line-height-relaxed);
139 margin-bottom: var(--space-1);
140
141 &:last-child { margin-bottom: 0; }
142 }
143
144 ul { list-style-type: disc; }
145 ol { list-style-type: decimal; }
146
147 /* ── Tables ─────────────────────────────────────────────────────────────── */
148 table {
149 width: 100%;
150 border-collapse: collapse;
151 font-size: var(--text-sm);
152 color: var(--text-secondary);
153 }
154
155 thead tr {
156 border-bottom: 1px solid var(--border-default);
157 }
158
159 th {
160 text-align: left;
161 font-size: var(--text-xs);
162 font-weight: var(--weight-semibold);
163 color: var(--text-muted);
164 text-transform: uppercase;
165 letter-spacing: 0.06em;
166 padding: var(--space-2) var(--space-3);
167 }
168
169 td {
170 padding: var(--space-2) var(--space-3);
171 border-bottom: 1px solid var(--border-subtle);
172 vertical-align: middle;
173 }
174
175 tbody tr:last-child td { border-bottom: none; }
176 tbody tr:hover td { background: var(--bg-overlay); }
177
178 /* ── Details / Summary ──────────────────────────────────────────────────── */
179 details {
180 border: 1px solid var(--border-subtle);
181 border-radius: var(--radius-sm);
182 padding: var(--space-3);
183 }
184
185 summary {
186 font-size: var(--text-sm);
187 font-weight: var(--weight-medium);
188 color: var(--text-secondary);
189 cursor: pointer;
190 list-style: none;
191
192 &::-webkit-details-marker { display: none; }
193 &:hover { color: var(--text-primary); }
194 }
195
196 /* ── Utilities ──────────────────────────────────────────────────────────── */
197 .text-muted { color: var(--text-muted); }
198 .text-secondary { color: var(--text-secondary); }
199
200 // Meta row — inline icon + label items in a horizontal strip
201 .meta-row { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; margin-bottom: var(--space-2); }
202 .meta-item { display: inline-flex; align-items: center; gap: 5px; font-size: var(--text-sm); color: var(--text-muted); }
203
204 // Identity sigil (square avatar SVG)
205 .sigil-wrap { flex-shrink: 0; align-self: flex-start; margin-top: 4px; }
206 .sigil { display: block; border-radius: 14px; transition: box-shadow 0.2s; }
207
208 // Avatar circle
209 .avatar {
210 display: inline-flex;
211 align-items: center;
212 justify-content: center;
213 border-radius: 50%;
214 font-weight: var(--weight-bold);
215 text-transform: uppercase;
216 flex-shrink: 0;
217 background: var(--bg-overlay);
218 color: var(--text-primary);
219
220 &--xs { width: 24px; height: 24px; font-size: 10px; }
221 &--sm { width: 32px; height: 32px; font-size: 12px; }
222 &--md { width: 40px; height: 40px; font-size: 16px; }
223 }
224
225 /* ── Artifact card ──────────────────────────────────────────────────────── */
226 .artifact-card {
227 background: var(--bg-overlay);
228 border: 1px solid var(--border-default);
229 border-radius: var(--radius-base);
230 padding: 10px;
231 display: flex;
232 flex-direction: column;
233 gap: var(--space-2);
234
235 img { width: 100%; border-radius: var(--radius-sm); border: 1px solid var(--border-default); }
236 audio { width: 100%; }
237
238 .path {
239 font-size: var(--text-sm);
240 color: var(--text-muted);
241 word-break: break-all;
242 }
243 }
244
245 .artifact-grid {
246 display: grid;
247 grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
248 gap: var(--space-3);
249 margin-top: var(--space-3);
250 }
251
252 /* ── Repo grid + repo card ──────────────────────────────────────────────── */
253 .repo-grid {
254 display: grid;
255 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
256 gap: 12px;
257 }
258
259 .repo-card {
260 position: relative;
261 background: transparent;
262 border: 1px solid var(--border-subtle);
263 border-radius: var(--radius-sm);
264 padding: var(--space-3);
265 cursor: pointer;
266 transition: border-color var(--transition-fast), background var(--transition-fast);
267 text-decoration: none;
268 display: flex;
269 flex-direction: column;
270 gap: var(--space-2);
271 color: inherit;
272
273 &:hover {
274 border-color: var(--border-default);
275 background: color-mix(in srgb, var(--text-primary) 2%, transparent);
276 text-decoration: none;
277 color: inherit;
278 }
279 }
280
281 .repo-card__header { display: flex; align-items: center; justify-content: space-between; }
282
283 .repo-card__name {
284 font-weight: var(--weight-semibold);
285 font-size: var(--text-sm);
286 color: var(--text-primary);
287 letter-spacing: -0.01em;
288 }
289
290 .repo-card__sep { color: var(--text-muted); font-weight: var(--weight-normal); margin: 0 1px; }
291
292 .repo-card__desc {
293 font-size: var(--text-xs);
294 color: var(--text-muted);
295 line-height: var(--line-height-relaxed);
296 margin: 0;
297 display: -webkit-box;
298 -webkit-line-clamp: 2;
299 -webkit-box-orient: vertical;
300 overflow: hidden;
301 }
302
303 .repo-card__pills { display: flex; gap: 5px; flex-wrap: wrap; margin-top: var(--space-1); }
304
305 .repo-meta-pill {
306 display: inline-flex;
307 align-items: center;
308 gap: 3px;
309 font-family: var(--font-mono);
310 font-size: 11px;
311 padding: 2px 8px;
312 border-radius: var(--radius-full);
313 background: var(--bg-overlay);
314 color: var(--text-muted);
315 border: 1px solid var(--border-subtle);
316 }
317
318 .tag-pill {
319 display: inline-block;
320 font-size: 11px;
321 padding: 1px 7px;
322 border-radius: var(--radius-full);
323 background: var(--bg-overlay);
324 border: 1px solid var(--border-subtle);
325 color: var(--text-muted);
326 font-family: var(--font-mono);
327
328 &--more { opacity: 0.6; }
329 }
330
331 .repo-card__footer {
332 display: flex;
333 align-items: center;
334 gap: var(--space-4);
335 margin-top: auto;
336 padding-top: var(--space-2);
337 border-top: 1px solid var(--border-subtle);
338 }
339
340 .repo-card__stat {
341 display: inline-flex;
342 align-items: center;
343 gap: 4px;
344 font-size: var(--text-xs);
345 color: var(--text-muted);
346
347 svg { opacity: 0.7; }
348 }
349
350 /* ── Table ──────────────────────────────────────────────────────────────── */
351 .table {
352 width: 100%;
353 border-collapse: collapse;
354 font-size: var(--text-base);
355 }
356
357 .table th {
358 text-align: left;
359 padding: var(--space-2) var(--space-3);
360 font-size: var(--text-xs);
361 font-weight: var(--weight-semibold);
362 color: var(--text-muted);
363 text-transform: uppercase;
364 letter-spacing: 0.5px;
365 border-bottom: 1px solid var(--border-default);
366 }
367
368 .table td {
369 padding: var(--space-2) var(--space-3);
370 border-bottom: 1px solid var(--border-subtle);
371 color: var(--text-secondary);
372 vertical-align: top;
373 }
374
375 .table tr:last-child td { border-bottom: none; }
376 .table tr:hover td { background: var(--bg-overlay); }
377
378 /* ── Grids ──────────────────────────────────────────────────────────────── */
379 .grid-auto { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--space-3); }
380 .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); }
381 .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--space-3); }
382
383 /* ── Metadata rows ──────────────────────────────────────────────────────── */
384 .meta-row { display: flex; gap: var(--space-6); flex-wrap: wrap; margin-bottom: var(--space-3); }
385 .meta-item { display: flex; flex-direction: column; gap: var(--space-1); }
386 .meta-label {
387 font-size: var(--text-xs);
388 color: var(--text-muted);
389 text-transform: uppercase;
390 letter-spacing: 0.5px;
391 }
392 .meta-value { font-size: var(--text-base); color: var(--text-primary); }
393
394 /* ── Heatmap (legacy — use .prof-canvas for activity canvas) ────────────── */
395 .heatmap-grid { display: flex; gap: 3px; overflow-x: auto; }
396 .heatmap-week { display: flex; flex-direction: column; gap: 3px; }
397 .heatmap-day { width: 12px; height: 12px; border-radius: 2px; background: var(--bg-overlay); }
398
399 .heatmap-day[data-count="0"] { background: var(--bg-overlay); }
400 .heatmap-day[data-count="1"] { background: var(--dim-rhythmic-muted); }
401 .heatmap-day[data-count="2"] { background: var(--dim-rhythmic); opacity: 0.6; }
402 .heatmap-day[data-count="3"] { background: var(--dim-rhythmic); }
403 .heatmap-day[data-count="4"] { background: var(--color-success); }
404
405 /* ── Insights grid / stat card ──────────────────────────────────────────── */
406 .insights-grid {
407 display: grid;
408 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
409 gap: var(--space-4);
410 margin-bottom: var(--space-4);
411 }
412
413 .stat-card {
414 background: var(--bg-surface);
415 border: 1px solid var(--border-default);
416 border-radius: var(--radius-base);
417 padding: var(--space-4);
418 text-align: center;
419
420 .stat-value {
421 font-family: var(--font-mono);
422 font-size: var(--text-2xl);
423 font-weight: var(--weight-bold);
424 color: var(--color-accent);
425 display: block;
426 line-height: 1.1;
427 }
428
429 .stat-label {
430 font-size: var(--text-sm);
431 color: var(--text-muted);
432 margin-top: var(--space-1);
433 }
434 }
435
436 /* ── Stat cell (Muse protocol strip) ────────────────────────────────────── */
437 .stat-cell-muse {
438 display: flex;
439 flex-direction: column;
440 align-items: center;
441 justify-content: center;
442 padding: var(--space-4) var(--space-5);
443 border: 1px solid var(--border-default);
444 border-radius: var(--radius-base);
445 text-align: center;
446 background: var(--bg-surface);
447 }
448
449 .stat-num-muse {
450 font-family: var(--font-mono);
451 font-size: 26px;
452 font-weight: var(--weight-bold);
453 color: var(--color-accent);
454 line-height: 1.1;
455 display: block;
456 }
457
458 .stat-lbl-muse {
459 font-size: 11px;
460 color: var(--text-muted);
461 margin-top: var(--space-1);
462 line-height: 1.3;
463 }
464
465 /* ── Comment thread ─────────────────────────────────────────────────────── */
466 .comment-thread {
467 border-top: 1px solid var(--border-subtle);
468 margin-top: var(--space-4);
469 padding-top: var(--space-4);
470 margin-bottom: var(--space-4);
471
472 &:last-child { margin-bottom: 0; }
473 }
474
475 .comment-row { display: flex; gap: var(--space-3); align-items: flex-start; }
476 .comment-reply-row { margin-top: var(--space-3); }
477
478 .comment-body-col { flex: 1; min-width: 0; }
479
480 .comment-meta { display: flex; align-items: baseline; gap: var(--space-2); margin-bottom: var(--space-1); }
481 .comment-author { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-primary); }
482 .comment-ts { font-size: var(--text-xs); color: var(--text-muted); }
483 .comment-date { font-size: var(--text-xs); color: var(--text-muted); margin-left: auto; }
484
485 .comment-text,
486 .comment-body {
487 font-size: var(--text-sm);
488 color: var(--text-secondary);
489 white-space: pre-wrap;
490 word-break: break-word;
491 line-height: 1.6;
492 margin-bottom: 6px;
493 }
494
495 .comment-actions { display: flex; gap: var(--space-1); margin-top: var(--space-1); }
496 .comment-delete-btn { color: var(--color-danger); }
497
498 .comment-replies {
499 margin-top: var(--space-3);
500 padding-left: var(--space-4);
501 border-left: 2px solid var(--border-subtle);
502 display: flex;
503 flex-direction: column;
504 gap: var(--space-3);
505 }
506
507 .comment-replies .comment-reply { margin-bottom: 0; }
508
509 .reply-form { margin-top: var(--space-2); }
510 .comment-textarea { width: 100%; font-family: var(--font-sans); font-size: var(--text-sm); }
511 .comment-form-actions { display: flex; gap: var(--space-2); margin-top: var(--space-1); }
512
513 /* ── Reactions ──────────────────────────────────────────────────────────── */
514 .reaction-bar {
515 display: flex;
516 flex-wrap: wrap;
517 gap: 6px;
518 padding: var(--space-3) 0;
519 }
520
521 .reaction-btn {
522 display: inline-flex;
523 align-items: center;
524 gap: 4px;
525 padding: 4px 10px;
526 border: 1px solid var(--border-subtle);
527 border-radius: 20px;
528 background: var(--bg-overlay);
529 color: var(--text-primary);
530 font-size: 16px;
531 cursor: pointer;
532 transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
533 line-height: 1;
534 user-select: none;
535
536 &:hover {
537 background: var(--bg-hover);
538 border-color: var(--color-accent);
539 transform: scale(1.08);
540 }
541
542 &.active,
543 &--active {
544 background: color-mix(in srgb, var(--color-accent) 15%, transparent);
545 border-color: var(--color-accent);
546 }
547 }
548
549 .reaction-count {
550 font-size: 12px;
551 font-weight: var(--weight-semibold);
552 color: var(--text-secondary);
553 min-width: 12px;
554 }
555
556 .reaction-btn--active .reaction-count { color: var(--color-accent); }
557
558 /* ── Follow button ──────────────────────────────────────────────────────── */
559 .follow-btn {
560 background: var(--bg-overlay);
561 border: 1px solid var(--border-default);
562 border-radius: var(--radius-base);
563 padding: 5px var(--space-4);
564 cursor: pointer;
565 font-size: var(--text-sm);
566 color: var(--text-secondary);
567 transition: background var(--transition-fast), border-color var(--transition-fast);
568
569 &.following {
570 background: var(--color-success-bg);
571 border-color: var(--color-success-bg);
572 color: #fff;
573 }
574 }
575
576 /* ── Analysis grid ──────────────────────────────────────────────────────── */
577 .analysis-grid {
578 display: grid;
579 grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
580 gap: 14px;
581 margin-top: 4px;
582 }
583
584 .analysis-card {
585 background: var(--bg-surface);
586 border: 1px solid var(--border-default);
587 border-radius: var(--radius-md);
588 padding: var(--space-4);
589 display: flex;
590 flex-direction: column;
591 gap: 6px;
592 transition: border-color var(--transition-fast), background var(--transition-fast);
593 color: inherit;
594 text-decoration: none;
595
596 &:hover { border-color: var(--color-accent); text-decoration: none; }
597 }
598
599 .card-emoji { font-size: 22px; }
600 .card-dim { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.6px; }
601 .card-metric { font-size: 18px; font-weight: var(--weight-bold); color: var(--text-primary); word-break: break-word; }
602 .card-sub { font-size: 12px; color: var(--text-muted); }
603 .card-spark { font-size: 14px; color: var(--color-success); letter-spacing: 1px; margin-top: 2px; }
604
605 /* ── Waveform placeholder ───────────────────────────────────────────────── */
606 .waveform-bar {
607 display: flex;
608 align-items: flex-end;
609 gap: 2px;
610 height: 48px;
611 overflow: hidden;
612
613 .wave-col {
614 flex: 1;
615 background: var(--color-accent);
616 opacity: 0.6;
617 border-radius: 2px 2px 0 0;
618 min-height: 4px;
619 transition: height 0.1s;
620 }
621 }
622
623 /* ── Diff stats ─────────────────────────────────────────────────────────── */
624 .diff-stat { display: flex; gap: var(--space-3); font-size: 13px; flex-wrap: wrap; }
625 .diff-stat-additions { color: var(--color-success); font-weight: var(--weight-semibold); }
626 .diff-stat-deletions { color: var(--color-danger); font-weight: var(--weight-semibold); }
627 .diff-stat-files { color: var(--text-muted); }
628
629 /* ── Issue preview ──────────────────────────────────────────────────────── */
630 .issue-preview {
631 font-size: var(--text-sm);
632 color: var(--text-muted);
633 margin-top: 2px;
634 white-space: nowrap;
635 overflow: hidden;
636 text-overflow: ellipsis;
637 }
638
639 /* ── Label / pill utilities ─────────────────────────────────────────────── */
640 .label {
641 display: inline-block;
642 padding: 1px var(--space-2);
643 border-radius: var(--radius-full);
644 font-size: var(--text-xs);
645 background: var(--bg-hover);
646 color: var(--text-secondary);
647 margin: 2px;
648 }
649
650 .label-pill { transition: opacity var(--transition-fast), outline var(--transition-fast); }
651 .label-pill:hover { opacity: 0.8; outline: 1px solid var(--color-accent); }
652 .label-active {
653 outline: 2px solid var(--color-accent);
654 background: color-mix(in srgb, var(--color-accent) 15%, var(--bg-hover));
655 color: var(--color-accent);
656 }
657
658 /* ── HTMX indicator ─────────────────────────────────────────────────────── */
659 .htmx-indicator { opacity: 0; transition: opacity 0.2s ease; }
660 .htmx-request .htmx-indicator,
661 .htmx-request.htmx-indicator { opacity: 1; }
662
663 /* ── Session notes preview ──────────────────────────────────────────────── */
664 .session-notes-preview {
665 font-size: 12px;
666 color: var(--text-muted);
667 margin-top: 3px;
668 white-space: nowrap;
669 overflow: hidden;
670 text-overflow: ellipsis;
671 max-width: 600px;
672 font-style: italic;
673 }
674
675 .session-row-participants { margin-top: 6px; }
File History 1 commit
sha256:bb2baaabdd19320bde50cb69d447fd1c1e571467df729be1a23b5e93064b046a feat(intel): standardize headers, gauge icon, velocity card… Sonnet 4.6 minor ⚠ 144 days ago