gabriel / musehub public
_domain.scss
1,006 lines 30.6 KB
Raw
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2 feat: add repair-commit wire endpoint (API parity with repa… Opus 4.8 minor ⚠ breaking 1 day ago
1 /*
2 * MuseHub Domain-Agnostic Visual Components
3 *
4 * This file supersedes _music.scss. All visual components for multidimensional
5 * state are defined here in a domain-agnostic way. Domain-specific styles
6 * (MIDI piano roll, Code symbol graph, etc.) are scoped under
7 * [data-domain="<slug>"] so they only apply when the relevant domain is active.
8 *
9 * Structure:
10 * 1. Generic dimension components (radar, diff heatmap, dimension strip)
11 * 2. Domain badge
12 * 3. Agent badge
13 * 4. [data-domain="midi"] — MIDI-specific overrides (piano roll, waveform)
14 * 5. [data-domain="code"] — Code-specific overrides (symbol graph, file tree)
15 * 6. Profile / contributor / repo grid (shared by all domains)
16 * 7. Audio player (iap-*) — legacy MIDI feature, scoped under data-domain="midi"
17 * 8. Shared infrastructure (session live-dot, responsive)
18 */
19
20 /* ============================================================================
21 * 1. GENERIC DIMENSION COMPONENTS
22 * ============================================================================ */
23
24 /* ── Radar / spider chart ───────────────────────────────────────────────────
25 Rendered as an SVG inside <svg class="radar-chart">. Dimension colors are
26 resolved from the generic --dim-a … --dim-e tokens so any domain can reuse
27 this chart without MIDI-specific class names.
28 */
29 .radar-chart { overflow: visible; }
30
31 .radar-axis {
32 stroke: var(--border-default);
33 stroke-width: 1;
34 }
35
36 .radar-polygon {
37 fill-opacity: 0.15;
38 stroke-width: 2;
39 }
40
41 /* Generic slot classes — domain-neutral */
42 .radar-polygon-dim-a { stroke: var(--dim-a); fill: var(--dim-a); }
43 .radar-polygon-dim-b { stroke: var(--dim-b); fill: var(--dim-b); }
44 .radar-polygon-dim-c { stroke: var(--dim-c); fill: var(--dim-c); }
45 .radar-polygon-dim-d { stroke: var(--dim-d); fill: var(--dim-d); }
46 .radar-polygon-dim-e { stroke: var(--dim-e); fill: var(--dim-e); }
47
48 /* MIDI backward-compat aliases (deprecated — prefer -dim-a … -dim-e) */
49 .radar-polygon-harmonic { stroke: var(--dim-a); fill: var(--dim-a); }
50 .radar-polygon-rhythmic { stroke: var(--dim-b); fill: var(--dim-b); }
51 .radar-polygon-melodic { stroke: var(--dim-c); fill: var(--dim-c); }
52 .radar-polygon-structural { stroke: var(--dim-d); fill: var(--dim-d); }
53 .radar-polygon-dynamic { stroke: var(--dim-e); fill: var(--dim-e); }
54
55 .radar-label {
56 fill: var(--text-muted);
57 font-size: 11px;
58 font-family: var(--font-sans);
59 }
60
61 /* ── Diff heatmap ───────────────────────────────────────────────────────────
62 Visual summary of how much each dimension changed between commits.
63 */
64 .diff-heatmap {
65 display: flex;
66 flex-direction: column;
67 gap: var(--space-2);
68 padding: var(--space-3);
69 background: var(--bg-surface);
70 border: 1px solid var(--border-default);
71 border-radius: var(--radius-base);
72 }
73
74 .diff-dim-row {
75 display: flex;
76 align-items: center;
77 gap: var(--space-3);
78 }
79
80 .diff-dim-label {
81 width: 90px;
82 font-size: var(--text-xs);
83 color: var(--text-muted);
84 text-transform: capitalize;
85 flex-shrink: 0;
86 }
87
88 .diff-dim-bar-wrap {
89 flex: 1;
90 height: 8px;
91 background: var(--bg-overlay);
92 border-radius: var(--radius-full);
93 overflow: hidden;
94 }
95
96 .diff-dim-bar {
97 height: 100%;
98 border-radius: var(--radius-full);
99 transition: width var(--transition-slow);
100 }
101
102 /* Generic slot bars */
103 .diff-dim-bar-dim-a { background: var(--dim-a); }
104 .diff-dim-bar-dim-b { background: var(--dim-b); }
105 .diff-dim-bar-dim-c { background: var(--dim-c); }
106 .diff-dim-bar-dim-d { background: var(--dim-d); }
107 .diff-dim-bar-dim-e { background: var(--dim-e); }
108
109 /* MIDI backward-compat aliases */
110 .diff-dim-bar-harmonic { background: var(--dim-a); }
111 .diff-dim-bar-rhythmic { background: var(--dim-b); }
112 .diff-dim-bar-melodic { background: var(--dim-c); }
113 .diff-dim-bar-structural { background: var(--dim-d); }
114 .diff-dim-bar-dynamic { background: var(--dim-e); }
115
116 .diff-dim-value {
117 font-size: var(--text-xs);
118 color: var(--text-muted);
119 font-family: var(--font-mono);
120 width: 40px;
121 text-align: right;
122 flex-shrink: 0;
123 }
124
125 /* ── Dimension navigation strip ─────────────────────────────────────────────
126 Horizontal strip of dimension tabs shown in the universal viewer and
127 insights pages. Domain-neutral; labels are rendered from data attributes.
128 */
129 .dim-strip {
130 display: flex;
131 gap: var(--space-1);
132 overflow-x: auto;
133 padding-bottom: var(--space-1);
134 scrollbar-width: none;
135 }
136 .dim-strip::-webkit-scrollbar { display: none; }
137
138 .dim-strip-item {
139 display: flex;
140 align-items: center;
141 gap: var(--space-2);
142 padding: var(--space-1) var(--space-3);
143 border-radius: var(--radius-full);
144 font-size: var(--text-sm);
145 font-weight: var(--weight-medium);
146 color: var(--text-muted);
147 background: var(--bg-overlay);
148 border: 1px solid var(--border-subtle);
149 cursor: pointer;
150 white-space: nowrap;
151 transition: color var(--transition-fast), border-color var(--transition-fast);
152 text-decoration: none;
153 }
154
155 .dim-strip-item:hover {
156 color: var(--text-primary);
157 border-color: var(--border-default);
158 }
159
160 .dim-strip-item.is-active {
161 color: var(--color-accent);
162 border-color: var(--color-accent-muted);
163 background: color-mix(in srgb, var(--color-accent) 8%, transparent);
164 }
165
166 .dim-strip-dot {
167 width: 8px;
168 height: 8px;
169 border-radius: 50%;
170 flex-shrink: 0;
171 }
172
173 /* ============================================================================
174 * 2. DOMAIN BADGE
175 * ============================================================================ */
176
177 /* The @author/slug pill shown on repo cards, repo headers, and the domain browser */
178 .domain-badge {
179 display: inline-flex;
180 align-items: center;
181 gap: var(--space-1);
182 padding: 2px var(--space-2);
183 background: var(--domain-badge-bg);
184 color: var(--domain-badge-text);
185 border: 1px solid var(--domain-badge-border);
186 border-radius: var(--radius-full);
187 font-size: var(--text-xs);
188 font-family: var(--font-mono);
189 font-weight: var(--weight-medium);
190 text-decoration: none;
191 white-space: nowrap;
192 transition: background var(--transition-fast), border-color var(--transition-fast);
193 }
194
195 .domain-badge:hover {
196 background: color-mix(in srgb, var(--domain-badge-text) 12%, transparent);
197 border-color: var(--domain-badge-text);
198 }
199
200 /* ============================================================================
201 * 3. AGENT BADGE
202 * ============================================================================ */
203
204 /* "agent" badge displayed beside agent-authored events in the activity feed */
205 .agent-badge {
206 display: inline-flex;
207 align-items: center;
208 gap: var(--space-1);
209 padding: 1px var(--space-2);
210 background: var(--agent-accent-bg);
211 color: var(--agent-accent);
212 border: 1px solid color-mix(in srgb, var(--agent-accent) 40%, transparent);
213 border-radius: var(--radius-full);
214 font-size: 10px;
215 font-weight: var(--weight-semibold);
216 letter-spacing: 0.04em;
217 text-transform: uppercase;
218 vertical-align: middle;
219 white-space: nowrap;
220 }
221
222 .agent-badge::before {
223 content: '';
224 display: inline-block;
225 width: 6px;
226 height: 6px;
227 border-radius: 50%;
228 background: var(--agent-accent);
229 flex-shrink: 0;
230 }
231
232 /* Agent-authored commit row / event row tint */
233 .event-row[data-agent="true"] {
234 padding-left: var(--space-3);
235 }
236
237 /* ============================================================================
238 * 4. [data-domain="midi"] — MIDI piano roll, waveform, and related
239 * ============================================================================ */
240
241
242 /* Piano roll — only visible when viewing a MIDI-domain repo */
243 [data-domain="midi"] .piano-roll {
244 --piano-roll-rows: 12;
245 --piano-roll-cell-h: 12px;
246 --piano-roll-cell-w: 6px;
247 overflow: auto;
248 background: var(--bg-base);
249 border: 1px solid var(--border-default);
250 border-radius: var(--radius-base);
251 padding: var(--space-2);
252 }
253
254 [data-domain="midi"] .piano-roll-grid {
255 display: grid;
256 grid-template-rows: repeat(var(--piano-roll-rows), var(--piano-roll-cell-h));
257 gap: 1px;
258 min-width: max-content;
259 }
260
261 [data-domain="midi"] .piano-roll-lane {
262 display: flex;
263 gap: 1px;
264 align-items: center;
265 }
266
267 [data-domain="midi"] .piano-roll-lane.is-black {
268 background: rgba(255, 255, 255, 0.03);
269 }
270
271 [data-domain="midi"] .piano-roll-note {
272 height: var(--piano-roll-cell-h);
273 border-radius: 2px;
274 opacity: 0.85;
275 min-width: var(--piano-roll-cell-w);
276 }
277
278 [data-domain="midi"] .piano-roll-note[data-track="0"] { background: var(--track-0); }
279 [data-domain="midi"] .piano-roll-note[data-track="1"] { background: var(--track-1); }
280 [data-domain="midi"] .piano-roll-note[data-track="2"] { background: var(--track-2); }
281 [data-domain="midi"] .piano-roll-note[data-track="3"] { background: var(--track-3); }
282 [data-domain="midi"] .piano-roll-note[data-track="4"] { background: var(--track-4); }
283 [data-domain="midi"] .piano-roll-note[data-track="5"] { background: var(--track-5); }
284 [data-domain="midi"] .piano-roll-note[data-track="6"] { background: var(--track-6); }
285 [data-domain="midi"] .piano-roll-note[data-track="7"] { background: var(--track-7); }
286
287 [data-domain="midi"] .piano-roll-labels {
288 display: flex;
289 flex-direction: column;
290 gap: 1px;
291 margin-right: var(--space-2);
292 flex-shrink: 0;
293 }
294
295 [data-domain="midi"] .piano-roll-label {
296 height: var(--piano-roll-cell-h);
297 font-size: 9px;
298 font-family: var(--font-mono);
299 color: var(--text-muted);
300 display: flex;
301 align-items: center;
302 width: 20px;
303 }
304
305 /* Waveform — MIDI domain ships audio artifacts */
306 [data-domain="midi"] .waveform {
307 position: relative;
308 background: var(--bg-base);
309 border: 1px solid var(--border-default);
310 border-radius: var(--radius-base);
311 overflow: hidden;
312 height: 64px;
313 }
314
315 [data-domain="midi"] .waveform canvas {
316 display: block;
317 width: 100%;
318 height: 100%;
319 }
320
321 [data-domain="midi"] .waveform-playhead {
322 position: absolute;
323 top: 0;
324 bottom: 0;
325 width: 2px;
326 background: var(--color-orange);
327 pointer-events: none;
328 }
329
330 /* Inline Audio Player — MIDI domain only */
331 [data-domain="midi"] .iap-card {
332 border-color: var(--color-accent-muted, #1f6feb);
333 background: linear-gradient(135deg, var(--bg-base) 0%, var(--bg-surface) 100%);
334 }
335
336 [data-domain="midi"] .iap-title {
337 font-size: var(--text-base);
338 font-weight: var(--weight-semibold);
339 color: var(--text-primary);
340 margin-bottom: var(--space-3);
341 white-space: nowrap;
342 overflow: hidden;
343 text-overflow: ellipsis;
344 }
345
346 [data-domain="midi"] .iap-waveform-wrap {
347 min-height: 72px;
348 border-radius: var(--radius-sm);
349 background: var(--bg-base);
350 border: 1px solid var(--border-subtle);
351 margin-bottom: var(--space-3);
352 overflow: hidden;
353 display: flex;
354 align-items: center;
355 justify-content: center;
356 }
357
358 [data-domain="midi"] .iap-waveform-placeholder {
359 color: var(--text-muted);
360 font-size: var(--text-sm);
361 padding: var(--space-3);
362 }
363
364 [data-domain="midi"] .iap-controls { display: flex; align-items: center; gap: var(--space-3); }
365
366 [data-domain="midi"] .iap-play-btn {
367 width: 40px;
368 height: 40px;
369 border-radius: 50%;
370 background: var(--color-accent-muted, #1f6feb);
371 border: none;
372 color: #fff;
373 font-size: 16px;
374 cursor: pointer;
375 display: flex;
376 align-items: center;
377 justify-content: center;
378 flex-shrink: 0;
379 transition: background 0.15s, transform 0.1s;
380 }
381
382 [data-domain="midi"] .iap-play-btn:hover {
383 background: var(--color-accent, var(--color-accent));
384 transform: scale(1.05);
385 }
386
387 [data-domain="midi"] .iap-progress-bar {
388 height: 6px;
389 background: var(--bg-overlay);
390 border-radius: 3px;
391 cursor: pointer;
392 position: relative;
393 margin-bottom: 4px;
394 flex: 1;
395 }
396
397 [data-domain="midi"] .iap-progress-fill {
398 height: 100%;
399 background: var(--color-accent-muted, #1f6feb);
400 border-radius: 3px;
401 width: 0%;
402 pointer-events: none;
403 transition: width 0.1s linear;
404 }
405
406 [data-domain="midi"] .iap-time-row {
407 display: flex;
408 justify-content: space-between;
409 font-size: 11px;
410 color: var(--text-muted);
411 font-variant-numeric: tabular-nums;
412 }
413
414 [data-domain="midi"] .iap-volume-wrap {
415 display: flex;
416 align-items: center;
417 gap: var(--space-1);
418 flex-shrink: 0;
419 font-size: var(--text-sm);
420 color: var(--text-muted);
421 }
422
423 [data-domain="midi"] .iap-volume-slider {
424 width: 72px;
425 accent-color: var(--color-accent-muted, #1f6feb);
426 cursor: pointer;
427 }
428
429 [data-domain="midi"] .iap-track-selector {
430 display: flex;
431 align-items: center;
432 gap: var(--space-2);
433 margin-top: var(--space-3);
434 }
435
436 [data-domain="midi"] .iap-track-label {
437 font-size: var(--text-xs);
438 color: var(--text-muted);
439 white-space: nowrap;
440 }
441
442 [data-domain="midi"] .iap-track-select {
443 flex: 1;
444 font-size: var(--text-sm);
445 background: var(--bg-overlay);
446 border: 1px solid var(--border-default);
447 color: var(--text-primary);
448 border-radius: var(--radius-sm);
449 padding: 4px 8px;
450 }
451
452 /* ============================================================================
453 * 5. [data-domain="code"] — Code symbol graph and file tree
454 * ============================================================================ */
455
456
457 /* Code viewer placeholder — rendered by the code_graph viewer TypeScript module */
458 [data-domain="code"] .code-graph-canvas {
459 width: 100%;
460 height: 420px;
461 background: var(--bg-base);
462 border: 1px solid var(--border-default);
463 border-radius: var(--radius-base);
464 display: flex;
465 align-items: center;
466 justify-content: center;
467 }
468
469 [data-domain="code"] .code-graph-placeholder {
470 color: var(--text-muted);
471 font-size: var(--text-sm);
472 text-align: center;
473 }
474
475 /* ============================================================================
476 * 6. PROFILE / CONTRIBUTOR / REPO GRID (shared by all domains)
477 * ============================================================================ */
478
479 .profile-header {
480 display: flex;
481 align-items: flex-start;
482 gap: var(--space-6);
483 margin-bottom: var(--space-6);
484 }
485
486 .avatar {
487 width: 80px;
488 height: 80px;
489 border-radius: var(--radius-full);
490 background: var(--bg-overlay);
491 border: 2px solid var(--border-default);
492 display: flex;
493 align-items: center;
494 justify-content: center;
495 font-size: 32px;
496 flex-shrink: 0;
497 }
498
499 .avatar img {
500 width: 100%;
501 height: 100%;
502 border-radius: var(--radius-full);
503 object-fit: cover;
504 }
505
506 .profile-meta { flex: 1; }
507
508 .profile-meta h1 {
509 font-size: 22px;
510 color: var(--text-primary);
511 margin-bottom: var(--space-1);
512 }
513
514 .bio {
515 font-size: var(--text-base);
516 color: var(--text-muted);
517 margin-bottom: var(--space-3);
518 }
519
520 .repo-grid {
521 display: grid;
522 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
523 gap: var(--space-3);
524 }
525
526 /* .repo-card base styles live in _components.scss */
527
528 .repo-card h3 {
529 font-size: 15px;
530 margin: 0;
531 }
532
533 .repo-card .repo-meta {
534 font-size: var(--text-sm);
535 color: var(--text-muted);
536 }
537
538 .credits-badge {
539 display: inline-flex;
540 align-items: center;
541 gap: var(--space-2);
542 background: color-mix(in srgb, var(--color-accent-muted) 25%, transparent);
543 border: 1px solid var(--color-accent-muted);
544 border-radius: var(--radius-base);
545 padding: var(--space-2) 14px;
546 font-size: var(--text-base);
547 }
548
549 .credits-badge .num {
550 font-size: 22px;
551 font-weight: var(--weight-bold);
552 color: var(--color-accent);
553 }
554
555
556 /* ============================================================================
557 * 7. SHARED INFRASTRUCTURE
558 * ============================================================================ */
559
560 /* ── Session live dot ────────────────────────────────────────────────────── */
561 .session-live-dot {
562 display: inline-block;
563 width: 8px;
564 height: 8px;
565 border-radius: 50%;
566 background: var(--color-success, var(--color-success));
567 animation: session-pulse 1.5s ease-in-out infinite;
568 }
569
570 @keyframes session-pulse {
571 0%, 100% { opacity: 1; }
572 50% { opacity: 0.4; }
573 }
574
575
576 /* ============================================================================
577 * 8. RESPONSIVE
578 * ============================================================================ */
579
580 @media (max-width: 479px) {
581 .profile-header { flex-direction: column; }
582
583 [data-domain="midi"] .piano-roll { --piano-roll-cell-w: 4px; }
584
585 .diff-dim-label { width: 60px; }
586
587 .repo-grid { grid-template-columns: 1fr; }
588
589 .mcp-docs-connect-grid { grid-template-columns: 1fr; }
590 }
591
592 /* =============================================================================
593 Domain Detail Page (.dd-* prefix)
594 ============================================================================= */
595
596 // ── Per-slug accent colours ──────────────────────────────────────────────────
597 .dd-page {
598 --dd-accent: var(--color-accent);
599 --dd-accent-2: var(--color-accent-muted);
600 --dd-hero-from: var(--bg-base);
601 --dd-hero-to: var(--bg-surface);
602 --dd-glow: color-mix(in srgb, var(--color-accent) 25%, transparent);
603
604 &[data-domain-slug="midi"] {
605 --dd-accent: var(--domain-midi);
606 --dd-accent-2: var(--canvas-3);
607 --dd-hero-from: color-mix(in srgb, var(--domain-midi) 8%, var(--bg-void));
608 --dd-hero-to: var(--bg-void);
609 --dd-glow: color-mix(in srgb, var(--domain-midi) 40%, transparent);
610 }
611 &[data-domain-slug="code"] {
612 --dd-accent: var(--domain-code);
613 --dd-accent-2: var(--color-accent-muted);
614 --dd-hero-from: color-mix(in srgb, var(--domain-code) 6%, var(--bg-void));
615 --dd-hero-to: var(--bg-void);
616 --dd-glow: color-mix(in srgb, var(--domain-code) 35%, transparent);
617 }
618 }
619
620 // ── Hero — domain-specific gradient overlay on top of shared .ph-hero ────────
621 .dd-hero {
622 background: linear-gradient(160deg, var(--dd-hero-from) 0%, var(--dd-hero-to) 100%);
623 border-bottom-color: color-mix(in srgb, var(--dd-accent) 15%, transparent);
624 }
625
626 .dd-hero__bg {
627 position: absolute; inset: 0; pointer-events: none; overflow: hidden;
628 &::before {
629 content: ''; position: absolute;
630 top: -40%; right: -10%; width: 55%; aspect-ratio: 1;
631 background: radial-gradient(circle, var(--dd-glow) 0%, transparent 65%);
632 border-radius: 50%;
633 }
634 &::after {
635 content: ''; position: absolute;
636 bottom: -30%; left: 15%; width: 40%; aspect-ratio: 1;
637 background: radial-gradient(circle, color-mix(in srgb, var(--dd-accent-2) 18%, transparent) 0%, transparent 65%);
638 border-radius: 50%;
639 }
640 }
641
642 .dd-verified-badge {
643 display: inline-flex; align-items: center; gap: 4px;
644 font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px;
645 background: color-mix(in srgb, var(--color-success) 15%, transparent);
646 color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 30%, transparent);
647 }
648
649 .dd-deprecated-badge {
650 display: inline-flex; align-items: center; gap: 4px;
651 font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px;
652 background: color-mix(in srgb, var(--color-orange) 15%, transparent);
653 color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 30%, transparent);
654 }
655
656 .dd-version {
657 font-size: 12px; color: var(--text-muted);
658 font-family: var(--font-mono);
659 }
660
661 // dd-hero__title extends ph-hero-title — only domain-specific tweaks here
662 .dd-hero__title {
663 color: var(--color-accent);
664 font-weight: 300;
665 display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
666 }
667
668 .dd-hero__icon { font-size: 1em; color: var(--color-accent); }
669
670 .dd-hero__subtitle {
671 font-size: 1em; font-weight: 300;
672 color: var(--color-accent);
673 }
674
675 // ph-hero-sub handles desc sizing; only color override needed
676 .dd-hero .ph-hero-sub {
677 color: var(--text-secondary);
678 }
679
680 .dd-hero__actions { display: flex; gap: 12px; flex-wrap: wrap; }
681
682 .dd-sidebar-desc { font-size: 12px; color: var(--text-muted); margin: 0 0 8px; }
683
684 // ── Domain detail hero buttons ─────────────────────────────────────────────
685 .dd-hero-btn {
686 display: inline-flex; align-items: center; gap: 6px;
687 padding: 7px 16px;
688 border-radius: var(--radius-sm);
689 font-size: 13px; font-weight: 500; line-height: 1;
690 white-space: nowrap; text-decoration: none;
691 cursor: pointer; border: none;
692 transition: background 0.15s, border-color 0.15s, color 0.15s;
693 svg { flex-shrink: 0; }
694
695 &--primary {
696 background: color-mix(in srgb, var(--dd-accent) 5%, transparent);
697 border: 1px solid color-mix(in srgb, var(--dd-accent) 45%, transparent);
698 color: var(--dd-accent);
699 &:hover {
700 background: color-mix(in srgb, var(--dd-accent) 10%, transparent);
701 border-color: color-mix(in srgb, var(--dd-accent) 65%, transparent);
702 color: color-mix(in srgb, var(--dd-accent) 90%, #fff);
703 }
704 }
705
706 &--secondary {
707 background: transparent;
708 border: 1px solid var(--border-default);
709 color: var(--text-secondary);
710 &:hover {
711 background: rgba(255, 255, 255, 0.04);
712 border-color: var(--border-default);
713 color: var(--text-primary);
714 }
715 }
716
717 &--ghost {
718 background: transparent;
719 border: 1px solid var(--border-subtle);
720 color: var(--text-muted);
721 &:hover {
722 background: rgba(255, 255, 255, 0.03);
723 border-color: var(--border-default);
724 color: var(--text-secondary);
725 }
726 }
727 }
728
729 .dd-install-btn {
730 &:disabled { opacity: 0.5; cursor: default; }
731 }
732
733 // Stats ribbon uses shared .ph-stats-strip — no dd-specific overrides needed
734
735 // Body/section layout uses shared .ph-body, .ph-content, .ph-section — no dd overrides
736 .dd-main { display: flex; flex-direction: column; gap: 0; min-width: 0; }
737
738 // ── Dimension cards ───────────────────────────────────────────────────────────
739 .dd-dim-grid {
740 display: grid;
741 grid-template-columns: repeat(auto-fill, minmax(175px, 1fr));
742 gap: 10px;
743 @media (max-width: 600px) { grid-template-columns: repeat(2, 1fr); }
744 }
745
746 .dd-dim-card {
747 padding: 10px 12px;
748 border-radius: var(--radius-sm);
749 border: 1px solid var(--border-subtle);
750 background: transparent;
751 transition: background 0.15s, border-color 0.15s;
752 &:hover { background: rgba(255,255,255,0.02); }
753 }
754
755 // 8 rotating accent colors — mapped to the track palette
756 .dd-dim-color-0 { --dim-color: var(--track-3); }
757 .dd-dim-color-1 { --dim-color: var(--track-0); }
758 .dd-dim-color-2 { --dim-color: var(--track-1); }
759 .dd-dim-color-3 { --dim-color: var(--track-2); }
760 .dd-dim-color-4 { --dim-color: var(--track-6); }
761 .dd-dim-color-5 { --dim-color: var(--track-5); }
762 .dd-dim-color-6 { --dim-color: var(--track-7); }
763 .dd-dim-color-7 { --dim-color: var(--track-4); }
764
765 .dd-dim-card__header {
766 display: flex; align-items: center; gap: 6px;
767 margin-bottom: 6px; flex-wrap: wrap;
768 }
769
770 .dd-dim-card__index {
771 font-size: 10px; font-family: var(--font-mono);
772 color: var(--dim-color); opacity: 0.75;
773 }
774
775 .dd-dim-card__name {
776 font-size: 13px; font-weight: 700;
777 color: var(--text-primary); font-family: var(--font-mono);
778 }
779
780 .dd-dim-card__unit {
781 font-size: 9px; padding: 1px 6px; border-radius: 4px;
782 margin-left: auto;
783 background: color-mix(in srgb, var(--dim-color) 12%, transparent);
784 color: var(--dim-color);
785 border: 1px solid color-mix(in srgb, var(--dim-color) 22%, transparent);
786 }
787
788 .dd-dim-card__desc {
789 font-size: 11px; color: var(--text-muted); margin: 0; line-height: 1.45;
790 }
791
792 // ── Terminal blocks ───────────────────────────────────────────────────────────
793 .dd-terminal {
794 border-radius: var(--radius-md); overflow: hidden;
795 border: 1px solid var(--border-default);
796 background: var(--bg-base);
797 &--compact .dd-terminal__body { padding: 10px 16px; font-size: 12px; }
798 }
799
800 .dd-terminal__chrome {
801 display: flex; align-items: center; gap: 7px;
802 padding: 10px 14px;
803 background: var(--bg-surface);
804 border-bottom: 1px solid var(--border-subtle);
805 }
806
807 .dd-terminal__dot {
808 width: 11px; height: 11px; border-radius: 50%; flex-shrink: 0;
809 &--red { background: #ff5f57; }
810 &--yellow { background: #febc2e; }
811 &--green { background: #28c840; }
812 }
813
814 .dd-terminal__title {
815 font-size: 11px; color: var(--text-muted);
816 font-family: var(--font-mono); margin: 0 auto;
817 }
818
819 .dd-copy-btn {
820 display: flex; align-items: center; justify-content: center;
821 width: 26px; height: 26px; border-radius: 4px;
822 border: 1px solid var(--border-default);
823 background: transparent; color: var(--text-muted);
824 cursor: pointer; transition: all 0.15s;
825 margin-left: auto; flex-shrink: 0;
826 &:hover { background: var(--bg-hover); color: var(--text-primary); }
827 &.copied { color: var(--color-success); border-color: var(--color-success); }
828 }
829
830 .dd-terminal__body {
831 padding: 12px 16px; margin: 0;
832 font-size: 12px; font-family: var(--font-mono);
833 color: var(--text-primary); line-height: 1.65;
834 overflow-x: auto; white-space: pre;
835 }
836
837 // ── MCP callout ───────────────────────────────────────────────────────────────
838 .dd-mcp-callout {
839 display: flex; gap: 10px; align-items: flex-start;
840 margin-top: var(--space-3); padding: 10px 12px;
841 background: color-mix(in srgb, var(--dd-accent) 5%, transparent);
842 border: 1px solid color-mix(in srgb, var(--dd-accent) 20%, transparent);
843 border-radius: var(--radius-sm);
844 font-size: 13px; color: var(--text-secondary); line-height: 1.5;
845 }
846
847 .dd-mcp-callout__icon { font-size: 22px; flex-shrink: 0; }
848
849 // Sidebar uses shared .ph-sidebar, .ph-sidebar-section, .ph-sidebar-heading
850
851 // ── Artifact badges ───────────────────────────────────────────────────────────
852 .dd-artifact-list { display: flex; flex-wrap: wrap; gap: 6px; }
853
854 .dd-artifact-badge {
855 font-size: 11px; font-family: var(--font-mono);
856 padding: 3px 9px; border-radius: 4px;
857 background: transparent;
858 color: var(--dd-accent);
859 border: 1px solid color-mix(in srgb, var(--dd-accent) 28%, transparent);
860 }
861
862 // ── Hash / URI blocks ─────────────────────────────────────────────────────────
863 .dd-hash-block {
864 display: flex; align-items: center; gap: 8px;
865 background: transparent;
866 border: 1px solid var(--border-subtle);
867 border-radius: var(--radius-sm);
868 padding: 8px 12px;
869 }
870
871 .dd-hash-code {
872 font-size: 11px; font-family: var(--font-mono);
873 color: var(--text-secondary); word-break: break-all; flex: 1;
874 }
875
876 .dd-hash-copy {
877 font-size: 13px; padding: 2px 8px;
878 border: 1px solid var(--border-subtle);
879 background: transparent; color: var(--text-muted);
880 cursor: pointer; border-radius: 4px;
881 transition: all 0.15s; flex-shrink: 0;
882 font-family: var(--font-mono);
883 &:hover { color: var(--text-primary); border-color: var(--border-default); }
884 &.copied { color: var(--color-success); border-color: var(--color-success); }
885 }
886
887 // ── Meta list ─────────────────────────────────────────────────────────────────
888 .dd-meta-list {
889 display: grid; grid-template-columns: auto 1fr;
890 gap: 8px 14px; margin: 0;
891
892 dt {
893 font-size: 11px; color: var(--text-muted);
894 text-transform: uppercase; letter-spacing: 0.05em;
895 align-self: center;
896 }
897 dd {
898 font-size: 13px; color: var(--text-primary);
899 font-family: var(--font-mono); margin: 0; align-self: center;
900 }
901 }
902
903 // ── Repo grid ─────────────────────────────────────────────────────────────────
904 .dd-repo-grid {
905 display: grid;
906 grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
907 gap: 10px;
908 }
909
910 .dd-repo-card {
911 display: flex; flex-direction: column; gap: 6px;
912 padding: 12px 14px;
913 background: transparent;
914 border: 1px solid var(--border-subtle);
915 border-radius: var(--radius-sm);
916 text-decoration: none;
917 transition: border-color 0.15s, background 0.15s;
918 &:hover {
919 border-color: var(--border-default);
920 background: rgba(255,255,255,0.02);
921 .dd-repo-card__arrow { opacity: 1; transform: translateX(3px); }
922 }
923 }
924
925 .dd-repo-card__header {
926 display: flex; align-items: center; justify-content: space-between;
927 }
928
929 .dd-repo-card__name {
930 font-size: 13px; font-weight: 600; color: var(--color-accent);
931 }
932
933 .dd-repo-card__arrow {
934 font-size: 14px; color: var(--dd-accent);
935 opacity: 0.3; transition: opacity 0.15s, transform 0.15s;
936 }
937
938 .dd-repo-card__desc {
939 font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4;
940 }
941
942 .dd-see-all { margin-top: var(--space-4); }
943
944 .dd-repos-empty {
945 display: flex; flex-direction: column; align-items: center;
946 padding: 64px var(--space-4);
947 border: 1px solid var(--border-subtle);
948 border-radius: var(--radius-sm);
949 color: var(--text-muted);
950 p { margin: var(--space-2) 0 var(--space-4); font-size: 13px; }
951 }
952
953 .dd-repos-empty__icon {
954 margin-bottom: var(--space-3);
955 opacity: 0.35;
956 color: var(--text-secondary);
957 }
958
959 // ── Domains listing page — canonical classes ──────────────────────────────────
960 // dm-* hero/body/CTA classes removed — migrated to pages/_domains.scss and
961 // canonical components (search-field, stat-pill, verified-toggle, btn--*)
962
963 /* Domain grid */
964 .domain-grid {
965 display: grid;
966 grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
967 gap: 12px;
968 }
969
970 /* Domain card */
971 .domain-card {
972 display: flex;
973 flex-direction: column;
974 gap: var(--space-2);
975 padding: var(--space-3) var(--space-3);
976 background: transparent;
977 border: 1px solid var(--border-subtle);
978 border-radius: var(--radius-sm);
979 text-decoration: none;
980 transition: border-color 0.15s, background 0.15s;
981 &:hover {
982 border-color: var(--border-default);
983 background: rgba(255,255,255,0.025);
984 }
985 }
986 .domain-card__header {
987 display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
988 }
989 .domain-card__name {
990 font-size: 14px; font-weight: 600; color: var(--text-primary);
991 }
992 .domain-card__description {
993 font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.5;
994 display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
995 overflow: hidden;
996 }
997 .domain-card__meta {
998 display: flex; gap: 12px; font-size: 11px; color: var(--text-muted);
999 margin-top: auto; flex-wrap: wrap; align-items: center;
1000 }
1001 .domain-card__stat { display: inline-flex; align-items: center; gap: 4px; }
1002 .domain-card__viewer, .domain-card__merge {
1003 font-size: 10px; padding: 2px 6px; border-radius: 3px;
1004 background: var(--bg-overlay); color: var(--text-muted);
1005 border: 1px solid var(--border-subtle); font-family: var(--font-mono);
1006 }
File History 1 commit
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2 feat: add repair-commit wire endpoint (API parity with repa… Opus 4.8 minor 1 day ago