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