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