Files

873 lines
13 KiB
CSS

body {
margin: 0;
padding: 0;
color: var(--foreground);
background: var(--background);
font-family: sans-serif;
font-size: 14px;
}
/* Fixed background layer, same construction as the landing page */
#bg {
position: fixed;
width: 100vw;
height: 100vh;
z-index: -1;
background: var(--background);
}
#bg img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
object-position: 50% 50%;
opacity: 0;
transition: opacity 3s linear;
}
#bg img.loaded {
opacity: 1;
}
h1, h2, h3, h4, h5, h6 {
color: var(--color1);
margin-top: 10px;
margin-bottom: 0;
}
h1 {
margin-top: 0;
font-size: 28px;
}
h2 {
color: var(--color2);
}
p {
margin-top: 2px;
line-height: 1.5;
}
a {
color: var(--color2);
text-decoration: none;
font-weight: bold;
}
a:hover {
color: var(--color3);
}
em {
color: var(--color3);
}
sup.fn {
font-size: 10px;
}
sup.fn a {
font-weight: normal;
}
pre {
margin: 8px 0;
max-width: 640px;
}
pre > code {
border: 1px solid color-mix(in srgb, var(--foreground) 25%, transparent);
display: block;
padding: 8px 12px;
overflow-x: auto;
font-size: 13px;
}
article {
max-width: 1024px;
margin: 25px auto;
padding: 20px;
background: color-mix(in srgb, var(--background) 90%, transparent);
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.9);
}
@media (max-width: 1064px) {
article {
margin: 15px 12px;
}
}
img {
max-width: 100%;
}
math[display="block"] {
margin: 12px 0 12px 24px;
font-size: 17px;
color: var(--color4);
}
aside.explainer {
border-left: 3px solid var(--color4);
background: color-mix(in srgb, var(--foreground) 5%, transparent);
padding: 8px 12px;
margin: 12px 0;
font-size: 13px;
}
.rewrite-target {
text-decoration: underline dashed var(--color3);
text-underline-offset: 3px;
}
.rewrite-target::after {
content: ' ✎';
color: var(--color3);
font-size: 11px;
}
.attribution {
font-size: 12px;
opacity: 0.7;
}
.big-number {
font-size: 26px;
color: var(--color1);
margin: 8px 0 4px 0;
}
/* Demo */
.needs-image {
display: none;
}
.needs-image.visible {
display: block;
}
#base .image-original img {
max-width: 256px;
min-width: 256px;
}
.sample {
height: 48px;
margin: 0 4px 4px 0;
cursor: pointer;
vertical-align: middle;
}
.sample:hover {
outline: 2px solid var(--color1);
}
/* Comparison slider */
.compare {
position: relative;
max-width: 512px;
overflow: hidden;
touch-action: none;
cursor: ew-resize;
user-select: none;
}
.compare img {
display: block;
width: 100%;
pointer-events: none;
}
/* The top image stretches to the base image's box, so differently
sized results (8x8 thumbs, crops) stay comparable under the divider */
.compare .compare-b {
position: absolute;
top: 0;
left: 0;
height: 100%;
object-fit: fill;
clip-path: inset(0 0 0 50%);
}
.compare .compare-divider {
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 2px;
margin-left: -1px;
background: var(--color1);
}
.compare .compare-handle {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 28px;
height: 28px;
line-height: 28px;
text-align: center;
border-radius: 50%;
background: var(--color1);
color: var(--background);
font-size: 15px;
}
.compare .compare-label {
position: absolute;
top: 6px;
padding: 2px 6px;
font-size: 11px;
background: color-mix(in srgb, var(--background) 75%, transparent);
color: var(--foreground);
}
.compare .compare-label.a {
left: 6px;
}
.compare .compare-label.b {
right: 6px;
}
/* Busy indicator while the worker renders a mutation */
.compare.busy::after {
content: 'mutating…';
position: absolute;
right: 8px;
bottom: 8px;
padding: 3px 9px;
background: color-mix(in srgb, var(--background) 80%, transparent);
color: var(--color1);
font-size: 12px;
animation: busy-pulse 1s ease-in-out infinite;
}
.distances.busy td {
opacity: 0.35;
}
@keyframes busy-pulse {
50% { opacity: 0.35; }
}
/* Hash visualisation */
.hash-panel {
display: flex;
flex-flow: row wrap;
gap: 24px;
align-items: flex-start;
}
.hash-value {
font-size: 18px;
letter-spacing: 2px;
}
.hash-value.small {
display: block;
margin-top: 4px;
font-size: 12px;
letter-spacing: 1px;
opacity: 0.8;
}
.bit-grid {
display: grid;
grid-template-columns: repeat(8, 20px);
}
.bit-grid.wide {
grid-template-columns: repeat(12, 20px);
}
.bit-grid .bit {
height: 20px;
box-sizing: border-box;
border: 1px solid var(--background);
}
.bit-grid.small {
grid-template-columns: repeat(8, 13px);
}
.bit-grid.small .bit {
height: 13px;
}
.bit-grid .bit.on {
background: var(--foreground);
}
.bit-grid .bit.off {
background: color-mix(in srgb, var(--foreground) 12%, transparent);
}
/* Changed bits keep their on/off brightness and get a red tint + border,
so light-changed and dark-changed cells stay distinguishable */
.bit-grid .bit.diff {
border-color: hsl(4 70% 55%);
}
.bit-grid .bit.on.diff {
background: color-mix(in srgb, var(--foreground) 55%, hsl(4 70% 50%));
}
.bit-grid .bit.off.diff {
background: hsl(4 60% 50% / 0.25);
}
.heat-grid {
display: grid;
grid-template-columns: repeat(8, 32px);
}
.heat-grid > div {
height: 32px;
box-sizing: border-box;
}
.heat-grid.mini {
grid-template-columns: repeat(8, 22px);
}
.heat-grid.mini > div {
height: 22px;
}
.pixelated, #phash-resize img, .input-thumb img {
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
}
#phash-resize img {
width: 128px;
height: 128px;
}
.input-thumb img {
width: 176px;
height: 176px;
}
/* DCT extras */
.grid-overlay {
position: relative;
width: 256px;
}
.grid-overlay.mini {
width: 176px;
}
#dct-basis-wrap {
position: relative;
display: inline-block;
}
.basis-hover {
display: none;
position: absolute;
outline: 2px solid var(--color1);
outline-offset: -1px;
pointer-events: none;
}
#dct-basis {
cursor: crosshair;
}
#dct-formula .formula-result {
display: none;
}
#dct-formula.live .formula-result {
display: inline;
}
#dct-formula.live .var-u,
#dct-formula.live .var-v,
#dct-formula.live .formula-value {
color: var(--color1);
}
#image-dct .hover-cell {
outline: 2px solid var(--color1);
outline-offset: -2px;
}
#dct-zigzag {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
}
#dct-zigzag polyline {
stroke: var(--color1);
stroke-width: 3;
stroke-linejoin: round;
}
#dct-zigzag polyline.play {
transition: stroke-dashoffset 2.5s ease-in-out;
}
#dct-basis {
background: var(--background);
}
/* Reconstruction demos */
.recon-row {
display: flex;
flex-flow: row wrap;
gap: 24px;
align-items: flex-start;
margin: 10px 0;
}
.recon-row figure {
margin: 0;
text-align: center;
}
.recon-row figcaption {
font-size: 12px;
opacity: 0.8;
margin-top: 4px;
}
.recon-row canvas {
width: 176px;
height: 176px;
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
}
#recon-k {
width: 256px;
vertical-align: middle;
}
.recon-note {
font-size: 12px;
opacity: 0.7;
margin-left: 8px;
}
#recon-zigzag {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
}
#recon-zigzag polyline {
stroke-width: 2.5;
stroke-linejoin: round;
transition: stroke-dashoffset 0.12s linear;
}
#recon-zigzag .zig-head {
stroke: var(--color1);
}
#recon-zigzag .zig-tail {
stroke: color-mix(in srgb, var(--foreground) 45%, transparent);
}
/* Tables */
table.facts {
border-collapse: collapse;
margin: 10px 0;
}
table.facts th, table.facts td {
text-align: left;
padding: 4px 14px 4px 0;
border-bottom: 1px solid color-mix(in srgb, var(--foreground) 20%, transparent);
font-size: 13px;
}
table.facts th {
color: var(--color1);
font-weight: normal;
}
.distances td {
text-align: center;
font-size: 18px;
min-width: 64px;
}
.distances td.match {
color: hsl(135 50% 45%);
}
.distances td.nomatch {
color: hsl(4 70% 55%);
}
/* LSH demo */
.lsh-thumb img {
height: 110px;
margin-bottom: 6px;
display: block;
}
.lsh-distance {
font-size: 16px;
}
.lsh-distance .match {
font-size: 22px;
color: hsl(135 50% 45%);
}
.lsh-distance .nomatch {
font-size: 22px;
color: hsl(4 70% 55%);
}
/* Flip demo */
#flip-stage img {
max-width: 256px;
max-height: 256px;
transition: transform 0.7s ease-in-out;
}
#flip-stage img.flipped {
transform: scaleX(-1);
}
#ghost-canvas {
transition: transform 0.4s ease-in-out;
}
#ghost-canvas.flipped {
transform: scaleX(-1);
}
.flip-table th {
color: var(--color1);
font-weight: normal;
text-align: left;
padding-right: 12px;
}
.flip-table td {
vertical-align: top;
padding: 6px 12px 6px 0;
}
.flip-distance {
font-size: 24px;
}
.flip-distance.match {
color: hsl(135 50% 45%);
}
.flip-distance.nomatch {
color: hsl(4 70% 55%);
}
/* Ranking */
.pool {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));
gap: 4px;
max-height: 330px;
overflow-y: auto;
margin: 10px 0;
}
.pool img {
width: 100%;
aspect-ratio: 1;
object-fit: cover;
cursor: pointer;
display: block;
}
.pool img:hover {
outline: 2px solid var(--color1);
}
.pool img.query {
outline: 3px solid var(--color1);
}
.ranking-results h3 {
margin-top: 14px;
}
.thumb-row {
display: flex;
flex-flow: row wrap;
gap: 8px;
}
.thumb-row figure {
width: 84px;
margin: 0;
text-align: center;
}
.thumb-row figure.hit {
outline: 2px solid hsl(135 50% 45%);
}
.thumb-row img {
width: 84px;
height: 84px;
object-fit: cover;
display: block;
}
.thumb-row figcaption {
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Precision-recall charts */
.pr-controls {
margin: 10px 0;
}
#pr-legend {
display: flex;
flex-flow: row wrap;
gap: 4px 14px;
margin-bottom: 8px;
}
.pr-group {
display: flex;
flex-flow: row wrap;
gap: 4px;
}
.pr-chip {
display: inline-flex;
align-items: center;
gap: 5px;
border: 1px solid color-mix(in srgb, var(--foreground) 20%, transparent);
background: none;
color: var(--foreground);
font-size: 11px;
padding: 2px 7px;
cursor: pointer;
transition: opacity 0.15s;
}
.pr-chip.dim {
opacity: 0.3;
}
.pr-chip.pinned {
border-color: var(--color1);
}
.pr-slider {
display: inline-block;
margin: 4px 0;
color: var(--color4);
}
.pr-slider input {
width: 220px;
vertical-align: middle;
margin-left: 8px;
}
.pr-charts {
display: flex;
flex-flow: row wrap;
gap: 12px;
}
.pr-charts figure {
margin: 0;
flex: 1 1 300px;
max-width: 340px;
}
.pr-charts figcaption {
color: var(--color1);
font-size: 14px;
margin-bottom: 2px;
}
.pr-svg {
width: 100%;
height: auto;
background: color-mix(in srgb, var(--foreground) 3%, transparent);
}
.pr-grid {
stroke: color-mix(in srgb, var(--foreground) 12%, transparent);
stroke-width: 1;
}
.pr-tick {
fill: color-mix(in srgb, var(--foreground) 55%, transparent);
font-size: 9px;
}
.pr-axis {
fill: color-mix(in srgb, var(--foreground) 70%, transparent);
font-size: 11px;
}
.pr-line {
fill: none;
stroke-width: 1.8;
transition: opacity 0.15s;
}
.pr-dot {
stroke: var(--background);
stroke-width: 2;
transition: opacity 0.15s;
}
.pr-line.faded, .pr-dot.faded {
opacity: 0.12;
}
#pr-tooltip {
position: fixed;
z-index: 10;
background: color-mix(in srgb, var(--background) 92%, transparent);
border: 1px solid var(--color1);
color: var(--foreground);
font-size: 12px;
padding: 4px 8px;
pointer-events: none;
white-space: nowrap;
}
/* Retrieval demos */
.dist-figure, .toy-figure {
margin: 10px 0;
}
.dist-figure figcaption, .toy-figure figcaption {
font-size: 12px;
opacity: 0.8;
margin-top: 4px;
}
.dist-svg {
max-width: 720px;
}
.dist-bar {
fill: color-mix(in srgb, var(--foreground) 45%, transparent);
}
.dist-copy {
fill: hsl(135 50% 45%);
stroke: var(--background);
stroke-width: 1;
}
.dist-region {
fill: color-mix(in srgb, var(--color1) 10%, transparent);
}
.dist-thresh {
stroke: var(--color1);
stroke-width: 2;
}
.dist-readout, .toy-stats {
margin-left: 12px;
color: var(--color4);
}
.toy-node {
fill: color-mix(in srgb, var(--foreground) 30%, transparent);
transition: opacity 0.3s, fill 0.3s;
}
.toy-node.seen {
fill: color-mix(in srgb, var(--foreground) 10%, var(--background));
stroke: var(--foreground);
stroke-width: 2;
}
.toy-node.match {
fill: hsl(135 50% 45%);
}
.toy-node.pruned {
opacity: 0.15;
}
.toy-edge {
stroke: color-mix(in srgb, var(--foreground) 45%, transparent);
stroke-width: 1.5;
transition: opacity 0.3s;
}
.toy-edge-label {
fill: color-mix(in srgb, var(--foreground) 70%, transparent);
font-size: 9px;
transition: opacity 0.3s;
}
.toy-edge.pruned, .toy-edge-label.pruned {
opacity: 0.15;
}
.big-stats .stat-note {
font-size: 12px;
opacity: 0.7;
margin: 0;
max-width: 220px;
}
.big-curve-svg {
width: 250px;
}
.big-curve-line {
stroke: var(--color2);
}
.big-curve-dot {
fill: var(--color1);
}
/* Lists */
ul.loose-ends li, ol.references li {
margin-bottom: 6px;
line-height: 1.5;
}
ol.references li:target {
outline: 1px dashed var(--color1);
outline-offset: 4px;
}