gabriel / musehub public
_domain.scss
1,487 lines 42.8 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days 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(--font-size-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(--font-size-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(--font-size-sm);
145 font-weight: var(--font-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: rgba(79, 142, 247, 0.08);
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(--font-size-xs);
188 font-family: var(--font-mono);
189 font-weight: var(--font-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: rgba(88, 166, 255, 0.12);
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(--font-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 [data-domain="midi"] {
242 /* Dimension token remapping for MIDI (matches the original names) */
243 --dim-a: #388bfd; /* harmonic */
244 --dim-b: #3fb950; /* rhythmic */
245 --dim-c: #bc8cff; /* melodic */
246 --dim-d: #f0883e; /* structural */
247 --dim-e: #f85149; /* dynamic */
248 }
249
250 /* Piano roll — only visible when viewing a MIDI-domain repo */
251 [data-domain="midi"] .piano-roll {
252 --piano-roll-rows: 12;
253 --piano-roll-cell-h: 12px;
254 --piano-roll-cell-w: 6px;
255 overflow: auto;
256 background: var(--bg-base);
257 border: 1px solid var(--border-default);
258 border-radius: var(--radius-base);
259 padding: var(--space-2);
260 }
261
262 [data-domain="midi"] .piano-roll-grid {
263 display: grid;
264 grid-template-rows: repeat(var(--piano-roll-rows), var(--piano-roll-cell-h));
265 gap: 1px;
266 min-width: max-content;
267 }
268
269 [data-domain="midi"] .piano-roll-lane {
270 display: flex;
271 gap: 1px;
272 align-items: center;
273 }
274
275 [data-domain="midi"] .piano-roll-lane.is-black {
276 background: rgba(255, 255, 255, 0.03);
277 }
278
279 [data-domain="midi"] .piano-roll-note {
280 height: var(--piano-roll-cell-h);
281 border-radius: 2px;
282 opacity: 0.85;
283 min-width: var(--piano-roll-cell-w);
284 }
285
286 [data-domain="midi"] .piano-roll-note[data-track="0"] { background: var(--track-0); }
287 [data-domain="midi"] .piano-roll-note[data-track="1"] { background: var(--track-1); }
288 [data-domain="midi"] .piano-roll-note[data-track="2"] { background: var(--track-2); }
289 [data-domain="midi"] .piano-roll-note[data-track="3"] { background: var(--track-3); }
290 [data-domain="midi"] .piano-roll-note[data-track="4"] { background: var(--track-4); }
291 [data-domain="midi"] .piano-roll-note[data-track="5"] { background: var(--track-5); }
292 [data-domain="midi"] .piano-roll-note[data-track="6"] { background: var(--track-6); }
293 [data-domain="midi"] .piano-roll-note[data-track="7"] { background: var(--track-7); }
294
295 [data-domain="midi"] .piano-roll-labels {
296 display: flex;
297 flex-direction: column;
298 gap: 1px;
299 margin-right: var(--space-2);
300 flex-shrink: 0;
301 }
302
303 [data-domain="midi"] .piano-roll-label {
304 height: var(--piano-roll-cell-h);
305 font-size: 9px;
306 font-family: var(--font-mono);
307 color: var(--text-muted);
308 display: flex;
309 align-items: center;
310 width: 20px;
311 }
312
313 /* Waveform — MIDI domain ships audio artifacts */
314 [data-domain="midi"] .waveform {
315 position: relative;
316 background: var(--bg-base);
317 border: 1px solid var(--border-default);
318 border-radius: var(--radius-base);
319 overflow: hidden;
320 height: 64px;
321 }
322
323 [data-domain="midi"] .waveform canvas {
324 display: block;
325 width: 100%;
326 height: 100%;
327 }
328
329 [data-domain="midi"] .waveform-playhead {
330 position: absolute;
331 top: 0;
332 bottom: 0;
333 width: 2px;
334 background: var(--color-orange);
335 pointer-events: none;
336 }
337
338 /* Inline Audio Player — MIDI domain only */
339 [data-domain="midi"] .iap-card {
340 border-color: var(--color-accent-muted, #1f6feb);
341 background: linear-gradient(135deg, var(--bg-base) 0%, var(--bg-surface) 100%);
342 }
343
344 [data-domain="midi"] .iap-title {
345 font-size: var(--font-size-base);
346 font-weight: var(--font-weight-semibold);
347 color: var(--text-primary);
348 margin-bottom: var(--space-3);
349 white-space: nowrap;
350 overflow: hidden;
351 text-overflow: ellipsis;
352 }
353
354 [data-domain="midi"] .iap-waveform-wrap {
355 min-height: 72px;
356 border-radius: var(--radius-sm);
357 background: var(--bg-base);
358 border: 1px solid var(--border-subtle);
359 margin-bottom: var(--space-3);
360 overflow: hidden;
361 display: flex;
362 align-items: center;
363 justify-content: center;
364 }
365
366 [data-domain="midi"] .iap-waveform-placeholder {
367 color: var(--text-muted);
368 font-size: var(--font-size-sm);
369 padding: var(--space-3);
370 }
371
372 [data-domain="midi"] .iap-controls { display: flex; align-items: center; gap: var(--space-3); }
373
374 [data-domain="midi"] .iap-play-btn {
375 width: 40px;
376 height: 40px;
377 border-radius: 50%;
378 background: var(--color-accent-muted, #1f6feb);
379 border: none;
380 color: #fff;
381 font-size: 16px;
382 cursor: pointer;
383 display: flex;
384 align-items: center;
385 justify-content: center;
386 flex-shrink: 0;
387 transition: background 0.15s, transform 0.1s;
388 }
389
390 [data-domain="midi"] .iap-play-btn:hover {
391 background: var(--color-accent, #388bfd);
392 transform: scale(1.05);
393 }
394
395 [data-domain="midi"] .iap-progress-bar {
396 height: 6px;
397 background: var(--bg-overlay);
398 border-radius: 3px;
399 cursor: pointer;
400 position: relative;
401 margin-bottom: 4px;
402 flex: 1;
403 }
404
405 [data-domain="midi"] .iap-progress-fill {
406 height: 100%;
407 background: var(--color-accent-muted, #1f6feb);
408 border-radius: 3px;
409 width: 0%;
410 pointer-events: none;
411 transition: width 0.1s linear;
412 }
413
414 [data-domain="midi"] .iap-time-row {
415 display: flex;
416 justify-content: space-between;
417 font-size: 11px;
418 color: var(--text-muted);
419 font-variant-numeric: tabular-nums;
420 }
421
422 [data-domain="midi"] .iap-volume-wrap {
423 display: flex;
424 align-items: center;
425 gap: var(--space-1);
426 flex-shrink: 0;
427 font-size: var(--font-size-sm);
428 color: var(--text-muted);
429 }
430
431 [data-domain="midi"] .iap-volume-slider {
432 width: 72px;
433 accent-color: var(--color-accent-muted, #1f6feb);
434 cursor: pointer;
435 }
436
437 [data-domain="midi"] .iap-track-selector {
438 display: flex;
439 align-items: center;
440 gap: var(--space-2);
441 margin-top: var(--space-3);
442 }
443
444 [data-domain="midi"] .iap-track-label {
445 font-size: var(--font-size-xs);
446 color: var(--text-muted);
447 white-space: nowrap;
448 }
449
450 [data-domain="midi"] .iap-track-select {
451 flex: 1;
452 font-size: var(--font-size-sm);
453 background: var(--bg-overlay);
454 border: 1px solid var(--border-default);
455 color: var(--text-primary);
456 border-radius: var(--radius-sm);
457 padding: 4px 8px;
458 }
459
460 /* ============================================================================
461 * 5. [data-domain="code"] — Code symbol graph and file tree
462 * ============================================================================ */
463
464 [data-domain="code"] {
465 /* Dimension token remapping for Code */
466 --dim-a: #388bfd; /* syntax */
467 --dim-b: #3fb950; /* semantics */
468 --dim-c: #bc8cff; /* types */
469 --dim-d: #f0883e; /* tests */
470 --dim-e: #f85149; /* docs */
471 }
472
473 /* Code viewer placeholder — rendered by the code_graph viewer TypeScript module */
474 [data-domain="code"] .code-graph-canvas {
475 width: 100%;
476 height: 420px;
477 background: var(--bg-base);
478 border: 1px solid var(--border-default);
479 border-radius: var(--radius-base);
480 display: flex;
481 align-items: center;
482 justify-content: center;
483 }
484
485 [data-domain="code"] .code-graph-placeholder {
486 color: var(--text-muted);
487 font-size: var(--font-size-sm);
488 text-align: center;
489 }
490
491 /* ============================================================================
492 * 6. PROFILE / CONTRIBUTOR / REPO GRID (shared by all domains)
493 * ============================================================================ */
494
495 .profile-header {
496 display: flex;
497 align-items: flex-start;
498 gap: var(--space-6);
499 margin-bottom: var(--space-6);
500 }
501
502 .avatar {
503 width: 80px;
504 height: 80px;
505 border-radius: var(--radius-full);
506 background: var(--bg-overlay);
507 border: 2px solid var(--border-default);
508 display: flex;
509 align-items: center;
510 justify-content: center;
511 font-size: 32px;
512 flex-shrink: 0;
513 }
514
515 .avatar img {
516 width: 100%;
517 height: 100%;
518 border-radius: var(--radius-full);
519 object-fit: cover;
520 }
521
522 .profile-meta { flex: 1; }
523
524 .profile-meta h1 {
525 font-size: 22px;
526 color: var(--text-primary);
527 margin-bottom: var(--space-1);
528 }
529
530 .bio {
531 font-size: var(--font-size-base);
532 color: var(--text-muted);
533 margin-bottom: var(--space-3);
534 }
535
536 .repo-grid {
537 display: grid;
538 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
539 gap: var(--space-3);
540 }
541
542 /* .repo-card base styles live in _components.scss */
543
544 .repo-card h3 {
545 font-size: 15px;
546 margin: 0;
547 }
548
549 .repo-card .repo-meta {
550 font-size: var(--font-size-sm);
551 color: var(--text-muted);
552 }
553
554 .credits-badge {
555 display: inline-flex;
556 align-items: center;
557 gap: var(--space-2);
558 background: rgba(31, 111, 235, 0.13);
559 border: 1px solid var(--color-accent-muted);
560 border-radius: var(--radius-base);
561 padding: var(--space-2) 14px;
562 font-size: var(--font-size-base);
563 }
564
565 .credits-badge .num {
566 font-size: 22px;
567 font-weight: var(--font-weight-bold);
568 color: var(--color-accent);
569 }
570
571 /* ── Contribution heatmap ────────────────────────────────────────────────── */
572 .contrib-graph {
573 display: flex;
574 gap: 2px;
575 flex-wrap: nowrap;
576 overflow-x: auto;
577 }
578
579 .contrib-week {
580 display: flex;
581 flex-direction: column;
582 gap: 2px;
583 }
584
585 .contrib-day {
586 width: 10px;
587 height: 10px;
588 border-radius: 2px;
589 background: var(--bg-surface);
590 border: 1px solid var(--border-subtle);
591 }
592
593 .contrib-day[data-count="0"] { background: var(--bg-surface); }
594 .contrib-day[data-count="1"] { background: #0e4429; border-color: #0e4429; }
595 .contrib-day[data-count="2"] { background: #006d32; border-color: #006d32; }
596 .contrib-day[data-count="3"] { background: #26a641; border-color: #26a641; }
597 .contrib-day[data-count="4"] { background: #39d353; border-color: #39d353; }
598
599 /* ============================================================================
600 * 7. SHARED INFRASTRUCTURE
601 * ============================================================================ */
602
603 /* ── Session live dot ────────────────────────────────────────────────────── */
604 .session-live-dot {
605 display: inline-block;
606 width: 8px;
607 height: 8px;
608 border-radius: 50%;
609 background: var(--color-success, #3fb950);
610 animation: session-pulse 1.5s ease-in-out infinite;
611 }
612
613 @keyframes session-pulse {
614 0%, 100% { opacity: 1; }
615 50% { opacity: 0.4; }
616 }
617
618 /* ── MCP docs page ───────────────────────────────────────────────────────── */
619 .mcp-docs-page { max-width: 900px; margin: 0 auto; padding: var(--space-8) var(--space-4); }
620
621 .mcp-docs-header {
622 margin-bottom: var(--space-8);
623 }
624
625 .mcp-docs-header__title {
626 font-size: var(--font-size-2xl);
627 font-weight: var(--font-weight-bold);
628 color: var(--text-primary);
629 margin-bottom: var(--space-3);
630 }
631
632 .mcp-docs-header__subtitle {
633 font-size: var(--font-size-base);
634 color: var(--text-secondary);
635 margin-bottom: var(--space-4);
636 line-height: var(--line-height-normal);
637 }
638
639 .mcp-docs-header__actions { display: flex; gap: var(--space-2); }
640
641 .mcp-docs-section { margin-bottom: var(--space-10); }
642
643 .mcp-docs-section__title {
644 font-size: var(--font-size-lg);
645 font-weight: var(--font-weight-semibold);
646 color: var(--text-primary);
647 margin-bottom: var(--space-4);
648 padding-bottom: var(--space-2);
649 border-bottom: 1px solid var(--border-default);
650 display: flex;
651 align-items: center;
652 gap: var(--space-2);
653 }
654
655 .mcp-docs-count {
656 font-size: var(--font-size-sm);
657 font-weight: var(--font-weight-regular);
658 color: var(--text-muted);
659 background: var(--bg-overlay);
660 border: 1px solid var(--border-subtle);
661 border-radius: var(--radius-full);
662 padding: 1px 8px;
663 }
664
665 .mcp-docs-connect-grid {
666 display: grid;
667 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
668 gap: var(--space-3);
669 margin-bottom: var(--space-6);
670 }
671
672 .mcp-docs-connect-item {
673 display: flex;
674 flex-direction: column;
675 gap: var(--space-1);
676 background: var(--bg-surface);
677 border: 1px solid var(--border-default);
678 border-radius: var(--radius-base);
679 padding: var(--space-3);
680 }
681
682 .mcp-docs-connect-label {
683 font-size: var(--font-size-xs);
684 color: var(--text-muted);
685 text-transform: uppercase;
686 letter-spacing: 0.06em;
687 }
688
689 .mcp-docs-connect-value {
690 font-size: var(--font-size-sm);
691 font-family: var(--font-mono);
692 color: var(--text-primary);
693 word-break: break-all;
694 }
695
696 .mcp-docs-quickstart { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-4); }
697
698 .mcp-docs-quickstart__title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); color: var(--text-primary); margin-bottom: var(--space-3); }
699
700 .mcp-docs-quickstart__steps { padding-left: var(--space-5); color: var(--text-secondary); line-height: var(--line-height-relaxed); font-size: var(--font-size-base); }
701
702 .mcp-docs-tools-list, .mcp-docs-resource-list, .mcp-docs-prompt-list {
703 display: flex;
704 flex-direction: column;
705 gap: var(--space-3);
706 }
707
708 .mcp-docs-tool {
709 background: var(--bg-surface);
710 border: 1px solid var(--border-default);
711 border-radius: var(--radius-base);
712 padding: var(--space-4);
713 }
714
715 .mcp-docs-tool__header {
716 display: flex;
717 align-items: center;
718 gap: var(--space-2);
719 margin-bottom: var(--space-2);
720 }
721
722 .mcp-docs-tool__name {
723 font-size: var(--font-size-sm);
724 font-family: var(--font-mono);
725 color: var(--color-accent-link);
726 font-weight: var(--font-weight-semibold);
727 }
728
729 .mcp-docs-tool__desc {
730 font-size: var(--font-size-sm);
731 color: var(--text-secondary);
732 line-height: var(--line-height-normal);
733 margin-bottom: var(--space-2);
734 }
735
736 .mcp-docs-tool__schema {
737 border-top: 1px solid var(--border-subtle);
738 padding-top: var(--space-2);
739 }
740
741 .mcp-docs-tool__schema > summary {
742 font-size: var(--font-size-xs);
743 color: var(--text-muted);
744 cursor: pointer;
745 margin-bottom: var(--space-2);
746 }
747
748 .mcp-docs-params-table {
749 width: 100%;
750 border-collapse: collapse;
751 font-size: var(--font-size-xs);
752 }
753
754 .mcp-docs-params-table th {
755 text-align: left;
756 color: var(--text-muted);
757 font-weight: var(--font-weight-medium);
758 padding: var(--space-1) var(--space-2);
759 border-bottom: 1px solid var(--border-subtle);
760 }
761
762 .mcp-docs-params-table td {
763 padding: var(--space-1) var(--space-2);
764 color: var(--text-secondary);
765 vertical-align: top;
766 border-bottom: 1px solid var(--border-subtle);
767 }
768
769 .mcp-docs-type {
770 font-family: var(--font-mono);
771 color: var(--color-purple);
772 font-size: 11px;
773 }
774
775 .mcp-docs-required { color: var(--color-success); font-weight: var(--font-weight-semibold); }
776
777 .mcp-docs-resource, .mcp-docs-prompt {
778 background: var(--bg-surface);
779 border: 1px solid var(--border-default);
780 border-radius: var(--radius-base);
781 padding: var(--space-3) var(--space-4);
782 }
783
784 .mcp-docs-resource__uri, .mcp-docs-prompt__name {
785 display: block;
786 font-size: var(--font-size-sm);
787 font-family: var(--font-mono);
788 color: var(--color-accent-link);
789 margin-bottom: var(--space-1);
790 }
791
792 .mcp-docs-resource__name { font-size: var(--font-size-xs); color: var(--text-muted); }
793
794 .mcp-docs-resource__desc, .mcp-docs-prompt__desc {
795 font-size: var(--font-size-sm);
796 color: var(--text-secondary);
797 margin-top: var(--space-1);
798 line-height: var(--line-height-normal);
799 }
800
801 .mcp-docs-prompt__args {
802 display: flex;
803 flex-wrap: wrap;
804 gap: var(--space-2);
805 margin-top: var(--space-2);
806 }
807
808 .mcp-docs-prompt__arg {
809 display: inline-flex;
810 align-items: center;
811 gap: var(--space-1);
812 font-size: var(--font-size-xs);
813 color: var(--text-muted);
814 background: var(--bg-overlay);
815 border: 1px solid var(--border-subtle);
816 border-radius: var(--radius-sm);
817 padding: 2px 6px;
818 }
819
820 .mcp-docs-prompt__arg-desc { color: var(--text-muted); }
821
822 /* ── Badge variants (elicitation, verified, deprecated) ──────────────────── */
823 .badge-elicitation { background: rgba(188, 140, 255, 0.15); color: var(--color-purple); border-color: rgba(188, 140, 255, 0.3); }
824
825 /* ============================================================================
826 * 8. RESPONSIVE
827 * ============================================================================ */
828
829 @media (max-width: 479px) {
830 .profile-header { flex-direction: column; }
831
832 [data-domain="midi"] .piano-roll { --piano-roll-cell-w: 4px; }
833
834 .diff-dim-label { width: 60px; }
835
836 .repo-grid { grid-template-columns: 1fr; }
837
838 .mcp-docs-connect-grid { grid-template-columns: 1fr; }
839 }
840
841 /* =============================================================================
842 Domain Detail Page (.dd-* prefix)
843 ============================================================================= */
844
845 // ── Per-slug accent colours ──────────────────────────────────────────────────
846 .dd-page {
847 --dd-accent: var(--color-accent, #58a6ff);
848 --dd-accent-2: var(--color-accent-emphasis, #1f6feb);
849 --dd-hero-from: #0d1117;
850 --dd-hero-to: #161b22;
851 --dd-glow: rgba(88, 166, 255, 0.25);
852
853 &[data-domain-slug="midi"] {
854 --dd-accent: #a855f7;
855 --dd-accent-2: #7c3aed;
856 --dd-hero-from: #130a24;
857 --dd-hero-to: #0a0514;
858 --dd-glow: rgba(168, 85, 247, 0.4);
859 }
860 &[data-domain-slug="code"] {
861 --dd-accent: #38bdf8;
862 --dd-accent-2: #2563eb;
863 --dd-hero-from: #01111f;
864 --dd-hero-to: #020c1a;
865 --dd-glow: rgba(56, 189, 248, 0.35);
866 }
867 }
868
869 // ── Hero — domain-specific gradient overlay on top of shared .ph-hero ────────
870 .dd-hero {
871 background: linear-gradient(160deg, var(--dd-hero-from) 0%, var(--dd-hero-to) 100%);
872 border-bottom-color: color-mix(in srgb, var(--dd-accent) 15%, transparent);
873 }
874
875 .dd-hero__bg {
876 position: absolute; inset: 0; pointer-events: none; overflow: hidden;
877 &::before {
878 content: ''; position: absolute;
879 top: -40%; right: -10%; width: 55%; aspect-ratio: 1;
880 background: radial-gradient(circle, var(--dd-glow) 0%, transparent 65%);
881 border-radius: 50%;
882 }
883 &::after {
884 content: ''; position: absolute;
885 bottom: -30%; left: 15%; width: 40%; aspect-ratio: 1;
886 background: radial-gradient(circle, color-mix(in srgb, var(--dd-accent-2) 18%, transparent) 0%, transparent 65%);
887 border-radius: 50%;
888 }
889 }
890
891 .dd-verified-badge {
892 display: inline-flex; align-items: center; gap: 4px;
893 font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px;
894 background: color-mix(in srgb, #39d353 15%, transparent);
895 color: #39d353; border: 1px solid color-mix(in srgb, #39d353 30%, transparent);
896 }
897
898 .dd-deprecated-badge {
899 display: inline-flex; align-items: center; gap: 4px;
900 font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px;
901 background: color-mix(in srgb, #f97316 15%, transparent);
902 color: #f97316; border: 1px solid color-mix(in srgb, #f97316 30%, transparent);
903 }
904
905 .dd-version {
906 font-size: 12px; color: var(--text-muted);
907 font-family: var(--font-mono);
908 }
909
910 // dd-hero__title extends ph-hero-title — only domain-specific tweaks here
911 .dd-hero__title {
912 color: #fff;
913 display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
914 }
915
916 .dd-hero__icon { font-size: 0.7em; }
917
918 .dd-hero__subtitle {
919 font-size: 0.42em; font-weight: 400;
920 color: var(--dd-accent); letter-spacing: 0.06em;
921 text-transform: uppercase; opacity: 0.85;
922 }
923
924 // ph-hero-sub handles desc sizing; only color override needed
925 .dd-hero .ph-hero-sub {
926 color: rgba(255,255,255,0.65);
927 }
928
929 .dd-hero__actions { display: flex; gap: 12px; flex-wrap: wrap; }
930
931 .dd-sidebar-desc { font-size: 12px; color: var(--text-muted); margin: 0 0 8px; }
932
933 // ── Domain detail hero buttons ─────────────────────────────────────────────
934 .dd-hero-btn {
935 display: inline-flex; align-items: center; gap: 6px;
936 padding: 7px 16px;
937 border-radius: var(--radius-sm);
938 font-size: 13px; font-weight: 500; line-height: 1;
939 white-space: nowrap; text-decoration: none;
940 cursor: pointer; border: none;
941 transition: background 0.15s, border-color 0.15s, color 0.15s;
942 svg { flex-shrink: 0; }
943
944 &--primary {
945 background: color-mix(in srgb, var(--dd-accent) 5%, transparent);
946 border: 1px solid color-mix(in srgb, var(--dd-accent) 45%, transparent);
947 color: var(--dd-accent);
948 &:hover {
949 background: color-mix(in srgb, var(--dd-accent) 10%, transparent);
950 border-color: color-mix(in srgb, var(--dd-accent) 65%, transparent);
951 color: color-mix(in srgb, var(--dd-accent) 90%, #fff);
952 }
953 }
954
955 &--secondary {
956 background: transparent;
957 border: 1px solid var(--border-default);
958 color: var(--text-secondary);
959 &:hover {
960 background: rgba(255, 255, 255, 0.04);
961 border-color: var(--border-muted);
962 color: var(--text-primary);
963 }
964 }
965
966 &--ghost {
967 background: transparent;
968 border: 1px solid var(--border-subtle);
969 color: var(--text-muted);
970 &:hover {
971 background: rgba(255, 255, 255, 0.03);
972 border-color: var(--border-default);
973 color: var(--text-secondary);
974 }
975 }
976 }
977
978 .dd-install-btn {
979 &:disabled { opacity: 0.5; cursor: default; }
980 }
981
982 // Stats ribbon uses shared .ph-stats-strip — no dd-specific overrides needed
983
984 // Body/section layout uses shared .ph-body, .ph-content, .ph-section — no dd overrides
985 .dd-main { display: flex; flex-direction: column; gap: 0; min-width: 0; }
986
987 // ── Dimension cards ───────────────────────────────────────────────────────────
988 .dd-dim-grid {
989 display: grid;
990 grid-template-columns: repeat(auto-fill, minmax(175px, 1fr));
991 gap: 10px;
992 @media (max-width: 600px) { grid-template-columns: repeat(2, 1fr); }
993 }
994
995 .dd-dim-card {
996 padding: 10px 12px;
997 border-radius: var(--radius-sm);
998 border: 1px solid var(--border-subtle);
999 background: transparent;
1000 transition: background 0.15s, border-color 0.15s;
1001 &:hover { background: rgba(255,255,255,0.02); }
1002 }
1003
1004 // 8 rotating accent colors — only sets the CSS custom property
1005 .dd-dim-color-0 { --dim-color: #a855f7; }
1006 .dd-dim-color-1 { --dim-color: #38bdf8; }
1007 .dd-dim-color-2 { --dim-color: #34d399; }
1008 .dd-dim-color-3 { --dim-color: #fb923c; }
1009 .dd-dim-color-4 { --dim-color: #f472b6; }
1010 .dd-dim-color-5 { --dim-color: #facc15; }
1011 .dd-dim-color-6 { --dim-color: #60a5fa; }
1012 .dd-dim-color-7 { --dim-color: #f87171; }
1013
1014 .dd-dim-card__header {
1015 display: flex; align-items: center; gap: 6px;
1016 margin-bottom: 6px; flex-wrap: wrap;
1017 }
1018
1019 .dd-dim-card__index {
1020 font-size: 10px; font-family: var(--font-mono);
1021 color: var(--dim-color); opacity: 0.75;
1022 }
1023
1024 .dd-dim-card__name {
1025 font-size: 13px; font-weight: 700;
1026 color: var(--text-primary); font-family: var(--font-mono);
1027 }
1028
1029 .dd-dim-card__unit {
1030 font-size: 9px; padding: 1px 6px; border-radius: 4px;
1031 margin-left: auto;
1032 background: color-mix(in srgb, var(--dim-color) 12%, transparent);
1033 color: var(--dim-color);
1034 border: 1px solid color-mix(in srgb, var(--dim-color) 22%, transparent);
1035 }
1036
1037 .dd-dim-card__desc {
1038 font-size: 11px; color: var(--text-muted); margin: 0; line-height: 1.45;
1039 }
1040
1041 // ── Terminal blocks ───────────────────────────────────────────────────────────
1042 .dd-terminal {
1043 border-radius: var(--radius-md); overflow: hidden;
1044 border: 1px solid var(--border-default);
1045 background: #0d1117;
1046 &--compact .dd-terminal__body { padding: 10px 16px; font-size: 12px; }
1047 }
1048
1049 .dd-terminal__chrome {
1050 display: flex; align-items: center; gap: 7px;
1051 padding: 10px 14px;
1052 background: #161b22;
1053 border-bottom: 1px solid rgba(255,255,255,0.06);
1054 }
1055
1056 .dd-terminal__dot {
1057 width: 11px; height: 11px; border-radius: 50%; flex-shrink: 0;
1058 &--red { background: #ff5f57; }
1059 &--yellow { background: #febc2e; }
1060 &--green { background: #28c840; }
1061 }
1062
1063 .dd-terminal__title {
1064 font-size: 11px; color: var(--text-muted);
1065 font-family: var(--font-mono); margin: 0 auto;
1066 }
1067
1068 .dd-copy-btn {
1069 display: flex; align-items: center; justify-content: center;
1070 width: 26px; height: 26px; border-radius: 4px;
1071 border: 1px solid rgba(255,255,255,0.1);
1072 background: transparent; color: #8b949e;
1073 cursor: pointer; transition: all 0.15s;
1074 margin-left: auto; flex-shrink: 0;
1075 &:hover { background: rgba(255,255,255,0.08); color: #e6edf3; }
1076 &.copied { color: #39d353; border-color: #39d353; }
1077 }
1078
1079 .dd-terminal__body {
1080 padding: 12px 16px; margin: 0;
1081 font-size: 12px; font-family: var(--font-mono);
1082 color: #e6edf3; line-height: 1.65;
1083 overflow-x: auto; white-space: pre;
1084 }
1085
1086 // ── MCP callout ───────────────────────────────────────────────────────────────
1087 .dd-mcp-callout {
1088 display: flex; gap: 10px; align-items: flex-start;
1089 margin-top: var(--space-3); padding: 10px 12px;
1090 background: color-mix(in srgb, var(--dd-accent) 5%, transparent);
1091 border: 1px solid color-mix(in srgb, var(--dd-accent) 20%, transparent);
1092 border-radius: var(--radius-sm);
1093 font-size: 13px; color: var(--text-secondary); line-height: 1.5;
1094 }
1095
1096 .dd-mcp-callout__icon { font-size: 22px; flex-shrink: 0; }
1097
1098 // Sidebar uses shared .ph-sidebar, .ph-sidebar-section, .ph-sidebar-heading
1099
1100 // ── Artifact badges ───────────────────────────────────────────────────────────
1101 .dd-artifact-list { display: flex; flex-wrap: wrap; gap: 6px; }
1102
1103 .dd-artifact-badge {
1104 font-size: 11px; font-family: var(--font-mono);
1105 padding: 3px 9px; border-radius: 4px;
1106 background: transparent;
1107 color: var(--dd-accent);
1108 border: 1px solid color-mix(in srgb, var(--dd-accent) 28%, transparent);
1109 }
1110
1111 // ── Hash / URI blocks ─────────────────────────────────────────────────────────
1112 .dd-hash-block {
1113 display: flex; align-items: center; gap: 8px;
1114 background: transparent;
1115 border: 1px solid var(--border-subtle);
1116 border-radius: var(--radius-sm);
1117 padding: 8px 12px;
1118 }
1119
1120 .dd-hash-code {
1121 font-size: 11px; font-family: var(--font-mono);
1122 color: var(--text-secondary); word-break: break-all; flex: 1;
1123 }
1124
1125 .dd-hash-copy {
1126 font-size: 13px; padding: 2px 8px;
1127 border: 1px solid var(--border-subtle);
1128 background: transparent; color: var(--text-muted);
1129 cursor: pointer; border-radius: 4px;
1130 transition: all 0.15s; flex-shrink: 0;
1131 font-family: var(--font-mono);
1132 &:hover { color: var(--text-primary); border-color: var(--border-default); }
1133 &.copied { color: #39d353; border-color: #39d353; }
1134 }
1135
1136 // ── Meta list ─────────────────────────────────────────────────────────────────
1137 .dd-meta-list {
1138 display: grid; grid-template-columns: auto 1fr;
1139 gap: 8px 14px; margin: 0;
1140
1141 dt {
1142 font-size: 11px; color: var(--text-muted);
1143 text-transform: uppercase; letter-spacing: 0.05em;
1144 align-self: center;
1145 }
1146 dd {
1147 font-size: 13px; color: var(--text-primary);
1148 font-family: var(--font-mono); margin: 0; align-self: center;
1149 }
1150 }
1151
1152 // ── Repo grid ─────────────────────────────────────────────────────────────────
1153 .dd-repo-grid {
1154 display: grid;
1155 grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1156 gap: 10px;
1157 }
1158
1159 .dd-repo-card {
1160 display: flex; flex-direction: column; gap: 6px;
1161 padding: 12px 14px;
1162 background: transparent;
1163 border: 1px solid var(--border-subtle);
1164 border-radius: var(--radius-sm);
1165 text-decoration: none;
1166 transition: border-color 0.15s, background 0.15s;
1167 &:hover {
1168 border-color: var(--border-default);
1169 background: rgba(255,255,255,0.02);
1170 .dd-repo-card__arrow { opacity: 1; transform: translateX(3px); }
1171 }
1172 }
1173
1174 .dd-repo-card__header {
1175 display: flex; align-items: center; justify-content: space-between;
1176 }
1177
1178 .dd-repo-card__name {
1179 font-size: 13px; font-weight: 600; color: var(--color-accent);
1180 }
1181
1182 .dd-repo-card__arrow {
1183 font-size: 14px; color: var(--dd-accent);
1184 opacity: 0.3; transition: opacity 0.15s, transform 0.15s;
1185 }
1186
1187 .dd-repo-card__desc {
1188 font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4;
1189 }
1190
1191 .dd-see-all { margin-top: var(--space-4); }
1192
1193 .dd-repos-empty {
1194 display: flex; flex-direction: column; align-items: center;
1195 padding: 64px var(--space-4);
1196 border: 1px solid var(--border-subtle);
1197 border-radius: var(--radius-sm);
1198 color: var(--text-muted);
1199 p { margin: var(--space-2) 0 var(--space-4); font-size: 13px; }
1200 }
1201
1202 .dd-repos-empty__icon {
1203 margin-bottom: var(--space-3);
1204 opacity: 0.35;
1205 color: var(--text-secondary);
1206 }
1207
1208 // ── Domains listing page ───────────────────────────────────────────────────────
1209
1210 /* Hero */
1211 .dm-hero {
1212 position: relative;
1213 background: linear-gradient(135deg, #0d1117 0%, #0f1923 50%, #0d1117 100%);
1214 border-bottom: 1px solid var(--border-default);
1215 overflow: hidden;
1216 padding: 0 var(--space-4);
1217 }
1218 .dm-hero-glow {
1219 position: absolute; inset: 0;
1220 background:
1221 radial-gradient(ellipse 60% 80% at 75% 30%, rgba(88,166,255,0.06) 0%, transparent 70%),
1222 radial-gradient(ellipse 40% 60% at 5% 80%, rgba(188,140,255,0.05) 0%, transparent 60%);
1223 pointer-events: none;
1224 }
1225 .dm-hero-inner {
1226 position: relative;
1227 display: flex;
1228 justify-content: space-between;
1229 align-items: center;
1230 gap: var(--space-6);
1231 padding: var(--space-8) 0 var(--space-6);
1232 }
1233 .dm-hero-left {
1234 flex: 1; min-width: 0; max-width: 560px;
1235 }
1236 .dm-hero-title {
1237 font-size: clamp(26px, 4vw, 38px);
1238 font-weight: 800;
1239 line-height: 1.15;
1240 letter-spacing: -0.02em;
1241 margin: 0 0 var(--space-3);
1242 color: var(--text-primary);
1243 }
1244 .dm-hero-sub {
1245 font-size: 14px;
1246 line-height: 1.65;
1247 color: var(--text-secondary);
1248 margin: 0 0 var(--space-4);
1249 max-width: 460px;
1250 }
1251
1252 /* Inline search bar — matches explore page exactly */
1253 .dm-search-field {
1254 display: flex;
1255 align-items: center;
1256 gap: 8px;
1257 height: 40px;
1258 border: 1px solid rgba(255,255,255,0.1);
1259 border-radius: 6px;
1260 padding: 0 14px;
1261 background: transparent;
1262 max-width: 400px;
1263 margin-bottom: var(--space-3);
1264 transition: border-color 0.15s;
1265 &:focus-within { border-color: rgba(88, 166, 255, 0.45); }
1266 }
1267 .dm-search-icon { color: var(--text-muted); flex-shrink: 0; }
1268 // Use higher specificity (.dm-search-field input) to override global input[type="text"] rule
1269 .dm-search-field input.dm-search-input {
1270 flex: 1;
1271 background: transparent;
1272 border: none;
1273 outline: none;
1274 box-shadow: none;
1275 padding: 0;
1276 width: auto;
1277 color: var(--text-primary);
1278 font-size: 15px;
1279 font-family: var(--font-sans);
1280 appearance: none;
1281 -webkit-appearance: none;
1282 &::placeholder { color: var(--text-muted); }
1283 }
1284
1285 /* Verified toggle — styled pill chip */
1286 .dm-verified-toggle {
1287 display: inline-flex;
1288 align-items: center;
1289 cursor: pointer;
1290 user-select: none;
1291 }
1292 .dm-verified-toggle input[type="checkbox"] {
1293 // visually hidden but accessible
1294 position: absolute;
1295 opacity: 0;
1296 width: 0;
1297 height: 0;
1298 pointer-events: none;
1299 }
1300 .dm-verified-chip {
1301 display: inline-flex;
1302 align-items: center;
1303 gap: 5px;
1304 font-size: 11px;
1305 font-weight: 500;
1306 letter-spacing: 0.02em;
1307 padding: 4px 10px;
1308 border-radius: 20px;
1309 border: 1px solid var(--border-default);
1310 color: var(--text-muted);
1311 background: transparent;
1312 transition: border-color 0.15s, color 0.15s, background 0.15s;
1313 svg { opacity: 0.4; transition: opacity 0.15s; }
1314 }
1315 .dm-verified-toggle:hover .dm-verified-chip {
1316 border-color: var(--border-emphasis);
1317 color: var(--text-secondary);
1318 svg { opacity: 0.7; }
1319 }
1320 .dm-verified-toggle input:checked ~ .dm-verified-chip {
1321 background: rgba(57, 211, 83, 0.08);
1322 border-color: rgba(57, 211, 83, 0.3);
1323 color: #39d353;
1324 svg { opacity: 1; stroke: #39d353; }
1325 }
1326
1327 /* Right stat pills */
1328 .dm-hero-right {
1329 display: flex;
1330 flex-direction: column;
1331 gap: var(--space-2);
1332 flex-shrink: 0;
1333 }
1334 .dm-stat-pill {
1335 display: flex;
1336 align-items: center;
1337 gap: 10px;
1338 background: transparent;
1339 border: 1px solid var(--border-subtle);
1340 border-radius: var(--radius-sm);
1341 padding: 9px 14px;
1342 min-width: 130px;
1343 }
1344 .dm-stat-value {
1345 font-family: var(--font-mono);
1346 font-size: 18px;
1347 font-weight: 700;
1348 color: var(--text-primary);
1349 line-height: 1;
1350 }
1351 .dm-stat-label {
1352 font-size: 11px;
1353 font-weight: 500;
1354 color: var(--text-muted);
1355 text-transform: uppercase;
1356 letter-spacing: 0.06em;
1357 }
1358
1359 /* Body */
1360 .dm-body {
1361 padding: var(--space-4) var(--space-4);
1362 }
1363 .dm-empty {
1364 padding: var(--space-6) 0;
1365 font-size: 14px;
1366 color: var(--text-muted);
1367 text-align: center;
1368 }
1369 .dm-scoped-id {
1370 margin-left: auto;
1371 }
1372
1373 /* Domain grid */
1374 .domain-grid {
1375 display: grid;
1376 grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1377 gap: 12px;
1378 }
1379
1380 /* Domain card */
1381 .domain-card {
1382 display: flex;
1383 flex-direction: column;
1384 gap: var(--space-2);
1385 padding: var(--space-3) var(--space-3);
1386 background: transparent;
1387 border: 1px solid var(--border-subtle);
1388 border-radius: var(--radius-sm);
1389 text-decoration: none;
1390 transition: border-color 0.15s, background 0.15s;
1391 &:hover {
1392 border-color: var(--border-default);
1393 background: rgba(255,255,255,0.025);
1394 }
1395 }
1396 .domain-card__header {
1397 display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
1398 }
1399 .domain-card__name {
1400 font-size: 14px; font-weight: 600; color: var(--text-primary);
1401 }
1402 .badge-verified {
1403 font-size: 10px; padding: 2px 7px; border-radius: 10px;
1404 background: color-mix(in srgb, #39d353 12%, transparent);
1405 color: #39d353; border: 1px solid color-mix(in srgb, #39d353 20%, transparent);
1406 letter-spacing: 0.03em;
1407 }
1408 .badge-deprecated {
1409 font-size: 10px; padding: 2px 7px; border-radius: 10px;
1410 background: color-mix(in srgb, #f97316 12%, transparent);
1411 color: #f97316; border: 1px solid color-mix(in srgb, #f97316 20%, transparent);
1412 }
1413 .domain-card__description {
1414 font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.5;
1415 display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
1416 overflow: hidden;
1417 }
1418 .domain-card__meta {
1419 display: flex; gap: 12px; font-size: 11px; color: var(--text-muted);
1420 margin-top: auto; flex-wrap: wrap; align-items: center;
1421 }
1422 .domain-card__stat { display: inline-flex; align-items: center; gap: 4px; }
1423 .domain-card__viewer, .domain-card__merge {
1424 font-size: 10px; padding: 2px 6px; border-radius: 3px;
1425 background: var(--bg-overlay); color: var(--text-muted);
1426 border: 1px solid var(--border-subtle); font-family: var(--font-mono);
1427 }
1428
1429 /* CTA */
1430 .domains-cta {
1431 border-top: 1px solid var(--border-subtle);
1432 padding: var(--space-5) var(--space-4);
1433 }
1434 .domains-cta__inner {
1435 display: flex;
1436 align-items: center;
1437 justify-content: space-between;
1438 gap: var(--space-4);
1439 flex-wrap: wrap;
1440 }
1441 .domains-cta__text { flex: 1; min-width: 0; }
1442 .domains-cta__title { font-size: 15px; font-weight: 600; margin: 0 0 4px; color: var(--text-primary); }
1443 .domains-cta__body {
1444 font-size: 13px; color: var(--text-muted); margin: 0;
1445 code { font-family: var(--font-mono); font-size: 12px; color: var(--color-accent); }
1446 }
1447 .domains-cta__actions { display: flex; gap: 8px; flex-shrink: 0; flex-wrap: wrap; }
1448
1449 /* Themed CTA buttons (override generic .btn) */
1450 .dm-cta-btn {
1451 display: inline-flex;
1452 align-items: center;
1453 gap: 6px;
1454 font-size: 12px;
1455 font-weight: 500;
1456 padding: 6px 14px;
1457 border-radius: 6px;
1458 text-decoration: none;
1459 transition: border-color 0.15s, color 0.15s, background 0.15s;
1460 }
1461 .dm-cta-btn--primary {
1462 border: 1px solid rgba(88,166,255,0.35);
1463 color: var(--color-accent);
1464 background: rgba(88,166,255,0.06);
1465 &:hover {
1466 border-color: rgba(88,166,255,0.6);
1467 background: rgba(88,166,255,0.12);
1468 color: var(--color-accent);
1469 text-decoration: none;
1470 }
1471 }
1472 .dm-cta-btn--secondary {
1473 border: 1px solid var(--border-default);
1474 color: var(--text-secondary);
1475 background: transparent;
1476 &:hover {
1477 border-color: var(--border-emphasis);
1478 color: var(--text-primary);
1479 background: rgba(255,255,255,0.04);
1480 text-decoration: none;
1481 }
1482 }
1483
1484 @media (max-width: 640px) {
1485 .dm-hero-right { display: none; }
1486 .dm-hero-left { max-width: 100%; }
1487 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago