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