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@media screen and (max-width: 768px) { 594.rating-box { 595flex-direction: column; 596} 597} 598 599.rating-bar { 600display: flex; 601align-items: center; 602justify-content: flex-start; 603gap: 0.5rch; 604font-size: 1.25em; 605width: 100%; 606} 607 608.rating-bar > .rating-bar-segment { 609position: relative; 610width: 1em; 611height: 1em; 612clip-path: url(#star-clip); 613background: var(--text-softest); 614} 615 616.rating-bar > .rating-bar-segment > .rating-bar-filling { 617background: var(--color-star); 618height: 100%; 619position: absolute; 620top: 0; 621left: 0; 622} 623 624#picture-view { 625display: flex; 626flex-direction: row; 627gap: 1em; 628align-items: flex-start; 629justify-content: center; 630width: fit-content; 631margin: 0 auto; 632} 633 634#picture-view > x-frame { 635flex: 1 1 var(--width); 636margin: 0; 637} 638 639#picture-actions { 640--width: 256px; 641position: sticky; 642top: var(--reserved-height-top); 643overflow: auto; 644max-height: 100vh; 645height: 100%; 646background: var(--color-card); 647padding: 1rem 0; 648box-shadow: var(--shadow-card); 649} 650 651@media screen and (max-width: 768px) { 652#picture-view { 653flex-direction: column; 654} 655#picture-view > x-frame { 656flex: 1 1 auto; 657margin: 0; 658} 659#picture-actions { 660--width: 768px; 661position: static; 662padding: 1rem; 663} 664#picture-actions > ul { 665width: 100%; 666list-style: none; 667margin: 0; 668padding: 0; 669} 670#picture-actions > ul > li { 671display: inline; 672} 673.action-list > li { 674padding: 0 !important; 675} 676#picture-view > x-frame > hgroup, #annotation-view-controls, #picture-details { 677margin-left: 1rem; 678margin-right: 1rem; 679} 680.mobile-padding { 681padding-left: 1rem; 682} 683} 684 685#annotation-view-controls { 686display: flex; 687flex-flow: row wrap; 688gap: 1rem; 689margin-top: 1rem; 690margin-bottom: 1rem; 691} 692 693#picture-view > x-frame > hgroup { 694margin-bottom: 1rem; 695} 696 697.action-list { 698list-style: none; 699margin: 0 !important; 700padding: 0; 701} 702 703.action-list > li { 704display: flex; 705margin: 0; 706width: 100%; 707padding: 0.25rem 1rem; 708} 709 710.action-list > li > a { 711text-decoration: none; 712color: var(--color-card-text) !important; 713display: flex; 714align-items: center; 715gap: 0.5rch; 716font-weight: 400; 717} 718 719.action-list > li > details > summary { 720color: var(--color-card-text) !important; 721display: flex; 722align-items: center; 723gap: 0.5rch; 724font-weight: 400; 725} 726 727#picture-buttons { 728padding: 0 1rem; 729} 730 731@media print { 732#picture-actions, #annotation-view-controls { 733display: none; 734} 735.navbar { 736display: none; 737} 738:root { 739--color-background: #ffffff; 740} 741#annotation-zone, .thumbnail-list { 742width: 100vw; 743height: auto; 744position: relative; 745left: calc(-1 * (50vw - 50%)); 746} 747} 748 749.navbar > ul { 750max-width: 100%; 751} 752 753#desktop-navbar > ul:first-child { /* list containing title */ 754flex: 0 1 auto; 755min-width: 0; 756} 757 758#desktop-navbar > ul:last-child { /* list containing navigation */ 759flex: 1 0 auto; 760justify-content: end; 761} 762 763#mobile-navbar-title, #desktop-navbar-title { 764font: var(--h5-font); 765font-weight: 700; 766white-space: nowrap; 767overflow: hidden; 768text-overflow: ellipsis; 769flex: 0 1 auto; 770min-width: 0; 771} 772 773nav .button-flat { 774--color-flat-button-hover: transparent; 775--color-flat-button-active: transparent; 776} 777 778nav .button-flat .ripple-pad { 779background: #ffffff99; 780} 781 782.warning { 783background: var(--color-alert); 784color: var(--color-alert-text); 785padding: 1rem; 786margin: 1rem 0; 787border-radius: var(--radius-card); 788box-shadow: var(--shadow-card); 789--color-link-text: #000000; 790--color-link-hover-text: #000000; 791--color-link-visited-text: #000000; 792--color-link-visited-hover-text: #000000; 793--color-link-active-text: #000000; 794} 795 796.warning h2 { 797font: var(--h3-font); 798} 799 800#annotation-zone { 801box-shadow: var(--shadow-card); 802} 803 804#hamburger-site-name { 805font: var(--h4-font); 806text-transform: uppercase; 807color: var(--color-accent); 808} 809 810#object-types { 811z-index: 3; 812background: var(--color-callout); 813color: var(--color-callout-text); 814--color-background-text: var(--color-callout-text); 815--color-label-text: var(--color-callout-text); 816box-shadow: var(--shadow-card); 817border-radius: var(--radius-input); 818position: absolute; 819display: none; 820overflow: auto; 821} 822 823#object-types-content { 824padding: 1rem; 825} 826 827#annotation-controls { 828display: flex; 829justify-content: space-between; 830gap: 1rem; 831padding: 0.5rem; 832align-items: stretch; 833} 834 835#annotation-controls > x-buttonbox { 836align-items: center; 837} 838 839#annotation-controls > x-buttonbox button:has(iconify-icon) { 840aspect-ratio: 1; 841} 842 843#annotation-controls > x-buttonbox button > iconify-icon { 844font-size: 1.5rem; 845} 846 847#annotation-helper-message { 848padding: 0.75rem; 849text-align: center; 850flex: 0 0 auto; 851} 852 853#annotation-zoom-container { 854flex: 1 1 auto; 855overflow: hidden; 856align-self: stretch; 857width: 100%; 858display: flex; 859justify-content: center; 860align-items: center; 861touch-action: none; 862} 863 864#annotation-zoom-container > #annotation-zone { 865transform: scale(1); 866transition: transform 0.125s cubic-bezier(0.28, 0.5, 0.31, 0.92); 867max-width: 100%; 868max-height: 100% !important; 869box-shadow: none; 870} 871 872#annotation-zoom-container > #annotation-zone > #annotation-image { 873object-fit: contain; 874width: 100%; 875height: 100%; 876} 877 878#annotation-main-area { 879display: flex; 880flex-direction: column; 881flex: 1 1 auto; 882overflow: auto; 883width: 100%; 884} 885 886body.fixed-content-area { 887max-width: 100vw; 888max-height: 100vh; 889display: flex; 890flex-direction: column; 891} 892 893body.fixed-content-area > main { 894flex: 1 1 auto; 895overflow: auto; 896display: flex; 897flex-direction: column; 898} 899 900#annotation-zoom-controls { 901display: flex; 902gap: 0.5rem; 903justify-content: center; 904align-items: center; 905} 906 907#zoom-indicator { 908width: 7ch; 909text-align: right; 910} 911 912#annotation-zoom-container { 913cursor: grab; 914} 915 916#object-types { 917cursor: auto; 918} 919 920.thumbnail-list-scroll { 921display: flex; 922flex-direction: row; 923overflow-x: auto; 924overflow-y: hidden; 925align-items: stretch; 926padding: 16px; 927} 928 929.thumbnail-list-scroll > li { 930flex: 0 0 192px; 931} 932 933.thumbnail-list-scroll > li > a .annotation-zone:hover { 934transform: none; 935} 936 937summary { 938cursor: pointer; 939} 940 941button, .button, input, select, textarea { 942box-sizing: border-box; 943} 944 945.button-danger { 946--color-button: var(--color-error); 947--color-button-hover: var(--color-error); 948--color-button-active: var(--color-error); 949} 950 951input[type="file"] { 952padding: 0.5rem; 953display: flex; 954font-style: italic; 955} 956 957.thumbnail-card-small > a > .annotation-zone { 958flex: 0 0 auto; 959max-width: 384px; 960} 961 962.thumbnail-card-small, .thumbnail-card-small > a { 963align-items: center; 964} 965 966.thumbnail-card-small { 967margin: auto; 968} 969