gabriel / musehub public
_domains-viz.scss
686 lines 21.2 KB
Raw
sha256:0997d6250ae6476362f6fe2025af7789f46d03df3e9f34356d5e8ee79b201923 fix(issues): use issue number as pagination cursor, not cre… Sonnet 4.6 patch 8 days ago
1 // ─────────────────────────────────────────────────────────────────────────────
2 // Component: Domain Protocol visualizations
3 // File: src/scss/components/_domains-viz.scss
4 //
5 // Two visualization blocks for /muse/domains (Phase 03):
6 // 1. .domains-cap-* — "What Every Plugin Gets for Free" (4-cap grid)
7 // 2. .domains-da-* — "Five Algebras. One Typed Result." (diff algebra)
8 //
9 // Tokens: all from theme/_tokens.scss — no raw hex values here.
10 // ─────────────────────────────────────────────────────────────────────────────
11
12 // ── Shared: section intro ─────────────────────────────────────────────────────
13
14 .domains-viz-lead {
15 font-size: var(--text-base);
16 color: var(--text-secondary);
17 line-height: 1.65;
18 margin: 0 0 var(--space-6);
19 max-width: 640px;
20 }
21
22 // ─────────────────────────────────────────────────────────────────────────────
23 // 1. Capability showcase — "What Every Plugin Gets for Free"
24 // ─────────────────────────────────────────────────────────────────────────────
25
26 .domains-cap-grid {
27 display: grid;
28 grid-template-columns: 1fr 1fr;
29 gap: var(--space-4);
30 margin-top: var(--space-4);
31
32 @media (max-width: 860px) { grid-template-columns: 1fr; }
33 }
34
35 .domains-cap-card {
36 border-radius: 10px;
37 border: 1px solid var(--border-default);
38 background: var(--bg-surface);
39 overflow: hidden;
40 display: flex;
41 flex-direction: column;
42 transition: border-color 0.15s;
43
44 &:hover { border-color: var(--border-strong); }
45 }
46
47 .domains-cap-header {
48 display: flex;
49 flex-direction: column;
50 gap: var(--space-1);
51 padding: var(--space-4) var(--space-5);
52 border-bottom: 1px solid var(--border-default);
53 background: var(--bg-elevated);
54 }
55
56 .domains-cap-badge {
57 display: inline-flex;
58 align-items: center;
59 gap: 6px;
60 font-size: 12px;
61 font-weight: 600;
62 font-family: var(--font-mono);
63 padding: 3px 8px;
64 border-radius: 5px;
65 border: 1px solid transparent;
66 width: fit-content;
67
68 &--delta { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 10%, transparent); border-color: color-mix(in srgb, var(--color-warning) 25%, transparent); }
69 &--schema { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); border-color: color-mix(in srgb, var(--color-accent) 25%, transparent); }
70 &--merge { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); }
71 &--harmony { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); border-color: color-mix(in srgb, var(--color-purple) 25%, transparent); }
72 }
73
74 .domains-cap-sub {
75 font-size: 12px;
76 color: var(--text-muted);
77 line-height: 1.4;
78 }
79
80 .domains-cap-body {
81 padding: var(--space-4) var(--space-5);
82 flex: 1;
83 }
84
85 .domains-cap-desc {
86 font-size: 13px;
87 color: var(--text-secondary);
88 line-height: 1.65;
89 margin: 0 0 var(--space-4);
90
91 code {
92 font-family: var(--font-mono);
93 font-size: 12px;
94 background: var(--bg-overlay);
95 border: 1px solid var(--border-default);
96 border-radius: 3px;
97 padding: 1px 5px;
98 color: var(--color-purple);
99 }
100
101 strong { color: var(--text-primary); font-weight: 600; }
102 }
103
104 // ── AMM (Address-keyed Map Merge) scenarios ───────────────────────────────────
105
106 .domains-amm-scenarios {
107 display: flex;
108 flex-direction: column;
109 gap: var(--space-3);
110 }
111
112 .domains-amm-scenario {
113 border-radius: 8px;
114 border: 1px solid var(--border-default);
115 overflow: hidden;
116
117 &--clean { border-color: color-mix(in srgb, var(--color-success) 25%, transparent); }
118 &--conflict { border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); }
119 }
120
121 .domains-amm-scenario-hdr {
122 display: flex;
123 align-items: center;
124 gap: var(--space-3);
125 padding: 6px var(--space-4);
126 border-bottom: 1px solid var(--border-subtle);
127 background: var(--bg-elevated);
128 }
129
130 .domains-amm-scenario-label {
131 font-size: 10px;
132 font-weight: 700;
133 font-family: var(--font-mono);
134 color: var(--text-muted);
135 letter-spacing: 0.06em;
136 text-transform: uppercase;
137 }
138
139 .domains-amm-scenario-title {
140 font-size: 12px;
141 color: var(--text-secondary);
142 }
143
144 .domains-amm-ops {
145 padding: var(--space-3) var(--space-4);
146 display: flex;
147 flex-direction: column;
148 gap: var(--space-2);
149 border-bottom: 1px solid var(--border-subtle);
150 }
151
152 .domains-amm-op {
153 display: flex;
154 align-items: center;
155 gap: var(--space-2);
156 flex-wrap: wrap;
157 }
158
159 .domains-amm-op-side {
160 font-size: 10px;
161 font-weight: 700;
162 font-family: var(--font-mono);
163 text-transform: uppercase;
164 letter-spacing: 0.06em;
165 color: var(--text-muted);
166 min-width: 32px;
167 }
168
169 .domains-amm-op-type {
170 font-size: 11px;
171 font-weight: 600;
172 font-family: var(--font-mono);
173 padding: 2px 7px;
174 border-radius: 4px;
175
176 &--insert { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); }
177 &--replace { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); }
178 &--delete { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); }
179 }
180
181 .domains-amm-op-addr {
182 font-size: 12px;
183 font-family: var(--font-mono);
184 color: var(--color-accent-link);
185 }
186
187 .domains-amm-op-meta {
188 font-size: 11px;
189 color: var(--text-muted);
190 }
191
192 .domains-amm-result {
193 display: flex;
194 align-items: center;
195 justify-content: space-between;
196 gap: var(--space-3);
197 padding: 6px var(--space-4);
198 flex-wrap: wrap;
199 }
200
201 .domains-amm-reason {
202 font-size: 11px;
203 color: var(--text-muted);
204 font-style: italic;
205 }
206
207 .domains-amm-badge {
208 display: inline-flex;
209 align-items: center;
210 gap: 5px;
211 font-size: 11px;
212 font-weight: 600;
213 font-family: var(--font-mono);
214 padding: 2px 8px;
215 border-radius: 4px;
216
217 &--clean { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); }
218 &--conflict { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); }
219 }
220
221 // ── Schema domain grid (cap-card: Domain Schema) ──────────────────────────────
222
223 .domains-schema-grid {
224 display: flex;
225 flex-direction: column;
226 gap: var(--space-2);
227 }
228
229 .domains-schema-row {
230 display: grid;
231 grid-template-columns: 80px 1fr auto;
232 align-items: center;
233 gap: var(--space-3);
234 padding: 6px var(--space-3);
235 border-radius: 6px;
236 border: 1px solid var(--border-subtle);
237 background: var(--bg-elevated);
238 font-size: 12px;
239 font-family: var(--font-mono);
240 }
241
242 .domains-schema-name {
243 font-weight: 600;
244 color: var(--text-primary);
245 }
246
247 .domains-schema-dims {
248 color: var(--text-muted);
249 overflow: hidden;
250 text-overflow: ellipsis;
251 white-space: nowrap;
252 }
253
254 .domains-schema-mode {
255 font-size: 10px;
256 padding: 1px 6px;
257 border-radius: 4px;
258 letter-spacing: 0.03em;
259 white-space: nowrap;
260
261 &--three-way { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); }
262 &--addressed { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); }
263 &--crdt { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); }
264 }
265
266 // ─────────────────────────────────────────────────────────────────────────────
267 // 2. Diff algebra — "Five Algebras. One Typed Result."
268 // ─────────────────────────────────────────────────────────────────────────────
269
270 .domains-da-grid {
271 display: grid;
272 grid-template-columns: 1fr 1fr;
273 gap: var(--space-4);
274 margin-top: var(--space-4);
275
276 @media (max-width: 860px) { grid-template-columns: 1fr; }
277 }
278
279 .domains-da-card {
280 border-radius: 10px;
281 border: 1px solid var(--border-default);
282 background: var(--bg-surface);
283 padding: var(--space-4);
284 display: flex;
285 flex-direction: column;
286 gap: var(--space-3);
287
288 &--full { grid-column: 1 / -1; }
289 }
290
291 .domains-da-card-hdr {
292 display: flex;
293 align-items: center;
294 justify-content: space-between;
295 gap: var(--space-3);
296 }
297
298 .domains-da-chip {
299 font-size: 11px;
300 font-weight: 700;
301 font-family: var(--font-mono);
302 padding: 2px 8px;
303 border-radius: 4px;
304 letter-spacing: 0.04em;
305
306 &--seq { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); }
307 &--tree { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); }
308 &--tensor { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); }
309 &--set { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); }
310 &--map { color: var(--color-teal); background: color-mix(in srgb, var(--color-teal) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); }
311 }
312
313 .domains-da-algo-name {
314 font-size: 11px;
315 color: var(--text-muted);
316 font-family: var(--font-mono);
317 text-align: right;
318 }
319
320 .domains-da-domains-row {
321 font-size: 11px;
322 color: var(--text-muted);
323 }
324
325 .domains-da-note {
326 font-size: 11px;
327 color: var(--text-muted);
328 line-height: 1.5;
329 padding-top: var(--space-2);
330 border-top: 1px solid var(--border-subtle);
331 }
332
333 // ── Sequence visual ───────────────────────────────────────────────────────────
334
335 .domains-seq-vis {
336 display: flex;
337 flex-direction: column;
338 gap: 4px;
339 font-family: var(--font-mono);
340 overflow-x: auto;
341 }
342
343 .domains-seq-row-lbl {
344 font-size: 9px;
345 font-weight: 700;
346 letter-spacing: 0.08em;
347 text-transform: uppercase;
348 color: var(--text-muted);
349 }
350
351 .domains-seq-row {
352 display: flex;
353 gap: 4px;
354 }
355
356 .domains-seq-blk {
357 display: flex;
358 flex-direction: column;
359 align-items: center;
360 gap: 2px;
361 padding: 4px 6px;
362 border-radius: 5px;
363 border: 1px solid var(--border-default);
364 background: var(--bg-elevated);
365 min-width: 46px;
366
367 &--match { border-color: var(--border-default); opacity: 0.7; }
368 &--del { border-color: color-mix(in srgb, var(--color-danger) 40%, transparent); background: color-mix(in srgb, var(--color-danger) 8%, var(--bg-elevated)); text-decoration: line-through; opacity: 0.7; }
369 &--ins { border-color: color-mix(in srgb, var(--color-success) 40%, transparent); background: color-mix(in srgb, var(--color-success) 8%, var(--bg-elevated)); }
370 &--moved-from { border: 1px dashed color-mix(in srgb, var(--color-purple) 50%, transparent); background: color-mix(in srgb, var(--color-purple) 6%, var(--bg-elevated)); }
371 &--moved-to { border-color: color-mix(in srgb, var(--color-purple) 50%, transparent); background: color-mix(in srgb, var(--color-purple) 10%, var(--bg-elevated)); }
372 }
373
374 .domains-seq-hash {
375 font-size: 9px;
376 color: var(--text-muted);
377 letter-spacing: 0.02em;
378 }
379
380 .domains-seq-name {
381 font-size: 12px;
382 font-weight: 600;
383 color: var(--text-primary);
384 }
385
386 .domains-seq-ops-row {
387 display: flex;
388 gap: 4px;
389 }
390
391 .domains-seq-op-cell {
392 min-width: 46px;
393 display: flex;
394 justify-content: center;
395 }
396
397 .domains-da-op {
398 font-size: 10px;
399 font-weight: 600;
400 font-family: var(--font-mono);
401 padding: 1px 5px;
402 border-radius: 3px;
403 white-space: nowrap;
404
405 &--match { color: var(--text-muted); }
406 &--delete { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); }
407 &--insert { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); }
408 &--move { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); }
409 }
410
411 // ── Tensor visual ─────────────────────────────────────────────────────────────
412
413 .domains-tensor-wrap {
414 display: flex;
415 align-items: center;
416 gap: var(--space-4);
417 flex-wrap: wrap;
418 }
419
420 .domains-tensor-panel {
421 display: flex;
422 flex-direction: column;
423 gap: 4px;
424 }
425
426 .domains-tensor-label {
427 font-size: 10px;
428 font-family: var(--font-mono);
429 color: var(--text-muted);
430 text-align: center;
431 }
432
433 .domains-tensor-grid {
434 display: grid;
435 grid-template-columns: repeat(4, 22px);
436 gap: 3px;
437 }
438
439 .domains-tc {
440 width: 22px;
441 height: 22px;
442 border-radius: 3px;
443
444 &--0 { background: var(--bg-elevated); }
445 &--1 { background: color-mix(in srgb, var(--color-accent) 20%, var(--bg-elevated)); }
446 &--2 { background: color-mix(in srgb, var(--color-accent) 40%, var(--bg-elevated)); }
447 &--3 { background: color-mix(in srgb, var(--color-accent) 65%, var(--bg-elevated)); }
448 &--warm1 { background: color-mix(in srgb, var(--color-warning) 50%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-warning) 50%, transparent); }
449 &--hot2 { background: color-mix(in srgb, var(--color-danger) 55%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-danger) 55%, transparent); }
450 &--hot3 { background: color-mix(in srgb, var(--color-danger) 80%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-danger) 70%, transparent); }
451 }
452
453 .domains-tensor-arrow {
454 font-size: 18px;
455 color: var(--text-muted);
456 flex-shrink: 0;
457 }
458
459 .domains-tensor-legend {
460 display: flex;
461 gap: var(--space-3);
462 flex-wrap: wrap;
463 }
464
465 .domains-tl-item {
466 display: flex;
467 align-items: center;
468 gap: 5px;
469 font-size: 10px;
470 font-family: var(--font-mono);
471 color: var(--text-muted);
472 }
473
474 .domains-tl-swatch {
475 width: 10px;
476 height: 10px;
477 border-radius: 2px;
478 flex-shrink: 0;
479
480 &--unchanged { background: var(--bg-elevated); border: 1px solid var(--border-default); }
481 &--warm { background: color-mix(in srgb, var(--color-warning) 50%, var(--bg-elevated)); }
482 &--hot { background: color-mix(in srgb, var(--color-danger) 70%, var(--bg-elevated)); }
483 }
484
485 // ── Set visual ────────────────────────────────────────────────────────────────
486
487 .domains-set-vis {
488 display: flex;
489 gap: var(--space-3);
490 align-items: flex-start;
491 font-family: var(--font-mono);
492 font-size: 11px;
493 }
494
495 .domains-set-col {
496 display: flex;
497 flex-direction: column;
498 gap: 4px;
499 }
500
501 .domains-set-header {
502 font-size: 9px;
503 font-weight: 700;
504 letter-spacing: 0.08em;
505 text-transform: uppercase;
506 color: var(--text-muted);
507 margin-bottom: 2px;
508 }
509
510 .domains-set-members {
511 display: flex;
512 flex-direction: column;
513 gap: 3px;
514 }
515
516 .domains-set-member {
517 padding: 2px 7px;
518 border-radius: 4px;
519 border: 1px solid var(--border-default);
520 white-space: nowrap;
521
522 &--kept { color: var(--text-secondary); background: var(--bg-elevated); }
523 &--removed { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 8%, var(--bg-elevated)); border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); text-decoration: line-through; }
524 &--added { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 8%, var(--bg-elevated)); border-color: color-mix(in srgb, var(--color-success) 25%, transparent); }
525 }
526
527 .domains-set-ops-col {
528 display: flex;
529 flex-direction: column;
530 gap: 3px;
531 padding-top: 20px;
532 }
533
534 .domains-set-op-line {
535 font-size: 11px;
536 padding: 2px 4px;
537 line-height: 1.4;
538 text-align: center;
539
540 &--keep { color: var(--text-muted); }
541 &--rm { color: var(--color-danger); }
542 &--add { color: var(--color-success); }
543 }
544
545 // ── Map visual ────────────────────────────────────────────────────────────────
546
547 .domains-map-vis {
548 display: flex;
549 flex-direction: column;
550 gap: 4px;
551 font-family: var(--font-mono);
552 font-size: 11px;
553 }
554
555 .domains-map-entry {
556 display: flex;
557 align-items: center;
558 gap: var(--space-2);
559 padding: 4px 8px;
560 border-radius: 5px;
561 border: 1px solid var(--border-subtle);
562 flex-wrap: wrap;
563
564 &--changed { background: var(--bg-elevated); border-color: var(--border-default); }
565 &--unchanged { background: var(--bg-surface); opacity: 0.55; }
566 }
567
568 .domains-map-key {
569 color: var(--color-accent-link);
570 font-weight: 600;
571 min-width: 56px;
572 }
573
574 .domains-map-val-before { color: var(--text-muted); }
575 .domains-map-delta { color: var(--text-disabled); padding: 0 2px; }
576 .domains-map-val-after { color: var(--text-primary); font-weight: 600; }
577
578 .domains-map-sub-algo {
579 margin-left: auto;
580 font-size: 10px;
581 font-weight: 700;
582 padding: 1px 6px;
583 border-radius: 3px;
584 letter-spacing: 0.03em;
585 white-space: nowrap;
586 }
587
588 // ── Tree SVG ──────────────────────────────────────────────────────────────────
589
590 .domains-tree-svg {
591 width: 100%;
592 max-width: 320px;
593 height: auto;
594 display: block;
595 margin: 0 auto;
596 }
597
598 // ── Delta flow (all five → one typed result) ──────────────────────────────────
599
600 .domains-da-delta-flow {
601 margin-top: var(--space-6);
602 border-radius: 10px;
603 border: 1px solid var(--border-default);
604 background: var(--bg-surface);
605 overflow: hidden;
606 }
607
608 .domains-da-delta-top {
609 display: flex;
610 flex-direction: column;
611 gap: 4px;
612 padding: var(--space-4) var(--space-5);
613 border-bottom: 1px solid var(--border-default);
614 background: var(--bg-elevated);
615 }
616
617 .domains-da-delta-label {
618 font-size: 13px;
619 font-weight: 700;
620 font-family: var(--font-mono);
621 color: var(--text-primary);
622 }
623
624 .domains-da-delta-sub {
625 font-size: 11px;
626 color: var(--text-muted);
627 }
628
629 .domains-da-delta-ops {
630 display: flex;
631 flex-wrap: wrap;
632 gap: var(--space-2);
633 padding: var(--space-4) var(--space-5);
634 border-bottom: 1px solid var(--border-default);
635 }
636
637 .domains-da-dop {
638 font-size: 12px;
639 font-weight: 600;
640 font-family: var(--font-mono);
641 padding: 3px 10px;
642 border-radius: 5px;
643
644 &--ins { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); }
645 &--del { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); }
646 &--mov { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); }
647 &--rep { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); }
648 &--pat { color: var(--color-teal); background: color-mix(in srgb, var(--color-teal) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); }
649 }
650
651 .domains-da-delta-merge {
652 display: grid;
653 grid-template-columns: 1fr auto 1fr;
654 gap: 0;
655 align-items: stretch;
656 }
657
658 .domains-da-merge-branch {
659 padding: var(--space-4) var(--space-5);
660
661 &--addressed { border-right: 1px solid var(--border-subtle); }
662 }
663
664 .domains-da-merge-divider {
665 display: flex;
666 align-items: center;
667 justify-content: center;
668 padding: 0 var(--space-3);
669 font-size: 11px;
670 color: var(--text-muted);
671 font-style: italic;
672 }
673
674 .domains-da-merge-mode-label {
675 font-size: 12px;
676 font-weight: 700;
677 font-family: var(--font-mono);
678 color: var(--text-primary);
679 margin-bottom: 4px;
680 }
681
682 .domains-da-merge-desc {
683 font-size: 12px;
684 color: var(--text-muted);
685 line-height: 1.55;
686 }
File History 1 commit
sha256:0997d6250ae6476362f6fe2025af7789f46d03df3e9f34356d5e8ee79b201923 fix(issues): use issue number as pagination cursor, not cre… Sonnet 4.6 patch 8 days ago