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
flex-flow: row wrap;
431
justify-content: space-between;
432
align-items: center;
433
padding: 8px;
434
}
435
436
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) {
437
box-shadow: var(--shadow-card), 0 4px 32px rgba(0, 0, 0, 0.12), 0 4px 16px rgba(0, 0, 0, 0.08);
438
}
439
440
.thumbnail-list > li .annotation-zone {
441
transition: transform 0.25s cubic-bezier(0.61, 1, 0.88, 1),
442
box-shadow 0.25s cubic-bezier(0.61, 1, 0.88, 1);
443
}
444
445
.thumbnail-list > li .annotation-zone:hover {
446
position: relative;
447
transform: scale(2);
448
z-index: 1;
449
box-shadow: var(--shadow-textarea-active);
450
}
451
452
.thumbnail-list > li .list-detail {
453
padding: 8px;
454
display: block;
455
}
456
457
a.button {
458
text-decoration: none;
459
}
460
461
dt {
462
font-weight: 600;
463
}
464
465
dd {
466
margin-left: 40px;
467
}
468
469
#mobile-navbar, #mobile-navbar-spacer {
470
display: none;
471
}
472
473
@media screen and (max-width: 896px) {
474
#mobile-navbar {
475
display: flex;
476
}
477
header {
478
position: fixed;
479
top: 0;
480
left: 0;
481
width: 100%;
482
z-index: 3;
483
}
484
#mobile-navbar-spacer {
485
display: block;
486
height: var(--height-navbar);
487
}
488
#desktop-navbar {
489
display: none;
490
}
491
:root {
492
--reserved-height-top: var(--height-navbar);
493
}
494
}
495
496
#hamburger > nav {
497
display: flex;
498
flex-direction: column;
499
gap: 1em;
500
padding: var(--padding-card);
501
padding-top: var(--padding-card-top);
502
box-shadow: var(--shadow-card);
503
background: var(--color-card);
504
justify-content: space-between;
505
width: clamp(240px, calc(100vw - 56px), 448px);
506
}
507
508
#hamburger > nav > ul {
509
display: flex;
510
flex-direction: column;
511
gap: 1em;
512
margin: 0;
513
}
514
515
#hamburger > nav > ul > li {
516
display: flex;
517
gap: var(--gap-label-checkbox);
518
align-items: center;
519
margin: 0;
520
}
521
522
#hamburger > nav > ul > li > a {
523
display: contents;
524
text-decoration: none;
525
color: var(--color-card-text);
526
}
527
528
.star-rating-container {
529
display: flex;
530
flex-direction: row-reverse;
531
font-size: 1.25em;
532
align-items: center;
533
justify-content: flex-end; /* In this case, it means LEFT, not right, because of the row-reverse */
534
}
535
536
.star-rating-container > input {
537
width: 0 !important;
538
height: 0 !important;
539
visibility: hidden;
540
}
541
542
.star-rating-container > label {
543
cursor: pointer;
544
color: var(--text-softest);
545
transition: color 0.25s cubic-bezier(0.37, 0, 0.63, 1),
546
filter 0.25s cubic-bezier(0.37, 0, 0.63, 1);
547
}
548
549
.star-rating-container > label:hover,
550
.star-rating-container > label:hover ~ label {
551
color: var(--color-star);
552
filter: drop-shadow(0 0 3px #00000040);
553
}
554
555
.star-rating-container > input:checked ~ label {
556
color: var(--color-star);
557
}
558
559
.visually-hidden {
560
position: absolute;
561
width: 1px;
562
height: 1px;
563
box-sizing: content-box;
564
margin: -1px;
565
overflow: hidden;
566
clip-path: inset(50%);
567
border: 0;
568
}
569
570
.rating-list {
571
display: grid;
572
grid-auto-columns: 1fr;
573
gap: 0.5rem;
574
grid-template-columns: auto;
575
list-style: none;
576
margin: 0 !important;
577
padding: 0;
578
min-width: 50%;
579
}
580
581
.rating-list > li {
582
grid-column-start: 1;
583
height: 28px;
584
padding: 4px 8px;
585
display: flex;
586
align-items: center;
587
justify-content: space-between;
588
gap: 0.5rch;
589
border-radius: 0 4px 4px 0;
590
margin: 0;
591
}
592
593
.rating-bar {
594
display: flex;
595
align-items: center;
596
justify-content: flex-start;
597
gap: 0.5rch;
598
font-size: 1.25em;
599
width: 100%;
600
}
601
602
.rating-bar > .rating-bar-segment {
603
position: relative;
604
width: 1em;
605
height: 1em;
606
clip-path: url(#star-clip);
607
background: var(--text-softest);
608
}
609
610
.rating-bar > .rating-bar-segment > .rating-bar-filling {
611
background: var(--color-star);
612
height: 100%;
613
position: absolute;
614
top: 0;
615
left: 0;
616
}
617
618
#picture-view {
619
display: flex;
620
flex-direction: row;
621
gap: 1em;
622
align-items: flex-start;
623
justify-content: center;
624
width: fit-content;
625
margin: 0 auto;
626
}
627
628
#picture-view > x-frame {
629
flex: 1 1 var(--width);
630
margin: 0;
631
}
632
633
#picture-actions {
634
--width: 256px;
635
position: sticky;
636
top: var(--reserved-height-top);
637
overflow: auto;
638
max-height: 100vh;
639
height: 100%;
640
background: var(--color-card);
641
padding: 1rem 0;
642
box-shadow: var(--shadow-card);
643
}
644
645
@media screen and (max-width: 768px) {
646
#picture-view {
647
flex-direction: column;
648
}
649
#picture-view > x-frame {
650
flex: 1 1 auto;
651
margin: 0;
652
}
653
#picture-actions {
654
--width: 768px;
655
position: static;
656
padding: 1rem;
657
}
658
#picture-actions > ul {
659
width: 100%;
660
list-style: none;
661
margin: 0;
662
padding: 0;
663
}
664
#picture-actions > ul > li {
665
display: inline;
666
}
667
.action-list > li {
668
padding: 0 !important;
669
}
670
}
671
672
.action-list {
673
list-style: none;
674
margin: 0 !important;
675
padding: 0;
676
}
677
678
.action-list > li {
679
display: flex;
680
margin: 0;
681
width: 100%;
682
padding: 0.25rem 1rem;
683
}
684
685
.action-list > li > a {
686
text-decoration: none;
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
.action-list > li > details > summary {
695
color: var(--color-card-text) !important;
696
display: flex;
697
align-items: center;
698
gap: 0.5rch;
699
font-weight: 400;
700
}
701
702
#picture-buttons {
703
padding: 0 1rem;
704
}
705
706
@media print {
707
#picture-actions, #annotation-view-controls {
708
display: none;
709
}
710
.navbar {
711
display: none;
712
}
713
:root {
714
--color-background: #ffffff;
715
}
716
#annotation-zone, .thumbnail-list {
717
width: 100vw;
718
height: auto;
719
position: relative;
720
left: calc(-1 * (50vw - 50%));
721
}
722
}
723
724
.navbar > ul {
725
max-width: 100%;
726
}
727
728
#desktop-navbar > ul:first-child { /* list containing title */
729
flex: 0 1 auto;
730
min-width: 0;
731
}
732
733
#desktop-navbar > ul:last-child { /* list containing navigation */
734
flex: 1 0 auto;
735
justify-content: end;
736
}
737
738
#mobile-navbar-title, #desktop-navbar-title {
739
font: var(--h5-font);
740
font-weight: 700;
741
white-space: nowrap;
742
overflow: hidden;
743
text-overflow: ellipsis;
744
flex: 0 1 auto;
745
min-width: 0;
746
}
747
748
nav .button-flat {
749
--color-flat-button-hover: transparent;
750
--color-flat-button-active: transparent;
751
}
752
753
nav .button-flat .ripple-pad {
754
background: #ffffff99;
755
}
756
757
.warning {
758
background: var(--color-alert);
759
color: var(--color-alert-text);
760
padding: 1rem;
761
margin: 1rem 0;
762
border-radius: var(--radius-card);
763
box-shadow: var(--shadow-card);
764
--color-link-text: #000000;
765
--color-link-hover-text: #000000;
766
--color-link-visited-text: #000000;
767
--color-link-visited-hover-text: #000000;
768
--color-link-active-text: #000000;
769
}
770
771
.warning h2 {
772
font: var(--h3-font);
773
}
774
775
#annotation-zone {
776
box-shadow: var(--shadow-card);
777
}
778
779
#hamburger-site-name {
780
font: var(--h4-font);
781
text-transform: uppercase;
782
color: var(--color-accent);
783
}
784
785
#object-types {
786
z-index: 3;
787
background: var(--color-callout);
788
color: var(--color-callout-text);
789
--color-background-text: var(--color-callout-text);
790
--color-label-text: var(--color-callout-text);
791
box-shadow: var(--shadow-card);
792
border-radius: var(--radius-input);
793
position: absolute;
794
display: none;
795
overflow: auto;
796
}
797
798
#object-types-content {
799
padding: 1rem;
800
}
801
802
#annotation-controls {
803
display: flex;
804
justify-content: space-between;
805
gap: 1rem;
806
padding: 0.5rem;
807
align-items: stretch;
808
}
809
810
#annotation-controls > x-buttonbox {
811
align-items: center;
812
}
813
814
#annotation-controls > x-buttonbox button:has(iconify-icon) {
815
aspect-ratio: 1;
816
}
817
818
#annotation-controls > x-buttonbox button > iconify-icon {
819
font-size: 1.5rem;
820
}
821
822
#annotation-helper-message {
823
padding: 0.75rem;
824
text-align: center;
825
flex: 0 0 auto;
826
}
827
828
#annotation-zoom-container {
829
flex: 1 1 auto;
830
overflow: hidden;
831
align-self: stretch;
832
width: 100%;
833
display: flex;
834
justify-content: center;
835
align-items: center;
836
touch-action: none;
837
}
838
839
#annotation-zoom-container > #annotation-zone {
840
transform: scale(1);
841
transition: transform 0.125s cubic-bezier(0.28, 0.5, 0.31, 0.92);
842
max-width: 100%;
843
max-height: 100% !important;
844
box-shadow: none;
845
}
846
847
#annotation-zoom-container > #annotation-zone > #annotation-image {
848
object-fit: contain;
849
width: 100%;
850
height: 100%;
851
}
852
853
#annotation-main-area {
854
display: flex;
855
flex-direction: column;
856
flex: 1 1 auto;
857
overflow: auto;
858
width: 100%;
859
}
860
861
body.fixed-content-area {
862
max-width: 100vw;
863
max-height: 100vh;
864
display: flex;
865
flex-direction: column;
866
}
867
868
body.fixed-content-area > main {
869
flex: 1 1 auto;
870
overflow: auto;
871
display: flex;
872
flex-direction: column;
873
}
874
875
#annotation-zoom-controls {
876
display: flex;
877
gap: 0.5rem;
878
justify-content: center;
879
align-items: center;
880
}
881
882
#zoom-indicator {
883
width: 7ch;
884
text-align: right;
885
}
886
887
#annotation-zoom-container {
888
cursor: grab;
889
}
890
891
#object-types {
892
cursor: auto;
893
}
894
895
.thumbnail-list-scroll {
896
display: flex;
897
flex-direction: row;
898
overflow-x: auto;
899
overflow-y: hidden;
900
align-items: stretch;
901
padding: 16px;
902
}
903
904
.thumbnail-list-scroll > li {
905
flex: 0 0 192px;
906
}
907
908
.thumbnail-list-scroll > li > a .annotation-zone:hover {
909
transform: none;
910
}
911
912
summary {
913
cursor: pointer;
914
}
915
916
button, .button, input, select, textarea {
917
box-sizing: border-box;
918
}
919
920
.button-danger {
921
--color-button: var(--color-error);
922
--color-button-hover: var(--color-error);
923
--color-button-active: var(--color-error);
924
}
925