gabriel / musehub public
_symbol_detail.scss
611 lines 15.5 KB
Raw
sha256:9b711047e27df5ac91681c74aadfb0e31f69ffd4269932ea52f0c113764d8c0a docs(phase-03): rewrite Domain Protocol — AddressedMergePlu… Sonnet 4.6 minor ⚠ breaking 23 days ago
1 // ─────────────────────────────────────────────────────────────────────────────
2 // Component: Symbol Detail (.sd-* prefix)
3 // File: src/scss/components/_symbol_detail.scss
4 //
5 // Phase 2 — Health Dimensions Strip
6 // Phase 3 — Identity Banner 2-column restructure
7 // Phase 7 — Timeline refactor overlay tags + styled gap dividers
8 // ─────────────────────────────────────────────────────────────────────────────
9
10 // ── Timeline lineage boundary (renamed-from divider) ─────────────────────────
11
12 .sym2-tl-lineage-break {
13 display: flex;
14 align-items: center;
15 gap: 0.5rem;
16 padding: 0.5rem 0;
17 margin: 0.35rem 0 0.1rem;
18
19 &::before,
20 &::after {
21 content: '';
22 flex: 1;
23 height: 1px;
24 background: var(--color-purple);
25 opacity: 0.25;
26 }
27
28 svg {
29 color: var(--color-purple);
30 opacity: 0.7;
31 flex-shrink: 0;
32 }
33
34 span {
35 font-family: var(--font-mono);
36 font-size: 0.6rem;
37 color: var(--color-purple);
38 opacity: 0.8;
39 white-space: nowrap;
40 letter-spacing: 0.04em;
41 }
42
43 .sym2-tl-lineage-addr {
44 color: var(--color-purple);
45 text-decoration: none;
46 opacity: 1;
47
48 &:hover {
49 text-decoration: underline;
50 }
51 }
52 }
53
54 // ── Timeline gap divider (detail-page override) ───────────────────────────────
55
56 .sym2-detail-page .sym2-tl-gap {
57 display: flex;
58 align-items: center;
59 gap: 0.5rem;
60 padding: 0.3rem 0;
61 opacity: 0.5;
62
63 &::before,
64 &::after {
65 content: '';
66 flex: 1;
67 height: 1px;
68 background: var(--border-default);
69 }
70
71 span {
72 font-family: var(--font-mono);
73 font-size: 0.58rem;
74 color: var(--text-muted);
75 letter-spacing: 0.06em;
76 white-space: nowrap;
77 }
78 }
79
80 // ── Timeline readability overrides (detail-page scoped) ──────────────────────
81 //
82 // Each entry needs enough vertical room to be scanned without feeling cramped.
83 // The epoch break is the "chapter heading" — it should breathe above it.
84 // The commit message is the WHY — it should be readable, not truncated.
85
86 .sym2-detail-page {
87
88 .sym2-tl-content {
89 padding: 0.15rem 0 0.85rem 0.65rem;
90 }
91
92 .sym2-tl-message-row {
93 display: flex;
94 align-items: baseline;
95 gap: 0.4rem;
96 margin-top: 0.15rem;
97 }
98
99 .sym2-tl-branch-row {
100 display: flex;
101 align-items: baseline;
102 gap: 0.4rem;
103 margin-top: 0.2rem;
104 }
105
106 .sym2-tl-message {
107 white-space: normal;
108 font-size: 0.82rem;
109 color: var(--text-secondary);
110 line-height: 1.4;
111 }
112
113 .sym2-tl-header {
114 gap: 0.35rem;
115 margin-bottom: 0;
116 }
117 }
118
119 // ── Op label — plain colored ALL CAPS text, no pill chrome ────────────────────
120 .sd-op-badge {
121 background: none;
122 border: none;
123 border-radius: 0;
124 padding: 0;
125 font-size: 0.68rem;
126 font-weight: 800;
127 letter-spacing: 0.08em;
128 text-transform: uppercase;
129 font-family: var(--font-mono);
130
131 &.sd-op--add { color: var(--color-success); }
132 &.sd-op--mod { color: var(--color-accent); }
133 &.sd-op--del { color: var(--color-danger); }
134 &.sd-op--move { color: var(--color-orange); }
135 &.sd-op--rename { color: var(--color-purple); }
136 }
137
138 // ── Cohen-transform diff block ────────────────────────────────────────────────
139 .sd-body-diff {
140 margin: 0.5rem 0 0.25rem;
141 padding: 0.5rem 0.6rem;
142 background: var(--bg-elevated);
143 border-radius: 4px;
144 font-family: var(--font-mono);
145 font-size: 0.7rem;
146 line-height: 1.5;
147 overflow-x: auto;
148 white-space: pre;
149 color: var(--text-secondary);
150
151 .sd-diff-hunk {
152 color: var(--color-accent);
153 opacity: 0.8;
154 }
155
156 .sd-diff-add {
157 color: var(--color-success);
158 display: block;
159 }
160
161 .sd-diff-del {
162 color: var(--color-danger);
163 display: block;
164 }
165
166 .sd-diff-trunc {
167 color: var(--text-muted);
168 font-style: italic;
169 }
170 }
171
172 .sym2-detail-page {
173
174 .sym2-tl-line {
175 opacity: 0.45;
176 }
177
178 // Epoch break — more air above; feels like a section heading
179 .sym2-tl-epoch {
180 margin: 1.1rem 0 0.35rem;
181 padding: 0.4rem 0.75rem;
182 }
183 }
184
185 // ── Coupling heat fill — solid tier colour (replaces gradient) ────────────────
186
187 .sym2-heat-fill {
188 background: var(--color-accent); // default / low
189
190 &--high { background: var(--color-orange); }
191 &--critical { background: var(--color-danger); }
192 &--low { background: color-mix(in srgb, var(--text-muted) 60%, transparent); }
193 }
194
195 // ── Identity banner right column ──────────────────────────────────────────────
196
197 .sym2-hero-right {
198 display: flex;
199 flex-direction: column;
200 align-items: flex-end;
201 gap: 0.75rem;
202 flex-shrink: 0;
203
204 @media (max-width: 768px) {
205 align-items: flex-start;
206 width: 100%;
207 }
208 }
209
210 // ── Health dimensions strip ───────────────────────────────────────────────────
211
212 .sd-health-strip {
213 display: flex;
214 flex-wrap: wrap;
215 gap: 0;
216 // Pull edge-to-edge and butt up against the hero's bottom border
217 margin-left: calc(-1 * var(--space-4));
218 margin-right: calc(-1 * var(--space-4));
219 margin-top: -0.75rem; // cancel the .sym2-detail-page flex gap
220 border-bottom: 1px solid var(--border-default);
221 }
222
223 .sd-health-card {
224 flex: 1;
225 min-width: 9rem;
226 background: var(--bg-page);
227 border-right: 1px solid var(--border-default);
228 padding: 0.75rem calc(1rem + var(--space-4)) 0.8rem;
229 display: flex;
230 flex-direction: column;
231 gap: 0.35rem;
232 transition: background 0.12s ease;
233
234 &:last-child { border-right: none; }
235 &:hover { background: var(--bg-surface); }
236
237 }
238
239 .sd-health-label {
240 font-size: 0.6rem;
241 font-weight: 700;
242 letter-spacing: 0.09em;
243 text-transform: uppercase;
244 color: var(--text-muted);
245 display: flex;
246 align-items: center;
247 gap: 0.3rem;
248 }
249
250 // Fill bar — CSS-only, driven by inline style="--pct:N"
251 .sd-health-bar-wrap {
252 position: relative;
253 height: 4px;
254 background: color-mix(in srgb, var(--border-default) 60%, transparent);
255 border-radius: 2px;
256 overflow: hidden;
257 }
258
259 .sd-health-bar {
260 position: absolute;
261 inset: 0 auto 0 0;
262 width: var(--pct, 0%);
263 border-radius: 2px;
264 transition: width 0.4s ease;
265
266 .sd-health-card--stability & { background: var(--color-teal); }
267 .sd-health-card--type & { background: var(--color-purple); }
268 .sd-health-card--blast & { background: var(--color-danger); }
269 .sd-health-card--gravity & { background: var(--color-orange); }
270 .sd-health-card--api & { background: var(--color-success); }
271 }
272
273 .sd-health-score {
274 font-size: 1.1rem;
275 font-weight: 700;
276 font-family: var(--font-mono);
277 line-height: 1;
278
279 .sd-health-card--stability & { color: var(--color-teal); }
280 .sd-health-card--type & { color: var(--color-purple); }
281 .sd-health-card--gravity & { color: var(--color-orange); }
282 .sd-health-card--api & { color: var(--color-success); }
283
284 // Blast risk gets tier-specific colour
285 .sd-health-card--blast.sd-blast--critical & { color: var(--color-danger-critical); }
286 .sd-health-card--blast.sd-blast--high & { color: var(--color-danger); }
287 .sd-health-card--blast.sd-blast--medium & { color: var(--color-orange); }
288 .sd-health-card--blast.sd-blast--low & { color: var(--color-success); }
289 .sd-health-card--blast.sd-blast--none & { color: var(--text-muted); }
290 }
291
292 .sd-health-sub {
293 font-size: 0.62rem;
294 color: var(--text-muted);
295 font-family: var(--font-mono);
296 line-height: 1.3;
297 }
298
299 // ── Vitals quad (2×2 grid of key numbers in identity strip) ──────────────────
300
301 .sd-vitals-quad {
302 display: grid;
303 grid-template-columns: 1fr 1fr;
304 gap: 0.5rem 0.75rem;
305 min-width: 9rem;
306 flex-shrink: 0;
307 }
308
309 .sd-vitals-cell {
310 display: flex;
311 flex-direction: column;
312 gap: 0.15rem;
313 }
314
315 .sd-vitals-num {
316 font-size: 1.25rem;
317 font-weight: 700;
318 font-family: var(--font-mono);
319 color: var(--color-accent);
320 line-height: 1;
321 }
322
323 .sd-vitals-key {
324 font-size: 0.58rem;
325 font-weight: 600;
326 letter-spacing: 0.08em;
327 text-transform: uppercase;
328 color: var(--text-muted);
329 }
330
331 // ── Narrative line ────────────────────────────────────────────────────────────
332
333 .sd-narrative {
334 font-size: 0.78rem;
335 color: var(--text-secondary);
336 font-family: var(--font-mono);
337 margin: 0.4rem 0 0;
338 line-height: 1.5;
339 white-space: nowrap;
340 overflow: hidden;
341 text-overflow: ellipsis;
342 }
343
344 // ── Blast radius card (Zone 3 right column) ───────────────────────────────────
345
346 .sd-blast-radius {
347 display: grid;
348 grid-template-columns: 1fr 1fr;
349 gap: 0.4rem 0.75rem;
350 margin: 0.5rem 0;
351 }
352
353 .sd-blast-metric {
354 display: flex;
355 flex-direction: column;
356 gap: 0.1rem;
357 }
358
359 .sd-blast-metric-val {
360 font-size: 1rem;
361 font-weight: 700;
362 font-family: var(--font-mono);
363 color: var(--text-primary);
364 }
365
366 .sd-blast-metric-lbl {
367 font-size: 0.6rem;
368 font-weight: 600;
369 letter-spacing: 0.07em;
370 text-transform: uppercase;
371 color: var(--text-muted);
372 }
373
374 .sd-blast-top-list {
375 list-style: none;
376 padding: 0;
377 margin: 0.5rem 0 0;
378 display: flex;
379 flex-direction: column;
380 gap: 0.2rem;
381 }
382
383 .sd-blast-top-item {
384 font-size: 0.7rem;
385 font-family: var(--font-mono);
386 color: var(--text-secondary);
387 overflow: hidden;
388 text-overflow: ellipsis;
389 white-space: nowrap;
390
391 a {
392 color: var(--color-accent-link);
393 text-decoration: none;
394 &:hover { text-decoration: underline; }
395 }
396 }
397
398 // ── Refactoring history (Zone 4) ──────────────────────────────────────────────
399
400 .sd-refactor-section {
401 margin-top: 1.5rem;
402 }
403
404 .sd-section-title {
405 font-size: 0.65rem;
406 font-weight: 700;
407 letter-spacing: 0.1em;
408 text-transform: uppercase;
409 color: var(--text-muted);
410 margin: 0 0 0.6rem;
411 display: flex;
412 align-items: center;
413 gap: 0.4rem;
414 }
415
416 .sd-refactor-list {
417 display: flex;
418 flex-direction: column;
419 gap: 0;
420 border: 1px solid var(--border-default);
421 border-radius: 6px;
422 overflow: hidden;
423 }
424
425 .sd-refactor-row {
426 display: grid;
427 grid-template-columns: 6rem 1fr auto auto;
428 gap: 0 0.75rem;
429 align-items: center;
430 padding: 0.5rem 0.75rem;
431 background: var(--bg-page);
432 border-bottom: 1px solid var(--border-default);
433 transition: background 0.1s ease;
434
435 &:last-child { border-bottom: none; }
436 &:hover { background: var(--bg-surface); }
437
438 @media (max-width: 900px) {
439 grid-template-columns: 5rem 1fr;
440 .sd-refactor-detail { display: none; }
441 }
442 }
443
444 .sd-refactor-detail {
445 font-size: 0.7rem;
446 font-family: var(--font-mono);
447 color: var(--text-secondary);
448 overflow: hidden;
449 text-overflow: ellipsis;
450 white-space: nowrap;
451 }
452
453 .sd-refactor-time {
454 font-size: 0.65rem;
455 font-family: var(--font-mono);
456 color: var(--text-muted);
457 white-space: nowrap;
458 }
459
460 // ── Type health section (Zone 5) ──────────────────────────────────────────────
461
462 .sd-type-section {
463 margin-top: 1.5rem;
464 }
465
466 .sd-type-card {
467 background: var(--bg-page);
468 border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent);
469 border-radius: 8px;
470 padding: 1rem 1.25rem;
471 display: flex;
472 flex-direction: column;
473 gap: 0.6rem;
474 }
475
476 .sd-type-row {
477 display: flex;
478 align-items: center;
479 gap: 0.75rem;
480 }
481
482 .sd-type-label {
483 font-size: 0.65rem;
484 font-weight: 600;
485 letter-spacing: 0.07em;
486 text-transform: uppercase;
487 color: var(--text-muted);
488 min-width: 5rem;
489 }
490
491 .sd-type-val {
492 font-size: 0.78rem;
493 font-family: var(--font-mono);
494 color: var(--text-secondary);
495 }
496
497 .sd-type-return {
498 font-family: var(--font-mono);
499 font-size: 0.78rem;
500 color: var(--color-purple);
501 background: color-mix(in srgb, var(--color-purple) 10%, transparent);
502 padding: 1px 6px;
503 border-radius: 4px;
504 }
505
506 // ── API surface badge ─────────────────────────────────────────────────────────
507
508 .sd-api-card {
509 background: color-mix(in srgb, var(--color-success) 6%, transparent);
510 border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent);
511 border-radius: 6px;
512 padding: 0.5rem 0.75rem;
513 display: flex;
514 align-items: center;
515 gap: 0.5rem;
516 font-size: 0.72rem;
517 font-family: var(--font-mono);
518 color: var(--color-success);
519 margin-top: 0.75rem;
520 }
521
522 // ── Stable card ───────────────────────────────────────────────────────────────
523
524 .sd-stable-card {
525 background: color-mix(in srgb, var(--color-teal) 6%, transparent);
526 border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent);
527 border-radius: 6px;
528 padding: 0.5rem 0.75rem;
529 display: flex;
530 align-items: center;
531 gap: 0.5rem;
532 font-size: 0.72rem;
533 font-family: var(--font-mono);
534 color: var(--color-teal);
535 margin-top: 0.75rem;
536 }
537
538 // ── Dead code card ────────────────────────────────────────────────────────────
539
540 .sd-dead-card {
541 background: color-mix(in srgb, #79c0ff 6%, transparent);
542 border: 1px solid color-mix(in srgb, #79c0ff 25%, transparent);
543 border-radius: 6px;
544 padding: 0.5rem 0.75rem;
545 font-size: 0.72rem;
546 font-family: var(--font-mono);
547 color: #79c0ff;
548 margin-top: 0.75rem;
549 }
550
551 // ── Timeline refactor overlay tag ─────────────────────────────────────────────
552
553 .sd-tl-refactor-tag {
554 display: inline-flex;
555 align-items: center;
556 font-size: 0.58rem;
557 font-weight: 700;
558 letter-spacing: 0.04em;
559 padding: 1px 5px;
560 border-radius: 3px;
561 text-transform: lowercase;
562 white-space: nowrap;
563 background: color-mix(in srgb, var(--color-purple) 12%, transparent);
564 color: var(--color-purple);
565 border: 1px solid color-mix(in srgb, var(--color-purple) 30%, transparent);
566 }
567
568 // ── Pagination controls ───────────────────────────────────────────────────────
569
570 .sym2-pagination {
571 display: flex;
572 align-items: center;
573 gap: 0.15rem;
574 padding: 0.5rem 0 0.2rem;
575 justify-content: flex-start;
576 }
577
578 .sym2-page-btn {
579 display: inline-flex;
580 align-items: center;
581 justify-content: center;
582 width: 1.5rem;
583 height: 1.5rem;
584 border-radius: 4px;
585 background: transparent;
586 color: var(--color-accent-link);
587 font-size: 0.8rem;
588 text-decoration: none;
589 border: none;
590 transition: color 0.15s, background 0.15s;
591 line-height: 1;
592 cursor: pointer;
593
594 &:hover {
595 background: var(--bg-elevated);
596 color: var(--text-primary);
597 }
598
599 &--off {
600 color: var(--text-disabled);
601 cursor: default;
602 pointer-events: none;
603 }
604 }
605
606 .sym2-page-indicator {
607 font-size: 0.7rem;
608 color: var(--text-muted);
609 padding: 0 0.4rem;
610 white-space: nowrap;
611 }
File History 1 commit
sha256:9b711047e27df5ac91681c74aadfb0e31f69ffd4269932ea52f0c113764d8c0a docs(phase-03): rewrite Domain Protocol — AddressedMergePlu… Sonnet 4.6 minor 23 days ago