File size: 6,631 Bytes
5ea40ce
39a61da
 
 
 
 
 
 
 
 
 
 
 
 
 
5da533e
39a61da
 
5da533e
39a61da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5da533e
 
 
 
 
 
 
39a61da
 
 
5da533e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39a61da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/* sequence.css, utilities for any section that displays nucleotide or
   amino-acid sequences: gene track SVG (used by §1, §3, §5), the .seq-
   label header (with carbon/reference chips and length tags), the
   .seq-block monospace box, the .stat-row at the bottom of demos, and
   small reference-mismatch highlight styles shared by §1 and §5. */

/* --- Gene track + gene-info (shared by §1, §3, §5) --- */
.gene-info {
  font-family: "JetBrains Mono", monospace;
  font-size: 11px; color: #666;
  margin: 4px 0 12px;
  min-height: 14px;
}
.gene-info strong { color: #1f1f1d; font-weight: 500; }
.gene-track {
  width: 100%; height: 40px; display: block;
  margin: 4px 0 8px;
}
.gene-track.draggable { height: 52px; touch-action: none; }
.gene-track .exon { fill: #317f3f; }
.gene-track .intron { stroke: #aaa; stroke-width: 1; }
.gene-track .playhead { stroke: #bc2e25; stroke-width: 2; }
.gene-track .gen-region { fill: #317f3f; opacity: 0.15; }
.gene-track .prompt-region { fill: #1f1f1d; opacity: 0.04; }
.gene-track .handle { cursor: ew-resize; }
.gene-track .handle line { stroke: #1f1f1d; stroke-width: 1.5; }
.gene-track .handle polygon { fill: #1f1f1d; }
.gene-track .handle:hover line,
.gene-track .handle.dragging line { stroke: #000; stroke-width: 2; }
.gene-track .handle:hover polygon,
.gene-track .handle.dragging polygon { fill: #000; }
.gene-track .handle.gen line { stroke: #317f3f; }
.gene-track .handle.gen polygon { fill: #317f3f; }
.gene-track .handle.gen:hover line,
.gene-track .handle.gen.dragging line { stroke: #1f5024; stroke-width: 2; }
.gene-track .handle.gen:hover polygon,
.gene-track .handle.gen.dragging polygon { fill: #1f5024; }
.gene-track text { font-family: "JetBrains Mono", monospace; font-size: 9px; fill: #888; }

/* Instant tooltips (no native-title delay) for legend items. */
.legend-tip { position: relative; }
.legend-tip:hover::after {
  content: attr(data-tip);
  position: absolute;
  bottom: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  background: #1f1f1d;
  color: #f7f5ee;
  padding: 6px 10px;
  border-radius: 3px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  font-family: 'Inter', sans-serif;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: normal;
  text-transform: none;
  white-space: normal;
  width: max-content;
  max-width: 260px;
  line-height: 1.4;
  z-index: 10;
  pointer-events: none;
}
.legend-tip:hover::before {
  content: "";
  position: absolute;
  bottom: calc(100% + 2px);
  left: 50%;
  transform: translateX(-50%);
  border: 4px solid transparent;
  border-top-color: #1f1f1d;
  z-index: 10;
  pointer-events: none;
}
.track-axis-label {
  font-family: "JetBrains Mono", monospace; font-size: 9px;
  color: #888; text-transform: uppercase; letter-spacing: 1px;
  display: flex; justify-content: space-between; margin-top: -4px;
}

/* --- seq-label header row + chips + length tag (used by §1, §3, §5) --- */
.seq-label {
  font-family: "JetBrains Mono", monospace;
  font-size: 9px; color: #888; text-transform: uppercase; letter-spacing: 1.5px;
  margin-top: 14px; margin-bottom: 4px; display: flex; gap: 12px; align-items: center;
}
/* Generic colour-swatch chip used in inline legends across the demo
   (.seq-label, .track-axis-label, etc.). The class is the obvious
   semantic hook, so the selector is intentionally global rather than
   nested under a single parent — having the rule scoped to .seq-label
   broke every other legend that reused the pattern (e.g. the §6 results
   chart legend), which all rendered as zero-width invisible spans. */
.legend-swatch {
  display: inline-block; width: 8px; height: 8px; vertical-align: middle;
  margin-right: 4px; border-radius: 1px;
}

/* Chart legend variant of .track-axis-label (used by the §6 results
   bars chart). The base class is mono uppercase 9px which suits a thin
   axis caption; for a 4-model legend that pattern was hard to read.
   The variant keeps the demo's typographic system but bumps the legend
   to sentence-case 12px Inter and gives the swatches more visual weight
   so they read as a proper colour key rather than caption text. */
.chart-legend {
  font-family: "Inter", sans-serif;
  font-size: 12px;
  text-transform: none;
  letter-spacing: 0;
  color: var(--ink, #1f1f1d);
  padding-top: 16px;
  gap: 22px;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-start;
}
.chart-legend__item {
  display: inline-flex; align-items: center;
  font-weight: 500;
}
.chart-legend__item .legend-swatch {
  width: 14px; height: 14px;
  margin-right: 7px;
  border-radius: 2px;
}
/* Inline tag chips used in §5 to disambiguate carbon vs reference rows.
   Same shape/size, different colour band so the eye instantly maps a
   row of AAs to the correct identity without re-reading the full label. */
.seq-label .seq-tag {
  display: inline-block;
  font-size: 9px; letter-spacing: 1.5px;
  padding: 1px 6px; margin-right: 8px;
  border-radius: 2px;
  text-transform: uppercase;
  font-weight: 600;
}
.seq-label .seq-tag.carbon { background: #1f1f1d; color: #f7f5ee; }
.seq-label .seq-tag.ref    { background: #f0eee5; color: #555; border: 1px solid #d8d5c8; }
.seq-label .aa-len-tag {
  color: #1f1f1d;
  font-variant-numeric: tabular-nums;
  text-transform: none;
  letter-spacing: 0.3px;
}
/* In-label red stat used by the carbon row (e.g. "· 96 mismatches").
   Defined as a class so the JS doesn't have to inline color styles. */
.seq-label .seq-label-stat { color: #b00020; }

/* --- stat row at the bottom of every demo --- */
.stat-row {
  display: flex; flex-wrap: wrap; gap: 24px;
  margin-top: 14px; padding-top: 12px; border-top: 1px solid #eee;
  font-family: "JetBrains Mono", monospace; font-size: 11px;
}
.stat-pair { display: flex; flex-direction: column; gap: 2px; }
.stat-pair-label { font-size: 9px; color: #999; text-transform: uppercase; letter-spacing: 1.2px; }
.stat-pair-val { color: #1f1f1d; font-variant-numeric: tabular-nums; }
.stat-pair-val.muted { color: #aaa; }

/* --- Sequence display (shared with sandbox, used outside #panel-sandbox) --- */
.seq-block {
  font-family: "JetBrains Mono", monospace;
  background: #f7f7f7; border: 1px solid #e0e0e0;
  padding: 14px 18px; overflow-x: auto;
  white-space: pre; font-size: 12px; font-weight: 400;
  line-height: 1.85; letter-spacing: 1px;
}
.seq-block.empty { color: #aaa; font-weight: 300; letter-spacing: normal; }
.pos { color: #bbb; user-select: none; font-weight: 300; }

/* Mismatch highlighting in reference row (§1, §5). */
.ref-mismatch { background: rgba(188, 46, 37, 0.18); color: #b00020; }
.ref-match { color: #999; }