varri-js 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/style.css ADDED
@@ -0,0 +1,1183 @@
1
+ :root {
2
+ --brand-blue: #145a96;
3
+ --brand-blue-dark: #0f4676;
4
+ --brand-blue-soft: #eaf2f8;
5
+ --brand-accent: #f4bb44;
6
+ --surface: #ffffff;
7
+ --surface-muted: #f3f7fb;
8
+ --text-primary: #1c2b39;
9
+ --text-muted: #4f6478;
10
+ --border-soft: #ccd9e5;
11
+ }
12
+
13
+ /* ------------------------------------------------------------------ */
14
+ /* Layout & base */
15
+ /* ------------------------------------------------------------------ */
16
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
17
+
18
+ body {
19
+ font-family: "Segoe UI", Tahoma, Geneva, sans-serif;
20
+ background: linear-gradient(180deg, #f8fbff 0%, #eef3fb 45%, #ffffff 100%);
21
+ color: var(--text-primary);
22
+ }
23
+
24
+ header {
25
+ background: #344a9a;
26
+ color: #f7fbff;
27
+ padding: 20px;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: flex-start;
31
+ gap: 1.25rem;
32
+ border-bottom: none;
33
+ height: 100px;
34
+ }
35
+ .header-title {
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: .2rem;
39
+ }
40
+ header h1 { font-size: 1.6rem; }
41
+ header p { font-size: 0.9rem; opacity: 0.88; color: #d9e8f6; }
42
+ .group-logo-link {
43
+ display: inline-block;
44
+ text-decoration: none;
45
+ }
46
+ .group-logo {
47
+ height: 60px;
48
+ width: auto;
49
+ display: block;
50
+ }
51
+ .varri-logo {
52
+ height: 50px;
53
+ width: auto;
54
+ display: block;
55
+ }
56
+ .uni-logo-wrap {
57
+ margin-left: auto;
58
+ display: flex;
59
+ align-items: center;
60
+ }
61
+ .uni-logo-link {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: .35rem;
65
+ color: #f7fbff;
66
+ text-decoration: none;
67
+ line-height: 1;
68
+ }
69
+ .uni-logo-link:visited,
70
+ .uni-logo-link:hover,
71
+ .uni-logo-link:focus,
72
+ .uni-logo-link:active {
73
+ color: #f7fbff;
74
+ text-decoration: none;
75
+ }
76
+ .uni-logo-text {
77
+ color: #f7fbff;
78
+ font-size: .95rem;
79
+ white-space: nowrap;
80
+ }
81
+ .uni-logo {
82
+ height: 52px;
83
+ width: auto;
84
+ display: block;
85
+ }
86
+
87
+ main {
88
+ width: 100%;
89
+ max-width: 1300px;
90
+ padding: 15px;
91
+ display: grid;
92
+ grid-template-columns: 380px 1fr;
93
+ margin: 0 auto;
94
+ justify-content: start;
95
+ align-items: flex-start;
96
+ gap: 1.5rem;
97
+ }
98
+
99
+ .controls-column {
100
+ align-self: start;
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 0.5rem;
104
+ overflow: auto;
105
+
106
+ height: 100%;
107
+ min-height: 520px;
108
+ max-height: max(520px, calc(100vh - 260px));
109
+ }
110
+
111
+ .control-panel {
112
+ padding: .45rem;
113
+ }
114
+
115
+ .control-group {
116
+ border: 1px solid #dbe6f0;
117
+ border-radius: 8px;
118
+ background: #fbfdff;
119
+ overflow: visible;
120
+ }
121
+
122
+ .control-group > summary {
123
+ cursor: pointer;
124
+ padding: .6rem .8rem;
125
+ font-size: .9rem;
126
+ font-weight: 700;
127
+ color: var(--brand-blue-dark);
128
+ user-select: none;
129
+ vertical-align: middle;
130
+ width: 100%;
131
+ }
132
+
133
+ .control-group > summary::-webkit-details-marker {
134
+ margin-right: .35rem;
135
+ }
136
+
137
+ .control-group[open] > summary {
138
+ border-bottom: 1px solid #dbe6f0;
139
+ background: #f3f8fd;
140
+ }
141
+
142
+ .control-group-body {
143
+ padding: .4rem .8rem .35rem;
144
+ }
145
+
146
+ #full-screen-menu {
147
+ display: inline-flex;
148
+ align-items: sub;
149
+ gap: 6px;
150
+ vertical-align: middle;
151
+ margin-left: auto;
152
+ padding-left: 2rem;
153
+ }
154
+
155
+
156
+ /* ------------------------------------------------------------------ */
157
+ /* Input panel */
158
+ /* ------------------------------------------------------------------ */
159
+ .panel {
160
+ background: var(--surface);
161
+ border-radius: 8px;
162
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .12);
163
+ padding: .8rem;
164
+ }
165
+
166
+ .panel h2 {
167
+ font-size: 1rem;
168
+ text-transform: uppercase;
169
+ letter-spacing: .05em;
170
+ color: var(--brand-blue-dark);
171
+ border-bottom: 2px solid #dbe6f0;
172
+ padding-bottom: .5rem;
173
+ margin-bottom: 1rem;
174
+ }
175
+
176
+ label {
177
+ display: block;
178
+ font-size: .85rem;
179
+ font-weight: 600;
180
+ color: #2c4259;
181
+ margin-bottom: .25rem;
182
+ }
183
+
184
+ label small {
185
+ font-weight: 400;
186
+ color: var(--text-muted);
187
+ }
188
+
189
+ .list-counter {
190
+ color: #57606a;
191
+ font-size: 0.9em;
192
+ font-weight: normal;
193
+ }
194
+
195
+ .start-index-grid {
196
+ display: grid;
197
+ grid-template-columns: 1fr 1fr;
198
+ gap: .4rem;
199
+ }
200
+
201
+ .start-index-item {
202
+ min-width: 0;
203
+ }
204
+
205
+ .start-index-label-row {
206
+ display: flex;
207
+ align-items: center;
208
+ gap: .3rem;
209
+ margin-bottom: .2rem;
210
+ position: relative;
211
+ }
212
+
213
+ .start-index-label-row .legend-color {
214
+ margin-bottom: 0;
215
+ vertical-align: middle;
216
+ }
217
+
218
+ .start-index-label-row label {
219
+ display: inline-flex;
220
+ align-items: center;
221
+ margin: 0;
222
+ }
223
+
224
+ .start-index-label-row > input[type="number"] {
225
+ width: 4.7rem;
226
+ margin: 0;
227
+ line-height: 1.2;
228
+ }
229
+
230
+ .start-index-label-row > .field-tooltip {
231
+ align-self: center;
232
+ }
233
+
234
+ .start-index-item .input-wrap input,
235
+ .start-index-item > input {
236
+ margin-bottom: 0;
237
+ }
238
+
239
+ textarea, input[type="text"], input[type="number"], select {
240
+ width: 100%;
241
+ padding: .45rem .6rem;
242
+ border: 1px solid var(--border-soft);
243
+ background: #fcfdff;
244
+ border-radius: 4px;
245
+ font-family: "Courier New", monospace;
246
+ line-height: 1;
247
+ font-size: .85rem;
248
+ margin-bottom: .75rem;
249
+ transition: border-color .2s;
250
+ box-sizing: border-box;
251
+ white-space: pre-wrap;
252
+ word-wrap: break-word;
253
+ word-break: break-all;
254
+ letter-spacing: normal;
255
+ }
256
+ textarea:focus, input:focus, select:focus {
257
+ outline: none;
258
+ border-color: var(--brand-blue);
259
+ }
260
+
261
+ textarea { resize: vertical; }
262
+
263
+ /* enable textarea highlighting by overlaying a backdrop div with identical text and highlights*/
264
+ .backdropable {
265
+ /* Typography - MUST BE IDENTICAL */
266
+ font-family: "Courier New", Courier, monospace !important;
267
+ font-size: 14px !important;
268
+ line-height: 1.5 !important;
269
+ letter-spacing: normal !important;
270
+
271
+ /* Dimensions & Spacing - MUST BE IDENTICAL */
272
+ border: 1px solid var(--border-soft) !important;
273
+ margin: 0 !important;
274
+ box-sizing: border-box !important;
275
+ padding-top: 8px !important;
276
+ padding-bottom: 8px !important;
277
+ padding-left: 8px !important;
278
+ padding-right: 8px;
279
+
280
+ /* Line wrapping rules */
281
+ white-space: pre-wrap !important;
282
+ word-wrap: break-word !important;
283
+ word-break: break-all !important;
284
+ overflow-wrap: anywhere !important;
285
+ }
286
+
287
+ /* 4. Backdrop Positioning */
288
+ div.backdropable {
289
+ position: absolute;
290
+ top: 0;
291
+ left: 0;
292
+ overflow: hidden !important; /* Hide backdrop scrollbar; JS controls scroll */
293
+ pointer-events: none;
294
+ z-index: 1;
295
+ background: #fcfdff; /* Background moves to backdrop */
296
+ }
297
+
298
+ /* 5. Highlight span text layer */
299
+ .highlights {
300
+ font-family: "Courier New", Courier, monospace !important;
301
+ font-size: 14px !important;
302
+ line-height: 1.5 !important;
303
+ white-space: pre-wrap !important;
304
+ word-wrap: break-word !important;
305
+ word-break: break-all !important;
306
+ color: transparent;
307
+ }
308
+
309
+ /* 6. Textarea Layer */
310
+ textarea.backdropable {
311
+ position: relative;
312
+ z-index: 2;
313
+ background-color: transparent !important; /* Transparent so highlights show through */
314
+ resize: vertical;
315
+ display: block;
316
+ white-space: nowrap;
317
+ overflow-y: scroll !important;
318
+ overflow-x: hidden !important;
319
+ }
320
+
321
+ /* error handling */
322
+ .input-wrap.has-error > textarea.backdropable {
323
+ border-color: #e74c3c !important;
324
+ }
325
+ .input-wrap.has-error > div.backdropable {
326
+ background-color: #fff5f5 !important;
327
+ border-color: #e74c3c !important;
328
+ }
329
+
330
+ /* Highlight-Klassen für die Abschnitte */
331
+ .hl-seq1, .hl-seq2, .hl-basepair {
332
+ display: inline;
333
+ border-radius: 0 !important;
334
+ margin: 0 !important;
335
+ padding: 0 !important;
336
+ -webkit-box-decoration-break: clone;
337
+ box-decoration-break: clone;
338
+ }
339
+
340
+
341
+ textarea.profileData {
342
+ overflow-wrap: normal;
343
+ overflow-x: auto;
344
+ white-space: pre;
345
+ }
346
+
347
+
348
+ textarea.drag-over {
349
+ border-color: var(--brand-blue);
350
+ background-color: var(--brand-blue-soft);
351
+ box-shadow: 0 0 0 2px rgba(20, 90, 150, 0.25);
352
+ }
353
+
354
+
355
+ .row-2 {
356
+ display: grid;
357
+ grid-template-columns: 1fr 1fr;
358
+ gap: .5rem;
359
+ }
360
+
361
+ .profile-label-with-color {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ gap: .4rem;
365
+ }
366
+
367
+ .profile-label-with-color > label {
368
+ margin: 0;
369
+ }
370
+
371
+ .profile-color-picker {
372
+ width: 14px;
373
+ height: 14px;
374
+ min-width: 14px;
375
+ padding: 0;
376
+ margin: 0;
377
+ border: 1px solid #7e92a4;
378
+ border-radius: 2px;
379
+ cursor: pointer;
380
+ background: transparent;
381
+ }
382
+
383
+ .profile-color-picker::-webkit-color-swatch-wrapper {
384
+ padding: 0;
385
+ }
386
+
387
+ .profile-color-picker::-webkit-color-swatch {
388
+ border: none;
389
+ border-radius: 1px;
390
+ }
391
+
392
+ .profile-color-mode-wrap {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ gap: .22rem;
396
+ margin-left: .1rem;
397
+ }
398
+
399
+ .profile-color-mode-checkbox {
400
+ width: 12px;
401
+ height: 12px;
402
+ margin: 0;
403
+ padding: 0;
404
+ }
405
+
406
+ .profile-color-mode-text {
407
+ font-size: .72rem;
408
+ font-weight: 600;
409
+ color: #4f6478;
410
+ line-height: 1;
411
+ }
412
+
413
+ .label-dropdown-col-row {
414
+ display: grid;
415
+ grid-template-columns: 1.15fr 0.9fr 0.2fr;
416
+ gap: .6rem;
417
+ align-items: center;
418
+ margin-bottom: .55rem;
419
+ }
420
+
421
+ .label-dropdown-col-row > label {
422
+ margin: 0;
423
+ }
424
+
425
+ .label-dropdown-col-row > select {
426
+ margin-bottom: 0;
427
+ }
428
+
429
+ .checkbox-row {
430
+ display: flex;
431
+ align-items: center;
432
+ gap: .4rem;
433
+ margin-bottom: .75rem;
434
+ font-size: .85rem;
435
+ }
436
+ .checkbox-row input { width: auto; margin: 0; }
437
+ .checkbox-row label { margin: 0; }
438
+ .checkbox-row-nested { margin-left: 1.5em; }
439
+
440
+ /* ------------------------------------------------------------------ */
441
+ /* Buttons */
442
+ /* ------------------------------------------------------------------ */
443
+ .btn {
444
+ display: inline-flex;
445
+ align-items: center;
446
+ gap: .4rem;
447
+ padding: .55rem 1.1rem;
448
+ border: none;
449
+ border-radius: 4px;
450
+ font-size: .9rem;
451
+ cursor: pointer;
452
+ transition: background .15s, transform .1s;
453
+ }
454
+ .btn:active { transform: scale(.97); }
455
+ .btn-primary { background: var(--brand-blue); color: #fff; }
456
+ .btn-primary:hover { background: var(--brand-blue-dark); }
457
+ .btn-success { background: #2e8b57; color: #fff; }
458
+ .btn-success:hover { background: #236b43; }
459
+ .btn-info { background: #1d7fa4; color: #fff; }
460
+ .btn-info:hover { background: #16617d; }
461
+ .btn-secondary { background: #d8e5f1; color: var(--text-primary); }
462
+ .btn-secondary:hover { background: #c6d8e8; }
463
+ .btn-cite { background: #d65413; color: #fff; }
464
+ .btn-cite:hover { background: #b13f0f; }
465
+ .btn-shareLink { background: var(--brand-blue); color: #fff; }
466
+ .btn-shareLink:hover { background: var(--brand-blue-dark); }
467
+ .btn-openVarri { background: #03427d; color: #fff; }
468
+ .btn-openVarri:hover { background: #034b8b; }
469
+ .btn-sm { padding: .35rem .5rem; font-size: .8rem; }
470
+
471
+ .action-row {
472
+ display: flex;
473
+ flex-wrap: wrap;
474
+ align-items: flex-end;
475
+ justify-content: flex-end;
476
+ gap: .6rem;
477
+ margin-top: .5rem;
478
+ }
479
+
480
+ /* Button-styled links */
481
+ a.btn {
482
+ box-sizing: border-box;
483
+ color: #fff;
484
+ text-decoration: none;
485
+ user-select: none;
486
+ }
487
+ a.btn:hover,
488
+ a.btn:focus,
489
+ a.btn:active {
490
+ text-decoration: none;
491
+ }
492
+
493
+ /* ------------------------------------------------------------------ */
494
+ /* Example dropdown */
495
+ /* ------------------------------------------------------------------ */
496
+ .example-label {
497
+ display: block;
498
+ color: #2c4259;
499
+ font-size: .85rem;
500
+ font-weight: 600;
501
+ margin-bottom: .25rem;
502
+ }
503
+
504
+ .examples {
505
+ display: flex;
506
+ align-items: flex-start;
507
+ gap: .4rem;
508
+ margin-bottom: 1rem;
509
+ }
510
+
511
+ .example-dropdown {
512
+ flex: 1 1 14rem;
513
+ min-width: 0;
514
+ }
515
+
516
+ .example-dropdown > summary {
517
+ position: relative;
518
+ display: flex;
519
+ align-items: center;
520
+ min-height: 2rem;
521
+ padding: .4rem 2rem .4rem .6rem;
522
+ border: 1px solid #c0d6e8;
523
+ border-radius: 4px;
524
+ background: var(--brand-blue-soft);
525
+ color: var(--text-primary);
526
+ cursor: pointer;
527
+ font-size: .8rem;
528
+ font-weight: 600;
529
+ line-height: 1.2;
530
+ list-style: none;
531
+ user-select: none;
532
+ }
533
+
534
+ .example-dropdown > summary::-webkit-details-marker {
535
+ display: none;
536
+ }
537
+
538
+ .example-dropdown > summary::after {
539
+ position: absolute;
540
+ right: .65rem;
541
+ content: "▾";
542
+ transition: transform .15s ease;
543
+ }
544
+
545
+ .example-dropdown[open] > summary::after {
546
+ transform: rotate(180deg);
547
+ }
548
+
549
+ .example-dropdown > summary:hover {
550
+ background: #d6e7f4;
551
+ }
552
+
553
+ .example-dropdown > summary:focus-visible {
554
+ outline: 2px solid var(--brand-blue);
555
+ outline-offset: 2px;
556
+ }
557
+
558
+ .example-options {
559
+ max-height: 16rem;
560
+ margin-top: .25rem;
561
+ overflow-y: auto;
562
+ border: 1px solid #c0d6e8;
563
+ border-radius: 4px;
564
+ background: var(--surface);
565
+ }
566
+
567
+ .example-option {
568
+ display: block;
569
+ width: 100%;
570
+ padding: .55rem .6rem;
571
+ border: 0;
572
+ background: var(--surface);
573
+ color: var(--text-primary);
574
+ cursor: pointer;
575
+ font-family: inherit;
576
+ text-align: left;
577
+ }
578
+
579
+ .example-option + .example-option {
580
+ border-top: 1px solid var(--border-soft);
581
+ }
582
+
583
+ .example-option:hover,
584
+ .example-option:focus {
585
+ background: var(--brand-blue-soft);
586
+ }
587
+
588
+ .example-option:focus-visible {
589
+ position: relative;
590
+ outline: 2px solid var(--brand-blue);
591
+ outline-offset: -2px;
592
+ }
593
+
594
+ .example-option[aria-current="true"] {
595
+ box-shadow: inset 3px 0 var(--brand-blue);
596
+ }
597
+
598
+ .example-option-name,
599
+ .example-option-description {
600
+ display: block;
601
+ }
602
+
603
+ .example-option-name {
604
+ font-size: .8rem;
605
+ font-weight: 700;
606
+ line-height: 1.25;
607
+ }
608
+
609
+ .example-option-description {
610
+ margin-top: .2rem;
611
+ color: var(--text-muted);
612
+ font-size: .72rem;
613
+ line-height: 1.35;
614
+ }
615
+
616
+ /* ------------------------------------------------------------------ */
617
+ /* Result panel */
618
+ /* ------------------------------------------------------------------ */
619
+ .result-panel {
620
+ display: flex;
621
+ flex-direction: column;
622
+ resize: both;
623
+ overflow: auto;
624
+ min-width: 0;
625
+ max-width: calc(50vw +350px);
626
+
627
+ min-height: 520px;
628
+ height: max(520px, calc(100vh - 260px));;
629
+ }
630
+
631
+ .highlight-list {
632
+ list-style: none;
633
+ margin: 0 0 0.5rem;
634
+ padding: 0;
635
+ max-height: 320px;
636
+ overflow-y: auto;
637
+ border: 1px solid var(--border-soft);
638
+ border-radius: 6px;
639
+ background: #fcfdff;
640
+ }
641
+
642
+ .highlight-empty {
643
+ padding: .6rem .7rem;
644
+ color: #5d6f81;
645
+ font-size: .84rem;
646
+ }
647
+
648
+ .highlight-item {
649
+ display: grid;
650
+ grid-template-columns: 1fr auto;
651
+ gap: .4rem;
652
+ padding: .3rem;
653
+ border-bottom: 1px solid #e4ecf4;
654
+ }
655
+
656
+ .highlight-item:last-child {
657
+ border-bottom: none;
658
+ }
659
+
660
+ .highlight-item-main {
661
+ text-align: left;
662
+ border: 1px solid #d7e2ee;
663
+ border-radius: 5px;
664
+ background: #fff;
665
+ color: #1f3144;
666
+ padding: .42rem .52rem;
667
+ font-size: .79rem;
668
+ font-family: "Courier New", monospace;
669
+ cursor: pointer;
670
+ }
671
+
672
+ .highlight-item.active .highlight-item-main {
673
+ background: #eaf2f8;
674
+ border-color: #9fb9d4;
675
+ }
676
+
677
+ .highlight-delete {
678
+ border: 1px solid #d9c5c5;
679
+ border-radius: 5px;
680
+ background: #fff2f2;
681
+ color: #9a2e2e;
682
+ padding: .35rem .5rem;
683
+ font-size: .73rem;
684
+ cursor: pointer;
685
+ }
686
+
687
+ .highlight-delete:hover {
688
+ background: #ffe3e3;
689
+ }
690
+
691
+ .highlightInput {
692
+ display: grid;
693
+ grid-template-columns: minmax(0, 0.5fr) minmax(0, 2fr) 1.5em 4em;
694
+ gap: .45rem;
695
+ align-items: end;
696
+ }
697
+
698
+ .regionInput {
699
+ display: grid;
700
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 1.5em 4em;
701
+ gap: .45rem;
702
+ align-items: start;
703
+ }
704
+
705
+ .regionInput > div {
706
+ display: flex;
707
+ flex-direction: column;
708
+ min-width: 0;
709
+ }
710
+
711
+ .regionInput label {
712
+ margin: 0 0 .25rem;
713
+ }
714
+
715
+ .regionInput .input-wrap {
716
+ display: flex;
717
+ align-items: center;
718
+ min-height: 34px;
719
+ }
720
+
721
+ .regionInput input[type="text"] {
722
+ width: 100%;
723
+ min-width: 0;
724
+ margin: 0;
725
+ }
726
+
727
+
728
+ #subseqColor,#regionColor {
729
+ width: 100%;
730
+ height: 34px;
731
+ padding: 2px;
732
+ margin-bottom: .75rem;
733
+ border: 1px solid var(--border-soft);
734
+ border-radius: 4px;
735
+ background: #fcfdff;
736
+ }
737
+
738
+
739
+ .mutationInput {
740
+ display: grid;
741
+ grid-template-columns: 3.25rem minmax(0, 1fr) 3.25rem 2rem;
742
+ gap: .45rem;
743
+ align-items: end;
744
+ }
745
+
746
+ .mutationInput > div {
747
+ min-width: 0;
748
+ }
749
+
750
+ .mutationInput #mutationSequence,
751
+ .mutationInput #mutationPosition,
752
+ .mutationInput #mutationBase,
753
+ .mutationInput #mutationColor {
754
+ width: 100%;
755
+ min-width: 0;
756
+ margin-bottom: 0;
757
+ }
758
+
759
+ .mutationInput #mutationColor {
760
+ height: 34px;
761
+ padding: 2px;
762
+ }
763
+
764
+
765
+ #rendering-canvas {
766
+ background: var(--surface);
767
+ border-radius: 8px;
768
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .12);
769
+ flex: 1;
770
+ min-height: 450px;
771
+ overflow: hidden;
772
+ position: relative;
773
+ }
774
+
775
+ #rendering-canvas svg {
776
+ width: 100%;
777
+ height: 100%;
778
+ }
779
+
780
+ #rendering-caption {
781
+ background: var(--surface);
782
+ border-radius: 8px;
783
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .12);
784
+ padding: .6rem 1.2rem;
785
+ margin-top: .75rem;
786
+ display: flex;
787
+ align-items: center;
788
+ gap: .75rem;
789
+ font-size: smaller;
790
+ color: var(--text-muted);
791
+ }
792
+
793
+ .viz-control {
794
+ background: var(--surface);
795
+ border-radius: 8px;
796
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .12);
797
+ padding: .6rem 1.2rem;
798
+ margin-top: .75rem;
799
+ display: flex;
800
+ align-items: center;
801
+ gap: .75rem;
802
+ }
803
+ .viz-control label {
804
+ margin: 0;
805
+ font-size: .85rem;
806
+ font-weight: 600;
807
+ color: var(--brand-blue-dark);
808
+ white-space: nowrap;
809
+ }
810
+ .viz-control input[type="range"] {
811
+ flex: 1;
812
+ margin: 0;
813
+ min-width: 50;
814
+ }
815
+
816
+
817
+ .export-bar {
818
+ background: var(--surface);
819
+ border-radius: 8px;
820
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .12);
821
+ padding: .8rem 1.2rem;
822
+ display: flex;
823
+ align-items: center;
824
+ gap: .8rem;
825
+ margin-top: .75rem;
826
+ flex-wrap: wrap;
827
+ }
828
+ .export-bar span { font-size: .85rem; font-weight: 600; color: var(--brand-blue-dark); }
829
+ .cite-note {
830
+ margin-left: auto;
831
+ color: #666;
832
+ font-size: .8em;
833
+ text-align: right;
834
+ }
835
+
836
+ .cropping-value {
837
+ margin-left: .3em;
838
+ color: var(--text-primary);
839
+ font-weight: 600;
840
+ display: inline-block;
841
+ width: 1.5em;
842
+ }
843
+
844
+ .rotation-value {
845
+ margin-left: .3em;
846
+ color: var(--text-primary);
847
+ font-weight: 600;
848
+ display: inline-block;
849
+ width: 2.5em;
850
+ }
851
+
852
+ /* ------------------------------------------------------------------ */
853
+ /* Messages */
854
+ /* ------------------------------------------------------------------ */
855
+ #msg {
856
+ border-radius: 6px;
857
+ padding: .6rem .9rem;
858
+ font-size: .85rem;
859
+ margin-top: .6rem;
860
+ display: none;
861
+ }
862
+ #msg.error { background: #fdecea; color: #c0392b; display: block; }
863
+ #msg.success { background: #eafaf1; color: #1e8449; display: block; }
864
+
865
+ /* ------------------------------------------------------------------ */
866
+ /* Legend */
867
+ /* ------------------------------------------------------------------ */
868
+
869
+
870
+ /* Colour-picker swatches in the legend */
871
+ input[type="color"].legend-color {
872
+ width: 20px;
873
+ height: 20px;
874
+ border-radius: 50%;
875
+ border: 1.5px solid #999;
876
+ padding: 1px;
877
+ cursor: pointer;
878
+ flex-shrink: 0;
879
+ background: none;
880
+ vertical-align: middle;
881
+ }
882
+ input[type="color"].legend-color::-webkit-color-swatch-wrapper {
883
+ padding: 0;
884
+ border-radius: 50%;
885
+ }
886
+ input[type="color"].legend-color::-webkit-color-swatch {
887
+ border: none;
888
+ border-radius: 50%;
889
+ }
890
+ input[type="color"].legend-color-rect {
891
+ width: 20px;
892
+ height: 20px;
893
+ border-radius: 2px;
894
+ border: 1px solid #999;
895
+ padding: 1px;
896
+ cursor: pointer;
897
+ flex-shrink: 0;
898
+ background: none;
899
+ vertical-align: middle;
900
+ opacity: 0.8;
901
+ }
902
+ input[type="color"].legend-color-rect::-webkit-color-swatch-wrapper {
903
+ padding: 0;
904
+ border-radius: 2px;
905
+ }
906
+ input[type="color"].legend-color-rect::-webkit-color-swatch {
907
+ border: none;
908
+ border-radius: 2px;
909
+ }
910
+
911
+
912
+ /* ------------------------------------------------------------------ */
913
+ /* Footer */
914
+ /* ------------------------------------------------------------------ */
915
+ .site-footer {
916
+ width: 100%;
917
+ margin: 0 auto 1.5rem;
918
+ padding: .9rem 1rem 0;
919
+ }
920
+ .footer-content {
921
+ background: #f6f9ff;
922
+ border: 1px solid #d7e2f2;
923
+ border-radius: 8px;
924
+ box-shadow: 0 2px 8px rgba(15, 46, 74, .08);
925
+ padding: 20px;
926
+ height: 80px;
927
+ font-size: .82rem;
928
+ line-height: 1.1;
929
+ color: #30455f;
930
+ text-align: center;
931
+ }
932
+ .footer-content p + p {
933
+ margin-top: .45rem;
934
+ }
935
+ .footer-content a {
936
+ color: #1c4f8e;
937
+ text-decoration: underline;
938
+ text-underline-offset: 2px;
939
+ }
940
+ .footer-content a:hover {
941
+ color: #133d70;
942
+ }
943
+
944
+ /* ------------------------------------------------------------------ */
945
+ /* Inline field validation — error highlight + hover tooltip */
946
+ /* ------------------------------------------------------------------ */
947
+ .input-wrap {
948
+ position: relative !important;
949
+ display: block;
950
+ width: 100%;
951
+ }
952
+ .input-wrap.has-error > textarea,
953
+ .input-wrap.has-error > input {
954
+ border-color: #e74c3c !important;
955
+ background: #fff5f5 !important;
956
+ }
957
+ .field-tooltip {
958
+ display: none;
959
+ position: absolute;
960
+ left: 0;
961
+ right: 0;
962
+ top: calc(100% + 3px);
963
+ background: #2c2c2c;
964
+ color: #fff;
965
+ font-size: .76rem;
966
+ font-family: "Segoe UI", Tahoma, Geneva, sans-serif;
967
+ font-weight: 400;
968
+ padding: .4rem .65rem;
969
+ border-radius: 4px;
970
+ white-space: normal;
971
+ width: auto;
972
+ max-width: 100%;
973
+ overflow-wrap: anywhere;
974
+ word-break: break-word;
975
+ z-index: 200;
976
+ pointer-events: none;
977
+ line-height: 1.4;
978
+ box-shadow: 0 2px 8px rgba(0,0,0,.3);
979
+ }
980
+ .field-tooltip::before {
981
+ content: '';
982
+ position: absolute;
983
+ bottom: 100%;
984
+ left: 12px;
985
+ border: 5px solid transparent;
986
+ border-bottom-color: #2c2c2c;
987
+ }
988
+ .input-wrap.has-error:hover .field-tooltip {
989
+ display: block;
990
+ }
991
+
992
+ /* ------------------------------------------------------------------ */
993
+ /* Responsive */
994
+ /* ------------------------------------------------------------------ */
995
+ @media (max-width: 780px) {
996
+ main {
997
+ grid-template-columns: 1fr;
998
+ justify-content: stretch;
999
+ }
1000
+ header {
1001
+ flex-direction: column;
1002
+ align-items: flex-start;
1003
+ }
1004
+ .group-logo {
1005
+ height: 57px;
1006
+ }
1007
+ }
1008
+
1009
+ /* ------------------------------------------------------------------ */
1010
+ /* Hide header and footer for content-only embedding mode. */
1011
+ /* ------------------------------------------------------------------ */
1012
+
1013
+ body.hide-footer-and-header header,
1014
+ body.hide-footer-and-header footer {
1015
+ display: none !important;
1016
+ }
1017
+
1018
+ body.hide-footer-and-header main {
1019
+ width: 100vw;
1020
+ height: 100vh;
1021
+ margin: 0;
1022
+ max-width: none;
1023
+ grid-template-columns: minmax(360px, 380px) 1fr;
1024
+ align-items: stretch;
1025
+ overflow: hidden;
1026
+ }
1027
+
1028
+ body.hide-footer-and-header .controls-column {
1029
+ min-height: 0;
1030
+ height: 100%;
1031
+ max-height: 100vh;
1032
+ }
1033
+
1034
+ /* 3. Sicherstellen, dass <aside> im normalen Dokumentenfluss bleibt */
1035
+ body.hide-footer-and-header .controls-column aside {
1036
+ position: relative; /* Darf NICHT position: absolute sein! */
1037
+ box-sizing: border-box;
1038
+ }
1039
+
1040
+ body.hide-footer-and-header .result-panel {
1041
+ width: 100%;
1042
+ max-width: 100%;
1043
+ height: 100%;
1044
+ }
1045
+
1046
+
1047
+ /* ------------------------------------------------------------------ */
1048
+ /* Rendering-only embedding mode. */
1049
+ /* ------------------------------------------------------------------ */
1050
+
1051
+ body.rendering-only header,
1052
+ body.rendering-only footer,
1053
+ body.rendering-only .controls-column {
1054
+ display: none !important;
1055
+ }
1056
+
1057
+ body.rendering-only main {
1058
+ display: block;
1059
+ padding: 0;
1060
+ margin: 0;
1061
+ width: 100vw;
1062
+ height: 100vh;
1063
+ }
1064
+
1065
+ body.rendering-only .result-panel {
1066
+ width: 100%;
1067
+ height: 100%;
1068
+ }
1069
+
1070
+ /* Keep exports and embedded rendering backgrounds transparent. */
1071
+ body.rendering-only {
1072
+ background: transparent;
1073
+ }
1074
+
1075
+ /* ------------------------------------------------------------------ */
1076
+ /* Input Dialogs */
1077
+ /* ------------------------------------------------------------------ */
1078
+
1079
+
1080
+ /* 1. Haupt-Dialog Container */
1081
+ dialog.app-dialog {
1082
+ border: 1px solid #d1dce5;
1083
+ border-radius: 8px;
1084
+ padding: 0; /* Padding wird über Header/Body gesteuert */
1085
+ background-color: #ffffff;
1086
+ color: #1a2b4c;
1087
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
1088
+ box-shadow: 0 8px 24px rgba(27, 42, 74, 0.18);
1089
+ min-width: 220px;
1090
+ overflow: hidden;
1091
+ margin: 0;
1092
+ position: fixed;
1093
+ }
1094
+
1095
+ /* 2. Abdunkelung des Hintergrunds (Backdrop) */
1096
+ dialog.app-dialog::backdrop {
1097
+ background-color: rgba(15, 25, 45, 0.25);
1098
+ }
1099
+
1100
+ /* 3. Dialog Header */
1101
+ .app-dialog .dialog-header {
1102
+ background-color: #edf2f9;
1103
+ border-bottom: 1px solid #d1dce5;
1104
+ color: #1a365d;
1105
+ font-size: 13px;
1106
+ font-weight: 700;
1107
+ padding: 8px 12px;
1108
+ cursor: move;
1109
+ user-select: none;
1110
+ }
1111
+
1112
+ /* 4. Dialog Body / Input Bereich */
1113
+ .app-dialog .dialog-body {
1114
+ padding: 12px;
1115
+ }
1116
+
1117
+ .app-dialog input {
1118
+ width: 100%;
1119
+ box-sizing: border-box;
1120
+ padding: 6px 10px;
1121
+ font-size: 13px;
1122
+ color: #1e293b;
1123
+ background-color: #f8fafc;
1124
+ border: 1px solid #cbd5e1;
1125
+ border-radius: 4px;
1126
+ outline: none;
1127
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1128
+ }
1129
+
1130
+ .app-dialog input:focus {
1131
+ border-color: #2b4282;
1132
+ background-color: #ffffff;
1133
+ box-shadow: 0 0 0 2px rgba(43, 66, 130, 0.15);
1134
+ }
1135
+
1136
+ /* 5. Dialog Actions (Buttons) */
1137
+ .app-dialog .dialog-actions {
1138
+ display: flex;
1139
+ flex-direction: row-reverse;
1140
+ justify-content: flex-start;
1141
+ gap: 6px;
1142
+ padding: 8px 12px;
1143
+ background-color: #f8fafc;
1144
+ border-top: 1px solid #f1f5f9;
1145
+ }
1146
+
1147
+ /* Base Button Style */
1148
+ .app-dialog .btn {
1149
+ font-size: 12px;
1150
+ font-weight: 600;
1151
+ padding: 5px 12px;
1152
+ border-radius: 4px;
1153
+ cursor: pointer;
1154
+ border: 1px solid transparent;
1155
+ transition: all 0.15s ease-in-out;
1156
+ }
1157
+
1158
+ /* Primary Button (OK) - Dunkelblau entsprechend dem Header */
1159
+ .app-dialog .btn-primary {
1160
+ background-color: #2b4282;
1161
+ color: #ffffff;
1162
+ border-color: #23376d;
1163
+ }
1164
+
1165
+ .app-dialog .btn-primary:hover {
1166
+ background-color: #1f3266;
1167
+ }
1168
+
1169
+ /* Secondary Button (Abbrechen) - Neutrales Grau-Blau */
1170
+ .app-dialog .btn-secondary {
1171
+ background-color: #e2e8f0;
1172
+ color: #334155;
1173
+ border-color: #cbd5e1;
1174
+ }
1175
+
1176
+ .app-dialog .btn-secondary:hover {
1177
+ background-color: #cbd5e1;
1178
+ color: #0f172a;
1179
+ }
1180
+
1181
+ #fastaInput {
1182
+ min-width: 600px;
1183
+ }