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