style.css
ASCII text
1
@import "/static/efficient-ui/MASTER.css";
2
3
:root {
4
--gap-navbar: 1rem;
5
--width-navbar-button: 0;
6
--text-soft: #000000C0;
7
--text-softer: #0000009A;
8
--text-faint: #00000066;
9
--text-softest: #00000033;
10
--color-star: #FFC107;
11
--color-shape-label: #0097A7; --color-shape-label-text: #ffffff;
12
--shadow-card-inset: inset 0 3px 6px -4px rgba(0, 0, 0, 0.12), inset 0 3px 6px 0 rgba(0, 0, 0, 0.24), inset 0 1px 4px 0 rgba(0, 0, 0, 0.12);
13
--1-star: #FF8079;
14
--2-star: #FF8A65;
15
--3-star: #FFAC1B;
16
--4-star: #FBC02D;
17
--5-star: #CDDC39;
18
view-transition-name: root;
19
--reserved-height-top: 0;
20
--color-checkerboard-dark: #CFD8DC;
21
--color-checkerboard-light: #FFFFFF;
22
}
23
24
.ripple-pad {
25
background: #ffffff99;
26
position: absolute;
27
opacity: 1;
28
transform: scale(0);
29
animation: RippleEffect 375ms cubic-bezier(0, 0.55, 0.45, 1) forwards;
30
}
31
32
.button-flat .ripple-pad {
33
background: var(--color-primary-3);
34
}
35
36
@keyframes RippleEffect {
37
to {
38
transform: scale(1);
39
opacity: 0;
40
}
41
}
42
43
button, input, .button:not(.link-button), select, .navbar a, .navrail a {
44
position: relative;
45
overflow: hidden;
46
}
47
48
nav#desktop-navbar {
49
view-transition-name: navbar;
50
}
51
52
nav#mobile-navbar {
53
view-transition-name: navbar-mobile;
54
}
55
56
p {
57
color: var(--text-soft);
58
}
59
60
iconify-icon {
61
/* Material design icons are done in 24px, so we scale them to 1.5 as the default font size is 16px */
62
display: inline-block;
63
width: 1em;
64
height: 1em;
65
font-size: 1.5em;
66
}
67
68
#annotation-zone, .annotation-zone {
69
position: relative;
70
user-select: none;
71
overflow: hidden;
72
transform-origin: 50% 50%;
73
background-image: conic-gradient(var(--color-checkerboard-dark) 90deg, var(--color-checkerboard-light) 0 180deg, var(--color-checkerboard-dark) 0 270deg, var(--color-checkerboard-light) 0 360deg);
74
background-size: 1rem 1rem;
75
background-position: 0 0;
76
}
77
78
#annotation-zoom-container > #annotation-zone {
79
overflow: visible;
80
}
81
82
#annotation-image, .annotation-image {
83
user-drag: none;
84
-webkit-user-drag: none;
85
image-rendering: pixelated;
86
}
87
88
:not(#annotation-zoom-container) > #annotation-zone > svg, .annotation-zone > svg {
89
width: 100%;
90
height: 100%;
91
}
92
93
#annotation-zone > svg, .annotation-zone > svg {
94
z-index: 1;
95
position: absolute;
96
top: 0;
97
left: 0;
98
}
99
100
.annotation-ruler {
101
z-index: 2;
102
position: absolute;
103
top: 0;
104
left: 0;
105
background: var(--color-accent);
106
display: none;
107
}
108
109
#annotation-ruler-horizontal, #annotation-ruler-horizontal-secondary {
110
height: 1px;
111
width: 100%;
112
}
113
114
#annotation-ruler-vertical, #annotation-ruler-vertical-secondary {
115
width: 1px;
116
height: 100%;
117
}
118
119
.shape {
120
stroke: var(--color-accent);
121
fill: var(--color-accent);
122
fill-opacity: 0.1;
123
stroke-width: 2px;
124
--shape-stroke-width: 2px;
125
vector-effect: non-scaling-stroke;
126
pointer-events: auto;
127
transition: filter 0.25s cubic-bezier(0.61, 1, 0.88, 1),
128
fill-opacity 0.25s cubic-bezier(0.61, 1, 0.88, 1),
129
stroke-width 0.25s cubic-bezier(0.61, 1, 0.88, 1);
130
stroke-linecap: square;
131
stroke-linejoin: miter;
132
}
133
134
.shape-polyline {
135
fill: none;
136
}
137
138
.shape-point {
139
stroke: var(--color-accent);
140
stroke-width: 2px;
141
--shape-radius: 2px;
142
fill-opacity: 1;
143
r: 0.001;
144
vector-effect: non-scaling-stroke non-scaling-size;
145
transition: r 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
146
stroke-width 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
147
filter 0.25s cubic-bezier(0.61, 1, 0.88, 1);
148
}
149
150
.shape.selected {
151
fill-opacity: 0.2;
152
stroke-width: 4px;
153
--shape-stroke-width: 4px;
154
filter: drop-shadow(0 0 2px var(--text-soft));
155
}
156
157
.shape-point.selected {
158
fill-opacity: 1;
159
r: 0.001;
160
--shape-radius: 0.001;
161
stroke-width: 6px;
162
}
163
164
.shape-container, .shape-container-viewonly {
165
pointer-events: none;
166
}
167
168
.shape-container-viewonly > .shape, .thumbnail-list > li .shape {
169
fill: var(--color-info);
170
stroke: var(--color-info);
171
fill-opacity: 0;
172
stroke-opacity: 0;
173
transition: fill-opacity 0.25s cubic-bezier(0.61, 1, 0.88, 1),
174
stroke-opacity 0.25s cubic-bezier(0.61, 1, 0.88, 1);
175
}
176
177
.shape-container-viewonly > .shape-polyline, .thumbnail-list > li .shape-polyline {
178
fill: none;
179
}
180
181
.shape-container-viewonly > .shape-point, .thumbnail-list > li .shape-point {
182
stroke: var(--color-info);
183
transition: r 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
184
stroke-width 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
185
filter 0.25s cubic-bezier(0.61, 1, 0.88, 1);
186
}
187
188
.shape-label {
189
position: absolute;
190
font-weight: 500;
191
color: var(--color-shape-label-text) !important;
192
pointer-events: auto;
193
height: 28px;
194
padding-left: 8px;
195
padding-right: 8px;
196
display: flex;
197
align-items: center;
198
justify-content: center;
199
background: var(--color-shape-label);
200
width: max-content;
201
box-shadow: var(--shadow-button);
202
/* top-left corner is square to point to the shape */
203
border-radius: 0 16px 16px 16px;
204
opacity: 0;
205
transition: opacity 0.25s cubic-bezier(0.61, 1, 0.88, 1),
206
transform 0.375s cubic-bezier(0.16, 1, 0.3, 1);
207
transform: scale(0);
208
transform-origin: top left;
209
z-index: 3;
210
text-decoration: none;
211
}
212
213
.shape-label:hover {
214
text-decoration: underline;
215
}
216
217
/* Only show region parts when checkbox is checked */
218
#annotation-zone:has(+ x-buttonbox #show-objects:checked) > .shape-label {
219
opacity: 1;
220
transform: scale(1);
221
}
222
223
/* Hide points with a bubble */
224
#annotation-zone:has(+ x-buttonbox #show-objects:checked) > .shape-container-viewonly > .shape-point:has(+ foreignObject) {
225
r: 0;
226
border-width: 0;
227
}
228
229
#annotation-zone:has(+ x-buttonbox #show-shapes:checked) > .shape-container-viewonly > .shape {
230
fill-opacity: 0.1;
231
stroke-opacity: 1;
232
}
233
234
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) .shape {
235
fill-opacity: 0.2;
236
stroke-opacity: 1;
237
}
238
239
@keyframes move-out {
240
from {
241
transform: scale(1);
242
opacity: 1;
243
}
244
to {
245
transform: scale(0.5);
246
opacity: 0;
247
}
248
}
249
250
@keyframes move-in {
251
from {
252
transform: scale(0.5);
253
opacity: 0;
254
}
255
to {
256
transform: scale(1);
257
opacity: 1;
258
}
259
}
260
261
@keyframes slide-in {
262
from {
263
transform: translateX(-1.5rem);
264
opacity: 0;
265
}
266
to {
267
transform: translateX(0);
268
opacity: 1;
269
}
270
}
271
272
@keyframes slide-out {
273
from {
274
transform: translateX(0);
275
opacity: 1;
276
}
277
to {
278
transform: translateX(-1.5rem);
279
opacity: 0;
280
}
281
}
282
283
@media (prefers-reduced-motion: no-preference) {
284
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) > a > .annotation-zone,
285
html:not(:has(.thumbnail-list > li:is(:hover, :focus, :has(:focus)) > a > .annotation-zone)) #annotation-zone {
286
view-transition-name: thumbnail;
287
}
288
::view-transition-old(root),
289
::view-transition-new(root) {
290
transform-origin: top;
291
animation-duration: 0.5s;
292
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
293
}
294
295
::view-transition-old(root) {
296
animation-name: move-out;
297
}
298
299
::view-transition-new(root) {
300
animation-name: move-in;
301
}
302
303
::view-transition-group(thumbnail) {
304
animation-duration: 0.5s;
305
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
306
}
307
308
#annotation-zone::view-transition-old(thumbnail) {
309
animation-duration: 0s;
310
}
311
312
::view-transition-group(navbar), ::view-transition-group(navbar-mobile) {
313
animation-duration: 0.5s;
314
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
315
}
316
}
317
318
.multi-select, .single-select {
319
display: flex;
320
flex-flow: column nowrap;
321
overflow-y: scroll;
322
box-shadow: var(--shadow-card-inset);
323
padding: 16px;
324
gap: 8px;
325
}
326
327
.licence-selection, .image-type-selection {
328
display: flex;
329
flex-flow: column nowrap;
330
}
331
332
.licence-selection-info, .image-type-selection-info {
333
margin-left: calc(var(--size-checkbox) + var(--gap-label-checkbox));
334
/* Align with the checkbox above */
335
}
336
337
.licence-selection-info > p, .image-type-selection-info > p {
338
font-weight: 300;
339
}
340
341
.licence-logo {
342
width: 128px;
343
float: right;
344
margin-left: 1ch;
345
}
346
347
.licence-title, .image-type-title {
348
display: flex;
349
justify-content: space-between;
350
width: 100%;
351
}
352
353
.licence-title > .licence-name, .image-type-title > .image-type-name {
354
font: var(--h5-font);
355
font-weight: 400;
356
}
357
358
.icon-explainer {
359
display: grid;
360
gap: 4px 8px;
361
grid-template-columns: auto 1fr;
362
align-items: center;
363
}
364
365
.icon-explainer *:nth-child(even) {
366
font-weight: 300;
367
}
368
369
.required-asterisk::after {
370
content: "*";
371
color: var(--color-error);
372
}
373
374
small {
375
/* BIG :D */
376
font-size: 1em;
377
}
378
379
#pagination {
380
display: flex;
381
gap: 1em;
382
justify-content: center;
383
align-items: center;
384
font-size: 1.5em;
385
font-weight: 600;
386
flex: 1 0 auto;
387
}
388
389
#pagination > a {
390
text-decoration: none;
391
color: var(--color-accent-1);
392
}
393
394
#pagination-options > form {
395
align-items: center;
396
display: flex;
397
gap: 1em;
398
}
399
400
#pagination-options {
401
justify-content: center;
402
align-items: center;
403
gap: 1em;
404
width: 100%;
405
}
406
407
.thumbnail-list {
408
list-style: none;
409
margin: 0 !important;
410
display: grid;
411
grid-template-columns: repeat(auto-fill, minmax(128px, 1fr));
412
gap: 16px;
413
}
414
415
.thumbnail-list > li {
416
transition: box-shadow 0.25s cubic-bezier(0.61, 1, 0.88, 1);
417
box-shadow: var(--shadow-card);
418
background: var(--color-card);
419
}
420
421
.thumbnail-list > li > a, .thumbnail-list > li {
422
display: flex;
423
flex-direction: column;
424
justify-content: space-between;
425
height: 100%;
426
}
427
428
.thumbnail-list > li > .list-more {
429
display: flex;
430
justify-content: space-between;
431
align-items: center;
432
padding: 8px;
433
}
434
435
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) {
436
box-shadow: var(--shadow-card), 0 4px 32px rgba(0, 0, 0, 0.12), 0 4px 16px rgba(0, 0, 0, 0.08);
437
}
438
439
.thumbnail-list > li .annotation-zone {
440
transition: transform 0.25s cubic-bezier(0.61, 1, 0.88, 1),
441
box-shadow 0.25s cubic-bezier(0.61, 1, 0.88, 1);
442
}
443
444
.thumbnail-list > li .annotation-zone:hover {
445
position: relative;
446
transform: scale(2);
447
z-index: 1;
448
box-shadow: var(--shadow-textarea-active);
449
}
450
451
.thumbnail-list > li .list-detail {
452
padding: 8px;
453
display: block;
454
}
455
456
a.button {
457
text-decoration: none;
458
}
459
460
dt {
461
font-weight: 600;
462
}
463
464
dd {
465
margin-left: 40px;
466
}
467
468
#mobile-navbar, #mobile-navbar-spacer {
469
display: none;
470
}
471
472
@media screen and (max-width: 896px) {
473
#mobile-navbar {
474
display: flex;
475
}
476
header {
477
position: fixed;
478
top: 0;
479
left: 0;
480
width: 100%;
481
z-index: 3;
482
}
483
#mobile-navbar-spacer {
484
display: block;
485
height: var(--height-navbar);
486
}
487
#desktop-navbar {
488
display: none;
489
}
490
:root {
491
--reserved-height-top: var(--height-navbar);
492
}
493
}
494
495
#hamburger > nav {
496
display: flex;
497
flex-direction: column;
498
gap: 1em;
499
padding: var(--padding-card);
500
padding-top: var(--padding-card-top);
501
box-shadow: var(--shadow-card);
502
background: var(--color-card);
503
justify-content: space-between;
504
width: clamp(240px, calc(100vw - 56px), 448px);
505
}
506
507
#hamburger > nav > ul {
508
display: flex;
509
flex-direction: column;
510
gap: 1em;
511
margin: 0;
512
}
513
514
#hamburger > nav > ul > li {
515
display: flex;
516
gap: var(--gap-label-checkbox);
517
align-items: center;
518
margin: 0;
519
}
520
521
#hamburger > nav > ul > li > a {
522
display: contents;
523
text-decoration: none;
524
color: var(--color-card-text);
525
}
526
527
.star-rating-container {
528
display: flex;
529
flex-direction: row-reverse;
530
font-size: 1.25em;
531
align-items: center;
532
justify-content: flex-end; /* In this case, it means LEFT, not right, because of the row-reverse */
533
}
534
535
.star-rating-container > input {
536
width: 0 !important;
537
height: 0 !important;
538
visibility: hidden;
539
}
540
541
.star-rating-container > label {
542
cursor: pointer;
543
color: var(--text-softest);
544
transition: color 0.25s cubic-bezier(0.37, 0, 0.63, 1),
545
filter 0.25s cubic-bezier(0.37, 0, 0.63, 1);
546
}
547
548
.star-rating-container > label:hover,
549
.star-rating-container > label:hover ~ label {
550
color: var(--color-star);
551
filter: drop-shadow(0 0 3px #00000040);
552
}
553
554
.star-rating-container > input:checked ~ label {
555
color: var(--color-star);
556
}
557
558
.visually-hidden {
559
position: absolute;
560
width: 1px;
561
height: 1px;
562
box-sizing: content-box;
563
margin: -1px;
564
overflow: hidden;
565
clip-path: inset(50%);
566
border: 0;
567
}
568
569
.rating-list {
570
display: grid;
571
grid-auto-columns: 1fr;
572
gap: 0.5rem;
573
grid-template-columns: auto;
574
list-style: none;
575
margin: 0 !important;
576
padding: 0;
577
min-width: 50%;
578
}
579
580
.rating-list > li {
581
grid-column-start: 1;
582
height: 28px;
583
padding: 4px 8px;
584
display: flex;
585
align-items: center;
586
justify-content: space-between;
587
gap: 0.5rch;
588
border-radius: 0 4px 4px 0;
589
margin: 0;
590
}
591
592
.rating-bar {
593
display: flex;
594
align-items: center;
595
justify-content: flex-start;
596
gap: 0.5rch;
597
font-size: 1.25em;
598
width: 100%;
599
}
600
601
.rating-bar > .rating-bar-segment {
602
position: relative;
603
width: 1em;
604
height: 1em;
605
clip-path: url(#star-clip);
606
background: var(--text-softest);
607
}
608
609
.rating-bar > .rating-bar-segment > .rating-bar-filling {
610
background: var(--color-star);
611
height: 100%;
612
position: absolute;
613
top: 0;
614
left: 0;
615
}
616
617
#picture-view {
618
display: flex;
619
flex-direction: row;
620
gap: 1em;
621
align-items: flex-start;
622
justify-content: center;
623
width: fit-content;
624
margin: 0 auto;
625
}
626
627
#picture-view > x-frame {
628
flex: 1 1 var(--width);
629
margin: 0;
630
}
631
632
#picture-actions {
633
--width: 256px;
634
position: sticky;
635
top: var(--reserved-height-top);
636
overflow: auto;
637
max-height: 100vh;
638
height: 100%;
639
background: var(--color-card);
640
padding: 1rem 0;
641
box-shadow: var(--shadow-card);
642
}
643
644
@media screen and (max-width: 768px) {
645
#picture-view {
646
flex-direction: column;
647
}
648
#picture-view > x-frame {
649
flex: 1 1 auto;
650
margin: 0;
651
}
652
#picture-actions {
653
--width: 768px;
654
position: static;
655
padding: 1rem;
656
}
657
#picture-actions > ul {
658
width: 100%;
659
list-style: none;
660
margin: 0;
661
padding: 0;
662
}
663
#picture-actions > ul > li {
664
display: inline;
665
}
666
.action-list > li {
667
padding: 0 !important;
668
}
669
}
670
671
.action-list {
672
list-style: none;
673
margin: 0 !important;
674
padding: 0;
675
}
676
677
.action-list > li {
678
display: flex;
679
margin: 0;
680
width: 100%;
681
padding: 0.25rem 1rem;
682
}
683
684
.action-list > li > a {
685
text-decoration: none;
686
color: var(--color-card-text) !important;
687
display: flex;
688
align-items: center;
689
gap: 0.5rch;
690
font-weight: 400;
691
}
692
693
.action-list > li > details > summary {
694
color: var(--color-card-text) !important;
695
display: flex;
696
align-items: center;
697
gap: 0.5rch;
698
font-weight: 400;
699
}
700
701
#picture-buttons {
702
padding: 0 1rem;
703
}
704
705
@media print {
706
#picture-actions, #annotation-view-controls {
707
display: none;
708
}
709
.navbar {
710
display: none;
711
}
712
:root {
713
--color-background: #ffffff;
714
}
715
#annotation-zone, .thumbnail-list {
716
width: 100vw;
717
height: auto;
718
position: relative;
719
left: calc(-1 * (50vw - 50%));
720
}
721
}
722
723
.navbar > ul {
724
max-width: 100%;
725
}
726
727
#desktop-navbar > ul:first-child { /* list containing title */
728
flex: 0 1 auto;
729
min-width: 0;
730
}
731
732
#desktop-navbar > ul:last-child { /* list containing navigation */
733
flex: 1 0 auto;
734
justify-content: end;
735
}
736
737
#mobile-navbar-title, #desktop-navbar-title {
738
font: var(--h5-font);
739
font-weight: 700;
740
white-space: nowrap;
741
overflow: hidden;
742
text-overflow: ellipsis;
743
flex: 0 1 auto;
744
min-width: 0;
745
}
746
747
nav .button-flat {
748
--color-flat-button-hover: transparent;
749
--color-flat-button-active: transparent;
750
}
751
752
nav .button-flat .ripple-pad {
753
background: #ffffff99;
754
}
755
756
.warning {
757
background: var(--color-alert);
758
color: var(--color-alert-text);
759
padding: 1rem;
760
margin: 1rem 0;
761
border-radius: var(--radius-card);
762
box-shadow: var(--shadow-card);
763
--color-link-text: #000000;
764
--color-link-hover-text: #000000;
765
--color-link-visited-text: #000000;
766
--color-link-visited-hover-text: #000000;
767
--color-link-active-text: #000000;
768
}
769
770
.warning h2 {
771
font: var(--h3-font);
772
}
773
774
#annotation-zone {
775
box-shadow: var(--shadow-card);
776
}
777
778
#hamburger-site-name {
779
font: var(--h4-font);
780
text-transform: uppercase;
781
color: var(--color-accent);
782
}
783
784
#object-types {
785
z-index: 3;
786
background: var(--color-callout);
787
color: var(--color-callout-text);
788
--color-background-text: var(--color-callout-text);
789
--color-label-text: var(--color-callout-text);
790
box-shadow: var(--shadow-card);
791
border-radius: var(--radius-input);
792
position: absolute;
793
display: none;
794
overflow: auto;
795
}
796
797
#object-types-content {
798
padding: 1rem;
799
}
800
801
#annotation-controls {
802
display: flex;
803
justify-content: space-between;
804
gap: 1rem;
805
padding: 0.5rem;
806
align-items: stretch;
807
}
808
809
#annotation-controls > x-buttonbox {
810
align-items: center;
811
}
812
813
#annotation-controls > x-buttonbox button:has(iconify-icon) {
814
aspect-ratio: 1;
815
}
816
817
#annotation-controls > x-buttonbox button > iconify-icon {
818
font-size: 1.5rem;
819
}
820
821
#annotation-helper-message {
822
padding: 0.75rem;
823
text-align: center;
824
flex: 0 0 auto;
825
}
826
827
#annotation-zoom-container {
828
flex: 1 1 auto;
829
overflow: hidden;
830
align-self: stretch;
831
width: 100%;
832
display: flex;
833
justify-content: center;
834
align-items: center;
835
touch-action: none;
836
}
837
838
#annotation-zoom-container > #annotation-zone {
839
transform: scale(1);
840
transition: transform 0.125s cubic-bezier(0.28, 0.5, 0.31, 0.92);
841
max-width: 100%;
842
max-height: 100% !important;
843
box-shadow: none;
844
}
845
846
#annotation-zoom-container > #annotation-zone > #annotation-image {
847
object-fit: contain;
848
width: 100%;
849
height: 100%;
850
}
851
852
#annotation-main-area {
853
display: flex;
854
flex-direction: column;
855
flex: 1 1 auto;
856
overflow: auto;
857
width: 100%;
858
}
859
860
body.fixed-content-area {
861
max-width: 100vw;
862
max-height: 100vh;
863
display: flex;
864
flex-direction: column;
865
}
866
867
body.fixed-content-area > main {
868
flex: 1 1 auto;
869
overflow: auto;
870
display: flex;
871
flex-direction: column;
872
}
873
874
#annotation-zoom-controls {
875
display: flex;
876
gap: 0.5rem;
877
justify-content: center;
878
align-items: center;
879
}
880
881
#zoom-indicator {
882
width: 7ch;
883
text-align: right;
884
}
885
886
#annotation-zoom-container {
887
cursor: grab;
888
}
889
890
#object-types {
891
cursor: auto;
892
}
893