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