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